Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/jgraph/drawio.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaudenz Alder <gaudenz@jgraph.com>2020-12-11 18:15:11 +0300
committerGaudenz Alder <gaudenz@jgraph.com>2020-12-11 18:15:11 +0300
commitf81ede40055bee820f21ff729dce826aadc9530f (patch)
tree0ac39b071d307811dc8d5dc7ef6cd8562e740a39
parent754d38aa0014550593a3162e3d4bf7cd72cb8c71 (diff)
14.0.1 releasev14.0.1
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md45
-rw-r--r--.github/ISSUE_TEMPLATE/feature_request.md20
-rw-r--r--.github/stale.yml18
-rw-r--r--.github/workflows/war.yml45
-rw-r--r--etc/build/cache.txt59
-rw-r--r--etc/docker/Dockerfile11
-rw-r--r--etc/docker/drawio-export/Dockerfile61
-rw-r--r--etc/docker/drawio-export/PostConfig.js8
-rw-r--r--etc/docker/drawio-export/PreConfig.js10
-rw-r--r--etc/docker/drawio-export/docker-entrypoint.sh67
-rw-r--r--src/main/mxgraph/css/common.css166
-rw-r--r--src/main/mxgraph/css/explorer.css18
-rw-r--r--src/main/mxgraph/images/button.gifbin137 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/close.gifbin70 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/collapsed.gifbin877 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/error.gifbin907 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/expanded.gifbin878 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/maximize.gifbin843 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/minimize.gifbin64 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/normalize.gifbin845 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/point.gifbin55 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/resize.gifbin74 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/separator.gifbin146 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/submenu.gifbin56 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/transparent.gifbin90 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/warning.gifbin276 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/warning.pngbin425 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/window-title.gifbin275 -> 0 bytes
-rw-r--r--src/main/mxgraph/images/window.gifbin75 -> 0 bytes
-rw-r--r--src/main/mxgraph/mxClient.js1803
-rw-r--r--src/main/webapp/WEB-INF/google_client_redirect_uri1
-rw-r--r--src/main/webapp/WEB-INF/google_old_client_id1
-rw-r--r--src/main/webapp/WEB-INF/google_old_client_redirect_uri1
-rw-r--r--src/main/webapp/WEB-INF/lib/cache-api-1.1.1.jarbin51281 -> 0 bytes
-rw-r--r--src/main/webapp/WEB-INF/lib/ehcache-3.8.1.jarbin1796698 -> 0 bytes
-rw-r--r--src/main/webapp/WEB-INF/lib/gae-stub-1.0.3.jarbin3792 -> 0 bytes
-rw-r--r--src/main/webapp/WEB-INF/lib/mxgraph-core.jarbin468185 -> 0 bytes
-rw-r--r--src/main/webapp/WEB-INF/lib/slf4j-api-1.7.25.jarbin41203 -> 0 bytes
-rw-r--r--src/main/webapp/WEB-INF/msgraph_client_redirect_uri1
-rw-r--r--src/main/webapp/WEB-INF/msgraph_dev_client_id1
-rw-r--r--src/main/webapp/WEB-INF/msgraph_dev_client_secret1
-rw-r--r--src/main/webapp/WEB-INF/msgraph_old_client_redirect_uri1
-rw-r--r--src/main/webapp/about.html6
-rw-r--r--src/main/webapp/app.html6
-rw-r--r--src/main/webapp/cache.manifest64
-rw-r--r--src/main/webapp/connect/att_common/att-editor.js570
-rw-r--r--src/main/webapp/connect/bitbucket/connect-dev.json29
-rw-r--r--src/main/webapp/connect/bitbucket/viewer.html200
-rw-r--r--src/main/webapp/connect/common/images/reader/checkmark.gifbin891 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/closeLargeView.gifbin871 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/edit.pngbin271 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/grid.gifbin56 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/largeView.pngbin341 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/remove.pngbin215 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/zoomActual.pngbin256 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/zoomFit.gifbin916 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/zoomIn.gifbin901 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/images/reader/zoomOut.gifbin898 -> 0 bytes
-rw-r--r--src/main/webapp/connect/common/js/mxProperties.js115
-rw-r--r--src/main/webapp/connect/common/js/mxReader.js827
-rw-r--r--src/main/webapp/connect/common/message.txt90
-rw-r--r--src/main/webapp/connect/common/message_de.txt89
-rw-r--r--src/main/webapp/connect/common/styles/plugin/aui-buttons.css536
-rw-r--r--src/main/webapp/connect/common/styles/plugin/blueprint.css0
-rw-r--r--src/main/webapp/connect/common/styles/plugin/common.css150
-rw-r--r--src/main/webapp/connect/common/styles/plugin/dropdown-menu.css4
-rw-r--r--src/main/webapp/connect/common/styles/plugin/explorer.css18
-rw-r--r--src/main/webapp/connect/common/styles/plugin/linkBrowser.css296
-rw-r--r--src/main/webapp/connect/common/styles/plugin/mx-editor.css34
-rw-r--r--src/main/webapp/connect/common/styles/plugin/newDiagramDialog.css49
-rw-r--r--src/main/webapp/connect/common/styles/plugin/reader.css39
-rw-r--r--src/main/webapp/connect/common/styles/plugin/search.css84
-rw-r--r--src/main/webapp/connect/common/viewer.txt9
-rw-r--r--src/main/webapp/connect/common/viewer_de.txt9
-rw-r--r--src/main/webapp/connect/confluence/admin-page.js47
-rw-r--r--src/main/webapp/connect/confluence/admin.html22
-rw-r--r--src/main/webapp/connect/confluence/admin.js1142
-rw-r--r--src/main/webapp/connect/confluence/config.html171
-rw-r--r--src/main/webapp/connect/confluence/config.js1750
-rw-r--r--src/main/webapp/connect/confluence/connect-dev.json482
-rw-r--r--src/main/webapp/connect/confluence/connect.json493
-rw-r--r--src/main/webapp/connect/confluence/connectUtils-1-4-8.js3477
-rw-r--r--src/main/webapp/connect/confluence/i18n/cs_CZ.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/da_DK.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/de_DE.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/en.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/es_ES.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/et_EE.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/fi_FI.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/fr_FR.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/hu_HU.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/is_IS.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/it_IT.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/ja_JP.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/ko_KR.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/nl_NL.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/no_NO.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/pl_PL.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/pt_BR.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/ro_RO.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/ru_RU.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/sk_SK.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/sv_SE.json23
-rw-r--r--src/main/webapp/connect/confluence/i18n/zh_CN.json23
-rw-r--r--src/main/webapp/connect/confluence/includeDiagram-1-4-8.js1283
-rw-r--r--src/main/webapp/connect/confluence/includeDiagram.html298
-rw-r--r--src/main/webapp/connect/confluence/includeDiagram.js985
-rw-r--r--src/main/webapp/connect/confluence/init-editor.js46
-rw-r--r--src/main/webapp/connect/confluence/initEditor.html28
-rw-r--r--src/main/webapp/connect/confluence/lucid-import.js86
-rw-r--r--src/main/webapp/connect/confluence/lucidMassImport.html23
-rw-r--r--src/main/webapp/connect/confluence/macro-editor.js181
-rw-r--r--src/main/webapp/connect/confluence/macroEditor-1-4-8.html28
-rw-r--r--src/main/webapp/connect/confluence/macroEditor.html25
-rw-r--r--src/main/webapp/connect/confluence/prism/bililiteRange.fancytext.js91
-rw-r--r--src/main/webapp/connect/confluence/prism/bililiteRange.js763
-rw-r--r--src/main/webapp/connect/confluence/prism/bililiteRange.undo.js122
-rw-r--r--src/main/webapp/connect/confluence/prism/bililiteRange.util.js272
-rw-r--r--src/main/webapp/connect/confluence/prism/prism.css234
-rw-r--r--src/main/webapp/connect/confluence/prism/prism.js6
-rw-r--r--src/main/webapp/connect/confluence/splash-editor.js23
-rw-r--r--src/main/webapp/connect/confluence/splashEditor.html28
-rw-r--r--src/main/webapp/connect/confluence/support.html118
-rw-r--r--src/main/webapp/connect/confluence/support.js17
-rw-r--r--src/main/webapp/connect/confluence/viewer-1-4-42.html35
-rw-r--r--src/main/webapp/connect/confluence/viewer-1-4-8.html91
-rw-r--r--src/main/webapp/connect/confluence/viewer-init.js47
-rw-r--r--src/main/webapp/connect/confluence/viewer.js1415
-rw-r--r--src/main/webapp/connect/confluence/viewer2.html214
-rw-r--r--src/main/webapp/connect/gdrive_common/editor.js547
-rw-r--r--src/main/webapp/connect/gdrive_common/gac.js564
-rw-r--r--src/main/webapp/connect/gdriveconnector/ac.js44
-rw-r--r--src/main/webapp/connect/gdriveconnector/att-macroEditor.html165
-rw-r--r--src/main/webapp/connect/gdriveconnector/att-viewer.html28
-rw-r--r--src/main/webapp/connect/gdriveconnector/att-viewer.js278
-rw-r--r--src/main/webapp/connect/gdriveconnector/images/gdriveconnector.pngbin1801 -> 0 bytes
-rw-r--r--src/main/webapp/connect/gdriveconnector/images/gdriveconnector.svg1
-rw-r--r--src/main/webapp/connect/gdriveconnector/macroEditor.html145
-rw-r--r--src/main/webapp/connect/gdriveconnector/od-macroEditor.html144
-rw-r--r--src/main/webapp/connect/gdriveconnector/od-viewer.html29
-rw-r--r--src/main/webapp/connect/gdriveconnector/od-viewer.js350
-rw-r--r--src/main/webapp/connect/gdriveconnector/plugin.json400
-rw-r--r--src/main/webapp/connect/gdriveconnector/spinner.gifbin1781 -> 0 bytes
-rw-r--r--src/main/webapp/connect/gdriveconnector/viewer.html29
-rw-r--r--src/main/webapp/connect/gdriveconnector/viewer.js376
-rw-r--r--src/main/webapp/connect/jira/ac.js372
-rw-r--r--src/main/webapp/connect/jira/connect-dev.json232
-rw-r--r--src/main/webapp/connect/jira/connect.json236
-rw-r--r--src/main/webapp/connect/jira/connectUtils-1-3-3.js363
-rw-r--r--src/main/webapp/connect/jira/editor-1-3-3.html35
-rw-r--r--src/main/webapp/connect/jira/editor.js618
-rw-r--r--src/main/webapp/connect/jira/editor2.html427
-rw-r--r--src/main/webapp/connect/jira/embed.html264
-rw-r--r--src/main/webapp/connect/jira/embedDiagram-1-3-12.js516
-rw-r--r--src/main/webapp/connect/jira/embedDiagram.js449
-rw-r--r--src/main/webapp/connect/jira/fullScreenViewer-1-3-3.html28
-rw-r--r--src/main/webapp/connect/jira/fullScreenViewer2.html205
-rw-r--r--src/main/webapp/connect/jira/fullscreen-viewer-init.js43
-rw-r--r--src/main/webapp/connect/jira/fullscreen-viewer.js180
-rw-r--r--src/main/webapp/connect/jira/search.html84
-rw-r--r--src/main/webapp/connect/jira/search.js240
-rw-r--r--src/main/webapp/connect/jira/spinner.gifbin1781 -> 0 bytes
-rw-r--r--src/main/webapp/connect/jira/viewerPanel-1-3-12.html40
-rw-r--r--src/main/webapp/connect/jira/viewerPanel-1-3-3.html108
-rw-r--r--src/main/webapp/connect/jira/viewerPanel.js974
-rw-r--r--src/main/webapp/connect/jira/viewerPanel2.html393
-rw-r--r--src/main/webapp/connect/new_common/cac.js263
-rw-r--r--src/main/webapp/connect/new_common/cviewer.js157
-rw-r--r--src/main/webapp/connect/office365/app.css458
-rw-r--r--src/main/webapp/connect/office365/dev/manifest-dev.xml374
-rw-r--r--src/main/webapp/connect/office365/drive.html22
-rw-r--r--src/main/webapp/connect/office365/function-file/function-file.html31
-rw-r--r--src/main/webapp/connect/office365/function-file/function-file.js286
-rw-r--r--src/main/webapp/connect/office365/function-file/msg.html112
-rw-r--r--src/main/webapp/connect/office365/img-viewer.html50
-rw-r--r--src/main/webapp/connect/office365/index.html184
-rw-r--r--src/main/webapp/connect/office365/js/app.js612
-rw-r--r--src/main/webapp/connect/office365/js/drive.js267
-rw-r--r--src/main/webapp/connect/office365/js/index.js1048
-rw-r--r--src/main/webapp/connect/office365/manifest.xml374
-rw-r--r--src/main/webapp/connect/onedrive_common/ac.js817
-rw-r--r--src/main/webapp/connect/onedrive_common/editor.js532
-rw-r--r--src/main/webapp/connect/onedrivejira/connect-dev.json103
-rw-r--r--src/main/webapp/connect/onedrivejira/connect.json106
-rw-r--r--src/main/webapp/connect/onedrivejira/editor.html365
-rw-r--r--src/main/webapp/connect/onedrivejira/fullScreenViewer.html52
-rw-r--r--src/main/webapp/connect/onedrivejira/fullScreenViewer.js266
-rw-r--r--src/main/webapp/connect/onedrivejira/oneDriveFSViewer.html29
-rw-r--r--src/main/webapp/connect/onedrivejira/oneDriveFSViewer.js128
-rw-r--r--src/main/webapp/connect/onedrivejira/spinner.gifbin1781 -> 0 bytes
-rw-r--r--src/main/webapp/connect/onedrivejira/viewerPanel.html55
-rw-r--r--src/main/webapp/connect/onedrivejira/viewerPanel.js807
-rw-r--r--src/main/webapp/connect/remote_gdrive/editor.html100
-rw-r--r--src/main/webapp/connect/remote_gdrive/editor.js43
-rw-r--r--src/main/webapp/connect/remote_gdrive/viewer.html29
-rw-r--r--src/main/webapp/connect/remote_gdrive/viewer.js44
-rw-r--r--src/main/webapp/connect/remote_onedrive/editor.html100
-rw-r--r--src/main/webapp/connect/remote_onedrive/editor.js44
-rw-r--r--src/main/webapp/connect/remote_onedrive/viewer.html29
-rw-r--r--src/main/webapp/connect/remote_onedrive/viewer.js60
-rw-r--r--src/main/webapp/connect/trello/attSection.html14
-rw-r--r--src/main/webapp/connect/trello/editor.html13
-rw-r--r--src/main/webapp/connect/trello/images/drawio-trello-ss.pngbin105622 -> 0 bytes
-rw-r--r--src/main/webapp/connect/trello/index.html14
-rw-r--r--src/main/webapp/connect/trello/js/attSection.js201
-rw-r--r--src/main/webapp/connect/trello/js/client.js69
-rw-r--r--src/main/webapp/connect/trello/js/common.js8
-rw-r--r--src/main/webapp/connect/trello/js/editor.js29
-rw-r--r--src/main/webapp/connect/trello/js/new.js104
-rw-r--r--src/main/webapp/connect/trello/manifest.json19
-rw-r--r--src/main/webapp/connect/trello/new.html32
-rw-r--r--src/main/webapp/connect/vsdx/importer.js79
-rw-r--r--src/main/webapp/export2.html415
-rw-r--r--src/main/webapp/js/diagramly/Devel.js4
-rw-r--r--src/main/webapp/js/diagramly/mxTableLayout.js900
-rw-r--r--src/main/webapp/js/diagramly/ruler/mxRuler.js359
-rw-r--r--src/main/webapp/js/mxgraph/Actions.js1597
-rw-r--r--src/main/webapp/js/mxgraph/Dialogs.js2558
-rw-r--r--src/main/webapp/js/mxgraph/Editor.js2778
-rw-r--r--src/main/webapp/js/mxgraph/EditorUi.js5090
-rw-r--r--src/main/webapp/js/mxgraph/Format.js6629
-rw-r--r--src/main/webapp/js/mxgraph/Graph.js11948
-rw-r--r--src/main/webapp/js/mxgraph/Init.js29
-rw-r--r--src/main/webapp/js/mxgraph/Menus.js1462
-rw-r--r--src/main/webapp/js/mxgraph/Shapes.js5310
-rw-r--r--src/main/webapp/js/mxgraph/Sidebar.js4419
-rw-r--r--src/main/webapp/js/mxgraph/Toolbar.js1106
-rw-r--r--src/main/webapp/js/orgchart/mxOrgChart.js568
-rw-r--r--src/main/webapp/math/.npmignore7
-rw-r--r--src/main/webapp/math/CONTRIBUTING.md259
-rw-r--r--src/main/webapp/math/README.md53
-rw-r--r--src/main/webapp/math/bower.json11
-rw-r--r--src/main/webapp/math/composer.json14
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/functions/algebra.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/functions/elementary.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/functions/hyperbolic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/functions/trigonometry.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-capital.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-bold.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-italic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-sans-serif-bold.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-scripts.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-small.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-symbols.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/hebrew_letters.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-double-accent.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-normal.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-phonetic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-single-accent.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold-fraktur.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold-script.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-double-struck.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-fraktur.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-italic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-monospace.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif-bold.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif-italic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-script.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-rest.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-double-accent.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-normal.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-single-accent.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_angles.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_arrows.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_characters.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_delimiters.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_digits.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_geometry.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_harpoons.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_non_characters.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_symbols.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_whitespace.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/other_stars.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/energy.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/length.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/memory.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/other.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/speed.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/temperature.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/time.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/volume.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/en/units/weight.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/functions/algebra.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/functions/elementary.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/functions/hyperbolic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/functions/trigonometry.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-capital.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-bold.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-italic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-sans-serif-bold.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-scripts.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-small.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-symbols.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/hebrew_letters.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-double-accent.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-normal.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-phonetic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-single-accent.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold-fraktur.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold-script.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-double-struck.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-fraktur.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-italic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-monospace.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif-bold.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif-italic.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-script.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-rest.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-double-accent.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-normal.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-single-accent.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_angles.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_arrows.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_characters.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_delimiters.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_digits.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_geometry.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_harpoons.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_non_characters.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_symbols.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_whitespace.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/other_stars.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/energy.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/length.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/memory.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/other.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/speed.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/temperature.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/time.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/volume.js1
-rw-r--r--src/main/webapp/math/extensions/a11y/mathmaps/es/units/weight.js1
-rw-r--r--src/main/webapp/math/jax/output/NativeMML/config.js19
-rw-r--r--src/main/webapp/math/jax/output/NativeMML/jax.js19
-rw-r--r--src/main/webapp/math/jax/output/PreviewHTML/config.js19
-rw-r--r--src/main/webapp/math/jax/output/PreviewHTML/jax.js19
-rw-r--r--src/main/webapp/math/package.json30
-rw-r--r--src/main/webapp/offline.html3
-rw-r--r--src/main/webapp/onedrive.html58
-rw-r--r--src/main/webapp/onedrive2.html9
-rw-r--r--src/main/webapp/plugins/cConf-license.js72
-rw-r--r--src/main/webapp/plugins/electron.js10
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_api_hosting.pngbin3689 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_api_hosting.xml1
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_cold_standby_server.pngbin3328 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_cold_standby_server.xml1
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_warm_static_site.pngbin3318 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_warm_static_site.xml1
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_with_application_replication.pngbin4105 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_with_application_replication.xml1
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_hosting_filers.pngbin4293 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/backup_and_archive_hosting_filers.xml1
-rw-r--r--src/main/webapp/templates/gcp/big_data_complex_event_processing.pngbin5541 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/big_data_complex_event_processing.xml1
-rw-r--r--src/main/webapp/templates/gcp/big_data_dmp_data_warehouse.pngbin4234 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/big_data_dmp_data_warehouse.xml1
-rw-r--r--src/main/webapp/templates/gcp/big_data_log_processing.pngbin3139 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/big_data_log_processing.xml1
-rw-r--r--src/main/webapp/templates/gcp/big_data_time_series_analysis.pngbin3422 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/big_data_time_series_analysis.xml1
-rw-r--r--src/main/webapp/templates/gcp/dev_test_continuous_delivery_with_spinnaker.pngbin4388 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/dev_test_continuous_delivery_with_spinnaker.xml1
-rw-r--r--src/main/webapp/templates/gcp/dev_test_jenkins_in_k8s.pngbin5045 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/dev_test_jenkins_in_k8s.xml1
-rw-r--r--src/main/webapp/templates/gcp/dev_test_scale_testing_with_kubernetes_locust.pngbin3629 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/dev_test_scale_testing_with_kubernetes_locust.xml1
-rw-r--r--src/main/webapp/templates/gcp/dev_test_ui_testing_with_kubernetes.pngbin3469 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/dev_test_ui_testing_with_kubernetes.xml1
-rw-r--r--src/main/webapp/templates/gcp/digital_marketing_dmp_data_warehouse.pngbin4212 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/digital_marketing_dmp_data_warehouse.xml1
-rw-r--r--src/main/webapp/templates/gcp/digital_marketing_publisher_side_analysis.pngbin5636 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/digital_marketing_publisher_side_analysis.xml1
-rw-r--r--src/main/webapp/templates/gcp/digital_marketing_real_time_bidding.pngbin4180 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/digital_marketing_real_time_bidding.xml1
-rw-r--r--src/main/webapp/templates/gcp/financial_services_monte_carlo_simulations.pngbin3955 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/financial_services_monte_carlo_simulations.xml1
-rw-r--r--src/main/webapp/templates/gcp/financial_services_time_series_analysis.pngbin3621 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/financial_services_time_series_analysis.xml1
-rw-r--r--src/main/webapp/templates/gcp/gaming_backend_database.pngbin3112 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/gaming_backend_database.xml1
-rw-r--r--src/main/webapp/templates/gcp/gaming_gaming_analytics.pngbin3653 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/gaming_gaming_analytics.xml1
-rw-r--r--src/main/webapp/templates/gcp/gaming_mobile_game_backend.pngbin4514 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/gaming_mobile_game_backend.xml1
-rw-r--r--src/main/webapp/templates/gcp/gaming_real_time_aaa_game_servers.pngbin4023 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/gaming_real_time_aaa_game_servers.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_app_engine_and_cloud_endpoints.pngbin2925 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_app_engine_and_cloud_endpoints.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_compute_engine_and_rest_or_grpc.pngbin2745 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_compute_engine_and_rest_or_grpc.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_content_management.pngbin3756 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_content_management.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_digital_asset_management_and_sharing.pngbin3629 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_digital_asset_management_and_sharing.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_firebase.pngbin2499 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_firebase.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_firebase_and_google_app_engine.pngbin3190 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_firebase_and_google_app_engine.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_firebase_and_managed_vms.pngbin3273 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_firebase_and_managed_vms.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_gitlabclonegke.pngbin4030 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_gitlabclonegke.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_hadoop_on_google_cloud_platform.pngbin2565 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_hadoop_on_google_cloud_platform.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_high_performance_computing.pngbin2860 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_high_performance_computing.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_real_time_bidding.pngbin4007 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_real_time_bidding.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_real_time_stream_processing_iot.pngbin4480 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_real_time_stream_processing_iot.xml1
-rw-r--r--src/main/webapp/templates/gcp/general_web_application_on_google_app_engine.pngbin3325 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/general_web_application_on_google_app_engine.xml1
-rw-r--r--src/main/webapp/templates/gcp/internet_of_things_mqtt_to_pubsub_broker.pngbin3786 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/internet_of_things_mqtt_to_pubsub_broker.xml1
-rw-r--r--src/main/webapp/templates/gcp/internet_of_things_sensor_stream_ingest_and_processing.pngbin4491 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/internet_of_things_sensor_stream_ingest_and_processing.xml1
-rw-r--r--src/main/webapp/templates/gcp/lifesciences_genomics_secondary_analysis.pngbin4032 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/lifesciences_genomics_secondary_analysis.xml1
-rw-r--r--src/main/webapp/templates/gcp/lifesciences_patient_monitoring.pngbin4350 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/lifesciences_patient_monitoring.xml1
-rw-r--r--src/main/webapp/templates/gcp/lifesciences_variant_analysis.pngbin4034 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/lifesciences_variant_analysis.xml1
-rw-r--r--src/main/webapp/templates/gcp/media_hybrid_rendering.pngbin2941 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/media_hybrid_rendering.xml1
-rw-r--r--src/main/webapp/templates/gcp/media_live_streaming.pngbin3031 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/media_live_streaming.xml1
-rw-r--r--src/main/webapp/templates/gcp/media_rendering.pngbin2742 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/media_rendering.xml1
-rw-r--r--src/main/webapp/templates/gcp/media_transcoding.pngbin2585 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/media_transcoding.xml1
-rw-r--r--src/main/webapp/templates/gcp/retail_beacons_and_targeted_marketing.pngbin3997 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/retail_beacons_and_targeted_marketing.xml1
-rw-r--r--src/main/webapp/templates/gcp/retail_fraud_detection.pngbin3824 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/retail_fraud_detection.xml1
-rw-r--r--src/main/webapp/templates/gcp/retail_pci.pngbin3878 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/retail_pci.xml1
-rw-r--r--src/main/webapp/templates/gcp/retail_real_time_inventory.pngbin4198 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/retail_real_time_inventory.xml1
-rw-r--r--src/main/webapp/templates/gcp/retail_recommendation_engines.pngbin4161 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/retail_recommendation_engines.xml1
-rw-r--r--src/main/webapp/templates/gcp/retail_shopping_cart_analysis.pngbin4218 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/retail_shopping_cart_analysis.xml1
-rw-r--r--src/main/webapp/templates/gcp/websites_content_hosting.pngbin2716 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/websites_content_hosting.xml1
-rw-r--r--src/main/webapp/templates/gcp/websites_dynamic_hosting.pngbin3518 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/websites_dynamic_hosting.xml1
-rw-r--r--src/main/webapp/templates/gcp/websites_mobile_site_hosting.pngbin3653 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/websites_mobile_site_hosting.xml1
-rw-r--r--src/main/webapp/templates/gcp/websites_multiple_network_interfaces.pngbin3131 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/websites_multiple_network_interfaces.xml1
-rw-r--r--src/main/webapp/templates/gcp/websites_static_hosting.pngbin2531 -> 0 bytes
-rw-r--r--src/main/webapp/templates/gcp/websites_static_hosting.xml1
-rw-r--r--src/main/webapp/templates/network/aws.pngbin2688 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/aws.xml2
-rw-r--r--src/main/webapp/templates/network/aws_3d.pngbin3298 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/aws_3d.xml2
-rw-r--r--src/main/webapp/templates/network/azure_1.pngbin2683 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/azure_1.xml2
-rw-r--r--src/main/webapp/templates/network/azure_2.pngbin5316 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/azure_2.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_bda_reference_architecture.pngbin4639 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_bda_reference_architecture.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_blockchain.pngbin13303 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_blockchain.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_cognitive_conversation.pngbin4438 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_cognitive_conversation.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_cognitive_discovery.pngbin5148 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_cognitive_discovery.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_iot_architecture.pngbin4909 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_iot_architecture.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_microservices.pngbin4968 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_microservices.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_private_cloud.pngbin4850 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_private_cloud.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_vcenter_server_platform.pngbin3812 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_vcenter_server_platform.xml1
-rw-r--r--src/main/webapp/templates/network/ibm_vpc_architecture.pngbin5044 -> 0 bytes
-rw-r--r--src/main/webapp/templates/network/ibm_vpc_architecture.xml1
-rw-r--r--src/main/webapp/well-known/microsoft-identity-association.json19
-rw-r--r--src/main/webapp/yarn.lock6
483 files changed, 5 insertions, 83514 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index dcb640a1..00000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve
-
----
-
-### Preflight Checklist
-<!-- Please ensure you've completed the following steps by replacing [ ] with [x]-->
-
-* [ ] I agree to follow the [Code of Conduct](https://github.com/jgraph/drawio/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.
-* [ ] I have searched the issue tracker for a feature request that matches the one I want to file, without success.
-
-**Describe the bug**
-A clear and concise description of what the bug is.
-
-**To Reproduce**
-Steps to reproduce the behavior:
-1. Go to '...'
-2. Click on '....'
-3. Scroll down to '....'
-4. See error
-
-**Expected behavior**
-A clear and concise description of what you expected to happen.
-
-**Screenshots**
-If applicable, add screenshots to help explain your problem.
-
-**draw.io version (In the Help->About menu of the draw.io editor):**
-
-- draw.io version [e.g. 12.6.7]
-
-**Desktop (please complete the following information):**
- - OS: [e.g. iOS]
- - Browser [e.g. chrome, safari]
- - Version [e.g. 22]
-
-**Smartphone (please complete the following information):**
- - Device: [e.g. iPhone6]
- - OS: [e.g. iOS8.1]
- - Browser [e.g. stock browser, safari]
- - Version [e.g. 22]
-
-**Additional context**
-Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 4dd11042..00000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project
-
----
-
-* [ ] I agree to follow the [Code of Conduct](https://github.com/jgraph/drawio/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.
-* [ ] I have searched the issue tracker for a feature request that matches the one I want to file, without success.
-
-**Is your feature request related to a problem? Please describe.**
-A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
-
-**Describe the solution you'd like**
-A clear and concise description of what you want to happen.
-
-**Describe alternatives you've considered**
-A clear and concise description of any alternative solutions or features you've considered.
-
-**Additional context**
-Add any other context or screenshots about the feature request here.
diff --git a/.github/stale.yml b/.github/stale.yml
deleted file mode 100644
index 9db1c0d5..00000000
--- a/.github/stale.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-# Number of days of inactivity before an issue becomes stale
-daysUntilStale: 100
-# Number of days of inactivity before a stale issue is closed
-daysUntilClose: 2
-# Issues with these labels will never be considered stale
-exemptLabels:
- - pinned
- - security
- - notstale
-# Label to use when marking an issue as stale
-staleLabel: wontfix
-# Comment to post when marking an issue as stale. Set to `false` to disable
-markComment: >
- This issue has been automatically marked as stale because it has not had
- recent activity. It will be closed if no further activity occurs. Thank you
- for your contributions. See [the FAQ](https://github.com/jgraph/drawio/wiki/Stale-bot-FAQ) for more information.
-# Comment to post when closing a stale issue. Set to `false` to disable
-closeComment: false
diff --git a/.github/workflows/war.yml b/.github/workflows/war.yml
deleted file mode 100644
index 7ded4116..00000000
--- a/.github/workflows/war.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-# This workflow will build a Java project with Ant
-# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-ant
-
-name: WAR CI
-
-on:
- push:
- tags:
- - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
-
-jobs:
- build:
-
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v2
- - name: Set up JDK 1.8
- uses: actions/setup-java@v1
- with:
- java-version: 1.8
- - name: Build war with Ant
- run: |
- cd etc/build
- ant war
- - name: Create Release
- id: create_release
- uses: actions/create-release@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
- with:
- tag_name: ${{ github.ref }}
- release_name: ${{ github.ref }}
- draft: false
- prerelease: false
- - name: Upload Release Asset
- id: upload-release-asset
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps
- asset_path: build/draw.war
- asset_name: draw.war
- asset_content_type: application/octet-stream
diff --git a/etc/build/cache.txt b/etc/build/cache.txt
deleted file mode 100644
index b856f045..00000000
--- a/etc/build/cache.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-app.html
-index.html?offline=1
-index.html?offline=1&ui=min
-index.html?offline=1&https=0
-offline.html
-open.html
-js/app.min.js
-js/shapes.min.js
-js/stencils.min.js
-js/extensions.min.js
-js/diagramly/ElectronApp.js
-styles/grapheditor.css
-styles/atlas.css
-styles/dark.css
-favicon.ico
-mxgraph/css/common.css
-mxgraph/images/maximize.gif
-mxgraph/images/minimize.gif
-mxgraph/images/close.gif
-mxgraph/images/resize.gif
-mxgraph/images/separator.gif
-mxgraph/images/window.gif
-mxgraph/images/window-title.gif
-mxgraph/images/button.gif
-mxgraph/images/point.gif
-resources/dia.txt
-images/delete.png
-images/droptarget.png
-images/help.png
-images/download.png
-images/drawlogo.svg
-images/drawlogo-gray.svg
-images/drawlogo-text-bottom.svg
-images/logo-flat.png
-images/osa_drive-harddisk.png
-images/osa_database.png
-images/glyphicons_star.png
-images/logo-confluence.png
-images/logo-jira.png
-images/clear.gif
-images/spin.gif
-images/checkmark.gif
-images/favicon-16x16.png
-images/favicon-32x32.png
-images/android-chrome-192x192.png
-images/android-chrome-512x512.png
-images/glyphicons_google.png
-images/glyphicons_facebook.png
-images/glyphicons_twitter.png
-images/glyphicons_github.png
-images/hs.png
-
-# Redirect app to app.html which redirects to index.html?offline=1
-# this is required to get the URL parameters into the index page.
-FALLBACK:
-app app.html
-
-NETWORK:
-*
diff --git a/etc/docker/Dockerfile b/etc/docker/Dockerfile
deleted file mode 100644
index d5d11bee..00000000
--- a/etc/docker/Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM frekele/ant:1.10.3-jdk8 as BUILD
-RUN mkdir /usr/build
-COPY src /usr/build/src
-COPY etc /usr/build/etc
-COPY VERSION /usr/build
-RUN cd /usr/build/etc/build/ && ant war
-
-FROM tomcat:9.0 as TARGET
-COPY --from=BUILD /usr/build/build/draw.war /usr/local/tomcat/webapps/
-EXPOSE 8080
-CMD ["catalina.sh", "run"]
diff --git a/etc/docker/drawio-export/Dockerfile b/etc/docker/drawio-export/Dockerfile
deleted file mode 100644
index 88895bea..00000000
--- a/etc/docker/drawio-export/Dockerfile
+++ /dev/null
@@ -1,61 +0,0 @@
-FROM tomcat:9-jre11-slim
-
-LABEL maintainer="Florian JUDITH <florian.judith.b@gmail.com>"
-
-ARG VERSION=11.3.0
-
-RUN apt-get update -y && \
- apt-get install -y --no-install-recommends \
- openjdk-11-jdk-headless ant git patch wget xmlstarlet certbot curl && \
- curl -sL https://deb.nodesource.com/setup_12.x | bash - && \
- apt-get install -y --no-install-recommends nodejs chromium libatk-bridge2.0-0 libgtk-3-0 && \
- cd /tmp && \
- wget https://github.com/jgraph/draw.io/archive/v${VERSION}.zip && \
- unzip v${VERSION}.zip && \
- cd /tmp/drawio-${VERSION} && \
- cd /tmp/drawio-${VERSION}/etc/build && \
- ant war && \
- cd /tmp/drawio-${VERSION}/build && \
- unzip /tmp/drawio-${VERSION}/build/draw.war -d $CATALINA_HOME/webapps/draw && \
- mkdir /usr/local/drawio && \
- cd /usr/local/drawio && \
- git clone https://github.com/jgraph/draw-image-export2.git && \
- cd draw-image-export2 && \
- npm install && \
- apt-get remove -y --purge openjdk-11-jdk-headless ant git patch wget && \
- apt-get autoremove -y --purge && \
- apt-get remove -y --purge chromium && \
- apt-get clean && \
- rm -r /var/lib/apt/lists/* && \
- rm -rf \
- /tmp/v${VERSION}.zip \
- /tmp/drawio-${VERSION}
-
-COPY PreConfig.js PostConfig.js $CATALINA_HOME/webapps/draw/js/
-
-# Update server.xml to set Draw.io webapp to root
-RUN cd $CATALINA_HOME && \
- xmlstarlet ed \
- -P -S -L \
- -i '/Server/Service/Engine/Host/Valve' -t 'elem' -n 'Context' \
- -i '/Server/Service/Engine/Host/Context' -t 'attr' -n 'path' -v '/' \
- -i '/Server/Service/Engine/Host/Context[@path="/"]' -t 'attr' -n 'docBase' -v 'draw' \
- -s '/Server/Service/Engine/Host/Context[@path="/"]' -t 'elem' -n 'WatchedResource' -v 'WEB-INF/web.xml' \
- -i '/Server/Service/Engine/Host/Valve' -t 'elem' -n 'Context' \
- -i '/Server/Service/Engine/Host/Context[not(@path="/")]' -t 'attr' -n 'path' -v '/ROOT' \
- -s '/Server/Service/Engine/Host/Context[@path="/ROOT"]' -t 'attr' -n 'docBase' -v 'ROOT' \
- -s '/Server/Service/Engine/Host/Context[@path="/ROOT"]' -t 'elem' -n 'WatchedResource' -v 'WEB-INF/web.xml' \
- conf/server.xml
-
-
-# Copy docker-entrypoint
-COPY docker-entrypoint.sh /
-RUN chmod +x /docker-entrypoint.sh
-
-WORKDIR $CATALINA_HOME
-
-#If export server is not used outside draw.io, no need to expose port 8000
-EXPOSE 8080 8443 8000
-
-ENTRYPOINT ["/docker-entrypoint.sh"]
-CMD ["catalina.sh", "run"]
diff --git a/etc/docker/drawio-export/PostConfig.js b/etc/docker/drawio-export/PostConfig.js
deleted file mode 100644
index df894c28..00000000
--- a/etc/docker/drawio-export/PostConfig.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Copyright (c) 2006-2019, JGraph Ltd
- * Copyright (c) 2006-2019, draw.io AG
- */
-// null'ing of global vars need to be after init.js
-window.VSD_CONVERT_URL = null;
-window.EMF_CONVERT_URL = null;
-window.ICONSEARCH_PATH = null; \ No newline at end of file
diff --git a/etc/docker/drawio-export/PreConfig.js b/etc/docker/drawio-export/PreConfig.js
deleted file mode 100644
index e18621d7..00000000
--- a/etc/docker/drawio-export/PreConfig.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Copyright (c) 2006-2019, JGraph Ltd
- * Copyright (c) 2006-2019, draw.io AG
- */
-// Overrides of global vars need to be pre-loaded
-window.EXPORT_URL = '/export'; //This points to ExportProxyServlet which uses the local export server at port 8000.
- //This proxy configuration allows https requests to the export server via Tomcat.
-window.PLANT_URL = 'REPLACE_WITH_YOUR_PLANTUML_SERVER';
-window.DRAW_MATH_URL = 'math';
-window.DRAWIO_CONFIG = null; //Replace with your custom draw.io configurations. For more details, https://desk.draw.io/support/solutions/articles/16000058316 \ No newline at end of file
diff --git a/etc/docker/drawio-export/docker-entrypoint.sh b/etc/docker/drawio-export/docker-entrypoint.sh
deleted file mode 100644
index 0e830980..00000000
--- a/etc/docker/drawio-export/docker-entrypoint.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/bash
-#set -e
-
-LETS_ENCRYPT_ENABLED=${LETS_ENCRYPT_ENABLED:-false}
-PUBLIC_DNS=${PUBLIC_DNS:-'draw.example.com'}
-ORGANISATION_UNIT=${ORGANIZATION_UNIT:-'Cloud Native Application'}
-ORGANISATION=${ORGANISATION:-'example inc'}
-CITY=${CITY:-'Paris'}
-STATE=${STATE:-'Paris'}
-COUNTRY_CODE=${COUNTRY:-'FR'}
-KEYSTORE_PASS=${KEYSTORE_PASS:-'V3ry1nS3cur3P4ssw0rd'}
-KEY_PASS=${KEY_PASS:-$KEYSTORE_PASS}
-
-
-if ! [ -f $CATALINA_HOME/.keystore ] && [ "$LETS_ENCRYPT_ENABLED" == "true" ]; then
- echo "Generating Let's Encrypt certificate"
-
- keytool -genkey -noprompt -alias tomcat -dname "CN=${PUBLIC_DNS}, OU=${ORGANISATION_UNIT}, O=${ORGANISATION}, L=${CITY}, S=${STATE}, C=${COUNTRY_CODE}" -keystore $CATALINA_HOME/.keystore -storepass "${KEYSTORE_PASS}" -KeySize 2048 -keypass "${KEY_PASS}" -keyalg RSA -storetype pkcs12
-
- keytool -list -keystore $CATALINA_HOME/.keystore -v -storepass "${KEYSTORE_PASS}"
-
- keytool -certreq -alias tomcat -file request.csr -keystore $CATALINA_HOME/.keystore -storepass "${KEYSTORE_PASS}"
-
- certbot certonly --csr $CATALINA_HOME/request.csr --standalone --register-unsafely-without-email --agree-tos
-
- keytool -import -trustcacerts -alias tomcat -file 0001_chain.pem -keystore $CATALINA_HOME/.keystore -storepass "${KEYSTORE_PASS}"
-fi
-
-if ! [ -f $CATALINA_HOME/.keystore ] && [ "$LETS_ENCRYPT_ENABLED" == "false" ]; then
- echo "Generating Self-Signed certificate"
-
- keytool -genkey -noprompt -alias selfsigned -dname "CN=${PUBLIC_DNS}, OU=${ORGANISATION_UNIT}, O=${ORGANISATION}, L=${CITY}, S=${STATE}, C=${COUNTRY_CODE}" -keystore $CATALINA_HOME/.keystore -storepass "${KEYSTORE_PASS}" -KeySize 2048 -keypass "${KEY_PASS}" -keyalg RSA -validity 3600 -storetype pkcs12
-
- keytool -list -keystore $CATALINA_HOME/.keystore -v -storepass "${KEYSTORE_PASS}"
-fi
-
-# Update SSL port configuration if it does'nt exists
-#
-UUID="$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 1 | head -n 1)$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 7 | head -n 1)"
-VAR=$(cat conf/server.xml | grep "$CATALINA_HOME/.keystore")
-
-if [ -f $CATALINA_HOME/.keystore ] && [ -z $VAR ]; then
- echo "Append https connector to server.xml"
-
- xmlstarlet ed \
- -P -S -L \
- -s '/Server/Service' -t 'elem' -n "${UUID}" \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'port' -v '8443' \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'protocol' -v 'org.apache.coyote.http11.Http11NioProtocol' \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'SSLEnabled' -v 'true' \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'maxThreads' -v '150' \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'scheme' -v 'https' \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'secure' -v 'true' \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'clientAuth' -v 'false' \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'sslProtocol' -v 'TLS' \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'KeystoreFile' -v "$CATALINA_HOME/.keystore" \
- -i "/Server/Service/${UUID}" -t 'attr' -n 'KeystorePass' -v "${KEY_PASS}" \
- -r "/Server/Service/${UUID}" -v 'Connector' \
- conf/server.xml
-fi
-
-#Run the export server
-cd /usr/local/drawio/draw-image-export2
-npm start &
-cd $CATALINA_HOME
-
-exec "$@" \ No newline at end of file
diff --git a/src/main/mxgraph/css/common.css b/src/main/mxgraph/css/common.css
deleted file mode 100644
index 21f38921..00000000
--- a/src/main/mxgraph/css/common.css
+++ /dev/null
@@ -1,166 +0,0 @@
-div.mxRubberband {
- position: absolute;
- overflow: hidden;
- border-style: solid;
- border-width: 1px;
- border-color: #0000FF;
- background: #0077FF;
-}
-.mxCellEditor {
- background: url(data:image/gif;base64,R0lGODlhMAAwAIAAAP///wAAACH5BAEAAAAALAAAAAAwADAAAAIxhI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8egpAAA7);
- _background: url('../images/transparent.gif');
- border-color: transparent;
- border-style: solid;
- display: inline-block;
- position: absolute;
- overflow: visible;
- word-wrap: normal;
- border-width: 0;
- min-width: 1px;
- resize: none;
- padding: 0px;
- margin: 0px;
-}
-.mxPlainTextEditor * {
- padding: 0px;
- margin: 0px;
-}
-div.mxWindow {
- -webkit-box-shadow: 3px 3px 12px #C0C0C0;
- -moz-box-shadow: 3px 3px 12px #C0C0C0;
- box-shadow: 3px 3px 12px #C0C0C0;
- background: url(data:image/gif;base64,R0lGODlhGgAUAIAAAOzs7PDw8CH5BAAAAAAALAAAAAAaABQAAAIijI+py70Ao5y02lud3lzhD4ZUR5aPiKajyZbqq7YyB9dhAQA7);
- _background: url('../images/window.gif');
- border:1px solid #c3c3c3;
- position: absolute;
- overflow: hidden;
- z-index: 1;
-}
-table.mxWindow {
- border-collapse: collapse;
- table-layout: fixed;
- font-family: Arial;
- font-size: 8pt;
-}
-td.mxWindowTitle {
- background: url(data:image/gif;base64,R0lGODlhFwAXAMQAANfX18rKyuHh4c7OzsDAwMHBwc/Pz+Li4uTk5NHR0dvb2+jo6O/v79/f3/n5+dnZ2dbW1uPj44yMjNPT0+Dg4N3d3ebm5szMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAXABcAAAWQICESxWiW5Ck6bOu+MMvMdG3f86LvfO/rlqBwSCwaj8ikUohoOp/QaDNCrVqvWKpgezhsv+AwmEIum89ocmPNbrvf64p8Tq/b5Yq8fs/v5x+AgYKDhIAAh4iJiouHEI6PkJGSjhOVlpeYmZUJnJ2en6CcBqMDpaanqKgXq6ytrq+rAbKztLW2shK5uru8vbkhADs=) repeat-x;
- _background: url('../images/window-title.gif') repeat-x;
- text-overflow: ellipsis;
- white-space: nowrap;
- text-align: center;
- font-weight: bold;
- overflow: hidden;
- height: 13px;
- padding: 2px;
- padding-top: 4px;
- padding-bottom: 6px;
- color: black;
-}
-td.mxWindowPane {
- vertical-align: top;
- padding: 0px;
-}
-div.mxWindowPane {
- overflow: hidden;
- position: relative;
-}
-td.mxWindowPane td {
- font-family: Arial;
- font-size: 8pt;
-}
-td.mxWindowPane input, td.mxWindowPane select, td.mxWindowPane textarea, td.mxWindowPane radio {
- border-color: #8C8C8C;
- border-style: solid;
- border-width: 1px;
- font-family: Arial;
- font-size: 8pt;
- padding: 1px;
-}
-td.mxWindowPane button {
- background: url(data:image/gif;base64,R0lGODlhCgATALMAAP7+/t7e3vj4+Ojo6OXl5e/v7/n5+fb29vPz8/39/e3t7fHx8e7u7v///wAAAAAAACH5BAAAAAAALAAAAAAKABMAAAQ2MMlJhb0Y6c2X/2AhjiRjnqiirizqMkEsz0Rt30Ou7y8K/ouDcEg0GI9IgHLJbDif0Kh06owAADs=) repeat-x;
- _background: url('../images/button.gif') repeat-x;
- font-family: Arial;
- font-size: 8pt;
- padding: 2px;
- float: left;
-}
-img.mxToolbarItem {
- margin-right: 6px;
- margin-bottom: 6px;
- border-width: 1px;
-}
-select.mxToolbarCombo {
- vertical-align: top;
- border-style: inset;
- border-width: 2px;
-}
-div.mxToolbarComboContainer {
- padding: 2px;
-}
-img.mxToolbarMode {
- margin: 2px;
- margin-right: 4px;
- margin-bottom: 4px;
- border-width: 0px;
-}
-img.mxToolbarModeSelected {
- margin: 0px;
- margin-right: 2px;
- margin-bottom: 2px;
- border-width: 2px;
- border-style: inset;
-}
-div.mxTooltip {
- -webkit-box-shadow: 3px 3px 12px #C0C0C0;
- -moz-box-shadow: 3px 3px 12px #C0C0C0;
- box-shadow: 3px 3px 12px #C0C0C0;
- background: #FFFFCC;
- border-style: solid;
- border-width: 1px;
- border-color: black;
- font-family: Arial;
- font-size: 8pt;
- position: absolute;
- cursor: default;
- padding: 4px;
- color: black;
-}
-div.mxPopupMenu {
- -webkit-box-shadow: 3px 3px 12px #C0C0C0;
- -moz-box-shadow: 3px 3px 12px #C0C0C0;
- box-shadow: 3px 3px 12px #C0C0C0;
- background: url(data:image/gif;base64,R0lGODlhGgAUAIAAAOzs7PDw8CH5BAAAAAAALAAAAAAaABQAAAIijI+py70Ao5y02lud3lzhD4ZUR5aPiKajyZbqq7YyB9dhAQA7);
- _background: url('../images/window.gif');
- position: absolute;
- border-style: solid;
- border-width: 1px;
- border-color: black;
-}
-table.mxPopupMenu {
- border-collapse: collapse;
- margin-top: 1px;
- margin-bottom: 1px;
-}
-tr.mxPopupMenuItem {
- color: black;
- cursor: pointer;
-}
-tr.mxPopupMenuItemHover {
- background-color: #000066;
- color: #FFFFFF;
- cursor: pointer;
-}
-td.mxPopupMenuItem {
- padding: 2px 30px 2px 10px;
- white-space: nowrap;
- font-family: Arial;
- font-size: 8pt;
-}
-td.mxPopupMenuIcon {
- background-color: #D0D0D0;
- padding: 2px 4px 2px 4px;
-}
-.mxDisabled {
- opacity: 0.2 !important;
- cursor:default !important;
-}
diff --git a/src/main/mxgraph/css/explorer.css b/src/main/mxgraph/css/explorer.css
deleted file mode 100644
index 50e704fe..00000000
--- a/src/main/mxgraph/css/explorer.css
+++ /dev/null
@@ -1,18 +0,0 @@
-div.mxTooltip {
- filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4,
- Color='#A2A2A2', Positive='true');
-}
-div.mxPopupMenu {
- filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4,
- Color='#C0C0C0', Positive='true');
-}
-div.mxWindow {
- _filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4,
- Color='#C0C0C0', Positive='true');
-}
-td.mxWindowTitle {
- _height: 23px;
-}
-.mxDisabled {
- filter:alpha(opacity=20) !important;
-}
diff --git a/src/main/mxgraph/images/button.gif b/src/main/mxgraph/images/button.gif
deleted file mode 100644
index ad55cab6..00000000
--- a/src/main/mxgraph/images/button.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/close.gif b/src/main/mxgraph/images/close.gif
deleted file mode 100644
index 1069e94b..00000000
--- a/src/main/mxgraph/images/close.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/collapsed.gif b/src/main/mxgraph/images/collapsed.gif
deleted file mode 100644
index 0276444a..00000000
--- a/src/main/mxgraph/images/collapsed.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/error.gif b/src/main/mxgraph/images/error.gif
deleted file mode 100644
index 14e1aeef..00000000
--- a/src/main/mxgraph/images/error.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/expanded.gif b/src/main/mxgraph/images/expanded.gif
deleted file mode 100644
index 3767b0ba..00000000
--- a/src/main/mxgraph/images/expanded.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/maximize.gif b/src/main/mxgraph/images/maximize.gif
deleted file mode 100644
index e27cf3e1..00000000
--- a/src/main/mxgraph/images/maximize.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/minimize.gif b/src/main/mxgraph/images/minimize.gif
deleted file mode 100644
index 1e95e7ca..00000000
--- a/src/main/mxgraph/images/minimize.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/normalize.gif b/src/main/mxgraph/images/normalize.gif
deleted file mode 100644
index 34a8d302..00000000
--- a/src/main/mxgraph/images/normalize.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/point.gif b/src/main/mxgraph/images/point.gif
deleted file mode 100644
index 9074c395..00000000
--- a/src/main/mxgraph/images/point.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/resize.gif b/src/main/mxgraph/images/resize.gif
deleted file mode 100644
index ff558dba..00000000
--- a/src/main/mxgraph/images/resize.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/separator.gif b/src/main/mxgraph/images/separator.gif
deleted file mode 100644
index 5c1b8956..00000000
--- a/src/main/mxgraph/images/separator.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/submenu.gif b/src/main/mxgraph/images/submenu.gif
deleted file mode 100644
index ffe76176..00000000
--- a/src/main/mxgraph/images/submenu.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/transparent.gif b/src/main/mxgraph/images/transparent.gif
deleted file mode 100644
index 76040f2b..00000000
--- a/src/main/mxgraph/images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/warning.gif b/src/main/mxgraph/images/warning.gif
deleted file mode 100644
index 705235f9..00000000
--- a/src/main/mxgraph/images/warning.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/warning.png b/src/main/mxgraph/images/warning.png
deleted file mode 100644
index 2f787896..00000000
--- a/src/main/mxgraph/images/warning.png
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/window-title.gif b/src/main/mxgraph/images/window-title.gif
deleted file mode 100644
index 231def8b..00000000
--- a/src/main/mxgraph/images/window-title.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/images/window.gif b/src/main/mxgraph/images/window.gif
deleted file mode 100644
index 6631c4f5..00000000
--- a/src/main/mxgraph/images/window.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/mxgraph/mxClient.js b/src/main/mxgraph/mxClient.js
deleted file mode 100644
index 2a64732e..00000000
--- a/src/main/mxgraph/mxClient.js
+++ /dev/null
@@ -1,1803 +0,0 @@
-var mxClient={VERSION:"14.0.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE6:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE 6"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_QUIRKS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE")&&(null==document.documentMode||5==document.documentMode),IS_EM:"spellcheck"in document.createElement("textarea")&&
-8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),IS_OP:null!=navigator.userAgent&&(0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/")),IS_OT:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&
-0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:/Apple Computer, Inc/.test(navigator.vendor),IS_ANDROID:0<=navigator.appVersion.indexOf("Android"),IS_IOS:/iP(hone|od|ad)/.test(navigator.platform),IS_GC:/Google Inc/.test(navigator.vendor),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:"undefined"!==typeof InstallTrigger,IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&0>
-navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_VML:"MICROSOFT INTERNET EXPLORER"==navigator.appName.toUpperCase(),IS_SVG:"MICROSOFT INTERNET EXPLORER"!=
-navigator.appName.toUpperCase(),NO_FO:!document.createElementNS||"[object SVGForeignObjectElement]"!=document.createElementNS("http://www.w3.org/2000/svg","foreignObject")||0<=navigator.userAgent.indexOf("Opera/"),IS_WIN:0<navigator.appVersion.indexOf("Win"),IS_MAC:0<navigator.appVersion.indexOf("Mac"),IS_CHROMEOS:/\bCrOS\b/.test(navigator.appVersion),IS_TOUCH:"ontouchstart"in document.documentElement,IS_POINTER:null!=window.PointerEvent&&!(0<navigator.appVersion.indexOf("Mac")),IS_LOCAL:0>document.location.href.indexOf("http://")&&
-0>document.location.href.indexOf("https://"),defaultBundles:[],isBrowserSupported:function(){return mxClient.IS_VML||mxClient.IS_SVG},link:function(a,b,c,d){c=c||document;if(mxClient.IS_IE6)c.write('<link rel="'+a+'" href="'+b+'" charset="UTF-8" type="text/css"/>');else{var e=c.createElement("link");e.setAttribute("rel",a);e.setAttribute("href",b);e.setAttribute("charset","UTF-8");e.setAttribute("type","text/css");d&&e.setAttribute("id",d);c.getElementsByTagName("head")[0].appendChild(e)}},loadResources:function(a,
-b){function c(){0==--d&&a()}for(var d=mxClient.defaultBundles.length,e=0;e<mxClient.defaultBundles.length;e++)mxResources.add(mxClient.defaultBundles[e],b,c)},include:function(a){document.write('<script src="'+a+'">\x3c/script>')}};"undefined"==typeof mxLoadResources&&(mxLoadResources=!0);"undefined"==typeof mxForceIncludes&&(mxForceIncludes=!1);"undefined"==typeof mxResourceExtension&&(mxResourceExtension=".txt");"undefined"==typeof mxLoadStylesheets&&(mxLoadStylesheets=!0);
-"undefined"!=typeof mxBasePath&&0<mxBasePath.length?("/"==mxBasePath.substring(mxBasePath.length-1)&&(mxBasePath=mxBasePath.substring(0,mxBasePath.length-1)),mxClient.basePath=mxBasePath):mxClient.basePath=".";"undefined"!=typeof mxImageBasePath&&0<mxImageBasePath.length?("/"==mxImageBasePath.substring(mxImageBasePath.length-1)&&(mxImageBasePath=mxImageBasePath.substring(0,mxImageBasePath.length-1)),mxClient.imageBasePath=mxImageBasePath):mxClient.imageBasePath="images";
-mxClient.language="undefined"!=typeof mxLanguage&&null!=mxLanguage?mxLanguage:mxClient.IS_IE?navigator.userLanguage:navigator.language;mxClient.defaultLanguage="undefined"!=typeof mxDefaultLanguage&&null!=mxDefaultLanguage?mxDefaultLanguage:"en";mxLoadStylesheets&&mxClient.link("stylesheet","mxgraph/css/common.css");"undefined"!=typeof mxLanguages&&null!=mxLanguages&&(mxClient.languages=mxLanguages);
-mxClient.IS_VML&&(mxClient.IS_SVG?mxClient.IS_VML=!1:(null!=document.namespaces&&(8==document.documentMode?(document.namespaces.add(mxClient.VML_PREFIX,"urn:schemas-microsoft-com:vml","#default#VML"),document.namespaces.add(mxClient.OFFICE_PREFIX,"urn:schemas-microsoft-com:office:office","#default#VML")):(document.namespaces.add(mxClient.VML_PREFIX,"urn:schemas-microsoft-com:vml"),document.namespaces.add(mxClient.OFFICE_PREFIX,"urn:schemas-microsoft-com:office:office"))),mxClient.IS_QUIRKS&&30<=document.styleSheets.length?
-function(){var a=document.createElement("style");a.type="text/css";a.styleSheet.cssText=mxClient.VML_PREFIX+"\\:*{behavior:url(#default#VML)}"+mxClient.OFFICE_PREFIX+"\\:*{behavior:url(#default#VML)}";document.getElementsByTagName("head")[0].appendChild(a)}():document.createStyleSheet().cssText=mxClient.VML_PREFIX+"\\:*{behavior:url(#default#VML)}"+mxClient.OFFICE_PREFIX+"\\:*{behavior:url(#default#VML)}",mxLoadStylesheets&&mxClient.link("stylesheet","mxgraph/css/explorer.css")));
-var mxLog={consoleName:"Console",TRACE:!1,DEBUG:!0,WARN:!0,buffer:"",init:function(){if(null==mxLog.window&&null!=document.body){var a=mxLog.consoleName+" - mxGraph "+mxClient.VERSION,b=document.createElement("table");b.setAttribute("width","100%");b.setAttribute("height","100%");var c=document.createElement("tbody"),d=document.createElement("tr"),e=document.createElement("td");e.style.verticalAlign="top";mxLog.textarea=document.createElement("textarea");mxLog.textarea.setAttribute("wrap","off");
-mxLog.textarea.setAttribute("readOnly","true");mxLog.textarea.style.height="100%";mxLog.textarea.style.resize="none";mxLog.textarea.value=mxLog.buffer;mxLog.textarea.style.width=mxClient.IS_NS&&"BackCompat"!=document.compatMode?"99%":"100%";e.appendChild(mxLog.textarea);d.appendChild(e);c.appendChild(d);d=document.createElement("tr");mxLog.td=document.createElement("td");mxLog.td.style.verticalAlign="top";mxLog.td.setAttribute("height","30px");d.appendChild(mxLog.td);c.appendChild(d);b.appendChild(c);
-mxLog.addButton("Info",function(a){mxLog.info()});mxLog.addButton("DOM",function(a){a=mxUtils.getInnerHtml(document.body);mxLog.debug(a)});mxLog.addButton("Trace",function(a){mxLog.TRACE=!mxLog.TRACE;mxLog.TRACE?mxLog.debug("Tracing enabled"):mxLog.debug("Tracing disabled")});mxLog.addButton("Copy",function(a){try{mxUtils.copy(mxLog.textarea.value)}catch(k){mxUtils.alert(k)}});mxLog.addButton("Show",function(a){try{mxUtils.popup(mxLog.textarea.value)}catch(k){mxUtils.alert(k)}});mxLog.addButton("Clear",
-function(a){mxLog.textarea.value=""});d=c=0;"number"===typeof window.innerWidth?(c=window.innerHeight,d=window.innerWidth):(c=document.documentElement.clientHeight||document.body.clientHeight,d=document.body.clientWidth);mxLog.window=new mxWindow(a,b,Math.max(0,d-320),Math.max(0,c-210),300,160);mxLog.window.setMaximizable(!0);mxLog.window.setScrollable(!1);mxLog.window.setResizable(!0);mxLog.window.setClosable(!0);mxLog.window.destroyOnClose=!1;if((mxClient.IS_NS||mxClient.IS_IE)&&!mxClient.IS_GC&&
-!mxClient.IS_SF&&"BackCompat"!=document.compatMode||11==document.documentMode){var f=mxLog.window.getElement(),a=function(a,b){mxLog.textarea.style.height=Math.max(0,f.offsetHeight-70)+"px"};mxLog.window.addListener(mxEvent.RESIZE_END,a);mxLog.window.addListener(mxEvent.MAXIMIZE,a);mxLog.window.addListener(mxEvent.NORMALIZE,a);mxLog.textarea.style.height="92px"}}},info:function(){mxLog.writeln(mxUtils.toString(navigator))},addButton:function(a,b){var c=document.createElement("button");mxUtils.write(c,
-a);mxEvent.addListener(c,"click",b);mxLog.td.appendChild(c)},isVisible:function(){return null!=mxLog.window?mxLog.window.isVisible():!1},show:function(){mxLog.setVisible(!0)},setVisible:function(a){null==mxLog.window&&mxLog.init();null!=mxLog.window&&mxLog.window.setVisible(a)},enter:function(a){if(mxLog.TRACE)return mxLog.writeln("Entering "+a),(new Date).getTime()},leave:function(a,b){if(mxLog.TRACE){var c=0!=b?" ("+((new Date).getTime()-b)+" ms)":"";mxLog.writeln("Leaving "+a+c)}},debug:function(){mxLog.DEBUG&&
-mxLog.writeln.apply(this,arguments)},warn:function(){mxLog.WARN&&mxLog.writeln.apply(this,arguments)},write:function(){for(var a="",b=0;b<arguments.length;b++)a+=arguments[b],b<arguments.length-1&&(a+=" ");null!=mxLog.textarea?(mxLog.textarea.value+=a,null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Presto/2.5")&&(mxLog.textarea.style.visibility="hidden",mxLog.textarea.style.visibility="visible"),mxLog.textarea.scrollTop=mxLog.textarea.scrollHeight):mxLog.buffer+=a},writeln:function(){for(var a=
-"",b=0;b<arguments.length;b++)a+=arguments[b],b<arguments.length-1&&(a+=" ");mxLog.write(a+"\n")}},mxObjectIdentity={FIELD_NAME:"mxObjectId",counter:0,get:function(a){if(null!=a){if(null==a[mxObjectIdentity.FIELD_NAME])if("object"===typeof a){var b=mxUtils.getFunctionName(a.constructor);a[mxObjectIdentity.FIELD_NAME]=b+"#"+mxObjectIdentity.counter++}else"function"===typeof a&&(a[mxObjectIdentity.FIELD_NAME]="Function#"+mxObjectIdentity.counter++);return a[mxObjectIdentity.FIELD_NAME]}return null},
-clear:function(a){"object"!==typeof a&&"function"!==typeof a||delete a[mxObjectIdentity.FIELD_NAME]}};function mxDictionary(){this.clear()}mxDictionary.prototype.map=null;mxDictionary.prototype.clear=function(){this.map={}};mxDictionary.prototype.get=function(a){a=mxObjectIdentity.get(a);return this.map[a]};mxDictionary.prototype.put=function(a,b){var c=mxObjectIdentity.get(a),d=this.map[c];this.map[c]=b;return d};
-mxDictionary.prototype.remove=function(a){a=mxObjectIdentity.get(a);var b=this.map[a];delete this.map[a];return b};mxDictionary.prototype.getKeys=function(){var a=[],b;for(b in this.map)a.push(b);return a};mxDictionary.prototype.getValues=function(){var a=[],b;for(b in this.map)a.push(this.map[b]);return a};mxDictionary.prototype.visit=function(a){for(var b in this.map)a(b,this.map[b])};
-var mxResources={resources:{},extension:mxResourceExtension,resourcesEncoded:!1,loadDefaultBundle:!0,loadSpecialBundle:!0,isLanguageSupported:function(a){return null!=mxClient.languages?0<=mxUtils.indexOf(mxClient.languages,a):!0},getDefaultBundle:function(a,b){return mxResources.loadDefaultBundle||!mxResources.isLanguageSupported(b)?a+mxResources.extension:null},getSpecialBundle:function(a,b){if(null==mxClient.languages||!this.isLanguageSupported(b)){var c=b.indexOf("-");0<c&&(b=b.substring(0,c))}return mxResources.loadSpecialBundle&&
-mxResources.isLanguageSupported(b)&&b!=mxClient.defaultLanguage?a+"_"+b+mxResources.extension:null},add:function(a,b,c){b=null!=b?b:null!=mxClient.language?mxClient.language.toLowerCase():mxConstants.NONE;if(b!=mxConstants.NONE){var d=mxResources.getDefaultBundle(a,b),e=mxResources.getSpecialBundle(a,b),f=function(){if(null!=e)if(c)mxUtils.get(e,function(a){mxResources.parse(a.getText());c()},function(){c()});else try{var a=mxUtils.load(e);a.isReady()&&mxResources.parse(a.getText())}catch(l){}else null!=
-c&&c()};if(null!=d)if(c)mxUtils.get(d,function(a){mxResources.parse(a.getText());f()},function(){f()});else try{var g=mxUtils.load(d);g.isReady()&&mxResources.parse(g.getText());f()}catch(k){}else f()}},parse:function(a){if(null!=a){a=a.split("\n");for(var b=0;b<a.length;b++)if("#"!=a[b].charAt(0)){var c=a[b].indexOf("=");if(0<c){var d=a[b].substring(0,c),e=a[b].length;13==a[b].charCodeAt(e-1)&&e--;c=a[b].substring(c+1,e);this.resourcesEncoded?(c=c.replace(/\\(?=u[a-fA-F\d]{4})/g,"%"),mxResources.resources[d]=
-unescape(c)):mxResources.resources[d]=c}}}},get:function(a,b,c){a=mxResources.resources[a];null==a&&(a=c);null!=a&&null!=b&&(a=mxResources.replacePlaceholders(a,b));return a},replacePlaceholders:function(a,b){for(var c=[],d=null,e=0;e<a.length;e++){var f=a.charAt(e);"{"==f?d="":null!=d&&"}"==f?(d=parseInt(d)-1,0<=d&&d<b.length&&c.push(b[d]),d=null):null!=d?d+=f:c.push(f)}return c.join("")},loadResources:function(a){mxResources.add(mxClient.basePath+"/resources/editor",null,function(){mxResources.add(mxClient.basePath+
-"/resources/graph",null,a)})}};function mxPoint(a,b){this.x=null!=a?a:0;this.y=null!=b?b:0}mxPoint.prototype.x=null;mxPoint.prototype.y=null;mxPoint.prototype.equals=function(a){return null!=a&&a.x==this.x&&a.y==this.y};mxPoint.prototype.clone=function(){return mxUtils.clone(this)};function mxRectangle(a,b,c,d){mxPoint.call(this,a,b);this.width=null!=c?c:0;this.height=null!=d?d:0}mxRectangle.prototype=new mxPoint;mxRectangle.prototype.constructor=mxRectangle;mxRectangle.prototype.width=null;
-mxRectangle.prototype.height=null;mxRectangle.prototype.setRect=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d};mxRectangle.prototype.getCenterX=function(){return this.x+this.width/2};mxRectangle.prototype.getCenterY=function(){return this.y+this.height/2};
-mxRectangle.prototype.add=function(a){if(null!=a){var b=Math.min(this.x,a.x),c=Math.min(this.y,a.y),d=Math.max(this.x+this.width,a.x+a.width);a=Math.max(this.y+this.height,a.y+a.height);this.x=b;this.y=c;this.width=d-b;this.height=a-c}};mxRectangle.prototype.intersect=function(a){if(null!=a){var b=this.x+this.width,c=a.x+a.width,d=this.y+this.height,e=a.y+a.height;this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.width=Math.min(b,c)-this.x;this.height=Math.min(d,e)-this.y}};
-mxRectangle.prototype.grow=function(a){this.x-=a;this.y-=a;this.width+=2*a;this.height+=2*a;return this};mxRectangle.prototype.getPoint=function(){return new mxPoint(this.x,this.y)};mxRectangle.prototype.rotate90=function(){var a=(this.width-this.height)/2;this.x+=a;this.y-=a;a=this.width;this.width=this.height;this.height=a};mxRectangle.prototype.equals=function(a){return null!=a&&a.x==this.x&&a.y==this.y&&a.width==this.width&&a.height==this.height};
-mxRectangle.fromRectangle=function(a){return new mxRectangle(a.x,a.y,a.width,a.height)};
-var mxEffects={animateChanges:function(a,b,c){var d=0,e=function(){for(var g=!1,k=0;k<b.length;k++){var l=b[k];if(l instanceof mxGeometryChange||l instanceof mxTerminalChange||l instanceof mxValueChange||l instanceof mxChildChange||l instanceof mxStyleChange){var m=a.getView().getState(l.cell||l.child,!1);if(null!=m)if(g=!0,l.constructor!=mxGeometryChange||a.model.isEdge(l.cell))mxUtils.setOpacity(m.shape.node,100*d/10);else{var n=a.getView().scale,p=(l.geometry.x-l.previous.x)*n,q=(l.geometry.y-
-l.previous.y)*n,r=(l.geometry.width-l.previous.width)*n,n=(l.geometry.height-l.previous.height)*n;0==d?(m.x-=p,m.y-=q,m.width-=r,m.height-=n):(m.x+=p/10,m.y+=q/10,m.width+=r/10,m.height+=n/10);a.cellRenderer.redraw(m);mxEffects.cascadeOpacity(a,l.cell,100*d/10)}}}10>d&&g?(d++,window.setTimeout(e,f)):null!=c&&c()},f=30;e()},cascadeOpacity:function(a,b,c){for(var d=a.model.getChildCount(b),e=0;e<d;e++){var f=a.model.getChildAt(b,e),g=a.getView().getState(f);null!=g&&(mxUtils.setOpacity(g.shape.node,
-c),mxEffects.cascadeOpacity(a,f,c))}b=a.model.getEdges(b);if(null!=b)for(e=0;e<b.length;e++)d=a.getView().getState(b[e]),null!=d&&mxUtils.setOpacity(d.shape.node,c)},fadeOut:function(a,b,c,d,e,f){d=d||40;e=e||30;var g=b||100;mxUtils.setOpacity(a,g);if(f||null==f){var k=function(){g=Math.max(g-d,0);mxUtils.setOpacity(a,g);0<g?window.setTimeout(k,e):(a.style.visibility="hidden",c&&a.parentNode&&a.parentNode.removeChild(a))};window.setTimeout(k,e)}else a.style.visibility="hidden",c&&a.parentNode&&a.parentNode.removeChild(a)}},
-mxUtils={errorResource:"none"!=mxClient.language?"error":"",closeResource:"none"!=mxClient.language?"close":"",errorImage:mxClient.imageBasePath+"/error.gif",removeCursors:function(a){null!=a.style&&(a.style.cursor="");a=a.childNodes;if(null!=a)for(var b=a.length,c=0;c<b;c+=1)mxUtils.removeCursors(a[c])},getCurrentStyle:function(){return mxClient.IS_IE&&(null==document.documentMode||9>document.documentMode)?function(a){return null!=a?a.currentStyle:null}:function(a){return null!=a?window.getComputedStyle(a,
-""):null}}(),parseCssNumber:function(a){"thin"==a?a="2":"medium"==a?a="4":"thick"==a&&(a="6");a=parseFloat(a);isNaN(a)&&(a=0);return a},setPrefixedStyle:function(){var a=null;mxClient.IS_OT?a="O":mxClient.IS_SF||mxClient.IS_GC?a="Webkit":mxClient.IS_MT?a="Moz":mxClient.IS_IE&&9<=document.documentMode&&10>document.documentMode&&(a="ms");return function(b,c,d){b[c]=d;null!=a&&0<c.length&&(c=a+c.substring(0,1).toUpperCase()+c.substring(1),b[c]=d)}}(),hasScrollbars:function(a){a=mxUtils.getCurrentStyle(a);
-return null!=a&&("scroll"==a.overflow||"auto"==a.overflow)},bind:function(a,b){return function(){return b.apply(a,arguments)}},eval:function(a){var b=null;if(0<=a.indexOf("function"))try{eval("var _mxJavaScriptExpression="+a),b=_mxJavaScriptExpression,_mxJavaScriptExpression=null}catch(c){mxLog.warn(c.message+" while evaluating "+a)}else try{b=eval(a)}catch(c){mxLog.warn(c.message+" while evaluating "+a)}return b},findNode:function(a,b,c){if(a.nodeType==mxConstants.NODETYPE_ELEMENT){var d=a.getAttribute(b);
-if(null!=d&&d==c)return a}for(a=a.firstChild;null!=a;){d=mxUtils.findNode(a,b,c);if(null!=d)return d;a=a.nextSibling}return null},getFunctionName:function(a){var b=null;null!=a&&(null!=a.name?b=a.name:(b=mxUtils.trim(a.toString()),/^function\s/.test(b)&&(b=mxUtils.ltrim(b.substring(9)),a=b.indexOf("("),0<a&&(b=b.substring(0,a)))));return b},indexOf:function(a,b){if(null!=a&&null!=b)for(var c=0;c<a.length;c++)if(a[c]==b)return c;return-1},forEach:function(a,b){if(null!=a&&null!=b)for(var c=0;c<a.length;c++)b(a[c]);
-return a},remove:function(a,b){var c=null;if("object"==typeof b)for(var d=mxUtils.indexOf(b,a);0<=d;)b.splice(d,1),c=a,d=mxUtils.indexOf(b,a);for(var e in b)b[e]==a&&(delete b[e],c=a);return c},isNode:function(a,b,c,d){return null==a||isNaN(a.nodeType)||null!=b&&a.nodeName.toLowerCase()!=b.toLowerCase()?!1:null==c||a.getAttribute(c)==d},isAncestorNode:function(a,b){for(var c=b;null!=c;){if(c==a)return!0;c=c.parentNode}return!1},getChildNodes:function(a,b){b=b||mxConstants.NODETYPE_ELEMENT;for(var c=
-[],d=a.firstChild;null!=d;)d.nodeType==b&&c.push(d),d=d.nextSibling;return c},importNode:function(a,b,c){return mxClient.IS_IE&&(null==document.documentMode||10>document.documentMode)?mxUtils.importNodeImplementation(a,b,c):a.importNode(b,c)},importNodeImplementation:function(a,b,c){switch(b.nodeType){case 1:var d=a.createElement(b.nodeName);if(b.attributes&&0<b.attributes.length)for(var e=0;e<b.attributes.length;e++)d.setAttribute(b.attributes[e].nodeName,b.getAttribute(b.attributes[e].nodeName));
-if(c&&b.childNodes&&0<b.childNodes.length)for(e=0;e<b.childNodes.length;e++)d.appendChild(mxUtils.importNodeImplementation(a,b.childNodes[e],c));return d;case 3:case 4:case 8:return a.createTextNode(null!=b.nodeValue?b.nodeValue:b.value)}},createXmlDocument:function(){var a=null;document.implementation&&document.implementation.createDocument?a=document.implementation.createDocument("","",null):"ActiveXObject"in window&&(a=mxUtils.createMsXmlDocument());return a},createMsXmlDocument:function(){var a=
-new ActiveXObject("Microsoft.XMLDOM");a.async=!1;a.validateOnParse=!1;a.resolveExternals=!1;return a},parseXml:function(){return window.DOMParser?function(a){return(new DOMParser).parseFromString(a,"text/xml")}:function(a){var b=mxUtils.createMsXmlDocument();b.loadXML(a);return b}}(),clearSelection:function(){return document.selection?function(){document.selection.empty()}:window.getSelection?function(){window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&
-window.getSelection().removeAllRanges()}:function(){}}(),removeWhitespace:function(a,b){for(var c=b?a.previousSibling:a.nextSibling;null!=c&&c.nodeType==mxConstants.NODETYPE_TEXT;){var d=b?c.previousSibling:c.nextSibling,e=mxUtils.getTextContent(c);0==mxUtils.trim(e).length&&c.parentNode.removeChild(c);c=d}},htmlEntities:function(a,b){a=String(a||"");a=a.replace(/&/g,"&amp;");a=a.replace(/"/g,"&quot;");a=a.replace(/\'/g,"&#39;");a=a.replace(/</g,"&lt;");a=a.replace(/>/g,"&gt;");if(null==b||b)a=a.replace(/\n/g,
-"&#xa;");return a},isVml:function(a){return null!=a&&"urn:schemas-microsoft-com:vml"==a.tagUrn},getXml:function(a,b){var c="";mxClient.IS_IE||mxClient.IS_IE11?c=mxUtils.getPrettyXml(a,"","",""):null!=window.XMLSerializer?c=(new XMLSerializer).serializeToString(a):null!=a.xml&&(c=a.xml.replace(/\r\n\t[\t]*/g,"").replace(/>\r\n/g,">").replace(/\r\n/g,"\n"));return c=c.replace(/\n/g,b||"&#xa;")},getPrettyXml:function(a,b,c,d,e){var f=[];if(null!=a)if(b=null!=b?b:" ",c=null!=c?c:"",d=null!=d?d:"\n",
-null!=a.namespaceURI&&a.namespaceURI!=e&&(e=a.namespaceURI,null==a.getAttribute("xmlns")&&a.setAttribute("xmlns",a.namespaceURI)),a.nodeType==mxConstants.NODETYPE_DOCUMENT)f.push(mxUtils.getPrettyXml(a.documentElement,b,c,d,e));else if(a.nodeType==mxConstants.NODETYPE_DOCUMENT_FRAGMENT){var g=a.firstChild;if(null!=g)for(;null!=g;)f.push(mxUtils.getPrettyXml(g,b,c,d,e)),g=g.nextSibling}else if(a.nodeType==mxConstants.NODETYPE_COMMENT)a=mxUtils.getTextContent(a),0<a.length&&f.push(c+"\x3c!--"+a+"--\x3e"+
-d);else if(a.nodeType==mxConstants.NODETYPE_TEXT)a=mxUtils.trim(mxUtils.getTextContent(a)),0<a.length&&f.push(c+mxUtils.htmlEntities(a,!1)+d);else if(a.nodeType==mxConstants.NODETYPE_CDATA)a=mxUtils.getTextContent(a),0<a.length&&f.push(c+"<![CDATA["+a+"]]"+d);else{f.push(c+"<"+a.nodeName);g=a.attributes;if(null!=g)for(var k=0;k<g.length;k++){var l=mxUtils.htmlEntities(g[k].value);f.push(" "+g[k].nodeName+'="'+l+'"')}g=a.firstChild;if(null!=g){for(f.push(">"+d);null!=g;)f.push(mxUtils.getPrettyXml(g,
-b,c+b,d,e)),g=g.nextSibling;f.push(c+"</"+a.nodeName+">"+d)}else f.push(" />"+d)}return f.join("")},extractTextWithWhitespace:function(a){function b(a){if(1!=a.length||"BR"!=a[0].nodeName&&"\n"!=a[0].innerHTML)for(var e=0;e<a.length;e++){var g=a[e];"BR"==g.nodeName||"\n"==g.innerHTML||(1==a.length||0==e)&&"DIV"==g.nodeName&&"<br>"==g.innerHTML.toLowerCase()?d.push("\n"):(3===g.nodeType||4===g.nodeType?0<g.nodeValue.length&&d.push(g.nodeValue):8!==g.nodeType&&0<g.childNodes.length&&b(g.childNodes),
-e<a.length-1&&0<=mxUtils.indexOf(c,a[e+1].nodeName)&&d.push("\n"))}}var c="BLOCKQUOTE DIV H1 H2 H3 H4 H5 H6 OL P PRE TABLE UL".split(" "),d=[];b(a);return d.join("")},replaceTrailingNewlines:function(a,b){for(var c="";0<a.length&&"\n"==a.charAt(a.length-1);)a=a.substring(0,a.length-1),c+=b;return a+c},getTextContent:function(a){return mxClient.IS_IE&&void 0!==a.innerText?a.innerText:null!=a?a[void 0===a.textContent?"text":"textContent"]:""},setTextContent:function(a,b){void 0!==a.innerText?a.innerText=
-b:a[void 0===a.textContent?"text":"textContent"]=b},getInnerHtml:function(){return mxClient.IS_IE?function(a){return null!=a?a.innerHTML:""}:function(a){return null!=a?(new XMLSerializer).serializeToString(a):""}}(),getOuterHtml:function(){return mxClient.IS_IE?function(a){if(null!=a){if(null!=a.outerHTML)return a.outerHTML;var b=[];b.push("<"+a.nodeName);var c=a.attributes;if(null!=c)for(var d=0;d<c.length;d++){var e=c[d].value;null!=e&&0<e.length&&(b.push(" "),b.push(c[d].nodeName),b.push('="'),
-b.push(e),b.push('"'))}0==a.innerHTML.length?b.push("/>"):(b.push(">"),b.push(a.innerHTML),b.push("</"+a.nodeName+">"));return b.join("")}return""}:function(a){return null!=a?(new XMLSerializer).serializeToString(a):""}}(),write:function(a,b){var c=a.ownerDocument.createTextNode(b);null!=a&&a.appendChild(c);return c},writeln:function(a,b){var c=a.ownerDocument.createTextNode(b);null!=a&&(a.appendChild(c),a.appendChild(document.createElement("br")));return c},br:function(a,b){b=b||1;for(var c=null,
-d=0;d<b;d++)null!=a&&(c=a.ownerDocument.createElement("br"),a.appendChild(c));return c},button:function(a,b,c){c=null!=c?c:document;c=c.createElement("button");mxUtils.write(c,a);mxEvent.addListener(c,"click",function(a){b(a)});return c},para:function(a,b){var c=document.createElement("p");mxUtils.write(c,b);null!=a&&a.appendChild(c);return c},addTransparentBackgroundFilter:function(a){a.style.filter+="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+mxClient.imageBasePath+"/transparent.gif', sizingMethod='scale')"},
-linkAction:function(a,b,c,d,e){return mxUtils.link(a,b,function(){c.execute(d)},e)},linkInvoke:function(a,b,c,d,e,f){return mxUtils.link(a,b,function(){c[d](e)},f)},link:function(a,b,c,d){var e=document.createElement("span");e.style.color="blue";e.style.textDecoration="underline";e.style.cursor="pointer";null!=d&&(e.style.paddingLeft=d+"px");mxEvent.addListener(e,"click",c);mxUtils.write(e,b);null!=a&&a.appendChild(e);return e},getDocumentSize:function(){var a=document.body,b=document.documentElement;
-try{return new mxRectangle(0,0,a.clientWidth||b.clientWidth,Math.max(a.clientHeight||0,b.clientHeight))}catch(c){return new mxRectangle}},fit:function(a){var b=mxUtils.getDocumentSize(),c=parseInt(a.offsetLeft),d=parseInt(a.offsetWidth),e=mxUtils.getDocumentScrollOrigin(a.ownerDocument),f=e.x,e=e.y,g=f+b.width;c+d>g&&(a.style.left=Math.max(f,g-d)+"px");c=parseInt(a.offsetTop);d=parseInt(a.offsetHeight);b=e+b.height;c+d>b&&(a.style.top=Math.max(e,b-d)+"px")},load:function(a){a=new mxXmlRequest(a,null,
-"GET",!1);a.send();return a},get:function(a,b,c,d,e,f,g){a=new mxXmlRequest(a,null,"GET");var k=a.setRequestHeaders;g&&(a.setRequestHeaders=function(a,b){k.apply(this,arguments);for(var c in g)a.setRequestHeader(c,g[c])});null!=d&&a.setBinary(d);a.send(b,c,e,f);return a},getAll:function(a,b,c){for(var d=a.length,e=[],f=0,g=function(){0==f&&null!=c&&c();f++},k=0;k<a.length;k++)(function(a,c){mxUtils.get(a,function(a){var f=a.getStatus();200>f||299<f?g():(e[c]=a,d--,0==d&&b(e))},g)})(a[k],k);0==d&&
-b(e)},post:function(a,b,c,d){return(new mxXmlRequest(a,b)).send(c,d)},submit:function(a,b,c,d){return(new mxXmlRequest(a,b)).simulate(c,d)},loadInto:function(a,b,c){mxClient.IS_IE?b.onreadystatechange=function(){4==b.readyState&&c()}:b.addEventListener("load",c,!1);b.load(a)},getValue:function(a,b,c){a=null!=a?a[b]:null;null==a&&(a=c);return a},getNumber:function(a,b,c){a=null!=a?a[b]:null;null==a&&(a=c||0);return Number(a)},getColor:function(a,b,c){a=null!=a?a[b]:null;null==a?a=c:a==mxConstants.NONE&&
-(a=null);return a},clone:function(a,b,c){c=null!=c?c:!1;var d=null;if(null!=a&&"function"==typeof a.constructor){var d=new a.constructor,e;for(e in a)e!=mxObjectIdentity.FIELD_NAME&&(null==b||0>mxUtils.indexOf(b,e))&&(d[e]=c||"object"!=typeof a[e]?a[e]:mxUtils.clone(a[e]))}return d},equalPoints:function(a,b){if(null==a&&null!=b||null!=a&&null==b||null!=a&&null!=b&&a.length!=b.length)return!1;if(null!=a&&null!=b)for(var c=0;c<a.length;c++)if(null!=a[c]&&null==b[c]||null==a[c]&&null!=b[c]||null!=a[c]&&
-null!=b[c]&&(a[c].x!=b[c].x||a[c].y!=b[c].y))return!1;return!0},equalEntries:function(a,b){var c=0;if(null==a&&null!=b||null!=a&&null==b||null!=a&&null!=b&&a.length!=b.length)return!1;if(null!=a&&null!=b){for(var d in b)c++;for(d in a)if(c--,!(mxUtils.isNaN(a[d])&&mxUtils.isNaN(b[d])||a[d]==b[d]))return!1}return 0==c},removeDuplicates:function(a){for(var b=new mxDictionary,c=[],d=0;d<a.length;d++)b.get(a[d])||(c.push(a[d]),b.put(a[d],!0));return c},isNaN:function(a){return"number"==typeof a&&isNaN(a)},
-extend:function(a,b){var c=function(){};c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a},toString:function(a){var b="",c;for(c in a)try{if(null==a[c])b+=c+" = [null]\n";else if("function"==typeof a[c])b+=c+" => [Function]\n";else if("object"==typeof a[c])var d=mxUtils.getFunctionName(a[c].constructor),b=b+(c+" => ["+d+"]\n");else b+=c+" = "+a[c]+"\n"}catch(e){b+=c+"="+e.message}return b},toRadians:function(a){return Math.PI*a/180},toDegree:function(a){return 180*a/Math.PI},arcToCurves:function(a,
-b,c,d,e,f,g,k,l){k-=a;l-=b;if(0===c||0===d)return q;c=Math.abs(c);d=Math.abs(d);var m=-k/2,n=-l/2,p=Math.cos(e*Math.PI/180),q=Math.sin(e*Math.PI/180);e=p*m+q*n;var m=-1*q*m+p*n,n=e*e,r=m*m,t=c*c,u=d*d,x=n/t+r/u;1<x?(c*=Math.sqrt(x),d*=Math.sqrt(x),f=0):(x=1,f===g&&(x=-1),f=x*Math.sqrt((t*u-t*r-u*n)/(t*r+u*n)));n=f*c*m/d;r=-1*f*d*e/c;k=p*n-q*r+k/2;l=q*n+p*r+l/2;t=Math.atan2((m-r)/d,(e-n)/c)-Math.atan2(0,1);f=0<=t?t:2*Math.PI+t;t=Math.atan2((-m-r)/d,(-e-n)/c)-Math.atan2((m-r)/d,(e-n)/c);e=0<=t?t:2*
-Math.PI+t;0==g&&0<e?e-=2*Math.PI:0!=g&&0>e&&(e+=2*Math.PI);g=2*e/Math.PI;g=Math.ceil(0>g?-1*g:g);e/=g;m=8/3*Math.sin(e/4)*Math.sin(e/4)/Math.sin(e/2);n=p*c;p*=d;c*=q;d*=q;for(var y=Math.cos(f),B=Math.sin(f),r=-m*(n*B+d*y),t=-m*(c*B-p*y),q=[],A=0;A<g;++A){f+=e;var y=Math.cos(f),B=Math.sin(f),u=n*y-d*B+k,x=c*y+p*B+l,z=-m*(n*B+d*y),y=-m*(c*B-p*y),B=6*A;q[B]=Number(r+a);q[B+1]=Number(t+b);q[B+2]=Number(u-z+a);q[B+3]=Number(x-y+b);q[B+4]=Number(u+a);q[B+5]=Number(x+b);r=u+z;t=x+y}return q},getBoundingBox:function(a,
-b,c){var d=null;if(null!=a&&null!=b&&0!=b){b=mxUtils.toRadians(b);var d=Math.cos(b),e=Math.sin(b);c=null!=c?c:new mxPoint(a.x+a.width/2,a.y+a.height/2);var f=new mxPoint(a.x,a.y);b=new mxPoint(a.x+a.width,a.y);var g=new mxPoint(b.x,a.y+a.height);a=new mxPoint(a.x,g.y);f=mxUtils.getRotatedPoint(f,d,e,c);b=mxUtils.getRotatedPoint(b,d,e,c);g=mxUtils.getRotatedPoint(g,d,e,c);a=mxUtils.getRotatedPoint(a,d,e,c);d=new mxRectangle(f.x,f.y,0,0);d.add(new mxRectangle(b.x,b.y,0,0));d.add(new mxRectangle(g.x,
-g.y,0,0));d.add(new mxRectangle(a.x,a.y,0,0))}return d},getRotatedPoint:function(a,b,c,d){d=null!=d?d:new mxPoint;var e=a.x-d.x;a=a.y-d.y;return new mxPoint(e*b-a*c+d.x,a*b+e*c+d.y)},getPortConstraints:function(a,b,c,d){b=mxUtils.getValue(a.style,mxConstants.STYLE_PORT_CONSTRAINT,mxUtils.getValue(b.style,c?mxConstants.STYLE_SOURCE_PORT_CONSTRAINT:mxConstants.STYLE_TARGET_PORT_CONSTRAINT,null));if(null==b)return d;d=b.toString();b=mxConstants.DIRECTION_MASK_NONE;c=0;1==mxUtils.getValue(a.style,mxConstants.STYLE_PORT_CONSTRAINT_ROTATION,
-0)&&(c=mxUtils.getValue(a.style,mxConstants.STYLE_ROTATION,0));a=0;45<c?(a=1,135<=c&&(a=2)):-45>c&&(a=3,-135>=c&&(a=2));if(0<=d.indexOf(mxConstants.DIRECTION_NORTH))switch(a){case 0:b|=mxConstants.DIRECTION_MASK_NORTH;break;case 1:b|=mxConstants.DIRECTION_MASK_EAST;break;case 2:b|=mxConstants.DIRECTION_MASK_SOUTH;break;case 3:b|=mxConstants.DIRECTION_MASK_WEST}if(0<=d.indexOf(mxConstants.DIRECTION_WEST))switch(a){case 0:b|=mxConstants.DIRECTION_MASK_WEST;break;case 1:b|=mxConstants.DIRECTION_MASK_NORTH;
-break;case 2:b|=mxConstants.DIRECTION_MASK_EAST;break;case 3:b|=mxConstants.DIRECTION_MASK_SOUTH}if(0<=d.indexOf(mxConstants.DIRECTION_SOUTH))switch(a){case 0:b|=mxConstants.DIRECTION_MASK_SOUTH;break;case 1:b|=mxConstants.DIRECTION_MASK_WEST;break;case 2:b|=mxConstants.DIRECTION_MASK_NORTH;break;case 3:b|=mxConstants.DIRECTION_MASK_EAST}if(0<=d.indexOf(mxConstants.DIRECTION_EAST))switch(a){case 0:b|=mxConstants.DIRECTION_MASK_EAST;break;case 1:b|=mxConstants.DIRECTION_MASK_SOUTH;break;case 2:b|=
-mxConstants.DIRECTION_MASK_WEST;break;case 3:b|=mxConstants.DIRECTION_MASK_NORTH}return b},reversePortConstraints:function(a){var b;b=(a&mxConstants.DIRECTION_MASK_WEST)<<3;b|=(a&mxConstants.DIRECTION_MASK_NORTH)<<1;b|=(a&mxConstants.DIRECTION_MASK_SOUTH)>>1;return b|=(a&mxConstants.DIRECTION_MASK_EAST)>>3},findNearestSegment:function(a,b,c){var d=-1;if(0<a.absolutePoints.length)for(var e=a.absolutePoints[0],f=null,g=1;g<a.absolutePoints.length;g++){var k=a.absolutePoints[g],e=mxUtils.ptSegDistSq(e.x,
-e.y,k.x,k.y,b,c);if(null==f||e<f)f=e,d=g-1;e=k}return d},getDirectedBounds:function(a,b,c,d,e){var f=mxUtils.getValue(c,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST);d=null!=d?d:mxUtils.getValue(c,mxConstants.STYLE_FLIPH,!1);e=null!=e?e:mxUtils.getValue(c,mxConstants.STYLE_FLIPV,!1);b.x=Math.round(Math.max(0,Math.min(a.width,b.x)));b.y=Math.round(Math.max(0,Math.min(a.height,b.y)));b.width=Math.round(Math.max(0,Math.min(a.width,b.width)));b.height=Math.round(Math.max(0,Math.min(a.height,
-b.height)));if(e&&(f==mxConstants.DIRECTION_SOUTH||f==mxConstants.DIRECTION_NORTH)||d&&(f==mxConstants.DIRECTION_EAST||f==mxConstants.DIRECTION_WEST))c=b.x,b.x=b.width,b.width=c;if(d&&(f==mxConstants.DIRECTION_SOUTH||f==mxConstants.DIRECTION_NORTH)||e&&(f==mxConstants.DIRECTION_EAST||f==mxConstants.DIRECTION_WEST))c=b.y,b.y=b.height,b.height=c;d=mxRectangle.fromRectangle(b);f==mxConstants.DIRECTION_SOUTH?(d.y=b.x,d.x=b.height,d.width=b.y,d.height=b.width):f==mxConstants.DIRECTION_WEST?(d.y=b.height,
-d.x=b.width,d.width=b.x,d.height=b.y):f==mxConstants.DIRECTION_NORTH&&(d.y=b.width,d.x=b.y,d.width=b.height,d.height=b.x);return new mxRectangle(a.x+d.x,a.y+d.y,a.width-d.width-d.x,a.height-d.height-d.y)},getPerimeterPoint:function(a,b,c){for(var d=null,e=0;e<a.length-1;e++){var f=mxUtils.intersection(a[e].x,a[e].y,a[e+1].x,a[e+1].y,b.x,b.y,c.x,c.y);if(null!=f){var g=c.x-f.x,k=c.y-f.y,f={p:f,distSq:k*k+g*g};null!=f&&(null==d||d.distSq>f.distSq)&&(d=f)}}return null!=d?d.p:null},rectangleIntersectsSegment:function(a,
-b,c){var d=a.y,e=a.x,f=d+a.height,g=e+a.width;a=b.x;var k=c.x;b.x>c.x&&(a=c.x,k=b.x);k>g&&(k=g);a<e&&(a=e);if(a>k)return!1;var e=b.y,g=c.y,l=c.x-b.x;1E-7<Math.abs(l)&&(c=(c.y-b.y)/l,b=b.y-c*b.x,e=c*a+b,g=c*k+b);e>g&&(b=g,g=e,e=b);g>f&&(g=f);e<d&&(e=d);return e>g?!1:!0},contains:function(a,b,c){return a.x<=b&&a.x+a.width>=b&&a.y<=c&&a.y+a.height>=c},intersects:function(a,b){var c=a.width,d=a.height,e=b.width,f=b.height;if(0>=e||0>=f||0>=c||0>=d)return!1;var g=a.x,k=a.y,l=b.x,m=b.y,e=e+l,f=f+m,c=c+
-g,d=d+k;return(e<l||e>g)&&(f<m||f>k)&&(c<g||c>l)&&(d<k||d>m)},intersectsHotspot:function(a,b,c,d,e,f){d=null!=d?d:1;e=null!=e?e:0;f=null!=f?f:0;if(0<d){var g=a.getCenterX(),k=a.getCenterY(),l=a.width,m=a.height,n=mxUtils.getValue(a.style,mxConstants.STYLE_STARTSIZE)*a.view.scale;0<n&&(mxUtils.getValue(a.style,mxConstants.STYLE_HORIZONTAL,!0)?(k=a.y+n/2,m=n):(g=a.x+n/2,l=n));l=Math.max(e,l*d);m=Math.max(e,m*d);0<f&&(l=Math.min(l,f),m=Math.min(m,f));d=new mxRectangle(g-l/2,k-m/2,l,m);g=mxUtils.toRadians(mxUtils.getValue(a.style,
-mxConstants.STYLE_ROTATION)||0);0!=g&&(e=Math.cos(-g),f=Math.sin(-g),g=new mxPoint(a.getCenterX(),a.getCenterY()),a=mxUtils.getRotatedPoint(new mxPoint(b,c),e,f,g),b=a.x,c=a.y);return mxUtils.contains(d,b,c)}return!0},getOffset:function(a,b){for(var c=0,d=0,e=!1,f=a,g=document.body,k=document.documentElement;null!=f&&f!=g&&f!=k&&!e;){var l=mxUtils.getCurrentStyle(f);null!=l&&(e=e||"fixed"==l.position);f=f.parentNode}b||e||(e=mxUtils.getDocumentScrollOrigin(a.ownerDocument),c+=e.x,d+=e.y);e=a.getBoundingClientRect();
-null!=e&&(c+=e.left,d+=e.top);return new mxPoint(c,d)},getDocumentScrollOrigin:function(a){if(mxClient.IS_QUIRKS)return new mxPoint(a.body.scrollLeft,a.body.scrollTop);a=a.defaultView||a.parentWindow;return new mxPoint(null!=a&&void 0!==window.pageXOffset?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft,null!=a&&void 0!==window.pageYOffset?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop)},getScrollOrigin:function(a,
-b,c){b=null!=b?b:!1;c=null!=c?c:!0;for(var d=null!=a?a.ownerDocument:document,e=d.body,f=d.documentElement,g=new mxPoint,k=!1;null!=a&&a!=e&&a!=f;){isNaN(a.scrollLeft)||isNaN(a.scrollTop)||(g.x+=a.scrollLeft,g.y+=a.scrollTop);var l=mxUtils.getCurrentStyle(a);null!=l&&(k=k||"fixed"==l.position);a=b?a.parentNode:null}!k&&c&&(a=mxUtils.getDocumentScrollOrigin(d),g.x+=a.x,g.y+=a.y);return g},convertPoint:function(a,b,c){var d=mxUtils.getScrollOrigin(a,!1);a=mxUtils.getOffset(a);a.x-=d.x;a.y-=d.y;return new mxPoint(b-
-a.x,c-a.y)},ltrim:function(a,b){return null!=a?a.replace(new RegExp("^["+(b||"\\s")+"]+","g"),""):null},rtrim:function(a,b){return null!=a?a.replace(new RegExp("["+(b||"\\s")+"]+$","g"),""):null},trim:function(a,b){return mxUtils.ltrim(mxUtils.rtrim(a,b),b)},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)&&("string"!=typeof a||0>a.toLowerCase().indexOf("0x"))},isInteger:function(a){return String(parseInt(a))===String(a)},mod:function(a,b){return(a%b+b)%b},intersection:function(a,b,
-c,d,e,f,g,k){var l=(k-f)*(c-a)-(g-e)*(d-b);g=((g-e)*(b-f)-(k-f)*(a-e))/l;e=((c-a)*(b-f)-(d-b)*(a-e))/l;return 0<=g&&1>=g&&0<=e&&1>=e?new mxPoint(a+g*(c-a),b+g*(d-b)):null},ptSegDistSq:function(a,b,c,d,e,f){c-=a;d-=b;e-=a;f-=b;0>=e*c+f*d?c=0:(e=c-e,f=d-f,a=e*c+f*d,c=0>=a?0:a*a/(c*c+d*d));e=e*e+f*f-c;0>e&&(e=0);return e},ptLineDist:function(a,b,c,d,e,f){return Math.abs((d-b)*e-(c-a)*f+c*b-d*a)/Math.sqrt((d-b)*(d-b)+(c-a)*(c-a))},relativeCcw:function(a,b,c,d,e,f){c-=a;d-=b;e-=a;f-=b;a=e*d-f*c;0==a&&
-(a=e*c+f*d,0<a&&(a=(e-c)*c+(f-d)*d,0>a&&(a=0)));return 0>a?-1:0<a?1:0},animateChanges:function(a,b){mxEffects.animateChanges.apply(this,arguments)},cascadeOpacity:function(a,b,c){mxEffects.cascadeOpacity.apply(this,arguments)},fadeOut:function(a,b,c,d,e,f){mxEffects.fadeOut.apply(this,arguments)},setOpacity:function(a,b){mxUtils.isVml(a)?a.style.filter=100<=b?"":"alpha(opacity="+b/5+")":mxClient.IS_IE&&("undefined"===typeof document.documentMode||9>document.documentMode)?a.style.filter=100<=b?"":
-"alpha(opacity="+b+")":a.style.opacity=b/100},createImage:function(a){var b;mxClient.IS_IE6&&"CSS1Compat"!=document.compatMode?(b=document.createElement(mxClient.VML_PREFIX+":image"),b.setAttribute("src",a),b.style.borderStyle="none"):(b=document.createElement("img"),b.setAttribute("src",a),b.setAttribute("border","0"));return b},sortCells:function(a,b){b=null!=b?b:!0;var c=new mxDictionary;a.sort(function(a,e){var d=c.get(a);null==d&&(d=mxCellPath.create(a).split(mxCellPath.PATH_SEPARATOR),c.put(a,
-d));var g=c.get(e);null==g&&(g=mxCellPath.create(e).split(mxCellPath.PATH_SEPARATOR),c.put(e,g));d=mxCellPath.compare(d,g);return 0==d?0:0<d==b?1:-1});return a},getStylename:function(a){return null!=a&&(a=a.split(";")[0],0>a.indexOf("="))?a:""},getStylenames:function(a){var b=[];if(null!=a){a=a.split(";");for(var c=0;c<a.length;c++)0>a[c].indexOf("=")&&b.push(a[c])}return b},indexOfStylename:function(a,b){if(null!=a&&null!=b)for(var c=a.split(";"),d=0,e=0;e<c.length;e++){if(c[e]==b)return d;d+=c[e].length+
-1}return-1},addStylename:function(a,b){0>mxUtils.indexOfStylename(a,b)&&(null==a?a="":0<a.length&&";"!=a.charAt(a.length-1)&&(a+=";"),a+=b);return a},removeStylename:function(a,b){var c=[];if(null!=a)for(var d=a.split(";"),e=0;e<d.length;e++)d[e]!=b&&c.push(d[e]);return c.join(";")},removeAllStylenames:function(a){var b=[];if(null!=a){a=a.split(";");for(var c=0;c<a.length;c++)0<=a[c].indexOf("=")&&b.push(a[c])}return b.join(";")},setCellStyles:function(a,b,c,d){if(null!=b&&0<b.length){a.beginUpdate();
-try{for(var e=0;e<b.length;e++)if(null!=b[e]){var f=mxUtils.setStyle(a.getStyle(b[e]),c,d);a.setStyle(b[e],f)}}finally{a.endUpdate()}}},setStyle:function(a,b,c){var d=null!=c&&("undefined"==typeof c.length||0<c.length);if(null==a||0==a.length)d&&(a=b+"="+c+";");else if(a.substring(0,b.length+1)==b+"="){var e=a.indexOf(";");a=d?b+"="+c+(0>e?";":a.substring(e)):0>e||e==a.length-1?"":a.substring(e+1)}else{var f=a.indexOf(";"+b+"=");0>f?d&&(d=";"==a.charAt(a.length-1)?"":";",a=a+d+b+"="+c+";"):(e=a.indexOf(";",
-f+1),a=d?a.substring(0,f+1)+b+"="+c+(0>e?";":a.substring(e)):a.substring(0,f)+(0>e?";":a.substring(e)))}return a},setCellStyleFlags:function(a,b,c,d,e){if(null!=b&&0<b.length){a.beginUpdate();try{for(var f=0;f<b.length;f++)if(null!=b[f]){var g=mxUtils.setStyleFlag(a.getStyle(b[f]),c,d,e);a.setStyle(b[f],g)}}finally{a.endUpdate()}}},setStyleFlag:function(a,b,c,d){if(null==a||0==a.length)a=d||null==d?b+"="+c:b+"=0";else{var e=a.indexOf(b+"=");if(0>e)e=";"==a.charAt(a.length-1)?"":";",a=d||null==d?a+
-e+b+"="+c:a+e+b+"=0";else{var f=a.indexOf(";",e),g;g=0>f?a.substring(e+b.length+1):a.substring(e+b.length+1,f);g=null==d?parseInt(g)^c:d?parseInt(g)|c:parseInt(g)&~c;a=a.substring(0,e)+b+"="+g+(0<=f?a.substring(f):"")}}return a},getAlignmentAsPoint:function(a,b){var c=-.5,d=-.5;a==mxConstants.ALIGN_LEFT?c=0:a==mxConstants.ALIGN_RIGHT&&(c=-1);b==mxConstants.ALIGN_TOP?d=0:b==mxConstants.ALIGN_BOTTOM&&(d=-1);return new mxPoint(c,d)},getSizeForString:function(a,b,c,d,e){b=null!=b?b:mxConstants.DEFAULT_FONTSIZE;
-c=null!=c?c:mxConstants.DEFAULT_FONTFAMILY;var f=document.createElement("div");f.style.fontFamily=c;f.style.fontSize=Math.round(b)+"px";f.style.lineHeight=Math.round(b*mxConstants.LINE_HEIGHT)+"px";null!=e&&((e&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(f.style.fontWeight="bold"),(e&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC&&(f.style.fontStyle="italic"),b=[],(e&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&b.push("underline"),(e&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&
-b.push("line-through"),0<b.length&&(f.style.textDecoration=b.join(" ")));f.style.position="absolute";f.style.visibility="hidden";f.style.display=mxClient.IS_QUIRKS?"inline":"inline-block";f.style.zoom="1";null!=d?(f.style.width=d+"px",f.style.whiteSpace="normal"):f.style.whiteSpace="nowrap";f.innerHTML=a;document.body.appendChild(f);a=new mxRectangle(0,0,f.offsetWidth,f.offsetHeight);document.body.removeChild(f);return a},getViewXml:function(a,b,c,d,e){d=null!=d?d:0;e=null!=e?e:0;b=null!=b?b:1;null==
-c&&(c=[a.getModel().getRoot()]);var f=a.getView(),g=null,k=f.isEventsEnabled();f.setEventsEnabled(!1);var l=f.drawPane,m=f.overlayPane;a.dialect==mxConstants.DIALECT_SVG?(f.drawPane=document.createElementNS(mxConstants.NS_SVG,"g"),f.canvas.appendChild(f.drawPane),f.overlayPane=document.createElementNS(mxConstants.NS_SVG,"g")):(f.drawPane=f.drawPane.cloneNode(!1),f.canvas.appendChild(f.drawPane),f.overlayPane=f.overlayPane.cloneNode(!1));f.canvas.appendChild(f.overlayPane);var n=f.getTranslate();f.translate=
-new mxPoint(d,e);b=new mxTemporaryCellStates(a.getView(),b,c);try{g=(new mxCodec).encode(a.getView())}finally{b.destroy(),f.translate=n,f.canvas.removeChild(f.drawPane),f.canvas.removeChild(f.overlayPane),f.drawPane=l,f.overlayPane=m,f.setEventsEnabled(k)}return g},getScaleForPageCount:function(a,b,c,d){if(1>a)return 1;c=null!=c?c:mxConstants.PAGE_FORMAT_A4_PORTRAIT;d=null!=d?d:0;var e=c.width-2*d;c=c.height-2*d;d=b.getGraphBounds().clone();b=b.getView().getScale();d.width/=b;d.height/=b;b=d.width;
-var f=Math.sqrt(a);d=Math.sqrt(b/d.height/(e/c));c=f*d;d=f/d;if(1>c&&d>a){var g=d/a;d=a;c/=g}1>d&&c>a&&(g=c/a,c=a,d/=g);g=Math.ceil(c)*Math.ceil(d);for(f=0;g>a;){var g=Math.floor(c)/c,k=Math.floor(d)/d;1==g&&(g=Math.floor(c-1)/c);1==k&&(k=Math.floor(d-1)/d);g=g>k?g:k;c*=g;d*=g;g=Math.ceil(c)*Math.ceil(d);f++;if(10<f)break}return e*c/b*.99999},show:function(a,b,c,d,e,f){c=null!=c?c:0;d=null!=d?d:0;null==b?b=window.open().document:b.open();9==document.documentMode&&b.writeln('\x3c!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=9"><![endif]--\x3e');
-var g=a.getGraphBounds(),k=Math.ceil(c-g.x),l=Math.ceil(d-g.y);null==e&&(e=Math.ceil(g.width+c)+Math.ceil(Math.ceil(g.x)-g.x));null==f&&(f=Math.ceil(g.height+d)+Math.ceil(Math.ceil(g.y)-g.y));if(mxClient.IS_IE||11==document.documentMode){d="<html><head>";g=document.getElementsByTagName("base");for(c=0;c<g.length;c++)d+=g[c].outerHTML;d+="<style>";for(c=0;c<document.styleSheets.length;c++)try{d+=document.styleSheets[c].cssText}catch(m){}d=d+'</style></head><body style="margin:0px;">'+('<div style="position:absolute;overflow:hidden;width:'+
-e+"px;height:"+f+'px;"><div style="position:relative;left:'+k+"px;top:"+l+'px;">')+a.container.innerHTML;b.writeln(d+"</div></div></body><html>");b.close()}else{b.writeln("<html><head>");g=document.getElementsByTagName("base");for(c=0;c<g.length;c++)b.writeln(mxUtils.getOuterHtml(g[c]));d=document.getElementsByTagName("link");for(c=0;c<d.length;c++)b.writeln(mxUtils.getOuterHtml(d[c]));d=document.getElementsByTagName("style");for(c=0;c<d.length;c++)b.writeln(mxUtils.getOuterHtml(d[c]));b.writeln('</head><body style="margin:0px;"></body></html>');
-b.close();c=b.createElement("div");c.position="absolute";c.overflow="hidden";c.style.width=e+"px";c.style.height=f+"px";e=b.createElement("div");e.style.position="absolute";e.style.left=k+"px";e.style.top=l+"px";f=a.container.firstChild;for(d=null;null!=f;)g=f.cloneNode(!0),f==a.view.drawPane.ownerSVGElement?(c.appendChild(g),d=g):e.appendChild(g),f=f.nextSibling;b.body.appendChild(c);null!=e.firstChild&&b.body.appendChild(e);null!=d&&(d.style.minWidth="",d.style.minHeight="",d.firstChild.setAttribute("transform",
-"translate("+k+","+l+")"))}mxUtils.removeCursors(b.body);return b},printScreen:function(a){var b=window.open();a.getGraphBounds();mxUtils.show(a,b.document);a=function(){b.focus();b.print();b.close()};mxClient.IS_GC?b.setTimeout(a,500):a()},popup:function(a,b){if(b){var c=document.createElement("div");c.style.overflow="scroll";c.style.width="636px";c.style.height="460px";var d=document.createElement("pre");d.innerHTML=mxUtils.htmlEntities(a,!1).replace(/\n/g,"<br>").replace(/ /g,"&nbsp;");c.appendChild(d);
-c=new mxWindow("Popup Window",c,document.body.clientWidth/2-320,Math.max(document.body.clientHeight||0,document.documentElement.clientHeight)/2-240,640,480,!1,!0);c.setClosable(!0);c.setVisible(!0)}else mxClient.IS_NS?(c=window.open(),c.document.writeln("<pre>"+mxUtils.htmlEntities(a)+"</pre"),c.document.close()):(c=window.open(),d=c.document.createElement("pre"),d.innerHTML=mxUtils.htmlEntities(a,!1).replace(/\n/g,"<br>").replace(/ /g,"&nbsp;"),c.document.body.appendChild(d))},alert:function(a){alert(a)},
-prompt:function(a,b){return prompt(a,null!=b?b:"")},confirm:function(a){return confirm(a)},error:function(a,b,c,d){var e=document.createElement("div");e.style.padding="20px";var f=document.createElement("img");f.setAttribute("src",d||mxUtils.errorImage);f.setAttribute("valign","bottom");f.style.verticalAlign="middle";e.appendChild(f);e.appendChild(document.createTextNode(" "));e.appendChild(document.createTextNode(" "));e.appendChild(document.createTextNode(" "));mxUtils.write(e,a);a=document.body.clientWidth;
-d=document.body.clientHeight||document.documentElement.clientHeight;var g=new mxWindow(mxResources.get(mxUtils.errorResource)||mxUtils.errorResource,e,(a-b)/2,d/4,b,null,!1,!0);c&&(mxUtils.br(e),b=document.createElement("p"),c=document.createElement("button"),mxClient.IS_IE?c.style.cssText="float:right":c.setAttribute("style","float:right"),mxEvent.addListener(c,"click",function(a){g.destroy()}),mxUtils.write(c,mxResources.get(mxUtils.closeResource)||mxUtils.closeResource),b.appendChild(c),e.appendChild(b),
-mxUtils.br(e),g.setClosable(!0));g.setVisible(!0);return g},makeDraggable:function(a,b,c,d,e,f,g,k,l,m){a=new mxDragSource(a,c);a.dragOffset=new mxPoint(null!=e?e:0,null!=f?f:mxConstants.TOOLTIP_VERTICAL_OFFSET);a.autoscroll=g;a.setGuidesEnabled(!1);null!=l&&(a.highlightDropTargets=l);null!=m&&(a.getDropTarget=m);a.getGraphForEvent=function(a){return"function"==typeof b?b(a):b};null!=d&&(a.createDragElement=function(){return d.cloneNode(!0)},k&&(a.createPreviewElement=function(a){var b=d.cloneNode(!0),
-c=parseInt(b.style.width),e=parseInt(b.style.height);b.style.width=Math.round(c*a.view.scale)+"px";b.style.height=Math.round(e*a.view.scale)+"px";return b}));return a}},mxConstants={DEFAULT_HOTSPOT:.3,MIN_HOTSPOT_SIZE:8,MAX_HOTSPOT_SIZE:0,RENDERING_HINT_EXACT:"exact",RENDERING_HINT_FASTER:"faster",RENDERING_HINT_FASTEST:"fastest",DIALECT_SVG:"svg",DIALECT_VML:"vml",DIALECT_MIXEDHTML:"mixedHtml",DIALECT_PREFERHTML:"preferHtml",DIALECT_STRICTHTML:"strictHtml",NS_SVG:"http://www.w3.org/2000/svg",NS_XHTML:"http://www.w3.org/1999/xhtml",
-NS_XLINK:"http://www.w3.org/1999/xlink",SHADOWCOLOR:"gray",VML_SHADOWCOLOR:"gray",SHADOW_OFFSET_X:2,SHADOW_OFFSET_Y:3,SHADOW_OPACITY:1,NODETYPE_ELEMENT:1,NODETYPE_ATTRIBUTE:2,NODETYPE_TEXT:3,NODETYPE_CDATA:4,NODETYPE_ENTITY_REFERENCE:5,NODETYPE_ENTITY:6,NODETYPE_PROCESSING_INSTRUCTION:7,NODETYPE_COMMENT:8,NODETYPE_DOCUMENT:9,NODETYPE_DOCUMENTTYPE:10,NODETYPE_DOCUMENT_FRAGMENT:11,NODETYPE_NOTATION:12,TOOLTIP_VERTICAL_OFFSET:16,DEFAULT_VALID_COLOR:"#00FF00",DEFAULT_INVALID_COLOR:"#FF0000",OUTLINE_HIGHLIGHT_COLOR:"#00FF00",
-OUTLINE_HIGHLIGHT_STROKEWIDTH:5,HIGHLIGHT_STROKEWIDTH:3,HIGHLIGHT_SIZE:2,HIGHLIGHT_OPACITY:100,CURSOR_MOVABLE_VERTEX:"move",CURSOR_MOVABLE_EDGE:"move",CURSOR_LABEL_HANDLE:"default",CURSOR_TERMINAL_HANDLE:"pointer",CURSOR_BEND_HANDLE:"crosshair",CURSOR_VIRTUAL_BEND_HANDLE:"crosshair",CURSOR_CONNECT:"pointer",HIGHLIGHT_COLOR:"#00FF00",CONNECT_TARGET_COLOR:"#0000FF",INVALID_CONNECT_TARGET_COLOR:"#FF0000",DROP_TARGET_COLOR:"#0000FF",VALID_COLOR:"#00FF00",INVALID_COLOR:"#FF0000",EDGE_SELECTION_COLOR:"#00FF00",
-VERTEX_SELECTION_COLOR:"#00FF00",VERTEX_SELECTION_STROKEWIDTH:1,EDGE_SELECTION_STROKEWIDTH:1,VERTEX_SELECTION_DASHED:!0,EDGE_SELECTION_DASHED:!0,GUIDE_COLOR:"#FF0000",GUIDE_STROKEWIDTH:1,OUTLINE_COLOR:"#0099FF",OUTLINE_STROKEWIDTH:mxClient.IS_IE?2:3,HANDLE_SIZE:6,LABEL_HANDLE_SIZE:4,HANDLE_FILLCOLOR:"#00FF00",HANDLE_STROKECOLOR:"black",LABEL_HANDLE_FILLCOLOR:"yellow",CONNECT_HANDLE_FILLCOLOR:"#0000FF",LOCKED_HANDLE_FILLCOLOR:"#FF0000",OUTLINE_HANDLE_FILLCOLOR:"#00FFFF",OUTLINE_HANDLE_STROKECOLOR:"#0033FF",
-DEFAULT_FONTFAMILY:"Arial,Helvetica",DEFAULT_FONTSIZE:11,DEFAULT_TEXT_DIRECTION:"",LINE_HEIGHT:1.2,WORD_WRAP:"normal",ABSOLUTE_LINE_HEIGHT:!1,DEFAULT_FONTSTYLE:0,DEFAULT_STARTSIZE:40,DEFAULT_MARKERSIZE:6,DEFAULT_IMAGESIZE:24,ENTITY_SEGMENT:30,RECTANGLE_ROUNDING_FACTOR:.15,LINE_ARCSIZE:20,ARROW_SPACING:0,ARROW_WIDTH:30,ARROW_SIZE:30,PAGE_FORMAT_A4_PORTRAIT:new mxRectangle(0,0,827,1169),PAGE_FORMAT_A4_LANDSCAPE:new mxRectangle(0,0,1169,827),PAGE_FORMAT_LETTER_PORTRAIT:new mxRectangle(0,0,850,1100),
-PAGE_FORMAT_LETTER_LANDSCAPE:new mxRectangle(0,0,1100,850),NONE:"none",STYLE_PERIMETER:"perimeter",STYLE_SOURCE_PORT:"sourcePort",STYLE_TARGET_PORT:"targetPort",STYLE_PORT_CONSTRAINT:"portConstraint",STYLE_PORT_CONSTRAINT_ROTATION:"portConstraintRotation",STYLE_SOURCE_PORT_CONSTRAINT:"sourcePortConstraint",STYLE_TARGET_PORT_CONSTRAINT:"targetPortConstraint",STYLE_OPACITY:"opacity",STYLE_FILL_OPACITY:"fillOpacity",STYLE_STROKE_OPACITY:"strokeOpacity",STYLE_TEXT_OPACITY:"textOpacity",STYLE_TEXT_DIRECTION:"textDirection",
-STYLE_OVERFLOW:"overflow",STYLE_ORTHOGONAL:"orthogonal",STYLE_EXIT_X:"exitX",STYLE_EXIT_Y:"exitY",STYLE_EXIT_DX:"exitDx",STYLE_EXIT_DY:"exitDy",STYLE_EXIT_PERIMETER:"exitPerimeter",STYLE_ENTRY_X:"entryX",STYLE_ENTRY_Y:"entryY",STYLE_ENTRY_DX:"entryDx",STYLE_ENTRY_DY:"entryDy",STYLE_ENTRY_PERIMETER:"entryPerimeter",STYLE_WHITE_SPACE:"whiteSpace",STYLE_ROTATION:"rotation",STYLE_FILLCOLOR:"fillColor",STYLE_POINTER_EVENTS:"pointerEvents",STYLE_SWIMLANE_FILLCOLOR:"swimlaneFillColor",STYLE_MARGIN:"margin",
-STYLE_GRADIENTCOLOR:"gradientColor",STYLE_GRADIENT_DIRECTION:"gradientDirection",STYLE_STROKECOLOR:"strokeColor",STYLE_SEPARATORCOLOR:"separatorColor",STYLE_STROKEWIDTH:"strokeWidth",STYLE_ALIGN:"align",STYLE_VERTICAL_ALIGN:"verticalAlign",STYLE_LABEL_WIDTH:"labelWidth",STYLE_LABEL_POSITION:"labelPosition",STYLE_VERTICAL_LABEL_POSITION:"verticalLabelPosition",STYLE_IMAGE_ASPECT:"imageAspect",STYLE_IMAGE_ALIGN:"imageAlign",STYLE_IMAGE_VERTICAL_ALIGN:"imageVerticalAlign",STYLE_GLASS:"glass",STYLE_IMAGE:"image",
-STYLE_IMAGE_WIDTH:"imageWidth",STYLE_IMAGE_HEIGHT:"imageHeight",STYLE_IMAGE_BACKGROUND:"imageBackground",STYLE_IMAGE_BORDER:"imageBorder",STYLE_FLIPH:"flipH",STYLE_FLIPV:"flipV",STYLE_NOLABEL:"noLabel",STYLE_NOEDGESTYLE:"noEdgeStyle",STYLE_LABEL_BACKGROUNDCOLOR:"labelBackgroundColor",STYLE_LABEL_BORDERCOLOR:"labelBorderColor",STYLE_LABEL_PADDING:"labelPadding",STYLE_INDICATOR_SHAPE:"indicatorShape",STYLE_INDICATOR_IMAGE:"indicatorImage",STYLE_INDICATOR_COLOR:"indicatorColor",STYLE_INDICATOR_STROKECOLOR:"indicatorStrokeColor",
-STYLE_INDICATOR_GRADIENTCOLOR:"indicatorGradientColor",STYLE_INDICATOR_SPACING:"indicatorSpacing",STYLE_INDICATOR_WIDTH:"indicatorWidth",STYLE_INDICATOR_HEIGHT:"indicatorHeight",STYLE_INDICATOR_DIRECTION:"indicatorDirection",STYLE_SHADOW:"shadow",STYLE_SEGMENT:"segment",STYLE_ENDARROW:"endArrow",STYLE_STARTARROW:"startArrow",STYLE_ENDSIZE:"endSize",STYLE_STARTSIZE:"startSize",STYLE_SWIMLANE_LINE:"swimlaneLine",STYLE_ENDFILL:"endFill",STYLE_STARTFILL:"startFill",STYLE_DASHED:"dashed",STYLE_DASH_PATTERN:"dashPattern",
-STYLE_FIX_DASH:"fixDash",STYLE_ROUNDED:"rounded",STYLE_CURVED:"curved",STYLE_ARCSIZE:"arcSize",STYLE_ABSOLUTE_ARCSIZE:"absoluteArcSize",STYLE_SOURCE_PERIMETER_SPACING:"sourcePerimeterSpacing",STYLE_TARGET_PERIMETER_SPACING:"targetPerimeterSpacing",STYLE_PERIMETER_SPACING:"perimeterSpacing",STYLE_SPACING:"spacing",STYLE_SPACING_TOP:"spacingTop",STYLE_SPACING_LEFT:"spacingLeft",STYLE_SPACING_BOTTOM:"spacingBottom",STYLE_SPACING_RIGHT:"spacingRight",STYLE_HORIZONTAL:"horizontal",STYLE_DIRECTION:"direction",
-STYLE_ANCHOR_POINT_DIRECTION:"anchorPointDirection",STYLE_ELBOW:"elbow",STYLE_FONTCOLOR:"fontColor",STYLE_FONTFAMILY:"fontFamily",STYLE_FONTSIZE:"fontSize",STYLE_FONTSTYLE:"fontStyle",STYLE_ASPECT:"aspect",STYLE_AUTOSIZE:"autosize",STYLE_FOLDABLE:"foldable",STYLE_EDITABLE:"editable",STYLE_BACKGROUND_OUTLINE:"backgroundOutline",STYLE_BENDABLE:"bendable",STYLE_MOVABLE:"movable",STYLE_RESIZABLE:"resizable",STYLE_RESIZE_WIDTH:"resizeWidth",STYLE_RESIZE_HEIGHT:"resizeHeight",STYLE_ROTATABLE:"rotatable",
-STYLE_CLONEABLE:"cloneable",STYLE_DELETABLE:"deletable",STYLE_SHAPE:"shape",STYLE_EDGE:"edgeStyle",STYLE_JETTY_SIZE:"jettySize",STYLE_SOURCE_JETTY_SIZE:"sourceJettySize",STYLE_TARGET_JETTY_SIZE:"targetJettySize",STYLE_LOOP:"loopStyle",STYLE_ORTHOGONAL_LOOP:"orthogonalLoop",STYLE_ROUTING_CENTER_X:"routingCenterX",STYLE_ROUTING_CENTER_Y:"routingCenterY",FONT_BOLD:1,FONT_ITALIC:2,FONT_UNDERLINE:4,FONT_STRIKETHROUGH:8,SHAPE_RECTANGLE:"rectangle",SHAPE_ELLIPSE:"ellipse",SHAPE_DOUBLE_ELLIPSE:"doubleEllipse",
-SHAPE_RHOMBUS:"rhombus",SHAPE_LINE:"line",SHAPE_IMAGE:"image",SHAPE_ARROW:"arrow",SHAPE_ARROW_CONNECTOR:"arrowConnector",SHAPE_LABEL:"label",SHAPE_CYLINDER:"cylinder",SHAPE_SWIMLANE:"swimlane",SHAPE_CONNECTOR:"connector",SHAPE_ACTOR:"actor",SHAPE_CLOUD:"cloud",SHAPE_TRIANGLE:"triangle",SHAPE_HEXAGON:"hexagon",ARROW_CLASSIC:"classic",ARROW_CLASSIC_THIN:"classicThin",ARROW_BLOCK:"block",ARROW_BLOCK_THIN:"blockThin",ARROW_OPEN:"open",ARROW_OPEN_THIN:"openThin",ARROW_OVAL:"oval",ARROW_DIAMOND:"diamond",
-ARROW_DIAMOND_THIN:"diamondThin",ALIGN_LEFT:"left",ALIGN_CENTER:"center",ALIGN_RIGHT:"right",ALIGN_TOP:"top",ALIGN_MIDDLE:"middle",ALIGN_BOTTOM:"bottom",DIRECTION_NORTH:"north",DIRECTION_SOUTH:"south",DIRECTION_EAST:"east",DIRECTION_WEST:"west",TEXT_DIRECTION_DEFAULT:"",TEXT_DIRECTION_AUTO:"auto",TEXT_DIRECTION_LTR:"ltr",TEXT_DIRECTION_RTL:"rtl",DIRECTION_MASK_NONE:0,DIRECTION_MASK_WEST:1,DIRECTION_MASK_NORTH:2,DIRECTION_MASK_SOUTH:4,DIRECTION_MASK_EAST:8,DIRECTION_MASK_ALL:15,ELBOW_VERTICAL:"vertical",
-ELBOW_HORIZONTAL:"horizontal",EDGESTYLE_ELBOW:"elbowEdgeStyle",EDGESTYLE_ENTITY_RELATION:"entityRelationEdgeStyle",EDGESTYLE_LOOP:"loopEdgeStyle",EDGESTYLE_SIDETOSIDE:"sideToSideEdgeStyle",EDGESTYLE_TOPTOBOTTOM:"topToBottomEdgeStyle",EDGESTYLE_ORTHOGONAL:"orthogonalEdgeStyle",EDGESTYLE_SEGMENT:"segmentEdgeStyle",PERIMETER_ELLIPSE:"ellipsePerimeter",PERIMETER_RECTANGLE:"rectanglePerimeter",PERIMETER_RHOMBUS:"rhombusPerimeter",PERIMETER_HEXAGON:"hexagonPerimeter",PERIMETER_TRIANGLE:"trianglePerimeter"};
-function mxEventObject(a){this.name=a;this.properties=[];for(var b=1;b<arguments.length;b+=2)null!=arguments[b+1]&&(this.properties[arguments[b]]=arguments[b+1])}mxEventObject.prototype.name=null;mxEventObject.prototype.properties=null;mxEventObject.prototype.consumed=!1;mxEventObject.prototype.getName=function(){return this.name};mxEventObject.prototype.getProperties=function(){return this.properties};mxEventObject.prototype.getProperty=function(a){return this.properties[a]};
-mxEventObject.prototype.isConsumed=function(){return this.consumed};mxEventObject.prototype.consume=function(){this.consumed=!0};function mxMouseEvent(a,b){this.evt=a;this.sourceState=this.state=b}mxMouseEvent.prototype.consumed=!1;mxMouseEvent.prototype.evt=null;mxMouseEvent.prototype.graphX=null;mxMouseEvent.prototype.graphY=null;mxMouseEvent.prototype.state=null;mxMouseEvent.prototype.sourceState=null;mxMouseEvent.prototype.getEvent=function(){return this.evt};
-mxMouseEvent.prototype.getSource=function(){return mxEvent.getSource(this.evt)};mxMouseEvent.prototype.isSource=function(a){return null!=a?mxUtils.isAncestorNode(a.node,this.getSource()):!1};mxMouseEvent.prototype.getX=function(){return mxEvent.getClientX(this.getEvent())};mxMouseEvent.prototype.getY=function(){return mxEvent.getClientY(this.getEvent())};mxMouseEvent.prototype.getGraphX=function(){return this.graphX};mxMouseEvent.prototype.getGraphY=function(){return this.graphY};
-mxMouseEvent.prototype.getState=function(){return this.state};mxMouseEvent.prototype.getCell=function(){var a=this.getState();return null!=a?a.cell:null};mxMouseEvent.prototype.isPopupTrigger=function(){return mxEvent.isPopupTrigger(this.getEvent())};mxMouseEvent.prototype.isConsumed=function(){return this.consumed};
-mxMouseEvent.prototype.consume=function(a){(a=null!=a?a:null!=this.evt.touches||mxEvent.isMouseEvent(this.evt))&&this.evt.preventDefault&&this.evt.preventDefault();mxClient.IS_IE&&(this.evt.returnValue=!0);this.consumed=!0};function mxEventSource(a){this.setEventSource(a)}mxEventSource.prototype.eventListeners=null;mxEventSource.prototype.eventsEnabled=!0;mxEventSource.prototype.eventSource=null;mxEventSource.prototype.isEventsEnabled=function(){return this.eventsEnabled};
-mxEventSource.prototype.setEventsEnabled=function(a){this.eventsEnabled=a};mxEventSource.prototype.getEventSource=function(){return this.eventSource};mxEventSource.prototype.setEventSource=function(a){this.eventSource=a};mxEventSource.prototype.addListener=function(a,b){null==this.eventListeners&&(this.eventListeners=[]);this.eventListeners.push(a);this.eventListeners.push(b)};
-mxEventSource.prototype.removeListener=function(a){if(null!=this.eventListeners)for(var b=0;b<this.eventListeners.length;)this.eventListeners[b+1]==a?this.eventListeners.splice(b,2):b+=2};
-mxEventSource.prototype.fireEvent=function(a,b){if(null!=this.eventListeners&&this.isEventsEnabled()){null==a&&(a=new mxEventObject);null==b&&(b=this.getEventSource());null==b&&(b=this);for(var c=[b,a],d=0;d<this.eventListeners.length;d+=2){var e=this.eventListeners[d];null!=e&&e!=a.getName()||this.eventListeners[d+1].apply(this,c)}}};
-var mxEvent={addListener:function(){if(window.addEventListener){var a=!1;try{document.addEventListener("test",function(){},Object.defineProperty&&Object.defineProperty({},"passive",{get:function(){a=!0}}))}catch(b){}return function(b,c,d){b.addEventListener(c,d,a?{passive:!1}:!1);null==b.mxListenerList&&(b.mxListenerList=[]);b.mxListenerList.push({name:c,f:d})}}return function(a,c,d){a.attachEvent("on"+c,d);null==a.mxListenerList&&(a.mxListenerList=[]);a.mxListenerList.push({name:c,f:d})}}(),removeListener:function(){var a=
-function(a,c,d){if(null!=a.mxListenerList){c=a.mxListenerList.length;for(var b=0;b<c;b++)if(a.mxListenerList[b].f==d){a.mxListenerList.splice(b,1);break}0==a.mxListenerList.length&&(a.mxListenerList=null)}};return window.removeEventListener?function(b,c,d){b.removeEventListener(c,d,!1);a(b,c,d)}:function(b,c,d){b.detachEvent("on"+c,d);a(b,c,d)}}(),removeAllListeners:function(a){var b=a.mxListenerList;if(null!=b)for(;0<b.length;){var c=b[0];mxEvent.removeListener(a,c.name,c.f)}},addGestureListeners:function(a,
-b,c,d){null!=b&&mxEvent.addListener(a,mxClient.IS_POINTER?"pointerdown":"mousedown",b);null!=c&&mxEvent.addListener(a,mxClient.IS_POINTER?"pointermove":"mousemove",c);null!=d&&mxEvent.addListener(a,mxClient.IS_POINTER?"pointerup":"mouseup",d);!mxClient.IS_POINTER&&mxClient.IS_TOUCH&&(null!=b&&mxEvent.addListener(a,"touchstart",b),null!=c&&mxEvent.addListener(a,"touchmove",c),null!=d&&mxEvent.addListener(a,"touchend",d))},removeGestureListeners:function(a,b,c,d){null!=b&&mxEvent.removeListener(a,mxClient.IS_POINTER?
-"pointerdown":"mousedown",b);null!=c&&mxEvent.removeListener(a,mxClient.IS_POINTER?"pointermove":"mousemove",c);null!=d&&mxEvent.removeListener(a,mxClient.IS_POINTER?"pointerup":"mouseup",d);!mxClient.IS_POINTER&&mxClient.IS_TOUCH&&(null!=b&&mxEvent.removeListener(a,"touchstart",b),null!=c&&mxEvent.removeListener(a,"touchmove",c),null!=d&&mxEvent.removeListener(a,"touchend",d))},redirectMouseEvents:function(a,b,c,d,e,f,g){var k=function(a){return"function"==typeof c?c(a):c};mxEvent.addGestureListeners(a,
-function(a){null!=d?d(a):mxEvent.isConsumed(a)||b.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(a,k(a)))},function(a){null!=e?e(a):mxEvent.isConsumed(a)||b.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(a,k(a)))},function(a){null!=f?f(a):mxEvent.isConsumed(a)||b.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(a,k(a)))});mxEvent.addListener(a,"dblclick",function(a){if(null!=g)g(a);else if(!mxEvent.isConsumed(a)){var c=k(a);b.dblClick(a,null!=c?c.cell:null)}})},release:function(a){try{if(null!=
-a){mxEvent.removeAllListeners(a);var b=a.childNodes;if(null!=b){var c=b.length;for(a=0;a<c;a+=1)mxEvent.release(b[a])}}}catch(d){}},addMouseWheelListener:function(a,b){if(null!=a){b=null!=b?b:window;if(mxClient.IS_SF&&!mxClient.IS_TOUCH){var c=1;mxEvent.addListener(b,"gesturestart",function(a){mxEvent.consume(a);c=1});mxEvent.addListener(b,"gesturechange",function(b){mxEvent.consume(b);var d=c-b.scale;.2<Math.abs(d)&&(a(b,0>d,!0),c=b.scale)});mxEvent.addListener(b,"gestureend",function(a){mxEvent.consume(a)})}else{var d=
-[],e=0,f=0;mxEvent.addGestureListeners(b,mxUtils.bind(this,function(a){mxEvent.isMouseEvent(a)||null==a.pointerId||d.push(a)}),mxUtils.bind(this,function(b){if(!mxEvent.isMouseEvent(b)&&2==d.length){for(var c=0;c<d.length;c++)if(b.pointerId==d[c].pointerId){d[c]=b;break}b=Math.abs(d[0].clientX-d[1].clientX);var c=Math.abs(d[0].clientY-d[1].clientY),g=Math.abs(b-e),m=Math.abs(c-f);if(g>mxEvent.PINCH_THRESHOLD||m>mxEvent.PINCH_THRESHOLD)a(d[0],g>m?b>e:c>f,!0,d[0].clientX+(d[1].clientX-d[0].clientX)/
-2,d[0].clientY+(d[1].clientY-d[0].clientY)/2),e=b,f=c}}),mxUtils.bind(this,function(a){d=[];f=e=0}))}mxEvent.addListener(b,"wheel",function(b){null==b&&(b=window.event);b.ctrlKey&&b.preventDefault();(.5<Math.abs(b.deltaX)||.5<Math.abs(b.deltaY))&&a(b,0==b.deltaY?0<-b.deltaX:0<-b.deltaY)})}},disableContextMenu:function(a){mxEvent.addListener(a,"contextmenu",function(a){a.preventDefault&&a.preventDefault();return!1})},getSource:function(a){return null!=a.srcElement?a.srcElement:a.target},isConsumed:function(a){return null!=
-a.isConsumed&&a.isConsumed},isTouchEvent:function(a){return null!=a.pointerType?"touch"==a.pointerType||a.pointerType===a.MSPOINTER_TYPE_TOUCH:null!=a.mozInputSource?5==a.mozInputSource:0==a.type.indexOf("touch")},isPenEvent:function(a){return null!=a.pointerType?"pen"==a.pointerType||a.pointerType===a.MSPOINTER_TYPE_PEN:null!=a.mozInputSource?2==a.mozInputSource:0==a.type.indexOf("pen")},isMultiTouchEvent:function(a){return null!=a.type&&0==a.type.indexOf("touch")&&null!=a.touches&&1<a.touches.length},
-isMouseEvent:function(a){return null!=a.pointerType?"mouse"==a.pointerType||a.pointerType===a.MSPOINTER_TYPE_MOUSE:null!=a.mozInputSource?1==a.mozInputSource:0==a.type.indexOf("mouse")},isLeftMouseButton:function(a){return"buttons"in a&&("mousedown"==a.type||"mousemove"==a.type)?1==a.buttons:"which"in a?1===a.which:1===a.button},isMiddleMouseButton:function(a){return"which"in a?2===a.which:4===a.button},isRightMouseButton:function(a){return"which"in a?3===a.which:2===a.button},isPopupTrigger:function(a){return mxEvent.isRightMouseButton(a)||
-mxClient.IS_MAC&&mxEvent.isControlDown(a)&&!mxEvent.isShiftDown(a)&&!mxEvent.isMetaDown(a)&&!mxEvent.isAltDown(a)},isShiftDown:function(a){return null!=a?a.shiftKey:!1},isAltDown:function(a){return null!=a?a.altKey:!1},isControlDown:function(a){return null!=a?a.ctrlKey:!1},isMetaDown:function(a){return null!=a?a.metaKey:!1},getMainEvent:function(a){"touchstart"!=a.type&&"touchmove"!=a.type||null==a.touches||null==a.touches[0]?"touchend"==a.type&&null!=a.changedTouches&&null!=a.changedTouches[0]&&
-(a=a.changedTouches[0]):a=a.touches[0];return a},getClientX:function(a){return mxEvent.getMainEvent(a).clientX},getClientY:function(a){return mxEvent.getMainEvent(a).clientY},consume:function(a,b,c){c=null!=c?c:!0;if(null!=b?b:1)a.preventDefault?(c&&a.stopPropagation(),a.preventDefault()):c&&(a.cancelBubble=!0);a.isConsumed=!0;a.preventDefault||(a.returnValue=!1)},LABEL_HANDLE:-1,ROTATION_HANDLE:-2,CUSTOM_HANDLE:-100,VIRTUAL_HANDLE:-1E5,MOUSE_DOWN:"mouseDown",MOUSE_MOVE:"mouseMove",MOUSE_UP:"mouseUp",
-ACTIVATE:"activate",RESIZE_START:"resizeStart",RESIZE:"resize",RESIZE_END:"resizeEnd",MOVE_START:"moveStart",MOVE:"move",MOVE_END:"moveEnd",PAN_START:"panStart",PAN:"pan",PAN_END:"panEnd",MINIMIZE:"minimize",NORMALIZE:"normalize",MAXIMIZE:"maximize",HIDE:"hide",SHOW:"show",CLOSE:"close",DESTROY:"destroy",REFRESH:"refresh",SIZE:"size",SELECT:"select",FIRED:"fired",FIRE_MOUSE_EVENT:"fireMouseEvent",GESTURE:"gesture",TAP_AND_HOLD:"tapAndHold",GET:"get",RECEIVE:"receive",CONNECT:"connect",DISCONNECT:"disconnect",
-SUSPEND:"suspend",RESUME:"resume",MARK:"mark",ROOT:"root",POST:"post",OPEN:"open",SAVE:"save",BEFORE_ADD_VERTEX:"beforeAddVertex",ADD_VERTEX:"addVertex",AFTER_ADD_VERTEX:"afterAddVertex",DONE:"done",EXECUTE:"execute",EXECUTED:"executed",BEGIN_UPDATE:"beginUpdate",START_EDIT:"startEdit",END_UPDATE:"endUpdate",END_EDIT:"endEdit",BEFORE_UNDO:"beforeUndo",UNDO:"undo",REDO:"redo",CHANGE:"change",NOTIFY:"notify",LAYOUT_CELLS:"layoutCells",CLICK:"click",SCALE:"scale",TRANSLATE:"translate",SCALE_AND_TRANSLATE:"scaleAndTranslate",
-UP:"up",DOWN:"down",ADD:"add",REMOVE:"remove",CLEAR:"clear",ADD_CELLS:"addCells",CELLS_ADDED:"cellsAdded",MOVE_CELLS:"moveCells",CELLS_MOVED:"cellsMoved",RESIZE_CELLS:"resizeCells",CELLS_RESIZED:"cellsResized",TOGGLE_CELLS:"toggleCells",CELLS_TOGGLED:"cellsToggled",ORDER_CELLS:"orderCells",CELLS_ORDERED:"cellsOrdered",REMOVE_CELLS:"removeCells",CELLS_REMOVED:"cellsRemoved",GROUP_CELLS:"groupCells",UNGROUP_CELLS:"ungroupCells",REMOVE_CELLS_FROM_PARENT:"removeCellsFromParent",FOLD_CELLS:"foldCells",
-CELLS_FOLDED:"cellsFolded",ALIGN_CELLS:"alignCells",LABEL_CHANGED:"labelChanged",CONNECT_CELL:"connectCell",CELL_CONNECTED:"cellConnected",SPLIT_EDGE:"splitEdge",FLIP_EDGE:"flipEdge",START_EDITING:"startEditing",EDITING_STARTED:"editingStarted",EDITING_STOPPED:"editingStopped",ADD_OVERLAY:"addOverlay",REMOVE_OVERLAY:"removeOverlay",UPDATE_CELL_SIZE:"updateCellSize",ESCAPE:"escape",DOUBLE_CLICK:"doubleClick",START:"start",RESET:"reset",PINCH_THRESHOLD:10};
-function mxXmlRequest(a,b,c,d,e,f){this.url=a;this.params=b;this.method=c||"POST";this.async=null!=d?d:!0;this.username=e;this.password=f}mxXmlRequest.prototype.url=null;mxXmlRequest.prototype.params=null;mxXmlRequest.prototype.method=null;mxXmlRequest.prototype.async=null;mxXmlRequest.prototype.binary=!1;mxXmlRequest.prototype.withCredentials=!1;mxXmlRequest.prototype.username=null;mxXmlRequest.prototype.password=null;mxXmlRequest.prototype.request=null;
-mxXmlRequest.prototype.decodeSimulateValues=!1;mxXmlRequest.prototype.isBinary=function(){return this.binary};mxXmlRequest.prototype.setBinary=function(a){this.binary=a};mxXmlRequest.prototype.getText=function(){return this.request.responseText};mxXmlRequest.prototype.isReady=function(){return 4==this.request.readyState};mxXmlRequest.prototype.getDocumentElement=function(){var a=this.getXml();return null!=a?a.documentElement:null};
-mxXmlRequest.prototype.getXml=function(){var a=this.request.responseXML;if(9<=document.documentMode||null==a||null==a.documentElement)a=mxUtils.parseXml(this.request.responseText);return a};mxXmlRequest.prototype.getStatus=function(){return null!=this.request?this.request.status:null};
-mxXmlRequest.prototype.create=function(){if(window.XMLHttpRequest)return function(){var a=new XMLHttpRequest;this.isBinary()&&a.overrideMimeType&&a.overrideMimeType("text/plain; charset=x-user-defined");return a};if("undefined"!=typeof ActiveXObject)return function(){return new ActiveXObject("Microsoft.XMLHTTP")}}();
-mxXmlRequest.prototype.send=function(a,b,c,d){this.request=this.create();null!=this.request&&(null!=a&&(this.request.onreadystatechange=mxUtils.bind(this,function(){this.isReady()&&(a(this),this.request.onreadystatechange=null)})),this.request.open(this.method,this.url,this.async,this.username,this.password),this.setRequestHeaders(this.request,this.params),window.XMLHttpRequest&&this.withCredentials&&(this.request.withCredentials="true"),!mxClient.IS_QUIRKS&&(null==document.documentMode||9<document.documentMode)&&
-window.XMLHttpRequest&&null!=c&&null!=d&&(this.request.timeout=c,this.request.ontimeout=d),this.request.send(this.params))};mxXmlRequest.prototype.setRequestHeaders=function(a,b){null!=b&&a.setRequestHeader("Content-Type","application/x-www-form-urlencoded")};
-mxXmlRequest.prototype.simulate=function(a,b){a=a||document;var c=null;a==document&&(c=window.onbeforeunload,window.onbeforeunload=null);var d=a.createElement("form");d.setAttribute("method",this.method);d.setAttribute("action",this.url);null!=b&&d.setAttribute("target",b);d.style.display="none";d.style.visibility="hidden";for(var e=0<this.params.indexOf("&")?this.params.split("&"):this.params.split(),f=0;f<e.length;f++){var g=e[f].indexOf("=");if(0<g){var k=e[f].substring(0,g),g=e[f].substring(g+
-1);this.decodeSimulateValues&&(g=decodeURIComponent(g));var l=a.createElement("textarea");l.setAttribute("wrap","off");l.setAttribute("name",k);mxUtils.write(l,g);d.appendChild(l)}}a.body.appendChild(d);d.submit();null!=d.parentNode&&d.parentNode.removeChild(d);null!=c&&(window.onbeforeunload=c)};
-var mxClipboard={STEPSIZE:10,insertCount:1,cells:null,setCells:function(a){mxClipboard.cells=a},getCells:function(){return mxClipboard.cells},isEmpty:function(){return null==mxClipboard.getCells()},cut:function(a,b){b=mxClipboard.copy(a,b);mxClipboard.insertCount=0;mxClipboard.removeCells(a,b);return b},removeCells:function(a,b){a.removeCells(b)},copy:function(a,b){b=b||a.getSelectionCells();var c=a.getExportableCells(a.model.getTopmostCells(b));mxClipboard.insertCount=1;mxClipboard.setCells(a.cloneCells(c));
-return c},paste:function(a){var b=null;if(!mxClipboard.isEmpty()){var b=a.getImportableCells(mxClipboard.getCells()),c=mxClipboard.insertCount*mxClipboard.STEPSIZE,d=a.getDefaultParent(),b=a.importCells(b,c,c,d);mxClipboard.insertCount++;a.setSelectionCells(b)}return b}};
-function mxWindow(a,b,c,d,e,f,g,k,l,m){null!=b&&(g=null!=g?g:!0,this.content=b,this.init(c,d,e,f,m),this.installMaximizeHandler(),this.installMinimizeHandler(),this.installCloseHandler(),this.setMinimizable(g),this.setTitle(a),(null==k||k)&&this.installMoveHandler(),null!=l&&null!=l.parentNode?l.parentNode.replaceChild(this.div,l):document.body.appendChild(this.div))}mxWindow.prototype=new mxEventSource;mxWindow.prototype.constructor=mxWindow;mxWindow.prototype.closeImage=mxClient.imageBasePath+"/close.gif";
-mxWindow.prototype.minimizeImage=mxClient.imageBasePath+"/minimize.gif";mxWindow.prototype.normalizeImage=mxClient.imageBasePath+"/normalize.gif";mxWindow.prototype.maximizeImage=mxClient.imageBasePath+"/maximize.gif";mxWindow.prototype.resizeImage=mxClient.imageBasePath+"/resize.gif";mxWindow.prototype.visible=!1;mxWindow.prototype.minimumSize=new mxRectangle(0,0,50,40);mxWindow.prototype.destroyOnClose=!0;
-mxWindow.prototype.contentHeightCorrection=8==document.documentMode||7==document.documentMode?6:2;mxWindow.prototype.title=null;mxWindow.prototype.content=null;
-mxWindow.prototype.init=function(a,b,c,d,e){e=null!=e?e:"mxWindow";this.div=document.createElement("div");this.div.className=e;this.div.style.left=a+"px";this.div.style.top=b+"px";this.table=document.createElement("table");this.table.className=e;mxClient.IS_POINTER&&(this.div.style.touchAction="none");null!=c&&(mxClient.IS_QUIRKS||(this.div.style.width=c+"px"),this.table.style.width=c+"px");null!=d&&(mxClient.IS_QUIRKS||(this.div.style.height=d+"px"),this.table.style.height=d+"px");a=document.createElement("tbody");
-b=document.createElement("tr");this.title=document.createElement("td");this.title.className=e+"Title";this.buttons=document.createElement("div");this.buttons.style.position="absolute";this.buttons.style.display="inline-block";this.buttons.style.right="4px";this.buttons.style.top="5px";this.title.appendChild(this.buttons);b.appendChild(this.title);a.appendChild(b);b=document.createElement("tr");this.td=document.createElement("td");this.td.className=e+"Pane";7==document.documentMode&&(this.td.style.height=
-"100%");this.contentWrapper=document.createElement("div");this.contentWrapper.className=e+"Pane";this.contentWrapper.style.width="100%";this.contentWrapper.appendChild(this.content);if(mxClient.IS_QUIRKS||"DIV"!=this.content.nodeName.toUpperCase())this.contentWrapper.style.height="100%";this.td.appendChild(this.contentWrapper);b.appendChild(this.td);a.appendChild(b);this.table.appendChild(a);this.div.appendChild(this.table);e=mxUtils.bind(this,function(a){this.activate()});mxEvent.addGestureListeners(this.title,
-e);mxEvent.addGestureListeners(this.table,e);this.hide()};mxWindow.prototype.setTitle=function(a){for(var b=this.title.firstChild;null!=b;){var c=b.nextSibling;b.nodeType==mxConstants.NODETYPE_TEXT&&b.parentNode.removeChild(b);b=c}mxUtils.write(this.title,a||"");this.title.appendChild(this.buttons)};mxWindow.prototype.setScrollable=function(a){if(null==navigator.userAgent||0>navigator.userAgent.indexOf("Presto/2.5"))this.contentWrapper.style.overflow=a?"auto":"hidden"};
-mxWindow.prototype.activate=function(){if(mxWindow.activeWindow!=this){var a=mxUtils.getCurrentStyle(this.getElement()),a=null!=a?a.zIndex:3;if(mxWindow.activeWindow){var b=mxWindow.activeWindow.getElement();null!=b&&null!=b.style&&(b.style.zIndex=a)}b=mxWindow.activeWindow;this.getElement().style.zIndex=parseInt(a)+1;mxWindow.activeWindow=this;this.fireEvent(new mxEventObject(mxEvent.ACTIVATE,"previousWindow",b))}};mxWindow.prototype.getElement=function(){return this.div};
-mxWindow.prototype.fit=function(){mxUtils.fit(this.div)};mxWindow.prototype.isResizable=function(){return null!=this.resize?"none"!=this.resize.style.display:!1};
-mxWindow.prototype.setResizable=function(a){if(a)if(null==this.resize){this.resize=document.createElement("img");this.resize.style.position="absolute";this.resize.style.bottom="2px";this.resize.style.right="2px";this.resize.setAttribute("src",this.resizeImage);this.resize.style.cursor="nw-resize";var b=null,c=null,d=null,e=null;a=mxUtils.bind(this,function(a){this.activate();b=mxEvent.getClientX(a);c=mxEvent.getClientY(a);d=this.div.offsetWidth;e=this.div.offsetHeight;mxEvent.addGestureListeners(document,
-null,f,g);this.fireEvent(new mxEventObject(mxEvent.RESIZE_START,"event",a));mxEvent.consume(a)});var f=mxUtils.bind(this,function(a){if(null!=b&&null!=c){var f=mxEvent.getClientX(a)-b,g=mxEvent.getClientY(a)-c;this.setSize(d+f,e+g);this.fireEvent(new mxEventObject(mxEvent.RESIZE,"event",a));mxEvent.consume(a)}}),g=mxUtils.bind(this,function(a){null!=b&&null!=c&&(c=b=null,mxEvent.removeGestureListeners(document,null,f,g),this.fireEvent(new mxEventObject(mxEvent.RESIZE_END,"event",a)),mxEvent.consume(a))});
-mxEvent.addGestureListeners(this.resize,a,f,g);this.div.appendChild(this.resize)}else this.resize.style.display="inline";else null!=this.resize&&(this.resize.style.display="none")};
-mxWindow.prototype.setSize=function(a,b){a=Math.max(this.minimumSize.width,a);b=Math.max(this.minimumSize.height,b);mxClient.IS_QUIRKS||(this.div.style.width=a+"px",this.div.style.height=b+"px");this.table.style.width=a+"px";this.table.style.height=b+"px";mxClient.IS_QUIRKS||(this.contentWrapper.style.height=this.div.offsetHeight-this.title.offsetHeight-this.contentHeightCorrection+"px")};mxWindow.prototype.setMinimizable=function(a){this.minimize.style.display=a?"":"none"};
-mxWindow.prototype.getMinimumSize=function(){return new mxRectangle(0,0,0,this.title.offsetHeight)};
-mxWindow.prototype.installMinimizeHandler=function(){this.minimize=document.createElement("img");this.minimize.setAttribute("src",this.minimizeImage);this.minimize.setAttribute("title","Minimize");this.minimize.style.cursor="pointer";this.minimize.style.marginLeft="2px";this.minimize.style.display="none";this.buttons.appendChild(this.minimize);var a=!1,b=null,c=null,d=mxUtils.bind(this,function(d){this.activate();if(a)a=!1,this.minimize.setAttribute("src",this.minimizeImage),this.minimize.setAttribute("title",
-"Minimize"),this.contentWrapper.style.display="",this.maximize.style.display=b,mxClient.IS_QUIRKS||(this.div.style.height=c),this.table.style.height=c,null!=this.resize&&(this.resize.style.visibility=""),this.fireEvent(new mxEventObject(mxEvent.NORMALIZE,"event",d));else{a=!0;this.minimize.setAttribute("src",this.normalizeImage);this.minimize.setAttribute("title","Normalize");this.contentWrapper.style.display="none";b=this.maximize.style.display;this.maximize.style.display="none";c=this.table.style.height;
-var e=this.getMinimumSize();0<e.height&&(mxClient.IS_QUIRKS||(this.div.style.height=e.height+"px"),this.table.style.height=e.height+"px");0<e.width&&(mxClient.IS_QUIRKS||(this.div.style.width=e.width+"px"),this.table.style.width=e.width+"px");null!=this.resize&&(this.resize.style.visibility="hidden");this.fireEvent(new mxEventObject(mxEvent.MINIMIZE,"event",d))}mxEvent.consume(d)});mxEvent.addGestureListeners(this.minimize,d)};
-mxWindow.prototype.setMaximizable=function(a){this.maximize.style.display=a?"":"none"};
-mxWindow.prototype.installMaximizeHandler=function(){this.maximize=document.createElement("img");this.maximize.setAttribute("src",this.maximizeImage);this.maximize.setAttribute("title","Maximize");this.maximize.style.cursor="default";this.maximize.style.marginLeft="2px";this.maximize.style.cursor="pointer";this.maximize.style.display="none";this.buttons.appendChild(this.maximize);var a=!1,b=null,c=null,d=null,e=null,f=null,g=mxUtils.bind(this,function(g){this.activate();if("none"!=this.maximize.style.display){if(a)a=
-!1,this.maximize.setAttribute("src",this.maximizeImage),this.maximize.setAttribute("title","Maximize"),this.contentWrapper.style.display="",this.minimize.style.display=f,this.div.style.left=b+"px",this.div.style.top=c+"px",mxClient.IS_QUIRKS||(this.div.style.height=d,this.div.style.width=e,k=mxUtils.getCurrentStyle(this.contentWrapper),"auto"!=k.overflow&&null==this.resize)||(this.contentWrapper.style.height=this.div.offsetHeight-this.title.offsetHeight-this.contentHeightCorrection+"px"),this.table.style.height=
-d,this.table.style.width=e,null!=this.resize&&(this.resize.style.visibility=""),this.fireEvent(new mxEventObject(mxEvent.NORMALIZE,"event",g));else{a=!0;this.maximize.setAttribute("src",this.normalizeImage);this.maximize.setAttribute("title","Normalize");this.contentWrapper.style.display="";f=this.minimize.style.display;this.minimize.style.display="none";b=parseInt(this.div.style.left);c=parseInt(this.div.style.top);d=this.table.style.height;e=this.table.style.width;this.div.style.left="0px";this.div.style.top=
-"0px";k=Math.max(document.body.clientHeight||0,document.documentElement.clientHeight||0);mxClient.IS_QUIRKS||(this.div.style.width=document.body.clientWidth-2+"px",this.div.style.height=k-2+"px");this.table.style.width=document.body.clientWidth-2+"px";this.table.style.height=k-2+"px";null!=this.resize&&(this.resize.style.visibility="hidden");if(!mxClient.IS_QUIRKS){var k=mxUtils.getCurrentStyle(this.contentWrapper);if("auto"==k.overflow||null!=this.resize)this.contentWrapper.style.height=this.div.offsetHeight-
-this.title.offsetHeight-this.contentHeightCorrection+"px"}this.fireEvent(new mxEventObject(mxEvent.MAXIMIZE,"event",g))}mxEvent.consume(g)}});mxEvent.addGestureListeners(this.maximize,g);mxEvent.addListener(this.title,"dblclick",g)};
-mxWindow.prototype.installMoveHandler=function(){this.title.style.cursor="move";mxEvent.addGestureListeners(this.title,mxUtils.bind(this,function(a){var b=mxEvent.getClientX(a),c=mxEvent.getClientY(a),d=this.getX(),e=this.getY(),f=mxUtils.bind(this,function(a){var f=mxEvent.getClientX(a)-b,g=mxEvent.getClientY(a)-c;this.setLocation(d+f,e+g);this.fireEvent(new mxEventObject(mxEvent.MOVE,"event",a));mxEvent.consume(a)}),g=mxUtils.bind(this,function(a){mxEvent.removeGestureListeners(document,null,f,
-g);this.fireEvent(new mxEventObject(mxEvent.MOVE_END,"event",a));mxEvent.consume(a)});mxEvent.addGestureListeners(document,null,f,g);this.fireEvent(new mxEventObject(mxEvent.MOVE_START,"event",a));mxEvent.consume(a)}));mxClient.IS_POINTER&&(this.title.style.touchAction="none")};mxWindow.prototype.setLocation=function(a,b){this.div.style.left=a+"px";this.div.style.top=b+"px"};mxWindow.prototype.getX=function(){return parseInt(this.div.style.left)};mxWindow.prototype.getY=function(){return parseInt(this.div.style.top)};
-mxWindow.prototype.installCloseHandler=function(){this.closeImg=document.createElement("img");this.closeImg.setAttribute("src",this.closeImage);this.closeImg.setAttribute("title","Close");this.closeImg.style.marginLeft="2px";this.closeImg.style.cursor="pointer";this.closeImg.style.display="none";this.buttons.appendChild(this.closeImg);mxEvent.addGestureListeners(this.closeImg,mxUtils.bind(this,function(a){this.fireEvent(new mxEventObject(mxEvent.CLOSE,"event",a));this.destroyOnClose?this.destroy():
-this.setVisible(!1);mxEvent.consume(a)}))};mxWindow.prototype.setImage=function(a){this.image=document.createElement("img");this.image.setAttribute("src",a);this.image.setAttribute("align","left");this.image.style.marginRight="4px";this.image.style.marginLeft="0px";this.image.style.marginTop="-2px";this.title.insertBefore(this.image,this.title.firstChild)};mxWindow.prototype.setClosable=function(a){this.closeImg.style.display=a?"":"none"};
-mxWindow.prototype.isVisible=function(){return null!=this.div?"none"!=this.div.style.display:!1};mxWindow.prototype.setVisible=function(a){null!=this.div&&this.isVisible()!=a&&(a?this.show():this.hide())};
-mxWindow.prototype.show=function(){this.div.style.display="";this.activate();var a=mxUtils.getCurrentStyle(this.contentWrapper);mxClient.IS_QUIRKS||"auto"!=a.overflow&&null==this.resize||"none"==this.contentWrapper.style.display||(this.contentWrapper.style.height=this.div.offsetHeight-this.title.offsetHeight-this.contentHeightCorrection+"px");this.fireEvent(new mxEventObject(mxEvent.SHOW))};mxWindow.prototype.hide=function(){this.div.style.display="none";this.fireEvent(new mxEventObject(mxEvent.HIDE))};
-mxWindow.prototype.destroy=function(){this.fireEvent(new mxEventObject(mxEvent.DESTROY));null!=this.div&&(mxEvent.release(this.div),this.div.parentNode.removeChild(this.div),this.div=null);this.contentWrapper=this.content=this.title=null};function mxForm(a){this.table=document.createElement("table");this.table.className=a;this.body=document.createElement("tbody");this.table.appendChild(this.body)}mxForm.prototype.table=null;mxForm.prototype.body=!1;mxForm.prototype.getTable=function(){return this.table};
-mxForm.prototype.addButtons=function(a,b){var c=document.createElement("tr"),d=document.createElement("td");c.appendChild(d);var d=document.createElement("td"),e=document.createElement("button");mxUtils.write(e,mxResources.get("ok")||"OK");d.appendChild(e);mxEvent.addListener(e,"click",function(){a()});e=document.createElement("button");mxUtils.write(e,mxResources.get("cancel")||"Cancel");d.appendChild(e);mxEvent.addListener(e,"click",function(){b()});c.appendChild(d);this.body.appendChild(c)};
-mxForm.prototype.addText=function(a,b,c){var d=document.createElement("input");d.setAttribute("type",c||"text");d.value=b;return this.addField(a,d)};mxForm.prototype.addCheckbox=function(a,b){var c=document.createElement("input");c.setAttribute("type","checkbox");this.addField(a,c);b&&(c.checked=!0);return c};mxForm.prototype.addTextarea=function(a,b,c){var d=document.createElement("textarea");mxClient.IS_NS&&c--;d.setAttribute("rows",c||2);d.value=b;return this.addField(a,d)};
-mxForm.prototype.addCombo=function(a,b,c){var d=document.createElement("select");null!=c&&d.setAttribute("size",c);b&&d.setAttribute("multiple","true");return this.addField(a,d)};mxForm.prototype.addOption=function(a,b,c,d){var e=document.createElement("option");mxUtils.writeln(e,b);e.setAttribute("value",c);d&&e.setAttribute("selected",d);a.appendChild(e)};
-mxForm.prototype.addField=function(a,b){var c=document.createElement("tr"),d=document.createElement("td");mxUtils.write(d,a);c.appendChild(d);d=document.createElement("td");d.appendChild(b);c.appendChild(d);this.body.appendChild(c);return b};function mxImage(a,b,c){this.src=a;this.width=b;this.height=c}mxImage.prototype.src=null;mxImage.prototype.width=null;mxImage.prototype.height=null;
-function mxDivResizer(a,b){if("div"==a.nodeName.toLowerCase()){null==b&&(b=window);this.div=a;var c=mxUtils.getCurrentStyle(a);null!=c&&(this.resizeWidth="auto"==c.width,this.resizeHeight="auto"==c.height);mxEvent.addListener(b,"resize",mxUtils.bind(this,function(a){this.handlingResize||(this.handlingResize=!0,this.resize(),this.handlingResize=!1)}));this.resize()}}mxDivResizer.prototype.resizeWidth=!0;mxDivResizer.prototype.resizeHeight=!0;mxDivResizer.prototype.handlingResize=!1;
-mxDivResizer.prototype.resize=function(){var a=this.getDocumentWidth(),b=this.getDocumentHeight(),c=parseInt(this.div.style.left),d=parseInt(this.div.style.right),e=parseInt(this.div.style.top),f=parseInt(this.div.style.bottom);this.resizeWidth&&!isNaN(c)&&!isNaN(d)&&0<=c&&0<=d&&0<a-d-c&&(this.div.style.width=a-d-c+"px");this.resizeHeight&&!isNaN(e)&&!isNaN(f)&&0<=e&&0<=f&&0<b-e-f&&(this.div.style.height=b-e-f+"px")};mxDivResizer.prototype.getDocumentWidth=function(){return document.body.clientWidth};
-mxDivResizer.prototype.getDocumentHeight=function(){return document.body.clientHeight};function mxDragSource(a,b){this.element=a;this.dropHandler=b;mxEvent.addGestureListeners(a,mxUtils.bind(this,function(a){this.mouseDown(a)}));mxEvent.addListener(a,"dragstart",function(a){mxEvent.consume(a)});this.eventConsumer=function(a,b){var c=b.getProperty("eventName"),d=b.getProperty("event");c!=mxEvent.MOUSE_DOWN&&d.consume()}}mxDragSource.prototype.element=null;mxDragSource.prototype.dropHandler=null;
-mxDragSource.prototype.dragOffset=null;mxDragSource.prototype.dragElement=null;mxDragSource.prototype.previewElement=null;mxDragSource.prototype.previewOffset=null;mxDragSource.prototype.enabled=!0;mxDragSource.prototype.currentGraph=null;mxDragSource.prototype.currentDropTarget=null;mxDragSource.prototype.currentPoint=null;mxDragSource.prototype.currentGuide=null;mxDragSource.prototype.currentHighlight=null;mxDragSource.prototype.autoscroll=!0;mxDragSource.prototype.guidesEnabled=!0;
-mxDragSource.prototype.gridEnabled=!0;mxDragSource.prototype.highlightDropTargets=!0;mxDragSource.prototype.dragElementZIndex=100;mxDragSource.prototype.dragElementOpacity=70;mxDragSource.prototype.checkEventSource=!0;mxDragSource.prototype.isEnabled=function(){return this.enabled};mxDragSource.prototype.setEnabled=function(a){this.enabled=a};mxDragSource.prototype.isGuidesEnabled=function(){return this.guidesEnabled};mxDragSource.prototype.setGuidesEnabled=function(a){this.guidesEnabled=a};
-mxDragSource.prototype.isGridEnabled=function(){return this.gridEnabled};mxDragSource.prototype.setGridEnabled=function(a){this.gridEnabled=a};mxDragSource.prototype.getGraphForEvent=function(a){return null};mxDragSource.prototype.getDropTarget=function(a,b,c,d){return a.getCellAt(b,c)};mxDragSource.prototype.createDragElement=function(a){return this.element.cloneNode(!0)};mxDragSource.prototype.createPreviewElement=function(a){return null};
-mxDragSource.prototype.isActive=function(){return null!=this.mouseMoveHandler};mxDragSource.prototype.reset=function(){null!=this.currentGraph&&(this.dragExit(this.currentGraph),this.currentGraph=null);this.removeDragElement();this.removeListeners();this.stopDrag()};
-mxDragSource.prototype.mouseDown=function(a){this.enabled&&!mxEvent.isConsumed(a)&&null==this.mouseMoveHandler&&(this.startDrag(a),this.mouseMoveHandler=mxUtils.bind(this,this.mouseMove),this.mouseUpHandler=mxUtils.bind(this,this.mouseUp),mxEvent.addGestureListeners(document,null,this.mouseMoveHandler,this.mouseUpHandler),mxClient.IS_TOUCH&&!mxEvent.isMouseEvent(a)&&(this.eventSource=mxEvent.getSource(a),mxEvent.addGestureListeners(this.eventSource,null,this.mouseMoveHandler,this.mouseUpHandler)))};
-mxDragSource.prototype.startDrag=function(a){this.dragElement=this.createDragElement(a);this.dragElement.style.position="absolute";this.dragElement.style.zIndex=this.dragElementZIndex;mxUtils.setOpacity(this.dragElement,this.dragElementOpacity);this.checkEventSource&&mxClient.IS_SVG&&(this.dragElement.style.pointerEvents="none")};mxDragSource.prototype.stopDrag=function(){this.removeDragElement()};
-mxDragSource.prototype.removeDragElement=function(){null!=this.dragElement&&(null!=this.dragElement.parentNode&&this.dragElement.parentNode.removeChild(this.dragElement),this.dragElement=null)};mxDragSource.prototype.getElementForEvent=function(a){return mxEvent.isTouchEvent(a)||mxEvent.isPenEvent(a)?document.elementFromPoint(mxEvent.getClientX(a),mxEvent.getClientY(a)):mxEvent.getSource(a)};
-mxDragSource.prototype.graphContainsEvent=function(a,b){var c=mxEvent.getClientX(b),d=mxEvent.getClientY(b),e=mxUtils.getOffset(a.container),f=mxUtils.getScrollOrigin(),g=this.getElementForEvent(b);if(this.checkEventSource)for(;null!=g&&g!=a.container;)g=g.parentNode;return null!=g&&c>=e.x-f.x&&d>=e.y-f.y&&c<=e.x-f.x+a.container.offsetWidth&&d<=e.y-f.y+a.container.offsetHeight};
-mxDragSource.prototype.mouseMove=function(a){var b=this.getGraphForEvent(a);null==b||this.graphContainsEvent(b,a)||(b=null);b!=this.currentGraph&&(null!=this.currentGraph&&this.dragExit(this.currentGraph,a),this.currentGraph=b,null!=this.currentGraph&&this.dragEnter(this.currentGraph,a));null!=this.currentGraph&&this.dragOver(this.currentGraph,a);if(null==this.dragElement||null!=this.previewElement&&"visible"==this.previewElement.style.visibility)null!=this.dragElement&&(this.dragElement.style.visibility=
-"hidden");else{var b=mxEvent.getClientX(a),c=mxEvent.getClientY(a);null==this.dragElement.parentNode&&document.body.appendChild(this.dragElement);this.dragElement.style.visibility="visible";null!=this.dragOffset&&(b+=this.dragOffset.x,c+=this.dragOffset.y);var d=mxUtils.getDocumentScrollOrigin(document);this.dragElement.style.left=b+d.x+"px";this.dragElement.style.top=c+d.y+"px"}mxEvent.consume(a)};
-mxDragSource.prototype.mouseUp=function(a){if(null!=this.currentGraph){if(null!=this.currentPoint&&(null==this.previewElement||"hidden"!=this.previewElement.style.visibility)){var b=this.currentGraph.view.scale,c=this.currentGraph.view.translate;this.drop(this.currentGraph,a,this.currentDropTarget,this.currentPoint.x/b-c.x,this.currentPoint.y/b-c.y)}this.dragExit(this.currentGraph);this.currentGraph=null}this.stopDrag();this.removeListeners();mxEvent.consume(a)};
-mxDragSource.prototype.removeListeners=function(){null!=this.eventSource&&(mxEvent.removeGestureListeners(this.eventSource,null,this.mouseMoveHandler,this.mouseUpHandler),this.eventSource=null);mxEvent.removeGestureListeners(document,null,this.mouseMoveHandler,this.mouseUpHandler);this.mouseUpHandler=this.mouseMoveHandler=null};
-mxDragSource.prototype.dragEnter=function(a,b){a.isMouseDown=!0;a.isMouseTrigger=mxEvent.isMouseEvent(b);this.previewElement=this.createPreviewElement(a);null!=this.previewElement&&this.checkEventSource&&mxClient.IS_SVG&&(this.previewElement.style.pointerEvents="none");this.isGuidesEnabled()&&null!=this.previewElement&&(this.currentGuide=new mxGuide(a,a.graphHandler.getGuideStates()));this.highlightDropTargets&&(this.currentHighlight=new mxCellHighlight(a,mxConstants.DROP_TARGET_COLOR));a.addListener(mxEvent.FIRE_MOUSE_EVENT,
-this.eventConsumer)};mxDragSource.prototype.dragExit=function(a,b){this.currentPoint=this.currentDropTarget=null;a.isMouseDown=!1;a.removeListener(this.eventConsumer);null!=this.previewElement&&(null!=this.previewElement.parentNode&&this.previewElement.parentNode.removeChild(this.previewElement),this.previewElement=null);null!=this.currentGuide&&(this.currentGuide.destroy(),this.currentGuide=null);null!=this.currentHighlight&&(this.currentHighlight.destroy(),this.currentHighlight=null)};
-mxDragSource.prototype.dragOver=function(a,b){var c=mxUtils.getOffset(a.container),d=mxUtils.getScrollOrigin(a.container),e=mxEvent.getClientX(b)-c.x+d.x-a.panDx,c=mxEvent.getClientY(b)-c.y+d.y-a.panDy;a.autoScroll&&(null==this.autoscroll||this.autoscroll)&&a.scrollPointToVisible(e,c,a.autoExtend);null!=this.currentHighlight&&a.isDropEnabled()&&(this.currentDropTarget=this.getDropTarget(a,e,c,b),d=a.getView().getState(this.currentDropTarget),this.currentHighlight.highlight(d));if(null!=this.previewElement){null==
-this.previewElement.parentNode&&(a.container.appendChild(this.previewElement),this.previewElement.style.zIndex="3",this.previewElement.style.position="absolute");var d=this.isGridEnabled()&&a.isGridEnabledEvent(b),f=!0;if(null!=this.currentGuide&&this.currentGuide.isEnabledForEvent(b))var f=parseInt(this.previewElement.style.width),g=parseInt(this.previewElement.style.height),f=new mxRectangle(0,0,f,g),c=new mxPoint(e,c),c=this.currentGuide.move(f,c,d,!0),f=!1,e=c.x,c=c.y;else if(d)var d=a.view.scale,
-g=a.view.translate,k=a.gridSize/2,e=(a.snap(e/d-g.x-k)+g.x)*d,c=(a.snap(c/d-g.y-k)+g.y)*d;null!=this.currentGuide&&f&&this.currentGuide.hide();null!=this.previewOffset&&(e+=this.previewOffset.x,c+=this.previewOffset.y);this.previewElement.style.left=Math.round(e)+"px";this.previewElement.style.top=Math.round(c)+"px";this.previewElement.style.visibility="visible"}this.currentPoint=new mxPoint(e,c)};
-mxDragSource.prototype.drop=function(a,b,c,d,e){this.dropHandler.apply(this,arguments);"hidden"!=a.container.style.visibility&&a.container.focus()};function mxToolbar(a){this.container=a}mxToolbar.prototype=new mxEventSource;mxToolbar.prototype.constructor=mxToolbar;mxToolbar.prototype.container=null;mxToolbar.prototype.enabled=!0;mxToolbar.prototype.noReset=!1;mxToolbar.prototype.updateDefaultMode=!0;
-mxToolbar.prototype.addItem=function(a,b,c,d,e,f){var g=document.createElement(null!=b?"img":"button"),k=e||(null!=f?"mxToolbarMode":"mxToolbarItem");g.className=k;g.setAttribute("src",b);null!=a&&(null!=b?g.setAttribute("title",a):mxUtils.write(g,a));this.container.appendChild(g);null!=c&&(mxEvent.addListener(g,"click",c),mxClient.IS_TOUCH&&mxEvent.addListener(g,"touchend",c));a=mxUtils.bind(this,function(a){null!=d?g.setAttribute("src",b):g.style.backgroundColor=""});mxEvent.addGestureListeners(g,
-mxUtils.bind(this,function(a){null!=d?g.setAttribute("src",d):g.style.backgroundColor="gray";if(null!=f){null==this.menu&&(this.menu=new mxPopupMenu,this.menu.init());var b=this.currentImg;this.menu.isMenuShowing()&&this.menu.hideMenu();b!=g&&(this.currentImg=g,this.menu.factoryMethod=f,b=new mxPoint(g.offsetLeft,g.offsetTop+g.offsetHeight),this.menu.popup(b.x,b.y,null,a),this.menu.isMenuShowing()&&(g.className=k+"Selected",this.menu.hideMenu=function(){mxPopupMenu.prototype.hideMenu.apply(this);
-g.className=k;this.currentImg=null}))}}),null,a);mxEvent.addListener(g,"mouseout",a);return g};mxToolbar.prototype.addCombo=function(a){var b=document.createElement("div");b.style.display="inline";b.className="mxToolbarComboContainer";var c=document.createElement("select");c.className=a||"mxToolbarCombo";b.appendChild(c);this.container.appendChild(b);return c};
-mxToolbar.prototype.addActionCombo=function(a,b){var c=document.createElement("select");c.className=b||"mxToolbarCombo";this.addOption(c,a,null);mxEvent.addListener(c,"change",function(a){var b=c.options[c.selectedIndex];c.selectedIndex=0;null!=b.funct&&b.funct(a)});this.container.appendChild(c);return c};mxToolbar.prototype.addOption=function(a,b,c){var d=document.createElement("option");mxUtils.writeln(d,b);"function"==typeof c?d.funct=c:d.setAttribute("value",c);a.appendChild(d);return d};
-mxToolbar.prototype.addSwitchMode=function(a,b,c,d,e){var f=document.createElement("img");f.initialClassName=e||"mxToolbarMode";f.className=f.initialClassName;f.setAttribute("src",b);f.altIcon=d;null!=a&&f.setAttribute("title",a);mxEvent.addListener(f,"click",mxUtils.bind(this,function(a){a=this.selectedMode.altIcon;null!=a?(this.selectedMode.altIcon=this.selectedMode.getAttribute("src"),this.selectedMode.setAttribute("src",a)):this.selectedMode.className=this.selectedMode.initialClassName;this.updateDefaultMode&&
-(this.defaultMode=f);this.selectedMode=f;a=f.altIcon;null!=a?(f.altIcon=f.getAttribute("src"),f.setAttribute("src",a)):f.className=f.initialClassName+"Selected";this.fireEvent(new mxEventObject(mxEvent.SELECT));c()}));this.container.appendChild(f);null==this.defaultMode&&(this.defaultMode=f,this.selectMode(f),c());return f};
-mxToolbar.prototype.addMode=function(a,b,c,d,e,f){f=null!=f?f:!0;var g=document.createElement(null!=b?"img":"button");g.initialClassName=e||"mxToolbarMode";g.className=g.initialClassName;g.setAttribute("src",b);g.altIcon=d;null!=a&&g.setAttribute("title",a);this.enabled&&f&&(mxEvent.addListener(g,"click",mxUtils.bind(this,function(a){this.selectMode(g,c);this.noReset=!1})),mxEvent.addListener(g,"dblclick",mxUtils.bind(this,function(a){this.selectMode(g,c);this.noReset=!0})),null==this.defaultMode&&
-(this.defaultMode=g,this.defaultFunction=c,this.selectMode(g,c)));this.container.appendChild(g);return g};
-mxToolbar.prototype.selectMode=function(a,b){if(this.selectedMode!=a){if(null!=this.selectedMode){var c=this.selectedMode.altIcon;null!=c?(this.selectedMode.altIcon=this.selectedMode.getAttribute("src"),this.selectedMode.setAttribute("src",c)):this.selectedMode.className=this.selectedMode.initialClassName}this.selectedMode=a;c=this.selectedMode.altIcon;null!=c?(this.selectedMode.altIcon=this.selectedMode.getAttribute("src"),this.selectedMode.setAttribute("src",c)):this.selectedMode.className=this.selectedMode.initialClassName+
-"Selected";this.fireEvent(new mxEventObject(mxEvent.SELECT,"function",b))}};mxToolbar.prototype.resetMode=function(a){!a&&this.noReset||this.selectedMode==this.defaultMode||this.selectMode(this.defaultMode,this.defaultFunction)};mxToolbar.prototype.addSeparator=function(a){return this.addItem(null,a,null)};mxToolbar.prototype.addBreak=function(){mxUtils.br(this.container)};
-mxToolbar.prototype.addLine=function(){var a=document.createElement("hr");a.style.marginRight="6px";a.setAttribute("size","1");this.container.appendChild(a)};mxToolbar.prototype.destroy=function(){mxEvent.release(this.container);this.selectedMode=this.defaultFunction=this.defaultMode=this.container=null;null!=this.menu&&this.menu.destroy()};function mxUndoableEdit(a,b){this.source=a;this.changes=[];this.significant=null!=b?b:!0}mxUndoableEdit.prototype.source=null;
-mxUndoableEdit.prototype.changes=null;mxUndoableEdit.prototype.significant=null;mxUndoableEdit.prototype.undone=!1;mxUndoableEdit.prototype.redone=!1;mxUndoableEdit.prototype.isEmpty=function(){return 0==this.changes.length};mxUndoableEdit.prototype.isSignificant=function(){return this.significant};mxUndoableEdit.prototype.add=function(a){this.changes.push(a)};mxUndoableEdit.prototype.notify=function(){};mxUndoableEdit.prototype.die=function(){};
-mxUndoableEdit.prototype.undo=function(){if(!this.undone){this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));for(var a=this.changes.length-1;0<=a;a--){var b=this.changes[a];null!=b.execute?b.execute():null!=b.undo&&b.undo();this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED,"change",b))}this.undone=!0;this.redone=!1;this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT))}this.notify()};
-mxUndoableEdit.prototype.redo=function(){if(!this.redone){this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));for(var a=this.changes.length,b=0;b<a;b++){var c=this.changes[b];null!=c.execute?c.execute():null!=c.redo&&c.redo();this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED,"change",c))}this.undone=!1;this.redone=!0;this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT))}this.notify()};function mxUndoManager(a){this.size=null!=a?a:100;this.clear()}mxUndoManager.prototype=new mxEventSource;
-mxUndoManager.prototype.constructor=mxUndoManager;mxUndoManager.prototype.size=null;mxUndoManager.prototype.history=null;mxUndoManager.prototype.indexOfNextAdd=0;mxUndoManager.prototype.isEmpty=function(){return 0==this.history.length};mxUndoManager.prototype.clear=function(){this.history=[];this.indexOfNextAdd=0;this.fireEvent(new mxEventObject(mxEvent.CLEAR))};mxUndoManager.prototype.canUndo=function(){return 0<this.indexOfNextAdd};
-mxUndoManager.prototype.undo=function(){for(;0<this.indexOfNextAdd;){var a=this.history[--this.indexOfNextAdd];a.undo();if(a.isSignificant()){this.fireEvent(new mxEventObject(mxEvent.UNDO,"edit",a));break}}};mxUndoManager.prototype.canRedo=function(){return this.indexOfNextAdd<this.history.length};
-mxUndoManager.prototype.redo=function(){for(var a=this.history.length;this.indexOfNextAdd<a;){var b=this.history[this.indexOfNextAdd++];b.redo();if(b.isSignificant()){this.fireEvent(new mxEventObject(mxEvent.REDO,"edit",b));break}}};mxUndoManager.prototype.undoableEditHappened=function(a){this.trim();0<this.size&&this.size==this.history.length&&this.history.shift();this.history.push(a);this.indexOfNextAdd=this.history.length;this.fireEvent(new mxEventObject(mxEvent.ADD,"edit",a))};
-mxUndoManager.prototype.trim=function(){if(this.history.length>this.indexOfNextAdd)for(var a=this.history.splice(this.indexOfNextAdd,this.history.length-this.indexOfNextAdd),b=0;b<a.length;b++)a[b].die()};var mxUrlConverter=function(){};mxUrlConverter.prototype.enabled=!0;mxUrlConverter.prototype.baseUrl=null;mxUrlConverter.prototype.baseDomain=null;
-mxUrlConverter.prototype.updateBaseUrl=function(){this.baseDomain=location.protocol+"//"+location.host;this.baseUrl=this.baseDomain+location.pathname;var a=this.baseUrl.lastIndexOf("/");0<a&&(this.baseUrl=this.baseUrl.substring(0,a+1))};mxUrlConverter.prototype.isEnabled=function(){return this.enabled};mxUrlConverter.prototype.setEnabled=function(a){this.enabled=a};mxUrlConverter.prototype.getBaseUrl=function(){return this.baseUrl};mxUrlConverter.prototype.setBaseUrl=function(a){this.baseUrl=a};
-mxUrlConverter.prototype.getBaseDomain=function(){return this.baseDomain};mxUrlConverter.prototype.setBaseDomain=function(a){this.baseDomain=a};mxUrlConverter.prototype.isRelativeUrl=function(a){return null!=a&&"//"!=a.substring(0,2)&&"http://"!=a.substring(0,7)&&"https://"!=a.substring(0,8)&&"data:image"!=a.substring(0,10)&&"file://"!=a.substring(0,7)};
-mxUrlConverter.prototype.convert=function(a){this.isEnabled()&&this.isRelativeUrl(a)&&(null==this.getBaseUrl()&&this.updateBaseUrl(),a="/"==a.charAt(0)?this.getBaseDomain()+a:this.getBaseUrl()+a);return a};
-function mxPanningManager(a){this.thread=null;this.active=!1;this.dy=this.dx=this.t0y=this.t0x=this.tdy=this.tdx=0;this.scrollbars=!1;this.scrollTop=this.scrollLeft=0;this.mouseListener={mouseDown:function(a,b){},mouseMove:function(a,b){},mouseUp:mxUtils.bind(this,function(a,b){this.active&&this.stop()})};a.addMouseListener(this.mouseListener);this.mouseUpListener=mxUtils.bind(this,function(){this.active&&this.stop()});mxEvent.addListener(document,"mouseup",this.mouseUpListener);var b=mxUtils.bind(this,
-function(){this.scrollbars=mxUtils.hasScrollbars(a.container);this.scrollLeft=a.container.scrollLeft;this.scrollTop=a.container.scrollTop;return window.setInterval(mxUtils.bind(this,function(){this.tdx-=this.dx;this.tdy-=this.dy;this.scrollbars?(a.panGraph(-a.container.scrollLeft-Math.ceil(this.dx),-a.container.scrollTop-Math.ceil(this.dy)),a.panDx=this.scrollLeft-a.container.scrollLeft,a.panDy=this.scrollTop-a.container.scrollTop,a.fireEvent(new mxEventObject(mxEvent.PAN))):a.panGraph(this.getDx(),
-this.getDy())}),this.delay)});this.isActive=function(){return active};this.getDx=function(){return Math.round(this.tdx)};this.getDy=function(){return Math.round(this.tdy)};this.start=function(){this.t0x=a.view.translate.x;this.t0y=a.view.translate.y;this.active=!0};this.panTo=function(c,d,e,f){this.active||this.start();this.scrollLeft=a.container.scrollLeft;this.scrollTop=a.container.scrollTop;var g=a.container;this.dx=c+(null!=e?e:0)-g.scrollLeft-g.clientWidth;this.dx=0>this.dx&&Math.abs(this.dx)<
-this.border?this.border+this.dx:this.handleMouseOut?Math.max(this.dx,0):0;0==this.dx&&(this.dx=c-g.scrollLeft,this.dx=0<this.dx&&this.dx<this.border?this.dx-this.border:this.handleMouseOut?Math.min(0,this.dx):0);this.dy=d+(null!=f?f:0)-g.scrollTop-g.clientHeight;this.dy=0>this.dy&&Math.abs(this.dy)<this.border?this.border+this.dy:this.handleMouseOut?Math.max(this.dy,0):0;0==this.dy&&(this.dy=d-g.scrollTop,this.dy=0<this.dy&&this.dy<this.border?this.dy-this.border:this.handleMouseOut?Math.min(0,this.dy):
-0);0!=this.dx||0!=this.dy?(this.dx*=this.damper,this.dy*=this.damper,null==this.thread&&(this.thread=b())):null!=this.thread&&(window.clearInterval(this.thread),this.thread=null)};this.stop=function(){if(this.active)if(this.active=!1,null!=this.thread&&(window.clearInterval(this.thread),this.thread=null),this.tdy=this.tdx=0,this.scrollbars)a.panDx=0,a.panDy=0,a.fireEvent(new mxEventObject(mxEvent.PAN));else{var b=a.panDx,d=a.panDy;if(0!=b||0!=d)a.panGraph(0,0),a.view.setTranslate(this.t0x+b/a.view.scale,
-this.t0y+d/a.view.scale)}};this.destroy=function(){a.removeMouseListener(this.mouseListener);mxEvent.removeListener(document,"mouseup",this.mouseUpListener)}}mxPanningManager.prototype.damper=1/6;mxPanningManager.prototype.delay=10;mxPanningManager.prototype.handleMouseOut=!0;mxPanningManager.prototype.border=0;function mxPopupMenu(a){this.factoryMethod=a;null!=a&&this.init()}mxPopupMenu.prototype=new mxEventSource;mxPopupMenu.prototype.constructor=mxPopupMenu;
-mxPopupMenu.prototype.submenuImage=mxClient.imageBasePath+"/submenu.gif";mxPopupMenu.prototype.zIndex=10006;mxPopupMenu.prototype.factoryMethod=null;mxPopupMenu.prototype.useLeftButtonForPopup=!1;mxPopupMenu.prototype.enabled=!0;mxPopupMenu.prototype.itemCount=0;mxPopupMenu.prototype.autoExpand=!1;mxPopupMenu.prototype.smartSeparators=!1;mxPopupMenu.prototype.labels=!0;
-mxPopupMenu.prototype.init=function(){this.table=document.createElement("table");this.table.className="mxPopupMenu";this.tbody=document.createElement("tbody");this.table.appendChild(this.tbody);this.div=document.createElement("div");this.div.className="mxPopupMenu";this.div.style.display="inline";this.div.style.zIndex=this.zIndex;this.div.appendChild(this.table);mxEvent.disableContextMenu(this.div)};mxPopupMenu.prototype.isEnabled=function(){return this.enabled};
-mxPopupMenu.prototype.setEnabled=function(a){this.enabled=a};mxPopupMenu.prototype.isPopupTrigger=function(a){return a.isPopupTrigger()||this.useLeftButtonForPopup&&mxEvent.isLeftMouseButton(a.getEvent())};
-mxPopupMenu.prototype.addItem=function(a,b,c,d,e,f,g,k){d=d||this;this.itemCount++;d.willAddSeparator&&(d.containsItems&&this.addSeparator(d,!0),d.willAddSeparator=!1);d.containsItems=!0;var l=document.createElement("tr");l.className="mxPopupMenuItem";var m=document.createElement("td");m.className="mxPopupMenuIcon";null!=b?(e=document.createElement("img"),e.src=b,m.appendChild(e)):null!=e&&(b=document.createElement("div"),b.className=e,m.appendChild(b));l.appendChild(m);this.labels&&(m=document.createElement("td"),
-m.className="mxPopupMenuItem"+(null==f||f?"":" mxDisabled"),mxUtils.write(m,a),m.align="left",l.appendChild(m),a=document.createElement("td"),a.className="mxPopupMenuItem"+(null==f||f?"":" mxDisabled"),a.style.paddingRight="6px",a.style.textAlign="right",l.appendChild(a),null==d.div&&this.createSubmenu(d));d.tbody.appendChild(l);if(0!=g&&0!=f){var n=null;mxEvent.addGestureListeners(l,mxUtils.bind(this,function(a){this.eventReceiver=l;d.activeRow!=l&&d.activeRow!=d&&(null!=d.activeRow&&null!=d.activeRow.div.parentNode&&
-this.hideSubmenu(d),null!=l.div&&(this.showSubmenu(d,l),d.activeRow=l));null==document.selection||!mxClient.IS_QUIRKS&&8!=document.documentMode||(n=document.selection.createRange());mxEvent.consume(a)}),mxUtils.bind(this,function(a){d.activeRow!=l&&d.activeRow!=d&&(null!=d.activeRow&&null!=d.activeRow.div.parentNode&&this.hideSubmenu(d),this.autoExpand&&null!=l.div&&(this.showSubmenu(d,l),d.activeRow=l));k||(l.className="mxPopupMenuItemHover")}),mxUtils.bind(this,function(a){if(this.eventReceiver==
-l){d.activeRow!=l&&this.hideMenu();if(null!=n){try{n.select()}catch(q){}n=null}null!=c&&c(a)}this.eventReceiver=null;mxEvent.consume(a)}));k||mxEvent.addListener(l,"mouseout",mxUtils.bind(this,function(a){l.className="mxPopupMenuItem"}))}return l};mxPopupMenu.prototype.addCheckmark=function(a,b){var c=a.firstChild.nextSibling;c.style.backgroundImage="url('"+b+"')";c.style.backgroundRepeat="no-repeat";c.style.backgroundPosition="2px 50%"};
-mxPopupMenu.prototype.createSubmenu=function(a){a.table=document.createElement("table");a.table.className="mxPopupMenu";a.tbody=document.createElement("tbody");a.table.appendChild(a.tbody);a.div=document.createElement("div");a.div.className="mxPopupMenu";a.div.style.position="absolute";a.div.style.display="inline";a.div.style.zIndex=this.zIndex;a.div.appendChild(a.table);var b=document.createElement("img");b.setAttribute("src",this.submenuImage);td=a.firstChild.nextSibling.nextSibling;td.appendChild(b)};
-mxPopupMenu.prototype.showSubmenu=function(a,b){if(null!=b.div){b.div.style.left=a.div.offsetLeft+b.offsetLeft+b.offsetWidth-1+"px";b.div.style.top=a.div.offsetTop+b.offsetTop+"px";document.body.appendChild(b.div);var c=parseInt(b.div.offsetLeft),d=parseInt(b.div.offsetWidth),e=mxUtils.getDocumentScrollOrigin(document),f=document.documentElement;c+d>e.x+(document.body.clientWidth||f.clientWidth)&&(b.div.style.left=Math.max(0,a.div.offsetLeft-d+(mxClient.IS_IE?6:-6))+"px");mxUtils.fit(b.div)}};
-mxPopupMenu.prototype.addSeparator=function(a,b){a=a||this;if(this.smartSeparators&&!b)a.willAddSeparator=!0;else if(null!=a.tbody){a.willAddSeparator=!1;var c=document.createElement("tr"),d=document.createElement("td");d.className="mxPopupMenuIcon";d.style.padding="0 0 0 0px";c.appendChild(d);d=document.createElement("td");d.style.padding="0 0 0 0px";d.setAttribute("colSpan","2");var e=document.createElement("hr");e.setAttribute("size","1");d.appendChild(e);c.appendChild(d);a.tbody.appendChild(c)}};
-mxPopupMenu.prototype.popup=function(a,b,c,d){if(null!=this.div&&null!=this.tbody&&null!=this.factoryMethod){this.div.style.left=a+"px";for(this.div.style.top=b+"px";null!=this.tbody.firstChild;)mxEvent.release(this.tbody.firstChild),this.tbody.removeChild(this.tbody.firstChild);this.itemCount=0;this.factoryMethod(this,c,d);0<this.itemCount&&(this.showMenu(),this.fireEvent(new mxEventObject(mxEvent.SHOW)))}};
-mxPopupMenu.prototype.isMenuShowing=function(){return null!=this.div&&this.div.parentNode==document.body};mxPopupMenu.prototype.showMenu=function(){9<=document.documentMode&&(this.div.style.filter="none");document.body.appendChild(this.div);mxUtils.fit(this.div)};mxPopupMenu.prototype.hideMenu=function(){null!=this.div&&(null!=this.div.parentNode&&this.div.parentNode.removeChild(this.div),this.hideSubmenu(this),this.containsItems=!1,this.fireEvent(new mxEventObject(mxEvent.HIDE)))};
-mxPopupMenu.prototype.hideSubmenu=function(a){null!=a.activeRow&&(this.hideSubmenu(a.activeRow),null!=a.activeRow.div.parentNode&&a.activeRow.div.parentNode.removeChild(a.activeRow.div),a.activeRow=null)};mxPopupMenu.prototype.destroy=function(){null!=this.div&&(mxEvent.release(this.div),null!=this.div.parentNode&&this.div.parentNode.removeChild(this.div),this.div=null)};
-function mxAutoSaveManager(a){this.changeHandler=mxUtils.bind(this,function(a,c){this.isEnabled()&&this.graphModelChanged(c.getProperty("edit").changes)});this.setGraph(a)}mxAutoSaveManager.prototype=new mxEventSource;mxAutoSaveManager.prototype.constructor=mxAutoSaveManager;mxAutoSaveManager.prototype.graph=null;mxAutoSaveManager.prototype.autoSaveDelay=10;mxAutoSaveManager.prototype.autoSaveThrottle=2;mxAutoSaveManager.prototype.autoSaveThreshold=5;mxAutoSaveManager.prototype.ignoredChanges=0;
-mxAutoSaveManager.prototype.lastSnapshot=0;mxAutoSaveManager.prototype.enabled=!0;mxAutoSaveManager.prototype.changeHandler=null;mxAutoSaveManager.prototype.isEnabled=function(){return this.enabled};mxAutoSaveManager.prototype.setEnabled=function(a){this.enabled=a};mxAutoSaveManager.prototype.setGraph=function(a){null!=this.graph&&this.graph.getModel().removeListener(this.changeHandler);this.graph=a;null!=this.graph&&this.graph.getModel().addListener(mxEvent.CHANGE,this.changeHandler)};
-mxAutoSaveManager.prototype.save=function(){};mxAutoSaveManager.prototype.graphModelChanged=function(a){a=((new Date).getTime()-this.lastSnapshot)/1E3;a>this.autoSaveDelay||this.ignoredChanges>=this.autoSaveThreshold&&a>this.autoSaveThrottle?(this.save(),this.reset()):this.ignoredChanges++};mxAutoSaveManager.prototype.reset=function(){this.lastSnapshot=(new Date).getTime();this.ignoredChanges=0};mxAutoSaveManager.prototype.destroy=function(){this.setGraph(null)};
-function mxAnimation(a){this.delay=null!=a?a:20}mxAnimation.prototype=new mxEventSource;mxAnimation.prototype.constructor=mxAnimation;mxAnimation.prototype.delay=null;mxAnimation.prototype.thread=null;mxAnimation.prototype.isRunning=function(){return null!=this.thread};mxAnimation.prototype.startAnimation=function(){null==this.thread&&(this.thread=window.setInterval(mxUtils.bind(this,this.updateAnimation),this.delay))};mxAnimation.prototype.updateAnimation=function(){this.fireEvent(new mxEventObject(mxEvent.EXECUTE))};
-mxAnimation.prototype.stopAnimation=function(){null!=this.thread&&(window.clearInterval(this.thread),this.thread=null,this.fireEvent(new mxEventObject(mxEvent.DONE)))};function mxMorphing(a,b,c,d){mxAnimation.call(this,d);this.graph=a;this.steps=null!=b?b:6;this.ease=null!=c?c:1.5}mxMorphing.prototype=new mxAnimation;mxMorphing.prototype.constructor=mxMorphing;mxMorphing.prototype.graph=null;mxMorphing.prototype.steps=null;mxMorphing.prototype.step=0;mxMorphing.prototype.ease=null;
-mxMorphing.prototype.cells=null;mxMorphing.prototype.updateAnimation=function(){mxAnimation.prototype.updateAnimation.apply(this,arguments);var a=new mxCellStatePreview(this.graph);if(null!=this.cells)for(var b=0;b<this.cells.length;b++)this.animateCell(this.cells[b],a,!1);else this.animateCell(this.graph.getModel().getRoot(),a,!0);this.show(a);(a.isEmpty()||this.step++>=this.steps)&&this.stopAnimation()};mxMorphing.prototype.show=function(a){a.show()};
-mxMorphing.prototype.animateCell=function(a,b,c){var d=this.graph.getView().getState(a),e=null;if(null!=d&&(e=this.getDelta(d),this.graph.getModel().isVertex(a)&&(0!=e.x||0!=e.y))){var f=this.graph.view.getTranslate(),g=this.graph.view.getScale();e.x+=f.x*g;e.y+=f.y*g;b.moveState(d,-e.x/this.ease,-e.y/this.ease)}if(c&&!this.stopRecursion(d,e))for(d=this.graph.getModel().getChildCount(a),e=0;e<d;e++)this.animateCell(this.graph.getModel().getChildAt(a,e),b,c)};
-mxMorphing.prototype.stopRecursion=function(a,b){return null!=b&&(0!=b.x||0!=b.y)};mxMorphing.prototype.getDelta=function(a){var b=this.getOriginForCell(a.cell),c=this.graph.getView().getTranslate(),d=this.graph.getView().getScale();return new mxPoint((b.x-(a.x/d-c.x))*d,(b.y-(a.y/d-c.y))*d)};
-mxMorphing.prototype.getOriginForCell=function(a){var b=null;if(null!=a){var c=this.graph.getModel().getParent(a);a=this.graph.getCellGeometry(a);b=this.getOriginForCell(c);null!=a&&(a.relative?(c=this.graph.getCellGeometry(c),null!=c&&(b.x+=a.x*c.width,b.y+=a.y*c.height)):(b.x+=a.x,b.y+=a.y))}null==b&&(b=this.graph.view.getTranslate(),b=new mxPoint(-b.x,-b.y));return b};function mxImageBundle(a){this.images=[];this.alt=null!=a?a:!1}mxImageBundle.prototype.images=null;
-mxImageBundle.prototype.alt=null;mxImageBundle.prototype.putImage=function(a,b,c){this.images[a]={value:b,fallback:c}};mxImageBundle.prototype.getImage=function(a){var b=null;null!=a&&(a=this.images[a],null!=a&&(b=this.alt?a.fallback:a.value));return b};function mxImageExport(){}mxImageExport.prototype.includeOverlays=!1;
-mxImageExport.prototype.drawState=function(a,b){null!=a&&(this.visitStatesRecursive(a,b,mxUtils.bind(this,function(){this.drawCellState.apply(this,arguments)})),this.includeOverlays&&this.visitStatesRecursive(a,b,mxUtils.bind(this,function(){this.drawOverlays.apply(this,arguments)})))};
-mxImageExport.prototype.visitStatesRecursive=function(a,b,c){if(null!=a){c(a,b);for(var d=a.view.graph,e=d.model.getChildCount(a.cell),f=0;f<e;f++){var g=d.view.getState(d.model.getChildAt(a.cell,f));this.visitStatesRecursive(g,b,c)}}};mxImageExport.prototype.getLinkForCellState=function(a,b){return null};mxImageExport.prototype.drawCellState=function(a,b){var c=this.getLinkForCellState(a,b);null!=c&&b.setLink(c);this.drawShape(a,b);this.drawText(a,b);null!=c&&b.setLink(null)};
-mxImageExport.prototype.drawShape=function(a,b){a.shape instanceof mxShape&&a.shape.checkBounds()&&(b.save(),a.shape.beforePaint(b),a.shape.paint(b),a.shape.afterPaint(b),b.restore())};mxImageExport.prototype.drawText=function(a,b){null!=a.text&&a.text.checkBounds()&&(b.save(),a.text.beforePaint(b),a.text.paint(b),a.text.afterPaint(b),b.restore())};mxImageExport.prototype.drawOverlays=function(a,b){null!=a.overlays&&a.overlays.visit(function(a,d){d instanceof mxShape&&d.paint(b)})};
-function mxAbstractCanvas2D(){this.converter=this.createUrlConverter();this.reset()}mxAbstractCanvas2D.prototype.state=null;mxAbstractCanvas2D.prototype.states=null;mxAbstractCanvas2D.prototype.path=null;mxAbstractCanvas2D.prototype.rotateHtml=!0;mxAbstractCanvas2D.prototype.lastX=0;mxAbstractCanvas2D.prototype.lastY=0;mxAbstractCanvas2D.prototype.moveOp="M";mxAbstractCanvas2D.prototype.lineOp="L";mxAbstractCanvas2D.prototype.quadOp="Q";mxAbstractCanvas2D.prototype.curveOp="C";
-mxAbstractCanvas2D.prototype.closeOp="Z";mxAbstractCanvas2D.prototype.pointerEvents=!1;mxAbstractCanvas2D.prototype.createUrlConverter=function(){return new mxUrlConverter};mxAbstractCanvas2D.prototype.reset=function(){this.state=this.createState();this.states=[]};
-mxAbstractCanvas2D.prototype.createState=function(){return{dx:0,dy:0,scale:1,alpha:1,fillAlpha:1,strokeAlpha:1,fillColor:null,gradientFillAlpha:1,gradientColor:null,gradientAlpha:1,gradientDirection:null,strokeColor:null,strokeWidth:1,dashed:!1,dashPattern:"3 3",fixDash:!1,lineCap:"flat",lineJoin:"miter",miterLimit:10,fontColor:"#000000",fontBackgroundColor:null,fontBorderColor:null,fontSize:mxConstants.DEFAULT_FONTSIZE,fontFamily:mxConstants.DEFAULT_FONTFAMILY,fontStyle:0,shadow:!1,shadowColor:mxConstants.SHADOWCOLOR,
-shadowAlpha:mxConstants.SHADOW_OPACITY,shadowDx:mxConstants.SHADOW_OFFSET_X,shadowDy:mxConstants.SHADOW_OFFSET_Y,rotation:0,rotationCx:0,rotationCy:0}};mxAbstractCanvas2D.prototype.format=function(a){return Math.round(parseFloat(a))};
-mxAbstractCanvas2D.prototype.addOp=function(){if(null!=this.path&&(this.path.push(arguments[0]),2<arguments.length))for(var a=this.state,b=2;b<arguments.length;b+=2)this.lastX=arguments[b-1],this.lastY=arguments[b],this.path.push(this.format((this.lastX+a.dx)*a.scale)),this.path.push(this.format((this.lastY+a.dy)*a.scale))};mxAbstractCanvas2D.prototype.rotatePoint=function(a,b,c,d,e){c*=Math.PI/180;return mxUtils.getRotatedPoint(new mxPoint(a,b),Math.cos(c),Math.sin(c),new mxPoint(d,e))};
-mxAbstractCanvas2D.prototype.save=function(){this.states.push(this.state);this.state=mxUtils.clone(this.state)};mxAbstractCanvas2D.prototype.restore=function(){0<this.states.length&&(this.state=this.states.pop())};mxAbstractCanvas2D.prototype.setLink=function(a){};mxAbstractCanvas2D.prototype.scale=function(a){this.state.scale*=a;this.state.strokeWidth*=a};mxAbstractCanvas2D.prototype.translate=function(a,b){this.state.dx+=a;this.state.dy+=b};mxAbstractCanvas2D.prototype.rotate=function(a,b,c,d,e){};
-mxAbstractCanvas2D.prototype.setAlpha=function(a){this.state.alpha=a};mxAbstractCanvas2D.prototype.setFillAlpha=function(a){this.state.fillAlpha=a};mxAbstractCanvas2D.prototype.setStrokeAlpha=function(a){this.state.strokeAlpha=a};mxAbstractCanvas2D.prototype.setFillColor=function(a){a==mxConstants.NONE&&(a=null);this.state.fillColor=a;this.state.gradientColor=null};
-mxAbstractCanvas2D.prototype.setGradient=function(a,b,c,d,e,f,g,k,l){c=this.state;c.fillColor=a;c.gradientFillAlpha=null!=k?k:1;c.gradientColor=b;c.gradientAlpha=null!=l?l:1;c.gradientDirection=g};mxAbstractCanvas2D.prototype.setStrokeColor=function(a){a==mxConstants.NONE&&(a=null);this.state.strokeColor=a};mxAbstractCanvas2D.prototype.setStrokeWidth=function(a){this.state.strokeWidth=a};mxAbstractCanvas2D.prototype.setDashed=function(a,b){this.state.dashed=a;this.state.fixDash=b};
-mxAbstractCanvas2D.prototype.setDashPattern=function(a){this.state.dashPattern=a};mxAbstractCanvas2D.prototype.setLineCap=function(a){this.state.lineCap=a};mxAbstractCanvas2D.prototype.setLineJoin=function(a){this.state.lineJoin=a};mxAbstractCanvas2D.prototype.setMiterLimit=function(a){this.state.miterLimit=a};mxAbstractCanvas2D.prototype.setFontColor=function(a){a==mxConstants.NONE&&(a=null);this.state.fontColor=a};
-mxAbstractCanvas2D.prototype.setFontBackgroundColor=function(a){a==mxConstants.NONE&&(a=null);this.state.fontBackgroundColor=a};mxAbstractCanvas2D.prototype.setFontBorderColor=function(a){a==mxConstants.NONE&&(a=null);this.state.fontBorderColor=a};mxAbstractCanvas2D.prototype.setFontSize=function(a){this.state.fontSize=parseFloat(a)};mxAbstractCanvas2D.prototype.setFontFamily=function(a){this.state.fontFamily=a};
-mxAbstractCanvas2D.prototype.setFontStyle=function(a){null==a&&(a=0);this.state.fontStyle=a};mxAbstractCanvas2D.prototype.setShadow=function(a){this.state.shadow=a};mxAbstractCanvas2D.prototype.setShadowColor=function(a){a==mxConstants.NONE&&(a=null);this.state.shadowColor=a};mxAbstractCanvas2D.prototype.setShadowAlpha=function(a){this.state.shadowAlpha=a};mxAbstractCanvas2D.prototype.setShadowOffset=function(a,b){this.state.shadowDx=a;this.state.shadowDy=b};
-mxAbstractCanvas2D.prototype.begin=function(){this.lastY=this.lastX=0;this.path=[]};mxAbstractCanvas2D.prototype.moveTo=function(a,b){this.addOp(this.moveOp,a,b)};mxAbstractCanvas2D.prototype.lineTo=function(a,b){this.addOp(this.lineOp,a,b)};mxAbstractCanvas2D.prototype.quadTo=function(a,b,c,d){this.addOp(this.quadOp,a,b,c,d)};mxAbstractCanvas2D.prototype.curveTo=function(a,b,c,d,e,f){this.addOp(this.curveOp,a,b,c,d,e,f)};
-mxAbstractCanvas2D.prototype.arcTo=function(a,b,c,d,e,f,g){a=mxUtils.arcToCurves(this.lastX,this.lastY,a,b,c,d,e,f,g);if(null!=a)for(b=0;b<a.length;b+=6)this.curveTo(a[b],a[b+1],a[b+2],a[b+3],a[b+4],a[b+5])};mxAbstractCanvas2D.prototype.close=function(a,b,c,d,e,f){this.addOp(this.closeOp)};mxAbstractCanvas2D.prototype.end=function(){};function mxXmlCanvas2D(a){mxAbstractCanvas2D.call(this);this.root=a;this.writeDefaults()}mxUtils.extend(mxXmlCanvas2D,mxAbstractCanvas2D);
-mxXmlCanvas2D.prototype.textEnabled=!0;mxXmlCanvas2D.prototype.compressed=!0;
-mxXmlCanvas2D.prototype.writeDefaults=function(){var a;a=this.createElement("fontfamily");a.setAttribute("family",mxConstants.DEFAULT_FONTFAMILY);this.root.appendChild(a);a=this.createElement("fontsize");a.setAttribute("size",mxConstants.DEFAULT_FONTSIZE);this.root.appendChild(a);a=this.createElement("shadowcolor");a.setAttribute("color",mxConstants.SHADOWCOLOR);this.root.appendChild(a);a=this.createElement("shadowalpha");a.setAttribute("alpha",mxConstants.SHADOW_OPACITY);this.root.appendChild(a);
-a=this.createElement("shadowoffset");a.setAttribute("dx",mxConstants.SHADOW_OFFSET_X);a.setAttribute("dy",mxConstants.SHADOW_OFFSET_Y);this.root.appendChild(a)};mxXmlCanvas2D.prototype.format=function(a){return parseFloat(parseFloat(a).toFixed(2))};mxXmlCanvas2D.prototype.createElement=function(a){return this.root.ownerDocument.createElement(a)};mxXmlCanvas2D.prototype.save=function(){this.compressed&&mxAbstractCanvas2D.prototype.save.apply(this,arguments);this.root.appendChild(this.createElement("save"))};
-mxXmlCanvas2D.prototype.restore=function(){this.compressed&&mxAbstractCanvas2D.prototype.restore.apply(this,arguments);this.root.appendChild(this.createElement("restore"))};mxXmlCanvas2D.prototype.scale=function(a){var b=this.createElement("scale");b.setAttribute("scale",a);this.root.appendChild(b)};mxXmlCanvas2D.prototype.translate=function(a,b){var c=this.createElement("translate");c.setAttribute("dx",this.format(a));c.setAttribute("dy",this.format(b));this.root.appendChild(c)};
-mxXmlCanvas2D.prototype.rotate=function(a,b,c,d,e){var f=this.createElement("rotate");if(0!=a||b||c)f.setAttribute("theta",this.format(a)),f.setAttribute("flipH",b?"1":"0"),f.setAttribute("flipV",c?"1":"0"),f.setAttribute("cx",this.format(d)),f.setAttribute("cy",this.format(e)),this.root.appendChild(f)};
-mxXmlCanvas2D.prototype.setAlpha=function(a){if(this.compressed){if(this.state.alpha==a)return;mxAbstractCanvas2D.prototype.setAlpha.apply(this,arguments)}var b=this.createElement("alpha");b.setAttribute("alpha",this.format(a));this.root.appendChild(b)};mxXmlCanvas2D.prototype.setFillAlpha=function(a){if(this.compressed){if(this.state.fillAlpha==a)return;mxAbstractCanvas2D.prototype.setFillAlpha.apply(this,arguments)}var b=this.createElement("fillalpha");b.setAttribute("alpha",this.format(a));this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setStrokeAlpha=function(a){if(this.compressed){if(this.state.strokeAlpha==a)return;mxAbstractCanvas2D.prototype.setStrokeAlpha.apply(this,arguments)}var b=this.createElement("strokealpha");b.setAttribute("alpha",this.format(a));this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setFillColor=function(a){a==mxConstants.NONE&&(a=null);if(this.compressed){if(this.state.fillColor==a)return;mxAbstractCanvas2D.prototype.setFillColor.apply(this,arguments)}var b=this.createElement("fillcolor");b.setAttribute("color",null!=a?a:mxConstants.NONE);this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setGradient=function(a,b,c,d,e,f,g,k,l){if(null!=a&&null!=b){mxAbstractCanvas2D.prototype.setGradient.apply(this,arguments);var m=this.createElement("gradient");m.setAttribute("c1",a);m.setAttribute("c2",b);m.setAttribute("x",this.format(c));m.setAttribute("y",this.format(d));m.setAttribute("w",this.format(e));m.setAttribute("h",this.format(f));null!=g&&m.setAttribute("direction",g);null!=k&&m.setAttribute("alpha1",k);null!=l&&m.setAttribute("alpha2",l);this.root.appendChild(m)}};
-mxXmlCanvas2D.prototype.setStrokeColor=function(a){a==mxConstants.NONE&&(a=null);if(this.compressed){if(this.state.strokeColor==a)return;mxAbstractCanvas2D.prototype.setStrokeColor.apply(this,arguments)}var b=this.createElement("strokecolor");b.setAttribute("color",null!=a?a:mxConstants.NONE);this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setStrokeWidth=function(a){if(this.compressed){if(this.state.strokeWidth==a)return;mxAbstractCanvas2D.prototype.setStrokeWidth.apply(this,arguments)}var b=this.createElement("strokewidth");b.setAttribute("width",this.format(a));this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setDashed=function(a,b){if(this.compressed){if(this.state.dashed==a)return;mxAbstractCanvas2D.prototype.setDashed.apply(this,arguments)}var c=this.createElement("dashed");c.setAttribute("dashed",a?"1":"0");null!=b&&c.setAttribute("fixDash",b?"1":"0");this.root.appendChild(c)};
-mxXmlCanvas2D.prototype.setDashPattern=function(a){if(this.compressed){if(this.state.dashPattern==a)return;mxAbstractCanvas2D.prototype.setDashPattern.apply(this,arguments)}var b=this.createElement("dashpattern");b.setAttribute("pattern",a);this.root.appendChild(b)};mxXmlCanvas2D.prototype.setLineCap=function(a){if(this.compressed){if(this.state.lineCap==a)return;mxAbstractCanvas2D.prototype.setLineCap.apply(this,arguments)}var b=this.createElement("linecap");b.setAttribute("cap",a);this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setLineJoin=function(a){if(this.compressed){if(this.state.lineJoin==a)return;mxAbstractCanvas2D.prototype.setLineJoin.apply(this,arguments)}var b=this.createElement("linejoin");b.setAttribute("join",a);this.root.appendChild(b)};mxXmlCanvas2D.prototype.setMiterLimit=function(a){if(this.compressed){if(this.state.miterLimit==a)return;mxAbstractCanvas2D.prototype.setMiterLimit.apply(this,arguments)}var b=this.createElement("miterlimit");b.setAttribute("limit",a);this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setFontColor=function(a){if(this.textEnabled){a==mxConstants.NONE&&(a=null);if(this.compressed){if(this.state.fontColor==a)return;mxAbstractCanvas2D.prototype.setFontColor.apply(this,arguments)}var b=this.createElement("fontcolor");b.setAttribute("color",null!=a?a:mxConstants.NONE);this.root.appendChild(b)}};
-mxXmlCanvas2D.prototype.setFontBackgroundColor=function(a){if(this.textEnabled){a==mxConstants.NONE&&(a=null);if(this.compressed){if(this.state.fontBackgroundColor==a)return;mxAbstractCanvas2D.prototype.setFontBackgroundColor.apply(this,arguments)}var b=this.createElement("fontbackgroundcolor");b.setAttribute("color",null!=a?a:mxConstants.NONE);this.root.appendChild(b)}};
-mxXmlCanvas2D.prototype.setFontBorderColor=function(a){if(this.textEnabled){a==mxConstants.NONE&&(a=null);if(this.compressed){if(this.state.fontBorderColor==a)return;mxAbstractCanvas2D.prototype.setFontBorderColor.apply(this,arguments)}var b=this.createElement("fontbordercolor");b.setAttribute("color",null!=a?a:mxConstants.NONE);this.root.appendChild(b)}};
-mxXmlCanvas2D.prototype.setFontSize=function(a){if(this.textEnabled){if(this.compressed){if(this.state.fontSize==a)return;mxAbstractCanvas2D.prototype.setFontSize.apply(this,arguments)}var b=this.createElement("fontsize");b.setAttribute("size",a);this.root.appendChild(b)}};
-mxXmlCanvas2D.prototype.setFontFamily=function(a){if(this.textEnabled){if(this.compressed){if(this.state.fontFamily==a)return;mxAbstractCanvas2D.prototype.setFontFamily.apply(this,arguments)}var b=this.createElement("fontfamily");b.setAttribute("family",a);this.root.appendChild(b)}};
-mxXmlCanvas2D.prototype.setFontStyle=function(a){if(this.textEnabled){null==a&&(a=0);if(this.compressed){if(this.state.fontStyle==a)return;mxAbstractCanvas2D.prototype.setFontStyle.apply(this,arguments)}var b=this.createElement("fontstyle");b.setAttribute("style",a);this.root.appendChild(b)}};
-mxXmlCanvas2D.prototype.setShadow=function(a){if(this.compressed){if(this.state.shadow==a)return;mxAbstractCanvas2D.prototype.setShadow.apply(this,arguments)}var b=this.createElement("shadow");b.setAttribute("enabled",a?"1":"0");this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setShadowColor=function(a){if(this.compressed){a==mxConstants.NONE&&(a=null);if(this.state.shadowColor==a)return;mxAbstractCanvas2D.prototype.setShadowColor.apply(this,arguments)}var b=this.createElement("shadowcolor");b.setAttribute("color",null!=a?a:mxConstants.NONE);this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setShadowAlpha=function(a){if(this.compressed){if(this.state.shadowAlpha==a)return;mxAbstractCanvas2D.prototype.setShadowAlpha.apply(this,arguments)}var b=this.createElement("shadowalpha");b.setAttribute("alpha",a);this.root.appendChild(b)};
-mxXmlCanvas2D.prototype.setShadowOffset=function(a,b){if(this.compressed){if(this.state.shadowDx==a&&this.state.shadowDy==b)return;mxAbstractCanvas2D.prototype.setShadowOffset.apply(this,arguments)}var c=this.createElement("shadowoffset");c.setAttribute("dx",a);c.setAttribute("dy",b);this.root.appendChild(c)};
-mxXmlCanvas2D.prototype.rect=function(a,b,c,d){var e=this.createElement("rect");e.setAttribute("x",this.format(a));e.setAttribute("y",this.format(b));e.setAttribute("w",this.format(c));e.setAttribute("h",this.format(d));this.root.appendChild(e)};
-mxXmlCanvas2D.prototype.roundrect=function(a,b,c,d,e,f){var g=this.createElement("roundrect");g.setAttribute("x",this.format(a));g.setAttribute("y",this.format(b));g.setAttribute("w",this.format(c));g.setAttribute("h",this.format(d));g.setAttribute("dx",this.format(e));g.setAttribute("dy",this.format(f));this.root.appendChild(g)};
-mxXmlCanvas2D.prototype.ellipse=function(a,b,c,d){var e=this.createElement("ellipse");e.setAttribute("x",this.format(a));e.setAttribute("y",this.format(b));e.setAttribute("w",this.format(c));e.setAttribute("h",this.format(d));this.root.appendChild(e)};
-mxXmlCanvas2D.prototype.image=function(a,b,c,d,e,f,g,k){e=this.converter.convert(e);var l=this.createElement("image");l.setAttribute("x",this.format(a));l.setAttribute("y",this.format(b));l.setAttribute("w",this.format(c));l.setAttribute("h",this.format(d));l.setAttribute("src",e);l.setAttribute("aspect",f?"1":"0");l.setAttribute("flipH",g?"1":"0");l.setAttribute("flipV",k?"1":"0");this.root.appendChild(l)};
-mxXmlCanvas2D.prototype.begin=function(){this.root.appendChild(this.createElement("begin"));this.lastY=this.lastX=0};mxXmlCanvas2D.prototype.moveTo=function(a,b){var c=this.createElement("move");c.setAttribute("x",this.format(a));c.setAttribute("y",this.format(b));this.root.appendChild(c);this.lastX=a;this.lastY=b};
-mxXmlCanvas2D.prototype.lineTo=function(a,b){var c=this.createElement("line");c.setAttribute("x",this.format(a));c.setAttribute("y",this.format(b));this.root.appendChild(c);this.lastX=a;this.lastY=b};mxXmlCanvas2D.prototype.quadTo=function(a,b,c,d){var e=this.createElement("quad");e.setAttribute("x1",this.format(a));e.setAttribute("y1",this.format(b));e.setAttribute("x2",this.format(c));e.setAttribute("y2",this.format(d));this.root.appendChild(e);this.lastX=c;this.lastY=d};
-mxXmlCanvas2D.prototype.curveTo=function(a,b,c,d,e,f){var g=this.createElement("curve");g.setAttribute("x1",this.format(a));g.setAttribute("y1",this.format(b));g.setAttribute("x2",this.format(c));g.setAttribute("y2",this.format(d));g.setAttribute("x3",this.format(e));g.setAttribute("y3",this.format(f));this.root.appendChild(g);this.lastX=e;this.lastY=f};mxXmlCanvas2D.prototype.close=function(){this.root.appendChild(this.createElement("close"))};
-mxXmlCanvas2D.prototype.text=function(a,b,c,d,e,f,g,k,l,m,n,p,q){if(this.textEnabled&&null!=e){mxUtils.isNode(e)&&(e=mxUtils.getOuterHtml(e));var r=this.createElement("text");r.setAttribute("x",this.format(a));r.setAttribute("y",this.format(b));r.setAttribute("w",this.format(c));r.setAttribute("h",this.format(d));r.setAttribute("str",e);null!=f&&r.setAttribute("align",f);null!=g&&r.setAttribute("valign",g);r.setAttribute("wrap",k?"1":"0");null==l&&(l="");r.setAttribute("format",l);null!=m&&r.setAttribute("overflow",
-m);null!=n&&r.setAttribute("clip",n?"1":"0");null!=p&&r.setAttribute("rotation",p);null!=q&&r.setAttribute("dir",q);this.root.appendChild(r)}};mxXmlCanvas2D.prototype.stroke=function(){this.root.appendChild(this.createElement("stroke"))};mxXmlCanvas2D.prototype.fill=function(){this.root.appendChild(this.createElement("fill"))};mxXmlCanvas2D.prototype.fillAndStroke=function(){this.root.appendChild(this.createElement("fillstroke"))};
-function mxSvgCanvas2D(a,b){mxAbstractCanvas2D.call(this);this.root=a;this.gradients=[];this.defs=null;this.styleEnabled=null!=b?b:!1;var c=null;if(a.ownerDocument!=document)for(c=a;null!=c&&"svg"!=c.nodeName;)c=c.parentNode;null!=c&&(0<c.getElementsByTagName("defs").length&&(this.defs=c.getElementsByTagName("defs")[0]),null==this.defs&&(this.defs=this.createElement("defs"),null!=c.firstChild?c.insertBefore(this.defs,c.firstChild):c.appendChild(this.defs)),this.styleEnabled&&this.defs.appendChild(this.createStyle()))}
-mxUtils.extend(mxSvgCanvas2D,mxAbstractCanvas2D);
-(function(){mxSvgCanvas2D.prototype.useDomParser=!mxClient.IS_IE&&"function"===typeof DOMParser&&"function"===typeof XMLSerializer;if(mxSvgCanvas2D.prototype.useDomParser)try{var a=(new DOMParser).parseFromString("test text","text/html");mxSvgCanvas2D.prototype.useDomParser=null!=a}catch(b){mxSvgCanvas2D.prototype.useDomParser=!1}mxSvgCanvas2D.prototype.useAbsoluteIds=!mxClient.IS_CHROMEAPP&&!mxClient.IS_IE&&!mxClient.IS_IE11&&!mxClient.IS_EDGE&&0<document.getElementsByTagName("base").length})();
-mxSvgCanvas2D.prototype.node=null;mxSvgCanvas2D.prototype.matchHtmlAlignment=!0;mxSvgCanvas2D.prototype.textEnabled=!0;mxSvgCanvas2D.prototype.foEnabled=!0;mxSvgCanvas2D.prototype.foAltText="[Object]";mxSvgCanvas2D.prototype.foOffset=0;mxSvgCanvas2D.prototype.textOffset=0;mxSvgCanvas2D.prototype.imageOffset=0;mxSvgCanvas2D.prototype.strokeTolerance=0;mxSvgCanvas2D.prototype.minStrokeWidth=1;mxSvgCanvas2D.prototype.refCount=0;mxSvgCanvas2D.prototype.lineHeightCorrection=1;
-mxSvgCanvas2D.prototype.pointerEventsValue="all";mxSvgCanvas2D.prototype.fontMetricsPadding=10;mxSvgCanvas2D.prototype.cacheOffsetSize=!0;mxSvgCanvas2D.prototype.format=function(a){return parseFloat(parseFloat(a).toFixed(2))};mxSvgCanvas2D.prototype.getBaseUrl=function(){var a=window.location.href,b=a.lastIndexOf("#");0<b&&(a=a.substring(0,b));return a};mxSvgCanvas2D.prototype.reset=function(){mxAbstractCanvas2D.prototype.reset.apply(this,arguments);this.gradients=[]};
-mxSvgCanvas2D.prototype.createStyle=function(a){a=this.createElement("style");a.setAttribute("type","text/css");mxUtils.write(a,"svg{font-family:"+mxConstants.DEFAULT_FONTFAMILY+";font-size:"+mxConstants.DEFAULT_FONTSIZE+";fill:none;stroke-miterlimit:10}");return a};
-mxSvgCanvas2D.prototype.createElement=function(a,b){if(null!=this.root.ownerDocument.createElementNS)return this.root.ownerDocument.createElementNS(b||mxConstants.NS_SVG,a);var c=this.root.ownerDocument.createElement(a);null!=b&&c.setAttribute("xmlns",b);return c};mxSvgCanvas2D.prototype.getAlternateText=function(a,b,c,d,e,f,g,k,l,m,n,p,q){return null!=f?this.foAltText:null};
-mxSvgCanvas2D.prototype.createAlternateContent=function(a,b,c,d,e,f,g,k,l,m,n,p,q){a=this.getAlternateText(a,b,c,d,e,f,g,k,l,m,n,p,q);d=this.state;return null!=a&&0<d.fontSize?(k=k==mxConstants.ALIGN_TOP?1:k==mxConstants.ALIGN_BOTTOM?0:.3,e=g==mxConstants.ALIGN_RIGHT?"end":g==mxConstants.ALIGN_LEFT?"start":"middle",g=this.createElement("text"),g.setAttribute("x",Math.round(b+d.dx)),g.setAttribute("y",Math.round(c+d.dy+k*d.fontSize)),g.setAttribute("fill",d.fontColor||"black"),g.setAttribute("font-family",
-d.fontFamily),g.setAttribute("font-size",Math.round(d.fontSize)+"px"),"start"!=e&&g.setAttribute("text-anchor",e),(d.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&g.setAttribute("font-weight","bold"),(d.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC&&g.setAttribute("font-style","italic"),b=[],(d.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&b.push("underline"),(d.fontStyle&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&b.push("line-through"),
-0<b.length&&g.setAttribute("text-decoration",b.join(" ")),mxUtils.write(g,a),g):null};mxSvgCanvas2D.prototype.createGradientId=function(a,b,c,d,e){"#"==a.charAt(0)&&(a=a.substring(1));"#"==b.charAt(0)&&(b=b.substring(1));a=a.toLowerCase()+"-"+c;b=b.toLowerCase()+"-"+d;c=null;null==e||e==mxConstants.DIRECTION_SOUTH?c="s":e==mxConstants.DIRECTION_EAST?c="e":(d=a,a=b,b=d,e==mxConstants.DIRECTION_NORTH?c="s":e==mxConstants.DIRECTION_WEST&&(c="e"));return"mx-gradient-"+a+"-"+b+"-"+c};
-mxSvgCanvas2D.prototype.getSvgGradient=function(a,b,c,d,e){var f=this.createGradientId(a,b,c,d,e),g=this.gradients[f];if(null==g){var k=this.root.ownerSVGElement,l=0,m=f+"-"+l;if(null!=k)for(g=k.ownerDocument.getElementById(m);null!=g&&g.ownerSVGElement!=k;)m=f+"-"+l++,g=k.ownerDocument.getElementById(m);else m="id"+ ++this.refCount;null==g&&(g=this.createSvgGradient(a,b,c,d,e),g.setAttribute("id",m),null!=this.defs?this.defs.appendChild(g):k.appendChild(g));this.gradients[f]=g}return g.getAttribute("id")};
-mxSvgCanvas2D.prototype.createSvgGradient=function(a,b,c,d,e){var f=this.createElement("linearGradient");f.setAttribute("x1","0%");f.setAttribute("y1","0%");f.setAttribute("x2","0%");f.setAttribute("y2","0%");null==e||e==mxConstants.DIRECTION_SOUTH?f.setAttribute("y2","100%"):e==mxConstants.DIRECTION_EAST?f.setAttribute("x2","100%"):e==mxConstants.DIRECTION_NORTH?f.setAttribute("y1","100%"):e==mxConstants.DIRECTION_WEST&&f.setAttribute("x1","100%");c=1>c?";stop-opacity:"+c:"";e=this.createElement("stop");
-e.setAttribute("offset","0%");e.setAttribute("style","stop-color:"+a+c);f.appendChild(e);c=1>d?";stop-opacity:"+d:"";e=this.createElement("stop");e.setAttribute("offset","100%");e.setAttribute("style","stop-color:"+b+c);f.appendChild(e);return f};
-mxSvgCanvas2D.prototype.addNode=function(a,b){var c=this.node,d=this.state;if(null!=c){if("path"==c.nodeName)if(null!=this.path&&0<this.path.length)c.setAttribute("d",this.path.join(" "));else return;a&&null!=d.fillColor?this.updateFill():this.styleEnabled||("ellipse"==c.nodeName&&mxClient.IS_FF?c.setAttribute("fill","transparent"):c.setAttribute("fill","none"),a=!1);b&&null!=d.strokeColor?this.updateStroke():this.styleEnabled||c.setAttribute("stroke","none");null!=d.transform&&0<d.transform.length&&
-c.setAttribute("transform",d.transform);d.shadow&&this.root.appendChild(this.createShadow(c));0<this.strokeTolerance&&!a&&this.root.appendChild(this.createTolerance(c));this.pointerEvents?c.setAttribute("pointer-events",this.pointerEventsValue):this.pointerEvents||null!=this.originalRoot||c.setAttribute("pointer-events","none");("rect"!=c.nodeName&&"path"!=c.nodeName&&"ellipse"!=c.nodeName||"none"!=c.getAttribute("fill")&&"transparent"!=c.getAttribute("fill")||"none"!=c.getAttribute("stroke")||"none"!=
-c.getAttribute("pointer-events"))&&this.root.appendChild(c);this.node=null}};
-mxSvgCanvas2D.prototype.updateFill=function(){var a=this.state;(1>a.alpha||1>a.fillAlpha)&&this.node.setAttribute("fill-opacity",a.alpha*a.fillAlpha);if(null!=a.fillColor)if(null!=a.gradientColor)if(a=this.getSvgGradient(String(a.fillColor),String(a.gradientColor),a.gradientFillAlpha,a.gradientAlpha,a.gradientDirection),this.root.ownerDocument==document&&this.useAbsoluteIds){var b=this.getBaseUrl().replace(/([\(\)])/g,"\\$1");this.node.setAttribute("fill","url("+b+"#"+a+")")}else this.node.setAttribute("fill",
-"url(#"+a+")");else this.node.setAttribute("fill",String(a.fillColor).toLowerCase())};mxSvgCanvas2D.prototype.getCurrentStrokeWidth=function(){return Math.max(this.minStrokeWidth,Math.max(.01,this.format(this.state.strokeWidth*this.state.scale)))};
-mxSvgCanvas2D.prototype.updateStroke=function(){var a=this.state;this.node.setAttribute("stroke",String(a.strokeColor).toLowerCase());(1>a.alpha||1>a.strokeAlpha)&&this.node.setAttribute("stroke-opacity",a.alpha*a.strokeAlpha);var b=this.getCurrentStrokeWidth();1!=b&&this.node.setAttribute("stroke-width",b);"path"==this.node.nodeName&&this.updateStrokeAttributes();a.dashed&&this.node.setAttribute("stroke-dasharray",this.createDashPattern((a.fixDash?1:a.strokeWidth)*a.scale))};
-mxSvgCanvas2D.prototype.updateStrokeAttributes=function(){var a=this.state;null!=a.lineJoin&&"miter"!=a.lineJoin&&this.node.setAttribute("stroke-linejoin",a.lineJoin);if(null!=a.lineCap){var b=a.lineCap;"flat"==b&&(b="butt");"butt"!=b&&this.node.setAttribute("stroke-linecap",b)}null==a.miterLimit||this.styleEnabled&&10==a.miterLimit||this.node.setAttribute("stroke-miterlimit",a.miterLimit)};
-mxSvgCanvas2D.prototype.createDashPattern=function(a){var b=[];if("string"===typeof this.state.dashPattern){var c=this.state.dashPattern.split(" ");if(0<c.length)for(var d=0;d<c.length;d++)b[d]=Number(c[d])*a}return b.join(" ")};
-mxSvgCanvas2D.prototype.createTolerance=function(a){a=a.cloneNode(!0);var b=parseFloat(a.getAttribute("stroke-width")||1)+this.strokeTolerance;a.setAttribute("pointer-events","stroke");a.setAttribute("visibility","hidden");a.removeAttribute("stroke-dasharray");a.setAttribute("stroke-width",b);a.setAttribute("fill","none");a.setAttribute("stroke",mxClient.IS_OT?"none":"white");return a};
-mxSvgCanvas2D.prototype.createShadow=function(a){a=a.cloneNode(!0);var b=this.state;"none"==a.getAttribute("fill")||mxClient.IS_FF&&"transparent"==a.getAttribute("fill")||a.setAttribute("fill",b.shadowColor);"none"!=a.getAttribute("stroke")&&a.setAttribute("stroke",b.shadowColor);a.setAttribute("transform","translate("+this.format(b.shadowDx*b.scale)+","+this.format(b.shadowDy*b.scale)+")"+(b.transform||""));a.setAttribute("opacity",b.shadowAlpha);return a};
-mxSvgCanvas2D.prototype.setLink=function(a){if(null==a)this.root=this.originalRoot;else{this.originalRoot=this.root;var b=this.createElement("a");null==b.setAttributeNS||this.root.ownerDocument!=document&&null==document.documentMode?b.setAttribute("xlink:href",a):b.setAttributeNS(mxConstants.NS_XLINK,"xlink:href",a);this.root.appendChild(b);this.root=b}};
-mxSvgCanvas2D.prototype.rotate=function(a,b,c,d,e){if(0!=a||b||c){var f=this.state;d+=f.dx;e+=f.dy;d*=f.scale;e*=f.scale;f.transform=f.transform||"";if(b&&c)a+=180;else if(b!=c){var g=b?d:0,k=b?-1:1,l=c?e:0,m=c?-1:1;f.transform+="translate("+this.format(g)+","+this.format(l)+")scale("+this.format(k)+","+this.format(m)+")translate("+this.format(-g)+","+this.format(-l)+")"}if(b?!c:c)a*=-1;0!=a&&(f.transform+="rotate("+this.format(a)+","+this.format(d)+","+this.format(e)+")");f.rotation+=a;f.rotationCx=
-d;f.rotationCy=e}};mxSvgCanvas2D.prototype.begin=function(){mxAbstractCanvas2D.prototype.begin.apply(this,arguments);this.node=this.createElement("path")};mxSvgCanvas2D.prototype.rect=function(a,b,c,d){var e=this.state,f=this.createElement("rect");f.setAttribute("x",this.format((a+e.dx)*e.scale));f.setAttribute("y",this.format((b+e.dy)*e.scale));f.setAttribute("width",this.format(c*e.scale));f.setAttribute("height",this.format(d*e.scale));this.node=f};
-mxSvgCanvas2D.prototype.roundrect=function(a,b,c,d,e,f){this.rect(a,b,c,d);0<e&&this.node.setAttribute("rx",this.format(e*this.state.scale));0<f&&this.node.setAttribute("ry",this.format(f*this.state.scale))};mxSvgCanvas2D.prototype.ellipse=function(a,b,c,d){var e=this.state,f=this.createElement("ellipse");f.setAttribute("cx",this.format((a+c/2+e.dx)*e.scale));f.setAttribute("cy",this.format((b+d/2+e.dy)*e.scale));f.setAttribute("rx",c/2*e.scale);f.setAttribute("ry",d/2*e.scale);this.node=f};
-mxSvgCanvas2D.prototype.image=function(a,b,c,d,e,f,g,k){e=this.converter.convert(e);f=null!=f?f:!0;g=null!=g?g:!1;k=null!=k?k:!1;var l=this.state;a+=l.dx;b+=l.dy;var m=this.createElement("image");m.setAttribute("x",this.format(a*l.scale)+this.imageOffset);m.setAttribute("y",this.format(b*l.scale)+this.imageOffset);m.setAttribute("width",this.format(c*l.scale));m.setAttribute("height",this.format(d*l.scale));null==m.setAttributeNS?m.setAttribute("xlink:href",e):m.setAttributeNS(mxConstants.NS_XLINK,
-"xlink:href",e);f||m.setAttribute("preserveAspectRatio","none");(1>l.alpha||1>l.fillAlpha)&&m.setAttribute("opacity",l.alpha*l.fillAlpha);e=this.state.transform||"";if(g||k){var n=f=1,p=0,q=0;g&&(f=-1,p=-c-2*a);k&&(n=-1,q=-d-2*b);e+="scale("+f+","+n+")translate("+p*l.scale+","+q*l.scale+")"}0<e.length&&m.setAttribute("transform",e);this.pointerEvents||m.setAttribute("pointer-events","none");this.root.appendChild(m)};
-mxSvgCanvas2D.prototype.convertHtml=function(a){if(this.useDomParser){var b=(new DOMParser).parseFromString(a,"text/html");null!=b&&(a=(new XMLSerializer).serializeToString(b.body),"<body"==a.substring(0,5)&&(a=a.substring(a.indexOf(">",5)+1)),"</body>"==a.substring(a.length-7,a.length)&&(a=a.substring(0,a.length-7)))}else{if(null!=document.implementation&&null!=document.implementation.createDocument){var b=document.implementation.createDocument("http://www.w3.org/1999/xhtml","html",null),c=b.createElement("body");
-b.documentElement.appendChild(c);var d=document.createElement("div");d.innerHTML=a;for(a=d.firstChild;null!=a;)d=a.nextSibling,c.appendChild(b.adoptNode(a)),a=d;return c.innerHTML}b=document.createElement("textarea");b.innerHTML=a.replace(/&amp;/g,"&amp;amp;").replace(/&#60;/g,"&amp;lt;").replace(/&#62;/g,"&amp;gt;").replace(/&lt;/g,"&amp;lt;").replace(/&gt;/g,"&amp;gt;").replace(/</g,"&lt;").replace(/>/g,"&gt;");a=b.value.replace(/&/g,"&amp;").replace(/&amp;lt;/g,"&lt;").replace(/&amp;gt;/g,"&gt;").replace(/&amp;amp;/g,
-"&amp;").replace(/<br>/g,"<br />").replace(/<hr>/g,"<hr />").replace(/(<img[^>]+)>/gm,"$1 />")}return a};
-mxSvgCanvas2D.prototype.createDiv=function(a){mxUtils.isNode(a)||(a="<div><div>"+this.convertHtml(a)+"</div></div>");if(mxClient.IS_IE||mxClient.IS_IE11||!document.createElementNS)return mxUtils.isNode(a)&&(a="<div><div>"+mxUtils.getXml(a)+"</div></div>"),mxUtils.parseXml('<div xmlns="http://www.w3.org/1999/xhtml">'+a+"</div>").documentElement;var b=document.createElementNS("http://www.w3.org/1999/xhtml","div");if(mxUtils.isNode(a)){var c=document.createElement("div"),d=c.cloneNode(!1);this.root.ownerDocument!=
-document?c.appendChild(a.cloneNode(!0)):c.appendChild(a);d.appendChild(c);b.appendChild(d)}else b.innerHTML=a;return b};mxSvgCanvas2D.prototype.updateText=function(a,b,c,d,e,f,g,k,l,m,n){null!=n&&null!=n.firstChild&&null!=n.firstChild.firstChild&&this.updateTextNodes(a,b,c,d,e,f,g,k,l,m,n.firstChild)};
-mxSvgCanvas2D.prototype.addForeignObject=function(a,b,c,d,e,f,g,k,l,m,n,p,q,r,t){q=this.createElement("g");var u=this.createElement("foreignObject");u.setAttribute("style","overflow: visible; text-align: left;");u.setAttribute("pointer-events","none");r.ownerDocument!=document&&(r=mxUtils.importNodeImplementation(u.ownerDocument,r,!0));u.appendChild(r);q.appendChild(u);this.updateTextNodes(a,b,c,d,f,g,k,m,n,p,q);this.root.ownerDocument!=document&&(a=this.createAlternateContent(u,a,b,c,d,e,f,g,k,l,
-m,n,p),null!=a&&(u.setAttribute("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility"),b=this.createElement("switch"),b.appendChild(u),b.appendChild(a),q.appendChild(b)));t.appendChild(q)};
-mxSvgCanvas2D.prototype.updateTextNodes=function(a,b,c,d,e,f,g,k,l,m,n){var p=this.state.scale;mxSvgCanvas2D.createCss(c+2,d,e,f,g,k,l,null!=this.state.fontBackgroundColor?this.state.fontBackgroundColor:null,null!=this.state.fontBorderColor?this.state.fontBorderColor:null,"display: flex; align-items: unsafe "+(f==mxConstants.ALIGN_TOP?"flex-start":f==mxConstants.ALIGN_BOTTOM?"flex-end":"center")+"; justify-content: unsafe "+(e==mxConstants.ALIGN_LEFT?"flex-start":e==mxConstants.ALIGN_RIGHT?"flex-end":
-"center")+"; ",this.getTextCss(),p,mxUtils.bind(this,function(c,d,e,f,g){a+=this.state.dx;b+=this.state.dy;var k=n.firstChild,l=k.firstChild,q=l.firstChild,r=(this.rotateHtml?this.state.rotation:0)+(null!=m?m:0),t=(0!=this.foOffset?"translate("+this.foOffset+" "+this.foOffset+")":"")+(1!=p?"scale("+p+")":"");q.firstChild.setAttribute("style",g);q.setAttribute("style",f);k.setAttribute("width",Math.ceil(1/Math.min(1,p)*100)+"%");k.setAttribute("height",Math.ceil(1/Math.min(1,p)*100)+"%");d=Math.round(b+
-d);0>d?k.setAttribute("y",d):(k.removeAttribute("y"),e+="padding-top: "+d+"px; ");l.setAttribute("style",e+"margin-left: "+Math.round(a+c)+"px;");t+=0!=r?"rotate("+r+" "+a+" "+b+")":"";""!=t?n.setAttribute("transform",t):n.removeAttribute("transform");1!=this.state.alpha?n.setAttribute("opacity",this.state.alpha):n.removeAttribute("opacity")}))};
-mxSvgCanvas2D.createCss=function(a,b,c,d,e,f,g,k,l,m,n,p,q){p="box-sizing: border-box; font-size: 0; text-align: "+(c==mxConstants.ALIGN_LEFT?"left":c==mxConstants.ALIGN_RIGHT?"right":"center")+"; ";var r=mxUtils.getAlignmentAsPoint(c,d);c="overflow: hidden; ";var t="width: 1px; ",u="height: 1px; ",x=r.x*a,r=r.y*b;g?(t="width: "+Math.round(a)+"px; ",p+="max-height: "+Math.round(b)+"px; ",r=0):"fill"==f?(t="width: "+Math.round(a)+"px; ",u="height: "+Math.round(b)+"px; ",n+="width: 100%; height: 100%; ",
-p+="width: "+Math.round(a-2)+"px; "+u):"width"==f?(t="width: "+Math.round(a-2)+"px; ",n+="width: 100%; ",p+=t,r=0,0<b&&(p+="max-height: "+Math.round(b)+"px; ")):"block"==f?(t="width: "+Math.round(a-2)+"px; ",n+="width: 100%; ",c="",r=0,p+=t,"middle"==d&&(p+="max-height: "+Math.round(b)+"px; ")):(c="",r=0);b="";null!=k&&(b+="background-color: "+k+"; ");null!=l&&(b+="border: 1px solid "+l+"; ");""==c||g?n+=b:p+=b;e&&0<a?(n+="white-space: normal; word-wrap: "+mxConstants.WORD_WRAP+"; ",t="width: "+Math.round(a)+
-"px; ",""!=c&&"fill"!=f&&(r=0)):(n+="white-space: nowrap; ",""==c&&"block"!=f&&(x=0));q(x,r,m+t+u,p+c,n,c)};
-mxSvgCanvas2D.prototype.getTextCss=function(){var a=this.state,b="display: inline-block; font-size: "+a.fontSize+"px; font-family: "+a.fontFamily+"; color: "+a.fontColor+"; line-height: "+(mxConstants.ABSOLUTE_LINE_HEIGHT?a.fontSize*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT*this.lineHeightCorrection)+"; pointer-events: "+(this.pointerEvents?this.pointerEventsValue:"none")+"; ";(a.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(b+="font-weight: bold; ");(a.fontStyle&mxConstants.FONT_ITALIC)==
-mxConstants.FONT_ITALIC&&(b+="font-style: italic; ");var c=[];(a.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&c.push("underline");(a.fontStyle&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&c.push("line-through");0<c.length&&(b+="text-decoration: "+c.join(" ")+"; ");return b};
-mxSvgCanvas2D.prototype.text=function(a,b,c,d,e,f,g,k,l,m,n,p,q){if(this.textEnabled&&null!=e)if(p=null!=p?p:0,this.foEnabled&&"html"==l){var r=this.createDiv(e);null!=r&&(null!=q&&r.setAttribute("dir",q),this.addForeignObject(a,b,c,d,e,f,g,k,l,m,n,p,q,r,this.root))}else this.plainText(a+this.state.dx,b+this.state.dy,c,d,e,f,g,k,m,n,p,q)};
-mxSvgCanvas2D.prototype.createClip=function(a,b,c,d){a=Math.round(a);b=Math.round(b);c=Math.round(c);d=Math.round(d);for(var e="mx-clip-"+a+"-"+b+"-"+c+"-"+d,f=0,g=e+"-"+f;null!=document.getElementById(g);)g=e+"-"+ ++f;clip=this.createElement("clipPath");clip.setAttribute("id",g);e=this.createElement("rect");e.setAttribute("x",a);e.setAttribute("y",b);e.setAttribute("width",c);e.setAttribute("height",d);clip.appendChild(e);return clip};
-mxSvgCanvas2D.prototype.plainText=function(a,b,c,d,e,f,g,k,l,m,n,p){n=null!=n?n:0;k=this.state;var q=k.fontSize,r=this.createElement("g"),t=k.transform||"";this.updateFont(r);this.pointerEvents||null!=this.originalRoot||r.setAttribute("pointer-events","none");0!=n&&(t+="rotate("+n+","+this.format(a*k.scale)+","+this.format(b*k.scale)+")");null!=p&&r.setAttribute("direction",p);m&&0<c&&0<d&&(p=a,n=b,f==mxConstants.ALIGN_CENTER?p-=c/2:f==mxConstants.ALIGN_RIGHT&&(p-=c),"fill"!=l&&(g==mxConstants.ALIGN_MIDDLE?
-n-=d/2:g==mxConstants.ALIGN_BOTTOM&&(n-=d)),n=this.createClip(p*k.scale-2,n*k.scale-2,c*k.scale+4,d*k.scale+4),null!=this.defs?this.defs.appendChild(n):this.root.appendChild(n),mxClient.IS_CHROMEAPP||mxClient.IS_IE||mxClient.IS_IE11||mxClient.IS_EDGE||this.root.ownerDocument!=document?r.setAttribute("clip-path","url(#"+n.getAttribute("id")+")"):(p=this.getBaseUrl().replace(/([\(\)])/g,"\\$1"),r.setAttribute("clip-path","url("+p+"#"+n.getAttribute("id")+")")));n=f==mxConstants.ALIGN_RIGHT?"end":f==
-mxConstants.ALIGN_CENTER?"middle":"start";"start"!=n&&r.setAttribute("text-anchor",n);this.styleEnabled&&q==mxConstants.DEFAULT_FONTSIZE||r.setAttribute("font-size",q*k.scale+"px");0<t.length&&r.setAttribute("transform",t);1>k.alpha&&r.setAttribute("opacity",k.alpha);t=e.split("\n");p=Math.round(q*mxConstants.LINE_HEIGHT);var u=q+(t.length-1)*p;n=b+q-1;g==mxConstants.ALIGN_MIDDLE?"fill"==l?n-=d/2:(m=(this.matchHtmlAlignment&&m&&0<d?Math.min(u,d):u)/2,n-=m):g==mxConstants.ALIGN_BOTTOM&&("fill"==l?
-n-=d:(m=this.matchHtmlAlignment&&m&&0<d?Math.min(u,d):u,n-=m+1));for(m=0;m<t.length;m++)0<t[m].length&&0<mxUtils.trim(t[m]).length&&(q=this.createElement("text"),q.setAttribute("x",this.format(a*k.scale)+this.textOffset),q.setAttribute("y",this.format(n*k.scale)+this.textOffset),mxUtils.write(q,t[m]),r.appendChild(q)),n+=p;this.root.appendChild(r);this.addTextBackground(r,e,a,b,c,"fill"==l?d:u,f,g,l)};
-mxSvgCanvas2D.prototype.updateFont=function(a){var b=this.state;a.setAttribute("fill",b.fontColor);this.styleEnabled&&b.fontFamily==mxConstants.DEFAULT_FONTFAMILY||a.setAttribute("font-family",b.fontFamily);(b.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&a.setAttribute("font-weight","bold");(b.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC&&a.setAttribute("font-style","italic");var c=[];(b.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&c.push("underline");
-(b.fontStyle&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&c.push("line-through");0<c.length&&a.setAttribute("text-decoration",c.join(" "))};
-mxSvgCanvas2D.prototype.addTextBackground=function(a,b,c,d,e,f,g,k,l){var m=this.state;if(null!=m.fontBackgroundColor||null!=m.fontBorderColor){var n=null;if("fill"==l||"width"==l)g==mxConstants.ALIGN_CENTER?c-=e/2:g==mxConstants.ALIGN_RIGHT&&(c-=e),k==mxConstants.ALIGN_MIDDLE?d-=f/2:k==mxConstants.ALIGN_BOTTOM&&(d-=f),n=new mxRectangle((c+1)*m.scale,d*m.scale,(e-2)*m.scale,(f+2)*m.scale);else if(null!=a.getBBox&&this.root.ownerDocument==document)try{var n=a.getBBox(),p=mxClient.IS_IE&&mxClient.IS_SVG,
-n=new mxRectangle(n.x,n.y+(p?0:1),n.width,n.height+(p?1:0))}catch(q){}if(null==n||0==n.width||0==n.height)n=document.createElement("div"),n.style.lineHeight=mxConstants.ABSOLUTE_LINE_HEIGHT?m.fontSize*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT,n.style.fontSize=m.fontSize+"px",n.style.fontFamily=m.fontFamily,n.style.whiteSpace="nowrap",n.style.position="absolute",n.style.visibility="hidden",n.style.display=mxClient.IS_QUIRKS?"inline":"inline-block",n.style.zoom="1",(m.fontStyle&mxConstants.FONT_BOLD)==
-mxConstants.FONT_BOLD&&(n.style.fontWeight="bold"),(m.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC&&(n.style.fontStyle="italic"),b=mxUtils.htmlEntities(b,!1),n.innerHTML=b.replace(/\n/g,"<br/>"),document.body.appendChild(n),e=n.offsetWidth,f=n.offsetHeight,n.parentNode.removeChild(n),g==mxConstants.ALIGN_CENTER?c-=e/2:g==mxConstants.ALIGN_RIGHT&&(c-=e),k==mxConstants.ALIGN_MIDDLE?d-=f/2:k==mxConstants.ALIGN_BOTTOM&&(d-=f),n=new mxRectangle((c+1)*m.scale,(d+2)*m.scale,e*m.scale,(f+1)*
-m.scale);null!=n&&(b=this.createElement("rect"),b.setAttribute("fill",m.fontBackgroundColor||"none"),b.setAttribute("stroke",m.fontBorderColor||"none"),b.setAttribute("x",Math.floor(n.x-1)),b.setAttribute("y",Math.floor(n.y-1)),b.setAttribute("width",Math.ceil(n.width+2)),b.setAttribute("height",Math.ceil(n.height)),m=null!=m.fontBorderColor?Math.max(1,this.format(m.scale)):0,b.setAttribute("stroke-width",m),this.root.ownerDocument==document&&1==mxUtils.mod(m,2)&&b.setAttribute("transform","translate(0.5, 0.5)"),
-a.insertBefore(b,a.firstChild))}};mxSvgCanvas2D.prototype.stroke=function(){this.addNode(!1,!0)};mxSvgCanvas2D.prototype.fill=function(){this.addNode(!0,!1)};mxSvgCanvas2D.prototype.fillAndStroke=function(){this.addNode(!0,!0)};var mxVmlCanvas2D=function(a){mxAbstractCanvas2D.call(this);this.root=a};mxUtils.extend(mxVmlCanvas2D,mxAbstractCanvas2D);mxVmlCanvas2D.prototype.node=null;mxVmlCanvas2D.prototype.textEnabled=!0;mxVmlCanvas2D.prototype.moveOp="m";mxVmlCanvas2D.prototype.lineOp="l";
-mxVmlCanvas2D.prototype.curveOp="c";mxVmlCanvas2D.prototype.closeOp="x";mxVmlCanvas2D.prototype.rotatedHtmlBackground="";mxVmlCanvas2D.prototype.vmlScale=1;mxVmlCanvas2D.prototype.createElement=function(a){return document.createElement(a)};mxVmlCanvas2D.prototype.createVmlElement=function(a){return this.createElement(mxClient.VML_PREFIX+":"+a)};
-mxVmlCanvas2D.prototype.addNode=function(a,b){var c=this.node,d=this.state;if(null!=c){if("shape"==c.nodeName)if(null!=this.path&&0<this.path.length)c.path=this.path.join(" ")+" e",c.style.width=this.root.style.width,c.style.height=this.root.style.height,c.coordsize=parseInt(c.style.width)+" "+parseInt(c.style.height);else return;c.strokeweight=this.format(Math.max(1,d.strokeWidth*d.scale/this.vmlScale))+"px";d.shadow&&this.root.appendChild(this.createShadow(c,a&&null!=d.fillColor,b&&null!=d.strokeColor));
-b&&null!=d.strokeColor?(c.stroked="true",c.strokecolor=d.strokeColor):c.stroked="false";c.appendChild(this.createStroke());a&&null!=d.fillColor?c.appendChild(this.createFill()):!this.pointerEvents||"shape"==c.nodeName&&this.path[this.path.length-1]!=this.closeOp?c.filled="false":c.appendChild(this.createTransparentFill());this.root.appendChild(c)}};
-mxVmlCanvas2D.prototype.createTransparentFill=function(){var a=this.createVmlElement("fill");a.src=mxClient.imageBasePath+"/transparent.gif";a.type="tile";return a};
-mxVmlCanvas2D.prototype.createFill=function(){var a=this.state,b=this.createVmlElement("fill");b.color=a.fillColor;if(null!=a.gradientColor){b.type="gradient";b.method="none";b.color2=a.gradientColor;var c=180-a.rotation,c=a.gradientDirection==mxConstants.DIRECTION_WEST?c-(90+("x"==this.root.style.flip?180:0)):a.gradientDirection==mxConstants.DIRECTION_EAST?c+(90+("x"==this.root.style.flip?180:0)):a.gradientDirection==mxConstants.DIRECTION_NORTH?c-(180+("y"==this.root.style.flip?-180:0)):c+("y"==
-this.root.style.flip?-180:0);if("x"==this.root.style.flip||"y"==this.root.style.flip)c*=-1;b.angle=mxUtils.mod(c,360);b.opacity=a.alpha*a.gradientFillAlpha*100+"%";b.setAttribute(mxClient.OFFICE_PREFIX+":opacity2",a.alpha*a.gradientAlpha*100+"%")}else if(1>a.alpha||1>a.fillAlpha)b.opacity=a.alpha*a.fillAlpha*100+"%";return b};
-mxVmlCanvas2D.prototype.createStroke=function(){var a=this.state,b=this.createVmlElement("stroke");b.endcap=a.lineCap||"flat";b.joinstyle=a.lineJoin||"miter";b.miterlimit=a.miterLimit||"10";if(1>a.alpha||1>a.strokeAlpha)b.opacity=a.alpha*a.strokeAlpha*100+"%";a.dashed&&(b.dashstyle=this.getVmlDashStyle());return b};mxVmlCanvas2D.prototype.getVmlDashStyle=function(){var a="dash";if("string"===typeof this.state.dashPattern){var b=this.state.dashPattern.split(" ");0<b.length&&1==b[0]&&(a="0 2")}return a};
-mxVmlCanvas2D.prototype.createShadow=function(a,b,c){var d=this.state,e=Math.PI/180*-d.rotation,f=Math.cos(e),e=Math.sin(e),g=d.shadowDx*d.scale,k=d.shadowDy*d.scale;"x"==this.root.style.flip?g*=-1:"y"==this.root.style.flip&&(k*=-1);var l=a.cloneNode(!0);l.style.marginLeft=Math.round(g*f-k*e)+"px";l.style.marginTop=Math.round(g*e+k*f)+"px";8==document.documentMode&&(l.strokeweight=a.strokeweight,"shape"==a.nodeName&&(l.path=this.path.join(" ")+" e",l.style.width=this.root.style.width,l.style.height=
-this.root.style.height,l.coordsize=parseInt(a.style.width)+" "+parseInt(a.style.height)));c?(l.strokecolor=d.shadowColor,l.appendChild(this.createShadowStroke())):l.stroked="false";b?l.appendChild(this.createShadowFill()):l.filled="false";return l};mxVmlCanvas2D.prototype.createShadowFill=function(){var a=this.createVmlElement("fill");a.color=this.state.shadowColor;a.opacity=this.state.alpha*this.state.shadowAlpha*100+"%";return a};
-mxVmlCanvas2D.prototype.createShadowStroke=function(){var a=this.createStroke();a.opacity=this.state.alpha*this.state.shadowAlpha*100+"%";return a};mxVmlCanvas2D.prototype.rotate=function(a,b,c,d,e){b&&c?a+=180:b?this.root.style.flip="x":c&&(this.root.style.flip="y");if(b?!c:c)a*=-1;this.root.style.rotation=a;this.state.rotation+=a;this.state.rotationCx=d;this.state.rotationCy=e};
-mxVmlCanvas2D.prototype.begin=function(){mxAbstractCanvas2D.prototype.begin.apply(this,arguments);this.node=this.createVmlElement("shape");this.node.style.position="absolute"};
-mxVmlCanvas2D.prototype.quadTo=function(a,b,c,d){var e=this.state,f=(this.lastX+e.dx)*e.scale,g=(this.lastY+e.dy)*e.scale;a=(a+e.dx)*e.scale;b=(b+e.dy)*e.scale;c=(c+e.dx)*e.scale;d=(d+e.dy)*e.scale;var g=g+2/3*(b-g),k=c+2/3*(a-c);b=d+2/3*(b-d);this.path.push("c "+this.format(f+2/3*(a-f))+" "+this.format(g)+" "+this.format(k)+" "+this.format(b)+" "+this.format(c)+" "+this.format(d));this.lastX=c/e.scale-e.dx;this.lastY=d/e.scale-e.dy};
-mxVmlCanvas2D.prototype.createRect=function(a,b,c,d,e){var f=this.state;a=this.createVmlElement(a);a.style.position="absolute";a.style.left=this.format((b+f.dx)*f.scale)+"px";a.style.top=this.format((c+f.dy)*f.scale)+"px";a.style.width=this.format(d*f.scale)+"px";a.style.height=this.format(e*f.scale)+"px";return a};mxVmlCanvas2D.prototype.rect=function(a,b,c,d){this.node=this.createRect("rect",a,b,c,d)};
-mxVmlCanvas2D.prototype.roundrect=function(a,b,c,d,e,f){this.node=this.createRect("roundrect",a,b,c,d);this.node.setAttribute("arcsize",Math.max(100*e/c,100*f/d)+"%")};mxVmlCanvas2D.prototype.ellipse=function(a,b,c,d){this.node=this.createRect("oval",a,b,c,d)};
-mxVmlCanvas2D.prototype.image=function(a,b,c,d,e,f,g,k){f?(a=this.createRect("rect",a,b,c,d),a.stroked="false",b=this.createVmlElement("fill"),b.aspect=f?"atmost":"ignore",b.rotate="true",b.type="frame",b.src=e,a.appendChild(b)):(a=this.createRect("image",a,b,c,d),a.src=e);g&&k?a.style.rotation="180":g?a.style.flip="x":k&&(a.style.flip="y");if(1>this.state.alpha||1>this.state.fillAlpha)a.style.filter+="alpha(opacity="+this.state.alpha*this.state.fillAlpha*100+")";this.root.appendChild(a)};
-mxVmlCanvas2D.prototype.createDiv=function(a,b,c,d){c=this.createElement("div");var e=this.state,f="";null!=e.fontBackgroundColor&&(f+="background-color:"+mxUtils.htmlEntities(e.fontBackgroundColor)+";");null!=e.fontBorderColor&&(f+="border:1px solid "+mxUtils.htmlEntities(e.fontBorderColor)+";");mxUtils.isNode(a)?c.appendChild(a):"fill"!=d&&"width"!=d?(d=this.createElement("div"),d.style.cssText=f,d.style.display=mxClient.IS_QUIRKS?"inline":"inline-block",d.style.zoom="1",d.style.textDecoration=
-"inherit",d.innerHTML=a,c.appendChild(d)):(c.style.cssText=f,c.innerHTML=a);a=c.style;a.fontSize=e.fontSize/this.vmlScale+"px";a.fontFamily=e.fontFamily;a.color=e.fontColor;a.verticalAlign="top";a.textAlign=b||"left";a.lineHeight=mxConstants.ABSOLUTE_LINE_HEIGHT?e.fontSize*mxConstants.LINE_HEIGHT/this.vmlScale+"px":mxConstants.LINE_HEIGHT;(e.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(a.fontWeight="bold");(e.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC&&(a.fontStyle="italic");
-(e.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&(a.textDecoration="underline");return c};
-mxVmlCanvas2D.prototype.text=function(a,b,c,d,e,f,g,k,l,m,n,p,q){if(this.textEnabled&&null!=e){var r=this.state;if("html"==l){null!=r.rotation&&(b=this.rotatePoint(a,b,r.rotation,r.rotationCx,r.rotationCy),a=b.x,b=b.y);8!=document.documentMode||mxClient.IS_EM?(a*=r.scale,b*=r.scale):(a+=r.dx,b+=r.dy,"fill"!=m&&g==mxConstants.ALIGN_TOP&&--b);l=8!=document.documentMode||mxClient.IS_EM?this.createElement("div"):this.createVmlElement("group");l.style.position="absolute";l.style.display="inline";l.style.left=
-this.format(a)+"px";l.style.top=this.format(b)+"px";l.style.zoom=r.scale;var t=this.createElement("div");t.style.position="relative";t.style.display="inline";var u=mxUtils.getAlignmentAsPoint(f,g),x=u.x,u=u.y;e=this.createDiv(e,f,g,m);f=this.createElement("div");null!=q&&e.setAttribute("dir",q);if(k&&0<c){if(n||(e.style.width=Math.round(c)+"px"),e.style.wordWrap=mxConstants.WORD_WRAP,e.style.whiteSpace="normal","break-word"==e.style.wordWrap){var y=e;null!=y.firstChild&&"DIV"==y.firstChild.nodeName&&
-(y.firstChild.style.width="100%")}}else e.style.whiteSpace="nowrap";p=r.rotation+(p||0);this.rotateHtml&&0!=p?(f.style.display="inline",f.style.zoom="1",f.appendChild(e),8!=document.documentMode||mxClient.IS_EM||"DIV"==this.root.nodeName?l.appendChild(f):(t.appendChild(f),l.appendChild(t))):8!=document.documentMode||mxClient.IS_EM?(e.style.display="inline",l.appendChild(e)):(t.appendChild(e),l.appendChild(t));"DIV"!=this.root.nodeName?(q=this.createVmlElement("rect"),q.stroked="false",q.filled="false",
-q.appendChild(l),this.root.appendChild(q)):this.root.appendChild(l);n?(e.style.overflow="hidden",e.style.width=Math.round(c)+"px",mxClient.IS_QUIRKS||(e.style.maxHeight=Math.round(d)+"px")):"fill"==m?(e.style.overflow="hidden",e.style.width=Math.max(0,c)+1+"px",e.style.height=Math.max(0,d)+1+"px"):"width"==m&&(e.style.overflow="hidden",e.style.width=Math.max(0,c)+1+"px",e.style.maxHeight=Math.max(0,d)+1+"px");if(this.rotateHtml&&0!=p){y=Math.PI/180*p;p=parseFloat(parseFloat(Math.cos(y)).toFixed(8));
-q=parseFloat(parseFloat(Math.sin(-y)).toFixed(8));y%=2*Math.PI;0>y&&(y+=2*Math.PI);y%=Math.PI;y>Math.PI/2&&(y=Math.PI-y);g=Math.cos(y);var B=Math.sin(y);8!=document.documentMode||mxClient.IS_EM||(e.style.display="inline-block",f.style.display="inline-block",t.style.display="inline-block");e.style.visibility="hidden";e.style.position="absolute";document.body.appendChild(e);t=e;null!=t.firstChild&&"DIV"==t.firstChild.nodeName&&(t=t.firstChild);y=t.offsetWidth+3;t=t.offsetHeight;n?(c=Math.min(c,y),t=
-Math.min(t,d)):c=y;k&&(e.style.width=c+"px");mxClient.IS_QUIRKS&&(n||"width"==m)&&t>d&&(t=d,e.style.height=t+"px");d=t;n=(d-d*g+c*-B)/2-q*c*(x+.5)+p*d*(u+.5);k=(c-c*g+d*-B)/2+p*c*(x+.5)+q*d*(u+.5);"group"==l.nodeName&&"DIV"==this.root.nodeName?(m=this.createElement("div"),m.style.display="inline-block",m.style.position="absolute",m.style.left=this.format(a+(k-c/2)*r.scale)+"px",m.style.top=this.format(b+(n-d/2)*r.scale)+"px",l.parentNode.appendChild(m),m.appendChild(l)):(r=8!=document.documentMode||
-mxClient.IS_EM?r.scale:1,l.style.left=this.format(a+(k-c/2)*r)+"px",l.style.top=this.format(b+(n-d/2)*r)+"px");f.style.filter="progid:DXImageTransform.Microsoft.Matrix(M11="+p+", M12="+q+", M21="+-q+", M22="+p+", sizingMethod='auto expand')";f.style.backgroundColor=this.rotatedHtmlBackground;1>this.state.alpha&&(f.style.filter+="alpha(opacity="+100*this.state.alpha+")");f.appendChild(e);e.style.position="";e.style.visibility=""}else 8!=document.documentMode||mxClient.IS_EM?(e.style.verticalAlign=
-"top",1>this.state.alpha&&(l.style.filter="alpha(opacity="+100*this.state.alpha+")"),r=e.parentNode,e.style.visibility="hidden",document.body.appendChild(e),c=e.offsetWidth,t=e.offsetHeight,mxClient.IS_QUIRKS&&n&&t>d&&(t=d,e.style.height=t+"px"),d=t,e.style.visibility="",r.appendChild(e),l.style.left=this.format(a+c*x*this.state.scale)+"px",l.style.top=this.format(b+d*u*this.state.scale)+"px"):(1>this.state.alpha&&(e.style.filter="alpha(opacity="+100*this.state.alpha+")"),t.style.left=100*x+"%",t.style.top=
-100*u+"%")}else this.plainText(a,b,c,d,mxUtils.htmlEntities(e,!1),f,g,k,l,m,n,p,q)}};
-mxVmlCanvas2D.prototype.plainText=function(a,b,c,d,e,f,g,k,l,m,n,p,q){k=this.state;a=(a+k.dx)*k.scale;b=(b+k.dy)*k.scale;c=this.createVmlElement("shape");c.style.width="1px";c.style.height="1px";c.stroked="false";d=this.createVmlElement("fill");d.color=k.fontColor;d.opacity=100*k.alpha+"%";c.appendChild(d);d=this.createVmlElement("path");d.textpathok="true";d.v="m "+this.format(0)+" "+this.format(0)+" l "+this.format(1)+" "+this.format(0);c.appendChild(d);d=this.createVmlElement("textpath");d.style.cssText=
-"v-text-align:"+f;d.style.align=f;d.style.fontFamily=k.fontFamily;d.string=e;d.on="true";f=k.fontSize*k.scale/this.vmlScale;d.style.fontSize=f+"px";(k.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(d.style.fontWeight="bold");(k.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC&&(d.style.fontStyle="italic");(k.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&(d.style.textDecoration="underline");e=e.split("\n");k=f+(e.length-1)*f*mxConstants.LINE_HEIGHT;f=e=0;
-g==mxConstants.ALIGN_BOTTOM?f=-k/2:g!=mxConstants.ALIGN_MIDDLE&&(f=k/2);null!=p&&(c.style.rotation=p,g=Math.PI/180*p,e=Math.sin(g)*f,f*=Math.cos(g));c.appendChild(d);c.style.left=this.format(a-e)+"px";c.style.top=this.format(b+f)+"px";this.root.appendChild(c)};mxVmlCanvas2D.prototype.stroke=function(){this.addNode(!1,!0)};mxVmlCanvas2D.prototype.fill=function(){this.addNode(!0,!1)};mxVmlCanvas2D.prototype.fillAndStroke=function(){this.addNode(!0,!0)};
-function mxGuide(a,b){this.graph=a;this.setStates(b)}mxGuide.prototype.graph=null;mxGuide.prototype.states=null;mxGuide.prototype.horizontal=!0;mxGuide.prototype.vertical=!0;mxGuide.prototype.guideX=null;mxGuide.prototype.guideY=null;mxGuide.prototype.rounded=!1;mxGuide.prototype.tolerance=2;mxGuide.prototype.setStates=function(a){this.states=a};mxGuide.prototype.isEnabledForEvent=function(a){return!0};
-mxGuide.prototype.getGuideTolerance=function(a){return a&&this.graph.gridEnabled?this.graph.gridSize/2:this.tolerance};mxGuide.prototype.createGuideShape=function(a){a=new mxPolyline([],mxConstants.GUIDE_COLOR,mxConstants.GUIDE_STROKEWIDTH);a.isDashed=!0;return a};mxGuide.prototype.isStateIgnored=function(a){return!1};
-mxGuide.prototype.move=function(a,b,c,d){if(null!=this.states&&(this.horizontal||this.vertical)&&null!=a&&null!=b){d=function(c,d,e){var f=!1;e&&Math.abs(c-z)<t?(b.y=c-a.getCenterY(),t=Math.abs(c-z),f=!0):e||(Math.abs(c-B)<t?(b.y=c-a.y,t=Math.abs(c-B),f=!0):Math.abs(c-A)<t&&(b.y=c-a.y-a.height,t=Math.abs(c-A),f=!0));f&&(p=d,q=c,null==this.guideY&&(this.guideY=this.createGuideShape(!1),this.guideY.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG,this.guideY.pointerEvents=
-!1,this.guideY.init(this.graph.getView().getOverlayPane())));n=n||f};var e=function(c,d,e){var f=!1;e&&Math.abs(c-y)<r?(b.x=c-a.getCenterX(),r=Math.abs(c-y),f=!0):e||(Math.abs(c-u)<r?(b.x=c-a.x,r=Math.abs(c-u),f=!0):Math.abs(c-x)<r&&(b.x=c-a.x-a.width,r=Math.abs(c-x),f=!0));f&&(l=d,m=c,null==this.guideX&&(this.guideX=this.createGuideShape(!0),this.guideX.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG,this.guideX.pointerEvents=!1,this.guideX.init(this.graph.getView().getOverlayPane())));
-k=k||f},f=this.graph.getView().scale,f=this.getGuideTolerance(c)*f,g=a.clone();g.x+=b.x;g.y+=b.y;for(var k=!1,l=null,m=null,n=!1,p=null,q=null,r=f,t=f,u=g.x,x=g.x+g.width,y=g.getCenterX(),B=g.y,A=g.y+g.height,z=g.getCenterY(),f=0;f<this.states.length;f++)g=this.states[f],null==g||this.isStateIgnored(g)||(this.horizontal&&(e.call(this,g.getCenterX(),g,!0),e.call(this,g.x,g,!1),e.call(this,g.x+g.width,g,!1),null==g.cell&&e.call(this,g.getCenterX(),g,!1)),this.vertical&&(d.call(this,g.getCenterY(),g,
-!0),d.call(this,g.y,g,!1),d.call(this,g.y+g.height,g,!1),null==g.cell&&d.call(this,g.getCenterY(),g,!1)));this.graph.snapDelta(b,a,!c,k,n);b=this.getDelta(a,l,b.x,p,b.y);c=this.graph.container;k||null==this.guideX?null!=this.guideX&&(e=d=null,null!=l&&null!=a&&(d=Math.min(a.y+b.y-this.graph.panDy,l.y),e=Math.max(a.y+a.height+b.y-this.graph.panDy,l.y+l.height)),this.guideX.points=null!=d&&null!=e?[new mxPoint(m,d),new mxPoint(m,e)]:[new mxPoint(m,-this.graph.panDy),new mxPoint(m,c.scrollHeight-3-this.graph.panDy)],
-this.guideX.stroke=this.getGuideColor(l,!0),this.guideX.node.style.visibility="visible",this.guideX.redraw()):this.guideX.node.style.visibility="hidden";n||null==this.guideY?null!=this.guideY&&(e=d=null,null!=p&&null!=a&&(d=Math.min(a.x+b.x-this.graph.panDx,p.x),e=Math.max(a.x+a.width+b.x-this.graph.panDx,p.x+p.width)),this.guideY.points=null!=d&&null!=e?[new mxPoint(d,q),new mxPoint(e,q)]:[new mxPoint(-this.graph.panDx,q),new mxPoint(c.scrollWidth-3-this.graph.panDx,q)],this.guideY.stroke=this.getGuideColor(p,
-!1),this.guideY.node.style.visibility="visible",this.guideY.redraw()):this.guideY.node.style.visibility="hidden"}return b};mxGuide.prototype.getDelta=function(a,b,c,d,e){var f=this.graph.view.scale;if(this.rounded||null!=b&&null==b.cell)c=Math.round((a.x+c)/f)*f-a.x;if(this.rounded||null!=d&&null==d.cell)e=Math.round((a.y+e)/f)*f-a.y;return new mxPoint(c,e)};mxGuide.prototype.getGuideColor=function(a,b){return mxConstants.GUIDE_COLOR};mxGuide.prototype.hide=function(){this.setVisible(!1)};
-mxGuide.prototype.setVisible=function(a){null!=this.guideX&&(this.guideX.node.style.visibility=a?"visible":"hidden");null!=this.guideY&&(this.guideY.node.style.visibility=a?"visible":"hidden")};mxGuide.prototype.destroy=function(){null!=this.guideX&&(this.guideX.destroy(),this.guideX=null);null!=this.guideY&&(this.guideY.destroy(),this.guideY=null)};function mxShape(a){this.stencil=a;this.initStyles()}mxShape.prototype.dialect=null;mxShape.prototype.scale=1;mxShape.prototype.antiAlias=!0;
-mxShape.prototype.minSvgStrokeWidth=1;mxShape.prototype.bounds=null;mxShape.prototype.points=null;mxShape.prototype.node=null;mxShape.prototype.state=null;mxShape.prototype.style=null;mxShape.prototype.boundingBox=null;mxShape.prototype.stencil=null;mxShape.prototype.svgStrokeTolerance=8;mxShape.prototype.pointerEvents=!0;mxShape.prototype.svgPointerEvents="all";mxShape.prototype.shapePointerEvents=!1;mxShape.prototype.stencilPointerEvents=!1;mxShape.prototype.vmlScale=1;
-mxShape.prototype.outline=!1;mxShape.prototype.visible=!0;mxShape.prototype.useSvgBoundingBox=!1;mxShape.prototype.init=function(a){null==this.node&&(this.node=this.create(a),null!=a&&a.appendChild(this.node))};mxShape.prototype.initStyles=function(a){this.strokewidth=1;this.rotation=0;this.strokeOpacity=this.fillOpacity=this.opacity=100;this.flipV=this.flipH=!1};mxShape.prototype.isParseVml=function(){return!0};mxShape.prototype.isHtmlAllowed=function(){return!1};
-mxShape.prototype.getSvgScreenOffset=function(){return 1==mxUtils.mod(Math.max(1,Math.round((this.stencil&&"inherit"!=this.stencil.strokewidth?Number(this.stencil.strokewidth):this.strokewidth)*this.scale)),2)?.5:0};mxShape.prototype.create=function(a){return null!=a&&null!=a.ownerSVGElement?this.createSvg(a):8==document.documentMode||!mxClient.IS_VML||this.dialect!=mxConstants.DIALECT_VML&&this.isHtmlAllowed()?this.createHtml(a):this.createVml(a)};
-mxShape.prototype.createSvg=function(){return document.createElementNS(mxConstants.NS_SVG,"g")};mxShape.prototype.createVml=function(){var a=document.createElement(mxClient.VML_PREFIX+":group");a.style.position="absolute";return a};mxShape.prototype.createHtml=function(){var a=document.createElement("div");a.style.position="absolute";return a};mxShape.prototype.reconfigure=function(){this.redraw()};
-mxShape.prototype.redraw=function(){this.updateBoundsFromPoints();this.visible&&this.checkBounds()?(this.node.style.visibility="visible",this.clear(),"DIV"!=this.node.nodeName||!this.isHtmlAllowed()&&mxClient.IS_VML?this.redrawShape():this.redrawHtmlShape(),this.updateBoundingBox()):(this.node.style.visibility="hidden",this.boundingBox=null)};
-mxShape.prototype.clear=function(){if(null!=this.node.ownerSVGElement)for(;null!=this.node.lastChild;)this.node.removeChild(this.node.lastChild);else this.node.style.cssText="position:absolute;"+(null!=this.cursor?"cursor:"+this.cursor+";":""),this.node.innerHTML=""};
-mxShape.prototype.updateBoundsFromPoints=function(){var a=this.points;if(null!=a&&0<a.length&&null!=a[0]){this.bounds=new mxRectangle(Number(a[0].x),Number(a[0].y),1,1);for(var b=1;b<this.points.length;b++)null!=a[b]&&this.bounds.add(new mxRectangle(Number(a[b].x),Number(a[b].y),1,1))}};
-mxShape.prototype.getLabelBounds=function(a){var b=mxUtils.getValue(this.style,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST),c=a;b!=mxConstants.DIRECTION_SOUTH&&b!=mxConstants.DIRECTION_NORTH&&null!=this.state&&null!=this.state.text&&this.state.text.isPaintBoundsInverted()&&(c=c.clone(),b=c.width,c.width=c.height,c.height=b);c=this.getLabelMargins(c);if(null!=c){var d="1"==mxUtils.getValue(this.style,mxConstants.STYLE_FLIPH,!1),e="1"==mxUtils.getValue(this.style,mxConstants.STYLE_FLIPV,
-!1);null!=this.state&&null!=this.state.text&&this.state.text.isPaintBoundsInverted()&&(b=c.x,c.x=c.height,c.height=c.width,c.width=c.y,c.y=b,b=d,d=e,e=b);return mxUtils.getDirectedBounds(a,c,this.style,d,e)}return a};mxShape.prototype.getLabelMargins=function(a){return null};
-mxShape.prototype.checkBounds=function(){return!isNaN(this.scale)&&isFinite(this.scale)&&0<this.scale&&null!=this.bounds&&!isNaN(this.bounds.x)&&!isNaN(this.bounds.y)&&!isNaN(this.bounds.width)&&!isNaN(this.bounds.height)&&0<this.bounds.width&&0<this.bounds.height};mxShape.prototype.createVmlGroup=function(){var a=document.createElement(mxClient.VML_PREFIX+":group");a.style.position="absolute";a.style.width=this.node.style.width;a.style.height=this.node.style.height;return a};
-mxShape.prototype.redrawShape=function(){var a=this.createCanvas();null!=a&&(a.pointerEvents=this.pointerEvents,this.beforePaint(a),this.paint(a),this.afterPaint(a),this.node!=a.root&&this.node.insertAdjacentHTML("beforeend",a.root.outerHTML),"DIV"==this.node.nodeName&&8==document.documentMode&&(this.node.style.filter="",mxUtils.addTransparentBackgroundFilter(this.node)),this.destroyCanvas(a))};
-mxShape.prototype.createCanvas=function(){var a=null;null!=this.node.ownerSVGElement?a=this.createSvgCanvas():mxClient.IS_VML&&(this.updateVmlContainer(),a=this.createVmlCanvas());null!=a&&this.outline&&(a.setStrokeWidth(this.strokewidth),a.setStrokeColor(this.stroke),null!=this.isDashed&&a.setDashed(this.isDashed),a.setStrokeWidth=function(){},a.setStrokeColor=function(){},a.setFillColor=function(){},a.setGradient=function(){},a.setDashed=function(){},a.text=function(){});return a};
-mxShape.prototype.createSvgCanvas=function(){var a=new mxSvgCanvas2D(this.node,!1);a.strokeTolerance=this.pointerEvents?this.svgStrokeTolerance:0;a.pointerEventsValue=this.svgPointerEvents;var b=this.getSvgScreenOffset();0!=b?this.node.setAttribute("transform","translate("+b+","+b+")"):this.node.removeAttribute("transform");a.minStrokeWidth=this.minSvgStrokeWidth;this.antiAlias||(a.format=function(a){return Math.round(parseFloat(a))});return a};
-mxShape.prototype.createVmlCanvas=function(){var a=8==document.documentMode&&this.isParseVml()?this.createVmlGroup():this.node,b=new mxVmlCanvas2D(a,!1);""!=a.tagUrn&&(a.coordsize=Math.max(1,Math.round(this.bounds.width))*this.vmlScale+","+Math.max(1,Math.round(this.bounds.height))*this.vmlScale,b.scale(this.vmlScale),b.vmlScale=this.vmlScale);a=this.scale;b.translate(-Math.round(this.bounds.x/a),-Math.round(this.bounds.y/a));return b};
-mxShape.prototype.updateVmlContainer=function(){this.node.style.left=Math.round(this.bounds.x)+"px";this.node.style.top=Math.round(this.bounds.y)+"px";var a=Math.max(1,Math.round(this.bounds.height));this.node.style.width=Math.max(1,Math.round(this.bounds.width))+"px";this.node.style.height=a+"px";this.node.style.overflow="visible"};mxShape.prototype.redrawHtmlShape=function(){this.updateHtmlBounds(this.node);this.updateHtmlFilters(this.node);this.updateHtmlColors(this.node)};
-mxShape.prototype.updateHtmlFilters=function(a){var b="";100>this.opacity&&(b+="alpha(opacity="+this.opacity+")");this.isShadow&&(b+="progid:DXImageTransform.Microsoft.dropShadow (OffX='"+Math.round(mxConstants.SHADOW_OFFSET_X*this.scale)+"', OffY='"+Math.round(mxConstants.SHADOW_OFFSET_Y*this.scale)+"', Color='"+mxConstants.VML_SHADOWCOLOR+"')");if(null!=this.fill&&this.fill!=mxConstants.NONE&&this.gradient&&this.gradient!=mxConstants.NONE){var c=this.fill,d=this.gradient,e="0",f={east:0,south:1,
-west:2,north:3},g=null!=this.direction?f[this.direction]:0;null!=this.gradientDirection&&(g=mxUtils.mod(g+f[this.gradientDirection]-1,4));1==g?(e="1",f=c,c=d,d=f):2==g?(f=c,c=d,d=f):3==g&&(e="1");b+="progid:DXImageTransform.Microsoft.gradient(startColorStr='"+c+"', endColorStr='"+d+"', gradientType='"+e+"')"}a.style.filter=b};
-mxShape.prototype.updateHtmlColors=function(a){var b=this.stroke;null!=b&&b!=mxConstants.NONE?(a.style.borderColor=b,this.isDashed?a.style.borderStyle="dashed":0<this.strokewidth&&(a.style.borderStyle="solid"),a.style.borderWidth=Math.max(1,Math.ceil(this.strokewidth*this.scale))+"px"):a.style.borderWidth="0px";b=this.outline?null:this.fill;null!=b&&b!=mxConstants.NONE?(a.style.backgroundColor=b,a.style.backgroundImage="none"):this.pointerEvents?a.style.backgroundColor="transparent":8==document.documentMode?
-mxUtils.addTransparentBackgroundFilter(a):this.setTransparentBackgroundImage(a)};
-mxShape.prototype.updateHtmlBounds=function(a){var b=9<=document.documentMode?0:Math.ceil(this.strokewidth*this.scale);a.style.borderWidth=Math.max(1,b)+"px";a.style.overflow="hidden";a.style.left=Math.round(this.bounds.x-b/2)+"px";a.style.top=Math.round(this.bounds.y-b/2)+"px";"CSS1Compat"==document.compatMode&&(b=-b);a.style.width=Math.round(Math.max(0,this.bounds.width+b))+"px";a.style.height=Math.round(Math.max(0,this.bounds.height+b))+"px"};
-mxShape.prototype.destroyCanvas=function(a){if(a instanceof mxSvgCanvas2D){for(var b in a.gradients){var c=a.gradients[b];null!=c&&(c.mxRefCount=(c.mxRefCount||0)+1)}this.releaseSvgGradients(this.oldGradients);this.oldGradients=a.gradients}};mxShape.prototype.beforePaint=function(a){};mxShape.prototype.afterPaint=function(a){};
-mxShape.prototype.paint=function(a){var b=!1;if(null!=a&&this.outline){var c=a.stroke;a.stroke=function(){b=!0;c.apply(this,arguments)};var d=a.fillAndStroke;a.fillAndStroke=function(){b=!0;d.apply(this,arguments)}}var e=this.scale,f=this.bounds.x/e,g=this.bounds.y/e,k=this.bounds.width/e,l=this.bounds.height/e;if(this.isPaintBoundsInverted())var m=(k-l)/2,f=f+m,g=g-m,m=k,k=l,l=m;this.updateTransform(a,f,g,k,l);this.configureCanvas(a,f,g,k,l);m=null;if(null==this.stencil&&null==this.points&&this.shapePointerEvents||
-null!=this.stencil&&this.stencilPointerEvents){var n=this.createBoundingBox();this.dialect==mxConstants.DIALECT_SVG?(m=this.createTransparentSvgRectangle(n.x,n.y,n.width,n.height),this.node.appendChild(m)):(n=a.createRect("rect",n.x/e,n.y/e,n.width/e,n.height/e),n.appendChild(a.createTransparentFill()),n.stroked="false",a.root.appendChild(n))}if(null!=this.stencil)this.stencil.drawShape(a,this,f,g,k,l);else if(a.setStrokeWidth(this.strokewidth),null!=this.points){for(var n=[],p=0;p<this.points.length;p++)null!=
-this.points[p]&&n.push(new mxPoint(this.points[p].x/e,this.points[p].y/e));this.paintEdgeShape(a,n)}else this.paintVertexShape(a,f,g,k,l);null!=m&&null!=a.state&&null!=a.state.transform&&m.setAttribute("transform",a.state.transform);null!=a&&this.outline&&!b&&(a.rect(f,g,k,l),a.stroke())};
-mxShape.prototype.configureCanvas=function(a,b,c,d,e){var f=null;null!=this.style&&(f=this.style.dashPattern);a.setAlpha(this.opacity/100);a.setFillAlpha(this.fillOpacity/100);a.setStrokeAlpha(this.strokeOpacity/100);null!=this.isShadow&&a.setShadow(this.isShadow);null!=this.isDashed&&a.setDashed(this.isDashed,null!=this.style?1==mxUtils.getValue(this.style,mxConstants.STYLE_FIX_DASH,!1):!1);null!=f&&a.setDashPattern(f);null!=this.fill&&this.fill!=mxConstants.NONE&&this.gradient&&this.gradient!=mxConstants.NONE?
-(b=this.getGradientBounds(a,b,c,d,e),a.setGradient(this.fill,this.gradient,b.x,b.y,b.width,b.height,this.gradientDirection)):a.setFillColor(this.fill);a.setStrokeColor(this.stroke)};mxShape.prototype.getGradientBounds=function(a,b,c,d,e){return new mxRectangle(b,c,d,e)};mxShape.prototype.updateTransform=function(a,b,c,d,e){a.scale(this.scale);a.rotate(this.getShapeRotation(),this.flipH,this.flipV,b+d/2,c+e/2)};
-mxShape.prototype.paintVertexShape=function(a,b,c,d,e){this.paintBackground(a,b,c,d,e);this.outline&&null!=this.style&&0!=mxUtils.getValue(this.style,mxConstants.STYLE_BACKGROUND_OUTLINE,0)||(a.setShadow(!1),this.paintForeground(a,b,c,d,e))};mxShape.prototype.paintBackground=function(a,b,c,d,e){};mxShape.prototype.paintForeground=function(a,b,c,d,e){};mxShape.prototype.paintEdgeShape=function(a,b){};
-mxShape.prototype.getArcSize=function(a,b){var c;"1"==mxUtils.getValue(this.style,mxConstants.STYLE_ABSOLUTE_ARCSIZE,0)?c=Math.min(a/2,Math.min(b/2,mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/2)):(c=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,100*mxConstants.RECTANGLE_ROUNDING_FACTOR)/100,c=Math.min(a*c,b*c));return c};
-mxShape.prototype.paintGlassEffect=function(a,b,c,d,e,f){var g=Math.ceil(this.strokewidth/2);a.setGradient("#ffffff","#ffffff",b,c,d,.6*e,"south",.9,.1);a.begin();f+=2*g;this.isRounded?(a.moveTo(b-g+f,c-g),a.quadTo(b-g,c-g,b-g,c-g+f),a.lineTo(b-g,c+.4*e),a.quadTo(b+.5*d,c+.7*e,b+d+g,c+.4*e),a.lineTo(b+d+g,c-g+f),a.quadTo(b+d+g,c-g,b+d+g-f,c-g)):(a.moveTo(b-g,c-g),a.lineTo(b-g,c+.4*e),a.quadTo(b+.5*d,c+.7*e,b+d+g,c+.4*e),a.lineTo(b+d+g,c-g));a.close();a.fill()};
-mxShape.prototype.addPoints=function(a,b,c,d,e,f,g){if(null!=b&&0<b.length){g=null!=g?g:!0;var k=b[b.length-1];if(e&&c){b=b.slice();var l=b[0],l=new mxPoint(k.x+(l.x-k.x)/2,k.y+(l.y-k.y)/2);b.splice(0,0,l)}var m=b[0],l=1;for(g?a.moveTo(m.x,m.y):a.lineTo(m.x,m.y);l<(e?b.length:b.length-1);){g=b[mxUtils.mod(l,b.length)];var n=m.x-g.x,m=m.y-g.y;if(c&&(0!=n||0!=m)&&(null==f||0>mxUtils.indexOf(f,l-1))){var p=Math.sqrt(n*n+m*m);a.lineTo(g.x+n*Math.min(d,p/2)/p,g.y+m*Math.min(d,p/2)/p);for(m=b[mxUtils.mod(l+
-1,b.length)];l<b.length-2&&0==Math.round(m.x-g.x)&&0==Math.round(m.y-g.y);)m=b[mxUtils.mod(l+2,b.length)],l++;n=m.x-g.x;m=m.y-g.y;p=Math.max(1,Math.sqrt(n*n+m*m));n=g.x+n*Math.min(d,p/2)/p;m=g.y+m*Math.min(d,p/2)/p;a.quadTo(g.x,g.y,n,m);g=new mxPoint(n,m)}else a.lineTo(g.x,g.y);m=g;l++}e?a.close():a.lineTo(k.x,k.y)}};
-mxShape.prototype.resetStyles=function(){this.initStyles();this.spacing=0;delete this.fill;delete this.gradient;delete this.gradientDirection;delete this.stroke;delete this.startSize;delete this.endSize;delete this.startArrow;delete this.endArrow;delete this.direction;delete this.isShadow;delete this.isDashed;delete this.isRounded;delete this.glass};
-mxShape.prototype.apply=function(a){this.state=a;this.style=a.style;if(null!=this.style){this.fill=mxUtils.getValue(this.style,mxConstants.STYLE_FILLCOLOR,this.fill);this.gradient=mxUtils.getValue(this.style,mxConstants.STYLE_GRADIENTCOLOR,this.gradient);this.gradientDirection=mxUtils.getValue(this.style,mxConstants.STYLE_GRADIENT_DIRECTION,this.gradientDirection);this.opacity=mxUtils.getValue(this.style,mxConstants.STYLE_OPACITY,this.opacity);this.fillOpacity=mxUtils.getValue(this.style,mxConstants.STYLE_FILL_OPACITY,
-this.fillOpacity);this.strokeOpacity=mxUtils.getValue(this.style,mxConstants.STYLE_STROKE_OPACITY,this.strokeOpacity);this.stroke=mxUtils.getValue(this.style,mxConstants.STYLE_STROKECOLOR,this.stroke);this.strokewidth=mxUtils.getNumber(this.style,mxConstants.STYLE_STROKEWIDTH,this.strokewidth);this.spacing=mxUtils.getValue(this.style,mxConstants.STYLE_SPACING,this.spacing);this.startSize=mxUtils.getNumber(this.style,mxConstants.STYLE_STARTSIZE,this.startSize);this.endSize=mxUtils.getNumber(this.style,
-mxConstants.STYLE_ENDSIZE,this.endSize);this.startArrow=mxUtils.getValue(this.style,mxConstants.STYLE_STARTARROW,this.startArrow);this.endArrow=mxUtils.getValue(this.style,mxConstants.STYLE_ENDARROW,this.endArrow);this.rotation=mxUtils.getValue(this.style,mxConstants.STYLE_ROTATION,this.rotation);this.direction=mxUtils.getValue(this.style,mxConstants.STYLE_DIRECTION,this.direction);this.flipH=1==mxUtils.getValue(this.style,mxConstants.STYLE_FLIPH,0);this.flipV=1==mxUtils.getValue(this.style,mxConstants.STYLE_FLIPV,
-0);null!=this.stencil&&(this.flipH=1==mxUtils.getValue(this.style,"stencilFlipH",0)||this.flipH,this.flipV=1==mxUtils.getValue(this.style,"stencilFlipV",0)||this.flipV);if(this.direction==mxConstants.DIRECTION_NORTH||this.direction==mxConstants.DIRECTION_SOUTH)a=this.flipH,this.flipH=this.flipV,this.flipV=a;this.isShadow=1==mxUtils.getValue(this.style,mxConstants.STYLE_SHADOW,this.isShadow);this.isDashed=1==mxUtils.getValue(this.style,mxConstants.STYLE_DASHED,this.isDashed);this.isRounded=1==mxUtils.getValue(this.style,
-mxConstants.STYLE_ROUNDED,this.isRounded);this.glass=1==mxUtils.getValue(this.style,mxConstants.STYLE_GLASS,this.glass);this.fill==mxConstants.NONE&&(this.fill=null);this.gradient==mxConstants.NONE&&(this.gradient=null);this.stroke==mxConstants.NONE&&(this.stroke=null)}};mxShape.prototype.setCursor=function(a){null==a&&(a="");this.cursor=a;null!=this.node&&(this.node.style.cursor=a)};mxShape.prototype.getCursor=function(){return this.cursor};mxShape.prototype.isRoundable=function(){return!1};
-mxShape.prototype.updateBoundingBox=function(){if(this.useSvgBoundingBox&&null!=this.node&&null!=this.node.ownerSVGElement)try{var a=this.node.getBBox();if(0<a.width&&0<a.height){this.boundingBox=new mxRectangle(a.x,a.y,a.width,a.height);this.boundingBox.grow(this.strokewidth*this.scale/2);return}}catch(c){}if(null!=this.bounds){a=this.createBoundingBox();if(null!=a){this.augmentBoundingBox(a);var b=this.getShapeRotation();0!=b&&(a=mxUtils.getBoundingBox(a,b))}this.boundingBox=a}};
-mxShape.prototype.createBoundingBox=function(){var a=this.bounds.clone();(null!=this.stencil&&(this.direction==mxConstants.DIRECTION_NORTH||this.direction==mxConstants.DIRECTION_SOUTH)||this.isPaintBoundsInverted())&&a.rotate90();return a};mxShape.prototype.augmentBoundingBox=function(a){this.isShadow&&(a.width+=Math.ceil(mxConstants.SHADOW_OFFSET_X*this.scale),a.height+=Math.ceil(mxConstants.SHADOW_OFFSET_Y*this.scale));a.grow(this.strokewidth*this.scale/2)};
-mxShape.prototype.isPaintBoundsInverted=function(){return null==this.stencil&&(this.direction==mxConstants.DIRECTION_NORTH||this.direction==mxConstants.DIRECTION_SOUTH)};mxShape.prototype.getRotation=function(){return null!=this.rotation?this.rotation:0};mxShape.prototype.getTextRotation=function(){var a=this.getRotation();1!=mxUtils.getValue(this.style,mxConstants.STYLE_HORIZONTAL,1)&&(a+=mxText.prototype.verticalTextRotation);return a};
-mxShape.prototype.getShapeRotation=function(){var a=this.getRotation();null!=this.direction&&(this.direction==mxConstants.DIRECTION_NORTH?a+=270:this.direction==mxConstants.DIRECTION_WEST?a+=180:this.direction==mxConstants.DIRECTION_SOUTH&&(a+=90));return a};
-mxShape.prototype.createTransparentSvgRectangle=function(a,b,c,d){var e=document.createElementNS(mxConstants.NS_SVG,"rect");e.setAttribute("x",a);e.setAttribute("y",b);e.setAttribute("width",c);e.setAttribute("height",d);e.setAttribute("fill","none");e.setAttribute("stroke","none");e.setAttribute("pointer-events","all");return e};mxShape.prototype.setTransparentBackgroundImage=function(a){a.style.backgroundImage="url('"+mxClient.imageBasePath+"/transparent.gif')"};
-mxShape.prototype.releaseSvgGradients=function(a){if(null!=a)for(var b in a){var c=a[b];null!=c&&(c.mxRefCount=(c.mxRefCount||0)-1,0==c.mxRefCount&&null!=c.parentNode&&c.parentNode.removeChild(c))}};mxShape.prototype.destroy=function(){null!=this.node&&(mxEvent.release(this.node),null!=this.node.parentNode&&this.node.parentNode.removeChild(this.node),this.node=null);this.releaseSvgGradients(this.oldGradients);this.oldGradients=null};
-function mxStencil(a){this.desc=a;this.parseDescription();this.parseConstraints()}mxUtils.extend(mxStencil,mxShape);mxStencil.defaultLocalized=!1;mxStencil.allowEval=!1;mxStencil.prototype.desc=null;mxStencil.prototype.constraints=null;mxStencil.prototype.aspect=null;mxStencil.prototype.w0=null;mxStencil.prototype.h0=null;mxStencil.prototype.bgNode=null;mxStencil.prototype.fgNode=null;mxStencil.prototype.strokewidth=null;
-mxStencil.prototype.parseDescription=function(){this.fgNode=this.desc.getElementsByTagName("foreground")[0];this.bgNode=this.desc.getElementsByTagName("background")[0];this.w0=Number(this.desc.getAttribute("w")||100);this.h0=Number(this.desc.getAttribute("h")||100);var a=this.desc.getAttribute("aspect");this.aspect=null!=a?a:"variable";a=this.desc.getAttribute("strokewidth");this.strokewidth=null!=a?a:"1"};
-mxStencil.prototype.parseConstraints=function(){var a=this.desc.getElementsByTagName("connections")[0];if(null!=a&&(a=mxUtils.getChildNodes(a),null!=a&&0<a.length)){this.constraints=[];for(var b=0;b<a.length;b++)this.constraints.push(this.parseConstraint(a[b]))}};mxStencil.prototype.parseConstraint=function(a){var b=Number(a.getAttribute("x")),c=Number(a.getAttribute("y")),d="1"==a.getAttribute("perimeter");a=a.getAttribute("name");return new mxConnectionConstraint(new mxPoint(b,c),d,a)};
-mxStencil.prototype.evaluateTextAttribute=function(a,b,c){b=this.evaluateAttribute(a,b,c);a=a.getAttribute("localized");if(mxStencil.defaultLocalized&&null==a||"1"==a)b=mxResources.get(b);return b};mxStencil.prototype.evaluateAttribute=function(a,b,c){b=a.getAttribute(b);null==b&&(a=mxUtils.getTextContent(a),null!=a&&mxStencil.allowEval&&(a=mxUtils.eval(a),"function"==typeof a&&(b=a(c))));return b};
-mxStencil.prototype.drawShape=function(a,b,c,d,e,f){var g=a.states.slice(),k=mxUtils.getValue(b.style,mxConstants.STYLE_DIRECTION,null),k=this.computeAspect(b.style,c,d,e,f,k),l=Math.min(k.width,k.height),l="inherit"==this.strokewidth?Number(mxUtils.getNumber(b.style,mxConstants.STYLE_STROKEWIDTH,1)):Number(this.strokewidth)*l;a.setStrokeWidth(l);null!=b.style&&"1"==mxUtils.getValue(b.style,mxConstants.STYLE_POINTER_EVENTS,"0")&&(a.setStrokeColor(mxConstants.NONE),a.rect(c,d,e,f),a.stroke(),a.setStrokeColor(b.stroke));
-this.drawChildren(a,b,c,d,e,f,this.bgNode,k,!1,!0);this.drawChildren(a,b,c,d,e,f,this.fgNode,k,!0,!b.outline||null==b.style||0==mxUtils.getValue(b.style,mxConstants.STYLE_BACKGROUND_OUTLINE,0));a.states.length!=g.length&&(a.states=g)};mxStencil.prototype.drawChildren=function(a,b,c,d,e,f,g,k,l,m){if(null!=g&&0<e&&0<f)for(c=g.firstChild;null!=c;)c.nodeType==mxConstants.NODETYPE_ELEMENT&&this.drawNode(a,b,c,k,l,m),c=c.nextSibling};
-mxStencil.prototype.computeAspect=function(a,b,c,d,e,f){a=b;b=d/this.w0;var g=e/this.h0;if(f=f==mxConstants.DIRECTION_NORTH||f==mxConstants.DIRECTION_SOUTH){g=d/this.h0;b=e/this.w0;var k=(d-e)/2;a+=k;c-=k}"fixed"==this.aspect&&(b=g=Math.min(b,g),f?(a+=(e-this.w0*b)/2,c+=(d-this.h0*g)/2):(a+=(d-this.w0*b)/2,c+=(e-this.h0*g)/2));return new mxRectangle(a,c,b,g)};
-mxStencil.prototype.drawNode=function(a,b,c,d,e,f){var g=c.nodeName,k=d.x,l=d.y,m=d.width,n=d.height,p=Math.min(m,n);if("save"==g)a.save();else if("restore"==g)a.restore();else if(f){if("path"==g){a.begin();p=!0;if("1"==c.getAttribute("rounded")){for(var p=!1,q=Number(c.getAttribute("arcSize")),r=0,t=[],u=c.firstChild;null!=u;){if(u.nodeType==mxConstants.NODETYPE_ELEMENT){var x=u.nodeName;if("move"==x||"line"==x)"move"!=x&&0!=t.length||t.push([]),t[t.length-1].push(new mxPoint(k+Number(u.getAttribute("x"))*
-m,l+Number(u.getAttribute("y"))*n)),r++;else{p=!0;break}}u=u.nextSibling}if(!p&&0<r)for(m=0;m<t.length;m++)n=!1,l=t[m][0],k=t[m][t[m].length-1],l.x==k.x&&l.y==k.y&&(t[m].pop(),n=!0),this.addPoints(a,t[m],!0,q,n);else p=!0}if(p)for(u=c.firstChild;null!=u;)u.nodeType==mxConstants.NODETYPE_ELEMENT&&this.drawNode(a,b,u,d,e,f),u=u.nextSibling}else if("close"==g)a.close();else if("move"==g)a.moveTo(k+Number(c.getAttribute("x"))*m,l+Number(c.getAttribute("y"))*n);else if("line"==g)a.lineTo(k+Number(c.getAttribute("x"))*
-m,l+Number(c.getAttribute("y"))*n);else if("quad"==g)a.quadTo(k+Number(c.getAttribute("x1"))*m,l+Number(c.getAttribute("y1"))*n,k+Number(c.getAttribute("x2"))*m,l+Number(c.getAttribute("y2"))*n);else if("curve"==g)a.curveTo(k+Number(c.getAttribute("x1"))*m,l+Number(c.getAttribute("y1"))*n,k+Number(c.getAttribute("x2"))*m,l+Number(c.getAttribute("y2"))*n,k+Number(c.getAttribute("x3"))*m,l+Number(c.getAttribute("y3"))*n);else if("arc"==g)a.arcTo(Number(c.getAttribute("rx"))*m,Number(c.getAttribute("ry"))*
-n,Number(c.getAttribute("x-axis-rotation")),Number(c.getAttribute("large-arc-flag")),Number(c.getAttribute("sweep-flag")),k+Number(c.getAttribute("x"))*m,l+Number(c.getAttribute("y"))*n);else if("rect"==g)a.rect(k+Number(c.getAttribute("x"))*m,l+Number(c.getAttribute("y"))*n,Number(c.getAttribute("w"))*m,Number(c.getAttribute("h"))*n);else if("roundrect"==g)b=Number(c.getAttribute("arcsize")),0==b&&(b=100*mxConstants.RECTANGLE_ROUNDING_FACTOR),d=Number(c.getAttribute("w"))*m,f=Number(c.getAttribute("h"))*
-n,b=Number(b)/100,b=Math.min(d*b,f*b),a.roundrect(k+Number(c.getAttribute("x"))*m,l+Number(c.getAttribute("y"))*n,d,f,b,b);else if("ellipse"==g)a.ellipse(k+Number(c.getAttribute("x"))*m,l+Number(c.getAttribute("y"))*n,Number(c.getAttribute("w"))*m,Number(c.getAttribute("h"))*n);else if("image"==g)b.outline||(b=this.evaluateAttribute(c,"src",b),a.image(k+Number(c.getAttribute("x"))*m,l+Number(c.getAttribute("y"))*n,Number(c.getAttribute("w"))*m,Number(c.getAttribute("h"))*n,b,!1,"1"==c.getAttribute("flipH"),
-"1"==c.getAttribute("flipV")));else if("text"==g)b.outline||(d=this.evaluateTextAttribute(c,"str",b),f="1"==c.getAttribute("vertical")?-90:0,"0"==c.getAttribute("align-shape")&&(p=b.rotation,q=1==mxUtils.getValue(b.style,mxConstants.STYLE_FLIPH,0),b=1==mxUtils.getValue(b.style,mxConstants.STYLE_FLIPV,0),f=q&&b?f-p:q||b?f+p:f-p),f-=c.getAttribute("rotation"),a.text(k+Number(c.getAttribute("x"))*m,l+Number(c.getAttribute("y"))*n,0,0,d,c.getAttribute("align")||"left",c.getAttribute("valign")||"top",
-!1,"",null,!1,f));else if("include-shape"==g)p=mxStencilRegistry.getStencil(c.getAttribute("name")),null!=p&&(k+=Number(c.getAttribute("x"))*m,l+=Number(c.getAttribute("y"))*n,d=Number(c.getAttribute("w"))*m,f=Number(c.getAttribute("h"))*n,p.drawShape(a,b,k,l,d,f));else if("fillstroke"==g)a.fillAndStroke();else if("fill"==g)a.fill();else if("stroke"==g)a.stroke();else if("strokewidth"==g)m="1"==c.getAttribute("fixed")?1:p,a.setStrokeWidth(Number(c.getAttribute("width"))*m);else if("dashed"==g)a.setDashed("1"==
-c.getAttribute("dashed"));else if("dashpattern"==g){if(c=c.getAttribute("pattern"),null!=c){c=c.split(" ");n=[];for(m=0;m<c.length;m++)0<c[m].length&&n.push(Number(c[m])*p);c=n.join(" ");a.setDashPattern(c)}}else"strokecolor"==g?a.setStrokeColor(c.getAttribute("color")):"linecap"==g?a.setLineCap(c.getAttribute("cap")):"linejoin"==g?a.setLineJoin(c.getAttribute("join")):"miterlimit"==g?a.setMiterLimit(Number(c.getAttribute("limit"))):"fillcolor"==g?a.setFillColor(c.getAttribute("color")):"alpha"==
-g?a.setAlpha(c.getAttribute("alpha")):"fillalpha"==g?a.setAlpha(c.getAttribute("alpha")):"strokealpha"==g?a.setAlpha(c.getAttribute("alpha")):"fontcolor"==g?a.setFontColor(c.getAttribute("color")):"fontstyle"==g?a.setFontStyle(c.getAttribute("style")):"fontfamily"==g?a.setFontFamily(c.getAttribute("family")):"fontsize"==g&&a.setFontSize(Number(c.getAttribute("size"))*p);!e||"fillstroke"!=g&&"fill"!=g&&"stroke"!=g||a.setShadow(!1)}};
-var mxStencilRegistry={stencils:{},addStencil:function(a,b){mxStencilRegistry.stencils[a]=b},getStencil:function(a){return mxStencilRegistry.stencils[a]}},mxMarker={markers:[],addMarker:function(a,b){mxMarker.markers[a]=b},createMarker:function(a,b,c,d,e,f,g,k,l,m){var n=mxMarker.markers[c];return null!=n?n(a,b,c,d,e,f,g,k,l,m):null}};
-(function(){function a(a){a=null!=a?a:2;return function(b,c,d,k,l,m,n,p,q,r){c=l*q*1.118;p=m*q*1.118;l*=n+q;m*=n+q;var e=k.clone();e.x-=c;e.y-=p;n=d!=mxConstants.ARROW_CLASSIC&&d!=mxConstants.ARROW_CLASSIC_THIN?1:.75;k.x+=-l*n-c;k.y+=-m*n-p;return function(){b.begin();b.moveTo(e.x,e.y);b.lineTo(e.x-l-m/a,e.y-m+l/a);d!=mxConstants.ARROW_CLASSIC&&d!=mxConstants.ARROW_CLASSIC_THIN||b.lineTo(e.x-3*l/4,e.y-3*m/4);b.lineTo(e.x+m/a-l,e.y-m-l/a);b.close();r?b.fillAndStroke():b.stroke()}}}function b(a){a=
-null!=a?a:2;return function(b,c,d,k,l,m,n,p,q,r){c=l*q*1.118;d=m*q*1.118;l*=n+q;m*=n+q;var e=k.clone();e.x-=c;e.y-=d;k.x+=2*-c;k.y+=2*-d;return function(){b.begin();b.moveTo(e.x-l-m/a,e.y-m+l/a);b.lineTo(e.x,e.y);b.lineTo(e.x+m/a-l,e.y-m-l/a);b.stroke()}}}function c(a,b,c,g,k,l,m,n,p,q){n=c==mxConstants.ARROW_DIAMOND?.7071:.9862;b=k*p*n;n*=l*p;k*=m+p;l*=m+p;var d=g.clone();d.x-=b;d.y-=n;g.x+=-k-b;g.y+=-l-n;var e=c==mxConstants.ARROW_DIAMOND?2:3.4;return function(){a.begin();a.moveTo(d.x,d.y);a.lineTo(d.x-
-k/2-l/e,d.y+k/e-l/2);a.lineTo(d.x-k,d.y-l);a.lineTo(d.x-k/2+l/e,d.y-l/2-k/e);a.close();q?a.fillAndStroke():a.stroke()}}mxMarker.addMarker("classic",a(2));mxMarker.addMarker("classicThin",a(3));mxMarker.addMarker("block",a(2));mxMarker.addMarker("blockThin",a(3));mxMarker.addMarker("open",b(2));mxMarker.addMarker("openThin",b(3));mxMarker.addMarker("oval",function(a,b,c,g,k,l,m,n,p,q){var d=m/2,e=g.clone();g.x-=k*d;g.y-=l*d;return function(){a.ellipse(e.x-d,e.y-d,m,m);q?a.fillAndStroke():a.stroke()}});
-mxMarker.addMarker("diamond",c);mxMarker.addMarker("diamondThin",c)})();function mxActor(a,b,c,d){mxShape.call(this);this.bounds=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1}mxUtils.extend(mxActor,mxShape);mxActor.prototype.paintVertexShape=function(a,b,c,d,e){a.translate(b,c);a.begin();this.redrawPath(a,b,c,d,e);a.fillAndStroke()};
-mxActor.prototype.redrawPath=function(a,b,c,d,e){b=d/3;a.moveTo(0,e);a.curveTo(0,3*e/5,0,2*e/5,d/2,2*e/5);a.curveTo(d/2-b,2*e/5,d/2-b,0,d/2,0);a.curveTo(d/2+b,0,d/2+b,2*e/5,d/2,2*e/5);a.curveTo(d,2*e/5,d,3*e/5,d,e);a.close()};function mxCloud(a,b,c,d){mxActor.call(this);this.bounds=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1}mxUtils.extend(mxCloud,mxActor);
-mxCloud.prototype.redrawPath=function(a,b,c,d,e){a.moveTo(.25*d,.25*e);a.curveTo(.05*d,.25*e,0,.5*e,.16*d,.55*e);a.curveTo(0,.66*e,.18*d,.9*e,.31*d,.8*e);a.curveTo(.4*d,e,.7*d,e,.8*d,.8*e);a.curveTo(d,.8*e,d,.6*e,.875*d,.5*e);a.curveTo(d,.3*e,.8*d,.1*e,.625*d,.2*e);a.curveTo(.5*d,.05*e,.3*d,.05*e,.25*d,.25*e);a.close()};function mxRectangleShape(a,b,c,d){mxShape.call(this);this.bounds=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1}mxUtils.extend(mxRectangleShape,mxShape);
-mxRectangleShape.prototype.isHtmlAllowed=function(){var a=!0;null!=this.style&&(a="1"==mxUtils.getValue(this.style,mxConstants.STYLE_POINTER_EVENTS,"1"));return!this.isRounded&&!this.glass&&0==this.rotation&&(a||null!=this.fill&&this.fill!=mxConstants.NONE)};
-mxRectangleShape.prototype.paintBackground=function(a,b,c,d,e){var f=!0;null!=this.style&&(f="1"==mxUtils.getValue(this.style,mxConstants.STYLE_POINTER_EVENTS,"1"));if(f||null!=this.fill&&this.fill!=mxConstants.NONE||null!=this.stroke&&this.stroke!=mxConstants.NONE)f||null!=this.fill&&this.fill!=mxConstants.NONE||(a.pointerEvents=!1),this.isRounded?("1"==mxUtils.getValue(this.style,mxConstants.STYLE_ABSOLUTE_ARCSIZE,0)?f=Math.min(d/2,Math.min(e/2,mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,
-mxConstants.LINE_ARCSIZE)/2)):(f=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,100*mxConstants.RECTANGLE_ROUNDING_FACTOR)/100,f=Math.min(d*f,e*f)),a.roundrect(b,c,d,e,f,f)):a.rect(b,c,d,e),a.fillAndStroke()};mxRectangleShape.prototype.isRoundable=function(a,b,c,d,e){return!0};mxRectangleShape.prototype.paintForeground=function(a,b,c,d,e){this.glass&&!this.outline&&null!=this.fill&&this.fill!=mxConstants.NONE&&this.paintGlassEffect(a,b,c,d,e,this.getArcSize(d+this.strokewidth,e+this.strokewidth))};
-function mxEllipse(a,b,c,d){mxShape.call(this);this.bounds=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1}mxUtils.extend(mxEllipse,mxShape);mxEllipse.prototype.paintVertexShape=function(a,b,c,d,e){a.ellipse(b,c,d,e);a.fillAndStroke()};function mxDoubleEllipse(a,b,c,d){mxShape.call(this);this.bounds=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1}mxUtils.extend(mxDoubleEllipse,mxShape);mxDoubleEllipse.prototype.vmlScale=10;
-mxDoubleEllipse.prototype.paintBackground=function(a,b,c,d,e){a.ellipse(b,c,d,e);a.fillAndStroke()};mxDoubleEllipse.prototype.paintForeground=function(a,b,c,d,e){if(!this.outline){var f=mxUtils.getValue(this.style,mxConstants.STYLE_MARGIN,Math.min(3+this.strokewidth,Math.min(d/5,e/5)));d-=2*f;e-=2*f;0<d&&0<e&&a.ellipse(b+f,c+f,d,e);a.stroke()}};
-mxDoubleEllipse.prototype.getLabelBounds=function(a){var b=mxUtils.getValue(this.style,mxConstants.STYLE_MARGIN,Math.min(3+this.strokewidth,Math.min(a.width/5/this.scale,a.height/5/this.scale)))*this.scale;return new mxRectangle(a.x+b,a.y+b,a.width-2*b,a.height-2*b)};function mxRhombus(a,b,c,d){mxShape.call(this);this.bounds=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1}mxUtils.extend(mxRhombus,mxShape);mxRhombus.prototype.isRoundable=function(){return!0};
-mxRhombus.prototype.paintVertexShape=function(a,b,c,d,e){var f=d/2,g=e/2,k=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/2;a.begin();this.addPoints(a,[new mxPoint(b+f,c),new mxPoint(b+d,c+g),new mxPoint(b+f,c+e),new mxPoint(b,c+g)],this.isRounded,k,!0);a.fillAndStroke()};function mxPolyline(a,b,c){mxShape.call(this);this.points=a;this.stroke=b;this.strokewidth=null!=c?c:1}mxUtils.extend(mxPolyline,mxShape);mxPolyline.prototype.getRotation=function(){return 0};
-mxPolyline.prototype.getShapeRotation=function(){return 0};mxPolyline.prototype.isPaintBoundsInverted=function(){return!1};mxPolyline.prototype.paintEdgeShape=function(a,b){var c=a.pointerEventsValue;a.pointerEventsValue="stroke";null==this.style||1!=this.style[mxConstants.STYLE_CURVED]?this.paintLine(a,b,this.isRounded):this.paintCurvedLine(a,b);a.pointerEventsValue=c};
-mxPolyline.prototype.paintLine=function(a,b,c){var d=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/2;a.begin();this.addPoints(a,b,c,d,!1);a.stroke()};mxPolyline.prototype.paintCurvedLine=function(a,b){a.begin();var c=b[0],d=b.length;a.moveTo(c.x,c.y);for(c=1;c<d-2;c++){var e=b[c],f=b[c+1];a.quadTo(e.x,e.y,(e.x+f.x)/2,(e.y+f.y)/2)}e=b[d-2];f=b[d-1];a.quadTo(e.x,e.y,f.x,f.y);a.stroke()};
-function mxArrow(a,b,c,d,e,f,g){mxShape.call(this);this.points=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1;this.arrowWidth=null!=e?e:mxConstants.ARROW_WIDTH;this.spacing=null!=f?f:mxConstants.ARROW_SPACING;this.endSize=null!=g?g:mxConstants.ARROW_SIZE}mxUtils.extend(mxArrow,mxShape);mxArrow.prototype.augmentBoundingBox=function(a){mxShape.prototype.augmentBoundingBox.apply(this,arguments);a.grow((Math.max(this.arrowWidth,this.endSize)/2+this.strokewidth)*this.scale)};
-mxArrow.prototype.paintEdgeShape=function(a,b){var c=mxConstants.ARROW_SPACING,d=mxConstants.ARROW_WIDTH,e=b[0],f=b[b.length-1],g=f.x-e.x,k=f.y-e.y,l=Math.sqrt(g*g+k*k),m=l-2*c-mxConstants.ARROW_SIZE,g=g/l,k=k/l,l=d*k/3,d=-d*g/3,n=e.x-l/2+c*g,e=e.y-d/2+c*k,p=n+l,q=e+d,r=p+m*g,m=q+m*k,t=r+l,u=m+d,x=t-3*l,y=u-3*d;a.begin();a.moveTo(n,e);a.lineTo(p,q);a.lineTo(r,m);a.lineTo(t,u);a.lineTo(f.x-c*g,f.y-c*k);a.lineTo(x,y);a.lineTo(x+l,y+d);a.close();a.fillAndStroke()};
-function mxArrowConnector(a,b,c,d,e,f,g){mxShape.call(this);this.points=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1;this.arrowWidth=null!=e?e:mxConstants.ARROW_WIDTH;this.arrowSpacing=null!=f?f:mxConstants.ARROW_SPACING;this.startSize=mxConstants.ARROW_SIZE/5;this.endSize=mxConstants.ARROW_SIZE/5}mxUtils.extend(mxArrowConnector,mxShape);mxArrowConnector.prototype.useSvgBoundingBox=!0;mxArrowConnector.prototype.isRoundable=function(){return!0};
-mxArrowConnector.prototype.resetStyles=function(){mxShape.prototype.resetStyles.apply(this,arguments);this.arrowSpacing=mxConstants.ARROW_SPACING};mxArrowConnector.prototype.apply=function(a){mxShape.prototype.apply.apply(this,arguments);null!=this.style&&(this.startSize=3*mxUtils.getNumber(this.style,mxConstants.STYLE_STARTSIZE,mxConstants.ARROW_SIZE/5),this.endSize=3*mxUtils.getNumber(this.style,mxConstants.STYLE_ENDSIZE,mxConstants.ARROW_SIZE/5))};
-mxArrowConnector.prototype.augmentBoundingBox=function(a){mxShape.prototype.augmentBoundingBox.apply(this,arguments);var b=this.getEdgeWidth();this.isMarkerStart()&&(b=Math.max(b,this.getStartArrowWidth()));this.isMarkerEnd()&&(b=Math.max(b,this.getEndArrowWidth()));a.grow((b/2+this.strokewidth)*this.scale)};
-mxArrowConnector.prototype.paintEdgeShape=function(a,b){var c=this.strokewidth;this.outline&&(c=Math.max(1,mxUtils.getNumber(this.style,mxConstants.STYLE_STROKEWIDTH,this.strokewidth)));for(var d=this.getStartArrowWidth()+c,e=this.getEndArrowWidth()+c,f=this.outline?this.getEdgeWidth()+c:this.getEdgeWidth(),g=this.isOpenEnded(),k=this.isMarkerStart(),l=this.isMarkerEnd(),m=g?0:this.arrowSpacing+c/2,n=this.startSize+c,c=this.endSize+c,p=this.isArrowRounded(),q=b[b.length-1],r=1;r<b.length-1&&b[r].x==
-b[0].x&&b[r].y==b[0].y;)r++;var t=b[r].x-b[0].x,r=b[r].y-b[0].y,u=Math.sqrt(t*t+r*r);if(0!=u){var x=t/u,y,B=x,A=r/u,z,C=A,u=f*A,v=-f*x,D=[];p?a.setLineJoin("round"):2<b.length&&a.setMiterLimit(1.42);a.begin();t=x;r=A;if(k&&!g)this.paintMarker(a,b[0].x,b[0].y,x,A,n,d,f,m,!0);else{y=b[0].x+u/2+m*x;z=b[0].y+v/2+m*A;var F=b[0].x-u/2+m*x,J=b[0].y-v/2+m*A;g?(a.moveTo(y,z),D.push(function(){a.lineTo(F,J)})):(a.moveTo(F,J),a.lineTo(y,z))}for(var E=z=y=0,u=0;u<b.length-2;u++)if(v=mxUtils.relativeCcw(b[u].x,
-b[u].y,b[u+1].x,b[u+1].y,b[u+2].x,b[u+2].y),y=b[u+2].x-b[u+1].x,z=b[u+2].y-b[u+1].y,E=Math.sqrt(y*y+z*z),0!=E){B=y/E;C=z/E;E=Math.max(Math.sqrt((x*B+A*C+1)/2),.04);y=x+B;z=A+C;var G=Math.sqrt(y*y+z*z);if(0!=G){y/=G;z/=G;var G=Math.max(E,Math.min(this.strokewidth/200+.04,.35)),E=0!=v&&p?Math.max(.1,G):Math.max(E,.06),H=b[u+1].x+z*f/2/E,I=b[u+1].y-y*f/2/E;z=b[u+1].x-z*f/2/E;y=b[u+1].y+y*f/2/E;0!=v&&p?-1==v?(v=z+C*f,E=y-B*f,a.lineTo(z+A*f,y-x*f),a.quadTo(H,I,v,E),function(b,c){D.push(function(){a.lineTo(b,
-c)})}(z,y)):(a.lineTo(H,I),function(b,c){var d=H-A*f,e=I+x*f,g=H-C*f,k=I+B*f;D.push(function(){a.quadTo(b,c,d,e)});D.push(function(){a.lineTo(g,k)})}(z,y)):(a.lineTo(H,I),function(b,c){D.push(function(){a.lineTo(b,c)})}(z,y));x=B;A=C}}u=f*C;v=-f*B;if(l&&!g)this.paintMarker(a,q.x,q.y,-x,-A,c,e,f,m,!1);else{a.lineTo(q.x-m*B+u/2,q.y-m*C+v/2);var K=q.x-m*B-u/2,L=q.y-m*C-v/2;g?(a.moveTo(K,L),D.splice(0,0,function(){a.moveTo(K,L)})):a.lineTo(K,L)}for(u=D.length-1;0<=u;u--)D[u]();g?(a.end(),a.stroke()):
-(a.close(),a.fillAndStroke());a.setShadow(!1);a.setMiterLimit(4);p&&a.setLineJoin("flat");2<b.length&&(a.setMiterLimit(4),k&&!g&&(a.begin(),this.paintMarker(a,b[0].x,b[0].y,t,r,n,d,f,m,!0),a.stroke(),a.end()),l&&!g&&(a.begin(),this.paintMarker(a,q.x,q.y,-x,-A,c,e,f,m,!0),a.stroke(),a.end()))}};
-mxArrowConnector.prototype.paintMarker=function(a,b,c,d,e,f,g,k,l,m){g=k/g;var n=k*e/2;k=-k*d/2;var p=(l+f)*d;f=(l+f)*e;m?a.moveTo(b-n+p,c-k+f):a.lineTo(b-n+p,c-k+f);a.lineTo(b-n/g+p,c-k/g+f);a.lineTo(b+l*d,c+l*e);a.lineTo(b+n/g+p,c+k/g+f);a.lineTo(b+n+p,c+k+f)};mxArrowConnector.prototype.isArrowRounded=function(){return this.isRounded};mxArrowConnector.prototype.getStartArrowWidth=function(){return mxConstants.ARROW_WIDTH};mxArrowConnector.prototype.getEndArrowWidth=function(){return mxConstants.ARROW_WIDTH};
-mxArrowConnector.prototype.getEdgeWidth=function(){return mxConstants.ARROW_WIDTH/3};mxArrowConnector.prototype.isOpenEnded=function(){return!1};mxArrowConnector.prototype.isMarkerStart=function(){return mxUtils.getValue(this.style,mxConstants.STYLE_STARTARROW,mxConstants.NONE)!=mxConstants.NONE};mxArrowConnector.prototype.isMarkerEnd=function(){return mxUtils.getValue(this.style,mxConstants.STYLE_ENDARROW,mxConstants.NONE)!=mxConstants.NONE};
-function mxText(a,b,c,d,e,f,g,k,l,m,n,p,q,r,t,u,x,y,B,A,z){mxShape.call(this);this.value=a;this.bounds=b;this.color=null!=e?e:"black";this.align=null!=c?c:mxConstants.ALIGN_CENTER;this.valign=null!=d?d:mxConstants.ALIGN_MIDDLE;this.family=null!=f?f:mxConstants.DEFAULT_FONTFAMILY;this.size=null!=g?g:mxConstants.DEFAULT_FONTSIZE;this.fontStyle=null!=k?k:mxConstants.DEFAULT_FONTSTYLE;this.spacing=parseInt(l||2);this.spacingTop=this.spacing+parseInt(m||0);this.spacingRight=this.spacing+parseInt(n||0);
-this.spacingBottom=this.spacing+parseInt(p||0);this.spacingLeft=this.spacing+parseInt(q||0);this.horizontal=null!=r?r:!0;this.background=t;this.border=u;this.wrap=null!=x?x:!1;this.clipped=null!=y?y:!1;this.overflow=null!=B?B:"visible";this.labelPadding=null!=A?A:0;this.textDirection=z;this.rotation=0;this.updateMargin()}mxUtils.extend(mxText,mxShape);mxText.prototype.baseSpacingTop=0;mxText.prototype.baseSpacingBottom=0;mxText.prototype.baseSpacingLeft=0;mxText.prototype.baseSpacingRight=0;
-mxText.prototype.replaceLinefeeds=!0;mxText.prototype.verticalTextRotation=-90;mxText.prototype.ignoreClippedStringSize=!0;mxText.prototype.ignoreStringSize=!1;mxText.prototype.textWidthPadding=8!=document.documentMode||mxClient.IS_EM?3:4;mxText.prototype.lastValue=null;mxText.prototype.cacheEnabled=!0;mxText.prototype.isParseVml=function(){return!1};mxText.prototype.isHtmlAllowed=function(){return 8!=document.documentMode||mxClient.IS_EM};mxText.prototype.getSvgScreenOffset=function(){return 0};
-mxText.prototype.checkBounds=function(){return!isNaN(this.scale)&&isFinite(this.scale)&&0<this.scale&&null!=this.bounds&&!isNaN(this.bounds.x)&&!isNaN(this.bounds.y)&&!isNaN(this.bounds.width)&&!isNaN(this.bounds.height)};
-mxText.prototype.paint=function(a,b){var c=this.scale,d=this.bounds.x/c,e=this.bounds.y/c,f=this.bounds.width/c,c=this.bounds.height/c;this.updateTransform(a,d,e,f,c);this.configureCanvas(a,d,e,f,c);if(b)a.updateText(d,e,f,c,this.align,this.valign,this.wrap,this.overflow,this.clipped,this.getTextRotation(),this.node);else{var g=mxUtils.isNode(this.value)||this.dialect==mxConstants.DIALECT_STRICTHTML,k=g||a instanceof mxVmlCanvas2D?"html":"",l=this.value;g||"html"!=k||(l=mxUtils.htmlEntities(l,!1));
-"html"!=k||mxUtils.isNode(this.value)||(l=mxUtils.replaceTrailingNewlines(l,"<div><br></div>"));var l=!mxUtils.isNode(this.value)&&this.replaceLinefeeds&&"html"==k?l.replace(/\n/g,"<br/>"):l,m=this.textDirection;m!=mxConstants.TEXT_DIRECTION_AUTO||g||(m=this.getAutoDirection());m!=mxConstants.TEXT_DIRECTION_LTR&&m!=mxConstants.TEXT_DIRECTION_RTL&&(m=null);a.text(d,e,f,c,l,this.align,this.valign,this.wrap,k,this.overflow,this.clipped,this.getTextRotation(),m)}};
-mxText.prototype.redraw=function(){if(this.visible&&this.checkBounds()&&this.cacheEnabled&&this.lastValue==this.value&&(mxUtils.isNode(this.value)||this.dialect==mxConstants.DIALECT_STRICTHTML))if("DIV"!=this.node.nodeName||!this.isHtmlAllowed()&&mxClient.IS_VML){var a=this.createCanvas();null!=a&&null!=a.updateText?(a.pointerEvents=this.pointerEvents,this.paint(a,!0),this.destroyCanvas(a),this.updateBoundingBox()):mxShape.prototype.redraw.apply(this,arguments)}else mxClient.IS_SVG?this.redrawHtmlShapeWithCss3():
-(this.updateSize(this.node,null==this.state||null==this.state.view.textDiv),mxClient.IS_IE&&(null==document.documentMode||8>=document.documentMode)?this.updateHtmlFilter():this.updateHtmlTransform()),this.updateBoundingBox();else mxShape.prototype.redraw.apply(this,arguments),mxUtils.isNode(this.value)||this.dialect==mxConstants.DIALECT_STRICTHTML?this.lastValue=this.value:this.lastValue=null};
-mxText.prototype.resetStyles=function(){mxShape.prototype.resetStyles.apply(this,arguments);this.color="black";this.align=mxConstants.ALIGN_CENTER;this.valign=mxConstants.ALIGN_MIDDLE;this.family=mxConstants.DEFAULT_FONTFAMILY;this.size=mxConstants.DEFAULT_FONTSIZE;this.fontStyle=mxConstants.DEFAULT_FONTSTYLE;this.spacingLeft=this.spacingBottom=this.spacingRight=this.spacingTop=this.spacing=2;this.horizontal=!0;delete this.background;delete this.border;this.textDirection=mxConstants.DEFAULT_TEXT_DIRECTION;
-delete this.margin};
-mxText.prototype.apply=function(a){var b=this.spacing;mxShape.prototype.apply.apply(this,arguments);null!=this.style&&(this.fontStyle=mxUtils.getValue(this.style,mxConstants.STYLE_FONTSTYLE,this.fontStyle),this.family=mxUtils.getValue(this.style,mxConstants.STYLE_FONTFAMILY,this.family),this.size=mxUtils.getValue(this.style,mxConstants.STYLE_FONTSIZE,this.size),this.color=mxUtils.getValue(this.style,mxConstants.STYLE_FONTCOLOR,this.color),this.align=mxUtils.getValue(this.style,mxConstants.STYLE_ALIGN,
-this.align),this.valign=mxUtils.getValue(this.style,mxConstants.STYLE_VERTICAL_ALIGN,this.valign),this.spacing=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING,this.spacing)),this.spacingTop=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING_TOP,this.spacingTop-b))+this.spacing,this.spacingRight=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING_RIGHT,this.spacingRight-b))+this.spacing,this.spacingBottom=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING_BOTTOM,
-this.spacingBottom-b))+this.spacing,this.spacingLeft=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING_LEFT,this.spacingLeft-b))+this.spacing,this.horizontal=mxUtils.getValue(this.style,mxConstants.STYLE_HORIZONTAL,this.horizontal),this.background=mxUtils.getValue(this.style,mxConstants.STYLE_LABEL_BACKGROUNDCOLOR,this.background),this.border=mxUtils.getValue(this.style,mxConstants.STYLE_LABEL_BORDERCOLOR,this.border),this.textDirection=mxUtils.getValue(this.style,mxConstants.STYLE_TEXT_DIRECTION,
-mxConstants.DEFAULT_TEXT_DIRECTION),this.opacity=mxUtils.getValue(this.style,mxConstants.STYLE_TEXT_OPACITY,100),this.updateMargin());this.flipH=this.flipV=null};mxText.prototype.getAutoDirection=function(){var a=/[A-Za-z\u05d0-\u065f\u066a-\u06ef\u06fa-\u07ff\ufb1d-\ufdff\ufe70-\ufefc]/.exec(this.value);return null!=a&&0<a.length&&"z"<a[0]?mxConstants.TEXT_DIRECTION_RTL:mxConstants.TEXT_DIRECTION_LTR};
-mxText.prototype.getContentNode=function(){var a=this.node;null!=a&&(a=null==a.ownerSVGElement?this.node.firstChild.firstChild:a.firstChild.firstChild.firstChild.firstChild.firstChild);return a};
-mxText.prototype.updateBoundingBox=function(){var a=this.node;this.boundingBox=this.bounds.clone();var b=this.getTextRotation(),c=null!=this.style?mxUtils.getValue(this.style,mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER):null,d=null!=this.style?mxUtils.getValue(this.style,mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE):null;if(!(this.ignoreStringSize||null==a||"fill"==this.overflow||this.clipped&&this.ignoreClippedStringSize&&c==mxConstants.ALIGN_CENTER&&d==mxConstants.ALIGN_MIDDLE)){d=
-c=null;if(null!=a.ownerSVGElement)if(null!=a.firstChild&&null!=a.firstChild.firstChild&&"foreignObject"==a.firstChild.firstChild.nodeName)a=a.firstChild.firstChild.firstChild.firstChild,d=a.offsetHeight*this.scale,c="width"==this.overflow?this.boundingBox.width:a.offsetWidth*this.scale;else try{var e=a.getBBox();"string"==typeof this.value&&0==mxUtils.trim(this.value)?this.boundingBox=null:this.boundingBox=0==e.width&&0==e.height?null:new mxRectangle(e.x,e.y,e.width,e.height);return}catch(f){}else{c=
-null!=this.state?this.state.view.textDiv:null;if(null==this.offsetWidth||null==this.offsetHeight)null!=c&&(this.updateFont(c),this.updateSize(c,!1),this.updateInnerHtml(c),a=c),e=a,8!=document.documentMode||mxClient.IS_EM?null!=e.firstChild&&"DIV"==e.firstChild.nodeName&&(e=e.firstChild):(d=Math.round(this.bounds.width/this.scale),this.wrap&&0<d?(a.style.wordWrap=mxConstants.WORD_WRAP,a.style.whiteSpace="normal","break-word"!=a.style.wordWrap&&(a=e.getElementsByTagName("div"),0<a.length&&(e=a[a.length-
-1]),c=e.offsetWidth+2,a=this.node.getElementsByTagName("div"),this.clipped&&(c=Math.min(d,c)),1<a.length&&(a[a.length-2].style.width=c+"px"))):a.style.whiteSpace="nowrap"),this.offsetWidth=e.offsetWidth+this.textWidthPadding,this.offsetHeight=e.offsetHeight;c=this.offsetWidth*this.scale;d=this.offsetHeight*this.scale}null!=c&&null!=d&&(this.boundingBox=new mxRectangle(this.bounds.x,this.bounds.y,c,d))}null!=this.boundingBox&&(0!=b?(b=mxUtils.getBoundingBox(new mxRectangle(this.margin.x*this.boundingBox.width,
-this.margin.y*this.boundingBox.height,this.boundingBox.width,this.boundingBox.height),b,new mxPoint(0,0)),this.unrotatedBoundingBox=mxRectangle.fromRectangle(this.boundingBox),this.unrotatedBoundingBox.x+=this.margin.x*this.unrotatedBoundingBox.width,this.unrotatedBoundingBox.y+=this.margin.y*this.unrotatedBoundingBox.height,this.boundingBox.x+=b.x,this.boundingBox.y+=b.y,this.boundingBox.width=b.width,this.boundingBox.height=b.height):(this.boundingBox.x+=this.margin.x*this.boundingBox.width,this.boundingBox.y+=
-this.margin.y*this.boundingBox.height,this.unrotatedBoundingBox=null))};mxText.prototype.getShapeRotation=function(){return 0};mxText.prototype.getTextRotation=function(){return null!=this.state&&null!=this.state.shape?this.state.shape.getTextRotation():0};mxText.prototype.isPaintBoundsInverted=function(){return!this.horizontal&&null!=this.state&&this.state.view.graph.model.isVertex(this.state.cell)};
-mxText.prototype.configureCanvas=function(a,b,c,d,e){mxShape.prototype.configureCanvas.apply(this,arguments);a.setFontColor(this.color);a.setFontBackgroundColor(this.background);a.setFontBorderColor(this.border);a.setFontFamily(this.family);a.setFontSize(this.size);a.setFontStyle(this.fontStyle)};
-mxText.prototype.updateVmlContainer=function(){this.node.style.left=Math.round(this.bounds.x)+"px";this.node.style.top=Math.round(this.bounds.y)+"px";this.node.style.width="1px";this.node.style.height="1px";this.node.style.overflow="visible"};mxText.prototype.getHtmlValue=function(){var a=this.value;this.dialect!=mxConstants.DIALECT_STRICTHTML&&(a=mxUtils.htmlEntities(a,!1));a=mxUtils.replaceTrailingNewlines(a,"<div><br></div>");return a=this.replaceLinefeeds?a.replace(/\n/g,"<br/>"):a};
-mxText.prototype.getTextCss=function(){var a="display: inline-block; font-size: "+this.size+"px; font-family: "+this.family+"; color: "+this.color+"; line-height: "+(mxConstants.ABSOLUTE_LINE_HEIGHT?this.size*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT)+"; pointer-events: "+(this.pointerEvents?"all":"none")+"; ";(this.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(a+="font-weight: bold; ");(this.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC&&(a+="font-style: italic; ");
-var b=[];(this.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&b.push("underline");(this.fontStyle&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&b.push("line-through");0<b.length&&(a+="text-decoration: "+b.join(" ")+"; ");return a};
-mxText.prototype.redrawHtmlShape=function(){if(mxClient.IS_SVG)this.redrawHtmlShapeWithCss3();else{var a=this.node.style;a.whiteSpace="normal";a.overflow="";a.width="";a.height="";this.updateValue();this.updateFont(this.node);this.updateSize(this.node,null==this.state||null==this.state.view.textDiv);this.offsetHeight=this.offsetWidth=null;mxClient.IS_IE&&(null==document.documentMode||8>=document.documentMode)?this.updateHtmlFilter():this.updateHtmlTransform()}};
-mxText.prototype.redrawHtmlShapeWithCss3=function(){var a=Math.max(0,Math.round(this.bounds.width/this.scale)),b=Math.max(0,Math.round(this.bounds.height/this.scale)),c="position: absolute; left: "+Math.round(this.bounds.x)+"px; top: "+Math.round(this.bounds.y)+"px; pointer-events: none; ",d=this.getTextCss();mxSvgCanvas2D.createCss(a+2,b,this.align,this.valign,this.wrap,this.overflow,this.clipped,null!=this.background?mxUtils.htmlEntities(this.background):null,null!=this.border?mxUtils.htmlEntities(this.border):
-null,c,d,this.scale,mxUtils.bind(this,function(a,c,d,k,l,m){a=this.getTextRotation();a=(1!=this.scale?"scale("+this.scale+") ":"")+(0!=a?"rotate("+a+"deg) ":"")+(0!=this.margin.x||0!=this.margin.y?"translate("+100*this.margin.x+"%,"+100*this.margin.y+"%)":"");""!=a&&(a="transform-origin: 0 0; transform: "+a+"; ");"block"==this.overflow&&this.valign==mxConstants.ALIGN_MIDDLE&&(a+="max-height: "+(b+1)+"px;");""==m?(d+=k,k="display:inline-block; min-width: 100%; "+a):(k+=a,mxClient.IS_SF&&(k+="-webkit-clip-path: content-box;"));
-"block"==this.overflow&&(k+="width: 100%; ");100>this.opacity&&(l+="opacity: "+this.opacity/100+"; ");this.node.setAttribute("style",d);d=mxUtils.isNode(this.value)?this.value.outerHTML:this.getHtmlValue();null==this.node.firstChild&&(this.node.innerHTML="<div><div>"+d+"</div></div>",mxClient.IS_IE11&&this.fixFlexboxForIe11(this.node));this.node.firstChild.firstChild.setAttribute("style",l);this.node.firstChild.setAttribute("style",k)}))};
-mxText.prototype.fixFlexboxForIe11=function(a){for(var b=a.querySelectorAll('div[style*="display: flex; justify-content: flex-end;"]'),c=0;c<b.length;c++)b[c].style.justifyContent="flex-start",b[c].style.flexDirection="row-reverse";if(!this.wrap)for(b=a.querySelectorAll('div[style*="display: flex; justify-content: center;"]'),a=-window.innerWidth,c=0;c<b.length;c++)b[c].style.marginLeft=a+"px",b[c].style.marginRight=a+"px"};
-mxText.prototype.updateHtmlTransform=function(){var a=this.getTextRotation(),b=this.node.style,c=this.margin.x,d=this.margin.y;0!=a?(mxUtils.setPrefixedStyle(b,"transformOrigin",100*-c+"% "+100*-d+"%"),mxUtils.setPrefixedStyle(b,"transform","translate("+100*c+"%,"+100*d+"%) scale("+this.scale+") rotate("+a+"deg)")):(mxUtils.setPrefixedStyle(b,"transformOrigin","0% 0%"),mxUtils.setPrefixedStyle(b,"transform","scale("+this.scale+") translate("+100*c+"%,"+100*d+"%)"));b.left=Math.round(this.bounds.x-
-Math.ceil(c*("fill"!=this.overflow&&"width"!=this.overflow?3:1)))+"px";b.top=Math.round(this.bounds.y-d*("fill"!=this.overflow?3:1))+"px";b.opacity=100>this.opacity?this.opacity/100:""};
-mxText.prototype.updateInnerHtml=function(a){if(mxUtils.isNode(this.value))a.innerHTML=this.value.outerHTML;else{var b=this.value;this.dialect!=mxConstants.DIALECT_STRICTHTML&&(b=mxUtils.htmlEntities(b,!1));b=mxUtils.replaceTrailingNewlines(b,"<div>&nbsp;</div>");b=this.replaceLinefeeds?b.replace(/\n/g,"<br/>"):b;a.innerHTML='<div style="display:inline-block;_display:inline;">'+b+"</div>"}};
-mxText.prototype.updateHtmlFilter=function(){var a=this.node.style,b=this.margin.x,c=this.margin.y,d=this.scale;mxUtils.setOpacity(this.node,this.opacity);var e,f=0,g=null!=this.state?this.state.view.textDiv:null,k=this.node;if(null!=g){g.style.overflow="";g.style.height="";g.style.width="";this.updateFont(g);this.updateSize(g,!1);this.updateInnerHtml(g);var l=Math.round(this.bounds.width/this.scale);this.wrap&&0<l?(g.style.whiteSpace="normal",g.style.wordWrap=mxConstants.WORD_WRAP,e=l,this.clipped&&
-(e=Math.min(e,this.bounds.width)),g.style.width=e+"px"):g.style.whiteSpace="nowrap";k=g;null!=k.firstChild&&"DIV"==k.firstChild.nodeName&&(k=k.firstChild,this.wrap&&"break-word"==g.style.wordWrap&&(k.style.width="100%"));!this.clipped&&this.wrap&&0<l&&(e=k.offsetWidth+this.textWidthPadding,g.style.width=e+"px");f=k.offsetHeight+2;mxClient.IS_QUIRKS&&null!=this.border&&this.border!=mxConstants.NONE&&(f+=3)}else null!=k.firstChild&&"DIV"==k.firstChild.nodeName&&(k=k.firstChild,f=k.offsetHeight);e=k.offsetWidth+
-this.textWidthPadding;this.clipped&&(f=Math.min(f,this.bounds.height));l=this.bounds.width/d;g=this.bounds.height/d;"fill"==this.overflow?(f=g,e=l):"width"==this.overflow&&(f=k.scrollHeight,e=l);this.offsetWidth=e;this.offsetHeight=f;mxClient.IS_QUIRKS&&(this.clipped||"width"==this.overflow&&0<g)?(g=Math.min(g,f),a.height=Math.round(g)+"px"):g=f;"fill"!=this.overflow&&"width"!=this.overflow&&(this.clipped&&(e=Math.min(l,e)),l=e,mxClient.IS_QUIRKS&&this.clipped||this.wrap)&&(a.width=Math.round(l)+
-"px");var g=g*d,l=l*d,m=this.getTextRotation()*(Math.PI/180);e=parseFloat(parseFloat(Math.cos(m)).toFixed(8));f=parseFloat(parseFloat(Math.sin(-m)).toFixed(8));m%=2*Math.PI;0>m&&(m+=2*Math.PI);m%=Math.PI;m>Math.PI/2&&(m=Math.PI-m);var k=Math.cos(m),n=Math.sin(-m),b=l*-(b+.5),p=g*-(c+.5);0!=m&&(c="progid:DXImageTransform.Microsoft.Matrix(M11="+e+", M12="+f+", M21="+-f+", M22="+e+", sizingMethod='auto expand')",a.filter=null!=a.filter&&0<a.filter.length?a.filter+(" "+c):c);c=0;"fill"!=this.overflow&&
-mxClient.IS_QUIRKS&&(c=this.valign==mxConstants.ALIGN_TOP?c-1:this.valign==mxConstants.ALIGN_BOTTOM?c+2:c+1);a.zoom=d;a.left=Math.round(this.bounds.x+((l-l*k+g*n)/2-e*b-f*p)-l/2)+"px";a.top=Math.round(this.bounds.y+((g-g*k+l*n)/2+f*b-e*p)-g/2+c)+"px"};
-mxText.prototype.updateValue=function(){if(mxUtils.isNode(this.value))this.node.innerHTML="",this.node.appendChild(this.value);else{var a=this.value;this.dialect!=mxConstants.DIALECT_STRICTHTML&&(a=mxUtils.htmlEntities(a,!1));var a=mxUtils.replaceTrailingNewlines(a,"<div><br></div>"),a=this.replaceLinefeeds?a.replace(/\n/g,"<br/>"):a,b=null!=this.background&&this.background!=mxConstants.NONE?this.background:null,c=null!=this.border&&this.border!=mxConstants.NONE?this.border:null;if("fill"==this.overflow||
-"width"==this.overflow)null!=b&&(this.node.style.backgroundColor=b),null!=c&&(this.node.style.border="1px solid "+c);else{var d="";null!=b&&(d+="background-color:"+mxUtils.htmlEntities(b)+";");null!=c&&(d+="border:1px solid "+mxUtils.htmlEntities(c)+";");a='<div style="zoom:1;'+d+"display:inline-block;_display:inline;text-decoration:inherit;padding-bottom:1px;padding-right:1px;line-height:"+(mxConstants.ABSOLUTE_LINE_HEIGHT?this.size*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT)+'">'+a+"</div>"}this.node.innerHTML=
-a;a=this.node.getElementsByTagName("div");0<a.length&&(b=this.textDirection,b==mxConstants.TEXT_DIRECTION_AUTO&&this.dialect!=mxConstants.DIALECT_STRICTHTML&&(b=this.getAutoDirection()),b==mxConstants.TEXT_DIRECTION_LTR||b==mxConstants.TEXT_DIRECTION_RTL?a[a.length-1].setAttribute("dir",b):a[a.length-1].removeAttribute("dir"))}};
-mxText.prototype.updateFont=function(a){a=a.style;a.lineHeight=mxConstants.ABSOLUTE_LINE_HEIGHT?this.size*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT;a.fontSize=this.size+"px";a.fontFamily=this.family;a.verticalAlign="top";a.color=this.color;a.fontWeight=(this.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD?"bold":"";a.fontStyle=(this.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC?"italic":"";var b=[];(this.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&
-b.push("underline");(this.fontStyle&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&b.push("line-through");a.textDecoration=b.join(" ");a.textAlign=this.align==mxConstants.ALIGN_CENTER?"center":this.align==mxConstants.ALIGN_RIGHT?"right":"left"};
-mxText.prototype.updateSize=function(a,b){var c=Math.max(0,Math.round(this.bounds.width/this.scale)),d=Math.max(0,Math.round(this.bounds.height/this.scale)),e=a.style;this.clipped?(e.overflow="hidden",mxClient.IS_QUIRKS?e.width=c+"px":(e.maxHeight=d+"px",e.maxWidth=c+"px")):"fill"==this.overflow?(e.width=c+1+"px",e.height=d+1+"px",e.overflow="hidden"):"width"==this.overflow?(e.width=c+1+"px",e.maxHeight=d+1+"px",e.overflow="hidden"):"block"==this.overflow&&(e.width=c+1+"px");if(this.wrap&&0<c){if(e.wordWrap=
-mxConstants.WORD_WRAP,e.whiteSpace="normal",e.width=c+"px",b&&"fill"!=this.overflow&&"width"!=this.overflow){d=a;null!=d.firstChild&&"DIV"==d.firstChild.nodeName&&(d=d.firstChild,"break-word"==a.style.wordWrap&&(d.style.width="100%"));var f=d.offsetWidth;if(0==f){var g=a.parentNode;a.style.visibility="hidden";document.body.appendChild(a);f=d.offsetWidth;a.style.visibility="";g.appendChild(a)}f+=3;this.clipped&&(f=Math.min(f,c));e.width=f+"px"}}else e.whiteSpace="nowrap"};
-mxText.prototype.updateMargin=function(){this.margin=mxUtils.getAlignmentAsPoint(this.align,this.valign)};
-mxText.prototype.getSpacing=function(){return new mxPoint(this.align==mxConstants.ALIGN_CENTER?(this.spacingLeft-this.spacingRight)/2:this.align==mxConstants.ALIGN_RIGHT?-this.spacingRight-this.baseSpacingRight:this.spacingLeft+this.baseSpacingLeft,this.valign==mxConstants.ALIGN_MIDDLE?(this.spacingTop-this.spacingBottom)/2:this.valign==mxConstants.ALIGN_BOTTOM?-this.spacingBottom-this.baseSpacingBottom:this.spacingTop+this.baseSpacingTop)};function mxTriangle(){mxActor.call(this)}
-mxUtils.extend(mxTriangle,mxActor);mxTriangle.prototype.isRoundable=function(){return!0};mxTriangle.prototype.redrawPath=function(a,b,c,d,e){b=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/2;this.addPoints(a,[new mxPoint(0,0),new mxPoint(d,.5*e),new mxPoint(0,e)],this.isRounded,b,!0)};function mxHexagon(){mxActor.call(this)}mxUtils.extend(mxHexagon,mxActor);
-mxHexagon.prototype.redrawPath=function(a,b,c,d,e){b=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/2;this.addPoints(a,[new mxPoint(.25*d,0),new mxPoint(.75*d,0),new mxPoint(d,.5*e),new mxPoint(.75*d,e),new mxPoint(.25*d,e),new mxPoint(0,.5*e)],this.isRounded,b,!0)};function mxLine(a,b,c,d){mxShape.call(this);this.bounds=a;this.stroke=b;this.strokewidth=null!=c?c:1;this.vertical=null!=d?d:this.vertical}mxUtils.extend(mxLine,mxShape);mxLine.prototype.vertical=!1;
-mxLine.prototype.paintVertexShape=function(a,b,c,d,e){a.begin();if(this.vertical){var f=b+d/2;a.moveTo(f,c);a.lineTo(f,c+e)}else f=c+e/2,a.moveTo(b,f),a.lineTo(b+d,f);a.stroke()};function mxImageShape(a,b,c,d,e){mxShape.call(this);this.bounds=a;this.image=b;this.fill=c;this.stroke=d;this.strokewidth=null!=e?e:1;this.shadow=!1}mxUtils.extend(mxImageShape,mxRectangleShape);mxImageShape.prototype.preserveImageAspect=!0;mxImageShape.prototype.getSvgScreenOffset=function(){return 0};
-mxImageShape.prototype.apply=function(a){mxShape.prototype.apply.apply(this,arguments);this.gradient=this.stroke=this.fill=null;null!=this.style&&(this.preserveImageAspect=1==mxUtils.getNumber(this.style,mxConstants.STYLE_IMAGE_ASPECT,1),this.flipH=this.flipH||1==mxUtils.getValue(this.style,"imageFlipH",0),this.flipV=this.flipV||1==mxUtils.getValue(this.style,"imageFlipV",0))};mxImageShape.prototype.isHtmlAllowed=function(){return!this.preserveImageAspect};
-mxImageShape.prototype.createHtml=function(){var a=document.createElement("div");a.style.position="absolute";return a};mxImageShape.prototype.isRoundable=function(a,b,c,d,e){return!1};
-mxImageShape.prototype.paintVertexShape=function(a,b,c,d,e){if(null!=this.image){var f=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_BACKGROUND,null),g=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_BORDER,null);null!=f&&(a.setFillColor(f),a.setStrokeColor(g),a.rect(b,c,d,e),a.fillAndStroke());a.image(b,c,d,e,this.image,this.preserveImageAspect,!1,!1);g=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_BORDER,null);null!=g&&(a.setShadow(!1),a.setStrokeColor(g),a.rect(b,c,d,e),a.stroke())}else mxRectangleShape.prototype.paintBackground.apply(this,
-arguments)};
-mxImageShape.prototype.redrawHtmlShape=function(){this.node.style.left=Math.round(this.bounds.x)+"px";this.node.style.top=Math.round(this.bounds.y)+"px";this.node.style.width=Math.max(0,Math.round(this.bounds.width))+"px";this.node.style.height=Math.max(0,Math.round(this.bounds.height))+"px";this.node.innerHTML="";if(null!=this.image){var a=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_BACKGROUND,""),b=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_BORDER,"");this.node.style.backgroundColor=a;
-this.node.style.borderColor=b;a=document.createElement(mxClient.IS_IE6||(null==document.documentMode||8>=document.documentMode)&&0!=this.rotation?mxClient.VML_PREFIX+":image":"img");a.setAttribute("border","0");a.style.position="absolute";a.src=this.image;b=100>this.opacity?"alpha(opacity="+this.opacity+")":"";this.node.style.filter=b;this.flipH&&this.flipV?b+="progid:DXImageTransform.Microsoft.BasicImage(rotation=2)":this.flipH?b+="progid:DXImageTransform.Microsoft.BasicImage(mirror=1)":this.flipV&&
-(b+="progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)");a.style.filter!=b&&(a.style.filter=b);"image"==a.nodeName?a.style.rotation=this.rotation:0!=this.rotation?mxUtils.setPrefixedStyle(a.style,"transform","rotate("+this.rotation+"deg)"):mxUtils.setPrefixedStyle(a.style,"transform","");a.style.width=this.node.style.width;a.style.height=this.node.style.height;this.node.style.backgroundImage="";this.node.appendChild(a)}else this.setTransparentBackgroundImage(this.node)};
-function mxLabel(a,b,c,d){mxRectangleShape.call(this,a,b,c,d)}mxUtils.extend(mxLabel,mxRectangleShape);mxLabel.prototype.imageSize=mxConstants.DEFAULT_IMAGESIZE;mxLabel.prototype.spacing=2;mxLabel.prototype.indicatorSize=10;mxLabel.prototype.indicatorSpacing=2;mxLabel.prototype.init=function(a){mxShape.prototype.init.apply(this,arguments);null!=this.indicatorShape&&(this.indicator=new this.indicatorShape,this.indicator.dialect=this.dialect,this.indicator.init(this.node))};
-mxLabel.prototype.redraw=function(){null!=this.indicator&&(this.indicator.fill=this.indicatorColor,this.indicator.stroke=this.indicatorStrokeColor,this.indicator.gradient=this.indicatorGradientColor,this.indicator.direction=this.indicatorDirection,this.indicator.redraw());mxShape.prototype.redraw.apply(this,arguments)};mxLabel.prototype.isHtmlAllowed=function(){return mxRectangleShape.prototype.isHtmlAllowed.apply(this,arguments)&&null==this.indicatorColor&&null==this.indicatorShape};
-mxLabel.prototype.paintForeground=function(a,b,c,d,e){this.paintImage(a,b,c,d,e);this.paintIndicator(a,b,c,d,e);mxRectangleShape.prototype.paintForeground.apply(this,arguments)};mxLabel.prototype.paintImage=function(a,b,c,d,e){null!=this.image&&(b=this.getImageBounds(b,c,d,e),a.image(b.x,b.y,b.width,b.height,this.image,!1,!1,!1))};
-mxLabel.prototype.getImageBounds=function(a,b,c,d){var e=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_ALIGN,mxConstants.ALIGN_LEFT),f=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_VERTICAL_ALIGN,mxConstants.ALIGN_MIDDLE),g=mxUtils.getNumber(this.style,mxConstants.STYLE_IMAGE_WIDTH,mxConstants.DEFAULT_IMAGESIZE),k=mxUtils.getNumber(this.style,mxConstants.STYLE_IMAGE_HEIGHT,mxConstants.DEFAULT_IMAGESIZE),l=mxUtils.getNumber(this.style,mxConstants.STYLE_SPACING,this.spacing)+5;a=e==mxConstants.ALIGN_CENTER?
-a+(c-g)/2:e==mxConstants.ALIGN_RIGHT?a+(c-g-l):a+l;b=f==mxConstants.ALIGN_TOP?b+l:f==mxConstants.ALIGN_BOTTOM?b+(d-k-l):b+(d-k)/2;return new mxRectangle(a,b,g,k)};mxLabel.prototype.paintIndicator=function(a,b,c,d,e){null!=this.indicator?(this.indicator.bounds=this.getIndicatorBounds(b,c,d,e),this.indicator.paint(a)):null!=this.indicatorImage&&(b=this.getIndicatorBounds(b,c,d,e),a.image(b.x,b.y,b.width,b.height,this.indicatorImage,!1,!1,!1))};
-mxLabel.prototype.getIndicatorBounds=function(a,b,c,d){var e=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_ALIGN,mxConstants.ALIGN_LEFT),f=mxUtils.getValue(this.style,mxConstants.STYLE_IMAGE_VERTICAL_ALIGN,mxConstants.ALIGN_MIDDLE),g=mxUtils.getNumber(this.style,mxConstants.STYLE_INDICATOR_WIDTH,this.indicatorSize),k=mxUtils.getNumber(this.style,mxConstants.STYLE_INDICATOR_HEIGHT,this.indicatorSize),l=this.spacing+5;a=e==mxConstants.ALIGN_RIGHT?a+(c-g-l):e==mxConstants.ALIGN_CENTER?a+(c-g)/
-2:a+l;b=f==mxConstants.ALIGN_BOTTOM?b+(d-k-l):f==mxConstants.ALIGN_TOP?b+l:b+(d-k)/2;return new mxRectangle(a,b,g,k)};
-mxLabel.prototype.redrawHtmlShape=function(){for(mxRectangleShape.prototype.redrawHtmlShape.apply(this,arguments);this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);if(null!=this.image){var a=document.createElement("img");a.style.position="relative";a.setAttribute("border","0");var b=this.getImageBounds(this.bounds.x,this.bounds.y,this.bounds.width,this.bounds.height);b.x-=this.bounds.x;b.y-=this.bounds.y;a.style.left=Math.round(b.x)+"px";a.style.top=Math.round(b.y)+"px";a.style.width=
-Math.round(b.width)+"px";a.style.height=Math.round(b.height)+"px";a.src=this.image;this.node.appendChild(a)}};function mxCylinder(a,b,c,d){mxShape.call(this);this.bounds=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1}mxUtils.extend(mxCylinder,mxShape);mxCylinder.prototype.maxHeight=40;mxCylinder.prototype.svgStrokeTolerance=0;
-mxCylinder.prototype.paintVertexShape=function(a,b,c,d,e){a.translate(b,c);a.begin();this.redrawPath(a,b,c,d,e,!1);a.fillAndStroke();this.outline&&null!=this.style&&0!=mxUtils.getValue(this.style,mxConstants.STYLE_BACKGROUND_OUTLINE,0)||(a.setShadow(!1),a.begin(),this.redrawPath(a,b,c,d,e,!0),a.stroke())};mxCylinder.prototype.getCylinderSize=function(a,b,c,d){return Math.min(this.maxHeight,Math.round(d/5))};
-mxCylinder.prototype.redrawPath=function(a,b,c,d,e,f){b=this.getCylinderSize(b,c,d,e);if(f&&null!=this.fill||!f&&null==this.fill)a.moveTo(0,b),a.curveTo(0,2*b,d,2*b,d,b),f||(a.stroke(),a.begin());f||(a.moveTo(0,b),a.curveTo(0,-b/3,d,-b/3,d,b),a.lineTo(d,e-b),a.curveTo(d,e+b/3,0,e+b/3,0,e-b),a.close())};function mxConnector(a,b,c){mxPolyline.call(this,a,b,c)}mxUtils.extend(mxConnector,mxPolyline);
-mxConnector.prototype.updateBoundingBox=function(){this.useSvgBoundingBox=null!=this.style&&1==this.style[mxConstants.STYLE_CURVED];mxShape.prototype.updateBoundingBox.apply(this,arguments)};mxConnector.prototype.paintEdgeShape=function(a,b){var c=this.createMarker(a,b,!0),d=this.createMarker(a,b,!1);mxPolyline.prototype.paintEdgeShape.apply(this,arguments);a.setFillColor(this.stroke);a.setShadow(!1);a.setDashed(!1);null!=c&&c();null!=d&&d()};
-mxConnector.prototype.createMarker=function(a,b,c){var d=null,e=b.length,f=mxUtils.getValue(this.style,c?mxConstants.STYLE_STARTARROW:mxConstants.STYLE_ENDARROW),g=c?b[1]:b[e-2],k=c?b[0]:b[e-1];if(null!=f&&null!=g&&null!=k){for(d=1;d<e-1&&0==Math.round(g.x-k.x)&&0==Math.round(g.y-k.y);)g=c?b[1+d]:b[e-2-d],d++;b=k.x-g.x;e=k.y-g.y;d=Math.max(1,Math.sqrt(b*b+e*e));g=b/d;b=e/d;e=mxUtils.getNumber(this.style,c?mxConstants.STYLE_STARTSIZE:mxConstants.STYLE_ENDSIZE,mxConstants.DEFAULT_MARKERSIZE);d=mxMarker.createMarker(a,
-this,f,k,g,b,e,c,this.strokewidth,0!=this.style[c?mxConstants.STYLE_STARTFILL:mxConstants.STYLE_ENDFILL])}return d};
-mxConnector.prototype.augmentBoundingBox=function(a){mxShape.prototype.augmentBoundingBox.apply(this,arguments);var b=0;mxUtils.getValue(this.style,mxConstants.STYLE_STARTARROW,mxConstants.NONE)!=mxConstants.NONE&&(b=mxUtils.getNumber(this.style,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_MARKERSIZE)+1);mxUtils.getValue(this.style,mxConstants.STYLE_ENDARROW,mxConstants.NONE)!=mxConstants.NONE&&(b=Math.max(b,mxUtils.getNumber(this.style,mxConstants.STYLE_ENDSIZE,mxConstants.DEFAULT_MARKERSIZE))+
-1);a.grow(b*this.scale)};function mxSwimlane(a,b,c,d){mxShape.call(this);this.bounds=a;this.fill=b;this.stroke=c;this.strokewidth=null!=d?d:1}mxUtils.extend(mxSwimlane,mxShape);mxSwimlane.prototype.imageSize=16;mxSwimlane.prototype.isRoundable=function(a,b,c,d,e){return!0};mxSwimlane.prototype.getTitleSize=function(){return Math.max(0,mxUtils.getValue(this.style,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE))};
-mxSwimlane.prototype.getLabelBounds=function(a){var b=this.getTitleSize();a=new mxRectangle(a.x,a.y,a.width,a.height);var c=this.isHorizontal(),d=1==mxUtils.getValue(this.style,mxConstants.STYLE_FLIPH,0),e=1==mxUtils.getValue(this.style,mxConstants.STYLE_FLIPV,0),f=this.direction==mxConstants.DIRECTION_NORTH||this.direction==mxConstants.DIRECTION_SOUTH,c=c==!f,d=!c&&d!=(this.direction==mxConstants.DIRECTION_SOUTH||this.direction==mxConstants.DIRECTION_WEST),e=c&&e!=(this.direction==mxConstants.DIRECTION_SOUTH||
-this.direction==mxConstants.DIRECTION_WEST);if(f){b=Math.min(a.width,b*this.scale);if(d||e)a.x+=a.width-b;a.width=b}else{b=Math.min(a.height,b*this.scale);if(d||e)a.y+=a.height-b;a.height=b}return a};mxSwimlane.prototype.getGradientBounds=function(a,b,c,d,e){a=this.getTitleSize();if(this.isHorizontal())return a=Math.min(a,e),new mxRectangle(b,c,d,a);a=Math.min(a,d);return new mxRectangle(b,c,a,e)};
-mxSwimlane.prototype.getSwimlaneArcSize=function(a,b,c){if("1"==mxUtils.getValue(this.style,mxConstants.STYLE_ABSOLUTE_ARCSIZE,0))return Math.min(a/2,Math.min(b/2,mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/2));a=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,100*mxConstants.RECTANGLE_ROUNDING_FACTOR)/100;return c*a*3};mxSwimlane.prototype.isHorizontal=function(){return 1==mxUtils.getValue(this.style,mxConstants.STYLE_HORIZONTAL,1)};
-mxSwimlane.prototype.paintVertexShape=function(a,b,c,d,e){var f=this.getTitleSize(),g=mxUtils.getValue(this.style,mxConstants.STYLE_SWIMLANE_FILLCOLOR,mxConstants.NONE),k=1==mxUtils.getValue(this.style,mxConstants.STYLE_SWIMLANE_LINE,1),l=0,f=this.isHorizontal()?Math.min(f,e):Math.min(f,d);a.translate(b,c);this.isRounded?(l=this.getSwimlaneArcSize(d,e,f),l=Math.min((this.isHorizontal()?e:d)-f,Math.min(f,l)),this.paintRoundedSwimlane(a,b,c,d,e,f,l,g,k)):this.paintSwimlane(a,b,c,d,e,f,g,k);g=mxUtils.getValue(this.style,
-mxConstants.STYLE_SEPARATORCOLOR,mxConstants.NONE);this.paintSeparator(a,b,c,d,e,f,g);null!=this.image&&(e=this.getImageBounds(b,c,d,e),a.image(e.x-b,e.y-c,e.width,e.height,this.image,!1,!1,!1));this.glass&&(a.setShadow(!1),this.paintGlassEffect(a,0,0,d,f,l))};
-mxSwimlane.prototype.paintSwimlane=function(a,b,c,d,e,f,g,k){a.begin();var l=!0;null!=this.style&&(l="1"==mxUtils.getValue(this.style,mxConstants.STYLE_POINTER_EVENTS,"1"));l||null!=this.fill&&this.fill!=mxConstants.NONE||(a.pointerEvents=!1);this.isHorizontal()?(a.moveTo(0,f),a.lineTo(0,0),a.lineTo(d,0),a.lineTo(d,f),a.fillAndStroke(),f<e&&(g!=mxConstants.NONE&&l||(a.pointerEvents=!1),g!=mxConstants.NONE&&a.setFillColor(g),a.begin(),a.moveTo(0,f),a.lineTo(0,e),a.lineTo(d,e),a.lineTo(d,f),g==mxConstants.NONE?
-a.stroke():a.fillAndStroke())):(a.moveTo(f,0),a.lineTo(0,0),a.lineTo(0,e),a.lineTo(f,e),a.fillAndStroke(),f<d&&(g!=mxConstants.NONE&&l||(a.pointerEvents=!1),g!=mxConstants.NONE&&a.setFillColor(g),a.begin(),a.moveTo(f,0),a.lineTo(d,0),a.lineTo(d,e),a.lineTo(f,e),g==mxConstants.NONE?a.stroke():a.fillAndStroke()));k&&this.paintDivider(a,b,c,d,e,f,g==mxConstants.NONE)};
-mxSwimlane.prototype.paintRoundedSwimlane=function(a,b,c,d,e,f,g,k,l){a.begin();var m=!0;null!=this.style&&(m="1"==mxUtils.getValue(this.style,mxConstants.STYLE_POINTER_EVENTS,"1"));m||null!=this.fill&&this.fill!=mxConstants.NONE||(a.pointerEvents=!1);this.isHorizontal()?(a.moveTo(d,f),a.lineTo(d,g),a.quadTo(d,0,d-Math.min(d/2,g),0),a.lineTo(Math.min(d/2,g),0),a.quadTo(0,0,0,g),a.lineTo(0,f),a.fillAndStroke(),f<e&&(k!=mxConstants.NONE&&m||(a.pointerEvents=!1),k!=mxConstants.NONE&&a.setFillColor(k),
-a.begin(),a.moveTo(0,f),a.lineTo(0,e-g),a.quadTo(0,e,Math.min(d/2,g),e),a.lineTo(d-Math.min(d/2,g),e),a.quadTo(d,e,d,e-g),a.lineTo(d,f),k==mxConstants.NONE?a.stroke():a.fillAndStroke())):(a.moveTo(f,0),a.lineTo(g,0),a.quadTo(0,0,0,Math.min(e/2,g)),a.lineTo(0,e-Math.min(e/2,g)),a.quadTo(0,e,g,e),a.lineTo(f,e),a.fillAndStroke(),f<d&&(k!=mxConstants.NONE&&m||(a.pointerEvents=!1),k!=mxConstants.NONE&&a.setFillColor(k),a.begin(),a.moveTo(f,e),a.lineTo(d-g,e),a.quadTo(d,e,d,e-Math.min(e/2,g)),a.lineTo(d,
-Math.min(e/2,g)),a.quadTo(d,0,d-g,0),a.lineTo(f,0),k==mxConstants.NONE?a.stroke():a.fillAndStroke()));l&&this.paintDivider(a,b,c,d,e,f,k==mxConstants.NONE)};mxSwimlane.prototype.paintDivider=function(a,b,c,d,e,f,g){g||a.setShadow(!1);a.begin();this.isHorizontal()?(a.moveTo(0,f),a.lineTo(d,f)):(a.moveTo(f,0),a.lineTo(f,e));a.stroke()};
-mxSwimlane.prototype.paintSeparator=function(a,b,c,d,e,f,g){g!=mxConstants.NONE&&(a.setStrokeColor(g),a.setDashed(!0),a.begin(),this.isHorizontal()?(a.moveTo(d,f),a.lineTo(d,e)):(a.moveTo(f,0),a.lineTo(d,0)),a.stroke(),a.setDashed(!1))};mxSwimlane.prototype.getImageBounds=function(a,b,c,d){return this.isHorizontal()?new mxRectangle(a+c-this.imageSize,b,this.imageSize,this.imageSize):new mxRectangle(a,b,this.imageSize,this.imageSize)};function mxGraphLayout(a){this.graph=a}
-mxGraphLayout.prototype.graph=null;mxGraphLayout.prototype.useBoundingBox=!0;mxGraphLayout.prototype.parent=null;mxGraphLayout.prototype.moveCell=function(a,b,c){};mxGraphLayout.prototype.resizeCell=function(a,b){};mxGraphLayout.prototype.execute=function(a){};mxGraphLayout.prototype.getGraph=function(){return this.graph};mxGraphLayout.prototype.getConstraint=function(a,b,c,d){return this.graph.getCurrentCellStyle(b)[a]};
-mxGraphLayout.traverse=function(a,b,c,d,e){if(null!=c&&null!=a&&(b=null!=b?b:!0,e=e||new mxDictionary,!e.get(a)&&(e.put(a,!0),d=c(a,d),null==d||d))&&(d=this.graph.model.getEdgeCount(a),0<d))for(var f=0;f<d;f++){var g=this.graph.model.getEdgeAt(a,f),k=this.graph.model.getTerminal(g,!0)==a;if(!b||k)k=this.graph.view.getVisibleTerminal(g,!k),this.traverse(k,b,c,g,e)}};
-mxGraphLayout.prototype.isAncestor=function(a,b,c){if(!c)return this.graph.model.getParent(b)==a;if(b==a)return!1;for(;null!=b&&b!=a;)b=this.graph.model.getParent(b);return b==a};mxGraphLayout.prototype.isVertexMovable=function(a){return this.graph.isCellMovable(a)};mxGraphLayout.prototype.isVertexIgnored=function(a){return!this.graph.getModel().isVertex(a)||!this.graph.isCellVisible(a)};
-mxGraphLayout.prototype.isEdgeIgnored=function(a){var b=this.graph.getModel();return!b.isEdge(a)||!this.graph.isCellVisible(a)||null==b.getTerminal(a,!0)||null==b.getTerminal(a,!1)};mxGraphLayout.prototype.setEdgeStyleEnabled=function(a,b){this.graph.setCellStyles(mxConstants.STYLE_NOEDGESTYLE,b?"0":"1",[a])};mxGraphLayout.prototype.setOrthogonalEdge=function(a,b){this.graph.setCellStyles(mxConstants.STYLE_ORTHOGONAL,b?"1":"0",[a])};
-mxGraphLayout.prototype.getParentOffset=function(a){var b=new mxPoint;if(null!=a&&a!=this.parent){var c=this.graph.getModel();if(c.isAncestor(this.parent,a))for(var d=c.getGeometry(a);a!=this.parent;)b.x+=d.x,b.y+=d.y,a=c.getParent(a),d=c.getGeometry(a)}return b};
-mxGraphLayout.prototype.setEdgePoints=function(a,b){if(null!=a){var c=this.graph.model,d=c.getGeometry(a);null==d?(d=new mxGeometry,d.setRelative(!0)):d=d.clone();if(null!=this.parent&&null!=b)for(var e=c.getParent(a),e=this.getParentOffset(e),f=0;f<b.length;f++)b[f].x-=e.x,b[f].y-=e.y;d.points=b;c.setGeometry(a,d)}};
-mxGraphLayout.prototype.setVertexLocation=function(a,b,c){var d=this.graph.getModel(),e=d.getGeometry(a),f=null;if(null!=e){f=new mxRectangle(b,c,e.width,e.height);if(this.useBoundingBox){var g=this.graph.getView().getState(a);if(null!=g&&null!=g.text&&null!=g.text.boundingBox){var k=this.graph.getView().scale,l=g.text.boundingBox;g.text.boundingBox.x<g.x&&(b+=(g.x-l.x)/k,f.width=l.width);g.text.boundingBox.y<g.y&&(c+=(g.y-l.y)/k,f.height=l.height)}}null!=this.parent&&(g=d.getParent(a),null!=g&&g!=
-this.parent&&(g=this.getParentOffset(g),b-=g.x,c-=g.y));if(e.x!=b||e.y!=c)e=e.clone(),e.x=b,e.y=c,d.setGeometry(a,e)}return f};
-mxGraphLayout.prototype.getVertexBounds=function(a){var b=this.graph.getModel().getGeometry(a);if(this.useBoundingBox){var c=this.graph.getView().getState(a);if(null!=c&&null!=c.text&&null!=c.text.boundingBox)var d=this.graph.getView().scale,e=c.text.boundingBox,f=Math.max(c.x-e.x,0)/d,g=Math.max(c.y-e.y,0)/d,b=new mxRectangle(b.x-f,b.y-g,b.width+f+Math.max(e.x+e.width-(c.x+c.width),0)/d,b.height+g+Math.max(e.y+e.height-(c.y+c.height),0)/d)}null!=this.parent&&(a=this.graph.getModel().getParent(a),
-b=b.clone(),null!=a&&a!=this.parent&&(a=this.getParentOffset(a),b.x+=a.x,b.y+=a.y));return new mxRectangle(b.x,b.y,b.width,b.height)};mxGraphLayout.prototype.arrangeGroups=function(a,b,c,d,e,f){return this.graph.updateGroupBounds(a,b,!0,c,d,e,f)};function WeightedCellSorter(a,b){this.cell=a;this.weightedValue=b}WeightedCellSorter.prototype.weightedValue=0;WeightedCellSorter.prototype.nudge=!1;WeightedCellSorter.prototype.visited=!1;WeightedCellSorter.prototype.rankIndex=null;
-WeightedCellSorter.prototype.cell=null;WeightedCellSorter.prototype.compare=function(a,b){return null!=a&&null!=b?b.weightedValue>a.weightedValue?-1:b.weightedValue<a.weightedValue?1:b.nudge?-1:1:0};function mxStackLayout(a,b,c,d,e,f){mxGraphLayout.call(this,a);this.horizontal=null!=b?b:!0;this.spacing=null!=c?c:0;this.x0=null!=d?d:0;this.y0=null!=e?e:0;this.border=null!=f?f:0}mxStackLayout.prototype=new mxGraphLayout;mxStackLayout.prototype.constructor=mxStackLayout;
-mxStackLayout.prototype.horizontal=null;mxStackLayout.prototype.spacing=null;mxStackLayout.prototype.x0=null;mxStackLayout.prototype.y0=null;mxStackLayout.prototype.border=0;mxStackLayout.prototype.marginTop=0;mxStackLayout.prototype.marginLeft=0;mxStackLayout.prototype.marginRight=0;mxStackLayout.prototype.marginBottom=0;mxStackLayout.prototype.keepFirstLocation=!1;mxStackLayout.prototype.fill=!1;mxStackLayout.prototype.resizeParent=!1;mxStackLayout.prototype.resizeParentMax=!1;
-mxStackLayout.prototype.resizeLast=!1;mxStackLayout.prototype.wrap=null;mxStackLayout.prototype.borderCollapse=!0;mxStackLayout.prototype.allowGaps=!1;mxStackLayout.prototype.gridSize=0;mxStackLayout.prototype.isHorizontal=function(){return this.horizontal};
-mxStackLayout.prototype.moveCell=function(a,b,c){var d=this.graph.getModel(),e=d.getParent(a),f=this.isHorizontal();if(null!=a&&null!=e){var g=0,k=d.getChildCount(e);c=f?b:c;b=this.graph.getView().getState(e);null!=b&&(c-=f?b.x:b.y);c/=this.graph.view.scale;for(b=0;b<k;b++){var l=d.getChildAt(e,b);if(l!=a&&(l=d.getGeometry(l),null!=l)){l=f?l.x+l.width/2:l.y+l.height/2;if(g<=c&&l>c)break;g=l}}f=e.getIndex(a);f=Math.max(0,b-(b>f?1:0));d.add(e,a,f)}};
-mxStackLayout.prototype.getParentSize=function(a){var b=this.graph.getModel(),c=b.getGeometry(a);null!=this.graph.container&&(null==c&&b.isLayer(a)||a==this.graph.getView().currentRoot)&&(c=new mxRectangle(0,0,this.graph.container.offsetWidth-1,this.graph.container.offsetHeight-1));return c};
-mxStackLayout.prototype.getLayoutCells=function(a){for(var b=this.graph.getModel(),c=b.getChildCount(a),d=[],e=0;e<c;e++){var f=b.getChildAt(a,e);!this.isVertexIgnored(f)&&this.isVertexMovable(f)&&d.push(f)}this.allowGaps&&d.sort(mxUtils.bind(this,function(a,b){var c=this.graph.getCellGeometry(a),d=this.graph.getCellGeometry(b);return this.horizontal?c.x==d.x?0:c.x>d.x>0?1:-1:c.y==d.y?0:c.y>d.y>0?1:-1}));return d};
-mxStackLayout.prototype.snap=function(a){if(null!=this.gridSize&&0<this.gridSize&&(a=Math.max(a,this.gridSize),1<a/this.gridSize)){var b=a%this.gridSize;a+=b>this.gridSize/2?this.gridSize-b:-b}return a};
-mxStackLayout.prototype.execute=function(a){if(null!=a){var b=this.getParentSize(a),c=this.isHorizontal(),d=this.graph.getModel(),e=null;null!=b&&(e=c?b.height-this.marginTop-this.marginBottom:b.width-this.marginLeft-this.marginRight);var e=e-2*this.border,f=this.x0+this.border+this.marginLeft,g=this.y0+this.border+this.marginTop;if(this.graph.isSwimlane(a)){var k=this.graph.getCellStyle(a),l=mxUtils.getNumber(k,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE),k=1==mxUtils.getValue(k,mxConstants.STYLE_HORIZONTAL,
-!0);null!=b&&(l=k?Math.min(l,b.height):Math.min(l,b.width));c==k&&(e-=l);k?g+=l:f+=l}d.beginUpdate();try{for(var l=0,k=null,m=0,n=null,p=this.getLayoutCells(a),q=0;q<p.length;q++){var r=p[q],t=d.getGeometry(r);if(null!=t){t=t.clone();null!=this.wrap&&null!=k&&(c&&k.x+k.width+t.width+2*this.spacing>this.wrap||!c&&k.y+k.height+t.height+2*this.spacing>this.wrap)&&(k=null,c?g+=l+this.spacing:f+=l+this.spacing,l=0);var l=Math.max(l,c?t.height:t.width),u=0;if(!this.borderCollapse)var x=this.graph.getCellStyle(r),
-u=mxUtils.getNumber(x,mxConstants.STYLE_STROKEWIDTH,1);if(null!=k){var y=m+this.spacing+Math.floor(u/2);c?t.x=this.snap((this.allowGaps?Math.max(y,t.x):y)-this.marginLeft)+this.marginLeft:t.y=this.snap((this.allowGaps?Math.max(y,t.y):y)-this.marginTop)+this.marginTop}else this.keepFirstLocation||(c?t.x=this.allowGaps&&t.x>f?Math.max(this.snap(t.x-this.marginLeft)+this.marginLeft,f):f:t.y=this.allowGaps&&t.y>g?Math.max(this.snap(t.y-this.marginTop)+this.marginTop,g):g);c?t.y=g:t.x=f;this.fill&&null!=
-e&&(c?t.height=e:t.width=e);c?t.width=this.snap(t.width):t.height=this.snap(t.height);this.setChildGeometry(r,t);n=r;k=t;m=c?k.x+k.width+Math.floor(u/2):k.y+k.height+Math.floor(u/2)}}this.resizeParent&&null!=b&&null!=k&&!this.graph.isCellCollapsed(a)?this.updateParentGeometry(a,b,k):this.resizeLast&&null!=b&&null!=k&&null!=n&&(c?k.width=b.width-k.x-this.spacing-this.marginRight-this.marginLeft:k.height=b.height-k.y-this.spacing-this.marginBottom,this.setChildGeometry(n,k))}finally{d.endUpdate()}}};
-mxStackLayout.prototype.setChildGeometry=function(a,b){var c=this.graph.getCellGeometry(a);null!=c&&b.x==c.x&&b.y==c.y&&b.width==c.width&&b.height==c.height||this.graph.getModel().setGeometry(a,b)};
-mxStackLayout.prototype.updateParentGeometry=function(a,b,c){var d=this.isHorizontal(),e=this.graph.getModel(),f=b.clone();d?(c=c.x+c.width+this.marginRight+this.border,f.width=this.resizeParentMax?Math.max(f.width,c):c):(c=c.y+c.height+this.marginBottom+this.border,f.height=this.resizeParentMax?Math.max(f.height,c):c);b.x==f.x&&b.y==f.y&&b.width==f.width&&b.height==f.height||e.setGeometry(a,f)};
-function mxPartitionLayout(a,b,c,d){mxGraphLayout.call(this,a);this.horizontal=null!=b?b:!0;this.spacing=c||0;this.border=d||0}mxPartitionLayout.prototype=new mxGraphLayout;mxPartitionLayout.prototype.constructor=mxPartitionLayout;mxPartitionLayout.prototype.horizontal=null;mxPartitionLayout.prototype.spacing=null;mxPartitionLayout.prototype.border=null;mxPartitionLayout.prototype.resizeVertices=!0;mxPartitionLayout.prototype.isHorizontal=function(){return this.horizontal};
-mxPartitionLayout.prototype.moveCell=function(a,b,c){c=this.graph.getModel();var d=c.getParent(a);if(null!=a&&null!=d){var e,f=0,g=c.getChildCount(d);for(e=0;e<g;e++){var k=c.getChildAt(d,e),k=this.getVertexBounds(k);if(null!=k){k=k.x+k.width/2;if(f<b&&k>b)break;f=k}}b=d.getIndex(a);b=Math.max(0,e-(e>b?1:0));c.add(d,a,b)}};
-mxPartitionLayout.prototype.execute=function(a){var b=this.isHorizontal(),c=this.graph.getModel(),d=c.getGeometry(a);null!=this.graph.container&&(null==d&&c.isLayer(a)||a==this.graph.getView().currentRoot)&&(d=new mxRectangle(0,0,this.graph.container.offsetWidth-1,this.graph.container.offsetHeight-1));if(null!=d){for(var e=[],f=c.getChildCount(a),g=0;g<f;g++){var k=c.getChildAt(a,g);!this.isVertexIgnored(k)&&this.isVertexMovable(k)&&e.push(k)}f=e.length;if(0<f){var l=this.border,m=this.border,n=b?
-d.height:d.width,n=n-2*this.border;a=this.graph.isSwimlane(a)?this.graph.getStartSize(a):new mxRectangle;n-=b?a.height:a.width;l+=a.width;m+=a.height;a=this.border+(f-1)*this.spacing;d=b?(d.width-l-a)/f:(d.height-m-a)/f;if(0<d){c.beginUpdate();try{for(g=0;g<f;g++){var k=e[g],p=c.getGeometry(k);null!=p&&(p=p.clone(),p.x=l,p.y=m,b?(this.resizeVertices&&(p.width=d,p.height=n),l+=d+this.spacing):(this.resizeVertices&&(p.height=d,p.width=n),m+=d+this.spacing),c.setGeometry(k,p))}}finally{c.endUpdate()}}}}};
-function mxCompactTreeLayout(a,b,c){mxGraphLayout.call(this,a);this.horizontal=null!=b?b:!0;this.invert=null!=c?c:!1}mxCompactTreeLayout.prototype=new mxGraphLayout;mxCompactTreeLayout.prototype.constructor=mxCompactTreeLayout;mxCompactTreeLayout.prototype.horizontal=null;mxCompactTreeLayout.prototype.invert=null;mxCompactTreeLayout.prototype.resizeParent=!0;mxCompactTreeLayout.prototype.maintainParentLocation=!1;mxCompactTreeLayout.prototype.groupPadding=10;
-mxCompactTreeLayout.prototype.groupPaddingTop=0;mxCompactTreeLayout.prototype.groupPaddingRight=0;mxCompactTreeLayout.prototype.groupPaddingBottom=0;mxCompactTreeLayout.prototype.groupPaddingLeft=0;mxCompactTreeLayout.prototype.parentsChanged=null;mxCompactTreeLayout.prototype.moveTree=!1;mxCompactTreeLayout.prototype.visited=null;mxCompactTreeLayout.prototype.levelDistance=10;mxCompactTreeLayout.prototype.nodeDistance=20;mxCompactTreeLayout.prototype.resetEdges=!0;
-mxCompactTreeLayout.prototype.prefHozEdgeSep=5;mxCompactTreeLayout.prototype.prefVertEdgeOff=4;mxCompactTreeLayout.prototype.minEdgeJetty=8;mxCompactTreeLayout.prototype.channelBuffer=4;mxCompactTreeLayout.prototype.edgeRouting=!0;mxCompactTreeLayout.prototype.sortEdges=!1;mxCompactTreeLayout.prototype.alignRanks=!1;mxCompactTreeLayout.prototype.maxRankHeight=null;mxCompactTreeLayout.prototype.root=null;mxCompactTreeLayout.prototype.node=null;
-mxCompactTreeLayout.prototype.isVertexIgnored=function(a){return mxGraphLayout.prototype.isVertexIgnored.apply(this,arguments)||0==this.graph.getConnections(a).length};mxCompactTreeLayout.prototype.isHorizontal=function(){return this.horizontal};
-mxCompactTreeLayout.prototype.execute=function(a,b){this.parent=a;var c=this.graph.getModel();if(null==b)if(0<this.graph.getEdges(a,c.getParent(a),this.invert,!this.invert,!1).length)this.root=a;else{var d=this.graph.findTreeRoots(a,!0,this.invert);if(0<d.length)for(var e=0;e<d.length;e++)if(!this.isVertexIgnored(d[e])&&0<this.graph.getEdges(d[e],null,this.invert,!this.invert,!1).length){this.root=d[e];break}}else this.root=b;if(null!=this.root){this.parentsChanged=this.resizeParent?{}:null;this.parentY=
-this.parentX=null;if(a!=this.root&&null!=c.isVertex(a)&&this.maintainParentLocation){var f=this.graph.getCellGeometry(a);null!=f&&(this.parentX=f.x,this.parentY=f.y)}c.beginUpdate();try{if(this.visited={},this.node=this.dfs(this.root,a),this.alignRanks&&(this.maxRankHeight=[],this.findRankHeights(this.node,0),this.setCellHeights(this.node,0)),null!=this.node){this.layout(this.node);var g=this.graph.gridSize,d=g;if(!this.moveTree){var k=this.getVertexBounds(this.root);null!=k&&(g=k.x,d=k.y)}k=null;
-k=this.isHorizontal()?this.horizontalLayout(this.node,g,d):this.verticalLayout(this.node,null,g,d);if(null!=k){var l=e=0;0>k.x&&(e=Math.abs(g-k.x));0>k.y&&(l=Math.abs(d-k.y));0==e&&0==l||this.moveNode(this.node,e,l);this.resizeParent&&this.adjustParents();this.edgeRouting&&this.localEdgeProcessing(this.node)}null!=this.parentX&&null!=this.parentY&&(f=this.graph.getCellGeometry(a),null!=f&&(f=f.clone(),f.x=this.parentX,f.y=this.parentY,c.setGeometry(a,f)))}}finally{c.endUpdate()}}};
-mxCompactTreeLayout.prototype.moveNode=function(a,b,c){a.x+=b;a.y+=c;this.apply(a);for(a=a.child;null!=a;)this.moveNode(a,b,c),a=a.next};
-mxCompactTreeLayout.prototype.sortOutgoingEdges=function(a,b){var c=new mxDictionary;b.sort(function(b,e){var d=b.getTerminal(b.getTerminal(!1)==a),g=c.get(d);null==g&&(g=mxCellPath.create(d).split(mxCellPath.PATH_SEPARATOR),c.put(d,g));var d=e.getTerminal(e.getTerminal(!1)==a),k=c.get(d);null==k&&(k=mxCellPath.create(d).split(mxCellPath.PATH_SEPARATOR),c.put(d,k));return mxCellPath.compare(g,k)})};
-mxCompactTreeLayout.prototype.findRankHeights=function(a,b){if(null==this.maxRankHeight[b]||this.maxRankHeight[b]<a.height)this.maxRankHeight[b]=a.height;for(var c=a.child;null!=c;)this.findRankHeights(c,b+1),c=c.next};mxCompactTreeLayout.prototype.setCellHeights=function(a,b){null!=this.maxRankHeight[b]&&this.maxRankHeight[b]>a.height&&(a.height=this.maxRankHeight[b]);for(var c=a.child;null!=c;)this.setCellHeights(c,b+1),c=c.next};
-mxCompactTreeLayout.prototype.dfs=function(a,b){var c=mxCellPath.create(a),d=null;if(null!=a&&null==this.visited[c]&&!this.isVertexIgnored(a)){this.visited[c]=a;var d=this.createNode(a),c=this.graph.getModel(),e=null,f=this.graph.getEdges(a,b,this.invert,!this.invert,!1,!0),g=this.graph.getView();this.sortEdges&&this.sortOutgoingEdges(a,f);for(var k=0;k<f.length;k++){var l=f[k];if(!this.isEdgeIgnored(l)){this.resetEdges&&this.setEdgePoints(l,null);this.edgeRouting&&(this.setEdgeStyleEnabled(l,!1),
-this.setEdgePoints(l,null));var m=g.getState(l),l=null!=m?m.getVisibleTerminal(this.invert):g.getVisibleTerminal(l,this.invert),m=this.dfs(l,b);null!=m&&null!=c.getGeometry(l)&&(null==e?d.child=m:e.next=m,e=m)}}}return d};mxCompactTreeLayout.prototype.layout=function(a){if(null!=a){for(var b=a.child;null!=b;)this.layout(b),b=b.next;null!=a.child?this.attachParent(a,this.join(a)):this.layoutLeaf(a)}};
-mxCompactTreeLayout.prototype.horizontalLayout=function(a,b,c,d){a.x+=b+a.offsetX;a.y+=c+a.offsetY;d=this.apply(a,d);b=a.child;if(null!=b){d=this.horizontalLayout(b,a.x,a.y,d);c=a.y+b.offsetY;for(var e=b.next;null!=e;)d=this.horizontalLayout(e,a.x+b.offsetX,c,d),c+=e.offsetY,e=e.next}return d};
-mxCompactTreeLayout.prototype.verticalLayout=function(a,b,c,d,e){a.x+=c+a.offsetY;a.y+=d+a.offsetX;e=this.apply(a,e);b=a.child;if(null!=b)for(e=this.verticalLayout(b,a,a.x,a.y,e),c=a.x+b.offsetY,d=b.next;null!=d;)e=this.verticalLayout(d,a,c,a.y+b.offsetX,e),c+=d.offsetY,d=d.next;return e};
-mxCompactTreeLayout.prototype.attachParent=function(a,b){var c=this.nodeDistance+this.levelDistance,d=(b-a.width)/2-this.nodeDistance,e=d+a.width+2*this.nodeDistance-b;a.child.offsetX=c+a.height;a.child.offsetY=e;a.contour.upperHead=this.createLine(a.height,0,this.createLine(c,e,a.contour.upperHead));a.contour.lowerHead=this.createLine(a.height,0,this.createLine(c,d,a.contour.lowerHead))};
-mxCompactTreeLayout.prototype.layoutLeaf=function(a){var b=2*this.nodeDistance;a.contour.upperTail=this.createLine(a.height+b,0);a.contour.upperHead=a.contour.upperTail;a.contour.lowerTail=this.createLine(0,-a.width-b);a.contour.lowerHead=this.createLine(a.height+b,0,a.contour.lowerTail)};
-mxCompactTreeLayout.prototype.join=function(a){var b=2*this.nodeDistance,c=a.child;a.contour=c.contour;for(var d=c.width+b,e=d,c=c.next;null!=c;){var f=this.merge(a.contour,c.contour);c.offsetY=f+d;c.offsetX=0;d=c.width+b;e+=f+d;c=c.next}return e};
-mxCompactTreeLayout.prototype.merge=function(a,b){for(var c=0,d=0,e=0,f=a.lowerHead,g=b.upperHead;null!=g&&null!=f;){var k=this.offset(c,d,g.dx,g.dy,f.dx,f.dy),d=d+k,e=e+k;c+g.dx<=f.dx?(c+=g.dx,d+=g.dy,g=g.next):(c-=f.dx,d-=f.dy,f=f.next)}null!=g?(c=this.bridge(a.upperTail,0,0,g,c,d),a.upperTail=null!=c.next?b.upperTail:c,a.lowerTail=b.lowerTail):(c=this.bridge(b.lowerTail,c,d,f,0,0),null==c.next&&(a.lowerTail=c));a.lowerHead=b.lowerHead;return e};
-mxCompactTreeLayout.prototype.offset=function(a,b,c,d,e,f){if(e<=a||0>=a+c)return 0;a=0<e*d-c*f?0>a?a*d/c-b:0<a?a*f/e-b:-b:e<a+c?f-(b+(e-a)*d/c):e>a+c?(c+a)*f/e-(b+d):f-(b+d);return 0<a?a:0};mxCompactTreeLayout.prototype.bridge=function(a,b,c,d,e,f){b=e+d.dx-b;0==d.dx?e=d.dy:(e=b*d.dy,e/=d.dx);b=this.createLine(b,e,d.next);a.next=this.createLine(0,f+d.dy-e-c,b);return b};
-mxCompactTreeLayout.prototype.createNode=function(a){var b={};b.cell=a;b.x=0;b.y=0;b.width=0;b.height=0;a=this.getVertexBounds(a);null!=a&&(this.isHorizontal()?(b.width=a.height,b.height=a.width):(b.width=a.width,b.height=a.height));b.offsetX=0;b.offsetY=0;b.contour={};return b};
-mxCompactTreeLayout.prototype.apply=function(a,b){var c=this.graph.getModel(),d=a.cell,e=c.getGeometry(d);null!=d&&null!=e&&(this.isVertexMovable(d)&&(e=this.setVertexLocation(d,a.x,a.y),this.resizeParent&&(c=c.getParent(d),d=mxCellPath.create(c),null==this.parentsChanged[d]&&(this.parentsChanged[d]=c))),b=null==b?new mxRectangle(e.x,e.y,e.width,e.height):new mxRectangle(Math.min(b.x,e.x),Math.min(b.y,e.y),Math.max(b.x+b.width,e.x+e.width),Math.max(b.y+b.height,e.y+e.height)));return b};
-mxCompactTreeLayout.prototype.createLine=function(a,b,c){var d={};d.dx=a;d.dy=b;d.next=c;return d};mxCompactTreeLayout.prototype.adjustParents=function(){var a=[],b;for(b in this.parentsChanged)a.push(this.parentsChanged[b]);this.arrangeGroups(mxUtils.sortCells(a,!0),this.groupPadding,this.groupPaddingTop,this.groupPaddingRight,this.groupPaddingBottom,this.groupPaddingLeft)};
-mxCompactTreeLayout.prototype.localEdgeProcessing=function(a){this.processNodeOutgoing(a);for(a=a.child;null!=a;)this.localEdgeProcessing(a),a=a.next};
-mxCompactTreeLayout.prototype.processNodeOutgoing=function(a){for(var b=a.child,c=a.cell,d=0,e=[];null!=b;){d++;var f=b.x;this.horizontal&&(f=b.y);e.push(new WeightedCellSorter(b,f));b=b.next}e.sort(WeightedCellSorter.prototype.compare);var f=a.width,g=(d+1)*this.prefHozEdgeSep;f>g+2*this.prefHozEdgeSep&&(f-=2*this.prefHozEdgeSep);a=f/d;b=a/2;f>g+2*this.prefHozEdgeSep&&(b+=this.prefHozEdgeSep);for(var f=this.minEdgeJetty-this.prefVertEdgeOff,g=this.getVertexBounds(c),k=0;k<e.length;k++){for(var l=
-e[k].cell.cell,m=this.getVertexBounds(l),l=this.graph.getEdgesBetween(c,l,!1),n=[],p,q,r=0;r<l.length;r++)this.horizontal?(p=g.x+g.width,q=g.y+b,n.push(new mxPoint(p,q)),p=g.x+g.width+f,n.push(new mxPoint(p,q)),q=m.y+m.height/2):(p=g.x+b,q=g.y+g.height,n.push(new mxPoint(p,q)),q=g.y+g.height+f,n.push(new mxPoint(p,q)),p=m.x+m.width/2),n.push(new mxPoint(p,q)),this.setEdgePoints(l[r],n);k<d/2?f+=this.prefVertEdgeOff:k>d/2&&(f-=this.prefVertEdgeOff);b+=a}};
-function mxRadialTreeLayout(a){mxCompactTreeLayout.call(this,a,!1)}mxUtils.extend(mxRadialTreeLayout,mxCompactTreeLayout);mxRadialTreeLayout.prototype.angleOffset=.5;mxRadialTreeLayout.prototype.rootx=0;mxRadialTreeLayout.prototype.rooty=0;mxRadialTreeLayout.prototype.levelDistance=120;mxRadialTreeLayout.prototype.nodeDistance=10;mxRadialTreeLayout.prototype.autoRadius=!1;mxRadialTreeLayout.prototype.sortEdges=!1;mxRadialTreeLayout.prototype.rowMinX=[];mxRadialTreeLayout.prototype.rowMaxX=[];
-mxRadialTreeLayout.prototype.rowMinCenX=[];mxRadialTreeLayout.prototype.rowMaxCenX=[];mxRadialTreeLayout.prototype.rowRadi=[];mxRadialTreeLayout.prototype.row=[];mxRadialTreeLayout.prototype.isVertexIgnored=function(a){return mxGraphLayout.prototype.isVertexIgnored.apply(this,arguments)||0==this.graph.getConnections(a).length};
-mxRadialTreeLayout.prototype.execute=function(a,b){this.parent=a;this.edgeRouting=this.useBoundingBox=!1;mxCompactTreeLayout.prototype.execute.apply(this,arguments);var c=null,d=this.getVertexBounds(this.root);this.centerX=d.x+d.width/2;this.centerY=d.y+d.height/2;for(var e in this.visited){var f=this.getVertexBounds(this.visited[e]),c=null!=c?c:f.clone();c.add(f)}this.calcRowDims([this.node],0);for(var g=0,k=0,c=0;c<this.row.length;c++)e=(this.rowMaxX[c]-this.centerX-this.nodeDistance)/this.rowRadi[c],
-g=Math.max(g,(this.centerX-this.rowMinX[c]-this.nodeDistance)/this.rowRadi[c]),k=Math.max(k,e);for(c=0;c<this.row.length;c++){var l=this.centerX-this.nodeDistance-g*this.rowRadi[c],m=this.centerX+this.nodeDistance+k*this.rowRadi[c]-l;for(e=0;e<this.row[c].length;e++)f=this.row[c],d=f[e],f=this.getVertexBounds(d.cell),d.theta=(f.x+f.width/2-l)/m*Math.PI*2}for(c=this.row.length-2;0<=c;c--)for(f=this.row[c],e=0;e<f.length;e++){d=f[e];g=d.child;for(l=k=0;null!=g;)l+=g.theta,k++,g=g.next;0<k&&(g=l/k,g>
-d.theta&&e<f.length-1?d.theta=Math.min(g,f[e+1].theta-Math.PI/10):g<d.theta&&0<e&&(d.theta=Math.max(g,f[e-1].theta+Math.PI/10)))}for(c=0;c<this.row.length;c++)for(e=0;e<this.row[c].length;e++)f=this.row[c],d=f[e],f=this.getVertexBounds(d.cell),this.setVertexLocation(d.cell,this.centerX-f.width/2+this.rowRadi[c]*Math.cos(d.theta),this.centerY-f.height/2+this.rowRadi[c]*Math.sin(d.theta))};
-mxRadialTreeLayout.prototype.calcRowDims=function(a,b){if(null!=a&&0!=a.length){this.rowMinX[b]=this.centerX;this.rowMaxX[b]=this.centerX;this.rowMinCenX[b]=this.centerX;this.rowMaxCenX[b]=this.centerX;this.row[b]=[];for(var c=!1,d=0;d<a.length;d++)for(var e=null!=a[d]?a[d].child:null;null!=e;){var f=this.getVertexBounds(e.cell);this.rowMinX[b]=Math.min(f.x,this.rowMinX[b]);this.rowMaxX[b]=Math.max(f.x+f.width,this.rowMaxX[b]);this.rowMinCenX[b]=Math.min(f.x+f.width/2,this.rowMinCenX[b]);this.rowMaxCenX[b]=
-Math.max(f.x+f.width/2,this.rowMaxCenX[b]);this.rowRadi[b]=f.y-this.getVertexBounds(this.root).y;null!=e.child&&(c=!0);this.row[b].push(e);e=e.next}c&&this.calcRowDims(this.row[b],b+1)}};function mxFastOrganicLayout(a){mxGraphLayout.call(this,a)}mxFastOrganicLayout.prototype=new mxGraphLayout;mxFastOrganicLayout.prototype.constructor=mxFastOrganicLayout;mxFastOrganicLayout.prototype.useInputOrigin=!0;mxFastOrganicLayout.prototype.resetEdges=!0;mxFastOrganicLayout.prototype.disableEdgeStyle=!0;
-mxFastOrganicLayout.prototype.forceConstant=50;mxFastOrganicLayout.prototype.forceConstantSquared=0;mxFastOrganicLayout.prototype.minDistanceLimit=2;mxFastOrganicLayout.prototype.maxDistanceLimit=500;mxFastOrganicLayout.prototype.minDistanceLimitSquared=4;mxFastOrganicLayout.prototype.initialTemp=200;mxFastOrganicLayout.prototype.temperature=0;mxFastOrganicLayout.prototype.maxIterations=0;mxFastOrganicLayout.prototype.iteration=0;mxFastOrganicLayout.prototype.allowedToRun=!0;
-mxFastOrganicLayout.prototype.isVertexIgnored=function(a){return mxGraphLayout.prototype.isVertexIgnored.apply(this,arguments)||0==this.graph.getConnections(a).length};
-mxFastOrganicLayout.prototype.execute=function(a){var b=this.graph.getModel();this.vertexArray=[];for(var c=this.graph.getChildVertices(a),d=0;d<c.length;d++)this.isVertexIgnored(c[d])||this.vertexArray.push(c[d]);var e=this.useInputOrigin?this.graph.getBoundingBoxFromGeometry(this.vertexArray):null,f=this.vertexArray.length;this.indices=[];this.dispX=[];this.dispY=[];this.cellLocation=[];this.isMoveable=[];this.neighbours=[];this.radius=[];this.radiusSquared=[];.001>this.forceConstant&&(this.forceConstant=
-.001);this.forceConstantSquared=this.forceConstant*this.forceConstant;for(d=0;d<this.vertexArray.length;d++){var g=this.vertexArray[d];this.cellLocation[d]=[];var k=mxObjectIdentity.get(g);this.indices[k]=d;var l=this.getVertexBounds(g),m=l.width,n=l.height,p=l.x,q=l.y;this.cellLocation[d][0]=p+m/2;this.cellLocation[d][1]=q+n/2;this.radius[d]=Math.min(m,n);this.radiusSquared[d]=this.radius[d]*this.radius[d]}b.beginUpdate();try{for(d=0;d<f;d++){this.dispX[d]=0;this.dispY[d]=0;this.isMoveable[d]=this.isVertexMovable(this.vertexArray[d]);
-var r=this.graph.getConnections(this.vertexArray[d],a),c=this.graph.getOpposites(r,this.vertexArray[d]);this.neighbours[d]=[];for(m=0;m<c.length;m++){this.resetEdges&&this.graph.resetEdge(r[m]);this.disableEdgeStyle&&this.setEdgeStyleEnabled(r[m],!1);var k=mxObjectIdentity.get(c[m]),t=this.indices[k];this.neighbours[d][m]=null!=t?t:d}}this.temperature=this.initialTemp;0==this.maxIterations&&(this.maxIterations=20*Math.sqrt(f));for(this.iteration=0;this.iteration<this.maxIterations;this.iteration++){if(!this.allowedToRun)return;
-this.calcRepulsion();this.calcAttraction();this.calcPositions();this.reduceTemperature()}a=c=null;for(d=0;d<this.vertexArray.length;d++)g=this.vertexArray[d],this.isVertexMovable(g)&&(l=this.getVertexBounds(g),null!=l&&(this.cellLocation[d][0]-=l.width/2,this.cellLocation[d][1]-=l.height/2,p=this.graph.snap(Math.round(this.cellLocation[d][0])),q=this.graph.snap(Math.round(this.cellLocation[d][1])),this.setVertexLocation(g,p,q),c=null==c?p:Math.min(c,p),a=null==a?q:Math.min(a,q)));d=-(c||0)+1;g=-(a||
-0)+1;null!=e&&(d+=e.x,g+=e.y);this.graph.moveCells(this.vertexArray,d,g)}finally{b.endUpdate()}};mxFastOrganicLayout.prototype.calcPositions=function(){for(var a=0;a<this.vertexArray.length;a++)if(this.isMoveable[a]){var b=Math.sqrt(this.dispX[a]*this.dispX[a]+this.dispY[a]*this.dispY[a]);.001>b&&(b=.001);var c=this.dispX[a]/b*Math.min(b,this.temperature),b=this.dispY[a]/b*Math.min(b,this.temperature);this.dispX[a]=0;this.dispY[a]=0;this.cellLocation[a][0]+=c;this.cellLocation[a][1]+=b}};
-mxFastOrganicLayout.prototype.calcAttraction=function(){for(var a=0;a<this.vertexArray.length;a++)for(var b=0;b<this.neighbours[a].length;b++){var c=this.neighbours[a][b];if(a!=c&&this.isMoveable[a]&&this.isMoveable[c]){var d=this.cellLocation[a][0]-this.cellLocation[c][0],e=this.cellLocation[a][1]-this.cellLocation[c][1],f=d*d+e*e-this.radiusSquared[a]-this.radiusSquared[c];f<this.minDistanceLimitSquared&&(f=this.minDistanceLimitSquared);var g=Math.sqrt(f),f=f/this.forceConstant,d=d/g*f,e=e/g*f;
-this.dispX[a]-=d;this.dispY[a]-=e;this.dispX[c]+=d;this.dispY[c]+=e}}};
-mxFastOrganicLayout.prototype.calcRepulsion=function(){for(var a=this.vertexArray.length,b=0;b<a;b++)for(var c=b;c<a;c++){if(!this.allowedToRun)return;if(c!=b&&this.isMoveable[b]&&this.isMoveable[c]){var d=this.cellLocation[b][0]-this.cellLocation[c][0],e=this.cellLocation[b][1]-this.cellLocation[c][1];0==d&&(d=.01+Math.random());0==e&&(e=.01+Math.random());var f=Math.sqrt(d*d+e*e),g=f-this.radius[b]-this.radius[c];g>this.maxDistanceLimit||(g<this.minDistanceLimit&&(g=this.minDistanceLimit),g=this.forceConstantSquared/
-g,d=d/f*g,e=e/f*g,this.dispX[b]+=d,this.dispY[b]+=e,this.dispX[c]-=d,this.dispY[c]-=e)}}};mxFastOrganicLayout.prototype.reduceTemperature=function(){this.temperature=this.initialTemp*(1-this.iteration/this.maxIterations)};function mxCircleLayout(a,b){mxGraphLayout.call(this,a);this.radius=null!=b?b:100}mxCircleLayout.prototype=new mxGraphLayout;mxCircleLayout.prototype.constructor=mxCircleLayout;mxCircleLayout.prototype.radius=null;mxCircleLayout.prototype.moveCircle=!1;
-mxCircleLayout.prototype.x0=0;mxCircleLayout.prototype.y0=0;mxCircleLayout.prototype.resetEdges=!0;mxCircleLayout.prototype.disableEdgeStyle=!0;
-mxCircleLayout.prototype.execute=function(a){var b=this.graph.getModel();b.beginUpdate();try{for(var c=0,d=null,e=null,f=[],g=b.getChildCount(a),k=0;k<g;k++){var l=b.getChildAt(a,k);if(this.isVertexIgnored(l))this.isEdgeIgnored(l)||(this.resetEdges&&this.graph.resetEdge(l),this.disableEdgeStyle&&this.setEdgeStyleEnabled(l,!1));else{f.push(l);var m=this.getVertexBounds(l),d=null==d?m.y:Math.min(d,m.y),e=null==e?m.x:Math.min(e,m.x),c=Math.max(c,Math.max(m.width,m.height))}}var n=this.getRadius(f.length,
-c);this.moveCircle&&(e=this.x0,d=this.y0);this.circle(f,n,e,d)}finally{b.endUpdate()}};mxCircleLayout.prototype.getRadius=function(a,b){return Math.max(a*b/Math.PI,this.radius)};mxCircleLayout.prototype.circle=function(a,b,c,d){for(var e=a.length,f=2*Math.PI/e,g=0;g<e;g++)this.isVertexMovable(a[g])&&this.setVertexLocation(a[g],Math.round(c+b+b*Math.sin(g*f)),Math.round(d+b+b*Math.cos(g*f)))};function mxParallelEdgeLayout(a){mxGraphLayout.call(this,a)}mxParallelEdgeLayout.prototype=new mxGraphLayout;
-mxParallelEdgeLayout.prototype.constructor=mxParallelEdgeLayout;mxParallelEdgeLayout.prototype.spacing=20;mxParallelEdgeLayout.prototype.checkOverlap=!1;mxParallelEdgeLayout.prototype.execute=function(a,b){var c=this.findParallels(a,b);this.graph.model.beginUpdate();try{for(var d in c){var e=c[d];1<e.length&&this.layout(e)}}finally{this.graph.model.endUpdate()}};
-mxParallelEdgeLayout.prototype.findParallels=function(a,b){var c=[],d=mxUtils.bind(this,function(a){if(!this.isEdgeIgnored(a)){var b=this.getEdgeId(a);null!=b&&(null==c[b]&&(c[b]=[]),c[b].push(a))}});if(null!=b)for(var e=0;e<b.length;e++)d(b[e]);else for(var f=this.graph.getModel(),g=f.getChildCount(a),e=0;e<g;e++)d(f.getChildAt(a,e));return c};
-mxParallelEdgeLayout.prototype.getEdgeId=function(a){var b=this.graph.getView(),c=b.getVisibleTerminal(a,!0),b=b.getVisibleTerminal(a,!1),d="";if(null!=c&&null!=b){c=mxObjectIdentity.get(c);b=mxObjectIdentity.get(b);if(this.checkOverlap&&(a=this.graph.view.getState(a),null!=a&&null!=a.absolutePoints)){for(var d=[],e=0;e<a.absolutePoints.length;e++){var f=a.absolutePoints[e];null!=f&&d.push(f.x,f.y)}d=d.join(",")}return(c>b?b+"-"+c:c+"-"+b)+d}return null};
-mxParallelEdgeLayout.prototype.layout=function(a){var b=a[0],c=this.graph.getView(),d=this.graph.getModel(),e=d.getGeometry(c.getVisibleTerminal(b,!0)),d=d.getGeometry(c.getVisibleTerminal(b,!1));if(e==d)for(var b=e.x+e.width+this.spacing,c=e.y+e.height/2,f=0;f<a.length;f++)this.route(a[f],b,c),b+=this.spacing;else if(null!=e&&null!=d){var b=e.x+e.width/2,c=e.y+e.height/2,f=d.x+d.width/2-b,g=d.y+d.height/2-c,d=Math.sqrt(f*f+g*g);if(0<d)for(e=g*this.spacing/d,d=f*this.spacing/d,b=b+f/2+e*(a.length-
-1)/2,c=c+g/2-d*(a.length-1)/2,f=0;f<a.length;f++)this.route(a[f],b,c),b-=e,c+=d}};mxParallelEdgeLayout.prototype.route=function(a,b,c){this.graph.isCellMovable(a)&&this.setEdgePoints(a,[new mxPoint(b,c)])};function mxCompositeLayout(a,b,c){mxGraphLayout.call(this,a);this.layouts=b;this.master=c}mxCompositeLayout.prototype=new mxGraphLayout;mxCompositeLayout.prototype.constructor=mxCompositeLayout;mxCompositeLayout.prototype.layouts=null;mxCompositeLayout.prototype.master=null;
-mxCompositeLayout.prototype.moveCell=function(a,b,c){null!=this.master?this.master.moveCell.apply(this.master,arguments):this.layouts[0].moveCell.apply(this.layouts[0],arguments)};mxCompositeLayout.prototype.execute=function(a){var b=this.graph.getModel();b.beginUpdate();try{for(var c=0;c<this.layouts.length;c++)this.layouts[c].execute.apply(this.layouts[c],arguments)}finally{b.endUpdate()}};function mxEdgeLabelLayout(a,b){mxGraphLayout.call(this,a)}mxEdgeLabelLayout.prototype=new mxGraphLayout;
-mxEdgeLabelLayout.prototype.constructor=mxEdgeLabelLayout;mxEdgeLabelLayout.prototype.execute=function(a){for(var b=this.graph.view,c=this.graph.getModel(),d=[],e=[],f=c.getChildCount(a),g=0;g<f;g++){var k=c.getChildAt(a,g),l=b.getState(k);null!=l&&(this.isVertexIgnored(k)?this.isEdgeIgnored(k)||d.push(l):e.push(l))}this.placeLabels(e,d)};
-mxEdgeLabelLayout.prototype.placeLabels=function(a,b){var c=this.graph.getModel();c.beginUpdate();try{for(var d=0;d<b.length;d++){var e=b[d];if(null!=e&&null!=e.text&&null!=e.text.boundingBox)for(var f=0;f<a.length;f++){var g=a[f];null!=g&&this.avoid(e,g)}}}finally{c.endUpdate()}};
-mxEdgeLabelLayout.prototype.avoid=function(a,b){var c=this.graph.getModel(),d=a.text.boundingBox;if(mxUtils.intersects(d,b)){var e=-d.y-d.height+b.y,f=-d.y+b.y+b.height,e=Math.abs(e)<Math.abs(f)?e:f,f=-d.x-d.width+b.x,d=-d.x+b.x+b.width,d=Math.abs(f)<Math.abs(d)?f:d;Math.abs(d)<Math.abs(e)?e=0:d=0;f=c.getGeometry(a.cell);null!=f&&(f=f.clone(),null!=f.offset?(f.offset.x+=d,f.offset.y+=e):f.offset=new mxPoint(d,e),c.setGeometry(a.cell,f))}};
-function mxGraphAbstractHierarchyCell(){this.x=[];this.y=[];this.temp=[]}mxGraphAbstractHierarchyCell.prototype.maxRank=-1;mxGraphAbstractHierarchyCell.prototype.minRank=-1;mxGraphAbstractHierarchyCell.prototype.x=null;mxGraphAbstractHierarchyCell.prototype.y=null;mxGraphAbstractHierarchyCell.prototype.width=0;mxGraphAbstractHierarchyCell.prototype.height=0;mxGraphAbstractHierarchyCell.prototype.nextLayerConnectedCells=null;mxGraphAbstractHierarchyCell.prototype.previousLayerConnectedCells=null;
-mxGraphAbstractHierarchyCell.prototype.temp=null;mxGraphAbstractHierarchyCell.prototype.getNextLayerConnectedCells=function(a){return null};mxGraphAbstractHierarchyCell.prototype.getPreviousLayerConnectedCells=function(a){return null};mxGraphAbstractHierarchyCell.prototype.isEdge=function(){return!1};mxGraphAbstractHierarchyCell.prototype.isVertex=function(){return!1};mxGraphAbstractHierarchyCell.prototype.getGeneralPurposeVariable=function(a){return null};
-mxGraphAbstractHierarchyCell.prototype.setGeneralPurposeVariable=function(a,b){return null};mxGraphAbstractHierarchyCell.prototype.setX=function(a,b){this.isVertex()?this.x[0]=b:this.isEdge()&&(this.x[a-this.minRank-1]=b)};mxGraphAbstractHierarchyCell.prototype.getX=function(a){return this.isVertex()?this.x[0]:this.isEdge()?this.x[a-this.minRank-1]:0};mxGraphAbstractHierarchyCell.prototype.setY=function(a,b){this.isVertex()?this.y[0]=b:this.isEdge()&&(this.y[a-this.minRank-1]=b)};
-function mxGraphHierarchyNode(a){mxGraphAbstractHierarchyCell.apply(this,arguments);this.cell=a;this.id=mxObjectIdentity.get(a);this.connectsAsTarget=[];this.connectsAsSource=[]}mxGraphHierarchyNode.prototype=new mxGraphAbstractHierarchyCell;mxGraphHierarchyNode.prototype.constructor=mxGraphHierarchyNode;mxGraphHierarchyNode.prototype.cell=null;mxGraphHierarchyNode.prototype.id=null;mxGraphHierarchyNode.prototype.connectsAsTarget=null;mxGraphHierarchyNode.prototype.connectsAsSource=null;
-mxGraphHierarchyNode.prototype.hashCode=!1;mxGraphHierarchyNode.prototype.getRankValue=function(a){return this.maxRank};mxGraphHierarchyNode.prototype.getNextLayerConnectedCells=function(a){if(null==this.nextLayerConnectedCells){this.nextLayerConnectedCells=[];this.nextLayerConnectedCells[0]=[];for(var b=0;b<this.connectsAsTarget.length;b++){var c=this.connectsAsTarget[b];-1==c.maxRank||c.maxRank==a+1?this.nextLayerConnectedCells[0].push(c.source):this.nextLayerConnectedCells[0].push(c)}}return this.nextLayerConnectedCells[0]};
-mxGraphHierarchyNode.prototype.getPreviousLayerConnectedCells=function(a){if(null==this.previousLayerConnectedCells){this.previousLayerConnectedCells=[];this.previousLayerConnectedCells[0]=[];for(var b=0;b<this.connectsAsSource.length;b++){var c=this.connectsAsSource[b];-1==c.minRank||c.minRank==a-1?this.previousLayerConnectedCells[0].push(c.target):this.previousLayerConnectedCells[0].push(c)}}return this.previousLayerConnectedCells[0]};mxGraphHierarchyNode.prototype.isVertex=function(){return!0};
-mxGraphHierarchyNode.prototype.getGeneralPurposeVariable=function(a){return this.temp[0]};mxGraphHierarchyNode.prototype.setGeneralPurposeVariable=function(a,b){this.temp[0]=b};mxGraphHierarchyNode.prototype.isAncestor=function(a){if(null!=a&&null!=this.hashCode&&null!=a.hashCode&&this.hashCode.length<a.hashCode.length){if(this.hashCode==a.hashCode)return!0;if(null==this.hashCode||null==this.hashCode)return!1;for(var b=0;b<this.hashCode.length;b++)if(this.hashCode[b]!=a.hashCode[b])return!1;return!0}return!1};
-mxGraphHierarchyNode.prototype.getCoreCell=function(){return this.cell};function mxGraphHierarchyEdge(a){mxGraphAbstractHierarchyCell.apply(this,arguments);this.edges=a;this.ids=[];for(var b=0;b<a.length;b++)this.ids.push(mxObjectIdentity.get(a[b]))}mxGraphHierarchyEdge.prototype=new mxGraphAbstractHierarchyCell;mxGraphHierarchyEdge.prototype.constructor=mxGraphHierarchyEdge;mxGraphHierarchyEdge.prototype.edges=null;mxGraphHierarchyEdge.prototype.ids=null;mxGraphHierarchyEdge.prototype.source=null;
-mxGraphHierarchyEdge.prototype.target=null;mxGraphHierarchyEdge.prototype.isReversed=!1;mxGraphHierarchyEdge.prototype.invert=function(a){a=this.source;this.source=this.target;this.target=a;this.isReversed=!this.isReversed};
-mxGraphHierarchyEdge.prototype.getNextLayerConnectedCells=function(a){if(null==this.nextLayerConnectedCells){this.nextLayerConnectedCells=[];for(var b=0;b<this.temp.length;b++)this.nextLayerConnectedCells[b]=[],b==this.temp.length-1?this.nextLayerConnectedCells[b].push(this.source):this.nextLayerConnectedCells[b].push(this)}return this.nextLayerConnectedCells[a-this.minRank-1]};
-mxGraphHierarchyEdge.prototype.getPreviousLayerConnectedCells=function(a){if(null==this.previousLayerConnectedCells){this.previousLayerConnectedCells=[];for(var b=0;b<this.temp.length;b++)this.previousLayerConnectedCells[b]=[],0==b?this.previousLayerConnectedCells[b].push(this.target):this.previousLayerConnectedCells[b].push(this)}return this.previousLayerConnectedCells[a-this.minRank-1]};mxGraphHierarchyEdge.prototype.isEdge=function(){return!0};
-mxGraphHierarchyEdge.prototype.getGeneralPurposeVariable=function(a){return this.temp[a-this.minRank-1]};mxGraphHierarchyEdge.prototype.setGeneralPurposeVariable=function(a,b){this.temp[a-this.minRank-1]=b};mxGraphHierarchyEdge.prototype.getCoreCell=function(){return null!=this.edges&&0<this.edges.length?this.edges[0]:null};
-function mxGraphHierarchyModel(a,b,c,d,e){a.getGraph();this.tightenToSource=e;this.roots=c;this.parent=d;this.vertexMapper=new mxDictionary;this.edgeMapper=new mxDictionary;this.maxRank=0;c=[];null==b&&(b=this.graph.getChildVertices(d));this.maxRank=this.SOURCESCANSTARTRANK;this.createInternalCells(a,b,c);for(d=0;d<b.length;d++){e=c[d].connectsAsSource;for(var f=0;f<e.length;f++){var g=e[f],k=g.edges;if(null!=k&&0<k.length){var k=k[0],l=a.getVisibleTerminal(k,!1),l=this.vertexMapper.get(l);c[d]==
-l&&(l=a.getVisibleTerminal(k,!0),l=this.vertexMapper.get(l));null!=l&&c[d]!=l&&(g.target=l,0==l.connectsAsTarget.length&&(l.connectsAsTarget=[]),0>mxUtils.indexOf(l.connectsAsTarget,g)&&l.connectsAsTarget.push(g))}}c[d].temp[0]=1}}mxGraphHierarchyModel.prototype.maxRank=null;mxGraphHierarchyModel.prototype.vertexMapper=null;mxGraphHierarchyModel.prototype.edgeMapper=null;mxGraphHierarchyModel.prototype.ranks=null;mxGraphHierarchyModel.prototype.roots=null;mxGraphHierarchyModel.prototype.parent=null;
-mxGraphHierarchyModel.prototype.dfsCount=0;mxGraphHierarchyModel.prototype.SOURCESCANSTARTRANK=1E8;mxGraphHierarchyModel.prototype.tightenToSource=!1;
-mxGraphHierarchyModel.prototype.createInternalCells=function(a,b,c){for(var d=a.getGraph(),e=0;e<b.length;e++){c[e]=new mxGraphHierarchyNode(b[e]);this.vertexMapper.put(b[e],c[e]);var f=a.getEdges(b[e]);c[e].connectsAsSource=[];for(var g=0;g<f.length;g++){var k=a.getVisibleTerminal(f[g],!1);if(k!=b[e]&&a.graph.model.isVertex(k)&&!a.isVertexIgnored(k)){var l=a.getEdgesBetween(b[e],k,!1),k=a.getEdgesBetween(b[e],k,!0);if(null!=l&&0<l.length&&null==this.edgeMapper.get(l[0])&&2*k.length>=l.length){for(var k=
-new mxGraphHierarchyEdge(l),m=0;m<l.length;m++){var n=l[m];this.edgeMapper.put(n,k);d.resetEdge(n);a.disableEdgeStyle&&(a.setEdgeStyleEnabled(n,!1),a.setOrthogonalEdge(n,!0))}k.source=c[e];0>mxUtils.indexOf(c[e].connectsAsSource,k)&&c[e].connectsAsSource.push(k)}}}c[e].temp[0]=0}};
-mxGraphHierarchyModel.prototype.initialRank=function(){var a=[];if(null!=this.roots)for(var b=0;b<this.roots.length;b++){var c=this.vertexMapper.get(this.roots[b]);null!=c&&a.push(c)}for(var d=this.vertexMapper.getValues(),b=0;b<d.length;b++)d[b].temp[0]=-1;for(var e=a.slice();0<a.length;){var c=a[0],f,g;f=c.connectsAsTarget;g=c.connectsAsSource;for(var k=!0,l=this.SOURCESCANSTARTRANK,b=0;b<f.length;b++){var m=f[b];if(5270620==m.temp[0])m=m.source,l=Math.min(l,m.temp[0]-1);else{k=!1;break}}if(k){c.temp[0]=
-l;this.maxRank=Math.min(this.maxRank,l);if(null!=g)for(b=0;b<g.length;b++)m=g[b],m.temp[0]=5270620,m=m.target,-1==m.temp[0]&&(a.push(m),m.temp[0]=-2);a.shift()}else if(b=a.shift(),a.push(c),b==c&&1==a.length)break}for(b=0;b<d.length;b++)d[b].temp[0]-=this.maxRank;for(b=0;b<e.length;b++)for(c=e[b],a=0,f=c.connectsAsSource,d=0;d<f.length;d++)m=f[d],m=m.target,c.temp[0]=Math.max(a,m.temp[0]+1),a=c.temp[0];this.maxRank=this.SOURCESCANSTARTRANK-this.maxRank};
-mxGraphHierarchyModel.prototype.fixRanks=function(){var a=[];this.ranks=[];for(var b=0;b<this.maxRank+1;b++)a[b]=[],this.ranks[b]=a[b];var c=null;if(null!=this.roots)for(var d=this.roots,c=[],b=0;b<d.length;b++){var e=this.vertexMapper.get(d[b]);c[b]=e}this.visit(function(b,c,d,e,m){0==m&&0>c.maxRank&&0>c.minRank&&(a[c.temp[0]].push(c),c.maxRank=c.temp[0],c.minRank=c.temp[0],c.temp[0]=a[c.maxRank].length-1);if(null!=b&&null!=d&&1<b.maxRank-c.maxRank)for(d.maxRank=b.maxRank,d.minRank=c.maxRank,d.temp=
-[],d.x=[],d.y=[],b=d.minRank+1;b<d.maxRank;b++)a[b].push(d),d.setGeneralPurposeVariable(b,a[b].length-1)},c,!1,null)};mxGraphHierarchyModel.prototype.visit=function(a,b,c,d){if(null!=b){for(var e=0;e<b.length;e++){var f=b[e];null!=f&&(null==d&&(d={}),c?(f.hashCode=[],f.hashCode[0]=this.dfsCount,f.hashCode[1]=e,this.extendedDfs(null,f,null,a,d,f.hashCode,e,0)):this.dfs(null,f,null,a,d,0))}this.dfsCount++}};
-mxGraphHierarchyModel.prototype.dfs=function(a,b,c,d,e,f){if(null!=b){var g=b.id;if(null==e[g])for(e[g]=b,d(a,b,c,f,0),a=b.connectsAsSource.slice(),c=0;c<a.length;c++)g=a[c],this.dfs(b,g.target,g,d,e,f+1);else d(a,b,c,f,1)}};
-mxGraphHierarchyModel.prototype.extendedDfs=function(a,b,c,d,e,f,g,k){if(null!=b)if(null==a||null!=b.hashCode&&b.hashCode[0]==a.hashCode[0]||(f=a.hashCode.length+1,b.hashCode=a.hashCode.slice(),b.hashCode[f-1]=g),g=b.id,null==e[g])for(e[g]=b,d(a,b,c,k,0),a=b.connectsAsSource.slice(),c=0;c<a.length;c++)g=a[c],this.extendedDfs(b,g.target,g,d,e,b.hashCode,c,k+1);else d(a,b,c,k,1)};
-function mxSwimlaneModel(a,b,c,d,e){a.getGraph();this.tightenToSource=e;this.roots=c;this.parent=d;this.vertexMapper=new mxDictionary;this.edgeMapper=new mxDictionary;this.maxRank=0;c=[];null==b&&(b=this.graph.getChildVertices(d));this.maxRank=this.SOURCESCANSTARTRANK;this.createInternalCells(a,b,c);for(d=0;d<b.length;d++){e=c[d].connectsAsSource;for(var f=0;f<e.length;f++){var g=e[f],k=g.edges;if(null!=k&&0<k.length){var k=k[0],l=a.getVisibleTerminal(k,!1),l=this.vertexMapper.get(l);c[d]==l&&(l=
-a.getVisibleTerminal(k,!0),l=this.vertexMapper.get(l));null!=l&&c[d]!=l&&(g.target=l,0==l.connectsAsTarget.length&&(l.connectsAsTarget=[]),0>mxUtils.indexOf(l.connectsAsTarget,g)&&l.connectsAsTarget.push(g))}}c[d].temp[0]=1}}mxSwimlaneModel.prototype.maxRank=null;mxSwimlaneModel.prototype.vertexMapper=null;mxSwimlaneModel.prototype.edgeMapper=null;mxSwimlaneModel.prototype.ranks=null;mxSwimlaneModel.prototype.roots=null;mxSwimlaneModel.prototype.parent=null;mxSwimlaneModel.prototype.dfsCount=0;
-mxSwimlaneModel.prototype.SOURCESCANSTARTRANK=1E8;mxSwimlaneModel.prototype.tightenToSource=!1;mxSwimlaneModel.prototype.ranksPerGroup=null;
-mxSwimlaneModel.prototype.createInternalCells=function(a,b,c){for(var d=a.getGraph(),e=a.swimlanes,f=0;f<b.length;f++){c[f]=new mxGraphHierarchyNode(b[f]);this.vertexMapper.put(b[f],c[f]);c[f].swimlaneIndex=-1;for(var g=0;g<e.length;g++)if(d.model.getParent(b[f])==e[g]){c[f].swimlaneIndex=g;break}g=a.getEdges(b[f]);c[f].connectsAsSource=[];for(var k=0;k<g.length;k++){var l=a.getVisibleTerminal(g[k],!1);if(l!=b[f]&&a.graph.model.isVertex(l)&&!a.isVertexIgnored(l)){var m=a.getEdgesBetween(b[f],l,!1),
-l=a.getEdgesBetween(b[f],l,!0);if(null!=m&&0<m.length&&null==this.edgeMapper.get(m[0])&&2*l.length>=m.length){for(var l=new mxGraphHierarchyEdge(m),n=0;n<m.length;n++){var p=m[n];this.edgeMapper.put(p,l);d.resetEdge(p);a.disableEdgeStyle&&(a.setEdgeStyleEnabled(p,!1),a.setOrthogonalEdge(p,!0))}l.source=c[f];0>mxUtils.indexOf(c[f].connectsAsSource,l)&&c[f].connectsAsSource.push(l)}}}c[f].temp[0]=0}};
-mxSwimlaneModel.prototype.initialRank=function(){this.ranksPerGroup=[];var a=[],b={};if(null!=this.roots)for(var c=0;c<this.roots.length;c++){var d=this.vertexMapper.get(this.roots[c]);this.maxChainDfs(null,d,null,b,0);null!=d&&a.push(d)}d=[];b=[];for(c=this.ranksPerGroup.length-1;0<=c;c--)d[c]=c==this.ranksPerGroup.length-1?0:b[c+1]+1,b[c]=d[c]+this.ranksPerGroup[c];this.maxRank=b[0];d=this.vertexMapper.getValues();for(c=0;c<d.length;c++)d[c].temp[0]=-1;for(a.slice();0<a.length;){var d=a[0],e,f;
-e=d.connectsAsTarget;f=d.connectsAsSource;for(var g=!0,k=b[0],c=0;c<e.length;c++){var l=e[c];if(5270620==l.temp[0])l=l.source,k=Math.min(k,l.temp[0]-1);else{g=!1;break}}if(g){k>b[d.swimlaneIndex]&&(k=b[d.swimlaneIndex]);d.temp[0]=k;if(null!=f)for(c=0;c<f.length;c++)l=f[c],l.temp[0]=5270620,l=l.target,-1==l.temp[0]&&(a.push(l),l.temp[0]=-2);a.shift()}else if(c=a.shift(),a.push(d),c==d&&1==a.length)break}};
-mxSwimlaneModel.prototype.maxChainDfs=function(a,b,c,d,e){if(null!=b&&(a=mxCellPath.create(b.cell),null==d[a])){d[a]=b;a=b.swimlaneIndex;if(null==this.ranksPerGroup[a]||this.ranksPerGroup[a]<e)this.ranksPerGroup[a]=e;a=b.connectsAsSource.slice();for(c=0;c<a.length;c++){var f=a[c],g=f.target;b.swimlaneIndex<g.swimlaneIndex?this.maxChainDfs(b,g,f,mxUtils.clone(d,null,!0),0):b.swimlaneIndex==g.swimlaneIndex&&this.maxChainDfs(b,g,f,mxUtils.clone(d,null,!0),e+1)}}};
-mxSwimlaneModel.prototype.fixRanks=function(){var a=[];this.ranks=[];for(var b=0;b<this.maxRank+1;b++)a[b]=[],this.ranks[b]=a[b];var c=null;if(null!=this.roots)for(var d=this.roots,c=[],b=0;b<d.length;b++){var e=this.vertexMapper.get(d[b]);c[b]=e}this.visit(function(b,c,d,e,m){0==m&&0>c.maxRank&&0>c.minRank&&(a[c.temp[0]].push(c),c.maxRank=c.temp[0],c.minRank=c.temp[0],c.temp[0]=a[c.maxRank].length-1);if(null!=b&&null!=d&&1<b.maxRank-c.maxRank)for(d.maxRank=b.maxRank,d.minRank=c.maxRank,d.temp=[],
-d.x=[],d.y=[],b=d.minRank+1;b<d.maxRank;b++)a[b].push(d),d.setGeneralPurposeVariable(b,a[b].length-1)},c,!1,null)};mxSwimlaneModel.prototype.visit=function(a,b,c,d){if(null!=b){for(var e=0;e<b.length;e++){var f=b[e];null!=f&&(null==d&&(d={}),c?(f.hashCode=[],f.hashCode[0]=this.dfsCount,f.hashCode[1]=e,this.extendedDfs(null,f,null,a,d,f.hashCode,e,0)):this.dfs(null,f,null,a,d,0))}this.dfsCount++}};
-mxSwimlaneModel.prototype.dfs=function(a,b,c,d,e,f){if(null!=b){var g=b.id;if(null==e[g])for(e[g]=b,d(a,b,c,f,0),a=b.connectsAsSource.slice(),c=0;c<a.length;c++)g=a[c],this.dfs(b,g.target,g,d,e,f+1);else d(a,b,c,f,1)}};
-mxSwimlaneModel.prototype.extendedDfs=function(a,b,c,d,e,f,g,k){if(null!=b)if(null==a||null!=b.hashCode&&b.hashCode[0]==a.hashCode[0]||(f=a.hashCode.length+1,b.hashCode=a.hashCode.slice(),b.hashCode[f-1]=g),g=b.id,null==e[g]){e[g]=b;d(a,b,c,k,0);a=b.connectsAsSource.slice();c=b.connectsAsTarget.slice();for(g=0;g<a.length;g++){f=a[g];var l=f.target;b.swimlaneIndex<=l.swimlaneIndex&&this.extendedDfs(b,l,f,d,e,b.hashCode,g,k+1)}for(g=0;g<c.length;g++)f=c[g],l=f.source,b.swimlaneIndex<l.swimlaneIndex&&
-this.extendedDfs(b,l,f,d,e,b.hashCode,g,k+1)}else d(a,b,c,k,1)};function mxHierarchicalLayoutStage(){}mxHierarchicalLayoutStage.prototype.execute=function(a){};function mxMedianHybridCrossingReduction(a){this.layout=a}mxMedianHybridCrossingReduction.prototype=new mxHierarchicalLayoutStage;mxMedianHybridCrossingReduction.prototype.constructor=mxMedianHybridCrossingReduction;mxMedianHybridCrossingReduction.prototype.layout=null;mxMedianHybridCrossingReduction.prototype.maxIterations=24;
-mxMedianHybridCrossingReduction.prototype.nestedBestRanks=null;mxMedianHybridCrossingReduction.prototype.currentBestCrossings=0;mxMedianHybridCrossingReduction.prototype.iterationsWithoutImprovement=0;mxMedianHybridCrossingReduction.prototype.maxNoImprovementIterations=2;
-mxMedianHybridCrossingReduction.prototype.execute=function(a){a=this.layout.getModel();this.nestedBestRanks=[];for(var b=0;b<a.ranks.length;b++)this.nestedBestRanks[b]=a.ranks[b].slice();for(var c=0,d=this.calculateCrossings(a),b=0;b<this.maxIterations&&c<this.maxNoImprovementIterations;b++){this.weightedMedian(b,a);this.transpose(b,a);var e=this.calculateCrossings(a);if(e<d)for(d=e,e=c=0;e<this.nestedBestRanks.length;e++)for(var f=a.ranks[e],g=0;g<f.length;g++){var k=f[g];this.nestedBestRanks[e][k.getGeneralPurposeVariable(e)]=
-k}else for(c++,e=0;e<this.nestedBestRanks.length;e++)for(f=a.ranks[e],g=0;g<f.length;g++)k=f[g],k.setGeneralPurposeVariable(e,g);if(0==d)break}c=[];d=[];for(b=0;b<a.maxRank+1;b++)d[b]=[],c[b]=d[b];for(b=0;b<this.nestedBestRanks.length;b++)for(e=0;e<this.nestedBestRanks[b].length;e++)d[b].push(this.nestedBestRanks[b][e]);a.ranks=c};mxMedianHybridCrossingReduction.prototype.calculateCrossings=function(a){for(var b=a.ranks.length,c=0,d=1;d<b;d++)c+=this.calculateRankCrossing(d,a);return c};
-mxMedianHybridCrossingReduction.prototype.calculateRankCrossing=function(a,b){for(var c=0,d=b.ranks[a],e=b.ranks[a-1],f=[],g=0;g<d.length;g++){for(var k=d[g],l=k.getGeneralPurposeVariable(a),k=k.getPreviousLayerConnectedCells(a),m=[],n=0;n<k.length;n++){var p=k[n].getGeneralPurposeVariable(a-1);m.push(p)}m.sort(function(a,b){return a-b});f[l]=m}d=[];for(g=0;g<f.length;g++)d=d.concat(f[g]);for(f=1;f<e.length;)f<<=1;l=2*f-1;--f;e=[];for(g=0;g<l;++g)e[g]=0;for(g=0;g<d.length;g++)for(l=d[g]+f,++e[l];0<
-l;)l%2&&(c+=e[l+1]),l=l-1>>1,++e[l];return c};
-mxMedianHybridCrossingReduction.prototype.transpose=function(a,b){for(var c=!0,d=0;c&&10>d++;)for(var e=1==a%2&&1==d%2,c=!1,f=0;f<b.ranks.length;f++){for(var g=b.ranks[f],k=[],l=0;l<g.length;l++){var m=g[l],n=m.getGeneralPurposeVariable(f);0>n&&(n=l);k[n]=m}for(var p=null,q=null,r,t,u=null,x=null,y,B=null,l=0;l<g.length-1;l++){if(0==l){y=k[l];m=y.getNextLayerConnectedCells(f);n=y.getPreviousLayerConnectedCells(f);r=[];t=[];for(var A=0;A<m.length;A++)r[A]=m[A].getGeneralPurposeVariable(f+1);for(A=
-0;A<n.length;A++)t[A]=n[A].getGeneralPurposeVariable(f-1)}else m=p,n=q,r=u,t=x,y=B;B=k[l+1];p=B.getNextLayerConnectedCells(f);q=B.getPreviousLayerConnectedCells(f);u=[];x=[];for(A=0;A<p.length;A++)u[A]=p[A].getGeneralPurposeVariable(f+1);for(A=0;A<q.length;A++)x[A]=q[A].getGeneralPurposeVariable(f-1);for(var z=0,C=0,A=0;A<r.length;A++)for(var v=0;v<u.length;v++)r[A]>u[v]&&z++,r[A]<u[v]&&C++;for(A=0;A<t.length;A++)for(v=0;v<x.length;v++)t[A]>x[v]&&z++,t[A]<x[v]&&C++;if(C<z||C==z&&e)p=y.getGeneralPurposeVariable(f),
-y.setGeneralPurposeVariable(f,B.getGeneralPurposeVariable(f)),B.setGeneralPurposeVariable(f,p),p=m,q=n,u=r,x=t,B=y,e||(c=!0)}}};mxMedianHybridCrossingReduction.prototype.weightedMedian=function(a,b){var c=0==a%2;if(c)for(var d=b.maxRank-1;0<=d;d--)this.medianRank(d,c);else for(d=1;d<b.maxRank;d++)this.medianRank(d,c)};
-mxMedianHybridCrossingReduction.prototype.medianRank=function(a,b){for(var c=this.nestedBestRanks[a].length,d=[],e=[],f=0;f<c;f++){var g=this.nestedBestRanks[a][f],k=new MedianCellSorter;k.cell=g;var l;l=b?g.getNextLayerConnectedCells(a):g.getPreviousLayerConnectedCells(a);var m;m=b?a+1:a-1;null!=l&&0!=l.length?(k.medianValue=this.medianValue(l,m),d.push(k)):e[g.getGeneralPurposeVariable(a)]=!0}d.sort(MedianCellSorter.prototype.compare);for(f=0;f<c;f++)null==e[f]&&(g=d.shift().cell,g.setGeneralPurposeVariable(a,
-f))};mxMedianHybridCrossingReduction.prototype.medianValue=function(a,b){for(var c=[],d=0,e=0;e<a.length;e++){var f=a[e];c[d++]=f.getGeneralPurposeVariable(b)}c.sort(function(a,b){return a-b});if(1==d%2)return c[Math.floor(d/2)];if(2==d)return(c[0]+c[1])/2;e=d/2;f=c[e-1]-c[0];d=c[d-1]-c[e];return(c[e-1]*d+c[e]*f)/(f+d)};function MedianCellSorter(){}MedianCellSorter.prototype.medianValue=0;MedianCellSorter.prototype.cell=!1;
-MedianCellSorter.prototype.compare=function(a,b){return null!=a&&null!=b?b.medianValue>a.medianValue?-1:b.medianValue<a.medianValue?1:0:0};function mxMinimumCycleRemover(a){this.layout=a}mxMinimumCycleRemover.prototype=new mxHierarchicalLayoutStage;mxMinimumCycleRemover.prototype.constructor=mxMinimumCycleRemover;mxMinimumCycleRemover.prototype.layout=null;
-mxMinimumCycleRemover.prototype.execute=function(a){a=this.layout.getModel();for(var b={},c=a.vertexMapper.getValues(),d={},e=0;e<c.length;e++)d[c[e].id]=c[e];c=null;if(null!=a.roots)for(var f=a.roots,c=[],e=0;e<f.length;e++)c[e]=a.vertexMapper.get(f[e]);a.visit(function(a,c,e,f,n){c.isAncestor(a)&&(e.invert(),mxUtils.remove(e,a.connectsAsSource),a.connectsAsTarget.push(e),mxUtils.remove(e,c.connectsAsTarget),c.connectsAsSource.push(e));b[c.id]=c;delete d[c.id]},c,!0,null);e=mxUtils.clone(b,null,
-!0);a.visit(function(a,c,e,f,n){c.isAncestor(a)&&(e.invert(),mxUtils.remove(e,a.connectsAsSource),c.connectsAsSource.push(e),a.connectsAsTarget.push(e),mxUtils.remove(e,c.connectsAsTarget));b[c.id]=c;delete d[c.id]},d,!0,e)};function mxCoordinateAssignment(a,b,c,d,e,f){this.layout=a;this.intraCellSpacing=b;this.interRankCellSpacing=c;this.orientation=d;this.initialX=e;this.parallelEdgeSpacing=f}mxCoordinateAssignment.prototype=new mxHierarchicalLayoutStage;
-mxCoordinateAssignment.prototype.constructor=mxCoordinateAssignment;mxCoordinateAssignment.prototype.layout=null;mxCoordinateAssignment.prototype.intraCellSpacing=30;mxCoordinateAssignment.prototype.interRankCellSpacing=100;mxCoordinateAssignment.prototype.parallelEdgeSpacing=10;mxCoordinateAssignment.prototype.maxIterations=8;mxCoordinateAssignment.prototype.prefHozEdgeSep=5;mxCoordinateAssignment.prototype.prefVertEdgeOff=2;mxCoordinateAssignment.prototype.minEdgeJetty=12;
-mxCoordinateAssignment.prototype.channelBuffer=4;mxCoordinateAssignment.prototype.jettyPositions=null;mxCoordinateAssignment.prototype.orientation=mxConstants.DIRECTION_NORTH;mxCoordinateAssignment.prototype.initialX=null;mxCoordinateAssignment.prototype.limitX=null;mxCoordinateAssignment.prototype.currentXDelta=null;mxCoordinateAssignment.prototype.widestRank=null;mxCoordinateAssignment.prototype.rankTopY=null;mxCoordinateAssignment.prototype.rankBottomY=null;
-mxCoordinateAssignment.prototype.widestRankValue=null;mxCoordinateAssignment.prototype.rankWidths=null;mxCoordinateAssignment.prototype.rankY=null;mxCoordinateAssignment.prototype.fineTuning=!0;mxCoordinateAssignment.prototype.nextLayerConnectedCache=null;mxCoordinateAssignment.prototype.previousLayerConnectedCache=null;mxCoordinateAssignment.prototype.groupPadding=10;
-mxCoordinateAssignment.prototype.printStatus=function(){var a=this.layout.getModel();mxLog.show();mxLog.writeln("======Coord assignment debug=======");for(var b=0;b<a.ranks.length;b++){mxLog.write("Rank ",b," : ");for(var c=a.ranks[b],d=0;d<c.length;d++)mxLog.write(c[d].getGeneralPurposeVariable(b)," ");mxLog.writeln()}mxLog.writeln("====================================")};
-mxCoordinateAssignment.prototype.execute=function(a){this.jettyPositions={};a=this.layout.getModel();this.currentXDelta=0;this.initialCoords(this.layout.getGraph(),a);this.fineTuning&&this.minNode(a);var b=1E8;if(this.fineTuning)for(var c=0;c<this.maxIterations;c++){0!=c&&(this.medianPos(c,a),this.minNode(a));if(this.currentXDelta<b){for(var d=0;d<a.ranks.length;d++)for(var e=a.ranks[d],f=0;f<e.length;f++){var g=e[f];g.setX(d,g.getGeneralPurposeVariable(d))}b=this.currentXDelta}else for(d=0;d<a.ranks.length;d++)for(e=
-a.ranks[d],f=0;f<e.length;f++)g=e[f],g.setGeneralPurposeVariable(d,g.getX(d));this.minPath(this.layout.getGraph(),a);this.currentXDelta=0}this.setCellLocations(this.layout.getGraph(),a)};
-mxCoordinateAssignment.prototype.minNode=function(a){for(var b=[],c=new mxDictionary,d=[],e=0;e<=a.maxRank;e++){d[e]=a.ranks[e];for(var f=0;f<d[e].length;f++){var g=d[e][f],k=new WeightedCellSorter(g,e);k.rankIndex=f;k.visited=!0;b.push(k);c.put(g,k)}}a=10*b.length;for(f=0;0<b.length&&f<=a;){var g=b.shift(),e=g.cell,l=g.weightedValue,m=parseInt(g.rankIndex),k=e.getNextLayerConnectedCells(l),n=e.getPreviousLayerConnectedCells(l),p=k.length,q=n.length,r=this.medianXValue(k,l+1),t=this.medianXValue(n,
-l-1),u=p+q,x=e.getGeneralPurposeVariable(l),y=x;0<u&&(y=(r*p+t*q)/u);p=!1;y<x-1?0==m?(e.setGeneralPurposeVariable(l,y),p=!0):(m=d[l][m-1],x=m.getGeneralPurposeVariable(l),x=x+m.width/2+this.intraCellSpacing+e.width/2,x<y?(e.setGeneralPurposeVariable(l,y),p=!0):x<e.getGeneralPurposeVariable(l)-1&&(e.setGeneralPurposeVariable(l,x),p=!0)):y>x+1&&(m==d[l].length-1?(e.setGeneralPurposeVariable(l,y),p=!0):(m=d[l][m+1],x=m.getGeneralPurposeVariable(l),x=x-m.width/2-this.intraCellSpacing-e.width/2,x>y?(e.setGeneralPurposeVariable(l,
-y),p=!0):x>e.getGeneralPurposeVariable(l)+1&&(e.setGeneralPurposeVariable(l,x),p=!0)));if(p){for(e=0;e<k.length;e++)l=k[e],l=c.get(l),null!=l&&0==l.visited&&(l.visited=!0,b.push(l));for(e=0;e<n.length;e++)l=n[e],l=c.get(l),null!=l&&0==l.visited&&(l.visited=!0,b.push(l))}g.visited=!1;f++}};mxCoordinateAssignment.prototype.medianPos=function(a,b){if(0==a%2)for(var c=b.maxRank;0<c;c--)this.rankMedianPosition(c-1,b,c);else for(c=0;c<b.maxRank-1;c++)this.rankMedianPosition(c+1,b,c)};
-mxCoordinateAssignment.prototype.rankMedianPosition=function(a,b,c){b=b.ranks[a];for(var d=[],e={},f=0;f<b.length;f++){var g=b[f];d[f]=new WeightedCellSorter;d[f].cell=g;d[f].rankIndex=f;e[g.id]=d[f];var k;k=c<a?g.getPreviousLayerConnectedCells(a):g.getNextLayerConnectedCells(a);d[f].weightedValue=this.calculatedWeightedValue(g,k)}d.sort(WeightedCellSorter.prototype.compare);for(f=0;f<d.length;f++){var l,g=d[f].cell;l=0;k=c<a?g.getPreviousLayerConnectedCells(a).slice():g.getNextLayerConnectedCells(a).slice();
-null!=k&&(l=k.length,l=0<l?this.medianXValue(k,c):g.getGeneralPurposeVariable(a));var m=0;k=-1E8;for(var n=d[f].rankIndex-1;0<=n;){var p=e[b[n].id];if(null!=p){var q=p.cell;p.visited?(k=q.getGeneralPurposeVariable(a)+q.width/2+this.intraCellSpacing+m+g.width/2,n=-1):(m+=q.width+this.intraCellSpacing,n--)}}m=0;q=1E8;for(n=d[f].rankIndex+1;n<d.length;)if(p=e[b[n].id],null!=p){var r=p.cell;p.visited?(q=r.getGeneralPurposeVariable(a)-r.width/2-this.intraCellSpacing-m-g.width/2,n=d.length):(m+=r.width+
-this.intraCellSpacing,n++)}l>=k&&l<=q?g.setGeneralPurposeVariable(a,l):l<k?(g.setGeneralPurposeVariable(a,k),this.currentXDelta+=k-l):l>q&&(g.setGeneralPurposeVariable(a,q),this.currentXDelta+=l-q);d[f].visited=!0}};mxCoordinateAssignment.prototype.calculatedWeightedValue=function(a,b){for(var c=0,d=0;d<b.length;d++){var e=b[d];a.isVertex()&&e.isVertex()?c++:c=a.isEdge()&&e.isEdge()?c+8:c+2}return c};
-mxCoordinateAssignment.prototype.medianXValue=function(a,b){if(0==a.length)return 0;for(var c=[],d=0;d<a.length;d++)c[d]=a[d].getGeneralPurposeVariable(b);c.sort(function(a,b){return a-b});if(1==a.length%2)return c[Math.floor(a.length/2)];d=a.length/2;return(c[d-1]+c[d])/2};
-mxCoordinateAssignment.prototype.initialCoords=function(a,b){this.calculateWidestRank(a,b);for(var c=this.widestRank;0<=c;c--)c<b.maxRank&&this.rankCoordinates(c,a,b);for(c=this.widestRank+1;c<=b.maxRank;c++)0<c&&this.rankCoordinates(c,a,b)};
-mxCoordinateAssignment.prototype.rankCoordinates=function(a,b,c){b=c.ranks[a];c=this.initialX+(this.widestRankValue-this.rankWidths[a])/2;for(var d=!1,e=0;e<b.length;e++){var f=b[e];if(f.isVertex()){var g=this.layout.getVertexBounds(f.cell);null!=g?this.orientation==mxConstants.DIRECTION_NORTH||this.orientation==mxConstants.DIRECTION_SOUTH?(f.width=g.width,f.height=g.height):(f.width=g.height,f.height=g.width):d=!0}else f.isEdge()&&(g=1,null!=f.edges?g=f.edges.length:mxLog.warn("edge.edges is null"),
-f.width=(g-1)*this.parallelEdgeSpacing);c+=f.width/2;f.setX(a,c);f.setGeneralPurposeVariable(a,c);c+=f.width/2;c+=this.intraCellSpacing}1==d&&mxLog.warn("At least one cell has no bounds")};
-mxCoordinateAssignment.prototype.calculateWidestRank=function(a,b){var c=-this.interRankCellSpacing,d=0;this.rankWidths=[];this.rankY=[];for(var e=b.maxRank;0<=e;e--){for(var f=0,g=b.ranks[e],k=this.initialX,l=!1,m=0;m<g.length;m++){var n=g[m];if(n.isVertex()){var p=this.layout.getVertexBounds(n.cell);null!=p?this.orientation==mxConstants.DIRECTION_NORTH||this.orientation==mxConstants.DIRECTION_SOUTH?(n.width=p.width,n.height=p.height):(n.width=p.height,n.height=p.width):l=!0;f=Math.max(f,n.height)}else n.isEdge()&&
-(p=1,null!=n.edges?p=n.edges.length:mxLog.warn("edge.edges is null"),n.width=(p-1)*this.parallelEdgeSpacing);k+=n.width/2;n.setX(e,k);n.setGeneralPurposeVariable(e,k);k+=n.width/2;k+=this.intraCellSpacing;k>this.widestRankValue&&(this.widestRankValue=k,this.widestRank=e);this.rankWidths[e]=k}1==l&&mxLog.warn("At least one cell has no bounds");this.rankY[e]=c;k=f/2+d/2+this.interRankCellSpacing;d=f;c=this.orientation==mxConstants.DIRECTION_NORTH||this.orientation==mxConstants.DIRECTION_WEST?c+k:c-
-k;for(m=0;m<g.length;m++)g[m].setY(e,c)}};
-mxCoordinateAssignment.prototype.minPath=function(a,b){for(var c=b.edgeMapper.getValues(),d=0;d<c.length;d++){var e=c[d];if(!(1>e.maxRank-e.minRank-1)){for(var f=e.getGeneralPurposeVariable(e.minRank+1),g=!0,k=0,l=e.minRank+2;l<e.maxRank;l++){var m=e.getGeneralPurposeVariable(l);f!=m?(g=!1,f=m):k++}if(!g){for(var g=f=0,m=[],n=[],p=e.getGeneralPurposeVariable(e.minRank+1),l=e.minRank+1;l<e.maxRank-1;l++){var q=e.getX(l+1);p==q?(m[l-e.minRank-1]=p,f++):this.repositionValid(b,e,l+1,p)?(m[l-e.minRank-
-1]=p,f++):p=m[l-e.minRank-1]=q}p=e.getX(l);for(l=e.maxRank-1;l>e.minRank+1;l--)q=e.getX(l-1),p==q?(n[l-e.minRank-2]=p,g++):this.repositionValid(b,e,l-1,p)?(n[l-e.minRank-2]=p,g++):(n[l-e.minRank-2]=e.getX(l-1),p=q);if(g>k||f>k)if(g>=f)for(l=e.maxRank-2;l>e.minRank;l--)e.setX(l,n[l-e.minRank-1]);else if(f>g)for(l=e.minRank+2;l<e.maxRank;l++)e.setX(l,m[l-e.minRank-2])}}}};
-mxCoordinateAssignment.prototype.repositionValid=function(a,b,c,d){a=a.ranks[c];for(var e=-1,f=0;f<a.length;f++)if(b==a[f]){e=f;break}if(0>e)return!1;f=b.getGeneralPurposeVariable(c);if(d<f){if(0==e)return!0;a=a[e-1];c=a.getGeneralPurposeVariable(c);c=c+a.width/2+this.intraCellSpacing+b.width/2;if(!(c<=d))return!1}else if(d>f){if(e==a.length-1)return!0;a=a[e+1];c=a.getGeneralPurposeVariable(c);c=c-a.width/2-this.intraCellSpacing-b.width/2;if(!(c>=d))return!1}return!0};
-mxCoordinateAssignment.prototype.setCellLocations=function(a,b){this.rankTopY=[];this.rankBottomY=[];for(var c=0;c<b.ranks.length;c++)this.rankTopY[c]=Number.MAX_VALUE,this.rankBottomY[c]=-Number.MAX_VALUE;for(var d=b.vertexMapper.getValues(),c=0;c<d.length;c++)this.setVertexLocation(d[c]);this.layout.edgeStyle!=mxHierarchicalEdgeStyle.ORTHOGONAL&&this.layout.edgeStyle!=mxHierarchicalEdgeStyle.POLYLINE&&this.layout.edgeStyle!=mxHierarchicalEdgeStyle.CURVE||this.localEdgeProcessing(b);d=b.edgeMapper.getValues();
-for(c=0;c<d.length;c++)this.setEdgePosition(d[c])};
-mxCoordinateAssignment.prototype.localEdgeProcessing=function(a){for(var b=0;b<a.ranks.length;b++)for(var c=a.ranks[b],d=0;d<c.length;d++){var e=c[d];if(e.isVertex())for(var f=e.getPreviousLayerConnectedCells(b),g=b-1,k=0;2>k;k++){if(-1<g&&g<a.ranks.length&&null!=f&&0<f.length){for(var l=[],m=0;m<f.length;m++){var n=new WeightedCellSorter(f[m],f[m].getX(g));l.push(n)}l.sort(WeightedCellSorter.prototype.compare);for(var n=e.x[0]-e.width/2,p=n+e.width,q=f=0,g=[],m=0;m<l.length;m++){var r=l[m].cell,
-t;if(r.isVertex()){t=0==k?e.connectsAsSource:e.connectsAsTarget;for(var u=0;u<t.length;u++)if(t[u].source==r||t[u].target==r)f+=t[u].edges.length,q++,g.push(t[u])}else f+=r.edges.length,q++,g.push(r)}e.width>(f+1)*this.prefHozEdgeSep+2*this.prefHozEdgeSep&&(n+=this.prefHozEdgeSep,p-=this.prefHozEdgeSep);l=(p-n)/f;n+=l/2;p=this.minEdgeJetty-this.prefVertEdgeOff;for(m=0;m<g.length;m++)for(q=g[m].edges.length,r=this.jettyPositions[g[m].ids[0]],null==r&&(r=[],this.jettyPositions[g[m].ids[0]]=r),m<f/2?
-p+=this.prefVertEdgeOff:m>f/2&&(p-=this.prefVertEdgeOff),t=0;t<q;t++)r[4*t+2*k]=n,n+=l,r[4*t+2*k+1]=p}f=e.getNextLayerConnectedCells(b);g=b+1}}};
-mxCoordinateAssignment.prototype.setEdgePosition=function(a){var b=0;if(101207!=a.temp[0]){var c=a.maxRank,d=a.minRank;c==d&&(c=a.source.maxRank,d=a.target.minRank);for(var e=0,f=this.jettyPositions[a.ids[0]],g=a.isReversed?a.target.cell:a.source.cell,k=this.layout.graph,l=this.orientation==mxConstants.DIRECTION_EAST||this.orientation==mxConstants.DIRECTION_SOUTH,m=0;m<a.edges.length;m++){var n=a.edges[m],p=this.layout.getVisibleTerminal(n,!0),q=[],r=a.isReversed;p!=g&&(r=!r);if(null!=f){var t=r?
-2:0,u=r?l?this.rankBottomY[d]:this.rankTopY[d]:l?this.rankTopY[c]:this.rankBottomY[c],x=f[4*e+1+t];r!=l&&(x=-x);var u=u+x,t=f[4*e+t],y=k.model.getTerminal(n,!0);this.layout.isPort(y)&&k.model.getParent(y)==p&&(t=k.view.getState(y),t=null!=t?t.x:p.geometry.x+a.source.width*y.geometry.x);this.orientation==mxConstants.DIRECTION_NORTH||this.orientation==mxConstants.DIRECTION_SOUTH?(q.push(new mxPoint(t,u)),this.layout.edgeStyle==mxHierarchicalEdgeStyle.CURVE&&q.push(new mxPoint(t,u+x))):(q.push(new mxPoint(u,
-t)),this.layout.edgeStyle==mxHierarchicalEdgeStyle.CURVE&&q.push(new mxPoint(u+x,t)))}t=a.x.length-1;u=x=-1;p=a.maxRank-1;r&&(t=0,x=a.x.length,u=1,p=a.minRank+1);for(;a.maxRank!=a.minRank&&t!=x;t+=u){var y=a.x[t]+b,B=(this.rankTopY[p]+this.rankBottomY[p+1])/2,A=(this.rankTopY[p-1]+this.rankBottomY[p])/2;if(r)var z=B,B=A,A=z;this.orientation==mxConstants.DIRECTION_NORTH||this.orientation==mxConstants.DIRECTION_SOUTH?(q.push(new mxPoint(y,B)),q.push(new mxPoint(y,A))):(q.push(new mxPoint(B,y)),q.push(new mxPoint(A,
-y)));this.limitX=Math.max(this.limitX,y);p+=u}null!=f&&(t=r?2:0,u=r?l?this.rankTopY[c]:this.rankBottomY[c]:l?this.rankBottomY[d]:this.rankTopY[d],x=f[4*e+3-t],r!=l&&(x=-x),u-=x,t=f[4*e+2-t],r=k.model.getTerminal(n,!1),p=this.layout.getVisibleTerminal(n,!1),this.layout.isPort(r)&&k.model.getParent(r)==p&&(t=k.view.getState(r),t=null!=t?t.x:p.geometry.x+a.target.width*r.geometry.x),this.orientation==mxConstants.DIRECTION_NORTH||this.orientation==mxConstants.DIRECTION_SOUTH?(this.layout.edgeStyle==mxHierarchicalEdgeStyle.CURVE&&
-q.push(new mxPoint(t,u-x)),q.push(new mxPoint(t,u))):(this.layout.edgeStyle==mxHierarchicalEdgeStyle.CURVE&&q.push(new mxPoint(u-x,t)),q.push(new mxPoint(u,t))));a.isReversed&&this.processReversedEdge(a,n);this.layout.setEdgePoints(n,q);b=0==b?this.parallelEdgeSpacing:0<b?-b:-b+this.parallelEdgeSpacing;e++}a.temp[0]=101207}};
-mxCoordinateAssignment.prototype.setVertexLocation=function(a){var b=a.cell,c=a.x[0]-a.width/2,d=a.y[0]-a.height/2;this.rankTopY[a.minRank]=Math.min(this.rankTopY[a.minRank],d);this.rankBottomY[a.minRank]=Math.max(this.rankBottomY[a.minRank],d+a.height);this.orientation==mxConstants.DIRECTION_NORTH||this.orientation==mxConstants.DIRECTION_SOUTH?this.layout.setVertexLocation(b,c,d):this.layout.setVertexLocation(b,d,c);this.limitX=Math.max(this.limitX,c+a.width)};
-mxCoordinateAssignment.prototype.processReversedEdge=function(a,b){};function mxSwimlaneOrdering(a){this.layout=a}mxSwimlaneOrdering.prototype=new mxHierarchicalLayoutStage;mxSwimlaneOrdering.prototype.constructor=mxSwimlaneOrdering;mxSwimlaneOrdering.prototype.layout=null;
-mxSwimlaneOrdering.prototype.execute=function(a){a=this.layout.getModel();var b=mxUtils.clone(a.vertexMapper,null,!0),c=null;if(null!=a.roots)for(var d=a.roots,c=[],e=0;e<d.length;e++)c[e]=a.vertexMapper.get(d[e]);a.visit(function(a,c,d,e,m){e=null!=a&&a.swimlaneIndex==c.swimlaneIndex&&c.isAncestor(a);m=null!=a&&null!=d&&a.swimlaneIndex<c.swimlaneIndex&&d.source==c;e?(d.invert(),mxUtils.remove(d,a.connectsAsSource),c.connectsAsSource.push(d),a.connectsAsTarget.push(d),mxUtils.remove(d,c.connectsAsTarget)):
-m&&(d.invert(),mxUtils.remove(d,a.connectsAsTarget),c.connectsAsTarget.push(d),a.connectsAsSource.push(d),mxUtils.remove(d,c.connectsAsSource));a=mxCellPath.create(c.cell);delete b[a]},c,!0,null)};function mxHierarchicalLayout(a,b,c){mxGraphLayout.call(this,a);this.orientation=null!=b?b:mxConstants.DIRECTION_NORTH;this.deterministic=null!=c?c:!0}var mxHierarchicalEdgeStyle={ORTHOGONAL:1,POLYLINE:2,STRAIGHT:3,CURVE:4};mxHierarchicalLayout.prototype=new mxGraphLayout;
-mxHierarchicalLayout.prototype.constructor=mxHierarchicalLayout;mxHierarchicalLayout.prototype.roots=null;mxHierarchicalLayout.prototype.resizeParent=!1;mxHierarchicalLayout.prototype.maintainParentLocation=!1;mxHierarchicalLayout.prototype.moveParent=!1;mxHierarchicalLayout.prototype.parentBorder=0;mxHierarchicalLayout.prototype.intraCellSpacing=30;mxHierarchicalLayout.prototype.interRankCellSpacing=100;mxHierarchicalLayout.prototype.interHierarchySpacing=60;
-mxHierarchicalLayout.prototype.parallelEdgeSpacing=10;mxHierarchicalLayout.prototype.orientation=mxConstants.DIRECTION_NORTH;mxHierarchicalLayout.prototype.fineTuning=!0;mxHierarchicalLayout.prototype.tightenToSource=!0;mxHierarchicalLayout.prototype.disableEdgeStyle=!0;mxHierarchicalLayout.prototype.traverseAncestors=!0;mxHierarchicalLayout.prototype.model=null;mxHierarchicalLayout.prototype.edgesCache=null;mxHierarchicalLayout.prototype.edgeSourceTermCache=null;
-mxHierarchicalLayout.prototype.edgesTargetTermCache=null;mxHierarchicalLayout.prototype.edgeStyle=mxHierarchicalEdgeStyle.POLYLINE;mxHierarchicalLayout.prototype.getModel=function(){return this.model};
-mxHierarchicalLayout.prototype.execute=function(a,b){this.parent=a;var c=this.graph.model;this.edgesCache=new mxDictionary;this.edgeSourceTermCache=new mxDictionary;this.edgesTargetTermCache=new mxDictionary;null==b||b instanceof Array||(b=[b]);if(null!=b||null!=a){this.parentY=this.parentX=null;if(a!=this.root&&null!=c.isVertex(a)&&this.maintainParentLocation){var d=this.graph.getCellGeometry(a);null!=d&&(this.parentX=d.x,this.parentY=d.y)}if(null!=b){for(var e=[],f=0;f<b.length;f++)(null!=a?c.isAncestor(a,
-b[f]):1)&&c.isVertex(b[f])&&e.push(b[f]);this.roots=e}c.beginUpdate();try{this.run(a),this.resizeParent&&!this.graph.isCellCollapsed(a)&&this.graph.updateGroupBounds([a],this.parentBorder,this.moveParent),null!=this.parentX&&null!=this.parentY&&(d=this.graph.getCellGeometry(a),null!=d&&(d=d.clone(),d.x=this.parentX,d.y=this.parentY,c.setGeometry(a,d)))}finally{c.endUpdate()}}};
-mxHierarchicalLayout.prototype.findRoots=function(a,b){var c=[];if(null!=a&&null!=b){var d=this.graph.model,e=null,f=-1E5,g;for(g in b){var k=b[g];if(d.isVertex(k)&&this.graph.isCellVisible(k)){for(var l=this.getEdges(k),m=0,n=0,p=0;p<l.length;p++)this.getVisibleTerminal(l[p],!0)==k?m++:n++;0==n&&0<m&&c.push(k);l=m-n;l>f&&(f=l,e=k)}}0==c.length&&null!=e&&c.push(e)}return c};
-mxHierarchicalLayout.prototype.getEdges=function(a){var b=this.edgesCache.get(a);if(null!=b)return b;for(var c=this.graph.model,b=[],d=this.graph.isCellCollapsed(a),e=c.getChildCount(a),f=0;f<e;f++){var g=c.getChildAt(a,f);if(this.isPort(g))b=b.concat(c.getEdges(g,!0,!0));else if(d||!this.graph.isCellVisible(g))b=b.concat(c.getEdges(g,!0,!0))}b=b.concat(c.getEdges(a,!0,!0));c=[];for(f=0;f<b.length;f++)d=this.getVisibleTerminal(b[f],!0),e=this.getVisibleTerminal(b[f],!1),(d==e||d!=e&&(e==a&&(null==
-this.parent||this.isAncestor(this.parent,d,this.traverseAncestors))||d==a&&(null==this.parent||this.isAncestor(this.parent,e,this.traverseAncestors))))&&c.push(b[f]);this.edgesCache.put(a,c);return c};
-mxHierarchicalLayout.prototype.getVisibleTerminal=function(a,b){var c=this.edgesTargetTermCache;b&&(c=this.edgeSourceTermCache);var d=c.get(a);if(null!=d)return d;var d=this.graph.view.getState(a),e=null!=d?d.getVisibleTerminal(b):this.graph.view.getVisibleTerminal(a,b);null==e&&(e=null!=d?d.getVisibleTerminal(b):this.graph.view.getVisibleTerminal(a,b));null!=e&&(this.isPort(e)&&(e=this.graph.model.getParent(e)),c.put(a,e));return e};
-mxHierarchicalLayout.prototype.run=function(a){var b=[],c=[];if(null==this.roots&&null!=a){var d={};this.filterDescendants(a,d);this.roots=[];var e=!0,f;for(f in d)if(null!=d[f]){e=!1;break}for(;!e;){for(var g=this.findRoots(a,d),e=0;e<g.length;e++){var k={};b.push(k);this.traverse(g[e],!0,null,c,k,b,d)}for(e=0;e<g.length;e++)this.roots.push(g[e]);e=!0;for(f in d)if(null!=d[f]){e=!1;break}}}else for(e=0;e<this.roots.length;e++)k={},b.push(k),this.traverse(this.roots[e],!0,null,c,k,b,null);for(e=c=
-0;e<b.length;e++){k=b[e];d=[];for(f in k)d.push(k[f]);this.model=new mxGraphHierarchyModel(this,d,this.roots,a,this.tightenToSource);this.cycleStage(a);this.layeringStage();this.crossingStage(a);c=this.placementStage(c,a)}};
-mxHierarchicalLayout.prototype.filterDescendants=function(a,b){var c=this.graph.model;c.isVertex(a)&&a!=this.parent&&this.graph.isCellVisible(a)&&(b[mxObjectIdentity.get(a)]=a);if(this.traverseAncestors||a==this.parent&&this.graph.isCellVisible(a))for(var d=c.getChildCount(a),e=0;e<d;e++){var f=c.getChildAt(a,e);this.isPort(f)||this.filterDescendants(f,b)}};mxHierarchicalLayout.prototype.isPort=function(a){return null!=a&&null!=a.geometry?a.geometry.relative:!1};
-mxHierarchicalLayout.prototype.getEdgesBetween=function(a,b,c){c=null!=c?c:!1;for(var d=this.getEdges(a),e=[],f=0;f<d.length;f++){var g=this.getVisibleTerminal(d[f],!0),k=this.getVisibleTerminal(d[f],!1);(g==a&&k==b||!c&&g==b&&k==a)&&e.push(d[f])}return e};
-mxHierarchicalLayout.prototype.traverse=function(a,b,c,d,e,f,g){if(null!=a&&null!=d){var k=mxObjectIdentity.get(a);if(null==d[k]&&(null==g||null!=g[k])){null==e[k]&&(e[k]=a);null==d[k]&&(d[k]=a);null!==g&&delete g[k];var l=this.getEdges(a),k=[];for(c=0;c<l.length;c++)k[c]=this.getVisibleTerminal(l[c],!0)==a;for(c=0;c<l.length;c++)if(!b||k[c]){a=this.getVisibleTerminal(l[c],!k[c]);for(var m=1,n=0;n<l.length;n++)if(n!=c){var p=k[n];this.getVisibleTerminal(l[n],!p)==a&&(p?m++:m--)}0<=m&&(e=this.traverse(a,
-b,l[c],d,e,f,g))}}else if(null==e[k])for(c=0;c<f.length;c++)if(b=f[c],null!=b[k]){for(l in b)e[l]=b[l];f.splice(c,1);break}}return e};mxHierarchicalLayout.prototype.cycleStage=function(a){(new mxMinimumCycleRemover(this)).execute(a)};mxHierarchicalLayout.prototype.layeringStage=function(){this.model.initialRank();this.model.fixRanks()};mxHierarchicalLayout.prototype.crossingStage=function(a){(new mxMedianHybridCrossingReduction(this)).execute(a)};
-mxHierarchicalLayout.prototype.placementStage=function(a,b){var c=new mxCoordinateAssignment(this,this.intraCellSpacing,this.interRankCellSpacing,this.orientation,a,this.parallelEdgeSpacing);c.fineTuning=this.fineTuning;c.execute(b);return c.limitX+this.interHierarchySpacing};function mxSwimlaneLayout(a,b,c){mxGraphLayout.call(this,a);this.orientation=null!=b?b:mxConstants.DIRECTION_NORTH;this.deterministic=null!=c?c:!0}mxSwimlaneLayout.prototype=new mxGraphLayout;
-mxSwimlaneLayout.prototype.constructor=mxSwimlaneLayout;mxSwimlaneLayout.prototype.roots=null;mxSwimlaneLayout.prototype.swimlanes=null;mxSwimlaneLayout.prototype.dummyVertexWidth=50;mxSwimlaneLayout.prototype.resizeParent=!1;mxSwimlaneLayout.prototype.maintainParentLocation=!1;mxSwimlaneLayout.prototype.moveParent=!1;mxSwimlaneLayout.prototype.parentBorder=30;mxSwimlaneLayout.prototype.intraCellSpacing=30;mxSwimlaneLayout.prototype.interRankCellSpacing=100;
-mxSwimlaneLayout.prototype.interHierarchySpacing=60;mxSwimlaneLayout.prototype.parallelEdgeSpacing=10;mxSwimlaneLayout.prototype.orientation=mxConstants.DIRECTION_NORTH;mxSwimlaneLayout.prototype.fineTuning=!0;mxSwimlaneLayout.prototype.tightenToSource=!0;mxSwimlaneLayout.prototype.disableEdgeStyle=!0;mxSwimlaneLayout.prototype.traverseAncestors=!0;mxSwimlaneLayout.prototype.model=null;mxSwimlaneLayout.prototype.edgesCache=null;mxHierarchicalLayout.prototype.edgeSourceTermCache=null;
-mxHierarchicalLayout.prototype.edgesTargetTermCache=null;mxHierarchicalLayout.prototype.edgeStyle=mxHierarchicalEdgeStyle.POLYLINE;mxSwimlaneLayout.prototype.getModel=function(){return this.model};
-mxSwimlaneLayout.prototype.execute=function(a,b){this.parent=a;var c=this.graph.model;this.edgesCache=new mxDictionary;this.edgeSourceTermCache=new mxDictionary;this.edgesTargetTermCache=new mxDictionary;if(!(null==b||1>b.length)){null==a&&(a=c.getParent(b[0]));this.parentY=this.parentX=null;if(a!=this.root&&null!=c.isVertex(a)&&this.maintainParentLocation){var d=this.graph.getCellGeometry(a);null!=d&&(this.parentX=d.x,this.parentY=d.y)}this.swimlanes=b;for(var e=[],f=0;f<b.length;f++){var g=this.graph.getChildCells(b[f]);
-if(null==g||0==g.length)g=this.graph.insertVertex(b[f],null,null,0,0,this.dummyVertexWidth,0),e.push(g)}c.beginUpdate();try{this.run(a),this.resizeParent&&!this.graph.isCellCollapsed(a)&&this.graph.updateGroupBounds([a],this.parentBorder,this.moveParent),null!=this.parentX&&null!=this.parentY&&(d=this.graph.getCellGeometry(a),null!=d&&(d=d.clone(),d.x=this.parentX,d.y=this.parentY,c.setGeometry(a,d))),this.graph.removeCells(e)}finally{c.endUpdate()}}};
-mxSwimlaneLayout.prototype.updateGroupBounds=function(){var a=[],b=this.model,c;for(c in b.edgeMapper)for(var d=b.edgeMapper[c],e=0;e<d.edges.length;e++)a.push(d.edges[e]);a=this.graph.getBoundingBoxFromGeometry(a,!0);b=[];for(e=0;e<this.swimlanes.length;e++){var f=this.swimlanes[e];c=this.graph.getCellGeometry(f);if(null!=c){var g=this.graph.getChildCells(f),d=this.graph.isSwimlane(f)?this.graph.getStartSize(f):new mxRectangle,f=this.graph.getBoundingBoxFromGeometry(g);b[e]=f;d=f.y+c.y-d.height-
-this.parentBorder;c=f.y+c.y+f.height;null==a?a=new mxRectangle(0,d,0,c-d):(a.y=Math.min(a.y,d),a.height=Math.max(a.y+a.height,c)-a.y)}}for(e=0;e<this.swimlanes.length;e++)if(f=this.swimlanes[e],c=this.graph.getCellGeometry(f),null!=c){var g=this.graph.getChildCells(f),d=this.graph.isSwimlane(f)?this.graph.getStartSize(f):new mxRectangle,k=c.clone(),l=d.width+(0==e?this.parentBorder:this.interRankCellSpacing/2),m=b[e].x-l,n=a.y-this.parentBorder;k.x+=m;k.y=n;k.width=b[e].width+l+this.interRankCellSpacing/
-2;k.height=a.height+d.height+2*this.parentBorder;this.graph.model.setGeometry(f,k);this.graph.moveCells(g,-m,c.y-n)}};
-mxSwimlaneLayout.prototype.findRoots=function(a,b){var c=[];if(null!=a&&null!=b){var d=this.graph.model,e=null,f=-1E5,g;for(g in b){var k=b[g];if(null!=k&&d.isVertex(k)&&this.graph.isCellVisible(k)&&d.isAncestor(a,k)){for(var l=this.getEdges(k),m=0,n=0,p=0;p<l.length;p++){var q=this.getVisibleTerminal(l[p],!0);q==k?(q=this.getVisibleTerminal(l[p],!1),d.isAncestor(a,q)&&m++):d.isAncestor(a,q)&&n++}0==n&&0<m&&c.push(k);l=m-n;l>f&&(f=l,e=k)}}0==c.length&&null!=e&&c.push(e)}return c};
-mxSwimlaneLayout.prototype.getEdges=function(a){var b=this.edgesCache.get(a);if(null!=b)return b;for(var c=this.graph.model,b=[],d=this.graph.isCellCollapsed(a),e=c.getChildCount(a),f=0;f<e;f++){var g=c.getChildAt(a,f);if(this.isPort(g))b=b.concat(c.getEdges(g,!0,!0));else if(d||!this.graph.isCellVisible(g))b=b.concat(c.getEdges(g,!0,!0))}b=b.concat(c.getEdges(a,!0,!0));c=[];for(f=0;f<b.length;f++)d=this.getVisibleTerminal(b[f],!0),e=this.getVisibleTerminal(b[f],!1),(d==e||d!=e&&(e==a&&(null==this.parent||
-this.graph.isValidAncestor(d,this.parent,this.traverseAncestors))||d==a&&(null==this.parent||this.graph.isValidAncestor(e,this.parent,this.traverseAncestors))))&&c.push(b[f]);this.edgesCache.put(a,c);return c};
-mxSwimlaneLayout.prototype.getVisibleTerminal=function(a,b){var c=this.edgesTargetTermCache;b&&(c=this.edgeSourceTermCache);var d=c.get(a);if(null!=d)return d;var d=this.graph.view.getState(a),e=null!=d?d.getVisibleTerminal(b):this.graph.view.getVisibleTerminal(a,b);null==e&&(e=null!=d?d.getVisibleTerminal(b):this.graph.view.getVisibleTerminal(a,b));null!=e&&(this.isPort(e)&&(e=this.graph.model.getParent(e)),c.put(a,e));return e};
-mxSwimlaneLayout.prototype.run=function(a){var b=[],c={};if(null!=this.swimlanes&&0<this.swimlanes.length&&null!=a){for(var d={},e=0;e<this.swimlanes.length;e++)this.filterDescendants(this.swimlanes[e],d);this.roots=[];var e=!0,f;for(f in d)if(null!=d[f]){e=!1;break}for(var g=0;!e&&g<this.swimlanes.length;){var k=this.findRoots(this.swimlanes[g],d);if(0==k.length)g++;else{for(e=0;e<k.length;e++){var l={};b.push(l);this.traverse(k[e],!0,null,c,l,b,d,g)}for(e=0;e<k.length;e++)this.roots.push(k[e]);
-e=!0;for(f in d)if(null!=d[f]){e=!1;break}}}}else for(e=0;e<this.roots.length;e++)l={},b.push(l),this.traverse(this.roots[e],!0,null,c,l,b,null);b=[];for(f in c)b.push(c[f]);this.model=new mxSwimlaneModel(this,b,this.roots,a,this.tightenToSource);this.cycleStage(a);this.layeringStage();this.crossingStage(a);this.placementStage(0,a)};
-mxSwimlaneLayout.prototype.filterDescendants=function(a,b){var c=this.graph.model;c.isVertex(a)&&a!=this.parent&&c.getParent(a)!=this.parent&&this.graph.isCellVisible(a)&&(b[mxObjectIdentity.get(a)]=a);if(this.traverseAncestors||a==this.parent&&this.graph.isCellVisible(a))for(var d=c.getChildCount(a),e=0;e<d;e++){var f=c.getChildAt(a,e);this.isPort(f)||this.filterDescendants(f,b)}};mxSwimlaneLayout.prototype.isPort=function(a){return a.geometry.relative?!0:!1};
-mxSwimlaneLayout.prototype.getEdgesBetween=function(a,b,c){c=null!=c?c:!1;for(var d=this.getEdges(a),e=[],f=0;f<d.length;f++){var g=this.getVisibleTerminal(d[f],!0),k=this.getVisibleTerminal(d[f],!1);(g==a&&k==b||!c&&g==b&&k==a)&&e.push(d[f])}return e};
-mxSwimlaneLayout.prototype.traverse=function(a,b,c,d,e,f,g,k){if(null!=a&&null!=d){var l=mxObjectIdentity.get(a);if(null==d[l]&&(null==g||null!=g[l])){null==e[l]&&(e[l]=a);null==d[l]&&(d[l]=a);null!==g&&delete g[l];var m=this.getEdges(a),l=this.graph.model;for(c=0;c<m.length;c++){var n=this.getVisibleTerminal(m[c],!0),p=n==a;p&&(n=this.getVisibleTerminal(m[c],!1));var q;for(q=0;q<this.swimlanes.length&&!l.isAncestor(this.swimlanes[q],n);q++);q>=this.swimlanes.length||!(q>k||(!b||p)&&q==k)||(e=this.traverse(n,
-b,m[c],d,e,f,g,q))}}else if(null==e[l])for(c=0;c<f.length;c++)if(a=f[c],null!=a[l]){for(m in a)e[m]=a[m];f.splice(c,1);break}}return e};mxSwimlaneLayout.prototype.cycleStage=function(a){(new mxSwimlaneOrdering(this)).execute(a)};mxSwimlaneLayout.prototype.layeringStage=function(){this.model.initialRank();this.model.fixRanks()};mxSwimlaneLayout.prototype.crossingStage=function(a){(new mxMedianHybridCrossingReduction(this)).execute(a)};
-mxSwimlaneLayout.prototype.placementStage=function(a,b){var c=new mxCoordinateAssignment(this,this.intraCellSpacing,this.interRankCellSpacing,this.orientation,a,this.parallelEdgeSpacing);c.fineTuning=this.fineTuning;c.execute(b);return c.limitX+this.interHierarchySpacing};function mxGraphModel(a){this.currentEdit=this.createUndoableEdit();null!=a?this.setRoot(a):this.clear()}mxGraphModel.prototype=new mxEventSource;mxGraphModel.prototype.constructor=mxGraphModel;mxGraphModel.prototype.root=null;
-mxGraphModel.prototype.cells=null;mxGraphModel.prototype.maintainEdgeParent=!0;mxGraphModel.prototype.ignoreRelativeEdgeParent=!0;mxGraphModel.prototype.createIds=!0;mxGraphModel.prototype.prefix="";mxGraphModel.prototype.postfix="";mxGraphModel.prototype.nextId=0;mxGraphModel.prototype.currentEdit=null;mxGraphModel.prototype.updateLevel=0;mxGraphModel.prototype.endingUpdate=!1;mxGraphModel.prototype.clear=function(){this.setRoot(this.createRoot())};mxGraphModel.prototype.isCreateIds=function(){return this.createIds};
-mxGraphModel.prototype.setCreateIds=function(a){this.createIds=a};mxGraphModel.prototype.createRoot=function(){var a=new mxCell;a.insert(new mxCell);return a};mxGraphModel.prototype.getCell=function(a){return null!=this.cells?this.cells[a]:null};mxGraphModel.prototype.filterCells=function(a,b){var c=null;if(null!=a)for(var c=[],d=0;d<a.length;d++)b(a[d])&&c.push(a[d]);return c};mxGraphModel.prototype.getDescendants=function(a){return this.filterDescendants(null,a)};
-mxGraphModel.prototype.filterDescendants=function(a,b){var c=[];b=b||this.getRoot();(null==a||a(b))&&c.push(b);for(var d=this.getChildCount(b),e=0;e<d;e++)var f=this.getChildAt(b,e),c=c.concat(this.filterDescendants(a,f));return c};mxGraphModel.prototype.getRoot=function(a){var b=a||this.root;if(null!=a)for(;null!=a;)b=a,a=this.getParent(a);return b};mxGraphModel.prototype.setRoot=function(a){this.execute(new mxRootChange(this,a));return a};
-mxGraphModel.prototype.rootChanged=function(a){var b=this.root;this.root=a;this.nextId=0;this.cells=null;this.cellAdded(a);return b};mxGraphModel.prototype.isRoot=function(a){return null!=a&&this.root==a};mxGraphModel.prototype.isLayer=function(a){return this.isRoot(this.getParent(a))};mxGraphModel.prototype.isAncestor=function(a,b){for(;null!=b&&b!=a;)b=this.getParent(b);return b==a};mxGraphModel.prototype.contains=function(a){return this.isAncestor(this.root,a)};
-mxGraphModel.prototype.getParent=function(a){return null!=a?a.getParent():null};mxGraphModel.prototype.add=function(a,b,c){if(b!=a&&null!=a&&null!=b){null==c&&(c=this.getChildCount(a));var d=a!=this.getParent(b);this.execute(new mxChildChange(this,a,b,c));this.maintainEdgeParent&&d&&this.updateEdgeParents(b)}return b};
-mxGraphModel.prototype.cellAdded=function(a){if(null!=a){null==a.getId()&&this.createIds&&a.setId(this.createId(a));if(null!=a.getId()){var b=this.getCell(a.getId());if(b!=a){for(;null!=b;)a.setId(this.createId(a)),b=this.getCell(a.getId());null==this.cells&&(this.cells={});this.cells[a.getId()]=a}}mxUtils.isNumeric(a.getId())&&(this.nextId=Math.max(this.nextId,a.getId()));for(var b=this.getChildCount(a),c=0;c<b;c++)this.cellAdded(this.getChildAt(a,c))}};
-mxGraphModel.prototype.createId=function(a){a=this.nextId;this.nextId++;return this.prefix+a+this.postfix};mxGraphModel.prototype.updateEdgeParents=function(a,b){b=b||this.getRoot(a);for(var c=this.getChildCount(a),d=0;d<c;d++){var e=this.getChildAt(a,d);this.updateEdgeParents(e,b)}e=this.getEdgeCount(a);c=[];for(d=0;d<e;d++)c.push(this.getEdgeAt(a,d));for(d=0;d<c.length;d++)e=c[d],this.isAncestor(b,e)&&this.updateEdgeParent(e,b)};
-mxGraphModel.prototype.updateEdgeParent=function(a,b){for(var c=this.getTerminal(a,!0),d=this.getTerminal(a,!1);null!=c&&!this.isEdge(c)&&null!=c.geometry&&c.geometry.relative;)c=this.getParent(c);for(;null!=d&&this.ignoreRelativeEdgeParent&&!this.isEdge(d)&&null!=d.geometry&&d.geometry.relative;)d=this.getParent(d);if(this.isAncestor(b,c)&&this.isAncestor(b,d)&&(c=c==d?this.getParent(c):this.getNearestCommonAncestor(c,d),null!=c&&(this.getParent(c)!=this.root||this.isAncestor(c,a))&&this.getParent(a)!=
-c)){d=this.getGeometry(a);if(null!=d){var e=this.getOrigin(this.getParent(a)),f=this.getOrigin(c),g=f.x-e.x,e=f.y-e.y,d=d.clone();d.translate(-g,-e);this.setGeometry(a,d)}this.add(c,a,this.getChildCount(c))}};mxGraphModel.prototype.getOrigin=function(a){var b;null!=a?(b=this.getOrigin(this.getParent(a)),this.isEdge(a)||(a=this.getGeometry(a),null!=a&&(b.x+=a.x,b.y+=a.y))):b=new mxPoint;return b};
-mxGraphModel.prototype.getNearestCommonAncestor=function(a,b){if(null!=a&&null!=b){var c=mxCellPath.create(b);if(null!=c&&0<c.length){var d=a,e=mxCellPath.create(d);if(c.length<e.length)var d=b,f=e,e=c,c=f;for(;null!=d;){f=this.getParent(d);if(0==c.indexOf(e+mxCellPath.PATH_SEPARATOR)&&null!=f)return d;e=mxCellPath.getParentPath(e);d=f}}}return null};mxGraphModel.prototype.remove=function(a){a==this.root?this.setRoot(null):null!=this.getParent(a)&&this.execute(new mxChildChange(this,null,a));return a};
-mxGraphModel.prototype.cellRemoved=function(a){if(null!=a&&null!=this.cells){for(var b=this.getChildCount(a)-1;0<=b;b--)this.cellRemoved(this.getChildAt(a,b));null!=this.cells&&null!=a.getId()&&delete this.cells[a.getId()]}};mxGraphModel.prototype.parentForCellChanged=function(a,b,c){var d=this.getParent(a);null!=b?b==d&&d.getIndex(a)==c||b.insert(a,c):null!=d&&(c=d.getIndex(a),d.remove(c));b=this.contains(b);c=this.contains(d);b&&!c?this.cellAdded(a):c&&!b&&this.cellRemoved(a);return d};
-mxGraphModel.prototype.getChildCount=function(a){return null!=a?a.getChildCount():0};mxGraphModel.prototype.getChildAt=function(a,b){return null!=a?a.getChildAt(b):null};mxGraphModel.prototype.getChildren=function(a){return null!=a?a.children:null};mxGraphModel.prototype.getChildVertices=function(a){return this.getChildCells(a,!0,!1)};mxGraphModel.prototype.getChildEdges=function(a){return this.getChildCells(a,!1,!0)};
-mxGraphModel.prototype.getChildCells=function(a,b,c){b=null!=b?b:!1;c=null!=c?c:!1;for(var d=this.getChildCount(a),e=[],f=0;f<d;f++){var g=this.getChildAt(a,f);(!c&&!b||c&&this.isEdge(g)||b&&this.isVertex(g))&&e.push(g)}return e};mxGraphModel.prototype.getTerminal=function(a,b){return null!=a?a.getTerminal(b):null};
-mxGraphModel.prototype.setTerminal=function(a,b,c){var d=b!=this.getTerminal(a,c);this.execute(new mxTerminalChange(this,a,b,c));this.maintainEdgeParent&&d&&this.updateEdgeParent(a,this.getRoot());return b};mxGraphModel.prototype.setTerminals=function(a,b,c){this.beginUpdate();try{this.setTerminal(a,b,!0),this.setTerminal(a,c,!1)}finally{this.endUpdate()}};
-mxGraphModel.prototype.terminalForCellChanged=function(a,b,c){var d=this.getTerminal(a,c);null!=b?b.insertEdge(a,c):null!=d&&d.removeEdge(a,c);return d};mxGraphModel.prototype.getEdgeCount=function(a){return null!=a?a.getEdgeCount():0};mxGraphModel.prototype.getEdgeAt=function(a,b){return null!=a?a.getEdgeAt(b):null};mxGraphModel.prototype.getDirectedEdgeCount=function(a,b,c){for(var d=0,e=this.getEdgeCount(a),f=0;f<e;f++){var g=this.getEdgeAt(a,f);g!=c&&this.getTerminal(g,b)==a&&d++}return d};
-mxGraphModel.prototype.getConnections=function(a){return this.getEdges(a,!0,!0,!1)};mxGraphModel.prototype.getIncomingEdges=function(a){return this.getEdges(a,!0,!1,!1)};mxGraphModel.prototype.getOutgoingEdges=function(a){return this.getEdges(a,!1,!0,!1)};
-mxGraphModel.prototype.getEdges=function(a,b,c,d){b=null!=b?b:!0;c=null!=c?c:!0;d=null!=d?d:!0;for(var e=this.getEdgeCount(a),f=[],g=0;g<e;g++){var k=this.getEdgeAt(a,g),l=this.getTerminal(k,!0),m=this.getTerminal(k,!1);(d&&l==m||l!=m&&(b&&m==a||c&&l==a))&&f.push(k)}return f};
-mxGraphModel.prototype.getEdgesBetween=function(a,b,c){c=null!=c?c:!1;var d=this.getEdgeCount(a),e=this.getEdgeCount(b),f=a,g=d;e<d&&(g=e,f=b);d=[];for(e=0;e<g;e++){var k=this.getEdgeAt(f,e),l=this.getTerminal(k,!0),m=this.getTerminal(k,!1),n=m==a&&l==b;(l==a&&m==b||!c&&n)&&d.push(k)}return d};
-mxGraphModel.prototype.getOpposites=function(a,b,c,d){c=null!=c?c:!0;d=null!=d?d:!0;var e=[];if(null!=a)for(var f=0;f<a.length;f++){var g=this.getTerminal(a[f],!0),k=this.getTerminal(a[f],!1);g==b&&null!=k&&k!=b&&d?e.push(k):k==b&&null!=g&&g!=b&&c&&e.push(g)}return e};
-mxGraphModel.prototype.getTopmostCells=function(a){for(var b=new mxDictionary,c=[],d=0;d<a.length;d++)b.put(a[d],!0);for(d=0;d<a.length;d++){for(var e=a[d],f=!0,g=this.getParent(e);null!=g;){if(b.get(g)){f=!1;break}g=this.getParent(g)}f&&c.push(e)}return c};mxGraphModel.prototype.isVertex=function(a){return null!=a?a.isVertex():!1};mxGraphModel.prototype.isEdge=function(a){return null!=a?a.isEdge():!1};mxGraphModel.prototype.isConnectable=function(a){return null!=a?a.isConnectable():!1};
-mxGraphModel.prototype.getValue=function(a){return null!=a?a.getValue():null};mxGraphModel.prototype.setValue=function(a,b){this.execute(new mxValueChange(this,a,b));return b};mxGraphModel.prototype.valueForCellChanged=function(a,b){return a.valueChanged(b)};mxGraphModel.prototype.getGeometry=function(a){return null!=a?a.getGeometry():null};mxGraphModel.prototype.setGeometry=function(a,b){b!=this.getGeometry(a)&&this.execute(new mxGeometryChange(this,a,b));return b};
-mxGraphModel.prototype.geometryForCellChanged=function(a,b){var c=this.getGeometry(a);a.setGeometry(b);return c};mxGraphModel.prototype.getStyle=function(a){return null!=a?a.getStyle():null};mxGraphModel.prototype.setStyle=function(a,b){b!=this.getStyle(a)&&this.execute(new mxStyleChange(this,a,b));return b};mxGraphModel.prototype.styleForCellChanged=function(a,b){var c=this.getStyle(a);a.setStyle(b);return c};mxGraphModel.prototype.isCollapsed=function(a){return null!=a?a.isCollapsed():!1};
-mxGraphModel.prototype.setCollapsed=function(a,b){b!=this.isCollapsed(a)&&this.execute(new mxCollapseChange(this,a,b));return b};mxGraphModel.prototype.collapsedStateForCellChanged=function(a,b){var c=this.isCollapsed(a);a.setCollapsed(b);return c};mxGraphModel.prototype.isVisible=function(a){return null!=a?a.isVisible():!1};mxGraphModel.prototype.setVisible=function(a,b){b!=this.isVisible(a)&&this.execute(new mxVisibleChange(this,a,b));return b};
-mxGraphModel.prototype.visibleStateForCellChanged=function(a,b){var c=this.isVisible(a);a.setVisible(b);return c};mxGraphModel.prototype.execute=function(a){a.execute();this.beginUpdate();this.currentEdit.add(a);this.fireEvent(new mxEventObject(mxEvent.EXECUTE,"change",a));this.fireEvent(new mxEventObject(mxEvent.EXECUTED,"change",a));this.endUpdate()};mxGraphModel.prototype.beginUpdate=function(){this.updateLevel++;this.fireEvent(new mxEventObject(mxEvent.BEGIN_UPDATE));1==this.updateLevel&&this.fireEvent(new mxEventObject(mxEvent.START_EDIT))};
-mxGraphModel.prototype.endUpdate=function(){this.updateLevel--;0==this.updateLevel&&this.fireEvent(new mxEventObject(mxEvent.END_EDIT));if(!this.endingUpdate){this.endingUpdate=0==this.updateLevel;this.fireEvent(new mxEventObject(mxEvent.END_UPDATE,"edit",this.currentEdit));try{if(this.endingUpdate&&!this.currentEdit.isEmpty()){this.fireEvent(new mxEventObject(mxEvent.BEFORE_UNDO,"edit",this.currentEdit));var a=this.currentEdit;this.currentEdit=this.createUndoableEdit();a.notify();this.fireEvent(new mxEventObject(mxEvent.UNDO,
-"edit",a))}}finally{this.endingUpdate=!1}}};mxGraphModel.prototype.createUndoableEdit=function(a){var b=new mxUndoableEdit(this,null!=a?a:!0);b.notify=function(){b.source.fireEvent(new mxEventObject(mxEvent.CHANGE,"edit",b,"changes",b.changes));b.source.fireEvent(new mxEventObject(mxEvent.NOTIFY,"edit",b,"changes",b.changes))};return b};
-mxGraphModel.prototype.mergeChildren=function(a,b,c){c=null!=c?c:!0;this.beginUpdate();try{var d={};this.mergeChildrenImpl(a,b,c,d);for(var e in d){var f=d[e],g=this.getTerminal(f,!0);null!=g&&(g=d[mxCellPath.create(g)],this.setTerminal(f,g,!0));g=this.getTerminal(f,!1);null!=g&&(g=d[mxCellPath.create(g)],this.setTerminal(f,g,!1))}}finally{this.endUpdate()}};
-mxGraphModel.prototype.mergeChildrenImpl=function(a,b,c,d){this.beginUpdate();try{for(var e=a.getChildCount(),f=0;f<e;f++){var g=a.getChildAt(f);if("function"==typeof g.getId){var k=g.getId(),l=null==k||this.isEdge(g)&&c?null:this.getCell(k);if(null==l){var m=g.clone();m.setId(k);m.setTerminal(g.getTerminal(!0),!0);m.setTerminal(g.getTerminal(!1),!1);l=b.insert(m);this.cellAdded(l)}d[mxCellPath.create(g)]=l;this.mergeChildrenImpl(g,l,c,d)}}}finally{this.endUpdate()}};
-mxGraphModel.prototype.getParents=function(a){var b=[];if(null!=a)for(var c=new mxDictionary,d=0;d<a.length;d++){var e=this.getParent(a[d]);null==e||c.get(e)||(c.put(e,!0),b.push(e))}return b};mxGraphModel.prototype.cloneCell=function(a,b){return null!=a?this.cloneCells([a],b)[0]:null};
-mxGraphModel.prototype.cloneCells=function(a,b,c){b=null!=b?b:!0;c=null!=c?c:{};for(var d=[],e=0;e<a.length;e++)null!=a[e]?d.push(this.cloneCellImpl(a[e],c,b)):d.push(null);for(e=0;e<d.length;e++)null!=d[e]&&this.restoreClone(d[e],a[e],c);return d};mxGraphModel.prototype.cloneCellImpl=function(a,b,c){var d=mxObjectIdentity.get(a),e=b[d];if(null==e&&(e=this.cellCloned(a),b[d]=e,c))for(c=this.getChildCount(a),d=0;d<c;d++){var f=this.cloneCellImpl(this.getChildAt(a,d),b,!0);e.insert(f)}return e};
-mxGraphModel.prototype.cellCloned=function(a){return a.clone()};mxGraphModel.prototype.restoreClone=function(a,b,c){var d=this.getTerminal(b,!0);null!=d&&(d=c[mxObjectIdentity.get(d)],null!=d&&d.insertEdge(a,!0));d=this.getTerminal(b,!1);null!=d&&(d=c[mxObjectIdentity.get(d)],null!=d&&d.insertEdge(a,!1));for(var d=this.getChildCount(a),e=0;e<d;e++)this.restoreClone(this.getChildAt(a,e),this.getChildAt(b,e),c)};function mxRootChange(a,b){this.model=a;this.previous=this.root=b}
-mxRootChange.prototype.execute=function(){this.root=this.previous;this.previous=this.model.rootChanged(this.previous)};function mxChildChange(a,b,c,d){this.model=a;this.previous=this.parent=b;this.child=c;this.previousIndex=this.index=d}
-mxChildChange.prototype.execute=function(){if(null!=this.child){var a=this.model.getParent(this.child),b=null!=a?a.getIndex(this.child):0;null==this.previous&&this.connect(this.child,!1);a=this.model.parentForCellChanged(this.child,this.previous,this.previousIndex);null!=this.previous&&this.connect(this.child,!0);this.parent=this.previous;this.previous=a;this.index=this.previousIndex;this.previousIndex=b}};
-mxChildChange.prototype.connect=function(a,b){b=null!=b?b:!0;var c=a.getTerminal(!0),d=a.getTerminal(!1);null!=c&&(b?this.model.terminalForCellChanged(a,c,!0):this.model.terminalForCellChanged(a,null,!0));null!=d&&(b?this.model.terminalForCellChanged(a,d,!1):this.model.terminalForCellChanged(a,null,!1));a.setTerminal(c,!0);a.setTerminal(d,!1);c=this.model.getChildCount(a);for(d=0;d<c;d++)this.connect(this.model.getChildAt(a,d),b)};
-function mxTerminalChange(a,b,c,d){this.model=a;this.cell=b;this.previous=this.terminal=c;this.source=d}mxTerminalChange.prototype.execute=function(){null!=this.cell&&(this.terminal=this.previous,this.previous=this.model.terminalForCellChanged(this.cell,this.previous,this.source))};function mxValueChange(a,b,c){this.model=a;this.cell=b;this.previous=this.value=c}
-mxValueChange.prototype.execute=function(){null!=this.cell&&(this.value=this.previous,this.previous=this.model.valueForCellChanged(this.cell,this.previous))};function mxStyleChange(a,b,c){this.model=a;this.cell=b;this.previous=this.style=c}mxStyleChange.prototype.execute=function(){null!=this.cell&&(this.style=this.previous,this.previous=this.model.styleForCellChanged(this.cell,this.previous))};function mxGeometryChange(a,b,c){this.model=a;this.cell=b;this.previous=this.geometry=c}
-mxGeometryChange.prototype.execute=function(){null!=this.cell&&(this.geometry=this.previous,this.previous=this.model.geometryForCellChanged(this.cell,this.previous))};function mxCollapseChange(a,b,c){this.model=a;this.cell=b;this.previous=this.collapsed=c}mxCollapseChange.prototype.execute=function(){null!=this.cell&&(this.collapsed=this.previous,this.previous=this.model.collapsedStateForCellChanged(this.cell,this.previous))};
-function mxVisibleChange(a,b,c){this.model=a;this.cell=b;this.previous=this.visible=c}mxVisibleChange.prototype.execute=function(){null!=this.cell&&(this.visible=this.previous,this.previous=this.model.visibleStateForCellChanged(this.cell,this.previous))};function mxCellAttributeChange(a,b,c){this.cell=a;this.attribute=b;this.previous=this.value=c}
-mxCellAttributeChange.prototype.execute=function(){if(null!=this.cell){var a=this.cell.getAttribute(this.attribute);null==this.previous?this.cell.value.removeAttribute(this.attribute):this.cell.setAttribute(this.attribute,this.previous);this.previous=a}};function mxCell(a,b,c){this.value=a;this.setGeometry(b);this.setStyle(c);if(null!=this.onInit)this.onInit()}mxCell.prototype.id=null;mxCell.prototype.value=null;mxCell.prototype.geometry=null;mxCell.prototype.style=null;mxCell.prototype.vertex=!1;
-mxCell.prototype.edge=!1;mxCell.prototype.connectable=!0;mxCell.prototype.visible=!0;mxCell.prototype.collapsed=!1;mxCell.prototype.parent=null;mxCell.prototype.source=null;mxCell.prototype.target=null;mxCell.prototype.children=null;mxCell.prototype.edges=null;mxCell.prototype.mxTransient="id value parent source target children edges".split(" ");mxCell.prototype.getId=function(){return this.id};mxCell.prototype.setId=function(a){this.id=a};mxCell.prototype.getValue=function(){return this.value};
-mxCell.prototype.setValue=function(a){this.value=a};mxCell.prototype.valueChanged=function(a){var b=this.getValue();this.setValue(a);return b};mxCell.prototype.getGeometry=function(){return this.geometry};mxCell.prototype.setGeometry=function(a){this.geometry=a};mxCell.prototype.getStyle=function(){return this.style};mxCell.prototype.setStyle=function(a){this.style=a};mxCell.prototype.isVertex=function(){return 0!=this.vertex};mxCell.prototype.setVertex=function(a){this.vertex=a};
-mxCell.prototype.isEdge=function(){return 0!=this.edge};mxCell.prototype.setEdge=function(a){this.edge=a};mxCell.prototype.isConnectable=function(){return 0!=this.connectable};mxCell.prototype.setConnectable=function(a){this.connectable=a};mxCell.prototype.isVisible=function(){return 0!=this.visible};mxCell.prototype.setVisible=function(a){this.visible=a};mxCell.prototype.isCollapsed=function(){return 0!=this.collapsed};mxCell.prototype.setCollapsed=function(a){this.collapsed=a};
-mxCell.prototype.getParent=function(){return this.parent};mxCell.prototype.setParent=function(a){this.parent=a};mxCell.prototype.getTerminal=function(a){return a?this.source:this.target};mxCell.prototype.setTerminal=function(a,b){b?this.source=a:this.target=a;return a};mxCell.prototype.getChildCount=function(){return null==this.children?0:this.children.length};mxCell.prototype.getIndex=function(a){return mxUtils.indexOf(this.children,a)};
-mxCell.prototype.getChildAt=function(a){return null==this.children?null:this.children[a]};mxCell.prototype.insert=function(a,b){null!=a&&(null==b&&(b=this.getChildCount(),a.getParent()==this&&b--),a.removeFromParent(),a.setParent(this),null==this.children?(this.children=[],this.children.push(a)):this.children.splice(b,0,a));return a};mxCell.prototype.remove=function(a){var b=null;null!=this.children&&0<=a&&(b=this.getChildAt(a),null!=b&&(this.children.splice(a,1),b.setParent(null)));return b};
-mxCell.prototype.removeFromParent=function(){if(null!=this.parent){var a=this.parent.getIndex(this);this.parent.remove(a)}};mxCell.prototype.getEdgeCount=function(){return null==this.edges?0:this.edges.length};mxCell.prototype.getEdgeIndex=function(a){return mxUtils.indexOf(this.edges,a)};mxCell.prototype.getEdgeAt=function(a){return null==this.edges?null:this.edges[a]};
-mxCell.prototype.insertEdge=function(a,b){null!=a&&(a.removeFromTerminal(b),a.setTerminal(this,b),null==this.edges||a.getTerminal(!b)!=this||0>mxUtils.indexOf(this.edges,a))&&(null==this.edges&&(this.edges=[]),this.edges.push(a));return a};mxCell.prototype.removeEdge=function(a,b){if(null!=a){if(a.getTerminal(!b)!=this&&null!=this.edges){var c=this.getEdgeIndex(a);0<=c&&this.edges.splice(c,1)}a.setTerminal(null,b)}return a};
-mxCell.prototype.removeFromTerminal=function(a){var b=this.getTerminal(a);null!=b&&b.removeEdge(this,a)};mxCell.prototype.hasAttribute=function(a){var b=this.getValue();return null!=b&&b.nodeType==mxConstants.NODETYPE_ELEMENT&&b.hasAttribute?b.hasAttribute(a):null!=b.getAttribute(a)};mxCell.prototype.getAttribute=function(a,b){var c=this.getValue(),c=null!=c&&c.nodeType==mxConstants.NODETYPE_ELEMENT?c.getAttribute(a):null;return null!=c?c:b};
-mxCell.prototype.setAttribute=function(a,b){var c=this.getValue();null!=c&&c.nodeType==mxConstants.NODETYPE_ELEMENT&&c.setAttribute(a,b)};mxCell.prototype.clone=function(){var a=mxUtils.clone(this,this.mxTransient);a.setValue(this.cloneValue());return a};mxCell.prototype.cloneValue=function(){var a=this.getValue();null!=a&&("function"==typeof a.clone?a=a.clone():isNaN(a.nodeType)||(a=a.cloneNode(!0)));return a};function mxGeometry(a,b,c,d){mxRectangle.call(this,a,b,c,d)}mxGeometry.prototype=new mxRectangle;
-mxGeometry.prototype.constructor=mxGeometry;mxGeometry.prototype.TRANSLATE_CONTROL_POINTS=!0;mxGeometry.prototype.alternateBounds=null;mxGeometry.prototype.sourcePoint=null;mxGeometry.prototype.targetPoint=null;mxGeometry.prototype.points=null;mxGeometry.prototype.offset=null;mxGeometry.prototype.relative=!1;
-mxGeometry.prototype.swap=function(){if(null!=this.alternateBounds){var a=new mxRectangle(this.x,this.y,this.width,this.height);this.x=this.alternateBounds.x;this.y=this.alternateBounds.y;this.width=this.alternateBounds.width;this.height=this.alternateBounds.height;this.alternateBounds=a}};mxGeometry.prototype.getTerminalPoint=function(a){return a?this.sourcePoint:this.targetPoint};mxGeometry.prototype.setTerminalPoint=function(a,b){b?this.sourcePoint=a:this.targetPoint=a;return a};
-mxGeometry.prototype.rotate=function(a,b){var c=mxUtils.toRadians(a),d=Math.cos(c),c=Math.sin(c);if(!this.relative){var e=new mxPoint(this.getCenterX(),this.getCenterY()),e=mxUtils.getRotatedPoint(e,d,c,b);this.x=Math.round(e.x-this.width/2);this.y=Math.round(e.y-this.height/2)}null!=this.sourcePoint&&(e=mxUtils.getRotatedPoint(this.sourcePoint,d,c,b),this.sourcePoint.x=Math.round(e.x),this.sourcePoint.y=Math.round(e.y));null!=this.targetPoint&&(e=mxUtils.getRotatedPoint(this.targetPoint,d,c,b),this.targetPoint.x=
-Math.round(e.x),this.targetPoint.y=Math.round(e.y));if(null!=this.points)for(var f=0;f<this.points.length;f++)null!=this.points[f]&&(e=mxUtils.getRotatedPoint(this.points[f],d,c,b),this.points[f].x=Math.round(e.x),this.points[f].y=Math.round(e.y))};
-mxGeometry.prototype.translate=function(a,b){a=parseFloat(a);b=parseFloat(b);this.relative||(this.x=parseFloat(this.x)+a,this.y=parseFloat(this.y)+b);null!=this.sourcePoint&&(this.sourcePoint.x=parseFloat(this.sourcePoint.x)+a,this.sourcePoint.y=parseFloat(this.sourcePoint.y)+b);null!=this.targetPoint&&(this.targetPoint.x=parseFloat(this.targetPoint.x)+a,this.targetPoint.y=parseFloat(this.targetPoint.y)+b);if(this.TRANSLATE_CONTROL_POINTS&&null!=this.points)for(var c=0;c<this.points.length;c++)null!=
-this.points[c]&&(this.points[c].x=parseFloat(this.points[c].x)+a,this.points[c].y=parseFloat(this.points[c].y)+b)};
-mxGeometry.prototype.scale=function(a,b,c){a=parseFloat(a);b=parseFloat(b);null!=this.sourcePoint&&(this.sourcePoint.x=parseFloat(this.sourcePoint.x)*a,this.sourcePoint.y=parseFloat(this.sourcePoint.y)*b);null!=this.targetPoint&&(this.targetPoint.x=parseFloat(this.targetPoint.x)*a,this.targetPoint.y=parseFloat(this.targetPoint.y)*b);if(null!=this.points)for(var d=0;d<this.points.length;d++)null!=this.points[d]&&(this.points[d].x=parseFloat(this.points[d].x)*a,this.points[d].y=parseFloat(this.points[d].y)*
-b);this.relative||(this.x=parseFloat(this.x)*a,this.y=parseFloat(this.y)*b,c&&(b=a=Math.min(a,b)),this.width=parseFloat(this.width)*a,this.height=parseFloat(this.height)*b)};
-mxGeometry.prototype.equals=function(a){return mxRectangle.prototype.equals.apply(this,arguments)&&this.relative==a.relative&&(null==this.sourcePoint&&null==a.sourcePoint||null!=this.sourcePoint&&this.sourcePoint.equals(a.sourcePoint))&&(null==this.targetPoint&&null==a.targetPoint||null!=this.targetPoint&&this.targetPoint.equals(a.targetPoint))&&(null==this.points&&null==a.points||null!=this.points&&mxUtils.equalPoints(this.points,a.points))&&(null==this.alternateBounds&&null==a.alternateBounds||
-null!=this.alternateBounds&&this.alternateBounds.equals(a.alternateBounds))&&(null==this.offset&&null==a.offset||null!=this.offset&&this.offset.equals(a.offset))};
-var mxCellPath={PATH_SEPARATOR:".",create:function(a){var b="";if(null!=a)for(var c=a.getParent();null!=c;)b=c.getIndex(a)+mxCellPath.PATH_SEPARATOR+b,a=c,c=a.getParent();a=b.length;1<a&&(b=b.substring(0,a-1));return b},getParentPath:function(a){if(null!=a){var b=a.lastIndexOf(mxCellPath.PATH_SEPARATOR);if(0<=b)return a.substring(0,b);if(0<a.length)return""}return null},resolve:function(a,b){var c=a;if(null!=b)for(var d=b.split(mxCellPath.PATH_SEPARATOR),e=0;e<d.length;e++)c=c.getChildAt(parseInt(d[e]));
-return c},compare:function(a,b){for(var c=Math.min(a.length,b.length),d=0,e=0;e<c;e++)if(a[e]!=b[e]){0==a[e].length||0==b[e].length?d=a[e]==b[e]?0:a[e]>b[e]?1:-1:(c=parseInt(a[e]),e=parseInt(b[e]),d=c==e?0:c>e?1:-1);break}0==d&&(c=a.length,e=b.length,c!=e&&(d=c>e?1:-1));return d}},mxPerimeter={RectanglePerimeter:function(a,b,c,d){b=a.getCenterX();var e=a.getCenterY(),f=Math.atan2(c.y-e,c.x-b),g=new mxPoint(0,0),k=Math.PI,l=Math.PI/2-f,m=Math.atan2(a.height,a.width);f<-k+m||f>k-m?(g.x=a.x,g.y=e-a.width*
-Math.tan(f)/2):f<-m?(g.y=a.y,g.x=b-a.height*Math.tan(l)/2):f<m?(g.x=a.x+a.width,g.y=e+a.width*Math.tan(f)/2):(g.y=a.y+a.height,g.x=b+a.height*Math.tan(l)/2);d&&(c.x>=a.x&&c.x<=a.x+a.width?g.x=c.x:c.y>=a.y&&c.y<=a.y+a.height&&(g.y=c.y),c.x<a.x?g.x=a.x:c.x>a.x+a.width&&(g.x=a.x+a.width),c.y<a.y?g.y=a.y:c.y>a.y+a.height&&(g.y=a.y+a.height));return g},EllipsePerimeter:function(a,b,c,d){var e=a.x,f=a.y,g=a.width/2,k=a.height/2,l=e+g,m=f+k;b=c.x;c=c.y;var n=parseInt(b-l),p=parseInt(c-m);if(0==n&&0!=p)return new mxPoint(l,
-m+k*p/Math.abs(p));if(0==n&&0==p)return new mxPoint(b,c);if(d){if(c>=f&&c<=f+a.height)return a=c-m,a=Math.sqrt(g*g*(1-a*a/(k*k)))||0,b<=e&&(a=-a),new mxPoint(l+a,c);if(b>=e&&b<=e+a.width)return a=b-l,a=Math.sqrt(k*k*(1-a*a/(g*g)))||0,c<=f&&(a=-a),new mxPoint(b,m+a)}e=p/n;m-=e*l;f=g*g*e*e+k*k;a=-2*l*f;k=Math.sqrt(a*a-4*f*(g*g*e*e*l*l+k*k*l*l-g*g*k*k));g=(-a+k)/(2*f);l=(-a-k)/(2*f);k=e*g+m;m=e*l+m;Math.sqrt(Math.pow(g-b,2)+Math.pow(k-c,2))<Math.sqrt(Math.pow(l-b,2)+Math.pow(m-c,2))?(b=g,c=k):(b=l,c=
-m);return new mxPoint(b,c)},RhombusPerimeter:function(a,b,c,d){b=a.x;var e=a.y,f=a.width;a=a.height;var g=b+f/2,k=e+a/2,l=c.x;c=c.y;if(g==l)return k>c?new mxPoint(g,e):new mxPoint(g,e+a);if(k==c)return g>l?new mxPoint(b,k):new mxPoint(b+f,k);var m=g,n=k;d&&(l>=b&&l<=b+f?m=l:c>=e&&c<=e+a&&(n=c));return l<g?c<k?mxUtils.intersection(l,c,m,n,g,e,b,k):mxUtils.intersection(l,c,m,n,g,e+a,b,k):c<k?mxUtils.intersection(l,c,m,n,g,e,b+f,k):mxUtils.intersection(l,c,m,n,g,e+a,b+f,k)},TrianglePerimeter:function(a,
-b,c,d){b=null!=b?b.style[mxConstants.STYLE_DIRECTION]:null;var e=b==mxConstants.DIRECTION_NORTH||b==mxConstants.DIRECTION_SOUTH,f=a.x,g=a.y,k=a.width,l=a.height;a=f+k/2;var m=g+l/2,n=new mxPoint(f,g),p=new mxPoint(f+k,m),q=new mxPoint(f,g+l);b==mxConstants.DIRECTION_NORTH?(n=q,p=new mxPoint(a,g),q=new mxPoint(f+k,g+l)):b==mxConstants.DIRECTION_SOUTH?(p=new mxPoint(a,g+l),q=new mxPoint(f+k,g)):b==mxConstants.DIRECTION_WEST&&(n=new mxPoint(f+k,g),p=new mxPoint(f,m),q=new mxPoint(f+k,g+l));var r=c.x-
-a,t=c.y-m,r=e?Math.atan2(r,t):Math.atan2(t,r),t=e?Math.atan2(k,l):Math.atan2(l,k);(b==mxConstants.DIRECTION_NORTH||b==mxConstants.DIRECTION_WEST?r>-t&&r<t:r<-Math.PI+t||r>Math.PI-t)?c=d&&(e&&c.x>=n.x&&c.x<=q.x||!e&&c.y>=n.y&&c.y<=q.y)?e?new mxPoint(c.x,n.y):new mxPoint(n.x,c.y):b==mxConstants.DIRECTION_NORTH?new mxPoint(f+k/2+l*Math.tan(r)/2,g+l):b==mxConstants.DIRECTION_SOUTH?new mxPoint(f+k/2-l*Math.tan(r)/2,g):b==mxConstants.DIRECTION_WEST?new mxPoint(f+k,g+l/2+k*Math.tan(r)/2):new mxPoint(f,g+
-l/2-k*Math.tan(r)/2):(d&&(d=new mxPoint(a,m),c.y>=g&&c.y<=g+l?(d.x=e?a:b==mxConstants.DIRECTION_WEST?f+k:f,d.y=c.y):c.x>=f&&c.x<=f+k&&(d.x=c.x,d.y=e?b==mxConstants.DIRECTION_NORTH?g+l:g:m),a=d.x,m=d.y),c=e&&c.x<=f+k/2||!e&&c.y<=g+l/2?mxUtils.intersection(c.x,c.y,a,m,n.x,n.y,p.x,p.y):mxUtils.intersection(c.x,c.y,a,m,p.x,p.y,q.x,q.y));null==c&&(c=new mxPoint(a,m));return c},HexagonPerimeter:function(a,b,c,d){var e=a.x,f=a.y,g=a.width,k=a.height,l=a.getCenterX();a=a.getCenterY();var m=c.x,n=c.y,p=-Math.atan2(n-
-a,m-l),q=Math.PI,r=Math.PI/2;new mxPoint(l,a);b=null!=b?mxUtils.getValue(b.style,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST):mxConstants.DIRECTION_EAST;var t=b==mxConstants.DIRECTION_NORTH||b==mxConstants.DIRECTION_SOUTH;b=new mxPoint;var u=new mxPoint;if(m<e&&n<f||m<e&&n>f+k||m>e+g&&n<f||m>e+g&&n>f+k)d=!1;if(d){if(t){if(m==l){if(n<=f)return new mxPoint(l,f);if(n>=f+k)return new mxPoint(l,f+k)}else if(m<e){if(n==f+k/4)return new mxPoint(e,f+k/4);if(n==f+3*k/4)return new mxPoint(e,f+3*
-k/4)}else if(m>e+g){if(n==f+k/4)return new mxPoint(e+g,f+k/4);if(n==f+3*k/4)return new mxPoint(e+g,f+3*k/4)}else if(m==e){if(n<a)return new mxPoint(e,f+k/4);if(n>a)return new mxPoint(e,f+3*k/4)}else if(m==e+g){if(n<a)return new mxPoint(e+g,f+k/4);if(n>a)return new mxPoint(e+g,f+3*k/4)}if(n==f)return new mxPoint(l,f);if(n==f+k)return new mxPoint(l,f+k);m<l?n>f+k/4&&n<f+3*k/4?(b=new mxPoint(e,f),u=new mxPoint(e,f+k)):n<f+k/4?(b=new mxPoint(e-Math.floor(.5*g),f+Math.floor(.5*k)),u=new mxPoint(e+g,f-
-Math.floor(.25*k))):n>f+3*k/4&&(b=new mxPoint(e-Math.floor(.5*g),f+Math.floor(.5*k)),u=new mxPoint(e+g,f+Math.floor(1.25*k))):m>l&&(n>f+k/4&&n<f+3*k/4?(b=new mxPoint(e+g,f),u=new mxPoint(e+g,f+k)):n<f+k/4?(b=new mxPoint(e,f-Math.floor(.25*k)),u=new mxPoint(e+Math.floor(1.5*g),f+Math.floor(.5*k))):n>f+3*k/4&&(b=new mxPoint(e+Math.floor(1.5*g),f+Math.floor(.5*k)),u=new mxPoint(e,f+Math.floor(1.25*k))))}else{if(n==a){if(m<=e)return new mxPoint(e,f+k/2);if(m>=e+g)return new mxPoint(e+g,f+k/2)}else if(n<
-f){if(m==e+g/4)return new mxPoint(e+g/4,f);if(m==e+3*g/4)return new mxPoint(e+3*g/4,f)}else if(n>f+k){if(m==e+g/4)return new mxPoint(e+g/4,f+k);if(m==e+3*g/4)return new mxPoint(e+3*g/4,f+k)}else if(n==f){if(m<l)return new mxPoint(e+g/4,f);if(m>l)return new mxPoint(e+3*g/4,f)}else if(n==f+k){if(m<l)return new mxPoint(e+g/4,f+k);if(n>a)return new mxPoint(e+3*g/4,f+k)}if(m==e)return new mxPoint(e,a);if(m==e+g)return new mxPoint(e+g,a);n<a?m>e+g/4&&m<e+3*g/4?(b=new mxPoint(e,f),u=new mxPoint(e+g,f)):
-m<e+g/4?(b=new mxPoint(e-Math.floor(.25*g),f+k),u=new mxPoint(e+Math.floor(.5*g),f-Math.floor(.5*k))):m>e+3*g/4&&(b=new mxPoint(e+Math.floor(.5*g),f-Math.floor(.5*k)),u=new mxPoint(e+Math.floor(1.25*g),f+k)):n>a&&(m>e+g/4&&m<e+3*g/4?(b=new mxPoint(e,f+k),u=new mxPoint(e+g,f+k)):m<e+g/4?(b=new mxPoint(e-Math.floor(.25*g),f),u=new mxPoint(e+Math.floor(.5*g),f+Math.floor(1.5*k))):m>e+3*g/4&&(b=new mxPoint(e+Math.floor(.5*g),f+Math.floor(1.5*k)),u=new mxPoint(e+Math.floor(1.25*g),f)))}d=l;p=a;m>=e&&m<=
-e+g?(d=m,p=n<a?f+k:f):n>=f&&n<=f+k&&(p=n,d=m<l?e+g:e);c=mxUtils.intersection(d,p,c.x,c.y,b.x,b.y,u.x,u.y)}else{if(t){m=Math.atan2(k/4,g/2);if(p==m)return new mxPoint(e+g,f+Math.floor(.25*k));if(p==r)return new mxPoint(e+Math.floor(.5*g),f);if(p==q-m)return new mxPoint(e,f+Math.floor(.25*k));if(p==-m)return new mxPoint(e+g,f+Math.floor(.75*k));if(p==-r)return new mxPoint(e+Math.floor(.5*g),f+k);if(p==-q+m)return new mxPoint(e,f+Math.floor(.75*k));p<m&&p>-m?(b=new mxPoint(e+g,f),u=new mxPoint(e+g,f+
-k)):p>m&&p<r?(b=new mxPoint(e,f-Math.floor(.25*k)),u=new mxPoint(e+Math.floor(1.5*g),f+Math.floor(.5*k))):p>r&&p<q-m?(b=new mxPoint(e-Math.floor(.5*g),f+Math.floor(.5*k)),u=new mxPoint(e+g,f-Math.floor(.25*k))):p>q-m&&p<=q||p<-q+m&&p>=-q?(b=new mxPoint(e,f),u=new mxPoint(e,f+k)):p<-m&&p>-r?(b=new mxPoint(e+Math.floor(1.5*g),f+Math.floor(.5*k)),u=new mxPoint(e,f+Math.floor(1.25*k))):p<-r&&p>-q+m&&(b=new mxPoint(e-Math.floor(.5*g),f+Math.floor(.5*k)),u=new mxPoint(e+g,f+Math.floor(1.25*k)))}else{m=
-Math.atan2(k/2,g/4);if(p==m)return new mxPoint(e+Math.floor(.75*g),f);if(p==q-m)return new mxPoint(e+Math.floor(.25*g),f);if(p==q||p==-q)return new mxPoint(e,f+Math.floor(.5*k));if(0==p)return new mxPoint(e+g,f+Math.floor(.5*k));if(p==-m)return new mxPoint(e+Math.floor(.75*g),f+k);if(p==-q+m)return new mxPoint(e+Math.floor(.25*g),f+k);0<p&&p<m?(b=new mxPoint(e+Math.floor(.5*g),f-Math.floor(.5*k)),u=new mxPoint(e+Math.floor(1.25*g),f+k)):p>m&&p<q-m?(b=new mxPoint(e,f),u=new mxPoint(e+g,f)):p>q-m&&
-p<q?(b=new mxPoint(e-Math.floor(.25*g),f+k),u=new mxPoint(e+Math.floor(.5*g),f-Math.floor(.5*k))):0>p&&p>-m?(b=new mxPoint(e+Math.floor(.5*g),f+Math.floor(1.5*k)),u=new mxPoint(e+Math.floor(1.25*g),f)):p<-m&&p>-q+m?(b=new mxPoint(e,f+k),u=new mxPoint(e+g,f+k)):p<-q+m&&p>-q&&(b=new mxPoint(e-Math.floor(.25*g),f),u=new mxPoint(e+Math.floor(.5*g),f+Math.floor(1.5*k)))}c=mxUtils.intersection(l,a,c.x,c.y,b.x,b.y,u.x,u.y)}return null==c?new mxPoint(l,a):c}};
-function mxPrintPreview(a,b,c,d,e,f,g,k,l){this.graph=a;this.scale=null!=b?b:1/a.pageScale;this.border=null!=d?d:0;this.pageFormat=mxRectangle.fromRectangle(null!=c?c:a.pageFormat);this.title=null!=k?k:"Printer-friendly version";this.x0=null!=e?e:0;this.y0=null!=f?f:0;this.borderColor=g;this.pageSelector=null!=l?l:!0}mxPrintPreview.prototype.graph=null;mxPrintPreview.prototype.pageFormat=null;mxPrintPreview.prototype.scale=null;mxPrintPreview.prototype.border=0;
-mxPrintPreview.prototype.marginTop=0;mxPrintPreview.prototype.marginBottom=0;mxPrintPreview.prototype.x0=0;mxPrintPreview.prototype.y0=0;mxPrintPreview.prototype.autoOrigin=!0;mxPrintPreview.prototype.printOverlays=!1;mxPrintPreview.prototype.printControls=!1;mxPrintPreview.prototype.printBackgroundImage=!1;mxPrintPreview.prototype.backgroundColor="#ffffff";mxPrintPreview.prototype.borderColor=null;mxPrintPreview.prototype.title=null;mxPrintPreview.prototype.pageSelector=null;
-mxPrintPreview.prototype.wnd=null;mxPrintPreview.prototype.targetWindow=null;mxPrintPreview.prototype.pageCount=0;mxPrintPreview.prototype.clipping=!0;mxPrintPreview.prototype.getWindow=function(){return this.wnd};
-mxPrintPreview.prototype.getDoctype=function(){var a="";5==document.documentMode?a='<meta http-equiv="X-UA-Compatible" content="IE=5">':8==document.documentMode?a='<meta http-equiv="X-UA-Compatible" content="IE=8">':8<document.documentMode&&(a='\x3c!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]--\x3e');return a};mxPrintPreview.prototype.appendGraph=function(a,b,c,d,e,f){this.graph=a;this.scale=null!=b?b:1/a.pageScale;this.x0=c;this.y0=d;this.open(null,null,e,f)};
-mxPrintPreview.prototype.open=function(a,b,c,d){var e=this.graph.cellRenderer.initializeOverlay,f=null;try{this.printOverlays&&(this.graph.cellRenderer.initializeOverlay=function(a,b){b.init(a.view.getDrawPane())});this.printControls&&(this.graph.cellRenderer.initControl=function(a,b,c,d){b.dialect=a.view.graph.dialect;b.init(a.view.getDrawPane())});this.wnd=null!=b?b:this.wnd;var g=!1;null==this.wnd&&(g=!0,this.wnd=window.open());var k=this.wnd.document;if(g){var l=this.getDoctype();null!=l&&0<l.length&&
-k.writeln(l);mxClient.IS_VML?k.writeln('<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">'):("CSS1Compat"===document.compatMode&&k.writeln("<!DOCTYPE html>"),k.writeln("<html>"));k.writeln("<head>");this.writeHead(k,a);k.writeln("</head>");k.writeln('<body class="mxPage">')}var m=this.graph.getGraphBounds().clone(),n=this.graph.getView().getScale(),p=n/this.scale,q=this.graph.getView().getTranslate();this.autoOrigin||(this.x0-=q.x*this.scale,this.y0-=
-q.y*this.scale,m.width+=m.x,m.height+=m.y,m.x=0,this.border=m.y=0);var r=this.pageFormat.width-2*this.border,t=this.pageFormat.height-2*this.border;this.pageFormat.height+=this.marginTop+this.marginBottom;m.width/=p;m.height/=p;var u=Math.max(1,Math.ceil((m.width+this.x0)/r)),x=Math.max(1,Math.ceil((m.height+this.y0)/t));this.pageCount=u*x;var y=mxUtils.bind(this,function(){if(this.pageSelector&&(1<x||1<u)){var a=this.createPageSelector(x,u);k.body.appendChild(a);if(mxClient.IS_IE&&null==k.documentMode||
-5==k.documentMode||8==k.documentMode||7==k.documentMode){a.style.position="absolute";var b=function(){a.style.top=(k.body.scrollTop||k.documentElement.scrollTop)+10+"px"};mxEvent.addListener(this.wnd,"scroll",function(a){b()});mxEvent.addListener(this.wnd,"resize",function(a){b()})}}}),B=mxUtils.bind(this,function(a,b){null!=this.borderColor&&(a.style.borderColor=this.borderColor,a.style.borderStyle="solid",a.style.borderWidth="1px");a.style.background=this.backgroundColor;if(c||b)a.style.pageBreakAfter=
-"always";if(g&&(mxClient.IS_IE||11<=document.documentMode||mxClient.IS_EDGE))k.writeln(a.outerHTML),a.parentNode.removeChild(a);else if(mxClient.IS_IE||11<=document.documentMode||mxClient.IS_EDGE){var d=k.createElement("div");d.innerHTML=a.outerHTML;d=d.getElementsByTagName("div")[0];k.body.appendChild(d);a.parentNode.removeChild(a)}else a.parentNode.removeChild(a),k.body.appendChild(a);(c||b)&&this.addPageBreak(k)}),A=this.getCoverPages(this.pageFormat.width,this.pageFormat.height);if(null!=A)for(var z=
-0;z<A.length;z++)B(A[z],!0);for(var C=this.getAppendices(this.pageFormat.width,this.pageFormat.height),z=0;z<x;z++){var v=z*t/this.scale-this.y0/this.scale+(m.y-q.y*n)/n;for(a=0;a<u;a++){if(null==this.wnd)return null;var D=a*r/this.scale-this.x0/this.scale+(m.x-q.x*n)/n,F=z*u+a+1,J=new mxRectangle(D,v,r,t),f=this.renderPage(this.pageFormat.width,this.pageFormat.height,0,0,mxUtils.bind(this,function(a){this.addGraphFragment(-D,-v,this.scale,F,a,J);this.printBackgroundImage&&this.insertBackgroundImage(a,
--D,-v)}),F);f.setAttribute("id","mxPage-"+F);B(f,null!=C||z<x-1||a<u-1)}}if(null!=C)for(z=0;z<C.length;z++)B(C[z],z<C.length-1);g&&!d&&(this.closeDocument(),y());this.wnd.focus()}catch(E){null!=f&&null!=f.parentNode&&f.parentNode.removeChild(f)}finally{this.graph.cellRenderer.initializeOverlay=e}return this.wnd};mxPrintPreview.prototype.addPageBreak=function(a){var b=a.createElement("hr");b.className="mxPageBreak";a.body.appendChild(b)};
-mxPrintPreview.prototype.closeDocument=function(){try{if(null!=this.wnd&&null!=this.wnd.document){var a=this.wnd.document;this.writePostfix(a);a.writeln("</body>");a.writeln("</html>");a.close();mxEvent.release(a.body)}}catch(b){}};
-mxPrintPreview.prototype.writeHead=function(a,b){null!=this.title&&a.writeln("<title>"+this.title+"</title>");mxClient.IS_VML&&a.writeln('<style type="text/css">v\\:*{behavior:url(#default#VML)}o\\:*{behavior:url(#default#VML)}</style>');mxClient.link("stylesheet",mxClient.basePath+"/css/common.css",a);a.writeln('<style type="text/css">');a.writeln("@media print {");a.writeln(" * { -webkit-print-color-adjust: exact; }");a.writeln(" table.mxPageSelector { display: none; }");a.writeln(" hr.mxPageBreak { display: none; }");
-a.writeln("}");a.writeln("@media screen {");a.writeln(" table.mxPageSelector { position: fixed; right: 10px; top: 10px;font-family: Arial; font-size:10pt; border: solid 1px darkgray;background: white; border-collapse:collapse; }");a.writeln(" table.mxPageSelector td { border: solid 1px gray; padding:4px; }");a.writeln(" body.mxPage { background: gray; }");a.writeln("}");null!=b&&a.writeln(b);a.writeln("</style>")};mxPrintPreview.prototype.writePostfix=function(a){};
-mxPrintPreview.prototype.createPageSelector=function(a,b){var c=this.wnd.document,d=c.createElement("table");d.className="mxPageSelector";d.setAttribute("border","0");for(var e=c.createElement("tbody"),f=0;f<a;f++){for(var g=c.createElement("tr"),k=0;k<b;k++){var l=f*b+k+1,m=c.createElement("td"),n=c.createElement("a");n.setAttribute("href","#mxPage-"+l);!mxClient.IS_NS||mxClient.IS_SF||mxClient.IS_GC||n.setAttribute("onclick","var page = document.getElementById('mxPage-"+l+"');page.scrollIntoView(true);event.preventDefault();");
-mxUtils.write(n,l,c);m.appendChild(n);g.appendChild(m)}e.appendChild(g)}d.appendChild(e);return d};
-mxPrintPreview.prototype.renderPage=function(a,b,c,d,e,f){f=this.wnd.document;var g=document.createElement("div"),k=null;try{if(0!=c||0!=d){g.style.position="relative";g.style.width=a+"px";g.style.height=b+"px";g.style.pageBreakInside="avoid";var l=document.createElement("div");l.style.position="relative";l.style.top=this.border+"px";l.style.left=this.border+"px";l.style.width=a-2*this.border+"px";l.style.height=b-2*this.border+"px";l.style.overflow="hidden";var m=document.createElement("div");m.style.position=
-"relative";m.style.marginLeft=c+"px";m.style.marginTop=d+"px";8==f.documentMode&&(l.style.position="absolute",m.style.position="absolute");10==f.documentMode&&(m.style.width="100%",m.style.height="100%");l.appendChild(m);g.appendChild(l);document.body.appendChild(g);k=m}else g.style.width=a+"px",g.style.height=b+"px",g.style.overflow="hidden",g.style.pageBreakInside="avoid",8==f.documentMode&&(g.style.position="relative"),l=document.createElement("div"),l.style.width=a-2*this.border+"px",l.style.height=
-b-2*this.border+"px",l.style.overflow="hidden",!mxClient.IS_IE||null!=f.documentMode&&5!=f.documentMode&&8!=f.documentMode&&7!=f.documentMode?(l.style.top=this.border+"px",l.style.left=this.border+"px"):(l.style.marginTop=this.border+"px",l.style.marginLeft=this.border+"px"),this.graph.dialect==mxConstants.DIALECT_VML&&(l.style.position="absolute"),g.appendChild(l),document.body.appendChild(g),k=l}catch(n){throw g.parentNode.removeChild(g),n;}e(k);return g};
-mxPrintPreview.prototype.getRoot=function(){var a=this.graph.view.currentRoot;null==a&&(a=this.graph.getModel().getRoot());return a};mxPrintPreview.prototype.useCssTransforms=function(){return!mxClient.NO_FO&&!mxClient.IS_SF};
-mxPrintPreview.prototype.addGraphFragment=function(a,b,c,d,e,f){var g=this.graph.getView();d=this.graph.container;this.graph.container=e;var k=g.getCanvas(),l=g.getBackgroundPane(),m=g.getDrawPane(),n=g.getOverlayPane(),p=c;if(this.graph.dialect==mxConstants.DIALECT_SVG){if(g.createSvg(),this.useCssTransforms()){var q=g.getDrawPane().parentNode;q.getAttribute("transform");q.setAttribute("transformOrigin","0 0");q.setAttribute("transform","scale("+c+","+c+")translate("+a+","+b+")");c=1;b=a=0}}else this.graph.dialect==
-mxConstants.DIALECT_VML?g.createVml():g.createHtml();q=g.isEventsEnabled();g.setEventsEnabled(!1);var r=this.graph.isEnabled();this.graph.setEnabled(!1);var t=g.getTranslate();g.translate=new mxPoint(a,b);var u=this.graph.cellRenderer.redraw,x=g.states;a=g.scale;if(this.clipping){var y=new mxRectangle((f.x+t.x)*a,(f.y+t.y)*a,f.width*a/p,f.height*a/p);this.graph.cellRenderer.redraw=function(a,b,c){if(null!=a){var d=x.get(a.cell);if(null!=d&&(d=g.getBoundingBox(d,!1),null!=d&&0<d.width&&0<d.height&&
-!mxUtils.intersects(y,d)))return}u.apply(this,arguments)}}a=null;try{var B=[this.getRoot()];a=new mxTemporaryCellStates(g,c,B,null,mxUtils.bind(this,function(a){return this.getLinkForCellState(a)}))}finally{if(mxClient.IS_IE)g.overlayPane.innerHTML="",g.canvas.style.overflow="hidden",g.canvas.style.position="relative",g.canvas.style.top=this.marginTop+"px",g.canvas.style.width=f.width+"px",g.canvas.style.height=f.height+"px";else for(c=e.firstChild;null!=c;)B=c.nextSibling,b=c.nodeName.toLowerCase(),
-"svg"==b?(c.style.overflow="hidden",c.style.position="relative",c.style.top=this.marginTop+"px",c.setAttribute("width",f.width),c.setAttribute("height",f.height),c.style.width="",c.style.height=""):"default"!=c.style.cursor&&"div"!=b&&c.parentNode.removeChild(c),c=B;this.printBackgroundImage&&(e=e.getElementsByTagName("svg"),0<e.length&&(e[0].style.position="absolute"));g.overlayPane.parentNode.removeChild(g.overlayPane);this.graph.setEnabled(r);this.graph.container=d;this.graph.cellRenderer.redraw=
-u;g.canvas=k;g.backgroundPane=l;g.drawPane=m;g.overlayPane=n;g.translate=t;a.destroy();g.setEventsEnabled(q)}};mxPrintPreview.prototype.getLinkForCellState=function(a){return this.graph.getLinkForCell(a.cell)};
-mxPrintPreview.prototype.insertBackgroundImage=function(a,b,c){var d=this.graph.backgroundImage;if(null!=d){var e=document.createElement("img");e.style.position="absolute";e.style.marginLeft=Math.round(b*this.scale)+"px";e.style.marginTop=Math.round(c*this.scale)+"px";e.setAttribute("width",Math.round(this.scale*d.width));e.setAttribute("height",Math.round(this.scale*d.height));e.src=d.src;a.insertBefore(e,a.firstChild)}};mxPrintPreview.prototype.getCoverPages=function(){return null};
-mxPrintPreview.prototype.getAppendices=function(){return null};mxPrintPreview.prototype.print=function(a){a=this.open(a);null!=a&&a.print()};mxPrintPreview.prototype.close=function(){null!=this.wnd&&(this.wnd.close(),this.wnd=null)};function mxStylesheet(){this.styles={};this.putDefaultVertexStyle(this.createDefaultVertexStyle());this.putDefaultEdgeStyle(this.createDefaultEdgeStyle())}
-mxStylesheet.prototype.createDefaultVertexStyle=function(){var a={};a[mxConstants.STYLE_SHAPE]=mxConstants.SHAPE_RECTANGLE;a[mxConstants.STYLE_PERIMETER]=mxPerimeter.RectanglePerimeter;a[mxConstants.STYLE_VERTICAL_ALIGN]=mxConstants.ALIGN_MIDDLE;a[mxConstants.STYLE_ALIGN]=mxConstants.ALIGN_CENTER;a[mxConstants.STYLE_FILLCOLOR]="#C3D9FF";a[mxConstants.STYLE_STROKECOLOR]="#6482B9";a[mxConstants.STYLE_FONTCOLOR]="#774400";return a};
-mxStylesheet.prototype.createDefaultEdgeStyle=function(){var a={};a[mxConstants.STYLE_SHAPE]=mxConstants.SHAPE_CONNECTOR;a[mxConstants.STYLE_ENDARROW]=mxConstants.ARROW_CLASSIC;a[mxConstants.STYLE_VERTICAL_ALIGN]=mxConstants.ALIGN_MIDDLE;a[mxConstants.STYLE_ALIGN]=mxConstants.ALIGN_CENTER;a[mxConstants.STYLE_STROKECOLOR]="#6482B9";a[mxConstants.STYLE_FONTCOLOR]="#446299";return a};mxStylesheet.prototype.putDefaultVertexStyle=function(a){this.putCellStyle("defaultVertex",a)};
-mxStylesheet.prototype.putDefaultEdgeStyle=function(a){this.putCellStyle("defaultEdge",a)};mxStylesheet.prototype.getDefaultVertexStyle=function(){return this.styles.defaultVertex};mxStylesheet.prototype.getDefaultEdgeStyle=function(){return this.styles.defaultEdge};mxStylesheet.prototype.putCellStyle=function(a,b){this.styles[a]=b};
-mxStylesheet.prototype.getCellStyle=function(a,b){var c=b;if(null!=a&&0<a.length)for(var d=a.split(";"),c=null!=c&&";"!=a.charAt(0)?mxUtils.clone(c):{},e=0;e<d.length;e++){var f=d[e],g=f.indexOf("=");if(0<=g){var k=f.substring(0,g),f=f.substring(g+1);f==mxConstants.NONE?delete c[k]:mxUtils.isNumeric(f)?c[k]=parseFloat(f):c[k]=f}else if(f=this.styles[f],null!=f)for(k in f)c[k]=f[k]}return c};
-function mxCellState(a,b,c){this.view=a;this.cell=b;this.style=null!=c?c:{};this.origin=new mxPoint;this.absoluteOffset=new mxPoint}mxCellState.prototype=new mxRectangle;mxCellState.prototype.constructor=mxCellState;mxCellState.prototype.view=null;mxCellState.prototype.cell=null;mxCellState.prototype.style=null;mxCellState.prototype.invalidStyle=!1;mxCellState.prototype.invalid=!0;mxCellState.prototype.origin=null;mxCellState.prototype.absolutePoints=null;mxCellState.prototype.absoluteOffset=null;
-mxCellState.prototype.visibleSourceState=null;mxCellState.prototype.visibleTargetState=null;mxCellState.prototype.terminalDistance=0;mxCellState.prototype.length=0;mxCellState.prototype.segments=null;mxCellState.prototype.shape=null;mxCellState.prototype.text=null;mxCellState.prototype.unscaledWidth=null;mxCellState.prototype.unscaledHeight=null;
-mxCellState.prototype.getPerimeterBounds=function(a,b){a=a||0;b=null!=b?b:new mxRectangle(this.x,this.y,this.width,this.height);if(null!=this.shape&&null!=this.shape.stencil&&"fixed"==this.shape.stencil.aspect){var c=this.shape.stencil.computeAspect(this.style,b.x,b.y,b.width,b.height);b.x=c.x;b.y=c.y;b.width=this.shape.stencil.w0*c.width;b.height=this.shape.stencil.h0*c.height}0!=a&&b.grow(a);return b};
-mxCellState.prototype.setAbsoluteTerminalPoint=function(a,b){b?(null==this.absolutePoints&&(this.absolutePoints=[]),0==this.absolutePoints.length?this.absolutePoints.push(a):this.absolutePoints[0]=a):null==this.absolutePoints?(this.absolutePoints=[],this.absolutePoints.push(null),this.absolutePoints.push(a)):1==this.absolutePoints.length?this.absolutePoints.push(a):this.absolutePoints[this.absolutePoints.length-1]=a};
-mxCellState.prototype.setCursor=function(a){null!=this.shape&&this.shape.setCursor(a);null!=this.text&&this.text.setCursor(a)};mxCellState.prototype.getVisibleTerminal=function(a){a=this.getVisibleTerminalState(a);return null!=a?a.cell:null};mxCellState.prototype.getVisibleTerminalState=function(a){return a?this.visibleSourceState:this.visibleTargetState};mxCellState.prototype.setVisibleTerminalState=function(a,b){b?this.visibleSourceState=a:this.visibleTargetState=a};
-mxCellState.prototype.getCellBounds=function(){return this.cellBounds};mxCellState.prototype.getPaintBounds=function(){return this.paintBounds};mxCellState.prototype.updateCachedBounds=function(){var a=this.view.translate,b=this.view.scale;this.cellBounds=new mxRectangle(this.x/b-a.x,this.y/b-a.y,this.width/b,this.height/b);this.paintBounds=mxRectangle.fromRectangle(this.cellBounds);null!=this.shape&&this.shape.isPaintBoundsInverted()&&this.paintBounds.rotate90()};
-mxCellState.prototype.setState=function(a){this.view=a.view;this.cell=a.cell;this.style=a.style;this.absolutePoints=a.absolutePoints;this.origin=a.origin;this.absoluteOffset=a.absoluteOffset;this.boundingBox=a.boundingBox;this.terminalDistance=a.terminalDistance;this.segments=a.segments;this.length=a.length;this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;this.unscaledWidth=a.unscaledWidth;this.unscaledHeight=a.unscaledHeight};
-mxCellState.prototype.clone=function(){var a=new mxCellState(this.view,this.cell,this.style);if(null!=this.absolutePoints){a.absolutePoints=[];for(var b=0;b<this.absolutePoints.length;b++)a.absolutePoints[b]=this.absolutePoints[b].clone()}null!=this.origin&&(a.origin=this.origin.clone());null!=this.absoluteOffset&&(a.absoluteOffset=this.absoluteOffset.clone());null!=this.boundingBox&&(a.boundingBox=this.boundingBox.clone());a.terminalDistance=this.terminalDistance;a.segments=this.segments;a.length=
-this.length;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;a.unscaledWidth=this.unscaledWidth;a.unscaledHeight=this.unscaledHeight;return a};mxCellState.prototype.destroy=function(){this.view.graph.cellRenderer.destroy(this)};function mxGraphSelectionModel(a){this.graph=a;this.cells=[]}mxGraphSelectionModel.prototype=new mxEventSource;mxGraphSelectionModel.prototype.constructor=mxGraphSelectionModel;mxGraphSelectionModel.prototype.doneResource="none"!=mxClient.language?"done":"";
-mxGraphSelectionModel.prototype.updatingSelectionResource="none"!=mxClient.language?"updatingSelection":"";mxGraphSelectionModel.prototype.graph=null;mxGraphSelectionModel.prototype.singleSelection=!1;mxGraphSelectionModel.prototype.isSingleSelection=function(){return this.singleSelection};mxGraphSelectionModel.prototype.setSingleSelection=function(a){this.singleSelection=a};mxGraphSelectionModel.prototype.isSelected=function(a){return null!=a?0<=mxUtils.indexOf(this.cells,a):!1};
-mxGraphSelectionModel.prototype.isEmpty=function(){return 0==this.cells.length};mxGraphSelectionModel.prototype.clear=function(){this.changeSelection(null,this.cells)};mxGraphSelectionModel.prototype.setCell=function(a){null!=a&&this.setCells([a])};mxGraphSelectionModel.prototype.setCells=function(a){if(null!=a){this.singleSelection&&(a=[this.getFirstSelectableCell(a)]);for(var b=[],c=0;c<a.length;c++)this.graph.isCellSelectable(a[c])&&b.push(a[c]);this.changeSelection(b,this.cells)}};
-mxGraphSelectionModel.prototype.getFirstSelectableCell=function(a){if(null!=a)for(var b=0;b<a.length;b++)if(this.graph.isCellSelectable(a[b]))return a[b];return null};mxGraphSelectionModel.prototype.addCell=function(a){null!=a&&this.addCells([a])};
-mxGraphSelectionModel.prototype.addCells=function(a){if(null!=a){var b=null;this.singleSelection&&(b=this.cells,a=[this.getFirstSelectableCell(a)]);for(var c=[],d=0;d<a.length;d++)!this.isSelected(a[d])&&this.graph.isCellSelectable(a[d])&&c.push(a[d]);this.changeSelection(c,b)}};mxGraphSelectionModel.prototype.removeCell=function(a){null!=a&&this.removeCells([a])};
-mxGraphSelectionModel.prototype.removeCells=function(a){if(null!=a){for(var b=[],c=0;c<a.length;c++)this.isSelected(a[c])&&b.push(a[c]);this.changeSelection(null,b)}};mxGraphSelectionModel.prototype.changeSelection=function(a,b){if(null!=a&&0<a.length&&null!=a[0]||null!=b&&0<b.length&&null!=b[0]){var c=new mxSelectionChange(this,a,b);c.execute();var d=new mxUndoableEdit(this,!1);d.add(c);this.fireEvent(new mxEventObject(mxEvent.UNDO,"edit",d))}};
-mxGraphSelectionModel.prototype.cellAdded=function(a){null==a||this.isSelected(a)||this.cells.push(a)};mxGraphSelectionModel.prototype.cellRemoved=function(a){null!=a&&(a=mxUtils.indexOf(this.cells,a),0<=a&&this.cells.splice(a,1))};function mxSelectionChange(a,b,c){this.selectionModel=a;this.added=null!=b?b.slice():null;this.removed=null!=c?c.slice():null}
-mxSelectionChange.prototype.execute=function(){var a=mxLog.enter("mxSelectionChange.execute");window.status=mxResources.get(this.selectionModel.updatingSelectionResource)||this.selectionModel.updatingSelectionResource;if(null!=this.removed)for(var b=0;b<this.removed.length;b++)this.selectionModel.cellRemoved(this.removed[b]);if(null!=this.added)for(b=0;b<this.added.length;b++)this.selectionModel.cellAdded(this.added[b]);b=this.added;this.added=this.removed;this.removed=b;window.status=mxResources.get(this.selectionModel.doneResource)||
-this.selectionModel.doneResource;mxLog.leave("mxSelectionChange.execute",a);this.selectionModel.fireEvent(new mxEventObject(mxEvent.CHANGE,"added",this.added,"removed",this.removed))};
-function mxCellEditor(a){this.graph=a;this.zoomHandler=mxUtils.bind(this,function(){this.graph.isEditing()&&this.resize()});this.graph.view.addListener(mxEvent.SCALE,this.zoomHandler);this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE,this.zoomHandler);this.changeHandler=mxUtils.bind(this,function(a){null!=this.editingCell&&null==this.graph.getView().getState(this.editingCell)&&this.stopEditing(!0)});this.graph.getModel().addListener(mxEvent.CHANGE,this.changeHandler)}
-mxCellEditor.prototype.graph=null;mxCellEditor.prototype.textarea=null;mxCellEditor.prototype.editingCell=null;mxCellEditor.prototype.trigger=null;mxCellEditor.prototype.modified=!1;mxCellEditor.prototype.autoSize=!0;mxCellEditor.prototype.selectText=!0;mxCellEditor.prototype.emptyLabelText=mxClient.IS_FF?"<br>":"";mxCellEditor.prototype.escapeCancelsEditing=!0;mxCellEditor.prototype.textNode="";mxCellEditor.prototype.zIndex=5;mxCellEditor.prototype.minResize=new mxRectangle(0,20);
-mxCellEditor.prototype.wordWrapPadding=mxClient.IS_QUIRKS?2:mxClient.IS_IE11?0:1;mxCellEditor.prototype.blurEnabled=!1;mxCellEditor.prototype.initialValue=null;mxCellEditor.prototype.align=null;mxCellEditor.prototype.init=function(){this.textarea=document.createElement("div");this.textarea.className="mxCellEditor mxPlainTextEditor";this.textarea.contentEditable=!0;mxClient.IS_GC&&(this.textarea.style.minHeight="1em");this.textarea.style.position=this.isLegacyEditor()?"absolute":"relative";this.installListeners(this.textarea)};
-mxCellEditor.prototype.applyValue=function(a,b){this.graph.labelChanged(a.cell,b,this.trigger)};mxCellEditor.prototype.setAlign=function(a){null!=this.textarea&&(this.textarea.style.textAlign=a);this.align=a;this.resize()};
-mxCellEditor.prototype.getInitialValue=function(a,b){var c=mxUtils.htmlEntities(this.graph.getEditingValue(a.cell,b),!1);mxClient.IS_QUIRKS||8==document.documentMode||9==document.documentMode||10==document.documentMode||(c=mxUtils.replaceTrailingNewlines(c,"<div><br></div>"));return c.replace(/\n/g,"<br>")};mxCellEditor.prototype.getCurrentValue=function(a){return mxUtils.extractTextWithWhitespace(this.textarea.childNodes)};
-mxCellEditor.prototype.isCancelEditingKeyEvent=function(a){return this.escapeCancelsEditing||mxEvent.isShiftDown(a)||mxEvent.isControlDown(a)||mxEvent.isMetaDown(a)};
-mxCellEditor.prototype.installListeners=function(a){mxEvent.addListener(a,"dragstart",mxUtils.bind(this,function(a){this.graph.stopEditing(!1);mxEvent.consume(a)}));mxEvent.addListener(a,"blur",mxUtils.bind(this,function(a){this.blurEnabled&&this.focusLost(a)}));mxEvent.addListener(a,"keydown",mxUtils.bind(this,function(a){mxEvent.isConsumed(a)||(this.isStopEditingEvent(a)?(this.graph.stopEditing(!1),mxEvent.consume(a)):27==a.keyCode&&(this.graph.stopEditing(this.isCancelEditingKeyEvent(a)),mxEvent.consume(a)))}));
-var b=mxUtils.bind(this,function(b){null!=this.editingCell&&this.clearOnChange&&a.innerHTML==this.getEmptyLabelText()&&(!mxClient.IS_FF||8!=b.keyCode&&46!=b.keyCode)&&(this.clearOnChange=!1,a.innerHTML="")});mxEvent.addListener(a,"keypress",b);mxEvent.addListener(a,"paste",b);b=mxUtils.bind(this,function(a){null!=this.editingCell&&(0==this.textarea.innerHTML.length||"<br>"==this.textarea.innerHTML?(this.textarea.innerHTML=this.getEmptyLabelText(),this.clearOnChange=0<this.textarea.innerHTML.length):
-this.clearOnChange=!1)});mxEvent.addListener(a,mxClient.IS_IE11||mxClient.IS_IE?"keyup":"input",b);mxEvent.addListener(a,"cut",b);mxEvent.addListener(a,"paste",b);var b=mxClient.IS_IE11||mxClient.IS_IE?"keydown":"input",c=mxUtils.bind(this,function(a){null!=this.editingCell&&this.autoSize&&!mxEvent.isConsumed(a)&&(null!=this.resizeThread&&window.clearTimeout(this.resizeThread),this.resizeThread=window.setTimeout(mxUtils.bind(this,function(){this.resizeThread=null;this.resize()}),0))});mxEvent.addListener(a,
-b,c);mxEvent.addListener(window,"resize",c);9<=document.documentMode?(mxEvent.addListener(a,"DOMNodeRemoved",c),mxEvent.addListener(a,"DOMNodeInserted",c)):(mxEvent.addListener(a,"cut",c),mxEvent.addListener(a,"paste",c))};mxCellEditor.prototype.isStopEditingEvent=function(a){return 113==a.keyCode||this.graph.isEnterStopsCellEditing()&&13==a.keyCode&&!mxEvent.isControlDown(a)&&!mxEvent.isShiftDown(a)};mxCellEditor.prototype.isEventSource=function(a){return mxEvent.getSource(a)==this.textarea};
-mxCellEditor.prototype.resize=function(){var a=this.graph.getView().getState(this.editingCell);if(null==a)this.stopEditing(!0);else if(null!=this.textarea){var b=this.graph.getModel().isEdge(a.cell),c=this.graph.getView().scale,d=null;if(this.autoSize&&"fill"!=a.style[mxConstants.STYLE_OVERFLOW]){var e=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_WIDTH,null),d=null!=a.text&&null==this.align?a.text.margin:null;null==d&&(d=mxUtils.getAlignmentAsPoint(this.align||mxUtils.getValue(a.style,mxConstants.STYLE_ALIGN,
-mxConstants.ALIGN_CENTER),mxUtils.getValue(a.style,mxConstants.STYLE_VERTICAL_ALIGN,mxConstants.ALIGN_MIDDLE)));if(b)this.bounds=new mxRectangle(a.absoluteOffset.x,a.absoluteOffset.y,0,0),null!=e&&(e=(parseFloat(e)+2)*c,this.bounds.width=e,this.bounds.x+=d.x*e);else{var b=mxRectangle.fromRectangle(a),f=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER),g=mxUtils.getValue(a.style,mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE),b=null!=a.shape&&f==
-mxConstants.ALIGN_CENTER&&g==mxConstants.ALIGN_MIDDLE?a.shape.getLabelBounds(b):b;null!=e&&(b.width=parseFloat(e)*c);if(!a.view.graph.cellRenderer.legacySpacing||"width"!=a.style[mxConstants.STYLE_OVERFLOW]&&"block"!=a.style[mxConstants.STYLE_OVERFLOW])var f=parseInt(a.style[mxConstants.STYLE_SPACING]||2)*c,k=(parseInt(a.style[mxConstants.STYLE_SPACING_TOP]||0)+mxText.prototype.baseSpacingTop)*c+f,l=(parseInt(a.style[mxConstants.STYLE_SPACING_RIGHT]||0)+mxText.prototype.baseSpacingRight)*c+f,m=(parseInt(a.style[mxConstants.STYLE_SPACING_BOTTOM]||
-0)+mxText.prototype.baseSpacingBottom)*c+f,n=(parseInt(a.style[mxConstants.STYLE_SPACING_LEFT]||0)+mxText.prototype.baseSpacingLeft)*c+f,f=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER),g=mxUtils.getValue(a.style,mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE),b=new mxRectangle(b.x+n,b.y+k,b.width-(f==mxConstants.ALIGN_CENTER&&null==e?n+l:0),b.height-(g==mxConstants.ALIGN_MIDDLE?k+m:0));this.bounds=new mxRectangle(b.x+a.absoluteOffset.x,b.y+
-a.absoluteOffset.y,b.width,b.height)}if(this.graph.isWrapping(a.cell)&&(2<=this.bounds.width||2<=this.bounds.height)&&this.textarea.innerHTML!=this.getEmptyLabelText())if(this.textarea.style.wordWrap=mxConstants.WORD_WRAP,this.textarea.style.whiteSpace="normal",e=Math.round(this.bounds.width/c)+this.wordWrapPadding,"relative"!=this.textarea.style.position)this.textarea.style.width=e+"px",this.textarea.scrollWidth>e&&(this.textarea.style.width=this.textarea.scrollWidth+"px");else if("block"==a.style[mxConstants.STYLE_OVERFLOW]||
-"width"==a.style[mxConstants.STYLE_OVERFLOW]){if(-.5==d.y||"width"==a.style[mxConstants.STYLE_OVERFLOW])this.textarea.style.maxHeight=this.bounds.height+"px";this.textarea.style.width=e+"px"}else this.textarea.style.maxWidth=e+"px";else this.textarea.style.whiteSpace="nowrap",this.textarea.style.width="";8==document.documentMode&&(this.textarea.style.zoom="1",this.textarea.style.height="auto");8==document.documentMode?(a=this.textarea.scrollWidth,e=this.textarea.scrollHeight,this.textarea.style.left=
-Math.max(0,Math.ceil((this.bounds.x-d.x*(this.bounds.width-(a+1)*c)+a*(c-1)*0+2*(d.x+.5))/c))+"px",this.textarea.style.top=Math.max(0,Math.ceil((this.bounds.y-d.y*(this.bounds.height-(e+.5)*c)+e*(c-1)*0+1*Math.abs(d.y+.5))/c))+"px",this.textarea.style.width=Math.round(a*c)+"px",this.textarea.style.height=Math.round(e*c)+"px"):mxClient.IS_QUIRKS?(a=this.textarea.scrollWidth,e=this.textarea.scrollHeight,this.textarea.style.left=Math.max(0,Math.ceil(this.bounds.x-d.x*(this.bounds.width-(a+1)*c)+a*(c-
-1)*0+2*(d.x+.5)))+"px",this.textarea.style.top=Math.max(0,Math.ceil(this.bounds.y-d.y*(this.bounds.height-(e+.5)*c)+e*(c-1)*0+1*Math.abs(d.y+.5)))+"px"):(this.textarea.style.left=Math.max(0,Math.round(this.bounds.x-d.x*(this.bounds.width-2))+1)+"px",this.textarea.style.top=Math.max(0,Math.round(this.bounds.y-d.y*(this.bounds.height-4)+(-1==d.y?3:0))+1)+"px")}else this.bounds=this.getEditorBounds(a),this.textarea.style.width=Math.round(this.bounds.width/c)+"px",this.textarea.style.height=Math.round(this.bounds.height/
-c)+"px",8==document.documentMode||mxClient.IS_QUIRKS?(this.textarea.style.left=Math.round(this.bounds.x)+"px",this.textarea.style.top=Math.round(this.bounds.y)+"px"):(this.textarea.style.left=Math.max(0,Math.round(this.bounds.x+1))+"px",this.textarea.style.top=Math.max(0,Math.round(this.bounds.y+1))+"px"),this.graph.isWrapping(a.cell)&&(2<=this.bounds.width||2<=this.bounds.height)&&this.textarea.innerHTML!=this.getEmptyLabelText()?(this.textarea.style.wordWrap=mxConstants.WORD_WRAP,this.textarea.style.whiteSpace=
-"normal","fill"!=a.style[mxConstants.STYLE_OVERFLOW]&&(this.textarea.style.width=Math.round(this.bounds.width/c)+this.wordWrapPadding+"px")):(this.textarea.style.whiteSpace="nowrap","fill"!=a.style[mxConstants.STYLE_OVERFLOW]&&(this.textarea.style.width=""));mxClient.IS_VML?this.textarea.style.zoom=c:(mxUtils.setPrefixedStyle(this.textarea.style,"transformOrigin","0px 0px"),mxUtils.setPrefixedStyle(this.textarea.style,"transform","scale("+c+","+c+")"+(null==d?"":" translate("+100*d.x+"%,"+100*d.y+
-"%)")))}};mxCellEditor.prototype.focusLost=function(){this.stopEditing(!this.graph.isInvokesStopCellEditing())};mxCellEditor.prototype.getBackgroundColor=function(a){return null};mxCellEditor.prototype.isLegacyEditor=function(){if(mxClient.IS_VML)return!0;var a=!1;if(mxClient.IS_SVG){var b=this.graph.view.getDrawPane().ownerSVGElement;null!=b&&(b=mxUtils.getCurrentStyle(b),null!=b&&(a="absolute"==b.position))}return!a};
-mxCellEditor.prototype.startEditing=function(a,b){this.stopEditing(!0);this.align=null;null==this.textarea&&this.init();null!=this.graph.tooltipHandler&&this.graph.tooltipHandler.hideTooltip();var c=this.graph.getView().getState(a);if(null!=c){this.graph.getView();var d=mxUtils.getValue(c.style,mxConstants.STYLE_FONTSIZE,mxConstants.DEFAULT_FONTSIZE),e=mxUtils.getValue(c.style,mxConstants.STYLE_FONTFAMILY,mxConstants.DEFAULT_FONTFAMILY),f=mxUtils.getValue(c.style,mxConstants.STYLE_FONTCOLOR,"black"),
-g=mxUtils.getValue(c.style,mxConstants.STYLE_ALIGN,mxConstants.ALIGN_LEFT),k=(mxUtils.getValue(c.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD,l=(mxUtils.getValue(c.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC,m=[];(mxUtils.getValue(c.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&m.push("underline");(mxUtils.getValue(c.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_STRIKETHROUGH)==
-mxConstants.FONT_STRIKETHROUGH&&m.push("line-through");this.textarea.style.lineHeight=mxConstants.ABSOLUTE_LINE_HEIGHT?Math.round(d*mxConstants.LINE_HEIGHT)+"px":mxConstants.LINE_HEIGHT;this.textarea.style.backgroundColor=this.getBackgroundColor(c);this.textarea.style.textDecoration=m.join(" ");this.textarea.style.fontWeight=k?"bold":"normal";this.textarea.style.fontStyle=l?"italic":"";this.textarea.style.fontSize=Math.round(d)+"px";this.textarea.style.zIndex=this.zIndex;this.textarea.style.fontFamily=
-e;this.textarea.style.textAlign=g;this.textarea.style.outline="none";this.textarea.style.color=f;d=this.textDirection=mxUtils.getValue(c.style,mxConstants.STYLE_TEXT_DIRECTION,mxConstants.DEFAULT_TEXT_DIRECTION);d==mxConstants.TEXT_DIRECTION_AUTO&&(null==c||null==c.text||c.text.dialect==mxConstants.DIALECT_STRICTHTML||mxUtils.isNode(c.text.value)||(d=c.text.getAutoDirection()));d==mxConstants.TEXT_DIRECTION_LTR||d==mxConstants.TEXT_DIRECTION_RTL?this.textarea.setAttribute("dir",d):this.textarea.removeAttribute("dir");
-this.textarea.innerHTML=this.getInitialValue(c,b)||"";this.initialValue=this.textarea.innerHTML;0==this.textarea.innerHTML.length||"<br>"==this.textarea.innerHTML?(this.textarea.innerHTML=this.getEmptyLabelText(),this.clearOnChange=!0):this.clearOnChange=this.textarea.innerHTML==this.getEmptyLabelText();this.graph.container.appendChild(this.textarea);this.editingCell=a;this.trigger=b;this.textNode=null;null!=c.text&&this.isHideLabel(c)&&(this.textNode=c.text.node,this.textNode.style.visibility="hidden");
-this.autoSize&&(this.graph.model.isEdge(c.cell)||"fill"!=c.style[mxConstants.STYLE_OVERFLOW])&&window.setTimeout(mxUtils.bind(this,function(){this.resize()}),0);this.resize();try{this.textarea.focus(),this.isSelectText()&&0<this.textarea.innerHTML.length&&(this.textarea.innerHTML!=this.getEmptyLabelText()||!this.clearOnChange)&&document.execCommand("selectAll",!1,null)}catch(n){}}};mxCellEditor.prototype.isSelectText=function(){return this.selectText};
-mxCellEditor.prototype.clearSelection=function(){var a=null;window.getSelection?a=window.getSelection():document.selection&&(a=document.selection);null!=a&&(a.empty?a.empty():a.removeAllRanges&&a.removeAllRanges())};
-mxCellEditor.prototype.stopEditing=function(a){if(null!=this.editingCell){null!=this.textNode&&(this.textNode.style.visibility="visible",this.textNode=null);a=a?null:this.graph.view.getState(this.editingCell);var b=this.initialValue;this.bounds=this.trigger=this.editingCell=this.initialValue=null;this.textarea.blur();this.clearSelection();null!=this.textarea.parentNode&&this.textarea.parentNode.removeChild(this.textarea);this.clearOnChange&&this.textarea.innerHTML==this.getEmptyLabelText()&&(this.textarea.innerHTML=
-"",this.clearOnChange=!1);if(null!=a&&(this.textarea.innerHTML!=b||null!=this.align)){this.prepareTextarea();b=this.getCurrentValue(a);this.graph.getModel().beginUpdate();try{null!=b&&this.applyValue(a,b),null!=this.align&&this.graph.setCellStyles(mxConstants.STYLE_ALIGN,this.align,[a.cell])}finally{this.graph.getModel().endUpdate()}}mxEvent.release(this.textarea);this.align=this.textarea=null}};
-mxCellEditor.prototype.prepareTextarea=function(){null!=this.textarea.lastChild&&"BR"==this.textarea.lastChild.nodeName&&this.textarea.removeChild(this.textarea.lastChild)};mxCellEditor.prototype.isHideLabel=function(a){return!0};mxCellEditor.prototype.getMinimumSize=function(a){var b=this.graph.getView().scale;return new mxRectangle(0,0,null==a.text?30:a.text.size*b+20,"left"==this.textarea.style.textAlign?120:40)};
-mxCellEditor.prototype.getEditorBounds=function(a){var b=this.graph.getModel().isEdge(a.cell),c=this.graph.getView().scale,d=this.getMinimumSize(a),e=d.width,d=d.height;if(!b&&a.view.graph.cellRenderer.legacySpacing&&"fill"==a.style[mxConstants.STYLE_OVERFLOW])c=a.shape.getLabelBounds(mxRectangle.fromRectangle(a));else{var f=parseInt(a.style[mxConstants.STYLE_SPACING]||0)*c,g=(parseInt(a.style[mxConstants.STYLE_SPACING_TOP]||0)+mxText.prototype.baseSpacingTop)*c+f,k=(parseInt(a.style[mxConstants.STYLE_SPACING_RIGHT]||
-0)+mxText.prototype.baseSpacingRight)*c+f,l=(parseInt(a.style[mxConstants.STYLE_SPACING_BOTTOM]||0)+mxText.prototype.baseSpacingBottom)*c+f,f=(parseInt(a.style[mxConstants.STYLE_SPACING_LEFT]||0)+mxText.prototype.baseSpacingLeft)*c+f,c=new mxRectangle(a.x,a.y,Math.max(e,a.width-f-k),Math.max(d,a.height-g-l)),k=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER),l=mxUtils.getValue(a.style,mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE),c=null!=a.shape&&
-k==mxConstants.ALIGN_CENTER&&l==mxConstants.ALIGN_MIDDLE?a.shape.getLabelBounds(c):c;b?(c.x=a.absoluteOffset.x,c.y=a.absoluteOffset.y,null!=a.text&&null!=a.text.boundingBox&&(0<a.text.boundingBox.x&&(c.x=a.text.boundingBox.x),0<a.text.boundingBox.y&&(c.y=a.text.boundingBox.y))):null!=a.text&&null!=a.text.boundingBox&&(c.x=Math.min(c.x,a.text.boundingBox.x),c.y=Math.min(c.y,a.text.boundingBox.y));c.x+=f;c.y+=g;null!=a.text&&null!=a.text.boundingBox&&(b?(c.width=Math.max(e,a.text.boundingBox.width),
-c.height=Math.max(d,a.text.boundingBox.height)):(c.width=Math.max(c.width,a.text.boundingBox.width),c.height=Math.max(c.height,a.text.boundingBox.height)));this.graph.getModel().isVertex(a.cell)&&(b=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER),b==mxConstants.ALIGN_LEFT?c.x-=a.width:b==mxConstants.ALIGN_RIGHT&&(c.x+=a.width),b=mxUtils.getValue(a.style,mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE),b==mxConstants.ALIGN_TOP?c.y-=a.height:b==
-mxConstants.ALIGN_BOTTOM&&(c.y+=a.height))}return new mxRectangle(Math.round(c.x),Math.round(c.y),Math.round(c.width),Math.round(c.height))};mxCellEditor.prototype.getEmptyLabelText=function(a){return this.emptyLabelText};mxCellEditor.prototype.getEditingCell=function(){return this.editingCell};
-mxCellEditor.prototype.destroy=function(){null!=this.textarea&&(mxEvent.release(this.textarea),null!=this.textarea.parentNode&&this.textarea.parentNode.removeChild(this.textarea),this.textarea=null);null!=this.changeHandler&&(this.graph.getModel().removeListener(this.changeHandler),this.changeHandler=null);this.zoomHandler&&(this.graph.view.removeListener(this.zoomHandler),this.zoomHandler=null)};function mxCellRenderer(){}mxCellRenderer.defaultShapes={};
-mxCellRenderer.prototype.defaultEdgeShape=mxConnector;mxCellRenderer.prototype.defaultVertexShape=mxRectangleShape;mxCellRenderer.prototype.defaultTextShape=mxText;mxCellRenderer.prototype.legacyControlPosition=!0;mxCellRenderer.prototype.legacySpacing=!0;mxCellRenderer.prototype.antiAlias=!0;mxCellRenderer.prototype.minSvgStrokeWidth=1;mxCellRenderer.prototype.forceControlClickHandler=!1;mxCellRenderer.registerShape=function(a,b){mxCellRenderer.defaultShapes[a]=b};
-mxCellRenderer.registerShape(mxConstants.SHAPE_RECTANGLE,mxRectangleShape);mxCellRenderer.registerShape(mxConstants.SHAPE_ELLIPSE,mxEllipse);mxCellRenderer.registerShape(mxConstants.SHAPE_RHOMBUS,mxRhombus);mxCellRenderer.registerShape(mxConstants.SHAPE_CYLINDER,mxCylinder);mxCellRenderer.registerShape(mxConstants.SHAPE_CONNECTOR,mxConnector);mxCellRenderer.registerShape(mxConstants.SHAPE_ACTOR,mxActor);mxCellRenderer.registerShape(mxConstants.SHAPE_TRIANGLE,mxTriangle);
-mxCellRenderer.registerShape(mxConstants.SHAPE_HEXAGON,mxHexagon);mxCellRenderer.registerShape(mxConstants.SHAPE_CLOUD,mxCloud);mxCellRenderer.registerShape(mxConstants.SHAPE_LINE,mxLine);mxCellRenderer.registerShape(mxConstants.SHAPE_ARROW,mxArrow);mxCellRenderer.registerShape(mxConstants.SHAPE_ARROW_CONNECTOR,mxArrowConnector);mxCellRenderer.registerShape(mxConstants.SHAPE_DOUBLE_ELLIPSE,mxDoubleEllipse);mxCellRenderer.registerShape(mxConstants.SHAPE_SWIMLANE,mxSwimlane);
-mxCellRenderer.registerShape(mxConstants.SHAPE_IMAGE,mxImageShape);mxCellRenderer.registerShape(mxConstants.SHAPE_LABEL,mxLabel);mxCellRenderer.prototype.initializeShape=function(a){a.shape.dialect=a.view.graph.dialect;this.configureShape(a);a.shape.init(a.view.getDrawPane())};mxCellRenderer.prototype.createShape=function(a){var b=null;null!=a.style&&(b=mxStencilRegistry.getStencil(a.style[mxConstants.STYLE_SHAPE]),b=null!=b?new mxShape(b):new (this.getShapeConstructor(a)));return b};
-mxCellRenderer.prototype.createIndicatorShape=function(a){a.shape.indicatorShape=this.getShape(a.view.graph.getIndicatorShape(a))};mxCellRenderer.prototype.getShape=function(a){return null!=a?mxCellRenderer.defaultShapes[a]:null};mxCellRenderer.prototype.getShapeConstructor=function(a){var b=this.getShape(a.style[mxConstants.STYLE_SHAPE]);null==b&&(b=a.view.graph.getModel().isEdge(a.cell)?this.defaultEdgeShape:this.defaultVertexShape);return b};
-mxCellRenderer.prototype.configureShape=function(a){a.shape.apply(a);a.shape.image=a.view.graph.getImage(a);a.shape.indicatorColor=a.view.graph.getIndicatorColor(a);a.shape.indicatorStrokeColor=a.style[mxConstants.STYLE_INDICATOR_STROKECOLOR];a.shape.indicatorGradientColor=a.view.graph.getIndicatorGradientColor(a);a.shape.indicatorDirection=a.style[mxConstants.STYLE_INDICATOR_DIRECTION];a.shape.indicatorImage=a.view.graph.getIndicatorImage(a);this.postConfigureShape(a)};
-mxCellRenderer.prototype.postConfigureShape=function(a){null!=a.shape&&(this.resolveColor(a,"indicatorGradientColor",mxConstants.STYLE_GRADIENTCOLOR),this.resolveColor(a,"indicatorColor",mxConstants.STYLE_FILLCOLOR),this.resolveColor(a,"gradient",mxConstants.STYLE_GRADIENTCOLOR),this.resolveColor(a,"stroke",mxConstants.STYLE_STROKECOLOR),this.resolveColor(a,"fill",mxConstants.STYLE_FILLCOLOR))};
-mxCellRenderer.prototype.checkPlaceholderStyles=function(a){if(null!=a.style)for(var b=["inherit","swimlane","indicated"],c=[mxConstants.STYLE_FILLCOLOR,mxConstants.STYLE_STROKECOLOR,mxConstants.STYLE_GRADIENTCOLOR,mxConstants.STYLE_FONTCOLOR],d=0;d<c.length;d++)if(0<=mxUtils.indexOf(b,a.style[c[d]]))return!0;return!1};
-mxCellRenderer.prototype.resolveColor=function(a,b,c){var d=c==mxConstants.STYLE_FONTCOLOR?a.text:a.shape;if(null!=d){var e=a.view.graph,f=d[b],g=null;"inherit"==f?g=e.model.getParent(a.cell):"swimlane"==f?(d[b]=c==mxConstants.STYLE_STROKECOLOR||c==mxConstants.STYLE_FONTCOLOR?"#000000":"#ffffff",g=null!=e.model.getTerminal(a.cell,!1)?e.model.getTerminal(a.cell,!1):a.cell,g=e.getSwimlane(g),c=e.swimlaneIndicatorColorAttribute):"indicated"==f&&null!=a.shape?d[b]=a.shape.indicatorColor:c!=mxConstants.STYLE_FILLCOLOR&&
-f==mxConstants.STYLE_FILLCOLOR&&null!=a.shape?d[b]=a.style[mxConstants.STYLE_FILLCOLOR]:c!=mxConstants.STYLE_STROKECOLOR&&f==mxConstants.STYLE_STROKECOLOR&&null!=a.shape&&(d[b]=a.style[mxConstants.STYLE_STROKECOLOR]);null!=g&&(a=e.getView().getState(g),d[b]=null,null!=a&&(e=c==mxConstants.STYLE_FONTCOLOR?a.text:a.shape,d[b]=null!=e&&"indicatorColor"!=b?e[b]:a.style[c]))}};mxCellRenderer.prototype.getLabelValue=function(a){return a.view.graph.getLabel(a.cell)};
-mxCellRenderer.prototype.createLabel=function(a,b){var c=a.view.graph;c.getModel().isEdge(a.cell);if(0<a.style[mxConstants.STYLE_FONTSIZE]||null==a.style[mxConstants.STYLE_FONTSIZE]){var d=c.isHtmlLabel(a.cell)||null!=b&&mxUtils.isNode(b);a.text=new this.defaultTextShape(b,new mxRectangle,a.style[mxConstants.STYLE_ALIGN]||mxConstants.ALIGN_CENTER,c.getVerticalAlign(a),a.style[mxConstants.STYLE_FONTCOLOR],a.style[mxConstants.STYLE_FONTFAMILY],a.style[mxConstants.STYLE_FONTSIZE],a.style[mxConstants.STYLE_FONTSTYLE],
-a.style[mxConstants.STYLE_SPACING],a.style[mxConstants.STYLE_SPACING_TOP],a.style[mxConstants.STYLE_SPACING_RIGHT],a.style[mxConstants.STYLE_SPACING_BOTTOM],a.style[mxConstants.STYLE_SPACING_LEFT],a.style[mxConstants.STYLE_HORIZONTAL],a.style[mxConstants.STYLE_LABEL_BACKGROUNDCOLOR],a.style[mxConstants.STYLE_LABEL_BORDERCOLOR],c.isWrapping(a.cell)&&c.isHtmlLabel(a.cell),c.isLabelClipped(a.cell),a.style[mxConstants.STYLE_OVERFLOW],a.style[mxConstants.STYLE_LABEL_PADDING],mxUtils.getValue(a.style,mxConstants.STYLE_TEXT_DIRECTION,
-mxConstants.DEFAULT_TEXT_DIRECTION));a.text.opacity=mxUtils.getValue(a.style,mxConstants.STYLE_TEXT_OPACITY,100);a.text.dialect=d?mxConstants.DIALECT_STRICTHTML:a.view.graph.dialect;a.text.style=a.style;a.text.state=a;this.initializeLabel(a,a.text);var e=!1,f=function(b){var d=a;if(mxClient.IS_TOUCH||e)d=mxEvent.getClientX(b),b=mxEvent.getClientY(b),b=mxUtils.convertPoint(c.container,d,b),d=c.view.getState(c.getCellAt(b.x,b.y));return d};mxEvent.addGestureListeners(a.text.node,mxUtils.bind(this,function(b){this.isLabelEvent(a,
-b)&&(c.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(b,a)),e=c.dialect!=mxConstants.DIALECT_SVG&&"IMG"==mxEvent.getSource(b).nodeName)}),mxUtils.bind(this,function(b){this.isLabelEvent(a,b)&&c.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(b,f(b)))}),mxUtils.bind(this,function(b){this.isLabelEvent(a,b)&&(c.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(b,f(b))),e=!1)}));c.nativeDblClickEnabled&&mxEvent.addListener(a.text.node,"dblclick",mxUtils.bind(this,function(b){this.isLabelEvent(a,
-b)&&(c.dblClick(b,a.cell),mxEvent.consume(b))}))}};mxCellRenderer.prototype.initializeLabel=function(a,b){mxClient.IS_SVG&&mxClient.NO_FO&&b.dialect!=mxConstants.DIALECT_SVG?b.init(a.view.graph.container):b.init(a.view.getDrawPane())};
-mxCellRenderer.prototype.createCellOverlays=function(a){var b=a.view.graph.getCellOverlays(a.cell),c=null;if(null!=b)for(var c=new mxDictionary,d=0;d<b.length;d++){var e=null!=a.overlays?a.overlays.remove(b[d]):null;null==e&&(e=new mxImageShape(new mxRectangle,b[d].image.src),e.dialect=a.view.graph.dialect,e.preserveImageAspect=!1,e.overlay=b[d],this.initializeOverlay(a,e),this.installCellOverlayListeners(a,b[d],e),null!=b[d].cursor&&(e.node.style.cursor=b[d].cursor));c.put(b[d],e)}null!=a.overlays&&
-a.overlays.visit(function(a,b){b.destroy()});a.overlays=c};mxCellRenderer.prototype.initializeOverlay=function(a,b){b.init(a.view.getOverlayPane())};
-mxCellRenderer.prototype.installCellOverlayListeners=function(a,b,c){var d=a.view.graph;mxEvent.addListener(c.node,"click",function(c){d.isEditing()&&d.stopEditing(!d.isInvokesStopCellEditing());b.fireEvent(new mxEventObject(mxEvent.CLICK,"event",c,"cell",a.cell))});mxEvent.addGestureListeners(c.node,function(a){mxEvent.consume(a)},function(b){d.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(b,a))});mxClient.IS_TOUCH&&mxEvent.addListener(c.node,"touchend",function(c){b.fireEvent(new mxEventObject(mxEvent.CLICK,
-"event",c,"cell",a.cell))})};mxCellRenderer.prototype.createControl=function(a){var b=a.view.graph,c=b.getFoldingImage(a);if(b.foldingEnabled&&null!=c){if(null==a.control){var d=new mxRectangle(0,0,c.width,c.height);a.control=new mxImageShape(d,c.src);a.control.preserveImageAspect=!1;a.control.dialect=b.dialect;this.initControl(a,a.control,!0,this.createControlClickHandler(a))}}else null!=a.control&&(a.control.destroy(),a.control=null)};
-mxCellRenderer.prototype.createControlClickHandler=function(a){var b=a.view.graph;return mxUtils.bind(this,function(c){if(this.forceControlClickHandler||b.isEnabled()){var d=!b.isCellCollapsed(a.cell);b.foldCells(d,!1,[a.cell],null,c);mxEvent.consume(c)}})};
-mxCellRenderer.prototype.initControl=function(a,b,c,d){var e=a.view.graph;e.isHtmlLabel(a.cell)&&mxClient.NO_FO&&e.dialect==mxConstants.DIALECT_SVG?(b.dialect=mxConstants.DIALECT_PREFERHTML,b.init(e.container),b.node.style.zIndex=1):b.init(a.view.getOverlayPane());b=b.innerNode||b.node;null==d||mxClient.IS_IOS||(e.isEnabled()&&(b.style.cursor="pointer"),mxEvent.addListener(b,"click",d));if(c){var f=null;mxEvent.addGestureListeners(b,function(b){f=new mxPoint(mxEvent.getClientX(b),mxEvent.getClientY(b));
-e.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(b,a));mxEvent.consume(b)},function(b){e.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(b,a))},function(b){e.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(b,a));mxEvent.consume(b)});null!=d&&mxClient.IS_IOS&&b.addEventListener("touchend",function(a){if(null!=f){var b=e.tolerance;Math.abs(f.x-mxEvent.getClientX(a))<b&&Math.abs(f.y-mxEvent.getClientY(a))<b&&(d.call(d,a),mxEvent.consume(a))}},!0)}return b};
-mxCellRenderer.prototype.isShapeEvent=function(a,b){return!0};mxCellRenderer.prototype.isLabelEvent=function(a,b){return!0};
-mxCellRenderer.prototype.installListeners=function(a){var b=a.view.graph,c=function(c){var d=a;if(b.dialect!=mxConstants.DIALECT_SVG&&"IMG"==mxEvent.getSource(c).nodeName||mxClient.IS_TOUCH)d=mxEvent.getClientX(c),c=mxEvent.getClientY(c),c=mxUtils.convertPoint(b.container,d,c),d=b.view.getState(b.getCellAt(c.x,c.y));return d};mxEvent.addGestureListeners(a.shape.node,mxUtils.bind(this,function(c){this.isShapeEvent(a,c)&&b.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(c,a))}),mxUtils.bind(this,
-function(d){this.isShapeEvent(a,d)&&b.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(d,c(d)))}),mxUtils.bind(this,function(d){this.isShapeEvent(a,d)&&b.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(d,c(d)))}));b.nativeDblClickEnabled&&mxEvent.addListener(a.shape.node,"dblclick",mxUtils.bind(this,function(c){this.isShapeEvent(a,c)&&(b.dblClick(c,a.cell),mxEvent.consume(c))}))};
-mxCellRenderer.prototype.redrawLabel=function(a,b){var c=a.view.graph,d=this.getLabelValue(a),e=c.isWrapping(a.cell),f=c.isLabelClipped(a.cell),g=a.view.graph.isHtmlLabel(a.cell)||null!=d&&mxUtils.isNode(d)?mxConstants.DIALECT_STRICTHTML:a.view.graph.dialect,k=a.style[mxConstants.STYLE_OVERFLOW]||"visible";null==a.text||a.text.wrap==e&&a.text.clipped==f&&a.text.overflow==k&&a.text.dialect==g||(a.text.destroy(),a.text=null);null==a.text&&null!=d&&(mxUtils.isNode(d)||0<d.length)?this.createLabel(a,
-d):null==a.text||null!=d&&0!=d.length||(a.text.destroy(),a.text=null);if(null!=a.text){b&&(null!=a.text.lastValue&&this.isTextShapeInvalid(a,a.text)&&(a.text.lastValue=null),a.text.resetStyles(),a.text.apply(a),a.text.valign=c.getVerticalAlign(a));var c=this.getLabelBounds(a),l=this.getTextScale(a);this.resolveColor(a,"color",mxConstants.STYLE_FONTCOLOR);if(b||a.text.value!=d||a.text.isWrapping!=e||a.text.overflow!=k||a.text.isClipping!=f||a.text.scale!=l||a.text.dialect!=g||null==a.text.bounds||
-!a.text.bounds.equals(c))a.text.dialect=g,a.text.value=d,a.text.bounds=c,a.text.scale=l,a.text.wrap=e,a.text.clipped=f,a.text.overflow=k,d=a.text.node.style.visibility,this.redrawLabelShape(a.text),a.text.node.style.visibility=d}};
-mxCellRenderer.prototype.isTextShapeInvalid=function(a,b){function c(c,e,f){return"spacingTop"==e||"spacingRight"==e||"spacingBottom"==e||"spacingLeft"==e?parseFloat(b[c])-parseFloat(b.spacing)!=(a.style[e]||f):b[c]!=(a.style[e]||f)}return c("fontStyle",mxConstants.STYLE_FONTSTYLE,mxConstants.DEFAULT_FONTSTYLE)||c("family",mxConstants.STYLE_FONTFAMILY,mxConstants.DEFAULT_FONTFAMILY)||c("size",mxConstants.STYLE_FONTSIZE,mxConstants.DEFAULT_FONTSIZE)||c("color",mxConstants.STYLE_FONTCOLOR,"black")||
-c("align",mxConstants.STYLE_ALIGN,"")||c("valign",mxConstants.STYLE_VERTICAL_ALIGN,"")||c("spacing",mxConstants.STYLE_SPACING,2)||c("spacingTop",mxConstants.STYLE_SPACING_TOP,0)||c("spacingRight",mxConstants.STYLE_SPACING_RIGHT,0)||c("spacingBottom",mxConstants.STYLE_SPACING_BOTTOM,0)||c("spacingLeft",mxConstants.STYLE_SPACING_LEFT,0)||c("horizontal",mxConstants.STYLE_HORIZONTAL,!0)||c("background",mxConstants.STYLE_LABEL_BACKGROUNDCOLOR)||c("border",mxConstants.STYLE_LABEL_BORDERCOLOR)||c("opacity",
-mxConstants.STYLE_TEXT_OPACITY,100)||c("textDirection",mxConstants.STYLE_TEXT_DIRECTION,mxConstants.DEFAULT_TEXT_DIRECTION)};mxCellRenderer.prototype.redrawLabelShape=function(a){a.redraw()};mxCellRenderer.prototype.getTextScale=function(a){return a.view.scale};
-mxCellRenderer.prototype.getLabelBounds=function(a){var b=a.view.graph,c=a.view.scale,d=b.getModel().isEdge(a.cell),e=new mxRectangle(a.absoluteOffset.x,a.absoluteOffset.y);if(d){var f=a.text.getSpacing();e.x+=f.x*c;e.y+=f.y*c;b=b.getCellGeometry(a.cell);null!=b&&(e.width=Math.max(0,b.width*c),e.height=Math.max(0,b.height*c))}else a.text.isPaintBoundsInverted()&&(b=e.x,e.x=e.y,e.y=b),e.x+=a.x,e.y+=a.y,e.width=Math.max(1,a.width),e.height=Math.max(1,a.height);a.text.isPaintBoundsInverted()&&(b=(a.width-
-a.height)/2,e.x+=b,e.y-=b,b=e.width,e.width=e.height,e.height=b);null!=a.shape&&(b=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER),f=mxUtils.getValue(a.style,mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE),b==mxConstants.ALIGN_CENTER&&f==mxConstants.ALIGN_MIDDLE&&(e=a.shape.getLabelBounds(e)));b=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_WIDTH,null);null!=b&&(e.width=parseFloat(b)*c);d||this.rotateLabelBounds(a,e);return e};
-mxCellRenderer.prototype.rotateLabelBounds=function(a,b){b.y-=a.text.margin.y*b.height;b.x-=a.text.margin.x*b.width;if(!this.legacySpacing||"fill"!=a.style[mxConstants.STYLE_OVERFLOW]&&"width"!=a.style[mxConstants.STYLE_OVERFLOW]&&"block"!=a.style[mxConstants.STYLE_OVERFLOW]){var c=a.view.scale,d=a.text.getSpacing();b.x+=d.x*c;b.y+=d.y*c;var d=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER),e=mxUtils.getValue(a.style,mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE),
-f=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_WIDTH,null);b.width=Math.max(0,b.width-(d==mxConstants.ALIGN_CENTER&&null==f?a.text.spacingLeft*c+a.text.spacingRight*c:0));b.height=Math.max(0,b.height-(e==mxConstants.ALIGN_MIDDLE?a.text.spacingTop*c+a.text.spacingBottom*c:0))}e=a.text.getTextRotation();0!=e&&null!=a&&a.view.graph.model.isVertex(a.cell)&&(c=a.getCenterX(),d=a.getCenterY(),b.x!=c||b.y!=d)&&(e*=Math.PI/180,c=mxUtils.getRotatedPoint(new mxPoint(b.x,b.y),Math.cos(e),Math.sin(e),new mxPoint(c,
-d)),b.x=c.x,b.y=c.y)};
-mxCellRenderer.prototype.redrawCellOverlays=function(a,b){this.createCellOverlays(a);if(null!=a.overlays){var c=mxUtils.mod(mxUtils.getValue(a.style,mxConstants.STYLE_ROTATION,0),90),d=mxUtils.toRadians(c),e=Math.cos(d),f=Math.sin(d);a.overlays.visit(function(d,k){var g=k.overlay.getBounds(a);if(!a.view.graph.getModel().isEdge(a.cell)&&null!=a.shape&&0!=c){var m=g.getCenterX(),n=g.getCenterY(),n=mxUtils.getRotatedPoint(new mxPoint(m,n),e,f,new mxPoint(a.getCenterX(),a.getCenterY())),m=n.x,n=n.y;g.x=
-Math.round(m-g.width/2);g.y=Math.round(n-g.height/2)}if(b||null==k.bounds||k.scale!=a.view.scale||!k.bounds.equals(g))k.bounds=g,k.scale=a.view.scale,k.redraw()})}};
-mxCellRenderer.prototype.redrawControl=function(a,b){var c=a.view.graph.getFoldingImage(a);if(null!=a.control&&null!=c){var c=this.getControlBounds(a,c.width,c.height),d=this.legacyControlPosition?mxUtils.getValue(a.style,mxConstants.STYLE_ROTATION,0):a.shape.getTextRotation(),e=a.view.scale;if(b||a.control.scale!=e||!a.control.bounds.equals(c)||a.control.rotation!=d)a.control.rotation=d,a.control.bounds=c,a.control.scale=e,a.control.redraw()}};
-mxCellRenderer.prototype.getControlBounds=function(a,b,c){if(null!=a.control){var d=a.view.scale,e=a.getCenterX(),f=a.getCenterY();if(!a.view.graph.getModel().isEdge(a.cell)&&(e=a.x+b*d,f=a.y+c*d,null!=a.shape)){var g=a.shape.getShapeRotation();if(this.legacyControlPosition)g=mxUtils.getValue(a.style,mxConstants.STYLE_ROTATION,0);else if(a.shape.isPaintBoundsInverted())var k=(a.width-a.height)/2,e=e+k,f=f-k;0!=g&&(k=mxUtils.toRadians(g),g=Math.cos(k),k=Math.sin(k),f=mxUtils.getRotatedPoint(new mxPoint(e,
-f),g,k,new mxPoint(a.getCenterX(),a.getCenterY())),e=f.x,f=f.y)}return a.view.graph.getModel().isEdge(a.cell),new mxRectangle(Math.round(e-b/2*d),Math.round(f-c/2*d),Math.round(b*d),Math.round(c*d))}return null};
-mxCellRenderer.prototype.insertStateAfter=function(a,b,c){for(var d=this.getShapesForState(a),e=0;e<d.length;e++)if(null!=d[e]&&null!=d[e].node){var f=d[e].node.parentNode!=a.view.getDrawPane()&&d[e].node.parentNode!=a.view.getOverlayPane(),g=f?c:b;if(null!=g&&g.nextSibling!=d[e].node)null==g.nextSibling?g.parentNode.appendChild(d[e].node):g.parentNode.insertBefore(d[e].node,g.nextSibling);else if(null==g)if(d[e].node.parentNode==a.view.graph.container){for(g=a.view.canvas;null!=g&&g.parentNode!=
-a.view.graph.container;)g=g.parentNode;null!=g&&null!=g.nextSibling?g.nextSibling!=d[e].node&&d[e].node.parentNode.insertBefore(d[e].node,g.nextSibling):d[e].node.parentNode.appendChild(d[e].node)}else null!=d[e].node.parentNode&&null!=d[e].node.parentNode.firstChild&&d[e].node.parentNode.firstChild!=d[e].node&&d[e].node.parentNode.insertBefore(d[e].node,d[e].node.parentNode.firstChild);f?c=d[e].node:b=d[e].node}return[b,c]};
-mxCellRenderer.prototype.getShapesForState=function(a){return[a.shape,a.text,a.control]};mxCellRenderer.prototype.redraw=function(a,b,c){b=this.redrawShape(a,b,c);null==a.shape||null!=c&&!c||(this.redrawLabel(a,b),this.redrawCellOverlays(a,b),this.redrawControl(a,b))};
-mxCellRenderer.prototype.redrawShape=function(a,b,c){var d=a.view.graph.model,e=!1;null!=a.shape&&null!=a.shape.style&&null!=a.style&&a.shape.style[mxConstants.STYLE_SHAPE]!=a.style[mxConstants.STYLE_SHAPE]&&(a.shape.destroy(),a.shape=null);null==a.shape&&null!=a.view.graph.container&&a.cell!=a.view.currentRoot&&(d.isVertex(a.cell)||d.isEdge(a.cell))?(a.shape=this.createShape(a),null!=a.shape&&(a.shape.minSvgStrokeWidth=this.minSvgStrokeWidth,a.shape.antiAlias=this.antiAlias,this.createIndicatorShape(a),
-this.initializeShape(a),this.createCellOverlays(a),this.installListeners(a),a.view.graph.selectionCellsHandler.updateHandler(a))):b||null==a.shape||mxUtils.equalEntries(a.shape.style,a.style)&&!this.checkPlaceholderStyles(a)||(a.shape.resetStyles(),this.configureShape(a),a.view.graph.selectionCellsHandler.updateHandler(a),b=!0);null!=a.shape&&a.shape.indicatorShape!=this.getShape(a.view.graph.getIndicatorShape(a))&&(null!=a.shape.indicator&&(a.shape.indicator.destroy(),a.shape.indicator=null),this.createIndicatorShape(a),
-null!=a.shape.indicatorShape&&(a.shape.indicator=new a.shape.indicatorShape,a.shape.indicator.dialect=a.shape.dialect,a.shape.indicator.init(a.node),b=!0));null!=a.shape&&(this.createControl(a),b||this.isShapeInvalid(a,a.shape))&&(null!=a.absolutePoints?(a.shape.points=a.absolutePoints.slice(),a.shape.bounds=null):(a.shape.points=null,a.shape.bounds=new mxRectangle(a.x,a.y,a.width,a.height)),a.shape.scale=a.view.scale,null==c||c?this.doRedrawShape(a):a.shape.updateBoundingBox(),e=!0);return e};
-mxCellRenderer.prototype.doRedrawShape=function(a){a.shape.redraw()};mxCellRenderer.prototype.isShapeInvalid=function(a,b){return null==b.bounds||b.scale!=a.view.scale||null==a.absolutePoints&&!b.bounds.equals(a)||null!=a.absolutePoints&&!mxUtils.equalPoints(b.points,a.absolutePoints)};
-mxCellRenderer.prototype.destroy=function(a){null!=a.shape&&(null!=a.text&&(a.text.destroy(),a.text=null),null!=a.overlays&&(a.overlays.visit(function(a,c){c.destroy()}),a.overlays=null),null!=a.control&&(a.control.destroy(),a.control=null),a.shape.destroy(),a.shape=null)};
-var mxEdgeStyle={EntityRelation:function(a,b,c,d,e){var f=a.view,g=f.graph;d=mxUtils.getValue(a.style,mxConstants.STYLE_SEGMENT,mxConstants.ENTITY_SEGMENT)*f.scale;var k=a.absolutePoints,l=k[0],m=k[k.length-1],k=!1;if(null!=b){var n=g.getCellGeometry(b.cell);n.relative?k=.5>=n.x:null!=c&&(k=(null!=m?m.x:c.x+c.width)<(null!=l?l.x:b.x))}if(null!=l)b=new mxCellState,b.x=l.x,b.y=l.y;else if(null!=b){var p=mxUtils.getPortConstraints(b,a,!0,mxConstants.DIRECTION_MASK_NONE);p!=mxConstants.DIRECTION_MASK_NONE&&
-p!=mxConstants.DIRECTION_MASK_WEST+mxConstants.DIRECTION_MASK_EAST&&(k=p==mxConstants.DIRECTION_MASK_WEST)}else return;n=!0;null!=c&&(g=g.getCellGeometry(c.cell),g.relative?n=.5>=g.x:null!=b&&(n=(null!=l?l.x:b.x+b.width)<(null!=m?m.x:c.x)));null!=m?(c=new mxCellState,c.x=m.x,c.y=m.y):null!=c&&(p=mxUtils.getPortConstraints(c,a,!1,mxConstants.DIRECTION_MASK_NONE),p!=mxConstants.DIRECTION_MASK_NONE&&p!=mxConstants.DIRECTION_MASK_WEST+mxConstants.DIRECTION_MASK_EAST&&(n=p==mxConstants.DIRECTION_MASK_WEST));
-null!=b&&null!=c&&(a=k?b.x:b.x+b.width,b=f.getRoutingCenterY(b),l=n?c.x:c.x+c.width,c=f.getRoutingCenterY(c),f=new mxPoint(a+(k?-d:d),b),g=new mxPoint(l+(n?-d:d),c),k==n?(d=k?Math.min(a,l)-d:Math.max(a,l)+d,e.push(new mxPoint(d,b)),e.push(new mxPoint(d,c))):(f.x<g.x==k?(d=b+(c-b)/2,e.push(f),e.push(new mxPoint(f.x,d)),e.push(new mxPoint(g.x,d))):e.push(f),e.push(g)))},Loop:function(a,b,c,d,e){c=a.absolutePoints;var f=c[c.length-1];if(null!=c[0]&&null!=f){if(null!=d&&0<d.length)for(b=0;b<d.length;b++)c=
-d[b],c=a.view.transformControlPoint(a,c),e.push(new mxPoint(c.x,c.y))}else if(null!=b){var f=a.view,g=f.graph;c=null!=d&&0<d.length?d[0]:null;null!=c&&(c=f.transformControlPoint(a,c),mxUtils.contains(b,c.x,c.y)&&(c=null));var k=d=0,l=0,m=0,g=mxUtils.getValue(a.style,mxConstants.STYLE_SEGMENT,g.gridSize)*f.scale;a=mxUtils.getValue(a.style,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_WEST);a==mxConstants.DIRECTION_NORTH||a==mxConstants.DIRECTION_SOUTH?(d=f.getRoutingCenterX(b),k=g):(l=f.getRoutingCenterY(b),
-m=g);null==c||c.x<b.x||c.x>b.x+b.width?null!=c?(d=c.x,m=Math.max(Math.abs(l-c.y),m)):a==mxConstants.DIRECTION_NORTH?l=b.y-2*k:a==mxConstants.DIRECTION_SOUTH?l=b.y+b.height+2*k:d=a==mxConstants.DIRECTION_EAST?b.x-2*m:b.x+b.width+2*m:null!=c&&(d=f.getRoutingCenterX(b),k=Math.max(Math.abs(d-c.x),m),l=c.y,m=0);e.push(new mxPoint(d-k,l-m));e.push(new mxPoint(d+k,l+m))}},ElbowConnector:function(a,b,c,d,e){var f=null!=d&&0<d.length?d[0]:null,g=!1,k=!1;if(null!=b&&null!=c)if(null!=f)var l=Math.min(b.x,c.x),
-m=Math.max(b.x+b.width,c.x+c.width),k=Math.min(b.y,c.y),n=Math.max(b.y+b.height,c.y+c.height),f=a.view.transformControlPoint(a,f),g=f.y<k||f.y>n,k=f.x<l||f.x>m;else l=Math.max(b.x,c.x),m=Math.min(b.x+b.width,c.x+c.width),g=l==m,g||(k=Math.max(b.y,c.y),n=Math.min(b.y+b.height,c.y+c.height),k=k==n);k||!g&&a.style[mxConstants.STYLE_ELBOW]!=mxConstants.ELBOW_VERTICAL?mxEdgeStyle.SideToSide(a,b,c,d,e):mxEdgeStyle.TopToBottom(a,b,c,d,e)},SideToSide:function(a,b,c,d,e){var f=a.view;d=null!=d&&0<d.length?
-d[0]:null;var g=a.absolutePoints,k=g[0],g=g[g.length-1];null!=d&&(d=f.transformControlPoint(a,d));null!=k&&(b=new mxCellState,b.x=k.x,b.y=k.y);null!=g&&(c=new mxCellState,c.x=g.x,c.y=g.y);null!=b&&null!=c&&(a=Math.max(b.x,c.x),k=Math.min(b.x+b.width,c.x+c.width),a=null!=d?d.x:Math.round(k+(a-k)/2),k=f.getRoutingCenterY(b),f=f.getRoutingCenterY(c),null!=d&&(d.y>=b.y&&d.y<=b.y+b.height&&(k=d.y),d.y>=c.y&&d.y<=c.y+c.height&&(f=d.y)),mxUtils.contains(c,a,k)||mxUtils.contains(b,a,k)||e.push(new mxPoint(a,
-k)),mxUtils.contains(c,a,f)||mxUtils.contains(b,a,f)||e.push(new mxPoint(a,f)),1==e.length&&(null!=d?mxUtils.contains(c,a,d.y)||mxUtils.contains(b,a,d.y)||e.push(new mxPoint(a,d.y)):(f=Math.max(b.y,c.y),e.push(new mxPoint(a,f+(Math.min(b.y+b.height,c.y+c.height)-f)/2)))))},TopToBottom:function(a,b,c,d,e){var f=a.view;d=null!=d&&0<d.length?d[0]:null;var g=a.absolutePoints,k=g[0],g=g[g.length-1];null!=d&&(d=f.transformControlPoint(a,d));null!=k&&(b=new mxCellState,b.x=k.x,b.y=k.y);null!=g&&(c=new mxCellState,
-c.x=g.x,c.y=g.y);null!=b&&null!=c&&(k=Math.max(b.y,c.y),g=Math.min(b.y+b.height,c.y+c.height),a=f.getRoutingCenterX(b),null!=d&&d.x>=b.x&&d.x<=b.x+b.width&&(a=d.x),k=null!=d?d.y:Math.round(g+(k-g)/2),mxUtils.contains(c,a,k)||mxUtils.contains(b,a,k)||e.push(new mxPoint(a,k)),a=null!=d&&d.x>=c.x&&d.x<=c.x+c.width?d.x:f.getRoutingCenterX(c),mxUtils.contains(c,a,k)||mxUtils.contains(b,a,k)||e.push(new mxPoint(a,k)),1==e.length&&(null!=d&&1==e.length?mxUtils.contains(c,d.x,k)||mxUtils.contains(b,d.x,k)||
-e.push(new mxPoint(d.x,k)):(f=Math.max(b.x,c.x),e.push(new mxPoint(f+(Math.min(b.x+b.width,c.x+c.width)-f)/2,k)))))},SegmentConnector:function(a,b,c,d,e){function f(b){b.x=Math.round(b.x*a.view.scale*10)/10;b.y=Math.round(b.y*a.view.scale*10)/10;if(null==k||1<=Math.abs(k.x-b.x)||Math.abs(k.y-b.y)>=Math.max(1,a.view.scale))e.push(b),k=b;return k}var g=mxEdgeStyle.scalePointArray(a.absolutePoints,a.view.scale);b=mxEdgeStyle.scaleCellState(b,a.view.scale);c=mxEdgeStyle.scaleCellState(c,a.view.scale);
-var k=0<e.length?e[0]:null,l=!0,m=null,n=g[0];null==n&&null!=b?n=new mxPoint(a.view.getRoutingCenterX(b),a.view.getRoutingCenterY(b)):null!=n&&(n=n.clone());var p=g.length-1;if(null!=d&&0<d.length){for(var q=[],r=0;r<d.length;r++){var t=a.view.transformControlPoint(a,d[r],!0);null!=t&&q.push(t)}if(0==q.length)return;null!=n&&null!=q[0]&&(1>Math.abs(q[0].x-n.x)&&(q[0].x=n.x),1>Math.abs(q[0].y-n.y)&&(q[0].y=n.y));t=g[p];null!=t&&null!=q[q.length-1]&&(1>Math.abs(q[q.length-1].x-t.x)&&(q[q.length-1].x=
-t.x),1>Math.abs(q[q.length-1].y-t.y)&&(q[q.length-1].y=t.y));var m=q[0],u=b;d=g[0];var x=!1,y=!1,x=m;null!=d&&(u=null);for(r=0;2>r;r++){var B=null!=d&&d.x==x.x,A=null!=d&&d.y==x.y,z=null!=u&&x.y>=u.y&&x.y<=u.y+u.height,u=null!=u&&x.x>=u.x&&x.x<=u.x+u.width,x=A||null==d&&z,y=B||null==d&&u;if(0!=r||!(x&&y||B&&A)){if(null!=d&&!A&&!B&&(z||u)){l=z?!1:!0;break}if(y||x){l=x;1==r&&(l=0==q.length%2?x:y);break}}u=c;d=g[p];null!=d&&(u=null);x=q[q.length-1];B&&A&&(q=q.slice(1))}l&&(null!=g[0]&&g[0].y!=m.y||null==
-g[0]&&null!=b&&(m.y<b.y||m.y>b.y+b.height))?f(new mxPoint(n.x,m.y)):!l&&(null!=g[0]&&g[0].x!=m.x||null==g[0]&&null!=b&&(m.x<b.x||m.x>b.x+b.width))&&f(new mxPoint(m.x,n.y));l?n.y=m.y:n.x=m.x;for(r=0;r<q.length;r++)l=!l,m=q[r],l?n.y=m.y:n.x=m.x,f(n.clone())}else m=n,l=!0;n=g[p];null==n&&null!=c&&(n=new mxPoint(a.view.getRoutingCenterX(c),a.view.getRoutingCenterY(c)));null!=n&&null!=m&&(l&&(null!=g[p]&&g[p].y!=m.y||null==g[p]&&null!=c&&(m.y<c.y||m.y>c.y+c.height))?f(new mxPoint(n.x,m.y)):!l&&(null!=
-g[p]&&g[p].x!=m.x||null==g[p]&&null!=c&&(m.x<c.x||m.x>c.x+c.width))&&f(new mxPoint(m.x,n.y)));if(null==g[0]&&null!=b)for(;1<e.length&&null!=e[1]&&mxUtils.contains(b,e[1].x,e[1].y);)e.splice(1,1);if(null==g[p]&&null!=c)for(;1<e.length&&null!=e[e.length-1]&&mxUtils.contains(c,e[e.length-1].x,e[e.length-1].y);)e.splice(e.length-1,1);null!=t&&null!=e[e.length-1]&&1>=Math.abs(t.x-e[e.length-1].x)&&1>=Math.abs(t.y-e[e.length-1].y)&&(e.splice(e.length-1,1),null!=e[e.length-1]&&(1>Math.abs(e[e.length-1].x-
-t.x)&&(e[e.length-1].x=t.x),1>Math.abs(e[e.length-1].y-t.y)&&(e[e.length-1].y=t.y)))},orthBuffer:10,orthPointsFallback:!0,dirVectors:[[-1,0],[0,-1],[1,0],[0,1],[-1,0],[0,-1],[1,0]],wayPoints1:[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],routePatterns:[[[513,2308,2081,2562],[513,1090,514,2184,2114,2561],[513,1090,514,2564,2184,2562],[513,2308,2561,1090,514,2568,2308]],[[514,1057,513,2308,2081,2562],[514,2184,2114,2561],[514,2184,2562,1057,513,2564,2184],[514,1057,513,2568,
-2308,2561]],[[1090,514,1057,513,2308,2081,2562],[2114,2561],[1090,2562,1057,513,2564,2184],[1090,514,1057,513,2308,2561,2568]],[[2081,2562],[1057,513,1090,514,2184,2114,2561],[1057,513,1090,514,2184,2562,2564],[1057,2561,1090,514,2568,2308]]],inlineRoutePatterns:[[null,[2114,2568],null,null],[null,[514,2081,2114,2568],null,null],[null,[2114,2561],null,null],[[2081,2562],[1057,2114,2568],[2184,2562],null]],vertexSeperations:[],limits:[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]],LEFT_MASK:32,TOP_MASK:64,
-RIGHT_MASK:128,BOTTOM_MASK:256,LEFT:1,TOP:2,RIGHT:4,BOTTOM:8,SIDE_MASK:480,CENTER_MASK:512,SOURCE_MASK:1024,TARGET_MASK:2048,VERTEX_MASK:3072,getJettySize:function(a,b){var c=mxUtils.getValue(a.style,b?mxConstants.STYLE_SOURCE_JETTY_SIZE:mxConstants.STYLE_TARGET_JETTY_SIZE,mxUtils.getValue(a.style,mxConstants.STYLE_JETTY_SIZE,mxEdgeStyle.orthBuffer));"auto"==c&&(mxUtils.getValue(a.style,b?mxConstants.STYLE_STARTARROW:mxConstants.STYLE_ENDARROW,mxConstants.NONE)!=mxConstants.NONE?(c=mxUtils.getNumber(a.style,
-b?mxConstants.STYLE_STARTSIZE:mxConstants.STYLE_ENDSIZE,mxConstants.DEFAULT_MARKERSIZE),c=Math.max(2,Math.ceil((c+mxEdgeStyle.orthBuffer)/mxEdgeStyle.orthBuffer))*mxEdgeStyle.orthBuffer):c=2*mxEdgeStyle.orthBuffer);return c},scalePointArray:function(a,b){var c=[];if(null!=a)for(var d=0;d<a.length;d++)if(null!=a[d]){var e=new mxPoint(Math.round(a[d].x/b*10)/10,Math.round(a[d].y/b*10)/10);c[d]=e}else c[d]=null;else c=null;return c},scaleCellState:function(a,b){var c;null!=a?(c=a.clone(),c.setRect(Math.round(a.x/
-b*10)/10,Math.round(a.y/b*10)/10,Math.round(a.width/b*10)/10,Math.round(a.height/b*10)/10)):c=null;return c},OrthConnector:function(a,b,c,d,e){var f=a.view.graph,g=null==l?!1:f.getModel().isEdge(l.cell),k=null==m?!1:f.getModel().isEdge(m.cell),f=mxEdgeStyle.scalePointArray(a.absolutePoints,a.view.scale),l=mxEdgeStyle.scaleCellState(b,a.view.scale),m=mxEdgeStyle.scaleCellState(c,a.view.scale),n=f[0],p=f[f.length-1],q=null!=l?l.x:n.x,r=null!=l?l.y:n.y,t=null!=l?l.width:0,u=null!=l?l.height:0,x=null!=
-m?m.x:p.x,y=null!=m?m.y:p.y,B=null!=m?m.width:0,A=null!=m?m.height:0,f=mxEdgeStyle.getJettySize(a,!0),z=mxEdgeStyle.getJettySize(a,!1);null!=l&&m==l&&(f=z=Math.max(f,z));var C=z+f,v=!1;if(null!=n&&null!=p)var v=p.x-n.x,D=p.y-n.y,v=v*v+D*D<C*C;if(v||mxEdgeStyle.orthPointsFallback&&null!=d&&0<d.length||g||k)mxEdgeStyle.SegmentConnector(a,b,c,d,e);else{c=[mxConstants.DIRECTION_MASK_ALL,mxConstants.DIRECTION_MASK_ALL];null!=l&&(c[0]=mxUtils.getPortConstraints(l,a,!0,mxConstants.DIRECTION_MASK_ALL),b=
-mxUtils.getValue(l.style,mxConstants.STYLE_ROTATION,0),0!=b&&(b=mxUtils.getBoundingBox(new mxRectangle(q,r,t,u),b),q=b.x,r=b.y,t=b.width,u=b.height));null!=m&&(c[1]=mxUtils.getPortConstraints(m,a,!1,mxConstants.DIRECTION_MASK_ALL),b=mxUtils.getValue(m.style,mxConstants.STYLE_ROTATION,0),0!=b&&(b=mxUtils.getBoundingBox(new mxRectangle(x,y,B,A),b),x=b.x,y=b.y,B=b.width,A=b.height));b=[0,0];q=[[q,r,t,u],[x,y,B,A]];z=[f,z];for(v=0;2>v;v++)mxEdgeStyle.limits[v][1]=q[v][0]-z[v],mxEdgeStyle.limits[v][2]=
-q[v][1]-z[v],mxEdgeStyle.limits[v][4]=q[v][0]+q[v][2]+z[v],mxEdgeStyle.limits[v][8]=q[v][1]+q[v][3]+z[v];z=q[0][1]+q[0][3]/2;r=q[1][1]+q[1][3]/2;v=q[0][0]+q[0][2]/2-(q[1][0]+q[1][2]/2);D=z-r;z=0;0>v?z=0>D?2:1:0>=D&&(z=3,0==v&&(z=2));r=null;null!=l&&(r=n);l=[[.5,.5],[.5,.5]];for(v=0;2>v;v++)null!=r&&(l[v][0]=(r.x-q[v][0])/q[v][2],1>=Math.abs(r.x-q[v][0])?b[v]=mxConstants.DIRECTION_MASK_WEST:1>=Math.abs(r.x-q[v][0]-q[v][2])&&(b[v]=mxConstants.DIRECTION_MASK_EAST),l[v][1]=(r.y-q[v][1])/q[v][3],1>=Math.abs(r.y-
-q[v][1])?b[v]=mxConstants.DIRECTION_MASK_NORTH:1>=Math.abs(r.y-q[v][1]-q[v][3])&&(b[v]=mxConstants.DIRECTION_MASK_SOUTH)),r=null,null!=m&&(r=p);v=q[0][1]-(q[1][1]+q[1][3]);p=q[0][0]-(q[1][0]+q[1][2]);r=q[1][1]-(q[0][1]+q[0][3]);t=q[1][0]-(q[0][0]+q[0][2]);mxEdgeStyle.vertexSeperations[1]=Math.max(p-C,0);mxEdgeStyle.vertexSeperations[2]=Math.max(v-C,0);mxEdgeStyle.vertexSeperations[4]=Math.max(r-C,0);mxEdgeStyle.vertexSeperations[3]=Math.max(t-C,0);C=[];m=[];n=[];m[0]=p>=t?mxConstants.DIRECTION_MASK_WEST:
-mxConstants.DIRECTION_MASK_EAST;n[0]=v>=r?mxConstants.DIRECTION_MASK_NORTH:mxConstants.DIRECTION_MASK_SOUTH;m[1]=mxUtils.reversePortConstraints(m[0]);n[1]=mxUtils.reversePortConstraints(n[0]);p=p>=t?p:t;r=v>=r?v:r;t=[[0,0],[0,0]];u=!1;for(v=0;2>v;v++)0==b[v]&&(0==(m[v]&c[v])&&(m[v]=mxUtils.reversePortConstraints(m[v])),0==(n[v]&c[v])&&(n[v]=mxUtils.reversePortConstraints(n[v])),t[v][0]=n[v],t[v][1]=m[v]);0<r&&0<p&&(0<(m[0]&c[0])&&0<(n[1]&c[1])?(t[0][0]=m[0],t[0][1]=n[0],t[1][0]=n[1],t[1][1]=m[1],
-u=!0):0<(n[0]&c[0])&&0<(m[1]&c[1])&&(t[0][0]=n[0],t[0][1]=m[0],t[1][0]=m[1],t[1][1]=n[1],u=!0));0<r&&!u&&(t[0][0]=n[0],t[0][1]=m[0],t[1][0]=n[1],t[1][1]=m[1],u=!0);0<p&&!u&&(t[0][0]=m[0],t[0][1]=n[0],t[1][0]=m[1],t[1][1]=n[1]);for(v=0;2>v;v++)0==b[v]&&(0==(t[v][0]&c[v])&&(t[v][0]=t[v][1]),C[v]=t[v][0]&c[v],C[v]|=(t[v][1]&c[v])<<8,C[v]|=(t[1-v][v]&c[v])<<16,C[v]|=(t[1-v][1-v]&c[v])<<24,0==(C[v]&15)&&(C[v]<<=8),0==(C[v]&3840)&&(C[v]=C[v]&15|C[v]>>8),0==(C[v]&983040)&&(C[v]=C[v]&65535|(C[v]&251658240)>>
-8),b[v]=C[v]&15,c[v]==mxConstants.DIRECTION_MASK_WEST||c[v]==mxConstants.DIRECTION_MASK_NORTH||c[v]==mxConstants.DIRECTION_MASK_EAST||c[v]==mxConstants.DIRECTION_MASK_SOUTH)&&(b[v]=c[v]);c=b[0]==mxConstants.DIRECTION_MASK_EAST?3:b[0];C=b[1]==mxConstants.DIRECTION_MASK_EAST?3:b[1];c-=z;C-=z;1>c&&(c+=4);1>C&&(C+=4);c=mxEdgeStyle.routePatterns[c-1][C-1];mxEdgeStyle.wayPoints1[0][0]=q[0][0];mxEdgeStyle.wayPoints1[0][1]=q[0][1];switch(b[0]){case mxConstants.DIRECTION_MASK_WEST:mxEdgeStyle.wayPoints1[0][0]-=
-f;mxEdgeStyle.wayPoints1[0][1]+=l[0][1]*q[0][3];break;case mxConstants.DIRECTION_MASK_SOUTH:mxEdgeStyle.wayPoints1[0][0]+=l[0][0]*q[0][2];mxEdgeStyle.wayPoints1[0][1]+=q[0][3]+f;break;case mxConstants.DIRECTION_MASK_EAST:mxEdgeStyle.wayPoints1[0][0]+=q[0][2]+f;mxEdgeStyle.wayPoints1[0][1]+=l[0][1]*q[0][3];break;case mxConstants.DIRECTION_MASK_NORTH:mxEdgeStyle.wayPoints1[0][0]+=l[0][0]*q[0][2],mxEdgeStyle.wayPoints1[0][1]-=f}f=0;m=C=0<(b[0]&(mxConstants.DIRECTION_MASK_EAST|mxConstants.DIRECTION_MASK_WEST))?
-0:1;for(v=0;v<c.length;v++)n=c[v]&15,u=n==mxConstants.DIRECTION_MASK_EAST?3:n,u+=z,4<u&&(u-=4),p=mxEdgeStyle.dirVectors[u-1],n=0<u%2?0:1,n!=C&&(f++,mxEdgeStyle.wayPoints1[f][0]=mxEdgeStyle.wayPoints1[f-1][0],mxEdgeStyle.wayPoints1[f][1]=mxEdgeStyle.wayPoints1[f-1][1]),x=0<(c[v]&mxEdgeStyle.TARGET_MASK),y=0<(c[v]&mxEdgeStyle.SOURCE_MASK),r=(c[v]&mxEdgeStyle.SIDE_MASK)>>5,r<<=z,15<r&&(r>>=4),t=0<(c[v]&mxEdgeStyle.CENTER_MASK),(y||x)&&9>r?(u=y?0:1,r=t&&0==n?q[u][0]+l[u][0]*q[u][2]:t?q[u][1]+l[u][1]*
-q[u][3]:mxEdgeStyle.limits[u][r],0==n?(r=(r-mxEdgeStyle.wayPoints1[f][0])*p[0],0<r&&(mxEdgeStyle.wayPoints1[f][0]+=p[0]*r)):(r=(r-mxEdgeStyle.wayPoints1[f][1])*p[1],0<r&&(mxEdgeStyle.wayPoints1[f][1]+=p[1]*r))):t&&(mxEdgeStyle.wayPoints1[f][0]+=p[0]*Math.abs(mxEdgeStyle.vertexSeperations[u]/2),mxEdgeStyle.wayPoints1[f][1]+=p[1]*Math.abs(mxEdgeStyle.vertexSeperations[u]/2)),0<f&&mxEdgeStyle.wayPoints1[f][n]==mxEdgeStyle.wayPoints1[f-1][n]?f--:C=n;for(v=0;v<=f&&(v!=f||((0<(b[1]&(mxConstants.DIRECTION_MASK_EAST|
-mxConstants.DIRECTION_MASK_WEST))?0:1)==m?0:1)==(f+1)%2);v++)e.push(new mxPoint(Math.round(mxEdgeStyle.wayPoints1[v][0]*a.view.scale*10)/10,Math.round(mxEdgeStyle.wayPoints1[v][1]*a.view.scale*10)/10));for(a=1;a<e.length;)null==e[a-1]||null==e[a]||e[a-1].x!=e[a].x||e[a-1].y!=e[a].y?a++:e.splice(a,1)}},getRoutePattern:function(a,b,c,d){var e=a[0]==mxConstants.DIRECTION_MASK_EAST?3:a[0];a=a[1]==mxConstants.DIRECTION_MASK_EAST?3:a[1];e-=b;a-=b;1>e&&(e+=4);1>a&&(a+=4);b=routePatterns[e-1][a-1];0!=c&&
-0!=d||null==inlineRoutePatterns[e-1][a-1]||(b=inlineRoutePatterns[e-1][a-1]);return b}},mxStyleRegistry={values:[],putValue:function(a,b){mxStyleRegistry.values[a]=b},getValue:function(a){return mxStyleRegistry.values[a]},getName:function(a){for(var b in mxStyleRegistry.values)if(mxStyleRegistry.values[b]==a)return b;return null}};mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ELBOW,mxEdgeStyle.ElbowConnector);mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ENTITY_RELATION,mxEdgeStyle.EntityRelation);
-mxStyleRegistry.putValue(mxConstants.EDGESTYLE_LOOP,mxEdgeStyle.Loop);mxStyleRegistry.putValue(mxConstants.EDGESTYLE_SIDETOSIDE,mxEdgeStyle.SideToSide);mxStyleRegistry.putValue(mxConstants.EDGESTYLE_TOPTOBOTTOM,mxEdgeStyle.TopToBottom);mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ORTHOGONAL,mxEdgeStyle.OrthConnector);mxStyleRegistry.putValue(mxConstants.EDGESTYLE_SEGMENT,mxEdgeStyle.SegmentConnector);mxStyleRegistry.putValue(mxConstants.PERIMETER_ELLIPSE,mxPerimeter.EllipsePerimeter);
-mxStyleRegistry.putValue(mxConstants.PERIMETER_RECTANGLE,mxPerimeter.RectanglePerimeter);mxStyleRegistry.putValue(mxConstants.PERIMETER_RHOMBUS,mxPerimeter.RhombusPerimeter);mxStyleRegistry.putValue(mxConstants.PERIMETER_TRIANGLE,mxPerimeter.TrianglePerimeter);mxStyleRegistry.putValue(mxConstants.PERIMETER_HEXAGON,mxPerimeter.HexagonPerimeter);function mxGraphView(a){this.graph=a;this.translate=new mxPoint;this.graphBounds=new mxRectangle;this.states=new mxDictionary}mxGraphView.prototype=new mxEventSource;
-mxGraphView.prototype.constructor=mxGraphView;mxGraphView.prototype.EMPTY_POINT=new mxPoint;mxGraphView.prototype.doneResource="none"!=mxClient.language?"done":"";mxGraphView.prototype.updatingDocumentResource="none"!=mxClient.language?"updatingDocument":"";mxGraphView.prototype.allowEval=!1;mxGraphView.prototype.captureDocumentGesture=!0;mxGraphView.prototype.optimizeVmlReflows=!0;mxGraphView.prototype.rendering=!0;mxGraphView.prototype.graph=null;mxGraphView.prototype.currentRoot=null;
-mxGraphView.prototype.graphBounds=null;mxGraphView.prototype.scale=1;mxGraphView.prototype.translate=null;mxGraphView.prototype.states=null;mxGraphView.prototype.updateStyle=!1;mxGraphView.prototype.lastNode=null;mxGraphView.prototype.lastHtmlNode=null;mxGraphView.prototype.lastForegroundNode=null;mxGraphView.prototype.lastForegroundHtmlNode=null;mxGraphView.prototype.getGraphBounds=function(){return this.graphBounds};mxGraphView.prototype.setGraphBounds=function(a){this.graphBounds=a};
-mxGraphView.prototype.getBounds=function(a){var b=null;if(null!=a&&0<a.length)for(var c=this.graph.getModel(),d=0;d<a.length;d++)if(c.isVertex(a[d])||c.isEdge(a[d])){var e=this.getState(a[d]);null!=e&&(null==b?b=mxRectangle.fromRectangle(e):b.add(e))}return b};mxGraphView.prototype.setCurrentRoot=function(a){if(this.currentRoot!=a){var b=new mxCurrentRootChange(this,a);b.execute();var c=new mxUndoableEdit(this,!0);c.add(b);this.fireEvent(new mxEventObject(mxEvent.UNDO,"edit",c));this.graph.sizeDidChange()}return a};
-mxGraphView.prototype.scaleAndTranslate=function(a,b,c){var d=this.scale,e=new mxPoint(this.translate.x,this.translate.y);if(this.scale!=a||this.translate.x!=b||this.translate.y!=c)this.scale=a,this.translate.x=b,this.translate.y=c,this.isEventsEnabled()&&this.viewStateChanged();this.fireEvent(new mxEventObject(mxEvent.SCALE_AND_TRANSLATE,"scale",a,"previousScale",d,"translate",this.translate,"previousTranslate",e))};mxGraphView.prototype.getScale=function(){return this.scale};
-mxGraphView.prototype.setScale=function(a){var b=this.scale;this.scale!=a&&(this.scale=a,this.isEventsEnabled()&&this.viewStateChanged());this.fireEvent(new mxEventObject(mxEvent.SCALE,"scale",a,"previousScale",b))};mxGraphView.prototype.getTranslate=function(){return this.translate};
-mxGraphView.prototype.setTranslate=function(a,b){var c=new mxPoint(this.translate.x,this.translate.y);if(this.translate.x!=a||this.translate.y!=b)this.translate.x=a,this.translate.y=b,this.isEventsEnabled()&&this.viewStateChanged();this.fireEvent(new mxEventObject(mxEvent.TRANSLATE,"translate",this.translate,"previousTranslate",c))};mxGraphView.prototype.viewStateChanged=function(){this.revalidate();this.graph.sizeDidChange()};
-mxGraphView.prototype.refresh=function(){null!=this.currentRoot&&this.clear();this.revalidate()};mxGraphView.prototype.revalidate=function(){this.invalidate();this.validate()};mxGraphView.prototype.clear=function(a,b,c){var d=this.graph.getModel();a=a||d.getRoot();b=null!=b?b:!1;c=null!=c?c:!0;this.removeState(a);if(c&&(b||a!=this.currentRoot)){c=d.getChildCount(a);for(var e=0;e<c;e++)this.clear(d.getChildAt(a,e),b)}else this.invalidate(a)};
-mxGraphView.prototype.invalidate=function(a,b,c){var d=this.graph.getModel();a=a||d.getRoot();b=null!=b?b:!0;c=null!=c?c:!0;var e=this.getState(a);null!=e&&(e.invalid=!0);if(!a.invalidating){a.invalidating=!0;if(b)for(var f=d.getChildCount(a),e=0;e<f;e++){var g=d.getChildAt(a,e);this.invalidate(g,b,c)}if(c)for(f=d.getEdgeCount(a),e=0;e<f;e++)this.invalidate(d.getEdgeAt(a,e),b,c);delete a.invalidating}};
-mxGraphView.prototype.validate=function(a){var b=mxLog.enter("mxGraphView.validate");window.status=mxResources.get(this.updatingDocumentResource)||this.updatingDocumentResource;this.resetValidationState();var c=null;this.optimizeVmlReflows&&null!=this.canvas&&null==this.textDiv&&(8==document.documentMode&&!mxClient.IS_EM||mxClient.IS_QUIRKS)&&(this.placeholder=document.createElement("div"),this.placeholder.style.position="absolute",this.placeholder.style.width=this.canvas.clientWidth+"px",this.placeholder.style.height=
-this.canvas.clientHeight+"px",this.canvas.parentNode.appendChild(this.placeholder),c=this.drawPane.style.display,this.canvas.style.display="none",this.textDiv=document.createElement("div"),this.textDiv.style.position="absolute",this.textDiv.style.whiteSpace="nowrap",this.textDiv.style.visibility="hidden",this.textDiv.style.display=mxClient.IS_QUIRKS?"inline":"inline-block",this.textDiv.style.zoom="1",document.body.appendChild(this.textDiv));a=this.getBoundingBox(this.validateCellState(this.validateCell(a||
-(null!=this.currentRoot?this.currentRoot:this.graph.getModel().getRoot()))));this.setGraphBounds(null!=a?a:this.getEmptyBounds());this.validateBackground();null!=c&&(this.canvas.style.display=c,this.textDiv.parentNode.removeChild(this.textDiv),null!=this.placeholder&&this.placeholder.parentNode.removeChild(this.placeholder),this.textDiv=null);this.resetValidationState();window.status=mxResources.get(this.doneResource)||this.doneResource;mxLog.leave("mxGraphView.validate",b)};
-mxGraphView.prototype.getEmptyBounds=function(){return new mxRectangle(this.translate.x*this.scale,this.translate.y*this.scale)};
-mxGraphView.prototype.getBoundingBox=function(a,b){b=null!=b?b:!0;var c=null;if(null!=a&&(null!=a.shape&&null!=a.shape.boundingBox&&(c=a.shape.boundingBox.clone()),null!=a.text&&null!=a.text.boundingBox&&(null!=c?c.add(a.text.boundingBox):c=a.text.boundingBox.clone()),b))for(var d=this.graph.getModel(),e=d.getChildCount(a.cell),f=0;f<e;f++){var g=this.getBoundingBox(this.getState(d.getChildAt(a.cell,f)));null!=g&&(null==c?c=g:c.add(g))}return c};
-mxGraphView.prototype.createBackgroundPageShape=function(a){return new mxRectangleShape(a,"white","black")};mxGraphView.prototype.validateBackground=function(){this.validateBackgroundImage();this.validateBackgroundPage()};
-mxGraphView.prototype.validateBackgroundImage=function(){var a=this.graph.getBackgroundImage();if(null!=a){if(null==this.backgroundImage||this.backgroundImage.image!=a.src){null!=this.backgroundImage&&this.backgroundImage.destroy();var b=new mxRectangle(0,0,1,1);this.backgroundImage=new mxImageShape(b,a.src);this.backgroundImage.dialect=this.graph.dialect;this.backgroundImage.init(this.backgroundPane);this.backgroundImage.redraw();8!=document.documentMode||mxClient.IS_EM||mxEvent.addGestureListeners(this.backgroundImage.node,
-mxUtils.bind(this,function(a){this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(a))}),mxUtils.bind(this,function(a){this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(a))}),mxUtils.bind(this,function(a){this.graph.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(a))}))}this.redrawBackgroundImage(this.backgroundImage,a)}else null!=this.backgroundImage&&(this.backgroundImage.destroy(),this.backgroundImage=null)};
-mxGraphView.prototype.validateBackgroundPage=function(){if(this.graph.pageVisible){var a=this.getBackgroundPageBounds();null==this.backgroundPageShape?(this.backgroundPageShape=this.createBackgroundPageShape(a),this.backgroundPageShape.scale=this.scale,this.backgroundPageShape.isShadow=!0,this.backgroundPageShape.dialect=this.graph.dialect,this.backgroundPageShape.init(this.backgroundPane),this.backgroundPageShape.redraw(),this.graph.nativeDblClickEnabled&&mxEvent.addListener(this.backgroundPageShape.node,
-"dblclick",mxUtils.bind(this,function(a){this.graph.dblClick(a)})),mxEvent.addGestureListeners(this.backgroundPageShape.node,mxUtils.bind(this,function(a){this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(a))}),mxUtils.bind(this,function(a){null!=this.graph.tooltipHandler&&this.graph.tooltipHandler.isHideOnHover()&&this.graph.tooltipHandler.hide();this.graph.isMouseDown&&!mxEvent.isConsumed(a)&&this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(a))}),mxUtils.bind(this,function(a){this.graph.fireMouseEvent(mxEvent.MOUSE_UP,
-new mxMouseEvent(a))}))):(this.backgroundPageShape.scale=this.scale,this.backgroundPageShape.bounds=a,this.backgroundPageShape.redraw())}else null!=this.backgroundPageShape&&(this.backgroundPageShape.destroy(),this.backgroundPageShape=null)};mxGraphView.prototype.getBackgroundPageBounds=function(){var a=this.graph.pageFormat,b=this.scale*this.graph.pageScale;return new mxRectangle(this.scale*this.translate.x,this.scale*this.translate.y,a.width*b,a.height*b)};
-mxGraphView.prototype.redrawBackgroundImage=function(a,b){a.scale=this.scale;a.bounds.x=this.scale*this.translate.x;a.bounds.y=this.scale*this.translate.y;a.bounds.width=this.scale*b.width;a.bounds.height=this.scale*b.height;a.redraw()};
-mxGraphView.prototype.validateCell=function(a,b){if(null!=a)if(b=(null!=b?b:!0)&&this.graph.isCellVisible(a),null==this.getState(a,b)||b)for(var c=this.graph.getModel(),d=c.getChildCount(a),e=0;e<d;e++)this.validateCell(c.getChildAt(a,e),b&&(!this.isCellCollapsed(a)||a==this.currentRoot));else this.removeState(a);return a};
-mxGraphView.prototype.validateCellState=function(a,b){b=null!=b?b:!0;var c=null;if(null!=a&&(c=this.getState(a),null!=c)){var d=this.graph.getModel();if(c.invalid){c.invalid=!1;if(null==c.style||c.invalidStyle)c.style=this.graph.getCellStyle(c.cell),c.invalidStyle=!1;a!=this.currentRoot&&this.validateCellState(d.getParent(a),!1);c.setVisibleTerminalState(this.validateCellState(this.getVisibleTerminal(a,!0),!1),!0);c.setVisibleTerminalState(this.validateCellState(this.getVisibleTerminal(a,!1),!1),
-!1);this.updateCellState(c);a==this.currentRoot||c.invalid||(this.graph.cellRenderer.redraw(c,!1,this.isRendering()),c.updateCachedBounds())}if(b&&!c.invalid){null!=c.shape&&this.stateValidated(c);for(var e=d.getChildCount(a),f=0;f<e;f++)this.validateCellState(d.getChildAt(a,f))}}return c};
-mxGraphView.prototype.updateCellState=function(a){a.absoluteOffset.x=0;a.absoluteOffset.y=0;a.origin.x=0;a.origin.y=0;a.length=0;if(a.cell!=this.currentRoot){var b=this.graph.getModel(),c=this.getState(b.getParent(a.cell));null!=c&&c.cell!=this.currentRoot&&(a.origin.x+=c.origin.x,a.origin.y+=c.origin.y);var d=this.graph.getChildOffsetForCell(a.cell);null!=d&&(a.origin.x+=d.x,a.origin.y+=d.y);var e=this.graph.getCellGeometry(a.cell);null!=e&&(b.isEdge(a.cell)||(d=null!=e.offset?e.offset:this.EMPTY_POINT,
-e.relative&&null!=c?b.isEdge(c.cell)?(d=this.getPoint(c,e),null!=d&&(a.origin.x+=d.x/this.scale-c.origin.x-this.translate.x,a.origin.y+=d.y/this.scale-c.origin.y-this.translate.y)):(a.origin.x+=e.x*c.unscaledWidth+d.x,a.origin.y+=e.y*c.unscaledHeight+d.y):(a.absoluteOffset.x=this.scale*d.x,a.absoluteOffset.y=this.scale*d.y,a.origin.x+=e.x,a.origin.y+=e.y)),a.x=this.scale*(this.translate.x+a.origin.x),a.y=this.scale*(this.translate.y+a.origin.y),a.width=this.scale*e.width,a.unscaledWidth=e.width,a.height=
-this.scale*e.height,a.unscaledHeight=e.height,b.isVertex(a.cell)&&this.updateVertexState(a,e),b.isEdge(a.cell)&&this.updateEdgeState(a,e))}a.updateCachedBounds()};mxGraphView.prototype.isCellCollapsed=function(a){return this.graph.isCellCollapsed(a)};
-mxGraphView.prototype.updateVertexState=function(a,b){var c=this.graph.getModel(),d=this.getState(c.getParent(a.cell));if(b.relative&&null!=d&&!c.isEdge(d.cell)){var e=mxUtils.toRadians(d.style[mxConstants.STYLE_ROTATION]||"0");if(0!=e){var c=Math.cos(e),e=Math.sin(e),f=new mxPoint(a.getCenterX(),a.getCenterY()),d=new mxPoint(d.getCenterX(),d.getCenterY()),d=mxUtils.getRotatedPoint(f,c,e,d);a.x=d.x-a.width/2;a.y=d.y-a.height/2}}this.updateVertexLabelOffset(a)};
-mxGraphView.prototype.updateEdgeState=function(a,b){var c=a.getVisibleTerminalState(!0),d=a.getVisibleTerminalState(!1);null!=this.graph.model.getTerminal(a.cell,!0)&&null==c||null==c&&null==b.getTerminalPoint(!0)||null!=this.graph.model.getTerminal(a.cell,!1)&&null==d||null==d&&null==b.getTerminalPoint(!1)?this.clear(a.cell,!0):(this.updateFixedTerminalPoints(a,c,d),this.updatePoints(a,b.points,c,d),this.updateFloatingTerminalPoints(a,c,d),c=a.absolutePoints,a.cell!=this.currentRoot&&(null==c||2>
-c.length||null==c[0]||null==c[c.length-1])?this.clear(a.cell,!0):(this.updateEdgeBounds(a),this.updateEdgeLabelOffset(a)))};
-mxGraphView.prototype.updateVertexLabelOffset=function(a){var b=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER);if(b==mxConstants.ALIGN_LEFT)b=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_WIDTH,null),b=null!=b?b*this.scale:a.width,a.absoluteOffset.x-=b;else if(b==mxConstants.ALIGN_RIGHT)a.absoluteOffset.x+=a.width;else if(b==mxConstants.ALIGN_CENTER&&(b=mxUtils.getValue(a.style,mxConstants.STYLE_LABEL_WIDTH,null),null!=b)){var c=mxUtils.getValue(a.style,mxConstants.STYLE_ALIGN,
-mxConstants.ALIGN_CENTER),d=0;c==mxConstants.ALIGN_CENTER?d=.5:c==mxConstants.ALIGN_RIGHT&&(d=1);0!=d&&(a.absoluteOffset.x-=(b*this.scale-a.width)*d)}b=mxUtils.getValue(a.style,mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE);b==mxConstants.ALIGN_TOP?a.absoluteOffset.y-=a.height:b==mxConstants.ALIGN_BOTTOM&&(a.absoluteOffset.y+=a.height)};mxGraphView.prototype.resetValidationState=function(){this.lastForegroundHtmlNode=this.lastForegroundNode=this.lastHtmlNode=this.lastNode=null};
-mxGraphView.prototype.stateValidated=function(a){var b=this.graph.getModel().isEdge(a.cell)&&this.graph.keepEdgesInForeground||this.graph.getModel().isVertex(a.cell)&&this.graph.keepEdgesInBackground;a=this.graph.cellRenderer.insertStateAfter(a,b?this.lastForegroundNode||this.lastNode:this.lastNode,b?this.lastForegroundHtmlNode||this.lastHtmlNode:this.lastHtmlNode);b?(this.lastForegroundHtmlNode=a[1],this.lastForegroundNode=a[0]):(this.lastHtmlNode=a[1],this.lastNode=a[0])};
-mxGraphView.prototype.updateFixedTerminalPoints=function(a,b,c){this.updateFixedTerminalPoint(a,b,!0,this.graph.getConnectionConstraint(a,b,!0));this.updateFixedTerminalPoint(a,c,!1,this.graph.getConnectionConstraint(a,c,!1))};mxGraphView.prototype.updateFixedTerminalPoint=function(a,b,c,d){a.setAbsoluteTerminalPoint(this.getFixedTerminalPoint(a,b,c,d),c)};
-mxGraphView.prototype.getFixedTerminalPoint=function(a,b,c,d){var e=null;null!=d&&(e=this.graph.getConnectionPoint(b,d,!1));if(null==e&&null==b){b=this.scale;d=this.translate;var f=a.origin,e=this.graph.getCellGeometry(a.cell).getTerminalPoint(c);null!=e&&(e=new mxPoint(b*(d.x+e.x+f.x),b*(d.y+e.y+f.y)))}return e};
-mxGraphView.prototype.updateBoundsFromStencil=function(a){var b=null;if(null!=a&&null!=a.shape&&null!=a.shape.stencil&&"fixed"==a.shape.stencil.aspect){var b=mxRectangle.fromRectangle(a),c=a.shape.stencil.computeAspect(a.style,a.x,a.y,a.width,a.height);a.setRect(c.x,c.y,a.shape.stencil.w0*c.width,a.shape.stencil.h0*c.height)}return b};
-mxGraphView.prototype.updatePoints=function(a,b,c,d){if(null!=a){var e=[];e.push(a.absolutePoints[0]);var f=this.getEdgeStyle(a,b,c,d);if(null!=f){c=this.getTerminalPort(a,c,!0);d=this.getTerminalPort(a,d,!1);var g=this.updateBoundsFromStencil(c),k=this.updateBoundsFromStencil(d);f(a,c,d,b,e);null!=g&&c.setRect(g.x,g.y,g.width,g.height);null!=k&&d.setRect(k.x,k.y,k.width,k.height)}else if(null!=b)for(f=0;f<b.length;f++)null!=b[f]&&(c=mxUtils.clone(b[f]),e.push(this.transformControlPoint(a,c)));b=
-a.absolutePoints;e.push(b[b.length-1]);a.absolutePoints=e}};mxGraphView.prototype.transformControlPoint=function(a,b,c){return null!=a&&null!=b?(a=a.origin,c=c?1:this.scale,new mxPoint(c*(b.x+this.translate.x+a.x),c*(b.y+this.translate.y+a.y))):null};
-mxGraphView.prototype.isLoopStyleEnabled=function(a,b,c,d){var e=this.graph.getConnectionConstraint(a,c,!0),f=this.graph.getConnectionConstraint(a,d,!1);return!(null==b||2>b.length)||mxUtils.getValue(a.style,mxConstants.STYLE_ORTHOGONAL_LOOP,!1)&&(null!=e&&null!=e.point||null!=f&&null!=f.point)?!1:null!=c&&c==d};
-mxGraphView.prototype.getEdgeStyle=function(a,b,c,d){a=this.isLoopStyleEnabled(a,b,c,d)?mxUtils.getValue(a.style,mxConstants.STYLE_LOOP,this.graph.defaultLoopStyle):mxUtils.getValue(a.style,mxConstants.STYLE_NOEDGESTYLE,!1)?null:a.style[mxConstants.STYLE_EDGE];"string"==typeof a&&(b=mxStyleRegistry.getValue(a),null==b&&this.isAllowEval()&&(b=mxUtils.eval(a)),a=b);return"function"==typeof a?a:null};
-mxGraphView.prototype.updateFloatingTerminalPoints=function(a,b,c){var d=a.absolutePoints,e=d[0];null==d[d.length-1]&&null!=c&&this.updateFloatingTerminalPoint(a,c,b,!1);null==e&&null!=b&&this.updateFloatingTerminalPoint(a,b,c,!0)};mxGraphView.prototype.updateFloatingTerminalPoint=function(a,b,c,d){a.setAbsoluteTerminalPoint(this.getFloatingTerminalPoint(a,b,c,d),d)};
-mxGraphView.prototype.getFloatingTerminalPoint=function(a,b,c,d){b=this.getTerminalPort(a,b,d);var e=this.getNextPoint(a,c,d),f=this.graph.isOrthogonal(a);c=mxUtils.toRadians(Number(b.style[mxConstants.STYLE_ROTATION]||"0"));var g=new mxPoint(b.getCenterX(),b.getCenterY());if(0!=c)var k=Math.cos(-c),l=Math.sin(-c),e=mxUtils.getRotatedPoint(e,k,l,g);k=parseFloat(a.style[mxConstants.STYLE_PERIMETER_SPACING]||0);k+=parseFloat(a.style[d?mxConstants.STYLE_SOURCE_PERIMETER_SPACING:mxConstants.STYLE_TARGET_PERIMETER_SPACING]||
-0);a=this.getPerimeterPoint(b,e,0==c&&f,k);0!=c&&(k=Math.cos(c),l=Math.sin(c),a=mxUtils.getRotatedPoint(a,k,l,g));return a};mxGraphView.prototype.getTerminalPort=function(a,b,c){a=mxUtils.getValue(a.style,c?mxConstants.STYLE_SOURCE_PORT:mxConstants.STYLE_TARGET_PORT);null!=a&&(a=this.getState(this.graph.getModel().getCell(a)),null!=a&&(b=a));return b};
-mxGraphView.prototype.getPerimeterPoint=function(a,b,c,d){var e=null;if(null!=a){var f=this.getPerimeterFunction(a);if(null!=f&&null!=b&&(d=this.getPerimeterBounds(a,d),0<d.width||0<d.height)){var e=new mxPoint(b.x,b.y),g=b=!1;this.graph.model.isVertex(a.cell)&&(b=1==mxUtils.getValue(a.style,mxConstants.STYLE_FLIPH,0),g=1==mxUtils.getValue(a.style,mxConstants.STYLE_FLIPV,0),null!=a.shape&&null!=a.shape.stencil&&(b=1==mxUtils.getValue(a.style,"stencilFlipH",0)||b,g=1==mxUtils.getValue(a.style,"stencilFlipV",
-0)||g),b&&(e.x=2*d.getCenterX()-e.x),g&&(e.y=2*d.getCenterY()-e.y));e=f(d,a,e,c);null!=e&&(b&&(e.x=2*d.getCenterX()-e.x),g&&(e.y=2*d.getCenterY()-e.y))}null==e&&(e=this.getPoint(a))}return e};mxGraphView.prototype.getRoutingCenterX=function(a){var b=null!=a.style?parseFloat(a.style[mxConstants.STYLE_ROUTING_CENTER_X])||0:0;return a.getCenterX()+b*a.width};
-mxGraphView.prototype.getRoutingCenterY=function(a){var b=null!=a.style?parseFloat(a.style[mxConstants.STYLE_ROUTING_CENTER_Y])||0:0;return a.getCenterY()+b*a.height};mxGraphView.prototype.getPerimeterBounds=function(a,b){b=null!=b?b:0;null!=a&&(b+=parseFloat(a.style[mxConstants.STYLE_PERIMETER_SPACING]||0));return a.getPerimeterBounds(b*this.scale)};
-mxGraphView.prototype.getPerimeterFunction=function(a){a=a.style[mxConstants.STYLE_PERIMETER];if("string"==typeof a){var b=mxStyleRegistry.getValue(a);null==b&&this.isAllowEval()&&(b=mxUtils.eval(a));a=b}return"function"==typeof a?a:null};mxGraphView.prototype.getNextPoint=function(a,b,c){a=a.absolutePoints;var d=null;null!=a&&2<=a.length&&(d=a.length,d=a[c?Math.min(1,d-1):Math.max(0,d-2)]);null==d&&null!=b&&(d=new mxPoint(b.getCenterX(),b.getCenterY()));return d};
-mxGraphView.prototype.getVisibleTerminal=function(a,b){for(var c=this.graph.getModel(),d=c.getTerminal(a,b),e=d;null!=d&&d!=this.currentRoot;){if(!this.graph.isCellVisible(e)||this.isCellCollapsed(d))e=d;d=c.getParent(d)}null==e||c.contains(e)&&c.getParent(e)!=c.getRoot()&&e!=this.currentRoot||(e=null);return e};
-mxGraphView.prototype.updateEdgeBounds=function(a){var b=a.absolutePoints,c=b[0],d=b[b.length-1];if(c.x!=d.x||c.y!=d.y){var e=d.x-c.x,f=d.y-c.y;a.terminalDistance=Math.sqrt(e*e+f*f)}else a.terminalDistance=0;var d=0,g=[],f=c;if(null!=f){for(var c=f.x,k=f.y,l=c,m=k,n=1;n<b.length;n++){var p=b[n];null!=p&&(e=f.x-p.x,f=f.y-p.y,e=Math.sqrt(e*e+f*f),g.push(e),d+=e,f=p,c=Math.min(f.x,c),k=Math.min(f.y,k),l=Math.max(f.x,l),m=Math.max(f.y,m))}a.length=d;a.segments=g;a.x=c;a.y=k;a.width=Math.max(1,l-c);a.height=
-Math.max(1,m-k)}};
-mxGraphView.prototype.getPoint=function(a,b){var c=a.getCenterX(),d=a.getCenterY();if(null==a.segments||null!=b&&!b.relative)null!=b&&(m=b.offset,null!=m&&(c+=m.x,d+=m.y));else{for(var e=a.absolutePoints.length,f=Math.round(((null!=b?b.x/2:0)+.5)*a.length),g=a.segments[0],k=0,l=1;f>=Math.round(k+g)&&l<e-1;)k+=g,g=a.segments[l++];e=0==g?0:(f-k)/g;f=a.absolutePoints[l-1];l=a.absolutePoints[l];if(null!=f&&null!=l){k=c=d=0;if(null!=b){var d=b.y,m=b.offset;null!=m&&(c=m.x,k=m.y)}m=l.x-f.x;l=l.y-f.y;c=
-f.x+m*e+((0==g?0:l/g)*d+c)*this.scale;d=f.y+l*e-((0==g?0:m/g)*d-k)*this.scale}}return new mxPoint(c,d)};
-mxGraphView.prototype.getRelativePoint=function(a,b,c){var d=this.graph.getModel().getGeometry(a.cell);if(null!=d){var e=a.absolutePoints.length;if(d.relative&&1<e){for(var d=a.length,f=a.segments,g=a.absolutePoints[0],k=a.absolutePoints[1],l=mxUtils.ptSegDistSq(g.x,g.y,k.x,k.y,b,c),m=0,n=0,p=0,q=2;q<e;q++)g=k,k=a.absolutePoints[q],g=mxUtils.ptSegDistSq(g.x,g.y,k.x,k.y,b,c),p+=f[q-2],g<=l&&(l=g,n=q-1,m=p);e=f[n];g=a.absolutePoints[n];k=a.absolutePoints[n+1];l=k.x;f=k.y;a=g.x-l;n=g.y-f;l=a-(b-l);f=
-n-(c-f);f=l*a+f*n;a=Math.sqrt(0>=f?0:f*f/(a*a+n*n));a>e&&(a=e);e=Math.sqrt(mxUtils.ptSegDistSq(g.x,g.y,k.x,k.y,b,c));-1==mxUtils.relativeCcw(g.x,g.y,k.x,k.y,b,c)&&(e=-e);return new mxPoint((d/2-m-a)/d*-2,e/this.scale)}}return new mxPoint};
-mxGraphView.prototype.updateEdgeLabelOffset=function(a){var b=a.absolutePoints;a.absoluteOffset.x=a.getCenterX();a.absoluteOffset.y=a.getCenterY();if(null!=b&&0<b.length&&null!=a.segments){var c=this.graph.getCellGeometry(a.cell);if(c.relative){var d=this.getPoint(a,c);null!=d&&(a.absoluteOffset=d)}else{var d=b[0],e=b[b.length-1];if(null!=d&&null!=e){var b=e.x-d.x,f=e.y-d.y,g=e=0,c=c.offset;null!=c&&(e=c.x,g=c.y);c=d.y+f/2+g*this.scale;a.absoluteOffset.x=d.x+b/2+e*this.scale;a.absoluteOffset.y=c}}}};
-mxGraphView.prototype.getState=function(a,b){b=b||!1;var c=null;null!=a&&(c=this.states.get(a),b&&(null==c||this.updateStyle)&&this.graph.isCellVisible(a)&&(null==c?(c=this.createState(a),this.states.put(a,c)):c.style=this.graph.getCellStyle(a)));return c};mxGraphView.prototype.isRendering=function(){return this.rendering};mxGraphView.prototype.setRendering=function(a){this.rendering=a};mxGraphView.prototype.isAllowEval=function(){return this.allowEval};
-mxGraphView.prototype.setAllowEval=function(a){this.allowEval=a};mxGraphView.prototype.getStates=function(){return this.states};mxGraphView.prototype.setStates=function(a){this.states=a};mxGraphView.prototype.getCellStates=function(a){if(null==a)return this.states;for(var b=[],c=0;c<a.length;c++){var d=this.getState(a[c]);null!=d&&b.push(d)}return b};
-mxGraphView.prototype.removeState=function(a){var b=null;null!=a&&(b=this.states.remove(a),null!=b&&(this.graph.cellRenderer.destroy(b),b.invalid=!0,b.destroy()));return b};mxGraphView.prototype.createState=function(a){return new mxCellState(this,a,this.graph.getCellStyle(a))};mxGraphView.prototype.getCanvas=function(){return this.canvas};mxGraphView.prototype.getBackgroundPane=function(){return this.backgroundPane};mxGraphView.prototype.getDrawPane=function(){return this.drawPane};
-mxGraphView.prototype.getOverlayPane=function(){return this.overlayPane};mxGraphView.prototype.getDecoratorPane=function(){return this.decoratorPane};mxGraphView.prototype.isContainerEvent=function(a){a=mxEvent.getSource(a);return a==this.graph.container||a.parentNode==this.backgroundPane||null!=a.parentNode&&a.parentNode.parentNode==this.backgroundPane||a==this.canvas.parentNode||a==this.canvas||a==this.backgroundPane||a==this.drawPane||a==this.overlayPane||a==this.decoratorPane};
-mxGraphView.prototype.isScrollEvent=function(a){var b=mxUtils.getOffset(this.graph.container);a=new mxPoint(a.clientX-b.x,a.clientY-b.y);var b=this.graph.container.offsetWidth,c=this.graph.container.clientWidth;if(b>c&&a.x>c+2&&a.x<=b)return!0;b=this.graph.container.offsetHeight;c=this.graph.container.clientHeight;return b>c&&a.y>c+2&&a.y<=b?!0:!1};
-mxGraphView.prototype.init=function(){this.installListeners();var a=this.graph;a.dialect==mxConstants.DIALECT_SVG?this.createSvg():a.dialect==mxConstants.DIALECT_VML?this.createVml():this.createHtml()};
-mxGraphView.prototype.installListeners=function(){var a=this.graph,b=a.container;if(null!=b){mxClient.IS_TOUCH&&(mxEvent.addListener(b,"gesturestart",mxUtils.bind(this,function(b){a.fireGestureEvent(b);mxEvent.consume(b)})),mxEvent.addListener(b,"gesturechange",mxUtils.bind(this,function(b){a.fireGestureEvent(b);mxEvent.consume(b)})),mxEvent.addListener(b,"gestureend",mxUtils.bind(this,function(b){a.fireGestureEvent(b);mxEvent.consume(b)})));var c=null;mxEvent.addGestureListeners(b,mxUtils.bind(this,
-function(b){!this.isContainerEvent(b)||(mxClient.IS_IE||mxClient.IS_IE11||mxClient.IS_GC||mxClient.IS_OP||mxClient.IS_SF)&&this.isScrollEvent(b)||(a.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(b)),c=b.pointerId)}),mxUtils.bind(this,function(b){!this.isContainerEvent(b)||null!=c&&b.pointerId!=c||a.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(b))}),mxUtils.bind(this,function(b){this.isContainerEvent(b)&&a.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(b));c=null}));mxEvent.addListener(b,
-"dblclick",mxUtils.bind(this,function(b){this.isContainerEvent(b)&&a.dblClick(b)}));var d=function(c){var d=null;mxClient.IS_TOUCH&&(d=mxEvent.getClientX(c),c=mxEvent.getClientY(c),c=mxUtils.convertPoint(b,d,c),d=a.view.getState(a.getCellAt(c.x,c.y)));return d};a.addMouseListener({mouseDown:function(b,c){a.popupMenuHandler.hideMenu()},mouseMove:function(){},mouseUp:function(){}});this.moveHandler=mxUtils.bind(this,function(b){null!=a.tooltipHandler&&a.tooltipHandler.isHideOnHover()&&a.tooltipHandler.hide();
-this.captureDocumentGesture&&a.isMouseDown&&null!=a.container&&!this.isContainerEvent(b)&&"none"!=a.container.style.display&&"hidden"!=a.container.style.visibility&&!mxEvent.isConsumed(b)&&a.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(b,d(b)))});this.endHandler=mxUtils.bind(this,function(b){this.captureDocumentGesture&&a.isMouseDown&&null!=a.container&&!this.isContainerEvent(b)&&"none"!=a.container.style.display&&"hidden"!=a.container.style.visibility&&a.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(b))});
-mxEvent.addGestureListeners(document,null,this.moveHandler,this.endHandler)}};
-mxGraphView.prototype.createHtml=function(){var a=this.graph.container;null!=a&&(this.canvas=this.createHtmlPane("100%","100%"),this.canvas.style.overflow="hidden",this.backgroundPane=this.createHtmlPane("1px","1px"),this.drawPane=this.createHtmlPane("1px","1px"),this.overlayPane=this.createHtmlPane("1px","1px"),this.decoratorPane=this.createHtmlPane("1px","1px"),this.canvas.appendChild(this.backgroundPane),this.canvas.appendChild(this.drawPane),this.canvas.appendChild(this.overlayPane),this.canvas.appendChild(this.decoratorPane),
-a.appendChild(this.canvas),this.updateContainerStyle(a),mxClient.IS_QUIRKS&&(a=mxUtils.bind(this,function(a){a=this.getGraphBounds();this.updateHtmlCanvasSize(a.x+a.width+this.graph.border,a.y+a.height+this.graph.border)}),mxEvent.addListener(window,"resize",a)))};
-mxGraphView.prototype.updateHtmlCanvasSize=function(a,b){if(null!=this.graph.container){var c=this.graph.container.offsetHeight;this.canvas.style.width=this.graph.container.offsetWidth<a?a+"px":"100%";this.canvas.style.height=c<b?b+"px":"100%"}};mxGraphView.prototype.createHtmlPane=function(a,b){var c=document.createElement("DIV");null!=a&&null!=b?(c.style.position="absolute",c.style.left="0px",c.style.top="0px",c.style.width=a,c.style.height=b):c.style.position="relative";return c};
-mxGraphView.prototype.createVml=function(){var a=this.graph.container;if(null!=a){var b=a.offsetWidth,c=a.offsetHeight;this.canvas=this.createVmlPane(b,c);this.canvas.style.overflow="hidden";this.backgroundPane=this.createVmlPane(b,c);this.drawPane=this.createVmlPane(b,c);this.overlayPane=this.createVmlPane(b,c);this.decoratorPane=this.createVmlPane(b,c);this.canvas.appendChild(this.backgroundPane);this.canvas.appendChild(this.drawPane);this.canvas.appendChild(this.overlayPane);this.canvas.appendChild(this.decoratorPane);
-a.appendChild(this.canvas)}};mxGraphView.prototype.createVmlPane=function(a,b){var c=document.createElement(mxClient.VML_PREFIX+":group");c.style.position="absolute";c.style.left="0px";c.style.top="0px";c.style.width=a+"px";c.style.height=b+"px";c.setAttribute("coordsize",a+","+b);c.setAttribute("coordorigin","0,0");return c};
-mxGraphView.prototype.createSvg=function(){var a=this.graph.container;this.canvas=document.createElementNS(mxConstants.NS_SVG,"g");this.backgroundPane=document.createElementNS(mxConstants.NS_SVG,"g");this.canvas.appendChild(this.backgroundPane);this.drawPane=document.createElementNS(mxConstants.NS_SVG,"g");this.canvas.appendChild(this.drawPane);this.overlayPane=document.createElementNS(mxConstants.NS_SVG,"g");this.canvas.appendChild(this.overlayPane);this.decoratorPane=document.createElementNS(mxConstants.NS_SVG,
-"g");this.canvas.appendChild(this.decoratorPane);var b=document.createElementNS(mxConstants.NS_SVG,"svg");b.style.left="0px";b.style.top="0px";b.style.width="100%";b.style.height="100%";b.style.display="block";b.appendChild(this.canvas);if(mxClient.IS_IE||mxClient.IS_IE11)b.style.overflow="hidden";null!=a&&(a.appendChild(b),this.updateContainerStyle(a))};
-mxGraphView.prototype.updateContainerStyle=function(a){var b=mxUtils.getCurrentStyle(a);null!=b&&"static"==b.position&&(a.style.position="relative");mxClient.IS_POINTER&&(a.style.touchAction="none")};
-mxGraphView.prototype.destroy=function(){var a=null!=this.canvas?this.canvas.ownerSVGElement:null;null==a&&(a=this.canvas);null!=a&&null!=a.parentNode&&(this.clear(this.currentRoot,!0),mxEvent.removeGestureListeners(document,null,this.moveHandler,this.endHandler),mxEvent.release(this.graph.container),a.parentNode.removeChild(a),this.decoratorPane=this.overlayPane=this.drawPane=this.backgroundPane=this.canvas=this.endHandler=this.moveHandler=null)};
-function mxCurrentRootChange(a,b){this.view=a;this.previous=this.root=b;this.isUp=null==b;if(!this.isUp)for(var c=this.view.currentRoot,d=this.view.graph.getModel();null!=c;){if(c==b){this.isUp=!0;break}c=d.getParent(c)}}
-mxCurrentRootChange.prototype.execute=function(){var a=this.view.currentRoot;this.view.currentRoot=this.previous;this.previous=a;a=this.view.graph.getTranslateForRoot(this.view.currentRoot);null!=a&&(this.view.translate=new mxPoint(-a.x,-a.y));this.isUp?(this.view.clear(this.view.currentRoot,!0),this.view.validate()):this.view.refresh();this.view.fireEvent(new mxEventObject(this.isUp?mxEvent.UP:mxEvent.DOWN,"root",this.view.currentRoot,"previous",this.previous));this.isUp=!this.isUp};
-function mxGraph(a,b,c,d){this.mouseListeners=null;this.renderHint=c;this.dialect=mxClient.IS_SVG?mxConstants.DIALECT_SVG:c==mxConstants.RENDERING_HINT_EXACT&&mxClient.IS_VML?mxConstants.DIALECT_VML:c==mxConstants.RENDERING_HINT_FASTEST?mxConstants.DIALECT_STRICTHTML:c==mxConstants.RENDERING_HINT_FASTER?mxConstants.DIALECT_PREFERHTML:mxConstants.DIALECT_MIXEDHTML;this.model=null!=b?b:new mxGraphModel;this.multiplicities=[];this.imageBundles=[];this.cellRenderer=this.createCellRenderer();this.setSelectionModel(this.createSelectionModel());
-this.setStylesheet(null!=d?d:this.createStylesheet());this.view=this.createGraphView();this.graphModelChangeListener=mxUtils.bind(this,function(a,b){this.graphModelChanged(b.getProperty("edit").changes)});this.model.addListener(mxEvent.CHANGE,this.graphModelChangeListener);this.createHandlers();null!=a&&this.init(a);this.view.revalidate()}mxLoadResources?mxResources.add(mxClient.basePath+"/resources/graph"):mxClient.defaultBundles.push(mxClient.basePath+"/resources/graph");mxGraph.prototype=new mxEventSource;
-mxGraph.prototype.constructor=mxGraph;mxGraph.prototype.mouseListeners=null;mxGraph.prototype.isMouseDown=!1;mxGraph.prototype.model=null;mxGraph.prototype.view=null;mxGraph.prototype.stylesheet=null;mxGraph.prototype.selectionModel=null;mxGraph.prototype.cellEditor=null;mxGraph.prototype.cellRenderer=null;mxGraph.prototype.multiplicities=null;mxGraph.prototype.renderHint=null;mxGraph.prototype.dialect=null;mxGraph.prototype.gridSize=10;mxGraph.prototype.gridEnabled=!0;
-mxGraph.prototype.portsEnabled=!0;mxGraph.prototype.nativeDblClickEnabled=!0;mxGraph.prototype.doubleTapEnabled=!0;mxGraph.prototype.doubleTapTimeout=500;mxGraph.prototype.doubleTapTolerance=25;mxGraph.prototype.lastTouchY=0;mxGraph.prototype.lastTouchY=0;mxGraph.prototype.lastTouchTime=0;mxGraph.prototype.tapAndHoldEnabled=!0;mxGraph.prototype.tapAndHoldDelay=500;mxGraph.prototype.tapAndHoldInProgress=!1;mxGraph.prototype.tapAndHoldValid=!1;mxGraph.prototype.initialTouchX=0;
-mxGraph.prototype.initialTouchY=0;mxGraph.prototype.tolerance=4;mxGraph.prototype.defaultOverlap=.5;mxGraph.prototype.defaultParent=null;mxGraph.prototype.alternateEdgeStyle=null;mxGraph.prototype.backgroundImage=null;mxGraph.prototype.pageVisible=!1;mxGraph.prototype.pageBreaksVisible=!1;mxGraph.prototype.pageBreakColor="gray";mxGraph.prototype.pageBreakDashed=!0;mxGraph.prototype.minPageBreakDist=20;mxGraph.prototype.preferPageSize=!1;mxGraph.prototype.pageFormat=mxConstants.PAGE_FORMAT_A4_PORTRAIT;
-mxGraph.prototype.pageScale=1.5;mxGraph.prototype.enabled=!0;mxGraph.prototype.escapeEnabled=!0;mxGraph.prototype.invokesStopCellEditing=!0;mxGraph.prototype.enterStopsCellEditing=!1;mxGraph.prototype.useScrollbarsForPanning=!0;mxGraph.prototype.exportEnabled=!0;mxGraph.prototype.importEnabled=!0;mxGraph.prototype.cellsLocked=!1;mxGraph.prototype.cellsCloneable=!0;mxGraph.prototype.foldingEnabled=!0;mxGraph.prototype.cellsEditable=!0;mxGraph.prototype.cellsDeletable=!0;
-mxGraph.prototype.cellsMovable=!0;mxGraph.prototype.edgeLabelsMovable=!0;mxGraph.prototype.vertexLabelsMovable=!1;mxGraph.prototype.dropEnabled=!1;mxGraph.prototype.splitEnabled=!0;mxGraph.prototype.cellsResizable=!0;mxGraph.prototype.cellsBendable=!0;mxGraph.prototype.cellsSelectable=!0;mxGraph.prototype.cellsDisconnectable=!0;mxGraph.prototype.autoSizeCells=!1;mxGraph.prototype.autoSizeCellsOnAdd=!1;mxGraph.prototype.autoScroll=!0;mxGraph.prototype.ignoreScrollbars=!1;
-mxGraph.prototype.translateToScrollPosition=!1;mxGraph.prototype.timerAutoScroll=!1;mxGraph.prototype.allowAutoPanning=!1;mxGraph.prototype.autoExtend=!0;mxGraph.prototype.maximumGraphBounds=null;mxGraph.prototype.minimumGraphSize=null;mxGraph.prototype.minimumContainerSize=null;mxGraph.prototype.maximumContainerSize=null;mxGraph.prototype.resizeContainer=!1;mxGraph.prototype.border=0;mxGraph.prototype.keepEdgesInForeground=!1;mxGraph.prototype.keepEdgesInBackground=!1;
-mxGraph.prototype.allowNegativeCoordinates=!0;mxGraph.prototype.constrainChildren=!0;mxGraph.prototype.constrainRelativeChildren=!1;mxGraph.prototype.extendParents=!0;mxGraph.prototype.extendParentsOnAdd=!0;mxGraph.prototype.extendParentsOnMove=!1;mxGraph.prototype.recursiveResize=!1;mxGraph.prototype.collapseToPreferredSize=!0;mxGraph.prototype.zoomFactor=1.2;mxGraph.prototype.keepSelectionVisibleOnZoom=!1;mxGraph.prototype.centerZoom=!0;mxGraph.prototype.resetViewOnRootChange=!0;
-mxGraph.prototype.resetEdgesOnResize=!1;mxGraph.prototype.resetEdgesOnMove=!1;mxGraph.prototype.resetEdgesOnConnect=!0;mxGraph.prototype.allowLoops=!1;mxGraph.prototype.defaultLoopStyle=mxEdgeStyle.Loop;mxGraph.prototype.multigraph=!0;mxGraph.prototype.connectableEdges=!1;mxGraph.prototype.allowDanglingEdges=!0;mxGraph.prototype.cloneInvalidEdges=!1;mxGraph.prototype.disconnectOnMove=!0;mxGraph.prototype.labelsVisible=!0;mxGraph.prototype.htmlLabels=!1;mxGraph.prototype.swimlaneSelectionEnabled=!0;
-mxGraph.prototype.swimlaneNesting=!0;mxGraph.prototype.swimlaneIndicatorColorAttribute=mxConstants.STYLE_FILLCOLOR;mxGraph.prototype.imageBundles=null;mxGraph.prototype.minFitScale=.1;mxGraph.prototype.maxFitScale=8;mxGraph.prototype.panDx=0;mxGraph.prototype.panDy=0;mxGraph.prototype.collapsedImage=new mxImage(mxClient.imageBasePath+"/collapsed.gif",9,9);mxGraph.prototype.expandedImage=new mxImage(mxClient.imageBasePath+"/expanded.gif",9,9);
-mxGraph.prototype.warningImage=new mxImage(mxClient.imageBasePath+"/warning"+(mxClient.IS_MAC?".png":".gif"),16,16);mxGraph.prototype.alreadyConnectedResource="none"!=mxClient.language?"alreadyConnected":"";mxGraph.prototype.containsValidationErrorsResource="none"!=mxClient.language?"containsValidationErrors":"";mxGraph.prototype.collapseExpandResource="none"!=mxClient.language?"collapse-expand":"";
-mxGraph.prototype.init=function(a){this.container=a;this.cellEditor=this.createCellEditor();this.view.init();this.sizeDidChange();mxEvent.addListener(a,"mouseleave",mxUtils.bind(this,function(a){null!=this.tooltipHandler&&null!=this.tooltipHandler.div&&this.tooltipHandler.div!=a.relatedTarget&&this.tooltipHandler.hide()}));mxClient.IS_IE&&(mxEvent.addListener(window,"unload",mxUtils.bind(this,function(){this.destroy()})),mxEvent.addListener(a,"selectstart",mxUtils.bind(this,function(a){return this.isEditing()||
-!this.isMouseDown&&!mxEvent.isShiftDown(a)})));8==document.documentMode&&a.insertAdjacentHTML("beforeend","<"+mxClient.VML_PREFIX+':group style="DISPLAY: none;"></'+mxClient.VML_PREFIX+":group>")};
-mxGraph.prototype.createHandlers=function(){this.tooltipHandler=this.createTooltipHandler();this.tooltipHandler.setEnabled(!1);this.selectionCellsHandler=this.createSelectionCellsHandler();this.connectionHandler=this.createConnectionHandler();this.connectionHandler.setEnabled(!1);this.graphHandler=this.createGraphHandler();this.panningHandler=this.createPanningHandler();this.panningHandler.panningEnabled=!1;this.popupMenuHandler=this.createPopupMenuHandler()};
-mxGraph.prototype.createTooltipHandler=function(){return new mxTooltipHandler(this)};mxGraph.prototype.createSelectionCellsHandler=function(){return new mxSelectionCellsHandler(this)};mxGraph.prototype.createConnectionHandler=function(){return new mxConnectionHandler(this)};mxGraph.prototype.createGraphHandler=function(){return new mxGraphHandler(this)};mxGraph.prototype.createPanningHandler=function(){return new mxPanningHandler(this)};mxGraph.prototype.createPopupMenuHandler=function(){return new mxPopupMenuHandler(this)};
-mxGraph.prototype.createSelectionModel=function(){return new mxGraphSelectionModel(this)};mxGraph.prototype.createStylesheet=function(){return new mxStylesheet};mxGraph.prototype.createGraphView=function(){return new mxGraphView(this)};mxGraph.prototype.createCellRenderer=function(){return new mxCellRenderer};mxGraph.prototype.createCellEditor=function(){return new mxCellEditor(this)};mxGraph.prototype.getModel=function(){return this.model};mxGraph.prototype.getView=function(){return this.view};
-mxGraph.prototype.getStylesheet=function(){return this.stylesheet};mxGraph.prototype.setStylesheet=function(a){this.stylesheet=a};mxGraph.prototype.getSelectionModel=function(){return this.selectionModel};mxGraph.prototype.setSelectionModel=function(a){this.selectionModel=a};
-mxGraph.prototype.getSelectionCellsForChanges=function(a,b){for(var c=new mxDictionary,d=[],e=mxUtils.bind(this,function(a){if(!c.get(a)&&this.model.contains(a))if(this.model.isEdge(a)||this.model.isVertex(a))c.put(a,!0),d.push(a);else for(var b=this.model.getChildCount(a),f=0;f<b;f++)e(this.model.getChildAt(a,f))}),f=0;f<a.length;f++){var g=a[f];if(g.constructor!=mxRootChange&&(null==b||!b(g))){var k=null;g instanceof mxChildChange?k=g.child:null!=g.cell&&g.cell instanceof mxCell&&(k=g.cell);null!=
-k&&e(k)}}return d};mxGraph.prototype.graphModelChanged=function(a){for(var b=0;b<a.length;b++)this.processChange(a[b]);this.updateSelection();this.view.validate();this.sizeDidChange()};
-mxGraph.prototype.updateSelection=function(){for(var a=this.getSelectionCells(),b=[],c=0;c<a.length;c++)if(this.model.contains(a[c])&&this.isCellVisible(a[c]))for(var d=this.model.getParent(a[c]);null!=d&&d!=this.view.currentRoot;){if(this.isCellCollapsed(d)||!this.isCellVisible(d)){b.push(a[c]);break}d=this.model.getParent(d)}else b.push(a[c]);this.removeSelectionCells(b)};
-mxGraph.prototype.processChange=function(a){if(a instanceof mxRootChange)this.clearSelection(),this.setDefaultParent(null),this.removeStateForCell(a.previous),this.resetViewOnRootChange&&(this.view.scale=1,this.view.translate.x=0,this.view.translate.y=0),this.fireEvent(new mxEventObject(mxEvent.ROOT));else if(a instanceof mxChildChange){var b=this.model.getParent(a.child);this.view.invalidate(a.child,!0,!0);if(!this.model.contains(b)||this.isCellCollapsed(b))this.view.invalidate(a.child,!0,!0),this.removeStateForCell(a.child),
-this.view.currentRoot==a.child&&this.home();b!=a.previous&&(null!=b&&this.view.invalidate(b,!1,!1),null!=a.previous&&this.view.invalidate(a.previous,!1,!1))}else a instanceof mxTerminalChange||a instanceof mxGeometryChange?(a instanceof mxTerminalChange||null==a.previous&&null!=a.geometry||null!=a.previous&&!a.previous.equals(a.geometry))&&this.view.invalidate(a.cell):a instanceof mxValueChange?this.view.invalidate(a.cell,!1,!1):a instanceof mxStyleChange?(this.view.invalidate(a.cell,!0,!0),a=this.view.getState(a.cell),
-null!=a&&(a.invalidStyle=!0)):null!=a.cell&&a.cell instanceof mxCell&&this.removeStateForCell(a.cell)};mxGraph.prototype.removeStateForCell=function(a){for(var b=this.model.getChildCount(a),c=0;c<b;c++)this.removeStateForCell(this.model.getChildAt(a,c));this.view.invalidate(a,!1,!0);this.view.removeState(a)};
-mxGraph.prototype.addCellOverlay=function(a,b){null==a.overlays&&(a.overlays=[]);a.overlays.push(b);var c=this.view.getState(a);null!=c&&this.cellRenderer.redraw(c);this.fireEvent(new mxEventObject(mxEvent.ADD_OVERLAY,"cell",a,"overlay",b));return b};mxGraph.prototype.getCellOverlays=function(a){return a.overlays};
-mxGraph.prototype.removeCellOverlay=function(a,b){if(null==b)this.removeCellOverlays(a);else{var c=mxUtils.indexOf(a.overlays,b);0<=c?(a.overlays.splice(c,1),0==a.overlays.length&&(a.overlays=null),c=this.view.getState(a),null!=c&&this.cellRenderer.redraw(c),this.fireEvent(new mxEventObject(mxEvent.REMOVE_OVERLAY,"cell",a,"overlay",b))):b=null}return b};
-mxGraph.prototype.removeCellOverlays=function(a){var b=a.overlays;if(null!=b){a.overlays=null;var c=this.view.getState(a);null!=c&&this.cellRenderer.redraw(c);for(c=0;c<b.length;c++)this.fireEvent(new mxEventObject(mxEvent.REMOVE_OVERLAY,"cell",a,"overlay",b[c]))}return b};mxGraph.prototype.clearCellOverlays=function(a){a=null!=a?a:this.model.getRoot();this.removeCellOverlays(a);for(var b=this.model.getChildCount(a),c=0;c<b;c++){var d=this.model.getChildAt(a,c);this.clearCellOverlays(d)}};
-mxGraph.prototype.setCellWarning=function(a,b,c,d){if(null!=b&&0<b.length)return c=null!=c?c:this.warningImage,b=new mxCellOverlay(c,"<font color=red>"+b+"</font>"),d&&b.addListener(mxEvent.CLICK,mxUtils.bind(this,function(b,c){this.isEnabled()&&this.setSelectionCell(a)})),this.addCellOverlay(a,b);this.removeCellOverlays(a);return null};mxGraph.prototype.startEditing=function(a){this.startEditingAtCell(null,a)};
-mxGraph.prototype.startEditingAtCell=function(a,b){null!=b&&mxEvent.isMultiTouchEvent(b)||(null==a&&(a=this.getSelectionCell(),null==a||this.isCellEditable(a)||(a=null)),null!=a&&(this.fireEvent(new mxEventObject(mxEvent.START_EDITING,"cell",a,"event",b)),this.cellEditor.startEditing(a,b),this.fireEvent(new mxEventObject(mxEvent.EDITING_STARTED,"cell",a,"event",b))))};mxGraph.prototype.getEditingValue=function(a,b){return this.convertValueToString(a)};
-mxGraph.prototype.stopEditing=function(a){this.cellEditor.stopEditing(a);this.fireEvent(new mxEventObject(mxEvent.EDITING_STOPPED,"cancel",a))};mxGraph.prototype.labelChanged=function(a,b,c){this.model.beginUpdate();try{var d=a.value;this.cellLabelChanged(a,b,this.isAutoSizeCell(a));this.fireEvent(new mxEventObject(mxEvent.LABEL_CHANGED,"cell",a,"value",b,"old",d,"event",c))}finally{this.model.endUpdate()}return a};
-mxGraph.prototype.cellLabelChanged=function(a,b,c){this.model.beginUpdate();try{this.model.setValue(a,b),c&&this.cellSizeUpdated(a,!1)}finally{this.model.endUpdate()}};mxGraph.prototype.escape=function(a){this.fireEvent(new mxEventObject(mxEvent.ESCAPE,"event",a))};
-mxGraph.prototype.click=function(a){var b=a.getEvent(),c=a.getCell(),d=new mxEventObject(mxEvent.CLICK,"event",b,"cell",c);a.isConsumed()&&d.consume();this.fireEvent(d);if(this.isEnabled()&&!mxEvent.isConsumed(b)&&!d.isConsumed()){if(null!=c){if(this.isTransparentClickEvent(b)){var e=!1;a=this.getCellAt(a.graphX,a.graphY,null,null,null,mxUtils.bind(this,function(a){var b=this.isCellSelected(a.cell);e=e||b;return!e||b||a.cell!=c&&this.model.isAncestor(a.cell,c)}));null!=a&&(c=a)}}else if(this.isSwimlaneSelectionEnabled()&&
-(c=this.getSwimlaneAt(a.getGraphX(),a.getGraphY()),!(null==c||this.isToggleEvent(b)&&mxEvent.isAltDown(b)))){d=c;for(a=[];null!=d;){var d=this.model.getParent(d),f=this.view.getState(d);this.isSwimlane(d)&&null!=f&&a.push(d)}if(0<a.length)for(a=a.reverse(),a.splice(0,0,c),a.push(c),d=0;d<a.length-1;d++)this.isCellSelected(a[d])&&(c=a[this.isToggleEvent(b)?d:d+1])}null!=c?this.selectCellForEvent(c,b):this.isToggleEvent(b)||this.clearSelection()}};
-mxGraph.prototype.isSiblingSelected=function(a){for(var b=this.model,c=b.getParent(a),d=b.getChildCount(c),e=0;e<d;e++){var f=b.getChildAt(c,e);if(a!=f&&this.isCellSelected(f))return!0}return!1};mxGraph.prototype.dblClick=function(a,b){var c=new mxEventObject(mxEvent.DOUBLE_CLICK,"event",a,"cell",b);this.fireEvent(c);!this.isEnabled()||mxEvent.isConsumed(a)||c.isConsumed()||null==b||!this.isCellEditable(b)||this.isEditing(b)||(this.startEditingAtCell(b,a),mxEvent.consume(a))};
-mxGraph.prototype.tapAndHold=function(a){var b=a.getEvent(),c=new mxEventObject(mxEvent.TAP_AND_HOLD,"event",b,"cell",a.getCell());this.fireEvent(c);c.isConsumed()&&(this.panningHandler.panningTrigger=!1);this.isEnabled()&&!mxEvent.isConsumed(b)&&!c.isConsumed()&&this.connectionHandler.isEnabled()&&(b=this.view.getState(this.connectionHandler.marker.getCell(a)),null!=b&&(this.connectionHandler.marker.currentColor=this.connectionHandler.marker.validColor,this.connectionHandler.marker.markedState=b,
-this.connectionHandler.marker.mark(),this.connectionHandler.first=new mxPoint(a.getGraphX(),a.getGraphY()),this.connectionHandler.edgeState=this.connectionHandler.createEdgeState(a),this.connectionHandler.previous=b,this.connectionHandler.fireEvent(new mxEventObject(mxEvent.START,"state",this.connectionHandler.previous))))};
-mxGraph.prototype.scrollPointToVisible=function(a,b,c,d){if(this.timerAutoScroll||!this.ignoreScrollbars&&!mxUtils.hasScrollbars(this.container))this.allowAutoPanning&&!this.panningHandler.isActive()&&(null==this.panningManager&&(this.panningManager=this.createPanningManager()),this.panningManager.panTo(a+this.panDx,b+this.panDy));else{var e=this.container;d=null!=d?d:20;if(a>=e.scrollLeft&&b>=e.scrollTop&&a<=e.scrollLeft+e.clientWidth&&b<=e.scrollTop+e.clientHeight){var f=e.scrollLeft+e.clientWidth-
-a;if(f<d){if(a=e.scrollLeft,e.scrollLeft+=d-f,c&&a==e.scrollLeft){if(this.dialect==mxConstants.DIALECT_SVG){a=this.view.getDrawPane().ownerSVGElement;var g=this.container.scrollWidth+d-f}else g=Math.max(e.clientWidth,e.scrollWidth)+d-f,a=this.view.getCanvas();a.style.width=g+"px";e.scrollLeft+=d-f}}else f=a-e.scrollLeft,f<d&&(e.scrollLeft-=d-f);f=e.scrollTop+e.clientHeight-b;f<d?(a=e.scrollTop,e.scrollTop+=d-f,a==e.scrollTop&&c&&(this.dialect==mxConstants.DIALECT_SVG?(a=this.view.getDrawPane().ownerSVGElement,
-b=this.container.scrollHeight+d-f):(b=Math.max(e.clientHeight,e.scrollHeight)+d-f,a=this.view.getCanvas()),a.style.height=b+"px",e.scrollTop+=d-f)):(f=b-e.scrollTop,f<d&&(e.scrollTop-=d-f))}}};mxGraph.prototype.createPanningManager=function(){return new mxPanningManager(this)};
-mxGraph.prototype.getBorderSizes=function(){var a=mxUtils.getCurrentStyle(this.container);return new mxRectangle(mxUtils.parseCssNumber(a.paddingLeft)+("none"!=a.borderLeftStyle?mxUtils.parseCssNumber(a.borderLeftWidth):0),mxUtils.parseCssNumber(a.paddingTop)+("none"!=a.borderTopStyle?mxUtils.parseCssNumber(a.borderTopWidth):0),mxUtils.parseCssNumber(a.paddingRight)+("none"!=a.borderRightStyle?mxUtils.parseCssNumber(a.borderRightWidth):0),mxUtils.parseCssNumber(a.paddingBottom)+("none"!=a.borderBottomStyle?
-mxUtils.parseCssNumber(a.borderBottomWidth):0))};mxGraph.prototype.getPreferredPageSize=function(a,b,c){a=this.view.translate;var d=this.pageFormat,e=this.pageScale,d=new mxRectangle(0,0,Math.ceil(d.width*e),Math.ceil(d.height*e));return new mxRectangle(0,0,(this.pageBreaksVisible?Math.ceil(b/d.width):1)*d.width+2+a.x,(this.pageBreaksVisible?Math.ceil(c/d.height):1)*d.height+2+a.y)};
-mxGraph.prototype.fit=function(a,b,c,d,e,f,g){if(null!=this.container){a=null!=a?a:this.getBorder();b=null!=b?b:!1;c=null!=c?c:0;d=null!=d?d:!0;e=null!=e?e:!1;f=null!=f?f:!1;var k=this.getBorderSizes(),l=this.container.offsetWidth-k.x-k.width-1,m=null!=g?g:this.container.offsetHeight-k.y-k.height-1;g=this.view.getGraphBounds();if(0<g.width&&0<g.height){b&&null!=g.x&&null!=g.y&&(g=g.clone(),g.width+=g.x,g.height+=g.y,g.x=0,g.y=0);var k=this.view.scale,n=g.width/k,p=g.height/k;null!=this.backgroundImage&&
-(n=Math.max(n,this.backgroundImage.width-g.x/k),p=Math.max(p,this.backgroundImage.height-g.y/k));var q=(b?a:2*a)+c+1,l=l-q,m=m-q;e=e?m/p:f?l/n:Math.min(l/n,m/p);null!=this.minFitScale&&(e=Math.max(e,this.minFitScale));null!=this.maxFitScale&&(e=Math.min(e,this.maxFitScale));if(d)b?this.view.scale!=e&&this.view.setScale(e):mxUtils.hasScrollbars(this.container)?(this.view.setScale(e),a=this.getGraphBounds(),null!=a.x&&(this.container.scrollLeft=a.x),null!=a.y&&(this.container.scrollTop=a.y)):this.view.scaleAndTranslate(e,
-null!=g.x?Math.floor(this.view.translate.x-g.x/k+a/e+c/2):a,null!=g.y?Math.floor(this.view.translate.y-g.y/k+a/e+c/2):a);else return e}}return this.view.scale};
-mxGraph.prototype.sizeDidChange=function(){var a=this.getGraphBounds();if(null!=this.container){var b=this.getBorder(),c=Math.max(0,a.x)+a.width+2*b,b=Math.max(0,a.y)+a.height+2*b;null!=this.minimumContainerSize&&(c=Math.max(c,this.minimumContainerSize.width),b=Math.max(b,this.minimumContainerSize.height));this.resizeContainer&&this.doResizeContainer(c,b);if(this.preferPageSize||!mxClient.IS_IE&&this.pageVisible){var d=this.getPreferredPageSize(a,Math.max(1,c),Math.max(1,b));null!=d&&(c=d.width*this.view.scale,
-b=d.height*this.view.scale)}null!=this.minimumGraphSize&&(c=Math.max(c,this.minimumGraphSize.width*this.view.scale),b=Math.max(b,this.minimumGraphSize.height*this.view.scale));c=Math.ceil(c);b=Math.ceil(b);this.dialect==mxConstants.DIALECT_SVG?(d=this.view.getDrawPane().ownerSVGElement,null!=d&&(d.style.minWidth=Math.max(1,c)+"px",d.style.minHeight=Math.max(1,b)+"px",d.style.width="100%",d.style.height="100%")):mxClient.IS_QUIRKS?this.view.updateHtmlCanvasSize(Math.max(1,c),Math.max(1,b)):(this.view.canvas.style.minWidth=
-Math.max(1,c)+"px",this.view.canvas.style.minHeight=Math.max(1,b)+"px");this.updatePageBreaks(this.pageBreaksVisible,c,b)}this.fireEvent(new mxEventObject(mxEvent.SIZE,"bounds",a))};mxGraph.prototype.doResizeContainer=function(a,b){null!=this.maximumContainerSize&&(a=Math.min(this.maximumContainerSize.width,a),b=Math.min(this.maximumContainerSize.height,b));this.container.style.width=Math.ceil(a)+"px";this.container.style.height=Math.ceil(b)+"px"};
-mxGraph.prototype.updatePageBreaks=function(a,b,c){b=this.view.scale;c=this.view.translate;var d=this.pageFormat,e=b*this.pageScale,f=new mxRectangle(0,0,d.width*e,d.height*e),d=mxRectangle.fromRectangle(this.getGraphBounds());d.width=Math.max(1,d.width);d.height=Math.max(1,d.height);f.x=Math.floor((d.x-c.x*b)/f.width)*f.width+c.x*b;f.y=Math.floor((d.y-c.y*b)/f.height)*f.height+c.y*b;d.width=Math.ceil((d.width+(d.x-f.x))/f.width)*f.width;d.height=Math.ceil((d.height+(d.y-f.y))/f.height)*f.height;
-var g=(a=a&&Math.min(f.width,f.height)>this.minPageBreakDist)?Math.ceil(d.height/f.height)+1:0,k=a?Math.ceil(d.width/f.width)+1:0,l=(k-1)*f.width,m=(g-1)*f.height;null==this.horizontalPageBreaks&&0<g&&(this.horizontalPageBreaks=[]);null==this.verticalPageBreaks&&0<k&&(this.verticalPageBreaks=[]);a=mxUtils.bind(this,function(a){if(null!=a){for(var b=a==this.horizontalPageBreaks?g:k,c=0;c<=b;c++){var d=a==this.horizontalPageBreaks?[new mxPoint(Math.round(f.x),Math.round(f.y+c*f.height)),new mxPoint(Math.round(f.x+
-l),Math.round(f.y+c*f.height))]:[new mxPoint(Math.round(f.x+c*f.width),Math.round(f.y)),new mxPoint(Math.round(f.x+c*f.width),Math.round(f.y+m))];null!=a[c]?(a[c].points=d,a[c].redraw()):(d=new mxPolyline(d,this.pageBreakColor),d.dialect=this.dialect,d.pointerEvents=!1,d.isDashed=this.pageBreakDashed,d.init(this.view.backgroundPane),d.redraw(),a[c]=d)}for(c=b;c<a.length;c++)a[c].destroy();a.splice(b,a.length-b)}});a(this.horizontalPageBreaks);a(this.verticalPageBreaks)};
-mxGraph.prototype.getCurrentCellStyle=function(a,b){var c=b?null:this.view.getState(a);return null!=c?c.style:this.getCellStyle(a)};mxGraph.prototype.getCellStyle=function(a){var b=this.model.getStyle(a);a=this.model.isEdge(a)?this.stylesheet.getDefaultEdgeStyle():this.stylesheet.getDefaultVertexStyle();null!=b&&(a=this.postProcessCellStyle(this.stylesheet.getCellStyle(b,a)));null==a&&(a={});return a};
-mxGraph.prototype.postProcessCellStyle=function(a){if(null!=a){var b=a[mxConstants.STYLE_IMAGE],c=this.getImageFromBundles(b);null!=c?a[mxConstants.STYLE_IMAGE]=c:c=b;null!=c&&"data:image/"==c.substring(0,11)&&("data:image/svg+xml,<"==c.substring(0,20)?c=c.substring(0,19)+encodeURIComponent(c.substring(19)):"data:image/svg+xml,%3C"!=c.substring(0,22)&&(b=c.indexOf(","),0<b&&";base64,"!=c.substring(b-7,b+1)&&(c=c.substring(0,b)+";base64,"+c.substring(b+1))),a[mxConstants.STYLE_IMAGE]=c)}return a};
-mxGraph.prototype.setCellStyle=function(a,b){b=b||this.getSelectionCells();if(null!=b){this.model.beginUpdate();try{for(var c=0;c<b.length;c++)this.model.setStyle(b[c],a)}finally{this.model.endUpdate()}}};mxGraph.prototype.toggleCellStyle=function(a,b,c){c=c||this.getSelectionCell();return this.toggleCellStyles(a,b,[c])};
-mxGraph.prototype.toggleCellStyles=function(a,b,c){b=null!=b?b:!1;c=c||this.getSelectionCells();var d=null;null!=c&&0<c.length&&(d=this.getCurrentCellStyle(c[0]),d=mxUtils.getValue(d,a,b)?0:1,this.setCellStyles(a,d,c));return d};mxGraph.prototype.setCellStyles=function(a,b,c){c=c||this.getSelectionCells();mxUtils.setCellStyles(this.model,c,a,b)};mxGraph.prototype.toggleCellStyleFlags=function(a,b,c){this.setCellStyleFlags(a,b,null,c)};
-mxGraph.prototype.setCellStyleFlags=function(a,b,c,d){d=d||this.getSelectionCells();null!=d&&0<d.length&&(null==c&&(c=this.getCurrentCellStyle(d[0]),c=(parseInt(c[a]||0)&b)!=b),mxUtils.setCellStyleFlags(this.model,d,a,b,c))};mxGraph.prototype.getOriginForCell=function(a){a=this.model.getParent(a);for(var b=new mxPoint;null!=a;){var c=this.getCellGeometry(a);null==c||c.relative||(b.x+=c.x,b.y+=c.y);a=this.model.getParent(a)}return b};
-mxGraph.prototype.alignCells=function(a,b,c){null==b&&(b=this.getSelectionCells());if(null!=b&&1<b.length){if(null==c)for(var d=0;d<b.length;d++){var e=this.getOriginForCell(b[d]),f=this.getCellGeometry(b[d]);if(!this.model.isEdge(b[d])&&null!=f&&!f.relative)if(null==c)if(a==mxConstants.ALIGN_CENTER){c=e.x+f.x+f.width/2;break}else if(a==mxConstants.ALIGN_RIGHT)c=e.x+f.x+f.width;else if(a==mxConstants.ALIGN_TOP)c=e.y+f.y;else if(a==mxConstants.ALIGN_MIDDLE){c=e.y+f.y+f.height/2;break}else c=a==mxConstants.ALIGN_BOTTOM?
-e.y+f.y+f.height:e.x+f.x;else c=a==mxConstants.ALIGN_RIGHT?Math.max(c,e.x+f.x+f.width):a==mxConstants.ALIGN_TOP?Math.min(c,e.y+f.y):a==mxConstants.ALIGN_BOTTOM?Math.max(c,e.y+f.y+f.height):Math.min(c,e.x+f.x)}if(null!=c){b=mxUtils.sortCells(b);this.model.beginUpdate();try{for(d=0;d<b.length;d++)e=this.getOriginForCell(b[d]),f=this.getCellGeometry(b[d]),this.model.isEdge(b[d])||null==f||f.relative||(f=f.clone(),a==mxConstants.ALIGN_CENTER?f.x=c-e.x-f.width/2:a==mxConstants.ALIGN_RIGHT?f.x=c-e.x-f.width:
-a==mxConstants.ALIGN_TOP?f.y=c-e.y:a==mxConstants.ALIGN_MIDDLE?f.y=c-e.y-f.height/2:a==mxConstants.ALIGN_BOTTOM?f.y=c-e.y-f.height:f.x=c-e.x,this.resizeCell(b[d],f));this.fireEvent(new mxEventObject(mxEvent.ALIGN_CELLS,"align",a,"cells",b))}finally{this.model.endUpdate()}}}return b};
-mxGraph.prototype.flipEdge=function(a){if(null!=a&&null!=this.alternateEdgeStyle){this.model.beginUpdate();try{var b=this.model.getStyle(a);null==b||0==b.length?this.model.setStyle(a,this.alternateEdgeStyle):this.model.setStyle(a,null);this.resetEdge(a);this.fireEvent(new mxEventObject(mxEvent.FLIP_EDGE,"edge",a))}finally{this.model.endUpdate()}}return a};mxGraph.prototype.addImageBundle=function(a){this.imageBundles.push(a)};
-mxGraph.prototype.removeImageBundle=function(a){for(var b=[],c=0;c<this.imageBundles.length;c++)this.imageBundles[c]!=a&&b.push(this.imageBundles[c]);this.imageBundles=b};mxGraph.prototype.getImageFromBundles=function(a){if(null!=a)for(var b=0;b<this.imageBundles.length;b++){var c=this.imageBundles[b].getImage(a);if(null!=c)return c}return null};
-mxGraph.prototype.orderCells=function(a,b){null==b&&(b=mxUtils.sortCells(this.getSelectionCells(),!0));this.model.beginUpdate();try{this.cellsOrdered(b,a),this.fireEvent(new mxEventObject(mxEvent.ORDER_CELLS,"back",a,"cells",b))}finally{this.model.endUpdate()}return b};
-mxGraph.prototype.cellsOrdered=function(a,b){if(null!=a){this.model.beginUpdate();try{for(var c=0;c<a.length;c++){var d=this.model.getParent(a[c]);b?this.model.add(d,a[c],c):this.model.add(d,a[c],this.model.getChildCount(d)-1)}this.fireEvent(new mxEventObject(mxEvent.CELLS_ORDERED,"back",b,"cells",a))}finally{this.model.endUpdate()}}};
-mxGraph.prototype.groupCells=function(a,b,c){null==c&&(c=mxUtils.sortCells(this.getSelectionCells(),!0));c=this.getCellsForGroup(c);null==a&&(a=this.createGroupCell(c));var d=this.getBoundsForGroup(a,c,b);if(1<c.length&&null!=d){var e=this.model.getParent(a);null==e&&(e=this.model.getParent(c[0]));this.model.beginUpdate();try{null==this.getCellGeometry(a)&&this.model.setGeometry(a,new mxGeometry);var f=this.model.getChildCount(e);this.cellsAdded([a],e,f,null,null,!1,!1,!1);f=this.model.getChildCount(a);
-this.cellsAdded(c,a,f,null,null,!1,!1,!1);this.cellsMoved(c,-d.x,-d.y,!1,!1,!1);this.cellsResized([a],[d],!1);this.fireEvent(new mxEventObject(mxEvent.GROUP_CELLS,"group",a,"border",b,"cells",c))}finally{this.model.endUpdate()}}return a};mxGraph.prototype.getCellsForGroup=function(a){var b=[];if(null!=a&&0<a.length){var c=this.model.getParent(a[0]);b.push(a[0]);for(var d=1;d<a.length;d++)this.model.getParent(a[d])==c&&b.push(a[d])}return b};
-mxGraph.prototype.getBoundsForGroup=function(a,b,c){b=this.getBoundingBoxFromGeometry(b,!0);null!=b&&(this.isSwimlane(a)&&(a=this.getStartSize(a),b.x-=a.width,b.y-=a.height,b.width+=a.width,b.height+=a.height),null!=c&&(b.x-=c,b.y-=c,b.width+=2*c,b.height+=2*c));return b};mxGraph.prototype.createGroupCell=function(a){a=new mxCell("");a.setVertex(!0);a.setConnectable(!1);return a};
-mxGraph.prototype.ungroupCells=function(a){var b=[];null==a&&(a=this.getCellsForUngroup());if(null!=a&&0<a.length){this.model.beginUpdate();try{for(var c=0;c<a.length;c++){var d=this.model.getChildren(a[c]);if(null!=d&&0<d.length){var d=d.slice(),e=this.model.getParent(a[c]),f=this.model.getChildCount(e);this.cellsAdded(d,e,f,null,null,!0);for(var b=b.concat(d),g=0;g<d.length;g++){var k=this.view.getState(d[g]),l=this.getCellGeometry(d[g]);null!=k&&null!=l&&l.relative&&(l=l.clone(),l.x=k.origin.x,
-l.y=k.origin.y,l.relative=!1,this.model.setGeometry(d[g],l))}}}this.removeCellsAfterUngroup(a);this.fireEvent(new mxEventObject(mxEvent.UNGROUP_CELLS,"cells",a))}finally{this.model.endUpdate()}}return b};mxGraph.prototype.getCellsForUngroup=function(){for(var a=this.getSelectionCells(),b=[],c=0;c<a.length;c++)this.model.isVertex(a[c])&&0<this.model.getChildCount(a[c])&&b.push(a[c]);return b};mxGraph.prototype.removeCellsAfterUngroup=function(a){this.cellsRemoved(this.addAllEdges(a))};
-mxGraph.prototype.removeCellsFromParent=function(a){null==a&&(a=this.getSelectionCells());this.model.beginUpdate();try{var b=this.getDefaultParent(),c=this.model.getChildCount(b);this.cellsAdded(a,b,c,null,null,!0);this.fireEvent(new mxEventObject(mxEvent.REMOVE_CELLS_FROM_PARENT,"cells",a))}finally{this.model.endUpdate()}return a};
-mxGraph.prototype.updateGroupBounds=function(a,b,c,d,e,f,g){null==a&&(a=this.getSelectionCells());b=null!=b?b:0;c=null!=c?c:!1;d=null!=d?d:0;e=null!=e?e:0;f=null!=f?f:0;g=null!=g?g:0;this.model.beginUpdate();try{for(var k=a.length-1;0<=k;k--){var l=this.getCellGeometry(a[k]);if(null!=l){var m=this.getChildCells(a[k]);if(null!=m&&0<m.length){var n=this.getBoundingBoxFromGeometry(m,!0);if(null!=n&&0<n.width&&0<n.height){var p=this.isSwimlane(a[k])?this.getActualStartSize(a[k],!0):new mxRectangle,l=
-l.clone();c&&(l.x=Math.round(l.x+n.x-b-p.x-g),l.y=Math.round(l.y+n.y-b-p.y-d));l.width=Math.round(n.width+2*b+p.x+g+e+p.width);l.height=Math.round(n.height+2*b+p.y+d+f+p.height);this.model.setGeometry(a[k],l);this.moveCells(m,b+p.x-n.x+g,b+p.y-n.y+d)}}}}}finally{this.model.endUpdate()}return a};
-mxGraph.prototype.getBoundingBox=function(a){var b=null;if(null!=a&&0<a.length)for(var c=0;c<a.length;c++)if(this.model.isVertex(a[c])||this.model.isEdge(a[c])){var d=this.view.getBoundingBox(this.view.getState(a[c]),!0);null!=d&&(null==b?b=mxRectangle.fromRectangle(d):b.add(d))}return b};mxGraph.prototype.cloneCell=function(a,b,c,d){return this.cloneCells([a],b,c,d)[0]};
-mxGraph.prototype.cloneCells=function(a,b,c,d){b=null!=b?b:!0;var e=null;if(null!=a){for(var f=new mxDictionary,e=[],g=0;g<a.length;g++)f.put(a[g],!0),e.push(a[g]);if(0<e.length)for(var k=this.view.scale,l=this.view.translate,e=this.model.cloneCells(a,!0,c),g=0;g<a.length;g++)if(!b&&this.model.isEdge(e[g])&&null!=this.getEdgeValidationError(e[g],this.model.getTerminal(e[g],!0),this.model.getTerminal(e[g],!1)))e[g]=null;else{var m=this.model.getGeometry(e[g]);if(null!=m){var n=this.view.getState(a[g]),
-p=this.view.getState(this.model.getParent(a[g]));if(null!=n&&null!=p)if(c=d?0:p.origin.x,p=d?0:p.origin.y,this.model.isEdge(e[g])){if(n=n.absolutePoints,null!=n){for(var q=this.model.getTerminal(a[g],!0);null!=q&&!f.get(q);)q=this.model.getParent(q);null==q&&null!=n[0]&&m.setTerminalPoint(new mxPoint(n[0].x/k-l.x,n[0].y/k-l.y),!0);for(q=this.model.getTerminal(a[g],!1);null!=q&&!f.get(q);)q=this.model.getParent(q);var r=n.length-1;null==q&&null!=n[r]&&m.setTerminalPoint(new mxPoint(n[r].x/k-l.x,n[r].y/
-k-l.y),!1);m=m.points;if(null!=m)for(n=0;n<m.length;n++)m[n].x+=c,m[n].y+=p}}else m.translate(c,p)}}else e=[]}return e};mxGraph.prototype.insertVertex=function(a,b,c,d,e,f,g,k,l){b=this.createVertex(a,b,c,d,e,f,g,k,l);return this.addCell(b,a)};mxGraph.prototype.createVertex=function(a,b,c,d,e,f,g,k,l){a=new mxGeometry(d,e,f,g);a.relative=null!=l?l:!1;c=new mxCell(c,a,k);c.setId(b);c.setVertex(!0);c.setConnectable(!0);return c};
-mxGraph.prototype.insertEdge=function(a,b,c,d,e,f){b=this.createEdge(a,b,c,d,e,f);return this.addEdge(b,a,d,e)};mxGraph.prototype.createEdge=function(a,b,c,d,e,f){a=new mxCell(c,new mxGeometry,f);a.setId(b);a.setEdge(!0);a.geometry.relative=!0;return a};mxGraph.prototype.addEdge=function(a,b,c,d,e){return this.addCell(a,b,e,c,d)};mxGraph.prototype.addCell=function(a,b,c,d,e){return this.addCells([a],b,c,d,e)[0]};
-mxGraph.prototype.addCells=function(a,b,c,d,e,f){null==b&&(b=this.getDefaultParent());null==c&&(c=this.model.getChildCount(b));this.model.beginUpdate();try{this.cellsAdded(a,b,c,d,e,null!=f?f:!1,!0),this.fireEvent(new mxEventObject(mxEvent.ADD_CELLS,"cells",a,"parent",b,"index",c,"source",d,"target",e))}finally{this.model.endUpdate()}return a};
-mxGraph.prototype.cellsAdded=function(a,b,c,d,e,f,g,k){if(null!=a&&null!=b&&null!=c){this.model.beginUpdate();try{for(var l=f?this.view.getState(b):null,m=null!=l?l.origin:null,n=new mxPoint(0,0),l=0;l<a.length;l++)if(null==a[l])c--;else{var p=this.model.getParent(a[l]);if(null!=m&&a[l]!=b&&b!=p){var q=this.view.getState(p),r=null!=q?q.origin:n,t=this.model.getGeometry(a[l]);if(null!=t){var u=r.x-m.x,x=r.y-m.y,t=t.clone();t.translate(u,x);t.relative||!this.model.isVertex(a[l])||this.isAllowNegativeCoordinates()||
-(t.x=Math.max(0,t.x),t.y=Math.max(0,t.y));this.model.setGeometry(a[l],t)}}b==p&&c+l>this.model.getChildCount(b)&&c--;this.model.add(b,a[l],c+l);this.autoSizeCellsOnAdd&&this.autoSizeCell(a[l],!0);(null==k||k)&&this.isExtendParentsOnAdd(a[l])&&this.isExtendParent(a[l])&&this.extendParent(a[l]);(null==g||g)&&this.constrainChild(a[l]);null!=d&&this.cellConnected(a[l],d,!0);null!=e&&this.cellConnected(a[l],e,!1)}this.fireEvent(new mxEventObject(mxEvent.CELLS_ADDED,"cells",a,"parent",b,"index",c,"source",
-d,"target",e,"absolute",f))}finally{this.model.endUpdate()}}};mxGraph.prototype.autoSizeCell=function(a,b){if(null!=b?b:1)for(var c=this.model.getChildCount(a),d=0;d<c;d++)this.autoSizeCell(this.model.getChildAt(a,d));this.getModel().isVertex(a)&&this.isAutoSizeCell(a)&&this.updateCellSize(a)};
-mxGraph.prototype.removeCells=function(a,b){b=null!=b?b:!0;null==a&&(a=this.getDeletableCells(this.getSelectionCells()));if(b)a=this.getDeletableCells(this.addAllEdges(a));else{a=a.slice();for(var c=this.getDeletableCells(this.getAllEdges(a)),d=new mxDictionary,e=0;e<a.length;e++)d.put(a[e],!0);for(e=0;e<c.length;e++)null!=this.view.getState(c[e])||d.get(c[e])||(d.put(c[e],!0),a.push(c[e]))}this.model.beginUpdate();try{this.cellsRemoved(a),this.fireEvent(new mxEventObject(mxEvent.REMOVE_CELLS,"cells",
-a,"includeEdges",b))}finally{this.model.endUpdate()}return a};
-mxGraph.prototype.cellsRemoved=function(a){if(null!=a&&0<a.length){var b=this.view.scale,c=this.view.translate;this.model.beginUpdate();try{for(var d=new mxDictionary,e=0;e<a.length;e++)d.put(a[e],!0);for(e=0;e<a.length;e++){for(var f=this.getAllEdges([a[e]]),g=mxUtils.bind(this,function(d,f){var g=this.model.getGeometry(d);if(null!=g){for(var k=this.model.getTerminal(d,f),l=!1,m=k;null!=m;){if(a[e]==m){l=!0;break}m=this.model.getParent(m)}l&&(g=g.clone(),l=this.view.getState(d),null!=l&&null!=l.absolutePoints?
-(k=l.absolutePoints,m=f?0:k.length-1,g.setTerminalPoint(new mxPoint(k[m].x/b-c.x-l.origin.x,k[m].y/b-c.y-l.origin.y),f)):(k=this.view.getState(k),null!=k&&g.setTerminalPoint(new mxPoint(k.getCenterX()/b-c.x,k.getCenterY()/b-c.y),f)),this.model.setGeometry(d,g),this.model.setTerminal(d,null,f))}}),k=0;k<f.length;k++)d.get(f[k])||(d.put(f[k],!0),g(f[k],!0),g(f[k],!1));this.model.remove(a[e])}this.fireEvent(new mxEventObject(mxEvent.CELLS_REMOVED,"cells",a))}finally{this.model.endUpdate()}}};
-mxGraph.prototype.splitEdge=function(a,b,c,d,e,f,g,k){d=d||0;e=e||0;k=null!=k?k:this.model.getParent(a);f=this.model.getTerminal(a,!0);this.model.beginUpdate();try{if(null==c){c=this.cloneCell(a);var l=this.view.getState(a),m=this.getCellGeometry(c);if(null!=m&&null!=m.points&&null!=l){var n=this.view.translate,p=this.view.scale,q=mxUtils.findNearestSegment(l,(d+n.x)*p,(e+n.y)*p);m.points=m.points.slice(0,q);m=this.getCellGeometry(a);null!=m&&null!=m.points&&(m=m.clone(),m.points=m.points.slice(q),
-this.model.setGeometry(a,m))}}this.cellsMoved(b,d,e,!1,!1);this.cellsAdded(b,k,this.model.getChildCount(k),null,null,!0);this.cellsAdded([c],k,this.model.getChildCount(k),f,b[0],!1);this.cellConnected(a,b[0],!0);this.fireEvent(new mxEventObject(mxEvent.SPLIT_EDGE,"edge",a,"cells",b,"newEdge",c,"dx",d,"dy",e))}finally{this.model.endUpdate()}return c};
-mxGraph.prototype.toggleCells=function(a,b,c){null==b&&(b=this.getSelectionCells());c&&(b=this.addAllEdges(b));this.model.beginUpdate();try{this.cellsToggled(b,a),this.fireEvent(new mxEventObject(mxEvent.TOGGLE_CELLS,"show",a,"cells",b,"includeEdges",c))}finally{this.model.endUpdate()}return b};mxGraph.prototype.cellsToggled=function(a,b){if(null!=a&&0<a.length){this.model.beginUpdate();try{for(var c=0;c<a.length;c++)this.model.setVisible(a[c],b)}finally{this.model.endUpdate()}}};
-mxGraph.prototype.foldCells=function(a,b,c,d,e){b=null!=b?b:!1;null==c&&(c=this.getFoldableCells(this.getSelectionCells(),a));this.stopEditing(!1);this.model.beginUpdate();try{this.cellsFolded(c,a,b,d),this.fireEvent(new mxEventObject(mxEvent.FOLD_CELLS,"collapse",a,"recurse",b,"cells",c))}finally{this.model.endUpdate()}return c};
-mxGraph.prototype.cellsFolded=function(a,b,c,d){if(null!=a&&0<a.length){this.model.beginUpdate();try{for(var e=0;e<a.length;e++)if((!d||this.isCellFoldable(a[e],b))&&b!=this.isCellCollapsed(a[e])){this.model.setCollapsed(a[e],b);this.swapBounds(a[e],b);this.isExtendParent(a[e])&&this.extendParent(a[e]);if(c){var f=this.model.getChildren(a[e]);this.cellsFolded(f,b,c)}this.constrainChild(a[e])}this.fireEvent(new mxEventObject(mxEvent.CELLS_FOLDED,"cells",a,"collapse",b,"recurse",c))}finally{this.model.endUpdate()}}};
-mxGraph.prototype.swapBounds=function(a,b){if(null!=a){var c=this.model.getGeometry(a);null!=c&&(c=c.clone(),this.updateAlternateBounds(a,c,b),c.swap(),this.model.setGeometry(a,c))}};
-mxGraph.prototype.updateAlternateBounds=function(a,b,c){if(null!=a&&null!=b){c=this.getCurrentCellStyle(a);if(null==b.alternateBounds){var d=b;this.collapseToPreferredSize&&(a=this.getPreferredSizeForCell(a),null!=a&&(d=a,a=mxUtils.getValue(c,mxConstants.STYLE_STARTSIZE),0<a&&(d.height=Math.max(d.height,a))));b.alternateBounds=new mxRectangle(0,0,d.width,d.height)}if(null!=b.alternateBounds){b.alternateBounds.x=b.x;b.alternateBounds.y=b.y;var e=mxUtils.toRadians(c[mxConstants.STYLE_ROTATION]||0);
-0!=e&&(c=b.alternateBounds.getCenterX()-b.getCenterX(),d=b.alternateBounds.getCenterY()-b.getCenterY(),a=Math.cos(e),e=Math.sin(e),b.alternateBounds.x+=a*c-e*d-c,b.alternateBounds.y+=e*c+a*d-d)}}};mxGraph.prototype.addAllEdges=function(a){var b=a.slice();return mxUtils.removeDuplicates(b.concat(this.getAllEdges(a)))};
-mxGraph.prototype.getAllEdges=function(a){var b=[];if(null!=a)for(var c=0;c<a.length;c++){for(var d=this.model.getEdgeCount(a[c]),e=0;e<d;e++)b.push(this.model.getEdgeAt(a[c],e));d=this.model.getChildren(a[c]);b=b.concat(this.getAllEdges(d))}return b};mxGraph.prototype.updateCellSize=function(a,b){b=null!=b?b:!1;this.model.beginUpdate();try{this.cellSizeUpdated(a,b),this.fireEvent(new mxEventObject(mxEvent.UPDATE_CELL_SIZE,"cell",a,"ignoreChildren",b))}finally{this.model.endUpdate()}return a};
-mxGraph.prototype.cellSizeUpdated=function(a,b){if(null!=a){this.model.beginUpdate();try{var c=this.getPreferredSizeForCell(a),d=this.model.getGeometry(a);if(null!=c&&null!=d){var e=this.isCellCollapsed(a),d=d.clone();if(this.isSwimlane(a)){var f=this.getCellStyle(a),g=this.model.getStyle(a);null==g&&(g="");mxUtils.getValue(f,mxConstants.STYLE_HORIZONTAL,!0)?(g=mxUtils.setStyle(g,mxConstants.STYLE_STARTSIZE,c.height+8),e&&(d.height=c.height+8),d.width=c.width):(g=mxUtils.setStyle(g,mxConstants.STYLE_STARTSIZE,
-c.width+8),e&&(d.width=c.width+8),d.height=c.height);this.model.setStyle(a,g)}else{var k=this.view.createState(a),l=k.style[mxConstants.STYLE_ALIGN]||mxConstants.ALIGN_CENTER;l==mxConstants.ALIGN_RIGHT?d.x+=d.width-c.width:l==mxConstants.ALIGN_CENTER&&(d.x+=Math.round((d.width-c.width)/2));var m=this.getVerticalAlign(k);m==mxConstants.ALIGN_BOTTOM?d.y+=d.height-c.height:m==mxConstants.ALIGN_MIDDLE&&(d.y+=Math.round((d.height-c.height)/2));d.width=c.width;d.height=c.height}if(!b&&!e){var n=this.view.getBounds(this.model.getChildren(a));
-if(null!=n){var p=this.view.translate,q=this.view.scale,r=(n.y+n.height)/q-d.y-p.y;d.width=Math.max(d.width,(n.x+n.width)/q-d.x-p.x);d.height=Math.max(d.height,r)}}this.cellsResized([a],[d],!1)}}finally{this.model.endUpdate()}}};
-mxGraph.prototype.getPreferredSizeForCell=function(a,b){var c=null;if(null!=a){var d=this.view.createState(a),e=d.style;if(!this.model.isEdge(a)){var f=e[mxConstants.STYLE_FONTSIZE]||mxConstants.DEFAULT_FONTSIZE,g=0,c=0;null==this.getImage(d)&&null==e[mxConstants.STYLE_IMAGE]||e[mxConstants.STYLE_SHAPE]!=mxConstants.SHAPE_LABEL||(e[mxConstants.STYLE_VERTICAL_ALIGN]==mxConstants.ALIGN_MIDDLE&&(g+=parseFloat(e[mxConstants.STYLE_IMAGE_WIDTH])||mxLabel.prototype.imageSize),e[mxConstants.STYLE_ALIGN]!=
-mxConstants.ALIGN_CENTER&&(c+=parseFloat(e[mxConstants.STYLE_IMAGE_HEIGHT])||mxLabel.prototype.imageSize));var g=g+2*(e[mxConstants.STYLE_SPACING]||0),g=g+(e[mxConstants.STYLE_SPACING_LEFT]||0),g=g+(e[mxConstants.STYLE_SPACING_RIGHT]||0),c=c+2*(e[mxConstants.STYLE_SPACING]||0),c=c+(e[mxConstants.STYLE_SPACING_TOP]||0),c=c+(e[mxConstants.STYLE_SPACING_BOTTOM]||0),k=this.getFoldingImage(d);null!=k&&(g+=k.width+8);k=this.cellRenderer.getLabelValue(d);null!=k&&0<k.length?(this.isHtmlLabel(d.cell)||(k=
-mxUtils.htmlEntities(k,!1)),k=k.replace(/\n/g,"<br>"),f=mxUtils.getSizeForString(k,f,e[mxConstants.STYLE_FONTFAMILY],b,e[mxConstants.STYLE_FONTSTYLE]),d=f.width+g,c=f.height+c,mxUtils.getValue(e,mxConstants.STYLE_HORIZONTAL,!0)||(e=c,c=d,d=e),this.gridEnabled&&(d=this.snap(d+this.gridSize/2),c=this.snap(c+this.gridSize/2)),c=new mxRectangle(0,0,d,c)):(e=4*this.gridSize,c=new mxRectangle(0,0,e,e))}}return c};mxGraph.prototype.resizeCell=function(a,b,c){return this.resizeCells([a],[b],c)[0]};
-mxGraph.prototype.resizeCells=function(a,b,c){c=null!=c?c:this.isRecursiveResize();this.model.beginUpdate();try{var d=this.cellsResized(a,b,c);this.fireEvent(new mxEventObject(mxEvent.RESIZE_CELLS,"cells",a,"bounds",b,"previous",d))}finally{this.model.endUpdate()}return a};
-mxGraph.prototype.cellsResized=function(a,b,c){c=null!=c?c:!1;var d=[];if(null!=a&&null!=b&&a.length==b.length){this.model.beginUpdate();try{for(var e=0;e<a.length;e++)d.push(this.cellResized(a[e],b[e],!1,c)),this.isExtendParent(a[e])&&this.extendParent(a[e]),this.constrainChild(a[e]);this.resetEdgesOnResize&&this.resetEdges(a);this.fireEvent(new mxEventObject(mxEvent.CELLS_RESIZED,"cells",a,"bounds",b,"previous",d))}finally{this.model.endUpdate()}}return d};
-mxGraph.prototype.cellResized=function(a,b,c,d){var e=this.model.getGeometry(a);if(null!=e&&(e.x!=b.x||e.y!=b.y||e.width!=b.width||e.height!=b.height)){var f=e.clone();!c&&f.relative?(c=f.offset,null!=c&&(c.x+=b.x-f.x,c.y+=b.y-f.y)):(f.x=b.x,f.y=b.y);f.width=b.width;f.height=b.height;f.relative||!this.model.isVertex(a)||this.isAllowNegativeCoordinates()||(f.x=Math.max(0,f.x),f.y=Math.max(0,f.y));this.model.beginUpdate();try{d&&this.resizeChildCells(a,f),this.model.setGeometry(a,f),this.constrainChildCells(a)}finally{this.model.endUpdate()}}return e};
-mxGraph.prototype.resizeChildCells=function(a,b){for(var c=this.model.getGeometry(a),d=0!=c.width?b.width/c.width:1,c=0!=c.height?b.height/c.height:1,e=this.model.getChildCount(a),f=0;f<e;f++)this.scaleCell(this.model.getChildAt(a,f),d,c,!0)};mxGraph.prototype.constrainChildCells=function(a){for(var b=this.model.getChildCount(a),c=0;c<b;c++)this.constrainChild(this.model.getChildAt(a,c))};
-mxGraph.prototype.scaleCell=function(a,b,c,d){var e=this.model.getGeometry(a);if(null!=e){var f=this.getCurrentCellStyle(a),e=e.clone(),g=e.x,k=e.y,l=e.width,m=e.height;e.scale(b,c,"fixed"==f[mxConstants.STYLE_ASPECT]);"1"==f[mxConstants.STYLE_RESIZE_WIDTH]?e.width=l*b:"0"==f[mxConstants.STYLE_RESIZE_WIDTH]&&(e.width=l);"1"==f[mxConstants.STYLE_RESIZE_HEIGHT]?e.height=m*c:"0"==f[mxConstants.STYLE_RESIZE_HEIGHT]&&(e.height=m);this.isCellMovable(a)||(e.x=g,e.y=k);this.isCellResizable(a)||(e.width=l,
-e.height=m);this.model.isVertex(a)?this.cellResized(a,e,!0,d):this.model.setGeometry(a,e)}};mxGraph.prototype.extendParent=function(a){if(null!=a){var b=this.model.getParent(a),c=this.getCellGeometry(b);null==b||null==c||this.isCellCollapsed(b)||(a=this.getCellGeometry(a),null!=a&&!a.relative&&(c.width<a.x+a.width||c.height<a.y+a.height)&&(c=c.clone(),c.width=Math.max(c.width,a.x+a.width),c.height=Math.max(c.height,a.y+a.height),this.cellsResized([b],[c],!1)))}};
-mxGraph.prototype.importCells=function(a,b,c,d,e,f){return this.moveCells(a,b,c,!0,d,e,f)};
-mxGraph.prototype.moveCells=function(a,b,c,d,e,f,g){b=null!=b?b:0;c=null!=c?c:0;d=null!=d?d:!1;if(null!=a&&(0!=b||0!=c||d||null!=e)){var k=a=this.model.getTopmostCells(a);this.model.beginUpdate();try{for(var l=new mxDictionary,m=0;m<a.length;m++)l.put(a[m],!0);for(var n=mxUtils.bind(this,function(a){for(;null!=a;){if(l.get(a))return!0;a=this.model.getParent(a)}return!1}),p=[],m=0;m<a.length;m++){var q=this.getCellGeometry(a[m]),r=this.model.getParent(a[m]);null!=q&&q.relative&&this.model.isEdge(r)&&
-(n(this.model.getTerminal(r,!0))||n(this.model.getTerminal(r,!1)))||p.push(a[m])}a=p;d&&(a=this.cloneCells(a,this.isCloneInvalidEdges(),g),null==e&&(e=this.getDefaultParent()));var t=this.isAllowNegativeCoordinates();null!=e&&this.setAllowNegativeCoordinates(!0);this.cellsMoved(a,b,c,!d&&this.isDisconnectOnMove()&&this.isAllowDanglingEdges(),null==e,this.isExtendParentsOnMove()&&null==e);this.setAllowNegativeCoordinates(t);if(null!=e){var u=this.model.getChildCount(e);this.cellsAdded(a,e,u,null,null,
-!0);if(d)for(m=0;m<a.length;m++)q=this.getCellGeometry(a[m]),r=this.model.getParent(k[m]),null!=q&&q.relative&&this.model.isEdge(r)&&this.model.contains(r)&&this.model.add(r,a[m])}this.fireEvent(new mxEventObject(mxEvent.MOVE_CELLS,"cells",a,"dx",b,"dy",c,"clone",d,"target",e,"event",f))}finally{this.model.endUpdate()}}return a};
-mxGraph.prototype.cellsMoved=function(a,b,c,d,e,f){if(null!=a&&(0!=b||0!=c)){f=null!=f?f:!1;this.model.beginUpdate();try{d&&this.disconnectGraph(a);for(var g=0;g<a.length;g++)this.translateCell(a[g],b,c),f&&this.isExtendParent(a[g])?this.extendParent(a[g]):e&&this.constrainChild(a[g]);this.resetEdgesOnMove&&this.resetEdges(a);this.fireEvent(new mxEventObject(mxEvent.CELLS_MOVED,"cells",a,"dx",b,"dy",c,"disconnect",d))}finally{this.model.endUpdate()}}};
-mxGraph.prototype.translateCell=function(a,b,c){var d=this.model.getGeometry(a);if(null!=d){b=parseFloat(b);c=parseFloat(c);d=d.clone();d.translate(b,c);d.relative||!this.model.isVertex(a)||this.isAllowNegativeCoordinates()||(d.x=Math.max(0,parseFloat(d.x)),d.y=Math.max(0,parseFloat(d.y)));if(d.relative&&!this.model.isEdge(a)){var e=this.model.getParent(a),f=0;this.model.isVertex(e)&&(e=this.getCurrentCellStyle(e),f=mxUtils.getValue(e,mxConstants.STYLE_ROTATION,0));0!=f&&(f=mxUtils.toRadians(-f),
-e=Math.cos(f),f=Math.sin(f),c=mxUtils.getRotatedPoint(new mxPoint(b,c),e,f,new mxPoint(0,0)),b=c.x,c=c.y);null==d.offset?d.offset=new mxPoint(b,c):(d.offset.x=parseFloat(d.offset.x)+b,d.offset.y=parseFloat(d.offset.y)+c)}this.model.setGeometry(a,d)}};
-mxGraph.prototype.getCellContainmentArea=function(a){if(null!=a&&!this.model.isEdge(a)){var b=this.model.getParent(a);if(null!=b&&b!=this.getDefaultParent()){var c=this.model.getGeometry(b);if(null!=c){var d=a=0,e=c.width,c=c.height;if(this.isSwimlane(b)){var f=this.getStartSize(b),g=this.getCurrentCellStyle(b),b=mxUtils.getValue(g,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST),k=1==mxUtils.getValue(g,mxConstants.STYLE_FLIPH,0),g=1==mxUtils.getValue(g,mxConstants.STYLE_FLIPV,0);if(b==mxConstants.DIRECTION_SOUTH||
-b==mxConstants.DIRECTION_NORTH){var l=f.width;f.width=f.height;f.height=l}if(b==mxConstants.DIRECTION_EAST&&!g||b==mxConstants.DIRECTION_NORTH&&!k||b==mxConstants.DIRECTION_WEST&&g||b==mxConstants.DIRECTION_SOUTH&&k)a=f.width,d=f.height;e-=f.width;c-=f.height}return new mxRectangle(a,d,e,c)}}}return null};mxGraph.prototype.getMaximumGraphBounds=function(){return this.maximumGraphBounds};
-mxGraph.prototype.constrainChild=function(a,b){if(null!=a){var c=this.getCellGeometry(a);if(null!=c&&(this.isConstrainRelativeChildren()||!c.relative)){var d=this.model.getParent(a);this.getCellGeometry(d);var e=this.getMaximumGraphBounds();null!=e&&(d=this.getBoundingBoxFromGeometry([d],!1),null!=d&&(e=mxRectangle.fromRectangle(e),e.x-=d.x,e.y-=d.y));if(this.isConstrainChild(a)&&(d=this.getCellContainmentArea(a),null!=d)){var f=this.getOverlap(a);0<f&&(d=mxRectangle.fromRectangle(d),d.x-=d.width*
-f,d.y-=d.height*f,d.width+=2*d.width*f,d.height+=2*d.height*f);null==e?e=d:(e=mxRectangle.fromRectangle(e),e.intersect(d))}if(null!=e){d=[a];if(!this.isCellCollapsed(a))for(var f=this.model.getDescendants(a),g=0;g<f.length;g++)this.isCellVisible(f[g])&&d.push(f[g]);d=this.getBoundingBoxFromGeometry(d,!1);if(null!=d){c=c.clone();f=0;c.width>e.width&&(f=c.width-e.width,c.width-=f);d.x+d.width>e.x+e.width&&(f-=d.x+d.width-e.x-e.width-f);g=0;c.height>e.height&&(g=c.height-e.height,c.height-=g);d.y+d.height>
-e.y+e.height&&(g-=d.y+d.height-e.y-e.height-g);d.x<e.x&&(f-=d.x-e.x);d.y<e.y&&(g-=d.y-e.y);if(0!=f||0!=g)c.relative?(null==c.offset&&(c.offset=new mxPoint),c.offset.x+=f,c.offset.y+=g):(c.x+=f,c.y+=g);this.model.setGeometry(a,c)}}}}};
-mxGraph.prototype.resetEdges=function(a){if(null!=a){for(var b=new mxDictionary,c=0;c<a.length;c++)b.put(a[c],!0);this.model.beginUpdate();try{for(c=0;c<a.length;c++){var d=this.model.getEdges(a[c]);if(null!=d)for(var e=0;e<d.length;e++){var f=this.view.getState(d[e]),g=null!=f?f.getVisibleTerminal(!0):this.view.getVisibleTerminal(d[e],!0),k=null!=f?f.getVisibleTerminal(!1):this.view.getVisibleTerminal(d[e],!1);b.get(g)&&b.get(k)||this.resetEdge(d[e])}this.resetEdges(this.model.getChildren(a[c]))}}finally{this.model.endUpdate()}}};
-mxGraph.prototype.resetEdge=function(a){var b=this.model.getGeometry(a);null!=b&&null!=b.points&&0<b.points.length&&(b=b.clone(),b.points=[],this.model.setGeometry(a,b));return a};
-mxGraph.prototype.getOutlineConstraint=function(a,b,c){if(null!=b.shape){c=this.view.getPerimeterBounds(b);var d=b.style[mxConstants.STYLE_DIRECTION];if(d==mxConstants.DIRECTION_NORTH||d==mxConstants.DIRECTION_SOUTH){c.x+=c.width/2-c.height/2;c.y+=c.height/2-c.width/2;var e=c.width;c.width=c.height;c.height=e}var f=mxUtils.toRadians(b.shape.getShapeRotation());if(0!=f){var e=Math.cos(-f),f=Math.sin(-f),g=new mxPoint(c.getCenterX(),c.getCenterY());a=mxUtils.getRotatedPoint(a,e,f,g)}var g=f=1,k=0,l=
-0;if(this.getModel().isVertex(b.cell)){var m=b.style[mxConstants.STYLE_FLIPH],n=b.style[mxConstants.STYLE_FLIPV];null!=b.shape&&null!=b.shape.stencil&&(m=1==mxUtils.getValue(b.style,"stencilFlipH",0)||m,n=1==mxUtils.getValue(b.style,"stencilFlipV",0)||n);if(d==mxConstants.DIRECTION_NORTH||d==mxConstants.DIRECTION_SOUTH)e=m,m=n,n=e;m&&(f=-1,k=-c.width);n&&(g=-1,l=-c.height)}a=new mxPoint((a.x-c.x)*f-k+c.x,(a.y-c.y)*g-l+c.y);return new mxConnectionConstraint(new mxPoint(0==c.width?0:Math.round(1E3*
-(a.x-c.x)/c.width)/1E3,0==c.height?0:Math.round(1E3*(a.y-c.y)/c.height)/1E3),!1)}return null};mxGraph.prototype.getAllConnectionConstraints=function(a,b){return null!=a&&null!=a.shape&&null!=a.shape.stencil?a.shape.stencil.constraints:null};
-mxGraph.prototype.getConnectionConstraint=function(a,b,c){b=null;var d=a.style[c?mxConstants.STYLE_EXIT_X:mxConstants.STYLE_ENTRY_X];if(null!=d){var e=a.style[c?mxConstants.STYLE_EXIT_Y:mxConstants.STYLE_ENTRY_Y];null!=e&&(b=new mxPoint(parseFloat(d),parseFloat(e)))}var d=!1,f=e=0;null!=b&&(d=mxUtils.getValue(a.style,c?mxConstants.STYLE_EXIT_PERIMETER:mxConstants.STYLE_ENTRY_PERIMETER,!0),e=parseFloat(a.style[c?mxConstants.STYLE_EXIT_DX:mxConstants.STYLE_ENTRY_DX]),f=parseFloat(a.style[c?mxConstants.STYLE_EXIT_DY:
-mxConstants.STYLE_ENTRY_DY]),e=isFinite(e)?e:0,f=isFinite(f)?f:0);return new mxConnectionConstraint(b,d,null,e,f)};
-mxGraph.prototype.setConnectionConstraint=function(a,b,c,d){if(null!=d){this.model.beginUpdate();try{null==d||null==d.point?(this.setCellStyles(c?mxConstants.STYLE_EXIT_X:mxConstants.STYLE_ENTRY_X,null,[a]),this.setCellStyles(c?mxConstants.STYLE_EXIT_Y:mxConstants.STYLE_ENTRY_Y,null,[a]),this.setCellStyles(c?mxConstants.STYLE_EXIT_DX:mxConstants.STYLE_ENTRY_DX,null,[a]),this.setCellStyles(c?mxConstants.STYLE_EXIT_DY:mxConstants.STYLE_ENTRY_DY,null,[a]),this.setCellStyles(c?mxConstants.STYLE_EXIT_PERIMETER:
-mxConstants.STYLE_ENTRY_PERIMETER,null,[a])):null!=d.point&&(this.setCellStyles(c?mxConstants.STYLE_EXIT_X:mxConstants.STYLE_ENTRY_X,d.point.x,[a]),this.setCellStyles(c?mxConstants.STYLE_EXIT_Y:mxConstants.STYLE_ENTRY_Y,d.point.y,[a]),this.setCellStyles(c?mxConstants.STYLE_EXIT_DX:mxConstants.STYLE_ENTRY_DX,d.dx,[a]),this.setCellStyles(c?mxConstants.STYLE_EXIT_DY:mxConstants.STYLE_ENTRY_DY,d.dy,[a]),d.perimeter?this.setCellStyles(c?mxConstants.STYLE_EXIT_PERIMETER:mxConstants.STYLE_ENTRY_PERIMETER,
-null,[a]):this.setCellStyles(c?mxConstants.STYLE_EXIT_PERIMETER:mxConstants.STYLE_ENTRY_PERIMETER,"0",[a]))}finally{this.model.endUpdate()}}};
-mxGraph.prototype.getConnectionPoint=function(a,b,c){c=null!=c?c:!0;var d=null;if(null!=a&&null!=b.point){var e=this.view.getPerimeterBounds(a),f=new mxPoint(e.getCenterX(),e.getCenterY()),g=a.style[mxConstants.STYLE_DIRECTION],k=0;null!=g&&1==mxUtils.getValue(a.style,mxConstants.STYLE_ANCHOR_POINT_DIRECTION,1)&&(g==mxConstants.DIRECTION_NORTH?k+=270:g==mxConstants.DIRECTION_WEST?k+=180:g==mxConstants.DIRECTION_SOUTH&&(k+=90),g!=mxConstants.DIRECTION_NORTH&&g!=mxConstants.DIRECTION_SOUTH||e.rotate90());
-var d=this.view.scale,d=new mxPoint(e.x+b.point.x*e.width+b.dx*d,e.y+b.point.y*e.height+b.dy*d),l=a.style[mxConstants.STYLE_ROTATION]||0;if(b.perimeter)0!=k&&(g=e=0,90==k?g=1:180==k?e=-1:270==k&&(g=-1),d=mxUtils.getRotatedPoint(d,e,g,f)),d=this.view.getPerimeterPoint(a,d,!1);else if(l+=k,this.getModel().isVertex(a.cell)){k=1==a.style[mxConstants.STYLE_FLIPH];b=1==a.style[mxConstants.STYLE_FLIPV];null!=a.shape&&null!=a.shape.stencil&&(k=1==mxUtils.getValue(a.style,"stencilFlipH",0)||k,b=1==mxUtils.getValue(a.style,
-"stencilFlipV",0)||b);if(g==mxConstants.DIRECTION_NORTH||g==mxConstants.DIRECTION_SOUTH)a=k,k=b,b=a;k&&(d.x=2*e.getCenterX()-d.x);b&&(d.y=2*e.getCenterY()-d.y)}0!=l&&null!=d&&(a=mxUtils.toRadians(l),e=Math.cos(a),g=Math.sin(a),d=mxUtils.getRotatedPoint(d,e,g,f))}c&&null!=d&&(d.x=Math.round(d.x),d.y=Math.round(d.y));return d};
-mxGraph.prototype.connectCell=function(a,b,c,d){this.model.beginUpdate();try{var e=this.model.getTerminal(a,c);this.cellConnected(a,b,c,d);this.fireEvent(new mxEventObject(mxEvent.CONNECT_CELL,"edge",a,"terminal",b,"source",c,"previous",e))}finally{this.model.endUpdate()}return a};
-mxGraph.prototype.cellConnected=function(a,b,c,d){if(null!=a){this.model.beginUpdate();try{var e=this.model.getTerminal(a,c);this.setConnectionConstraint(a,b,c,d);this.isPortsEnabled()&&(d=null,this.isPort(b)&&(d=b.getId(),b=this.getTerminalForPort(b,c)),this.setCellStyles(c?mxConstants.STYLE_SOURCE_PORT:mxConstants.STYLE_TARGET_PORT,d,[a]));this.model.setTerminal(a,b,c);this.resetEdgesOnConnect&&this.resetEdge(a);this.fireEvent(new mxEventObject(mxEvent.CELL_CONNECTED,"edge",a,"terminal",b,"source",
-c,"previous",e))}finally{this.model.endUpdate()}}};
-mxGraph.prototype.disconnectGraph=function(a){if(null!=a){this.model.beginUpdate();try{for(var b=this.view.scale,c=this.view.translate,d=new mxDictionary,e=0;e<a.length;e++)d.put(a[e],!0);for(e=0;e<a.length;e++)if(this.model.isEdge(a[e])){var f=this.model.getGeometry(a[e]);if(null!=f){var g=this.view.getState(a[e]),k=this.view.getState(this.model.getParent(a[e]));if(null!=g&&null!=k){var f=f.clone(),l=-k.origin.x,m=-k.origin.y,n=g.absolutePoints,p=this.model.getTerminal(a[e],!0);if(null!=p&&this.isCellDisconnectable(a[e],
-p,!0)){for(;null!=p&&!d.get(p);)p=this.model.getParent(p);null==p&&(f.setTerminalPoint(new mxPoint(n[0].x/b-c.x+l,n[0].y/b-c.y+m),!0),this.model.setTerminal(a[e],null,!0))}var q=this.model.getTerminal(a[e],!1);if(null!=q&&this.isCellDisconnectable(a[e],q,!1)){for(;null!=q&&!d.get(q);)q=this.model.getParent(q);if(null==q){var r=n.length-1;f.setTerminalPoint(new mxPoint(n[r].x/b-c.x+l,n[r].y/b-c.y+m),!1);this.model.setTerminal(a[e],null,!1)}}this.model.setGeometry(a[e],f)}}}}finally{this.model.endUpdate()}}};
-mxGraph.prototype.getCurrentRoot=function(){return this.view.currentRoot};mxGraph.prototype.getTranslateForRoot=function(a){return null};mxGraph.prototype.isPort=function(a){return!1};mxGraph.prototype.getTerminalForPort=function(a,b){return this.model.getParent(a)};mxGraph.prototype.getChildOffsetForCell=function(a){return null};mxGraph.prototype.enterGroup=function(a){a=a||this.getSelectionCell();null!=a&&this.isValidRoot(a)&&(this.view.setCurrentRoot(a),this.clearSelection())};
-mxGraph.prototype.exitGroup=function(){var a=this.model.getRoot(),b=this.getCurrentRoot();if(null!=b){for(var c=this.model.getParent(b);c!=a&&!this.isValidRoot(c)&&this.model.getParent(c)!=a;)c=this.model.getParent(c);c==a||this.model.getParent(c)==a?this.view.setCurrentRoot(null):this.view.setCurrentRoot(c);null!=this.view.getState(b)&&this.setSelectionCell(b)}};mxGraph.prototype.home=function(){var a=this.getCurrentRoot();null!=a&&(this.view.setCurrentRoot(null),null!=this.view.getState(a)&&this.setSelectionCell(a))};
-mxGraph.prototype.isValidRoot=function(a){return null!=a};mxGraph.prototype.getGraphBounds=function(){return this.view.getGraphBounds()};mxGraph.prototype.getCellBounds=function(a,b,c){var d=[a];b&&(d=d.concat(this.model.getEdges(a)));d=this.view.getBounds(d);if(c){c=this.model.getChildCount(a);for(var e=0;e<c;e++){var f=this.getCellBounds(this.model.getChildAt(a,e),b,!0);null!=d?d.add(f):d=f}}return d};
-mxGraph.prototype.getBoundingBoxFromGeometry=function(a,b){b=null!=b?b:!1;var c=null;if(null!=a)for(var d=0;d<a.length;d++)if(b||this.model.isVertex(a[d])){var e=this.getCellGeometry(a[d]);if(null!=e){var f=null;if(this.model.isEdge(a[d])){f=function(a){null!=a&&(null==g?g=new mxRectangle(a.x,a.y,0,0):g.add(new mxRectangle(a.x,a.y,0,0)))};null==this.model.getTerminal(a[d],!0)&&f(e.getTerminalPoint(!0));null==this.model.getTerminal(a[d],!1)&&f(e.getTerminalPoint(!1));e=e.points;if(null!=e&&0<e.length)for(var g=
-new mxRectangle(e[0].x,e[0].y,0,0),k=1;k<e.length;k++)f(e[k]);f=g}else k=this.model.getParent(a[d]),e.relative?this.model.isVertex(k)&&k!=this.view.currentRoot&&(g=this.getBoundingBoxFromGeometry([k],!1),null!=g&&(f=new mxRectangle(e.x*g.width,e.y*g.height,e.width,e.height),0<=mxUtils.indexOf(a,k)&&(f.x+=g.x,f.y+=g.y))):(f=mxRectangle.fromRectangle(e),this.model.isVertex(k)&&0<=mxUtils.indexOf(a,k)&&(g=this.getBoundingBoxFromGeometry([k],!1),null!=g&&(f.x+=g.x,f.y+=g.y))),null!=f&&null!=e.offset&&
-(f.x+=e.offset.x,f.y+=e.offset.y),e=this.getCurrentCellStyle(a[d]),null!=f&&(e=mxUtils.getValue(e,mxConstants.STYLE_ROTATION,0),0!=e&&(f=mxUtils.getBoundingBox(f,e)));null!=f&&(null==c?c=mxRectangle.fromRectangle(f):c.add(f))}}return c};mxGraph.prototype.refresh=function(a){this.view.clear(a,null==a);this.view.validate();this.sizeDidChange();this.fireEvent(new mxEventObject(mxEvent.REFRESH))};mxGraph.prototype.snap=function(a){this.gridEnabled&&(a=Math.round(a/this.gridSize)*this.gridSize);return a};
-mxGraph.prototype.snapDelta=function(a,b,c,d,e){var f=this.view.translate,g=this.view.scale;!c&&this.gridEnabled?(c=this.gridSize*g*.5,d||(d=b.x-(this.snap(b.x/g-f.x)+f.x)*g,a.x=Math.abs(a.x-d)<c?0:this.snap(a.x/g)*g-d),e||(b=b.y-(this.snap(b.y/g-f.y)+f.y)*g,a.y=Math.abs(a.y-b)<c?0:this.snap(a.y/g)*g-b)):(c=.5*g,d||(d=b.x-(Math.round(b.x/g-f.x)+f.x)*g,a.x=Math.abs(a.x-d)<c?0:Math.round(a.x/g)*g-d),e||(b=b.y-(Math.round(b.y/g-f.y)+f.y)*g,a.y=Math.abs(a.y-b)<c?0:Math.round(a.y/g)*g-b));return a};
-mxGraph.prototype.panGraph=function(a,b){if(this.useScrollbarsForPanning&&mxUtils.hasScrollbars(this.container))this.container.scrollLeft=-a,this.container.scrollTop=-b;else{var c=this.view.getCanvas();if(this.dialect==mxConstants.DIALECT_SVG)if(0==a&&0==b){if(mxClient.IS_IE?c.setAttribute("transform","translate("+a+","+b+")"):c.removeAttribute("transform"),null!=this.shiftPreview1){for(var d=this.shiftPreview1.firstChild;null!=d;){var e=d.nextSibling;this.container.appendChild(d);d=e}null!=this.shiftPreview1.parentNode&&
-this.shiftPreview1.parentNode.removeChild(this.shiftPreview1);this.shiftPreview1=null;this.container.appendChild(c.parentNode);for(d=this.shiftPreview2.firstChild;null!=d;)e=d.nextSibling,this.container.appendChild(d),d=e;null!=this.shiftPreview2.parentNode&&this.shiftPreview2.parentNode.removeChild(this.shiftPreview2);this.shiftPreview2=null}}else{c.setAttribute("transform","translate("+a+","+b+")");if(null==this.shiftPreview1){this.shiftPreview1=document.createElement("div");this.shiftPreview1.style.position=
-"absolute";this.shiftPreview1.style.overflow="visible";this.shiftPreview2=document.createElement("div");this.shiftPreview2.style.position="absolute";this.shiftPreview2.style.overflow="visible";for(var f=this.shiftPreview1,d=this.container.firstChild;null!=d;)e=d.nextSibling,d!=c.parentNode?f.appendChild(d):f=this.shiftPreview2,d=e;null!=this.shiftPreview1.firstChild&&this.container.insertBefore(this.shiftPreview1,c.parentNode);null!=this.shiftPreview2.firstChild&&this.container.appendChild(this.shiftPreview2)}this.shiftPreview1.style.left=
-a+"px";this.shiftPreview1.style.top=b+"px";this.shiftPreview2.style.left=a+"px";this.shiftPreview2.style.top=b+"px"}else c.style.left=a+"px",c.style.top=b+"px";this.panDx=a;this.panDy=b;this.fireEvent(new mxEventObject(mxEvent.PAN))}};mxGraph.prototype.zoomIn=function(){this.zoom(this.zoomFactor)};mxGraph.prototype.zoomOut=function(){this.zoom(1/this.zoomFactor)};
-mxGraph.prototype.zoomActual=function(){1==this.view.scale?this.view.setTranslate(0,0):(this.view.translate.x=0,this.view.translate.y=0,this.view.setScale(1))};mxGraph.prototype.zoomTo=function(a,b){this.zoom(a/this.view.scale,b)};
-mxGraph.prototype.center=function(a,b,c,d){a=null!=a?a:!0;b=null!=b?b:!0;c=null!=c?c:.5;d=null!=d?d:.5;var e=mxUtils.hasScrollbars(this.container),f=2*this.getBorder(),g=this.container.clientWidth-f,f=this.container.clientHeight-f,k=this.getGraphBounds(),l=this.view.translate,m=this.view.scale,n=a?g-k.width:0,p=b?f-k.height:0;e?(k.x-=l.x,k.y-=l.y,a=this.container.scrollWidth,b=this.container.scrollHeight,a>g&&(n=0),b>f&&(p=0),this.view.setTranslate(Math.floor(n/2-k.x),Math.floor(p/2-k.y)),this.container.scrollLeft=
-(a-g)/2,this.container.scrollTop=(b-f)/2):this.view.setTranslate(a?Math.floor(l.x-k.x/m+n*c/m):l.x,b?Math.floor(l.y-k.y/m+p*d/m):l.y)};
-mxGraph.prototype.zoom=function(a,b){b=null!=b?b:this.centerZoom;var c=Math.round(this.view.scale*a*100)/100,d=this.view.getState(this.getSelectionCell());a=c/this.view.scale;if(this.keepSelectionVisibleOnZoom&&null!=d)d=new mxRectangle(d.x*a,d.y*a,d.width*a,d.height*a),this.view.scale=c,this.scrollRectToVisible(d)||(this.view.revalidate(),this.view.setScale(c));else if(d=mxUtils.hasScrollbars(this.container),b&&!d){var d=this.container.offsetWidth,e=this.container.offsetHeight;if(1<a)var f=(a-1)/
-(2*c),d=d*-f,e=e*-f;else f=(1/a-1)/(2*this.view.scale),d*=f,e*=f;this.view.scaleAndTranslate(c,this.view.translate.x+d,this.view.translate.y+e)}else{var f=this.view.translate.x,g=this.view.translate.y,k=this.container.scrollLeft,l=this.container.scrollTop;this.view.setScale(c);d&&(e=d=0,b&&(d=this.container.offsetWidth*(a-1)/2,e=this.container.offsetHeight*(a-1)/2),this.container.scrollLeft=(this.view.translate.x-f)*this.view.scale+Math.round(k*a+d),this.container.scrollTop=(this.view.translate.y-
-g)*this.view.scale+Math.round(l*a+e))}};
-mxGraph.prototype.zoomToRect=function(a){var b=this.container.clientWidth/a.width/(this.container.clientHeight/a.height);a.x=Math.max(0,a.x);a.y=Math.max(0,a.y);var c=Math.min(this.container.scrollWidth,a.x+a.width),d=Math.min(this.container.scrollHeight,a.y+a.height);a.width=c-a.x;a.height=d-a.y;1>b?(b=a.height/b,c=(b-a.height)/2,a.height=b,a.y-=Math.min(a.y,c),d=Math.min(this.container.scrollHeight,a.y+a.height),a.height=d-a.y):(b*=a.width,c=(b-a.width)/2,a.width=b,a.x-=Math.min(a.x,c),c=Math.min(this.container.scrollWidth,
-a.x+a.width),a.width=c-a.x);b=this.container.clientWidth/a.width;c=this.view.scale*b;mxUtils.hasScrollbars(this.container)?(this.view.setScale(c),this.container.scrollLeft=Math.round(a.x*b),this.container.scrollTop=Math.round(a.y*b)):this.view.scaleAndTranslate(c,this.view.translate.x-a.x/this.view.scale,this.view.translate.y-a.y/this.view.scale)};
-mxGraph.prototype.scrollCellToVisible=function(a,b){var c=-this.view.translate.x,d=-this.view.translate.y,e=this.view.getState(a);null!=e&&(c=new mxRectangle(c+e.x,d+e.y,e.width,e.height),b&&null!=this.container&&(d=this.container.clientWidth,e=this.container.clientHeight,c.x=c.getCenterX()-d/2,c.width=d,c.y=c.getCenterY()-e/2,c.height=e),d=new mxPoint(this.view.translate.x,this.view.translate.y),this.scrollRectToVisible(c)&&(c=new mxPoint(this.view.translate.x,this.view.translate.y),this.view.translate.x=
-d.x,this.view.translate.y=d.y,this.view.setTranslate(c.x,c.y)))};
-mxGraph.prototype.scrollRectToVisible=function(a){var b=!1;if(null!=a){var c=this.container.offsetWidth,d=this.container.offsetHeight,e=Math.min(c,a.width),f=Math.min(d,a.height);if(mxUtils.hasScrollbars(this.container)){c=this.container;a.x+=this.view.translate.x;a.y+=this.view.translate.y;var g=c.scrollLeft-a.x,d=Math.max(g-c.scrollLeft,0);0<g?c.scrollLeft-=g+2:(g=a.x+e-c.scrollLeft-c.clientWidth,0<g&&(c.scrollLeft+=g+2));e=c.scrollTop-a.y;g=Math.max(0,e-c.scrollTop);0<e?c.scrollTop-=e+2:(e=a.y+
-f-c.scrollTop-c.clientHeight,0<e&&(c.scrollTop+=e+2));this.useScrollbarsForPanning||0==d&&0==g||this.view.setTranslate(d,g)}else{var g=-this.view.translate.x,k=-this.view.translate.y,l=this.view.scale;a.x+e>g+c&&(this.view.translate.x-=(a.x+e-c-g)/l,b=!0);a.y+f>k+d&&(this.view.translate.y-=(a.y+f-d-k)/l,b=!0);a.x<g&&(this.view.translate.x+=(g-a.x)/l,b=!0);a.y<k&&(this.view.translate.y+=(k-a.y)/l,b=!0);b&&(this.view.refresh(),null!=this.selectionCellsHandler&&this.selectionCellsHandler.refresh())}}return b};
-mxGraph.prototype.getCellGeometry=function(a){return this.model.getGeometry(a)};mxGraph.prototype.isCellVisible=function(a){return this.model.isVisible(a)};mxGraph.prototype.isCellCollapsed=function(a){return this.model.isCollapsed(a)};mxGraph.prototype.isCellConnectable=function(a){return this.model.isConnectable(a)};
-mxGraph.prototype.isOrthogonal=function(a){var b=a.style[mxConstants.STYLE_ORTHOGONAL];if(null!=b)return b;a=this.view.getEdgeStyle(a);return a==mxEdgeStyle.SegmentConnector||a==mxEdgeStyle.ElbowConnector||a==mxEdgeStyle.SideToSide||a==mxEdgeStyle.TopToBottom||a==mxEdgeStyle.EntityRelation||a==mxEdgeStyle.OrthConnector};mxGraph.prototype.isLoop=function(a){var b=a.getVisibleTerminalState(!0);a=a.getVisibleTerminalState(!1);return null!=b&&b==a};mxGraph.prototype.isCloneEvent=function(a){return mxEvent.isControlDown(a)};
-mxGraph.prototype.isTransparentClickEvent=function(a){return!1};mxGraph.prototype.isToggleEvent=function(a){return mxClient.IS_MAC?mxEvent.isMetaDown(a):mxEvent.isControlDown(a)};mxGraph.prototype.isGridEnabledEvent=function(a){return null!=a&&!mxEvent.isAltDown(a)};mxGraph.prototype.isConstrainedEvent=function(a){return mxEvent.isShiftDown(a)};mxGraph.prototype.isIgnoreTerminalEvent=function(a){return!1};mxGraph.prototype.validationAlert=function(a){mxUtils.alert(a)};
-mxGraph.prototype.isEdgeValid=function(a,b,c){return null==this.getEdgeValidationError(a,b,c)};
-mxGraph.prototype.getEdgeValidationError=function(a,b,c){if(null!=a&&!this.isAllowDanglingEdges()&&(null==b||null==c))return"";if(null!=a&&null==this.model.getTerminal(a,!0)&&null==this.model.getTerminal(a,!1))return null;if(!this.allowLoops&&b==c&&null!=b||!this.isValidConnection(b,c))return"";if(null!=b&&null!=c){var d="";if(!this.multigraph){var e=this.model.getEdgesBetween(b,c,!0);if(1<e.length||1==e.length&&e[0]!=a)d+=(mxResources.get(this.alreadyConnectedResource)||this.alreadyConnectedResource)+
-"\n"}var e=this.model.getDirectedEdgeCount(b,!0,a),f=this.model.getDirectedEdgeCount(c,!1,a);if(null!=this.multiplicities)for(var g=0;g<this.multiplicities.length;g++){var k=this.multiplicities[g].check(this,a,b,c,e,f);null!=k&&(d+=k)}k=this.validateEdge(a,b,c);null!=k&&(d+=k);return 0<d.length?d:null}return this.allowDanglingEdges?null:""};mxGraph.prototype.validateEdge=function(a,b,c){return null};
-mxGraph.prototype.validateGraph=function(a,b){a=null!=a?a:this.model.getRoot();b=null!=b?b:{};for(var c=!0,d=this.model.getChildCount(a),e=0;e<d;e++){var f=this.model.getChildAt(a,e),g=b;this.isValidRoot(f)&&(g={});g=this.validateGraph(f,g);null!=g?this.setCellWarning(f,g.replace(/\n/g,"<br>")):this.setCellWarning(f,null);c=c&&null==g}d="";this.isCellCollapsed(a)&&!c&&(d+=(mxResources.get(this.containsValidationErrorsResource)||this.containsValidationErrorsResource)+"\n");d=this.model.isEdge(a)?d+
-(this.getEdgeValidationError(a,this.model.getTerminal(a,!0),this.model.getTerminal(a,!1))||""):d+(this.getCellValidationError(a)||"");e=this.validateCell(a,b);null!=e&&(d+=e);null==this.model.getParent(a)&&this.view.validate();return 0<d.length||!c?d:null};
-mxGraph.prototype.getCellValidationError=function(a){var b=this.model.getDirectedEdgeCount(a,!0),c=this.model.getDirectedEdgeCount(a,!1);a=this.model.getValue(a);var d="";if(null!=this.multiplicities)for(var e=0;e<this.multiplicities.length;e++){var f=this.multiplicities[e];f.source&&mxUtils.isNode(a,f.type,f.attr,f.value)&&(b>f.max||b<f.min)?d+=f.countError+"\n":!f.source&&mxUtils.isNode(a,f.type,f.attr,f.value)&&(c>f.max||c<f.min)&&(d+=f.countError+"\n")}return 0<d.length?d:null};
-mxGraph.prototype.validateCell=function(a,b){return null};mxGraph.prototype.getBackgroundImage=function(){return this.backgroundImage};mxGraph.prototype.setBackgroundImage=function(a){this.backgroundImage=a};mxGraph.prototype.getFoldingImage=function(a){if(null!=a&&this.foldingEnabled&&!this.getModel().isEdge(a.cell)){var b=this.isCellCollapsed(a.cell);if(this.isCellFoldable(a.cell,!b))return b?this.collapsedImage:this.expandedImage}return null};
-mxGraph.prototype.convertValueToString=function(a){a=this.model.getValue(a);if(null!=a){if(mxUtils.isNode(a))return a.nodeName;if("function"==typeof a.toString)return a.toString()}return""};mxGraph.prototype.getLabel=function(a){var b="";if(this.labelsVisible&&null!=a){var c=this.getCurrentCellStyle(a);mxUtils.getValue(c,mxConstants.STYLE_NOLABEL,!1)||(b=this.convertValueToString(a))}return b};mxGraph.prototype.isHtmlLabel=function(a){return this.isHtmlLabels()};mxGraph.prototype.isHtmlLabels=function(){return this.htmlLabels};
-mxGraph.prototype.setHtmlLabels=function(a){this.htmlLabels=a};mxGraph.prototype.isWrapping=function(a){return"wrap"==this.getCurrentCellStyle(a)[mxConstants.STYLE_WHITE_SPACE]};mxGraph.prototype.isLabelClipped=function(a){return"hidden"==this.getCurrentCellStyle(a)[mxConstants.STYLE_OVERFLOW]};
-mxGraph.prototype.getTooltip=function(a,b,c,d){var e=null;null!=a&&(null==a.control||b!=a.control.node&&b.parentNode!=a.control.node||(e=this.collapseExpandResource,e=mxUtils.htmlEntities(mxResources.get(e)||e).replace(/\\n/g,"<br>")),null==e&&null!=a.overlays&&a.overlays.visit(function(a,c){null!=e||b!=c.node&&b.parentNode!=c.node||(e=c.overlay.toString())}),null==e&&(c=this.selectionCellsHandler.getHandler(a.cell),null!=c&&"function"==typeof c.getTooltipForNode&&(e=c.getTooltipForNode(b))),null==
-e&&(e=this.getTooltipForCell(a.cell)));return e};mxGraph.prototype.getTooltipForCell=function(a){return null!=a&&null!=a.getTooltip?a.getTooltip():this.convertValueToString(a)};mxGraph.prototype.getLinkForCell=function(a){return null};mxGraph.prototype.getCursorForMouseEvent=function(a){return this.getCursorForCell(a.getCell())};mxGraph.prototype.getCursorForCell=function(a){return null};
-mxGraph.prototype.getStartSize=function(a,b){var c=new mxRectangle,d=this.getCurrentCellStyle(a,b),e=parseInt(mxUtils.getValue(d,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE));mxUtils.getValue(d,mxConstants.STYLE_HORIZONTAL,!0)?c.height=e:c.width=e;return c};
-mxGraph.prototype.getSwimlaneDirection=function(a){var b=mxUtils.getValue(a,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST),c=1==mxUtils.getValue(a,mxConstants.STYLE_FLIPH,0),d=1==mxUtils.getValue(a,mxConstants.STYLE_FLIPV,0);a=mxUtils.getValue(a,mxConstants.STYLE_HORIZONTAL,!0)?0:3;b==mxConstants.DIRECTION_NORTH?a--:b==mxConstants.DIRECTION_WEST?a+=2:b==mxConstants.DIRECTION_SOUTH&&(a+=1);b=mxUtils.mod(a,2);c&&1==b&&(a+=2);d&&0==b&&(a+=2);return[mxConstants.DIRECTION_NORTH,mxConstants.DIRECTION_EAST,
-mxConstants.DIRECTION_SOUTH,mxConstants.DIRECTION_WEST][mxUtils.mod(a,4)]};mxGraph.prototype.getActualStartSize=function(a,b){var c=new mxRectangle;if(this.isSwimlane(a,b)){var d=this.getCurrentCellStyle(a,b),e=parseInt(mxUtils.getValue(d,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE)),d=this.getSwimlaneDirection(d);d==mxConstants.DIRECTION_NORTH?c.y=e:d==mxConstants.DIRECTION_WEST?c.x=e:d==mxConstants.DIRECTION_SOUTH?c.height=e:c.width=e}return c};
-mxGraph.prototype.getImage=function(a){return null!=a&&null!=a.style?a.style[mxConstants.STYLE_IMAGE]:null};mxGraph.prototype.isTransparentState=function(a){var b=!1;if(null!=a)var b=mxUtils.getValue(a.style,mxConstants.STYLE_STROKECOLOR,mxConstants.NONE),c=mxUtils.getValue(a.style,mxConstants.STYLE_FILLCOLOR,mxConstants.NONE),b=b==mxConstants.NONE&&c==mxConstants.NONE&&null==this.getImage(a);return b};
-mxGraph.prototype.getVerticalAlign=function(a){return null!=a&&null!=a.style?a.style[mxConstants.STYLE_VERTICAL_ALIGN]||mxConstants.ALIGN_MIDDLE:null};mxGraph.prototype.getIndicatorColor=function(a){return null!=a&&null!=a.style?a.style[mxConstants.STYLE_INDICATOR_COLOR]:null};mxGraph.prototype.getIndicatorGradientColor=function(a){return null!=a&&null!=a.style?a.style[mxConstants.STYLE_INDICATOR_GRADIENTCOLOR]:null};
-mxGraph.prototype.getIndicatorShape=function(a){return null!=a&&null!=a.style?a.style[mxConstants.STYLE_INDICATOR_SHAPE]:null};mxGraph.prototype.getIndicatorImage=function(a){return null!=a&&null!=a.style?a.style[mxConstants.STYLE_INDICATOR_IMAGE]:null};mxGraph.prototype.getBorder=function(){return this.border};mxGraph.prototype.setBorder=function(a){this.border=a};
-mxGraph.prototype.isSwimlane=function(a,b){return null==a||this.model.getParent(a)==this.model.getRoot()||this.model.isEdge(a)?!1:this.getCurrentCellStyle(a,b)[mxConstants.STYLE_SHAPE]==mxConstants.SHAPE_SWIMLANE};mxGraph.prototype.isResizeContainer=function(){return this.resizeContainer};mxGraph.prototype.setResizeContainer=function(a){this.resizeContainer=a};mxGraph.prototype.isEnabled=function(){return this.enabled};mxGraph.prototype.setEnabled=function(a){this.enabled=a};
-mxGraph.prototype.isEscapeEnabled=function(){return this.escapeEnabled};mxGraph.prototype.setEscapeEnabled=function(a){this.escapeEnabled=a};mxGraph.prototype.isInvokesStopCellEditing=function(){return this.invokesStopCellEditing};mxGraph.prototype.setInvokesStopCellEditing=function(a){this.invokesStopCellEditing=a};mxGraph.prototype.isEnterStopsCellEditing=function(){return this.enterStopsCellEditing};mxGraph.prototype.setEnterStopsCellEditing=function(a){this.enterStopsCellEditing=a};
-mxGraph.prototype.isCellLocked=function(a){var b=this.model.getGeometry(a);return this.isCellsLocked()||null!=b&&this.model.isVertex(a)&&b.relative};mxGraph.prototype.isCellsLocked=function(){return this.cellsLocked};mxGraph.prototype.setCellsLocked=function(a){this.cellsLocked=a};mxGraph.prototype.getCloneableCells=function(a){return this.model.filterCells(a,mxUtils.bind(this,function(a){return this.isCellCloneable(a)}))};
-mxGraph.prototype.isCellCloneable=function(a){a=this.getCurrentCellStyle(a);return this.isCellsCloneable()&&0!=a[mxConstants.STYLE_CLONEABLE]};mxGraph.prototype.isCellsCloneable=function(){return this.cellsCloneable};mxGraph.prototype.setCellsCloneable=function(a){this.cellsCloneable=a};mxGraph.prototype.getExportableCells=function(a){return this.model.filterCells(a,mxUtils.bind(this,function(a){return this.canExportCell(a)}))};mxGraph.prototype.canExportCell=function(a){return this.exportEnabled};
-mxGraph.prototype.getImportableCells=function(a){return this.model.filterCells(a,mxUtils.bind(this,function(a){return this.canImportCell(a)}))};mxGraph.prototype.canImportCell=function(a){return this.importEnabled};mxGraph.prototype.isCellSelectable=function(a){return this.isCellsSelectable()};mxGraph.prototype.isCellsSelectable=function(){return this.cellsSelectable};mxGraph.prototype.setCellsSelectable=function(a){this.cellsSelectable=a};
-mxGraph.prototype.getDeletableCells=function(a){return this.model.filterCells(a,mxUtils.bind(this,function(a){return this.isCellDeletable(a)}))};mxGraph.prototype.isCellDeletable=function(a){a=this.getCurrentCellStyle(a);return this.isCellsDeletable()&&0!=a[mxConstants.STYLE_DELETABLE]};mxGraph.prototype.isCellsDeletable=function(){return this.cellsDeletable};mxGraph.prototype.setCellsDeletable=function(a){this.cellsDeletable=a};
-mxGraph.prototype.isLabelMovable=function(a){return!this.isCellLocked(a)&&(this.model.isEdge(a)&&this.edgeLabelsMovable||this.model.isVertex(a)&&this.vertexLabelsMovable)};mxGraph.prototype.isCellRotatable=function(a){return 0!=this.getCurrentCellStyle(a)[mxConstants.STYLE_ROTATABLE]};mxGraph.prototype.getMovableCells=function(a){return this.model.filterCells(a,mxUtils.bind(this,function(a){return this.isCellMovable(a)}))};
-mxGraph.prototype.isCellMovable=function(a){var b=this.getCurrentCellStyle(a);return this.isCellsMovable()&&!this.isCellLocked(a)&&0!=b[mxConstants.STYLE_MOVABLE]};mxGraph.prototype.isCellsMovable=function(){return this.cellsMovable};mxGraph.prototype.setCellsMovable=function(a){this.cellsMovable=a};mxGraph.prototype.isGridEnabled=function(){return this.gridEnabled};mxGraph.prototype.setGridEnabled=function(a){this.gridEnabled=a};mxGraph.prototype.isPortsEnabled=function(){return this.portsEnabled};
-mxGraph.prototype.setPortsEnabled=function(a){this.portsEnabled=a};mxGraph.prototype.getGridSize=function(){return this.gridSize};mxGraph.prototype.setGridSize=function(a){this.gridSize=a};mxGraph.prototype.getTolerance=function(){return this.tolerance};mxGraph.prototype.setTolerance=function(a){this.tolerance=a};mxGraph.prototype.isVertexLabelsMovable=function(){return this.vertexLabelsMovable};mxGraph.prototype.setVertexLabelsMovable=function(a){this.vertexLabelsMovable=a};
-mxGraph.prototype.isEdgeLabelsMovable=function(){return this.edgeLabelsMovable};mxGraph.prototype.setEdgeLabelsMovable=function(a){this.edgeLabelsMovable=a};mxGraph.prototype.isSwimlaneNesting=function(){return this.swimlaneNesting};mxGraph.prototype.setSwimlaneNesting=function(a){this.swimlaneNesting=a};mxGraph.prototype.isSwimlaneSelectionEnabled=function(){return this.swimlaneSelectionEnabled};mxGraph.prototype.setSwimlaneSelectionEnabled=function(a){this.swimlaneSelectionEnabled=a};
-mxGraph.prototype.isMultigraph=function(){return this.multigraph};mxGraph.prototype.setMultigraph=function(a){this.multigraph=a};mxGraph.prototype.isAllowLoops=function(){return this.allowLoops};mxGraph.prototype.setAllowDanglingEdges=function(a){this.allowDanglingEdges=a};mxGraph.prototype.isAllowDanglingEdges=function(){return this.allowDanglingEdges};mxGraph.prototype.setConnectableEdges=function(a){this.connectableEdges=a};mxGraph.prototype.isConnectableEdges=function(){return this.connectableEdges};
-mxGraph.prototype.setCloneInvalidEdges=function(a){this.cloneInvalidEdges=a};mxGraph.prototype.isCloneInvalidEdges=function(){return this.cloneInvalidEdges};mxGraph.prototype.setAllowLoops=function(a){this.allowLoops=a};mxGraph.prototype.isDisconnectOnMove=function(){return this.disconnectOnMove};mxGraph.prototype.setDisconnectOnMove=function(a){this.disconnectOnMove=a};mxGraph.prototype.isDropEnabled=function(){return this.dropEnabled};
-mxGraph.prototype.setDropEnabled=function(a){this.dropEnabled=a};mxGraph.prototype.isSplitEnabled=function(){return this.splitEnabled};mxGraph.prototype.setSplitEnabled=function(a){this.splitEnabled=a};mxGraph.prototype.isCellResizable=function(a){var b=this.getCurrentCellStyle(a);return this.isCellsResizable()&&!this.isCellLocked(a)&&"0"!=mxUtils.getValue(b,mxConstants.STYLE_RESIZABLE,"1")};mxGraph.prototype.isCellsResizable=function(){return this.cellsResizable};
-mxGraph.prototype.setCellsResizable=function(a){this.cellsResizable=a};mxGraph.prototype.isTerminalPointMovable=function(a,b){return!0};mxGraph.prototype.isCellBendable=function(a){var b=this.getCurrentCellStyle(a);return this.isCellsBendable()&&!this.isCellLocked(a)&&0!=b[mxConstants.STYLE_BENDABLE]};mxGraph.prototype.isCellsBendable=function(){return this.cellsBendable};mxGraph.prototype.setCellsBendable=function(a){this.cellsBendable=a};
-mxGraph.prototype.isCellEditable=function(a){var b=this.getCurrentCellStyle(a);return this.isCellsEditable()&&!this.isCellLocked(a)&&0!=b[mxConstants.STYLE_EDITABLE]};mxGraph.prototype.isCellsEditable=function(){return this.cellsEditable};mxGraph.prototype.setCellsEditable=function(a){this.cellsEditable=a};mxGraph.prototype.isCellDisconnectable=function(a,b,c){return this.isCellsDisconnectable()&&!this.isCellLocked(a)};mxGraph.prototype.isCellsDisconnectable=function(){return this.cellsDisconnectable};
-mxGraph.prototype.setCellsDisconnectable=function(a){this.cellsDisconnectable=a};mxGraph.prototype.isValidSource=function(a){return null==a&&this.allowDanglingEdges||null!=a&&(!this.model.isEdge(a)||this.connectableEdges)&&this.isCellConnectable(a)};mxGraph.prototype.isValidTarget=function(a){return this.isValidSource(a)};mxGraph.prototype.isValidConnection=function(a,b){return this.isValidSource(a)&&this.isValidTarget(b)};mxGraph.prototype.setConnectable=function(a){this.connectionHandler.setEnabled(a)};
-mxGraph.prototype.isConnectable=function(){return this.connectionHandler.isEnabled()};mxGraph.prototype.setTooltips=function(a){this.tooltipHandler.setEnabled(a)};mxGraph.prototype.setPanning=function(a){this.panningHandler.panningEnabled=a};mxGraph.prototype.isEditing=function(a){if(null!=this.cellEditor){var b=this.cellEditor.getEditingCell();return null==a?null!=b:a==b}return!1};mxGraph.prototype.isAutoSizeCell=function(a){a=this.getCurrentCellStyle(a);return this.isAutoSizeCells()||1==a[mxConstants.STYLE_AUTOSIZE]};
-mxGraph.prototype.isAutoSizeCells=function(){return this.autoSizeCells};mxGraph.prototype.setAutoSizeCells=function(a){this.autoSizeCells=a};mxGraph.prototype.isExtendParent=function(a){return!this.getModel().isEdge(a)&&this.isExtendParents()};mxGraph.prototype.isExtendParents=function(){return this.extendParents};mxGraph.prototype.setExtendParents=function(a){this.extendParents=a};mxGraph.prototype.isExtendParentsOnAdd=function(a){return this.extendParentsOnAdd};
-mxGraph.prototype.setExtendParentsOnAdd=function(a){this.extendParentsOnAdd=a};mxGraph.prototype.isExtendParentsOnMove=function(){return this.extendParentsOnMove};mxGraph.prototype.setExtendParentsOnMove=function(a){this.extendParentsOnMove=a};mxGraph.prototype.isRecursiveResize=function(a){return this.recursiveResize};mxGraph.prototype.setRecursiveResize=function(a){this.recursiveResize=a};mxGraph.prototype.isConstrainChild=function(a){return this.isConstrainChildren()&&!this.getModel().isEdge(this.getModel().getParent(a))};
-mxGraph.prototype.isConstrainChildren=function(){return this.constrainChildren};mxGraph.prototype.setConstrainChildren=function(a){this.constrainChildren=a};mxGraph.prototype.isConstrainRelativeChildren=function(){return this.constrainRelativeChildren};mxGraph.prototype.setConstrainRelativeChildren=function(a){this.constrainRelativeChildren=a};mxGraph.prototype.isAllowNegativeCoordinates=function(){return this.allowNegativeCoordinates};
-mxGraph.prototype.setAllowNegativeCoordinates=function(a){this.allowNegativeCoordinates=a};mxGraph.prototype.getOverlap=function(a){return this.isAllowOverlapParent(a)?this.defaultOverlap:0};mxGraph.prototype.isAllowOverlapParent=function(a){return!1};mxGraph.prototype.getFoldableCells=function(a,b){return this.model.filterCells(a,mxUtils.bind(this,function(a){return this.isCellFoldable(a,b)}))};
-mxGraph.prototype.isCellFoldable=function(a,b){var c=this.getCurrentCellStyle(a);return 0<this.model.getChildCount(a)&&0!=c[mxConstants.STYLE_FOLDABLE]};mxGraph.prototype.isValidDropTarget=function(a,b,c){return null!=a&&(this.isSplitEnabled()&&this.isSplitTarget(a,b,c)||!this.model.isEdge(a)&&(this.isSwimlane(a)||0<this.model.getChildCount(a)&&!this.isCellCollapsed(a)))};
-mxGraph.prototype.isSplitTarget=function(a,b,c){return this.model.isEdge(a)&&null!=b&&1==b.length&&this.isCellConnectable(b[0])&&null==this.getEdgeValidationError(a,this.model.getTerminal(a,!0),b[0])?(c=this.model.getTerminal(a,!0),a=this.model.getTerminal(a,!1),!this.model.isAncestor(b[0],c)&&!this.model.isAncestor(b[0],a)):!1};
-mxGraph.prototype.getDropTarget=function(a,b,c,d){if(!this.isSwimlaneNesting())for(var e=0;e<a.length;e++)if(this.isSwimlane(a[e]))return null;e=mxUtils.convertPoint(this.container,mxEvent.getClientX(b),mxEvent.getClientY(b));e.x-=this.panDx;e.y-=this.panDy;e=this.getSwimlaneAt(e.x,e.y);if(null==c)c=e;else if(null!=e){for(var f=this.model.getParent(e);null!=f&&this.isSwimlane(f)&&f!=c;)f=this.model.getParent(f);f==c&&(c=e)}for(;null!=c&&!this.isValidDropTarget(c,a,b)&&!this.model.isLayer(c);)c=this.model.getParent(c);
-if(null==d||!d)for(var g=c;null!=g&&0>mxUtils.indexOf(a,g);)g=this.model.getParent(g);return this.model.isLayer(c)||null!=g?null:c};mxGraph.prototype.getDefaultParent=function(){var a=this.getCurrentRoot();null==a&&(a=this.defaultParent,null==a&&(a=this.model.getRoot(),a=this.model.getChildAt(a,0)));return a};mxGraph.prototype.setDefaultParent=function(a){this.defaultParent=a};mxGraph.prototype.getSwimlane=function(a){for(;null!=a&&!this.isSwimlane(a);)a=this.model.getParent(a);return a};
-mxGraph.prototype.getSwimlaneAt=function(a,b,c){null==c&&(c=this.getCurrentRoot(),null==c&&(c=this.model.getRoot()));if(null!=c)for(var d=this.model.getChildCount(c),e=0;e<d;e++){var f=this.model.getChildAt(c,e);if(null!=f){var g=this.getSwimlaneAt(a,b,f);if(null!=g)return g;if(this.isCellVisible(f)&&this.isSwimlane(f)&&(g=this.view.getState(f),this.intersects(g,a,b)))return f}}return null};
-mxGraph.prototype.getCellAt=function(a,b,c,d,e,f){d=null!=d?d:!0;e=null!=e?e:!0;null==c&&(c=this.getCurrentRoot(),null==c&&(c=this.getModel().getRoot()));if(null!=c)for(var g=this.model.getChildCount(c)-1;0<=g;g--){var k=this.model.getChildAt(c,g),l=this.getCellAt(a,b,k,d,e,f);if(null!=l)return l;if(this.isCellVisible(k)&&(e&&this.model.isEdge(k)||d&&this.model.isVertex(k))&&(l=this.view.getState(k),null!=l&&(null==f||!f(l,a,b))&&this.intersects(l,a,b)))return k}return null};
-mxGraph.prototype.intersects=function(a,b,c){if(null!=a){var d=a.absolutePoints;if(null!=d){a=this.tolerance*this.tolerance;for(var e=d[0],f=1;f<d.length;f++){var g=d[f];if(mxUtils.ptSegDistSq(e.x,e.y,g.x,g.y,b,c)<=a)return!0;e=g}}else if(e=mxUtils.toRadians(mxUtils.getValue(a.style,mxConstants.STYLE_ROTATION)||0),0!=e&&(d=Math.cos(-e),e=Math.sin(-e),f=new mxPoint(a.getCenterX(),a.getCenterY()),e=mxUtils.getRotatedPoint(new mxPoint(b,c),d,e,f),b=e.x,c=e.y),mxUtils.contains(a,b,c))return!0}return!1};
-mxGraph.prototype.hitsSwimlaneContent=function(a,b,c){var d=this.getView().getState(a);a=this.getStartSize(a);if(null!=d){var e=this.getView().getScale();b-=d.x;c-=d.y;if(0<a.width&&0<b&&b>a.width*e||0<a.height&&0<c&&c>a.height*e)return!0}return!1};mxGraph.prototype.getChildVertices=function(a){return this.getChildCells(a,!0,!1)};mxGraph.prototype.getChildEdges=function(a){return this.getChildCells(a,!1,!0)};
-mxGraph.prototype.getChildCells=function(a,b,c){a=null!=a?a:this.getDefaultParent();a=this.model.getChildCells(a,null!=b?b:!1,null!=c?c:!1);b=[];for(c=0;c<a.length;c++)this.isCellVisible(a[c])&&b.push(a[c]);return b};mxGraph.prototype.getConnections=function(a,b){return this.getEdges(a,b,!0,!0,!1)};mxGraph.prototype.getIncomingEdges=function(a,b){return this.getEdges(a,b,!0,!1,!1)};mxGraph.prototype.getOutgoingEdges=function(a,b){return this.getEdges(a,b,!1,!0,!1)};
-mxGraph.prototype.getEdges=function(a,b,c,d,e,f){c=null!=c?c:!0;d=null!=d?d:!0;e=null!=e?e:!0;f=null!=f?f:!1;for(var g=[],k=this.isCellCollapsed(a),l=this.model.getChildCount(a),m=0;m<l;m++){var n=this.model.getChildAt(a,m);if(k||!this.isCellVisible(n))g=g.concat(this.model.getEdges(n,c,d))}g=g.concat(this.model.getEdges(a,c,d));k=[];for(m=0;m<g.length;m++)n=this.view.getState(g[m]),l=null!=n?n.getVisibleTerminal(!0):this.view.getVisibleTerminal(g[m],!0),n=null!=n?n.getVisibleTerminal(!1):this.view.getVisibleTerminal(g[m],
-!1),(e&&l==n||l!=n&&(c&&n==a&&(null==b||this.isValidAncestor(l,b,f))||d&&l==a&&(null==b||this.isValidAncestor(n,b,f))))&&k.push(g[m]);return k};mxGraph.prototype.isValidAncestor=function(a,b,c){return c?this.model.isAncestor(b,a):this.model.getParent(a)==b};
-mxGraph.prototype.getOpposites=function(a,b,c,d){c=null!=c?c:!0;d=null!=d?d:!0;var e=[],f=new mxDictionary;if(null!=a)for(var g=0;g<a.length;g++){var k=this.view.getState(a[g]),l=null!=k?k.getVisibleTerminal(!0):this.view.getVisibleTerminal(a[g],!0),k=null!=k?k.getVisibleTerminal(!1):this.view.getVisibleTerminal(a[g],!1);l==b&&null!=k&&k!=b&&d?f.get(k)||(f.put(k,!0),e.push(k)):k==b&&null!=l&&l!=b&&c&&!f.get(l)&&(f.put(l,!0),e.push(l))}return e};
-mxGraph.prototype.getEdgesBetween=function(a,b,c){c=null!=c?c:!1;for(var d=this.getEdges(a),e=[],f=0;f<d.length;f++){var g=this.view.getState(d[f]),k=null!=g?g.getVisibleTerminal(!0):this.view.getVisibleTerminal(d[f],!0),g=null!=g?g.getVisibleTerminal(!1):this.view.getVisibleTerminal(d[f],!1);(k==a&&g==b||!c&&k==b&&g==a)&&e.push(d[f])}return e};
-mxGraph.prototype.getPointForEvent=function(a,b){var c=mxUtils.convertPoint(this.container,mxEvent.getClientX(a),mxEvent.getClientY(a)),d=this.view.scale,e=this.view.translate,f=0!=b?this.gridSize/2:0;c.x=this.snap(c.x/d-e.x-f);c.y=this.snap(c.y/d-e.y-f);return c};
-mxGraph.prototype.getCells=function(a,b,c,d,e,f,g,k,l){f=null!=f?f:[];if(0<c||0<d||null!=g){var m=this.getModel(),n=a+c,p=b+d;null==e&&(e=this.getCurrentRoot(),null==e&&(e=m.getRoot()));if(null!=e)for(var q=m.getChildCount(e),r=0;r<q;r++){var t=m.getChildAt(e,r),u=this.view.getState(t);if(null!=u&&this.isCellVisible(t)&&(null==k||!k(u))){var x=mxUtils.getValue(u.style,mxConstants.STYLE_ROTATION)||0;0!=x&&(u=mxUtils.getBoundingBox(u,x));(x=null!=g&&m.isVertex(t)&&mxUtils.intersects(g,u)||null==g&&
-(m.isEdge(t)||m.isVertex(t))&&u.x>=a&&u.y+u.height<=p&&u.y>=b&&u.x+u.width<=n)&&f.push(t);x&&!l||this.getCells(a,b,c,d,t,f,g,k,l)}}}return f};mxGraph.prototype.getCellsBeyond=function(a,b,c,d,e){var f=[];if(d||e)if(null==c&&(c=this.getDefaultParent()),null!=c)for(var g=this.model.getChildCount(c),k=0;k<g;k++){var l=this.model.getChildAt(c,k),m=this.view.getState(l);this.isCellVisible(l)&&null!=m&&(!d||m.x>=a)&&(!e||m.y>=b)&&f.push(l)}return f};
-mxGraph.prototype.findTreeRoots=function(a,b,c){b=null!=b?b:!1;c=null!=c?c:!1;var d=[];if(null!=a){for(var e=this.getModel(),f=e.getChildCount(a),g=null,k=0,l=0;l<f;l++){var m=e.getChildAt(a,l);if(this.model.isVertex(m)&&this.isCellVisible(m)){for(var n=this.getConnections(m,b?a:null),p=0,q=0,r=0;r<n.length;r++)this.view.getVisibleTerminal(n[r],!0)==m?p++:q++;(c&&0==p&&0<q||!c&&0==q&&0<p)&&d.push(m);n=c?q-p:p-q;n>k&&(k=n,g=m)}}0==d.length&&null!=g&&d.push(g)}return d};
-mxGraph.prototype.traverse=function(a,b,c,d,e,f){if(null!=c&&null!=a&&(b=null!=b?b:!0,f=null!=f?f:!1,e=e||new mxDictionary,!e.get(a)&&(e.put(a,!0),d=c(a,d),null==d||d))&&(d=this.model.getEdgeCount(a),0<d))for(var g=0;g<d;g++){var k=this.model.getEdgeAt(a,g),l=this.model.getTerminal(k,!0)==a;b&&!f!=l||(l=this.model.getTerminal(k,!l),this.traverse(l,b,c,k,e,f))}};mxGraph.prototype.isCellSelected=function(a){return this.getSelectionModel().isSelected(a)};mxGraph.prototype.isSelectionEmpty=function(){return this.getSelectionModel().isEmpty()};
-mxGraph.prototype.clearSelection=function(){return this.getSelectionModel().clear()};mxGraph.prototype.getSelectionCount=function(){return this.getSelectionModel().cells.length};mxGraph.prototype.getSelectionCell=function(){return this.getSelectionModel().cells[0]};mxGraph.prototype.getSelectionCells=function(){return this.getSelectionModel().cells.slice()};mxGraph.prototype.setSelectionCell=function(a){this.getSelectionModel().setCell(a)};mxGraph.prototype.setSelectionCells=function(a){this.getSelectionModel().setCells(a)};
-mxGraph.prototype.addSelectionCell=function(a){this.getSelectionModel().addCell(a)};mxGraph.prototype.addSelectionCells=function(a){this.getSelectionModel().addCells(a)};mxGraph.prototype.removeSelectionCell=function(a){this.getSelectionModel().removeCell(a)};mxGraph.prototype.removeSelectionCells=function(a){this.getSelectionModel().removeCells(a)};mxGraph.prototype.selectRegion=function(a,b){var c=this.getCells(a.x,a.y,a.width,a.height);this.selectCellsForEvent(c,b);return c};
-mxGraph.prototype.selectNextCell=function(){this.selectCell(!0)};mxGraph.prototype.selectPreviousCell=function(){this.selectCell()};mxGraph.prototype.selectParentCell=function(){this.selectCell(!1,!0)};mxGraph.prototype.selectChildCell=function(){this.selectCell(!1,!1,!0)};
-mxGraph.prototype.selectCell=function(a,b,c){var d=this.selectionModel,e=0<d.cells.length?d.cells[0]:null;1<d.cells.length&&d.clear();var d=null!=e?this.model.getParent(e):this.getDefaultParent(),f=this.model.getChildCount(d);null==e&&0<f?(a=this.model.getChildAt(d,0),this.setSelectionCell(a)):null!=e&&!b||null==this.view.getState(d)||null==this.model.getGeometry(d)?null!=e&&c?0<this.model.getChildCount(e)&&(a=this.model.getChildAt(e,0),this.setSelectionCell(a)):0<f&&(b=d.getIndex(e),a?(b++,a=this.model.getChildAt(d,
-b%f)):(b--,a=this.model.getChildAt(d,0>b?f-1:b)),this.setSelectionCell(a)):this.getCurrentRoot()!=d&&this.setSelectionCell(d)};mxGraph.prototype.selectAll=function(a,b){a=a||this.getDefaultParent();var c=b?this.model.filterDescendants(mxUtils.bind(this,function(b){return b!=a&&null!=this.view.getState(b)}),a):this.model.getChildren(a);null!=c&&this.setSelectionCells(c)};mxGraph.prototype.selectVertices=function(a,b){this.selectCells(!0,!1,a,b)};
-mxGraph.prototype.selectEdges=function(a){this.selectCells(!1,!0,a)};mxGraph.prototype.selectCells=function(a,b,c,d){c=c||this.getDefaultParent();var e=mxUtils.bind(this,function(c){return null!=this.view.getState(c)&&((d||0==this.model.getChildCount(c))&&this.model.isVertex(c)&&a&&!this.model.isEdge(this.model.getParent(c))||this.model.isEdge(c)&&b)});c=this.model.filterDescendants(e,c);null!=c&&this.setSelectionCells(c)};
-mxGraph.prototype.selectCellForEvent=function(a,b){var c=this.isCellSelected(a);this.isToggleEvent(b)?c?this.removeSelectionCell(a):this.addSelectionCell(a):c&&1==this.getSelectionCount()||this.setSelectionCell(a)};mxGraph.prototype.selectCellsForEvent=function(a,b){this.isToggleEvent(b)?this.addSelectionCells(a):this.setSelectionCells(a)};
-mxGraph.prototype.createHandler=function(a){var b=null;if(null!=a)if(this.model.isEdge(a.cell))var b=a.getVisibleTerminalState(!0),c=a.getVisibleTerminalState(!1),d=this.getCellGeometry(a.cell),b=this.view.getEdgeStyle(a,null!=d?d.points:null,b,c),b=this.createEdgeHandler(a,b);else b=this.createVertexHandler(a);return b};mxGraph.prototype.createVertexHandler=function(a){return new mxVertexHandler(a)};
-mxGraph.prototype.createEdgeHandler=function(a,b){return b==mxEdgeStyle.Loop||b==mxEdgeStyle.ElbowConnector||b==mxEdgeStyle.SideToSide||b==mxEdgeStyle.TopToBottom?this.createElbowEdgeHandler(a):b==mxEdgeStyle.SegmentConnector||b==mxEdgeStyle.OrthConnector?this.createEdgeSegmentHandler(a):new mxEdgeHandler(a)};mxGraph.prototype.createEdgeSegmentHandler=function(a){return new mxEdgeSegmentHandler(a)};mxGraph.prototype.createElbowEdgeHandler=function(a){return new mxElbowEdgeHandler(a)};
-mxGraph.prototype.addMouseListener=function(a){null==this.mouseListeners&&(this.mouseListeners=[]);this.mouseListeners.push(a)};mxGraph.prototype.removeMouseListener=function(a){if(null!=this.mouseListeners)for(var b=0;b<this.mouseListeners.length;b++)if(this.mouseListeners[b]==a){this.mouseListeners.splice(b,1);break}};
-mxGraph.prototype.updateMouseEvent=function(a,b){if(null==a.graphX||null==a.graphY){var c=mxUtils.convertPoint(this.container,a.getX(),a.getY());a.graphX=c.x-this.panDx;a.graphY=c.y-this.panDy;null==a.getCell()&&this.isMouseDown&&b==mxEvent.MOUSE_MOVE&&(a.state=this.view.getState(this.getCellAt(c.x,c.y,null,null,null,function(a){return null==a.shape||a.shape.paintBackground!=mxRectangleShape.prototype.paintBackground||"1"==mxUtils.getValue(a.style,mxConstants.STYLE_POINTER_EVENTS,"1")||null!=a.shape.fill&&
-a.shape.fill!=mxConstants.NONE})))}return a};mxGraph.prototype.getStateForTouchEvent=function(a){var b=mxEvent.getClientX(a);a=mxEvent.getClientY(a);b=mxUtils.convertPoint(this.container,b,a);return this.view.getState(this.getCellAt(b.x,b.y))};
-mxGraph.prototype.isEventIgnored=function(a,b,c){var d=mxEvent.isMouseEvent(b.getEvent()),e=!1;b.getEvent()==this.lastEvent?e=!0:this.lastEvent=b.getEvent();null!=this.eventSource&&a!=mxEvent.MOUSE_MOVE?(mxEvent.removeGestureListeners(this.eventSource,null,this.mouseMoveRedirect,this.mouseUpRedirect),this.eventSource=this.mouseUpRedirect=this.mouseMoveRedirect=null):mxClient.IS_GC||null==this.eventSource||b.getSource()==this.eventSource?!mxClient.IS_TOUCH||a!=mxEvent.MOUSE_DOWN||d||mxEvent.isPenEvent(b.getEvent())||
-(this.eventSource=b.getSource(),this.mouseMoveRedirect=mxUtils.bind(this,function(a){this.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(a,this.getStateForTouchEvent(a)))}),this.mouseUpRedirect=mxUtils.bind(this,function(a){this.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(a,this.getStateForTouchEvent(a)))}),mxEvent.addGestureListeners(this.eventSource,null,this.mouseMoveRedirect,this.mouseUpRedirect)):e=!0;this.isSyntheticEventIgnored(a,b,c)&&(e=!0);if(!mxEvent.isPopupTrigger(this.lastEvent)&&
-a!=mxEvent.MOUSE_MOVE&&2==this.lastEvent.detail)return!0;a==mxEvent.MOUSE_UP&&this.isMouseDown?this.isMouseDown=!1:a!=mxEvent.MOUSE_DOWN||this.isMouseDown?!e&&((!mxClient.IS_FF||a!=mxEvent.MOUSE_MOVE)&&this.isMouseDown&&this.isMouseTrigger!=d||a==mxEvent.MOUSE_DOWN&&this.isMouseDown||a==mxEvent.MOUSE_UP&&!this.isMouseDown)&&(e=!0):(this.isMouseDown=!0,this.isMouseTrigger=d);e||a!=mxEvent.MOUSE_DOWN||(this.lastMouseX=b.getX(),this.lastMouseY=b.getY());return e};
-mxGraph.prototype.isSyntheticEventIgnored=function(a,b,c){c=!1;b=mxEvent.isMouseEvent(b.getEvent());this.ignoreMouseEvents&&b&&a!=mxEvent.MOUSE_MOVE?(this.ignoreMouseEvents=a!=mxEvent.MOUSE_UP,c=!0):mxClient.IS_FF&&!b&&a==mxEvent.MOUSE_UP&&(this.ignoreMouseEvents=!0);return c};
-mxGraph.prototype.isEventSourceIgnored=function(a,b){var c=b.getSource(),d=null!=c.nodeName?c.nodeName.toLowerCase():"",e=!mxEvent.isMouseEvent(b.getEvent())||mxEvent.isLeftMouseButton(b.getEvent());return a==mxEvent.MOUSE_DOWN&&e&&("select"==d||"option"==d||"input"==d&&"checkbox"!=c.type&&"radio"!=c.type&&"button"!=c.type&&"submit"!=c.type&&"file"!=c.type)};mxGraph.prototype.getEventState=function(a){return a};
-mxGraph.prototype.fireMouseEvent=function(a,b,c){if(this.isEventSourceIgnored(a,b))null!=this.tooltipHandler&&this.tooltipHandler.hide();else{null==c&&(c=this);b=this.updateMouseEvent(b,a);if(!this.nativeDblClickEnabled&&!mxEvent.isPopupTrigger(b.getEvent())||this.doubleTapEnabled&&mxClient.IS_TOUCH&&(mxEvent.isTouchEvent(b.getEvent())||mxEvent.isPenEvent(b.getEvent()))){var d=(new Date).getTime();if(!mxClient.IS_QUIRKS&&a==mxEvent.MOUSE_DOWN||mxClient.IS_QUIRKS&&a==mxEvent.MOUSE_UP&&!this.fireDoubleClick)if(null!=
-this.lastTouchEvent&&this.lastTouchEvent!=b.getEvent()&&d-this.lastTouchTime<this.doubleTapTimeout&&Math.abs(this.lastTouchX-b.getX())<this.doubleTapTolerance&&Math.abs(this.lastTouchY-b.getY())<this.doubleTapTolerance&&2>this.doubleClickCounter){if(this.doubleClickCounter++,d=!1,a==mxEvent.MOUSE_UP?b.getCell()==this.lastTouchCell&&null!=this.lastTouchCell&&(this.lastTouchTime=0,d=this.lastTouchCell,this.lastTouchCell=null,mxClient.IS_QUIRKS&&b.getSource().fireEvent("ondblclick"),this.dblClick(b.getEvent(),
-d),d=!0):(this.fireDoubleClick=!0,this.lastTouchTime=0),!mxClient.IS_QUIRKS||d){mxEvent.consume(b.getEvent());return}}else{if(null==this.lastTouchEvent||this.lastTouchEvent!=b.getEvent())this.lastTouchCell=b.getCell(),this.lastTouchX=b.getX(),this.lastTouchY=b.getY(),this.lastTouchTime=d,this.lastTouchEvent=b.getEvent(),this.doubleClickCounter=0}else if((this.isMouseDown||a==mxEvent.MOUSE_UP)&&this.fireDoubleClick){this.fireDoubleClick=!1;d=this.lastTouchCell;this.lastTouchCell=null;this.isMouseDown=
-!1;(null!=d||(mxEvent.isTouchEvent(b.getEvent())||mxEvent.isPenEvent(b.getEvent()))&&(mxClient.IS_GC||mxClient.IS_SF))&&Math.abs(this.lastTouchX-b.getX())<this.doubleTapTolerance&&Math.abs(this.lastTouchY-b.getY())<this.doubleTapTolerance?this.dblClick(b.getEvent(),d):mxEvent.consume(b.getEvent());return}}if(!this.isEventIgnored(a,b,c)){b.state=this.getEventState(b.getState());this.fireEvent(new mxEventObject(mxEvent.FIRE_MOUSE_EVENT,"eventName",a,"event",b));if(mxClient.IS_OP||mxClient.IS_SF||mxClient.IS_GC||
-mxClient.IS_IE11||mxClient.IS_IE&&mxClient.IS_SVG||b.getEvent().target!=this.container){if(a==mxEvent.MOUSE_MOVE&&this.isMouseDown&&this.autoScroll&&!mxEvent.isMultiTouchEvent(b.getEvent))this.scrollPointToVisible(b.getGraphX(),b.getGraphY(),this.autoExtend);else if(a==mxEvent.MOUSE_UP&&this.ignoreScrollbars&&this.translateToScrollPosition&&(0!=this.container.scrollLeft||0!=this.container.scrollTop)){var d=this.view.scale,e=this.view.translate;this.view.setTranslate(e.x-this.container.scrollLeft/
-d,e.y-this.container.scrollTop/d);this.container.scrollLeft=0;this.container.scrollTop=0}if(null!=this.mouseListeners)for(d=[c,b],b.getEvent().preventDefault||(b.getEvent().returnValue=!0),e=0;e<this.mouseListeners.length;e++){var f=this.mouseListeners[e];a==mxEvent.MOUSE_DOWN?f.mouseDown.apply(f,d):a==mxEvent.MOUSE_MOVE?f.mouseMove.apply(f,d):a==mxEvent.MOUSE_UP&&f.mouseUp.apply(f,d)}a==mxEvent.MOUSE_UP&&this.click(b)}(mxEvent.isTouchEvent(b.getEvent())||mxEvent.isPenEvent(b.getEvent()))&&a==mxEvent.MOUSE_DOWN&&
-this.tapAndHoldEnabled&&!this.tapAndHoldInProgress?(this.tapAndHoldInProgress=!0,this.initialTouchX=b.getGraphX(),this.initialTouchY=b.getGraphY(),this.tapAndHoldThread&&window.clearTimeout(this.tapAndHoldThread),this.tapAndHoldThread=window.setTimeout(mxUtils.bind(this,function(){this.tapAndHoldValid&&this.tapAndHold(b);this.tapAndHoldValid=this.tapAndHoldInProgress=!1}),this.tapAndHoldDelay),this.tapAndHoldValid=!0):a==mxEvent.MOUSE_UP?this.tapAndHoldValid=this.tapAndHoldInProgress=!1:this.tapAndHoldValid&&
-(this.tapAndHoldValid=Math.abs(this.initialTouchX-b.getGraphX())<this.tolerance&&Math.abs(this.initialTouchY-b.getGraphY())<this.tolerance);a==mxEvent.MOUSE_DOWN&&this.isEditing()&&!this.cellEditor.isEventSource(b.getEvent())&&this.stopEditing(!this.isInvokesStopCellEditing());this.consumeMouseEvent(a,b,c)}}};mxGraph.prototype.consumeMouseEvent=function(a,b,c){a==mxEvent.MOUSE_DOWN&&mxEvent.isTouchEvent(b.getEvent())&&b.consume(!1)};
-mxGraph.prototype.fireGestureEvent=function(a,b){this.lastTouchTime=0;this.fireEvent(new mxEventObject(mxEvent.GESTURE,"event",a,"cell",b))};
-mxGraph.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,null!=this.tooltipHandler&&this.tooltipHandler.destroy(),null!=this.selectionCellsHandler&&this.selectionCellsHandler.destroy(),null!=this.panningHandler&&this.panningHandler.destroy(),null!=this.popupMenuHandler&&this.popupMenuHandler.destroy(),null!=this.connectionHandler&&this.connectionHandler.destroy(),null!=this.graphHandler&&this.graphHandler.destroy(),null!=this.cellEditor&&this.cellEditor.destroy(),null!=this.view&&this.view.destroy(),
-null!=this.model&&null!=this.graphModelChangeListener&&(this.model.removeListener(this.graphModelChangeListener),this.graphModelChangeListener=null),this.container=null)};function mxCellOverlay(a,b,c,d,e,f){this.image=a;this.tooltip=b;this.align=null!=c?c:this.align;this.verticalAlign=null!=d?d:this.verticalAlign;this.offset=null!=e?e:new mxPoint;this.cursor=null!=f?f:"help"}mxCellOverlay.prototype=new mxEventSource;mxCellOverlay.prototype.constructor=mxCellOverlay;mxCellOverlay.prototype.image=null;
-mxCellOverlay.prototype.tooltip=null;mxCellOverlay.prototype.align=mxConstants.ALIGN_RIGHT;mxCellOverlay.prototype.verticalAlign=mxConstants.ALIGN_BOTTOM;mxCellOverlay.prototype.offset=null;mxCellOverlay.prototype.cursor=null;mxCellOverlay.prototype.defaultOverlap=.5;
-mxCellOverlay.prototype.getBounds=function(a){var b=a.view.graph.getModel().isEdge(a.cell),c=a.view.scale,d=this.image.width,e=this.image.height;if(b)if(b=a.absolutePoints,1==b.length%2)b=b[Math.floor(b.length/2)];else{var f=b.length/2;a=b[f-1];b=b[f];b=new mxPoint(a.x+(b.x-a.x)/2,a.y+(b.y-a.y)/2)}else b=new mxPoint,b.x=this.align==mxConstants.ALIGN_LEFT?a.x:this.align==mxConstants.ALIGN_CENTER?a.x+a.width/2:a.x+a.width,b.y=this.verticalAlign==mxConstants.ALIGN_TOP?a.y:this.verticalAlign==mxConstants.ALIGN_MIDDLE?
-a.y+a.height/2:a.y+a.height;return new mxRectangle(Math.round(b.x-(d*this.defaultOverlap-this.offset.x)*c),Math.round(b.y-(e*this.defaultOverlap-this.offset.y)*c),d*c,e*c)};mxCellOverlay.prototype.toString=function(){return this.tooltip};function mxOutline(a,b){this.source=a;null!=b&&this.init(b)}mxOutline.prototype.source=null;mxOutline.prototype.outline=null;mxOutline.prototype.graphRenderHint=mxConstants.RENDERING_HINT_FASTER;mxOutline.prototype.enabled=!0;mxOutline.prototype.showViewport=!0;
-mxOutline.prototype.border=10;mxOutline.prototype.sizerSize=8;mxOutline.prototype.labelsVisible=!1;mxOutline.prototype.updateOnPan=!1;mxOutline.prototype.sizerImage=null;mxOutline.prototype.minScale=1E-4;mxOutline.prototype.suspended=!1;mxOutline.prototype.forceVmlHandles=8==document.documentMode;mxOutline.prototype.createGraph=function(a){a=new mxGraph(a,this.source.getModel(),this.graphRenderHint,this.source.getStylesheet());a.foldingEnabled=!1;a.autoScroll=!1;return a};
-mxOutline.prototype.init=function(a){this.outline=this.createGraph(a);var b=this.outline.graphModelChanged;this.outline.graphModelChanged=mxUtils.bind(this,function(a){this.suspended||null==this.outline||b.apply(this.outline,arguments)});mxClient.IS_SVG&&(a=this.outline.getView().getCanvas().parentNode,a.setAttribute("shape-rendering","optimizeSpeed"),a.setAttribute("image-rendering","optimizeSpeed"));this.outline.labelsVisible=this.labelsVisible;this.outline.setEnabled(!1);this.updateHandler=mxUtils.bind(this,
-function(a,b){this.suspended||this.active||this.update()});this.source.getModel().addListener(mxEvent.CHANGE,this.updateHandler);this.outline.addMouseListener(this);a=this.source.getView();a.addListener(mxEvent.SCALE,this.updateHandler);a.addListener(mxEvent.TRANSLATE,this.updateHandler);a.addListener(mxEvent.SCALE_AND_TRANSLATE,this.updateHandler);a.addListener(mxEvent.DOWN,this.updateHandler);a.addListener(mxEvent.UP,this.updateHandler);mxEvent.addListener(this.source.container,"scroll",this.updateHandler);
-this.panHandler=mxUtils.bind(this,function(a){this.updateOnPan&&this.updateHandler.apply(this,arguments)});this.source.addListener(mxEvent.PAN,this.panHandler);this.refreshHandler=mxUtils.bind(this,function(a){this.outline.setStylesheet(this.source.getStylesheet());this.outline.refresh()});this.source.addListener(mxEvent.REFRESH,this.refreshHandler);this.bounds=new mxRectangle(0,0,0,0);this.selectionBorder=new mxRectangleShape(this.bounds,null,mxConstants.OUTLINE_COLOR,mxConstants.OUTLINE_STROKEWIDTH);
-this.selectionBorder.dialect=this.outline.dialect;this.forceVmlHandles&&(this.selectionBorder.isHtmlAllowed=function(){return!1});this.selectionBorder.init(this.outline.getView().getOverlayPane());a=mxUtils.bind(this,function(a){var b=mxEvent.getSource(a),c=mxUtils.bind(this,function(a){this.outline.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(a))}),f=mxUtils.bind(this,function(a){mxEvent.removeGestureListeners(b,null,c,f);this.outline.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(a))});
-mxEvent.addGestureListeners(b,null,c,f);this.outline.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(a))});mxEvent.addGestureListeners(this.selectionBorder.node,a);this.sizer=this.createSizer();this.forceVmlHandles&&(this.sizer.isHtmlAllowed=function(){return!1});this.sizer.init(this.outline.getView().getOverlayPane());this.enabled&&(this.sizer.node.style.cursor="nwse-resize");mxEvent.addGestureListeners(this.sizer.node,a);this.selectionBorder.node.style.display=this.showViewport?"":"none";this.sizer.node.style.display=
-this.selectionBorder.node.style.display;this.selectionBorder.node.style.cursor="move";this.update(!1)};mxOutline.prototype.isEnabled=function(){return this.enabled};mxOutline.prototype.setEnabled=function(a){this.enabled=a};mxOutline.prototype.setZoomEnabled=function(a){this.sizer.node.style.visibility=a?"visible":"hidden"};mxOutline.prototype.refresh=function(){this.update(!0)};
-mxOutline.prototype.createSizer=function(){var a=null!=this.sizerImage?new mxImageShape(new mxRectangle(0,0,this.sizerImage.width,this.sizerImage.height),this.sizerImage.src):new mxRectangleShape(new mxRectangle(0,0,this.sizerSize,this.sizerSize),mxConstants.OUTLINE_HANDLE_FILLCOLOR,mxConstants.OUTLINE_HANDLE_STROKECOLOR);a.dialect=this.outline.dialect;return a};mxOutline.prototype.getSourceContainerSize=function(){return new mxRectangle(0,0,this.source.container.scrollWidth,this.source.container.scrollHeight)};
-mxOutline.prototype.getOutlineOffset=function(a){return null};mxOutline.prototype.getSourceGraphBounds=function(){return this.source.getGraphBounds()};
-mxOutline.prototype.update=function(a){if(null!=this.source&&null!=this.source.container&&null!=this.outline&&null!=this.outline.container){var b=this.source.view.scale,c=this.getSourceGraphBounds(),c=new mxRectangle(c.x/b+this.source.panDx,c.y/b+this.source.panDy,c.width/b,c.height/b),d=new mxRectangle(0,0,this.source.container.clientWidth/b,this.source.container.clientHeight/b),e=c.clone();e.add(d);d=this.getSourceContainerSize();b=Math.min(Math.max(0,this.outline.container.clientWidth-this.border)/
-Math.max(d.width/b,e.width),Math.max(0,this.outline.container.clientHeight-this.border)/Math.max(d.height/b,e.height));d=isNaN(b)?this.minScale:Math.max(this.minScale,b);if(0<d){this.outline.getView().scale!=d&&(this.outline.getView().scale=d,a=!0);b=this.outline.getView();b.currentRoot!=this.source.getView().currentRoot&&b.setCurrentRoot(this.source.getView().currentRoot);var e=this.source.view.translate,f=e.x+this.source.panDx,g=e.y+this.source.panDy,d=this.getOutlineOffset(d);null!=d&&(f+=d.x,
-g+=d.y);0>c.x&&(f-=c.x);0>c.y&&(g-=c.y);if(b.translate.x!=f||b.translate.y!=g)b.translate.x=f,b.translate.y=g,a=!0;var c=b.translate,d=this.source.getView().scale,f=d/b.scale,g=1/b.scale,k=this.source.container;this.bounds=new mxRectangle((c.x-e.x-this.source.panDx)/g,(c.y-e.y-this.source.panDy)/g,k.clientWidth/f,k.clientHeight/f);this.bounds.x+=this.source.container.scrollLeft*b.scale/d;this.bounds.y+=this.source.container.scrollTop*b.scale/d;c=this.selectionBorder.bounds;if(c.x!=this.bounds.x||
-c.y!=this.bounds.y||c.width!=this.bounds.width||c.height!=this.bounds.height)this.selectionBorder.bounds=this.bounds,this.selectionBorder.redraw();c=this.sizer.bounds;b=new mxRectangle(this.bounds.x+this.bounds.width-c.width/2,this.bounds.y+this.bounds.height-c.height/2,c.width,c.height);if(c.x!=b.x||c.y!=b.y||c.width!=b.width||c.height!=b.height)this.sizer.bounds=b,"hidden"!=this.sizer.node.style.visibility&&this.sizer.redraw();a&&this.outline.view.revalidate()}}};
-mxOutline.prototype.mouseDown=function(a,b){if(this.enabled&&this.showViewport){var c=mxEvent.isMouseEvent(b.getEvent())?0:this.source.tolerance,c=this.source.allowHandleBoundsCheck&&(mxClient.IS_IE||0<c)?new mxRectangle(b.getGraphX()-c,b.getGraphY()-c,2*c,2*c):null;this.zoom=b.isSource(this.sizer)||null!=c&&mxUtils.intersects(shape.bounds,c);this.startX=b.getX();this.startY=b.getY();this.active=!0;this.source.useScrollbarsForPanning&&mxUtils.hasScrollbars(this.source.container)?(this.dx0=this.source.container.scrollLeft,
-this.dy0=this.source.container.scrollTop):this.dy0=this.dx0=0}b.consume()};
-mxOutline.prototype.mouseMove=function(a,b){if(this.active){this.selectionBorder.node.style.display=this.showViewport?"":"none";this.sizer.node.style.display=this.selectionBorder.node.style.display;var c=this.getTranslateForEvent(b),d=c.x,e=c.y;if(this.zoom)c=this.source.container,e=d/(c.clientWidth/c.clientHeight),c=new mxRectangle(this.bounds.x,this.bounds.y,Math.max(1,this.bounds.width+d),Math.max(1,this.bounds.height+e)),this.selectionBorder.bounds=c,this.selectionBorder.redraw();else{var f=this.outline.getView().scale,
-c=new mxRectangle(this.bounds.x+d,this.bounds.y+e,this.bounds.width,this.bounds.height);this.selectionBorder.bounds=c;this.selectionBorder.redraw();d=d/f*this.source.getView().scale;e=e/f*this.source.getView().scale;this.source.panGraph(-d-this.dx0,-e-this.dy0)}d=this.sizer.bounds;this.sizer.bounds=new mxRectangle(c.x+c.width-d.width/2,c.y+c.height-d.height/2,d.width,d.height);"hidden"!=this.sizer.node.style.visibility&&this.sizer.redraw();b.consume()}};
-mxOutline.prototype.getTranslateForEvent=function(a){return new mxPoint(a.getX()-this.startX,a.getY()-this.startY)};
-mxOutline.prototype.mouseUp=function(a,b){if(this.active){var c=this.getTranslateForEvent(b),d=c.x,c=c.y;if(0<Math.abs(d)||0<Math.abs(c)){if(this.zoom){var c=this.selectionBorder.bounds.width,e=this.source.getView().scale;this.source.zoomTo(Math.max(this.minScale,e-d*e/c),!1)}else this.source.useScrollbarsForPanning&&mxUtils.hasScrollbars(this.source.container)||(this.source.panGraph(0,0),d/=this.outline.getView().scale,c/=this.outline.getView().scale,e=this.source.getView().translate,this.source.getView().setTranslate(e.x-
-d,e.y-c));this.update();b.consume()}this.index=null;this.active=!1}};
-mxOutline.prototype.destroy=function(){null!=this.source&&(this.source.removeListener(this.panHandler),this.source.removeListener(this.refreshHandler),this.source.getModel().removeListener(this.updateHandler),this.source.getView().removeListener(this.updateHandler),mxEvent.removeListener(this.source.container,"scroll",this.updateHandler),this.source=null);null!=this.outline&&(this.outline.removeMouseListener(this),this.outline.destroy(),this.outline=null);null!=this.selectionBorder&&(this.selectionBorder.destroy(),
-this.selectionBorder=null);null!=this.sizer&&(this.sizer.destroy(),this.sizer=null)};function mxMultiplicity(a,b,c,d,e,f,g,k,l,m){this.source=a;this.type=b;this.attr=c;this.value=d;this.min=null!=e?e:0;this.max=null!=f?f:"n";this.validNeighbors=g;this.countError=mxResources.get(k)||k;this.typeError=mxResources.get(l)||l;this.validNeighborsAllowed=null!=m?m:!0}mxMultiplicity.prototype.type=null;mxMultiplicity.prototype.attr=null;mxMultiplicity.prototype.value=null;mxMultiplicity.prototype.source=null;
-mxMultiplicity.prototype.min=null;mxMultiplicity.prototype.max=null;mxMultiplicity.prototype.validNeighbors=null;mxMultiplicity.prototype.validNeighborsAllowed=!0;mxMultiplicity.prototype.countError=null;mxMultiplicity.prototype.typeError=null;
-mxMultiplicity.prototype.check=function(a,b,c,d,e,f){var g="";if(this.source&&this.checkTerminal(a,c,b)||!this.source&&this.checkTerminal(a,d,b))null!=this.countError&&(this.source&&(0==this.max||e>=this.max)||!this.source&&(0==this.max||f>=this.max))&&(g+=this.countError+"\n"),null!=this.validNeighbors&&null!=this.typeError&&0<this.validNeighbors.length&&(this.checkNeighbors(a,b,c,d)||(g+=this.typeError+"\n"));return 0<g.length?g:null};
-mxMultiplicity.prototype.checkNeighbors=function(a,b,c,d){b=a.model.getValue(c);d=a.model.getValue(d);c=!this.validNeighborsAllowed;for(var e=this.validNeighbors,f=0;f<e.length;f++)if(this.source&&this.checkType(a,d,e[f])){c=this.validNeighborsAllowed;break}else if(!this.source&&this.checkType(a,b,e[f])){c=this.validNeighborsAllowed;break}return c};mxMultiplicity.prototype.checkTerminal=function(a,b,c){b=a.model.getValue(b);return this.checkType(a,b,this.type,this.attr,this.value)};
-mxMultiplicity.prototype.checkType=function(a,b,c,d,e){return null!=b?isNaN(b.nodeType)?b==c:mxUtils.isNode(b,c,d,e):!1};
-function mxLayoutManager(a){this.undoHandler=mxUtils.bind(this,function(a,c){this.isEnabled()&&this.beforeUndo(c.getProperty("edit"))});this.moveHandler=mxUtils.bind(this,function(a,c){this.isEnabled()&&this.cellsMoved(c.getProperty("cells"),c.getProperty("event"))});this.resizeHandler=mxUtils.bind(this,function(a,c){this.isEnabled()&&this.cellsResized(c.getProperty("cells"),c.getProperty("bounds"),c.getProperty("previous"))});this.setGraph(a)}mxLayoutManager.prototype=new mxEventSource;
-mxLayoutManager.prototype.constructor=mxLayoutManager;mxLayoutManager.prototype.graph=null;mxLayoutManager.prototype.bubbling=!0;mxLayoutManager.prototype.enabled=!0;mxLayoutManager.prototype.undoHandler=null;mxLayoutManager.prototype.moveHandler=null;mxLayoutManager.prototype.resizeHandler=null;mxLayoutManager.prototype.isEnabled=function(){return this.enabled};mxLayoutManager.prototype.setEnabled=function(a){this.enabled=a};mxLayoutManager.prototype.isBubbling=function(){return this.bubbling};
-mxLayoutManager.prototype.setBubbling=function(a){this.bubbling=a};mxLayoutManager.prototype.getGraph=function(){return this.graph};
-mxLayoutManager.prototype.setGraph=function(a){if(null!=this.graph){var b=this.graph.getModel();b.removeListener(this.undoHandler);this.graph.removeListener(this.moveHandler);this.graph.removeListener(this.resizeHandler)}this.graph=a;null!=this.graph&&(b=this.graph.getModel(),b.addListener(mxEvent.BEFORE_UNDO,this.undoHandler),this.graph.addListener(mxEvent.MOVE_CELLS,this.moveHandler),this.graph.addListener(mxEvent.RESIZE_CELLS,this.resizeHandler))};
-mxLayoutManager.prototype.hasLayout=function(a){return this.getLayout(a,mxEvent.LAYOUT_CELLS)};mxLayoutManager.prototype.getLayout=function(a,b){return null};mxLayoutManager.prototype.beforeUndo=function(a){this.executeLayoutForCells(this.getCellsForChanges(a.changes))};
-mxLayoutManager.prototype.cellsMoved=function(a,b){if(null!=a&&null!=b)for(var c=mxUtils.convertPoint(this.getGraph().container,mxEvent.getClientX(b),mxEvent.getClientY(b)),d=this.getGraph().getModel(),e=0;e<a.length;e++){var f=this.getLayout(d.getParent(a[e]),mxEvent.MOVE_CELLS);null!=f&&f.moveCell(a[e],c.x,c.y)}};
-mxLayoutManager.prototype.cellsResized=function(a,b,c){if(null!=a&&null!=b)for(var d=this.getGraph().getModel(),e=0;e<a.length;e++){var f=this.getLayout(d.getParent(a[e]),mxEvent.RESIZE_CELLS);null!=f&&f.resizeCell(a[e],b[e],c[e])}};mxLayoutManager.prototype.getCellsForChanges=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];if(d instanceof mxRootChange)return[];b=b.concat(this.getCellsForChange(d))}return b};
-mxLayoutManager.prototype.getCellsForChange=function(a){return a instanceof mxChildChange?this.addCellsWithLayout(a.child,this.addCellsWithLayout(a.previous)):a instanceof mxTerminalChange||a instanceof mxGeometryChange||a instanceof mxVisibleChange||a instanceof mxStyleChange?this.addCellsWithLayout(a.cell):[]};mxLayoutManager.prototype.addCellsWithLayout=function(a,b){return this.addDescendantsWithLayout(a,this.addAncestorsWithLayout(a,b))};
-mxLayoutManager.prototype.addAncestorsWithLayout=function(a,b){b=null!=b?b:[];if(null!=a&&(null!=this.hasLayout(a)&&b.push(a),this.isBubbling())){var c=this.getGraph().getModel();this.addAncestorsWithLayout(c.getParent(a),b)}return b};mxLayoutManager.prototype.addDescendantsWithLayout=function(a,b){b=null!=b?b:[];if(null!=a&&this.hasLayout(a))for(var c=this.getGraph().getModel(),d=0;d<c.getChildCount(a);d++){var e=c.getChildAt(a,d);this.hasLayout(e)&&(b.push(e),this.addDescendantsWithLayout(e,b))}return b};
-mxLayoutManager.prototype.executeLayoutForCells=function(a){a=mxUtils.sortCells(a,!1);this.layoutCells(a,!0);this.layoutCells(a.reverse(),!1)};mxLayoutManager.prototype.layoutCells=function(a,b){if(0<a.length){var c=this.getGraph().getModel();c.beginUpdate();try{for(var d=null,e=0;e<a.length;e++)a[e]!=c.getRoot()&&a[e]!=d&&(this.executeLayout(a[e],b),d=a[e]);this.fireEvent(new mxEventObject(mxEvent.LAYOUT_CELLS,"cells",a))}finally{c.endUpdate()}}};
-mxLayoutManager.prototype.executeLayout=function(a,b){var c=this.getLayout(a,b?mxEvent.BEGIN_UPDATE:mxEvent.END_UPDATE);null!=c&&c.execute(a)};mxLayoutManager.prototype.destroy=function(){this.setGraph(null)};
-function mxSwimlaneManager(a,b,c,d){this.horizontal=null!=b?b:!0;this.addEnabled=null!=c?c:!0;this.resizeEnabled=null!=d?d:!0;this.addHandler=mxUtils.bind(this,function(a,b){this.isEnabled()&&this.isAddEnabled()&&this.cellsAdded(b.getProperty("cells"))});this.resizeHandler=mxUtils.bind(this,function(a,b){this.isEnabled()&&this.isResizeEnabled()&&this.cellsResized(b.getProperty("cells"))});this.setGraph(a)}mxSwimlaneManager.prototype=new mxEventSource;mxSwimlaneManager.prototype.constructor=mxSwimlaneManager;
-mxSwimlaneManager.prototype.graph=null;mxSwimlaneManager.prototype.enabled=!0;mxSwimlaneManager.prototype.horizontal=!0;mxSwimlaneManager.prototype.addEnabled=!0;mxSwimlaneManager.prototype.resizeEnabled=!0;mxSwimlaneManager.prototype.addHandler=null;mxSwimlaneManager.prototype.resizeHandler=null;mxSwimlaneManager.prototype.isEnabled=function(){return this.enabled};mxSwimlaneManager.prototype.setEnabled=function(a){this.enabled=a};mxSwimlaneManager.prototype.isHorizontal=function(){return this.horizontal};
-mxSwimlaneManager.prototype.setHorizontal=function(a){this.horizontal=a};mxSwimlaneManager.prototype.isAddEnabled=function(){return this.addEnabled};mxSwimlaneManager.prototype.setAddEnabled=function(a){this.addEnabled=a};mxSwimlaneManager.prototype.isResizeEnabled=function(){return this.resizeEnabled};mxSwimlaneManager.prototype.setResizeEnabled=function(a){this.resizeEnabled=a};mxSwimlaneManager.prototype.getGraph=function(){return this.graph};
-mxSwimlaneManager.prototype.setGraph=function(a){null!=this.graph&&(this.graph.removeListener(this.addHandler),this.graph.removeListener(this.resizeHandler));this.graph=a;null!=this.graph&&(this.graph.addListener(mxEvent.ADD_CELLS,this.addHandler),this.graph.addListener(mxEvent.CELLS_RESIZED,this.resizeHandler))};mxSwimlaneManager.prototype.isSwimlaneIgnored=function(a){return!this.getGraph().isSwimlane(a)};
-mxSwimlaneManager.prototype.isCellHorizontal=function(a){return this.graph.isSwimlane(a)?(a=this.graph.getCellStyle(a),1==mxUtils.getValue(a,mxConstants.STYLE_HORIZONTAL,1)):!this.isHorizontal()};mxSwimlaneManager.prototype.cellsAdded=function(a){if(null!=a){var b=this.getGraph().getModel();b.beginUpdate();try{for(var c=0;c<a.length;c++)this.isSwimlaneIgnored(a[c])||this.swimlaneAdded(a[c])}finally{b.endUpdate()}}};
-mxSwimlaneManager.prototype.swimlaneAdded=function(a){for(var b=this.getGraph().getModel(),c=b.getParent(a),d=b.getChildCount(c),e=null,f=0;f<d;f++){var g=b.getChildAt(c,f);if(g!=a&&!this.isSwimlaneIgnored(g)&&(e=b.getGeometry(g),null!=e))break}null!=e&&(b=null!=c?this.isCellHorizontal(c):this.horizontal,this.resizeSwimlane(a,e.width,e.height,b))};
-mxSwimlaneManager.prototype.cellsResized=function(a){if(null!=a){var b=this.getGraph().getModel();b.beginUpdate();try{for(var c=0;c<a.length;c++)if(!this.isSwimlaneIgnored(a[c])){var d=b.getGeometry(a[c]);if(null!=d){for(var e=new mxRectangle(0,0,d.width,d.height),f=a[c],g=f;null!=g;){var f=g,g=b.getParent(g),k=this.graph.isSwimlane(g)?this.graph.getStartSize(g):new mxRectangle;e.width+=k.width;e.height+=k.height}var l=null!=g?this.isCellHorizontal(g):this.horizontal;this.resizeSwimlane(f,e.width,
-e.height,l)}}}finally{b.endUpdate()}}};
-mxSwimlaneManager.prototype.resizeSwimlane=function(a,b,c,d){var e=this.getGraph().getModel();e.beginUpdate();try{var f=this.isCellHorizontal(a);if(!this.isSwimlaneIgnored(a)){var g=e.getGeometry(a);null!=g&&(d&&g.height!=c||!d&&g.width!=b)&&(g=g.clone(),d?g.height=c:g.width=b,e.setGeometry(a,g))}var k=this.graph.isSwimlane(a)?this.graph.getStartSize(a):new mxRectangle;b-=k.width;c-=k.height;var l=e.getChildCount(a);for(d=0;d<l;d++){var m=e.getChildAt(a,d);this.resizeSwimlane(m,b,c,f)}}finally{e.endUpdate()}};
-mxSwimlaneManager.prototype.destroy=function(){this.setGraph(null)};
-function mxTemporaryCellStates(a,b,c,d,e){b=null!=b?b:1;this.view=a;this.oldValidateCellState=a.validateCellState;this.oldBounds=a.getGraphBounds();this.oldStates=a.getStates();this.oldScale=a.getScale();this.oldDoRedrawShape=a.graph.cellRenderer.doRedrawShape;var f=this;null!=e&&(a.graph.cellRenderer.doRedrawShape=function(b){var c=b.shape.paint;b.shape.paint=function(a){var d=e(b);null!=d&&a.setLink(d);c.apply(this,arguments);null!=d&&a.setLink(null)};f.oldDoRedrawShape.apply(a.graph.cellRenderer,
-arguments);b.shape.paint=c});a.validateCellState=function(b,c){return null==b||null==d||d(b)?f.oldValidateCellState.apply(a,arguments):null};a.setStates(new mxDictionary);a.setScale(b);if(null!=c){a.resetValidationState();b=null;for(var g=0;g<c.length;g++){var k=a.getBoundingBox(a.validateCellState(a.validateCell(c[g])));null==b?b=k:b.add(k)}a.setGraphBounds(b||new mxRectangle)}}mxTemporaryCellStates.prototype.view=null;mxTemporaryCellStates.prototype.oldStates=null;
-mxTemporaryCellStates.prototype.oldBounds=null;mxTemporaryCellStates.prototype.oldScale=null;mxTemporaryCellStates.prototype.destroy=function(){this.view.setScale(this.oldScale);this.view.setStates(this.oldStates);this.view.setGraphBounds(this.oldBounds);this.view.validateCellState=this.oldValidateCellState;this.view.graph.cellRenderer.doRedrawShape=this.oldDoRedrawShape};function mxCellStatePreview(a){this.deltas=new mxDictionary;this.graph=a}mxCellStatePreview.prototype.graph=null;
-mxCellStatePreview.prototype.deltas=null;mxCellStatePreview.prototype.count=0;mxCellStatePreview.prototype.isEmpty=function(){return 0==this.count};mxCellStatePreview.prototype.moveState=function(a,b,c,d,e){d=null!=d?d:!0;e=null!=e?e:!0;var f=this.deltas.get(a.cell);null==f?(f={point:new mxPoint(b,c),state:a},this.deltas.put(a.cell,f),this.count++):d?(f.point.x+=b,f.point.y+=c):(f.point.x=b,f.point.y=c);e&&this.addEdges(a);return f.point};
-mxCellStatePreview.prototype.show=function(a){this.deltas.visit(mxUtils.bind(this,function(a,c){this.translateState(c.state,c.point.x,c.point.y)}));this.deltas.visit(mxUtils.bind(this,function(b,c){this.revalidateState(c.state,c.point.x,c.point.y,a)}))};
-mxCellStatePreview.prototype.translateState=function(a,b,c){if(null!=a){var d=this.graph.getModel();if(d.isVertex(a.cell)){a.view.updateCellState(a);var e=d.getGeometry(a.cell);0==b&&0==c||null==e||e.relative&&null==this.deltas.get(a.cell)||(a.x+=b,a.y+=c)}for(var e=d.getChildCount(a.cell),f=0;f<e;f++)this.translateState(a.view.getState(d.getChildAt(a.cell,f)),b,c)}};
-mxCellStatePreview.prototype.revalidateState=function(a,b,c,d){if(null!=a){var e=this.graph.getModel();e.isEdge(a.cell)&&a.view.updateCellState(a);var f=this.graph.getCellGeometry(a.cell),g=a.view.getState(e.getParent(a.cell));0==b&&0==c||null==f||!f.relative||!e.isVertex(a.cell)||null!=g&&!e.isVertex(g.cell)&&null==this.deltas.get(a.cell)||(a.x+=b,a.y+=c);this.graph.cellRenderer.redraw(a);null!=d&&d(a);f=e.getChildCount(a.cell);for(g=0;g<f;g++)this.revalidateState(this.graph.view.getState(e.getChildAt(a.cell,
-g)),b,c,d)}};mxCellStatePreview.prototype.addEdges=function(a){for(var b=this.graph.getModel(),c=b.getEdgeCount(a.cell),d=0;d<c;d++){var e=a.view.getState(b.getEdgeAt(a.cell,d));null!=e&&this.moveState(e,0,0)}};function mxConnectionConstraint(a,b,c,d,e){this.point=a;this.perimeter=null!=b?b:!0;this.name=c;this.dx=d?d:0;this.dy=e?e:0}mxConnectionConstraint.prototype.point=null;mxConnectionConstraint.prototype.perimeter=null;mxConnectionConstraint.prototype.name=null;
-mxConnectionConstraint.prototype.dx=null;mxConnectionConstraint.prototype.dy=null;
-function mxGraphHandler(a){this.graph=a;this.graph.addMouseListener(this);this.panHandler=mxUtils.bind(this,function(){this.suspended||(this.updatePreview(),this.updateHint())});this.graph.addListener(mxEvent.PAN,this.panHandler);this.escapeHandler=mxUtils.bind(this,function(a,c){this.reset()});this.graph.addListener(mxEvent.ESCAPE,this.escapeHandler);this.refreshHandler=mxUtils.bind(this,function(a,c){this.refreshThread&&window.clearTimeout(this.refreshThread);this.refreshThread=window.setTimeout(mxUtils.bind(this,
-function(){this.refreshThread=null;if(null!=this.first&&!this.suspended){var a=this.currentDx,b=this.currentDy;this.currentDy=this.currentDx=0;this.updatePreview();this.bounds=this.graph.getView().getBounds(this.cells);this.pBounds=this.getPreviewBounds(this.cells);null!=this.pBounds||this.livePreviewUsed?(this.currentDx=a,this.currentDy=b,this.updatePreview(),this.updateHint(),this.livePreviewUsed&&(this.setHandlesVisibleForCells(this.graph.selectionCellsHandler.getHandledSelectionCells(),!1,!0),
-this.updatePreview())):this.reset()}}),0)});this.graph.getModel().addListener(mxEvent.CHANGE,this.refreshHandler);this.graph.addListener(mxEvent.REFRESH,this.refreshHandler);this.keyHandler=mxUtils.bind(this,function(a){null==this.graph.container||"hidden"==this.graph.container.style.visibility||null==this.first||this.suspended||(a=this.graph.isCloneEvent(a)&&this.graph.isCellsCloneable()&&this.isCloneEnabled(),a!=this.cloning&&(this.cloning=a,this.checkPreview(),this.updatePreview()))});mxEvent.addListener(document,
-"keydown",this.keyHandler);mxEvent.addListener(document,"keyup",this.keyHandler)}mxGraphHandler.prototype.graph=null;mxGraphHandler.prototype.maxCells=mxClient.IS_IE?20:50;mxGraphHandler.prototype.enabled=!0;mxGraphHandler.prototype.highlightEnabled=!0;mxGraphHandler.prototype.cloneEnabled=!0;mxGraphHandler.prototype.moveEnabled=!0;mxGraphHandler.prototype.guidesEnabled=!1;mxGraphHandler.prototype.handlesVisible=!0;mxGraphHandler.prototype.guide=null;mxGraphHandler.prototype.currentDx=null;
-mxGraphHandler.prototype.currentDy=null;mxGraphHandler.prototype.updateCursor=!0;mxGraphHandler.prototype.selectEnabled=!0;mxGraphHandler.prototype.removeCellsFromParent=!0;mxGraphHandler.prototype.removeEmptyParents=!1;mxGraphHandler.prototype.connectOnDrop=!1;mxGraphHandler.prototype.scrollOnMove=!0;mxGraphHandler.prototype.minimumSize=6;mxGraphHandler.prototype.previewColor="black";mxGraphHandler.prototype.htmlPreview=!1;mxGraphHandler.prototype.shape=null;mxGraphHandler.prototype.scaleGrid=!1;
-mxGraphHandler.prototype.rotationEnabled=!0;mxGraphHandler.prototype.maxLivePreview=0;mxGraphHandler.prototype.allowLivePreview=mxClient.IS_SVG;mxGraphHandler.prototype.isEnabled=function(){return this.enabled};mxGraphHandler.prototype.setEnabled=function(a){this.enabled=a};mxGraphHandler.prototype.isCloneEnabled=function(){return this.cloneEnabled};mxGraphHandler.prototype.setCloneEnabled=function(a){this.cloneEnabled=a};mxGraphHandler.prototype.isMoveEnabled=function(){return this.moveEnabled};
-mxGraphHandler.prototype.setMoveEnabled=function(a){this.moveEnabled=a};mxGraphHandler.prototype.isSelectEnabled=function(){return this.selectEnabled};mxGraphHandler.prototype.setSelectEnabled=function(a){this.selectEnabled=a};mxGraphHandler.prototype.isRemoveCellsFromParent=function(){return this.removeCellsFromParent};mxGraphHandler.prototype.setRemoveCellsFromParent=function(a){this.removeCellsFromParent=a};
-mxGraphHandler.prototype.isPropagateSelectionCell=function(a,b,c){var d=this.graph.model.getParent(a);return b?(b=this.graph.model.isEdge(a)?null:this.graph.getCellGeometry(a),!this.graph.isSiblingSelected(a)&&(null!=b&&b.relative||!this.graph.isSwimlane(d))):(!this.graph.isToggleEvent(c.getEvent())||!this.graph.isSiblingSelected(a)&&!this.graph.isCellSelected(a)&&!this.graph.isSwimlane(d)||this.graph.isCellSelected(d))&&(this.graph.isToggleEvent(c.getEvent())||!this.graph.isCellSelected(d))};
-mxGraphHandler.prototype.getInitialCellForEvent=function(a){var b=a.getState();if(!(this.graph.isToggleEvent(a.getEvent())&&mxEvent.isAltDown(a.getEvent())||null==b||this.graph.isCellSelected(b.cell)))for(var c=this.graph.model,d=this.graph.view.getState(c.getParent(b.cell));null!=d&&!this.graph.isCellSelected(d.cell)&&(c.isVertex(d.cell)||c.isEdge(d.cell))&&this.isPropagateSelectionCell(b.cell,!0,a);)b=d,d=this.graph.view.getState(this.graph.getModel().getParent(b.cell));return null!=b?b.cell:null};
-mxGraphHandler.prototype.isDelayedSelection=function(a,b){if(!this.graph.isToggleEvent(b.getEvent())||!mxEvent.isAltDown(b.getEvent()))for(;null!=a;){if(this.graph.selectionCellsHandler.isHandled(a))return this.graph.cellEditor.getEditingCell()!=a;a=this.graph.model.getParent(a)}return this.graph.isToggleEvent(b.getEvent())&&!mxEvent.isAltDown(b.getEvent())};
-mxGraphHandler.prototype.selectDelayed=function(a){if(!this.graph.popupMenuHandler.isPopupTrigger(a)){var b=a.getCell();null==b&&(b=this.cell);this.selectCellForEvent(b,a)}};
-mxGraphHandler.prototype.selectCellForEvent=function(a,b){var c=this.graph.view.getState(a);if(null!=c){if(!(b.isSource(c.control)||this.graph.isToggleEvent(b.getEvent())&&mxEvent.isAltDown(b.getEvent())))for(var c=this.graph.getModel(),d=c.getParent(a);null!=this.graph.view.getState(d)&&(c.isVertex(d)||c.isEdge(d))&&this.isPropagateSelectionCell(a,!1,b);)a=d,d=c.getParent(a);this.graph.selectCellForEvent(a,b.getEvent())}return a};mxGraphHandler.prototype.consumeMouseEvent=function(a,b){b.consume()};
-mxGraphHandler.prototype.mouseDown=function(a,b){if(!b.isConsumed()&&this.isEnabled()&&this.graph.isEnabled()&&null!=b.getState()&&!mxEvent.isMultiTouchEvent(b.getEvent())){var c=this.getInitialCellForEvent(b);this.delayedSelection=this.isDelayedSelection(c,b);this.cell=null;this.isSelectEnabled()&&!this.delayedSelection&&this.graph.selectCellForEvent(c,b.getEvent());if(this.isMoveEnabled()){var d=this.graph.model,e=d.getGeometry(c);this.graph.isCellMovable(c)&&(!d.isEdge(c)||1<this.graph.getSelectionCount()||
-null!=e.points&&0<e.points.length||null==d.getTerminal(c,!0)||null==d.getTerminal(c,!1)||this.graph.allowDanglingEdges||this.graph.isCloneEvent(b.getEvent())&&this.graph.isCellsCloneable())?this.start(c,b.getX(),b.getY()):this.delayedSelection&&(this.cell=c);this.cellWasClicked=!0;this.consumeMouseEvent(mxEvent.MOUSE_DOWN,b)}}};
-mxGraphHandler.prototype.getGuideStates=function(){var a=this.graph.getDefaultParent(),b=this.graph.getModel(),c=mxUtils.bind(this,function(a){return null!=this.graph.view.getState(a)&&b.isVertex(a)&&null!=b.getGeometry(a)&&!b.getGeometry(a).relative});return this.graph.view.getCellStates(b.filterDescendants(c,a))};mxGraphHandler.prototype.getCells=function(a){return!this.delayedSelection&&this.graph.isCellMovable(a)?[a]:this.graph.getMovableCells(this.graph.getSelectionCells())};
-mxGraphHandler.prototype.getPreviewBounds=function(a){a=this.getBoundingBox(a);null!=a&&(a.width=Math.max(0,a.width-1),a.height=Math.max(0,a.height-1),a.width<this.minimumSize?(a.x-=(this.minimumSize-a.width)/2,a.width=this.minimumSize):(a.x=Math.round(a.x),a.width=Math.ceil(a.width)),a.height<this.minimumSize?(a.y-=(this.minimumSize-a.height)/2,a.height=this.minimumSize):(a.y=Math.round(a.y),a.height=Math.ceil(a.height)));return a};
-mxGraphHandler.prototype.getBoundingBox=function(a){var b=null;if(null!=a&&0<a.length)for(var c=this.graph.getModel(),d=0;d<a.length;d++)if(c.isVertex(a[d])||c.isEdge(a[d])){var e=this.graph.view.getState(a[d]);if(null!=e){var f=e;c.isVertex(a[d])&&null!=e.shape&&null!=e.shape.boundingBox&&(f=e.shape.boundingBox);null==b?b=mxRectangle.fromRectangle(f):b.add(f)}}return b};
-mxGraphHandler.prototype.createPreviewShape=function(a){a=new mxRectangleShape(a,null,this.previewColor);a.isDashed=!0;this.htmlPreview?(a.dialect=mxConstants.DIALECT_STRICTHTML,a.init(this.graph.container)):(a.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG,a.init(this.graph.getView().getOverlayPane()),a.pointerEvents=!1,mxClient.IS_IOS&&(a.getSvgScreenOffset=function(){return 0}));return a};
-mxGraphHandler.prototype.start=function(a,b,c,d){this.cell=a;this.first=mxUtils.convertPoint(this.graph.container,b,c);this.cells=null!=d?d:this.getCells(this.cell);this.bounds=this.graph.getView().getBounds(this.cells);this.pBounds=this.getPreviewBounds(this.cells);this.allCells=new mxDictionary;this.cloning=!1;for(b=this.cellCount=0;b<this.cells.length;b++)this.cellCount+=this.addStates(this.cells[b],this.allCells);if(this.guidesEnabled){this.guide=new mxGuide(this.graph,this.getGuideStates());
-var e=this.graph.model.getParent(a),f=2>this.graph.model.getChildCount(e),g=new mxDictionary;a=this.graph.getOpposites(this.graph.getEdges(this.cell),this.cell);for(b=0;b<a.length;b++)c=this.graph.view.getState(a[b]),null==c||g.get(c)||g.put(c,!0);this.guide.isStateIgnored=mxUtils.bind(this,function(a){var b=this.graph.model.getParent(a.cell);return null!=a.cell&&(!this.cloning&&this.isCellMoving(a.cell)||a.cell!=(this.target||e)&&!f&&!g.get(a)&&(null==this.target||2<=this.graph.model.getChildCount(this.target))&&
-b!=(this.target||e))})}};mxGraphHandler.prototype.addStates=function(a,b){var c=this.graph.view.getState(a),d=0;if(null!=c&&null==b.get(a)){b.put(a,c);d++;for(var c=this.graph.model.getChildCount(a),e=0;e<c;e++)d+=this.addStates(this.graph.model.getChildAt(a,e),b)}return d};mxGraphHandler.prototype.isCellMoving=function(a){return null!=this.allCells.get(a)};
-mxGraphHandler.prototype.useGuidesForEvent=function(a){return null!=this.guide?this.guide.isEnabledForEvent(a.getEvent())&&!this.graph.isConstrainedEvent(a.getEvent()):!0};mxGraphHandler.prototype.snap=function(a){var b=this.scaleGrid?this.graph.view.scale:1;a.x=this.graph.snap(a.x/b)*b;a.y=this.graph.snap(a.y/b)*b;return a};
-mxGraphHandler.prototype.getDelta=function(a){a=mxUtils.convertPoint(this.graph.container,a.getX(),a.getY());return new mxPoint(a.x-this.first.x-this.graph.panDx,a.y-this.first.y-this.graph.panDy)};mxGraphHandler.prototype.updateHint=function(a){};mxGraphHandler.prototype.removeHint=function(){};mxGraphHandler.prototype.roundLength=function(a){return Math.round(100*a)/100};mxGraphHandler.prototype.isValidDropTarget=function(a,b){return this.graph.model.getParent(this.cell)!=a};
-mxGraphHandler.prototype.checkPreview=function(){this.livePreviewActive&&this.cloning?(this.resetLivePreview(),this.livePreviewActive=!1):this.maxLivePreview>=this.cellCount&&!this.livePreviewActive&&this.allowLivePreview?this.cloning&&this.livePreviewActive||(this.livePreviewUsed=this.livePreviewActive=!0):this.livePreviewUsed||null!=this.shape||(this.shape=this.createPreviewShape(this.bounds))};
-mxGraphHandler.prototype.mouseMove=function(a,b){var c=this.graph;if(b.isConsumed()||!c.isMouseDown||null==this.cell||null==this.first||null==this.bounds||this.suspended)!this.isMoveEnabled()&&!this.isCloneEnabled()||!this.updateCursor||b.isConsumed()||null==b.getState()&&null==b.sourceState||c.isMouseDown||(d=c.getCursorForMouseEvent(b),null==d&&c.isEnabled()&&c.isCellMovable(b.getCell())&&(d=c.getModel().isEdge(b.getCell())?mxConstants.CURSOR_MOVABLE_EDGE:mxConstants.CURSOR_MOVABLE_VERTEX),null!=
-d&&null!=b.sourceState&&b.sourceState.setCursor(d));else if(mxEvent.isMultiTouchEvent(b.getEvent()))this.reset();else{var d=this.getDelta(b),e=c.tolerance;if(null!=this.shape||this.livePreviewActive||Math.abs(d.x)>e||Math.abs(d.y)>e){null==this.highlight&&(this.highlight=new mxCellHighlight(this.graph,mxConstants.DROP_TARGET_COLOR,3));var e=c.isCloneEvent(b.getEvent())&&c.isCellsCloneable()&&this.isCloneEnabled(),f=c.isGridEnabledEvent(b.getEvent()),g=b.getCell(),k=!0,l=null;this.cloning=e;c.isDropEnabled()&&
-this.highlightEnabled&&(l=c.getDropTarget(this.cells,b.getEvent(),g,e));var m=c.getView().getState(l),n=!1;null!=m&&(e||this.isValidDropTarget(l,b))?(this.target!=l&&(this.target=l,this.setHighlightColor(mxConstants.DROP_TARGET_COLOR)),n=!0):(this.target=null,this.connectOnDrop&&null!=g&&1==this.cells.length&&c.getModel().isVertex(g)&&c.isCellConnectable(g)&&(m=c.getView().getState(g),null!=m&&(g=null==c.getEdgeValidationError(null,this.cell,g)?mxConstants.VALID_COLOR:mxConstants.INVALID_CONNECT_TARGET_COLOR,
-this.setHighlightColor(g),n=!0)));null!=m&&n?this.highlight.highlight(m):this.highlight.hide();null!=this.guide&&this.useGuidesForEvent(b)?(d=this.guide.move(this.bounds,d,f,e),k=!1):d=this.graph.snapDelta(d,this.bounds,!f,!1,!1);null!=this.guide&&k&&this.guide.hide();c.isConstrainedEvent(b.getEvent())&&(Math.abs(d.x)>Math.abs(d.y)?d.y=0:d.x=0);this.checkPreview();if(this.currentDx!=d.x||this.currentDy!=d.y)this.currentDx=d.x,this.currentDy=d.y,this.updatePreview()}this.updateHint(b);this.consumeMouseEvent(mxEvent.MOUSE_MOVE,
-b);mxEvent.consume(b.getEvent())}};mxGraphHandler.prototype.updatePreview=function(a){this.livePreviewUsed&&!a?null!=this.cells&&(this.setHandlesVisibleForCells(this.graph.selectionCellsHandler.getHandledSelectionCells(),!1),this.updateLivePreview(this.currentDx,this.currentDy)):this.updatePreviewShape()};
-mxGraphHandler.prototype.updatePreviewShape=function(){null!=this.shape&&null!=this.pBounds&&(this.shape.bounds=new mxRectangle(Math.round(this.pBounds.x+this.currentDx),Math.round(this.pBounds.y+this.currentDy),this.pBounds.width,this.pBounds.height),this.shape.redraw())};
-mxGraphHandler.prototype.updateLivePreview=function(a,b){if(!this.suspended){var c=[];null!=this.allCells&&this.allCells.visit(mxUtils.bind(this,function(d,e){var f=this.graph.view.getState(e.cell);f!=e&&(e.destroy(),null!=f?this.allCells.put(e.cell,f):this.allCells.remove(e.cell),e=f);null!=e&&(f=e.clone(),c.push([e,f]),null!=e.shape&&(null==e.shape.originalPointerEvents&&(e.shape.originalPointerEvents=e.shape.pointerEvents),e.shape.pointerEvents=!1,null!=e.text&&(null==e.text.originalPointerEvents&&
-(e.text.originalPointerEvents=e.text.pointerEvents),e.text.pointerEvents=!1)),this.graph.model.isVertex(e.cell))&&((e.x+=a,e.y+=b,this.cloning)?null!=e.text&&(e.text.updateBoundingBox(),null!=e.text.boundingBox&&(e.text.boundingBox.x+=a,e.text.boundingBox.y+=b),null!=e.text.unrotatedBoundingBox&&(e.text.unrotatedBoundingBox.x+=a,e.text.unrotatedBoundingBox.y+=b)):(e.view.graph.cellRenderer.redraw(e,!0),e.view.invalidate(e.cell),e.invalid=!1,null!=e.control&&null!=e.control.node&&(e.control.node.style.visibility=
-"hidden")))}));if(0==c.length)this.reset();else{for(var d=this.graph.view.scale,e=0;e<c.length;e++){var f=c[e][0];if(this.graph.model.isEdge(f.cell)){var g=this.graph.getCellGeometry(f.cell),k=[];if(null!=g&&null!=g.points)for(var l=0;l<g.points.length;l++)null!=g.points[l]&&k.push(new mxPoint(g.points[l].x+a/d,g.points[l].y+b/d));var g=f.visibleSourceState,l=f.visibleTargetState,m=c[e][1].absolutePoints;null!=g&&this.isCellMoving(g.cell)?f.view.updateFixedTerminalPoint(f,g,!0,this.graph.getConnectionConstraint(f,
-g,!0)):(g=m[0],f.setAbsoluteTerminalPoint(new mxPoint(g.x+a,g.y+b),!0),g=null);null!=l&&this.isCellMoving(l.cell)?f.view.updateFixedTerminalPoint(f,l,!1,this.graph.getConnectionConstraint(f,l,!1)):(l=m[m.length-1],f.setAbsoluteTerminalPoint(new mxPoint(l.x+a,l.y+b),!1),l=null);f.view.updatePoints(f,k,g,l);f.view.updateFloatingTerminalPoints(f,g,l);f.view.updateEdgeLabelOffset(f);f.invalid=!1;this.cloning||f.view.graph.cellRenderer.redraw(f,!0)}}this.graph.view.validate();this.redrawHandles(c);this.resetPreviewStates(c)}}};
-mxGraphHandler.prototype.redrawHandles=function(a){for(var b=0;b<a.length;b++){var c=this.graph.selectionCellsHandler.getHandler(a[b][0].cell);null!=c&&c.redraw(!0)}};mxGraphHandler.prototype.resetPreviewStates=function(a){for(var b=0;b<a.length;b++)a[b][0].setState(a[b][1])};
-mxGraphHandler.prototype.suspend=function(){this.suspended||(this.livePreviewUsed&&this.updateLivePreview(0,0),null!=this.shape&&(this.shape.node.style.visibility="hidden"),null!=this.guide&&this.guide.setVisible(!1),this.suspended=!0)};mxGraphHandler.prototype.resume=function(){this.suspended&&(this.suspended=null,this.livePreviewUsed&&(this.livePreviewActive=!0),null!=this.shape&&(this.shape.node.style.visibility="visible"),null!=this.guide&&this.guide.setVisible(!0))};
-mxGraphHandler.prototype.resetLivePreview=function(){null!=this.allCells&&(this.allCells.visit(mxUtils.bind(this,function(a,b){null!=b.shape&&null!=b.shape.originalPointerEvents&&(b.shape.pointerEvents=b.shape.originalPointerEvents,b.shape.originalPointerEvents=null,b.shape.bounds=null,null!=b.text&&(b.text.pointerEvents=b.text.originalPointerEvents,b.text.originalPointerEvents=null));null!=b.control&&null!=b.control.node&&"hidden"==b.control.node.style.visibility&&(b.control.node.style.visibility=
-"");this.cloning||null!=b.text&&b.text.updateBoundingBox();b.view.invalidate(b.cell)})),this.graph.view.validate())};mxGraphHandler.prototype.setHandlesVisibleForCells=function(a,b,c){if(c||this.handlesVisible!=b)for(this.handlesVisible=b,c=0;c<a.length;c++){var d=this.graph.selectionCellsHandler.getHandler(a[c]);null!=d&&(d.setHandlesVisible(b),b&&d.redraw())}};mxGraphHandler.prototype.setHighlightColor=function(a){null!=this.highlight&&this.highlight.setHighlightColor(a)};
-mxGraphHandler.prototype.mouseUp=function(a,b){if(!b.isConsumed())if(this.livePreviewUsed&&this.resetLivePreview(),null==this.cell||null==this.first||null==this.shape&&!this.livePreviewUsed||null==this.currentDx||null==this.currentDy)this.isSelectEnabled()&&this.delayedSelection&&null!=this.cell&&this.selectDelayed(b);else{var c=this.graph,d=b.getCell();if(this.connectOnDrop&&null==this.target&&null!=d&&c.getModel().isVertex(d)&&c.isCellConnectable(d)&&c.isEdgeValid(null,this.cell,d))c.connectionHandler.connect(this.cell,
-d,b.getEvent());else{var d=c.isCloneEvent(b.getEvent())&&c.isCellsCloneable()&&this.isCloneEnabled(),e=c.getView().scale,f=this.roundLength(this.currentDx/e),e=this.roundLength(this.currentDy/e),g=this.target;c.isSplitEnabled()&&c.isSplitTarget(g,this.cells,b.getEvent())?c.splitEdge(g,this.cells,null,f,e,b.getGraphX(),b.getGraphY()):this.moveCells(this.cells,f,e,d,this.target,b.getEvent())}}this.cellWasClicked&&this.consumeMouseEvent(mxEvent.MOUSE_UP,b);this.reset()};
-mxGraphHandler.prototype.reset=function(){this.livePreviewUsed&&(this.resetLivePreview(),this.setHandlesVisibleForCells(this.graph.selectionCellsHandler.getHandledSelectionCells(),!0));this.destroyShapes();this.removeHint();this.delayedSelection=!1;this.livePreviewUsed=this.livePreviewActive=null;this.cellWasClicked=!1;this.cellCount=this.currentDy=this.currentDx=this.suspended=null;this.cloning=!1;this.cell=this.cells=this.first=this.target=this.guides=this.pBounds=this.allCells=null};
-mxGraphHandler.prototype.shouldRemoveCellsFromParent=function(a,b,c){if(this.graph.getModel().isVertex(a)&&(a=this.graph.getView().getState(a),null!=a)){c=mxUtils.convertPoint(this.graph.container,mxEvent.getClientX(c),mxEvent.getClientY(c));var d=mxUtils.toRadians(mxUtils.getValue(a.style,mxConstants.STYLE_ROTATION)||0);if(0!=d){b=Math.cos(-d);var d=Math.sin(-d),e=new mxPoint(a.getCenterX(),a.getCenterY());c=mxUtils.getRotatedPoint(c,b,d,e)}return!mxUtils.contains(a,c.x,c.y)}return!1};
-mxGraphHandler.prototype.moveCells=function(a,b,c,d,e,f){d&&(a=this.graph.getCloneableCells(a));var g=this.graph.getModel().getParent(this.cell);null==e&&this.isRemoveCellsFromParent()&&this.shouldRemoveCellsFromParent(g,a,f)&&(e=this.graph.getDefaultParent());d=d&&!this.graph.isCellLocked(e||this.graph.getDefaultParent());this.graph.getModel().beginUpdate();try{g=[];if(!d&&null!=e&&this.removeEmptyParents){for(var k=new mxDictionary,l=0;l<a.length;l++)k.put(a[l],!0);for(l=0;l<a.length;l++){var m=
-this.graph.model.getParent(a[l]);null==m||k.get(m)||(k.put(m,!0),g.push(m))}}a=this.graph.moveCells(a,b,c,d,e,f);b=[];for(l=0;l<g.length;l++)this.shouldRemoveParent(g[l])&&b.push(g[l]);this.graph.removeCells(b,!1)}finally{this.graph.getModel().endUpdate()}d&&this.graph.setSelectionCells(a);this.isSelectEnabled()&&this.scrollOnMove&&this.graph.scrollCellToVisible(a[0])};
-mxGraphHandler.prototype.shouldRemoveParent=function(a){a=this.graph.view.getState(a);return null!=a&&(this.graph.model.isEdge(a.cell)||this.graph.model.isVertex(a.cell))&&this.graph.isCellDeletable(a.cell)&&0==this.graph.model.getChildCount(a.cell)&&this.graph.isTransparentState(a)};
-mxGraphHandler.prototype.destroyShapes=function(){null!=this.shape&&(this.shape.destroy(),this.shape=null);null!=this.guide&&(this.guide.destroy(),this.guide=null);null!=this.highlight&&(this.highlight.destroy(),this.highlight=null)};
-mxGraphHandler.prototype.destroy=function(){this.graph.removeMouseListener(this);this.graph.removeListener(this.panHandler);null!=this.escapeHandler&&(this.graph.removeListener(this.escapeHandler),this.escapeHandler=null);null!=this.refreshHandler&&(this.graph.getModel().removeListener(this.refreshHandler),this.graph.removeListener(this.refreshHandler),this.refreshHandler=null);mxEvent.removeListener(document,"keydown",this.keyHandler);mxEvent.removeListener(document,"keyup",this.keyHandler);this.destroyShapes();
-this.removeHint()};
-function mxPanningHandler(a){null!=a&&(this.graph=a,this.graph.addMouseListener(this),this.forcePanningHandler=mxUtils.bind(this,function(a,c){var b=c.getProperty("eventName"),e=c.getProperty("event");b==mxEvent.MOUSE_DOWN&&this.isForcePanningEvent(e)&&(this.start(e),this.active=!0,this.fireEvent(new mxEventObject(mxEvent.PAN_START,"event",e)),e.consume())}),this.graph.addListener(mxEvent.FIRE_MOUSE_EVENT,this.forcePanningHandler),this.gestureHandler=mxUtils.bind(this,function(a,c){if(this.isPinchEnabled()){var b=
-c.getProperty("event");mxEvent.isConsumed(b)||"gesturestart"!=b.type?"gestureend"==b.type&&null!=this.initialScale&&(this.initialScale=null):(this.initialScale=this.graph.view.scale,this.active||null==this.mouseDownEvent||(this.start(this.mouseDownEvent),this.mouseDownEvent=null));null!=this.initialScale&&this.zoomGraph(b)}}),this.graph.addListener(mxEvent.GESTURE,this.gestureHandler),this.mouseUpListener=mxUtils.bind(this,function(){this.active&&this.reset()}),mxEvent.addListener(document,"mouseup",
-this.mouseUpListener))}mxPanningHandler.prototype=new mxEventSource;mxPanningHandler.prototype.constructor=mxPanningHandler;mxPanningHandler.prototype.graph=null;mxPanningHandler.prototype.useLeftButtonForPanning=!1;mxPanningHandler.prototype.usePopupTrigger=!0;mxPanningHandler.prototype.ignoreCell=!1;mxPanningHandler.prototype.previewEnabled=!0;mxPanningHandler.prototype.useGrid=!1;mxPanningHandler.prototype.panningEnabled=!0;mxPanningHandler.prototype.pinchEnabled=!0;
-mxPanningHandler.prototype.maxScale=8;mxPanningHandler.prototype.minScale=.01;mxPanningHandler.prototype.dx=null;mxPanningHandler.prototype.dy=null;mxPanningHandler.prototype.startX=0;mxPanningHandler.prototype.startY=0;mxPanningHandler.prototype.isActive=function(){return this.active||null!=this.initialScale};mxPanningHandler.prototype.isPanningEnabled=function(){return this.panningEnabled};mxPanningHandler.prototype.setPanningEnabled=function(a){this.panningEnabled=a};
-mxPanningHandler.prototype.isPinchEnabled=function(){return this.pinchEnabled};mxPanningHandler.prototype.setPinchEnabled=function(a){this.pinchEnabled=a};mxPanningHandler.prototype.isPanningTrigger=function(a){var b=a.getEvent();return this.useLeftButtonForPanning&&null==a.getState()&&mxEvent.isLeftMouseButton(b)||mxEvent.isControlDown(b)&&mxEvent.isShiftDown(b)||this.usePopupTrigger&&mxEvent.isPopupTrigger(b)};mxPanningHandler.prototype.isForcePanningEvent=function(a){return this.ignoreCell||mxEvent.isMultiTouchEvent(a.getEvent())};
-mxPanningHandler.prototype.mouseDown=function(a,b){this.mouseDownEvent=b;!b.isConsumed()&&this.isPanningEnabled()&&!this.active&&this.isPanningTrigger(b)&&(this.start(b),this.consumePanningTrigger(b))};mxPanningHandler.prototype.start=function(a){this.dx0=-this.graph.container.scrollLeft;this.dy0=-this.graph.container.scrollTop;this.startX=a.getX();this.startY=a.getY();this.dy=this.dx=null;this.panningTrigger=!0};mxPanningHandler.prototype.consumePanningTrigger=function(a){a.consume()};
-mxPanningHandler.prototype.mouseMove=function(a,b){this.dx=b.getX()-this.startX;this.dy=b.getY()-this.startY;if(this.active)this.previewEnabled&&(this.useGrid&&(this.dx=this.graph.snap(this.dx),this.dy=this.graph.snap(this.dy)),this.graph.panGraph(this.dx+this.dx0,this.dy+this.dy0)),this.fireEvent(new mxEventObject(mxEvent.PAN,"event",b));else if(this.panningTrigger){var c=this.active;this.active=Math.abs(this.dx)>this.graph.tolerance||Math.abs(this.dy)>this.graph.tolerance;!c&&this.active&&this.fireEvent(new mxEventObject(mxEvent.PAN_START,
-"event",b))}(this.active||this.panningTrigger)&&b.consume()};mxPanningHandler.prototype.mouseUp=function(a,b){if(this.active){if(null!=this.dx&&null!=this.dy){if(!this.graph.useScrollbarsForPanning||!mxUtils.hasScrollbars(this.graph.container)){var c=this.graph.getView().scale,d=this.graph.getView().translate;this.graph.panGraph(0,0);this.panGraph(d.x+this.dx/c,d.y+this.dy/c)}b.consume()}this.fireEvent(new mxEventObject(mxEvent.PAN_END,"event",b))}this.reset()};
-mxPanningHandler.prototype.zoomGraph=function(a){var b=Math.round(this.initialScale*a.scale*100)/100;null!=this.minScale&&(b=Math.max(this.minScale,b));null!=this.maxScale&&(b=Math.min(this.maxScale,b));this.graph.view.scale!=b&&(this.graph.zoomTo(b),mxEvent.consume(a))};mxPanningHandler.prototype.reset=function(){this.panningTrigger=!1;this.mouseDownEvent=null;this.active=!1;this.dy=this.dx=null};mxPanningHandler.prototype.panGraph=function(a,b){this.graph.getView().setTranslate(a,b)};
-mxPanningHandler.prototype.destroy=function(){this.graph.removeMouseListener(this);this.graph.removeListener(this.forcePanningHandler);this.graph.removeListener(this.gestureHandler);mxEvent.removeListener(document,"mouseup",this.mouseUpListener)};
-function mxPopupMenuHandler(a,b){null!=a&&(this.graph=a,this.factoryMethod=b,this.graph.addMouseListener(this),this.gestureHandler=mxUtils.bind(this,function(a,b){this.inTolerance=!1}),this.graph.addListener(mxEvent.GESTURE,this.gestureHandler),this.init())}mxPopupMenuHandler.prototype=new mxPopupMenu;mxPopupMenuHandler.prototype.constructor=mxPopupMenuHandler;mxPopupMenuHandler.prototype.graph=null;mxPopupMenuHandler.prototype.selectOnPopup=!0;
-mxPopupMenuHandler.prototype.clearSelectionOnBackground=!0;mxPopupMenuHandler.prototype.triggerX=null;mxPopupMenuHandler.prototype.triggerY=null;mxPopupMenuHandler.prototype.screenX=null;mxPopupMenuHandler.prototype.screenY=null;mxPopupMenuHandler.prototype.init=function(){mxPopupMenu.prototype.init.apply(this);mxEvent.addGestureListeners(this.div,mxUtils.bind(this,function(a){this.graph.tooltipHandler.hide()}))};mxPopupMenuHandler.prototype.isSelectOnPopup=function(a){return this.selectOnPopup};
-mxPopupMenuHandler.prototype.mouseDown=function(a,b){this.isEnabled()&&!mxEvent.isMultiTouchEvent(b.getEvent())&&(this.hideMenu(),this.triggerX=b.getGraphX(),this.triggerY=b.getGraphY(),this.screenX=mxEvent.getMainEvent(b.getEvent()).screenX,this.screenY=mxEvent.getMainEvent(b.getEvent()).screenY,this.popupTrigger=this.isPopupTrigger(b),this.inTolerance=!0)};
-mxPopupMenuHandler.prototype.mouseMove=function(a,b){this.inTolerance&&null!=this.screenX&&null!=this.screenY&&(Math.abs(mxEvent.getMainEvent(b.getEvent()).screenX-this.screenX)>this.graph.tolerance||Math.abs(mxEvent.getMainEvent(b.getEvent()).screenY-this.screenY)>this.graph.tolerance)&&(this.inTolerance=!1)};
-mxPopupMenuHandler.prototype.mouseUp=function(a,b){if(this.popupTrigger&&this.inTolerance&&null!=this.triggerX&&null!=this.triggerY){var c=this.getCellForPopupEvent(b);this.graph.isEnabled()&&this.isSelectOnPopup(b)&&null!=c&&!this.graph.isCellSelected(c)?this.graph.setSelectionCell(c):this.clearSelectionOnBackground&&null==c&&this.graph.clearSelection();this.graph.tooltipHandler.hide();var d=mxUtils.getScrollOrigin();this.popup(b.getX()+d.x+1,b.getY()+d.y+1,c,b.getEvent());b.consume()}this.inTolerance=
-this.popupTrigger=!1};mxPopupMenuHandler.prototype.getCellForPopupEvent=function(a){return a.getCell()};mxPopupMenuHandler.prototype.destroy=function(){this.graph.removeMouseListener(this);this.graph.removeListener(this.gestureHandler);mxPopupMenu.prototype.destroy.apply(this)};
-function mxCellMarker(a,b,c,d){mxEventSource.call(this);null!=a&&(this.graph=a,this.validColor=null!=b?b:mxConstants.DEFAULT_VALID_COLOR,this.invalidColor=null!=c?c:mxConstants.DEFAULT_INVALID_COLOR,this.hotspot=null!=d?d:mxConstants.DEFAULT_HOTSPOT,this.highlight=new mxCellHighlight(a))}mxUtils.extend(mxCellMarker,mxEventSource);mxCellMarker.prototype.graph=null;mxCellMarker.prototype.enabled=!0;mxCellMarker.prototype.hotspot=mxConstants.DEFAULT_HOTSPOT;mxCellMarker.prototype.hotspotEnabled=!1;
-mxCellMarker.prototype.validColor=null;mxCellMarker.prototype.invalidColor=null;mxCellMarker.prototype.currentColor=null;mxCellMarker.prototype.validState=null;mxCellMarker.prototype.markedState=null;mxCellMarker.prototype.setEnabled=function(a){this.enabled=a};mxCellMarker.prototype.isEnabled=function(){return this.enabled};mxCellMarker.prototype.setHotspot=function(a){this.hotspot=a};mxCellMarker.prototype.getHotspot=function(){return this.hotspot};
-mxCellMarker.prototype.setHotspotEnabled=function(a){this.hotspotEnabled=a};mxCellMarker.prototype.isHotspotEnabled=function(){return this.hotspotEnabled};mxCellMarker.prototype.hasValidState=function(){return null!=this.validState};mxCellMarker.prototype.getValidState=function(){return this.validState};mxCellMarker.prototype.getMarkedState=function(){return this.markedState};mxCellMarker.prototype.reset=function(){this.validState=null;null!=this.markedState&&(this.markedState=null,this.unmark())};
-mxCellMarker.prototype.process=function(a){var b=null;this.isEnabled()&&(b=this.getState(a),this.setCurrentState(b,a));return b};mxCellMarker.prototype.setCurrentState=function(a,b,c){var d=null!=a?this.isValidState(a):!1;c=null!=c?c:this.getMarkerColor(b.getEvent(),a,d);this.validState=d?a:null;if(a!=this.markedState||c!=this.currentColor)this.currentColor=c,null!=a&&null!=this.currentColor?(this.markedState=a,this.mark()):null!=this.markedState&&(this.markedState=null,this.unmark())};
-mxCellMarker.prototype.markCell=function(a,b){var c=this.graph.getView().getState(a);null!=c&&(this.currentColor=null!=b?b:this.validColor,this.markedState=c,this.mark())};mxCellMarker.prototype.mark=function(){this.highlight.setHighlightColor(this.currentColor);this.highlight.highlight(this.markedState);this.fireEvent(new mxEventObject(mxEvent.MARK,"state",this.markedState))};mxCellMarker.prototype.unmark=function(){this.mark()};mxCellMarker.prototype.isValidState=function(a){return!0};
-mxCellMarker.prototype.getMarkerColor=function(a,b,c){return c?this.validColor:this.invalidColor};mxCellMarker.prototype.getState=function(a){var b=this.graph.getView(),c=this.getCell(a),b=this.getStateToMark(b.getState(c));return null!=b&&this.intersects(b,a)?b:null};mxCellMarker.prototype.getCell=function(a){return a.getCell()};mxCellMarker.prototype.getStateToMark=function(a){return a};
-mxCellMarker.prototype.intersects=function(a,b){return this.hotspotEnabled?mxUtils.intersectsHotspot(a,b.getGraphX(),b.getGraphY(),this.hotspot,mxConstants.MIN_HOTSPOT_SIZE,mxConstants.MAX_HOTSPOT_SIZE):!0};mxCellMarker.prototype.destroy=function(){this.graph.getView().removeListener(this.resetHandler);this.graph.getModel().removeListener(this.resetHandler);this.highlight.destroy()};
-function mxSelectionCellsHandler(a){mxEventSource.call(this);this.graph=a;this.handlers=new mxDictionary;this.graph.addMouseListener(this);this.refreshHandler=mxUtils.bind(this,function(a,c){this.isEnabled()&&this.refresh()});this.graph.getSelectionModel().addListener(mxEvent.CHANGE,this.refreshHandler);this.graph.getModel().addListener(mxEvent.CHANGE,this.refreshHandler);this.graph.getView().addListener(mxEvent.SCALE,this.refreshHandler);this.graph.getView().addListener(mxEvent.TRANSLATE,this.refreshHandler);
-this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE,this.refreshHandler);this.graph.getView().addListener(mxEvent.DOWN,this.refreshHandler);this.graph.getView().addListener(mxEvent.UP,this.refreshHandler)}mxUtils.extend(mxSelectionCellsHandler,mxEventSource);mxSelectionCellsHandler.prototype.graph=null;mxSelectionCellsHandler.prototype.enabled=!0;mxSelectionCellsHandler.prototype.refreshHandler=null;mxSelectionCellsHandler.prototype.maxHandlers=100;
-mxSelectionCellsHandler.prototype.handlers=null;mxSelectionCellsHandler.prototype.isEnabled=function(){return this.enabled};mxSelectionCellsHandler.prototype.setEnabled=function(a){this.enabled=a};mxSelectionCellsHandler.prototype.getHandler=function(a){return this.handlers.get(a)};mxSelectionCellsHandler.prototype.isHandled=function(a){return null!=this.getHandler(a)};mxSelectionCellsHandler.prototype.reset=function(){this.handlers.visit(function(a,b){b.reset.apply(b)})};
-mxSelectionCellsHandler.prototype.getHandledSelectionCells=function(){return this.graph.getSelectionCells()};
-mxSelectionCellsHandler.prototype.refresh=function(){var a=this.handlers;this.handlers=new mxDictionary;for(var b=mxUtils.sortCells(this.getHandledSelectionCells(),!1),c=0;c<b.length;c++){var d=this.graph.view.getState(b[c]);if(null!=d){var e=a.remove(b[c]);null!=e&&(e.state!=d?(e.destroy(),e=null):this.isHandlerActive(e)||(null!=e.refresh&&e.refresh(),e.redraw()));null!=e&&this.handlers.put(b[c],e)}}a.visit(mxUtils.bind(this,function(a,b){this.fireEvent(new mxEventObject(mxEvent.REMOVE,"state",b.state));
-b.destroy()}));for(c=0;c<b.length;c++)d=this.graph.view.getState(b[c]),null!=d&&(e=this.handlers.get(b[c]),null==e?(e=this.graph.createHandler(d),this.fireEvent(new mxEventObject(mxEvent.ADD,"state",d)),this.handlers.put(b[c],e)):e.updateParentHighlight())};mxSelectionCellsHandler.prototype.isHandlerActive=function(a){return null!=a.index};
-mxSelectionCellsHandler.prototype.updateHandler=function(a){var b=this.handlers.remove(a.cell);if(null!=b){var c=b.index,d=b.startX,e=b.startY;b.destroy();b=this.graph.createHandler(a);null!=b&&(this.handlers.put(a.cell,b),null!=c&&null!=d&&null!=e&&b.start(d,e,c))}};mxSelectionCellsHandler.prototype.mouseDown=function(a,b){if(this.graph.isEnabled()&&this.isEnabled()){var c=[a,b];this.handlers.visit(function(a,b){b.mouseDown.apply(b,c)})}};
-mxSelectionCellsHandler.prototype.mouseMove=function(a,b){if(this.graph.isEnabled()&&this.isEnabled()){var c=[a,b];this.handlers.visit(function(a,b){b.mouseMove.apply(b,c)})}};mxSelectionCellsHandler.prototype.mouseUp=function(a,b){if(this.graph.isEnabled()&&this.isEnabled()){var c=[a,b];this.handlers.visit(function(a,b){b.mouseUp.apply(b,c)})}};
-mxSelectionCellsHandler.prototype.destroy=function(){this.graph.removeMouseListener(this);null!=this.refreshHandler&&(this.graph.getSelectionModel().removeListener(this.refreshHandler),this.graph.getModel().removeListener(this.refreshHandler),this.graph.getView().removeListener(this.refreshHandler),this.refreshHandler=null)};
-function mxConnectionHandler(a,b){mxEventSource.call(this);null!=a&&(this.graph=a,this.factoryMethod=b,this.init(),this.escapeHandler=mxUtils.bind(this,function(a,b){this.reset()}),this.graph.addListener(mxEvent.ESCAPE,this.escapeHandler))}mxUtils.extend(mxConnectionHandler,mxEventSource);mxConnectionHandler.prototype.graph=null;mxConnectionHandler.prototype.factoryMethod=!0;mxConnectionHandler.prototype.moveIconFront=!1;mxConnectionHandler.prototype.moveIconBack=!1;
-mxConnectionHandler.prototype.connectImage=null;mxConnectionHandler.prototype.targetConnectImage=!1;mxConnectionHandler.prototype.enabled=!0;mxConnectionHandler.prototype.select=!0;mxConnectionHandler.prototype.createTarget=!1;mxConnectionHandler.prototype.marker=null;mxConnectionHandler.prototype.constraintHandler=null;mxConnectionHandler.prototype.error=null;mxConnectionHandler.prototype.waypointsEnabled=!1;mxConnectionHandler.prototype.ignoreMouseDown=!1;mxConnectionHandler.prototype.first=null;
-mxConnectionHandler.prototype.connectIconOffset=new mxPoint(0,mxConstants.TOOLTIP_VERTICAL_OFFSET);mxConnectionHandler.prototype.edgeState=null;mxConnectionHandler.prototype.changeHandler=null;mxConnectionHandler.prototype.drillHandler=null;mxConnectionHandler.prototype.mouseDownCounter=0;mxConnectionHandler.prototype.movePreviewAway=mxClient.IS_VML;mxConnectionHandler.prototype.outlineConnect=!1;mxConnectionHandler.prototype.livePreview=!1;mxConnectionHandler.prototype.cursor=null;
-mxConnectionHandler.prototype.insertBeforeSource=!1;mxConnectionHandler.prototype.isEnabled=function(){return this.enabled};mxConnectionHandler.prototype.setEnabled=function(a){this.enabled=a};mxConnectionHandler.prototype.isInsertBefore=function(a,b,c,d,e){return this.insertBeforeSource&&b!=c};mxConnectionHandler.prototype.isCreateTarget=function(a){return this.createTarget};mxConnectionHandler.prototype.setCreateTarget=function(a){this.createTarget=a};
-mxConnectionHandler.prototype.createShape=function(){var a=this.livePreview&&null!=this.edgeState?this.graph.cellRenderer.createShape(this.edgeState):new mxPolyline([],mxConstants.INVALID_COLOR);a.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG;a.scale=this.graph.view.scale;a.pointerEvents=!1;a.isDashed=!0;a.init(this.graph.getView().getOverlayPane());mxEvent.redirectMouseEvents(a.node,this.graph,null);return a};
-mxConnectionHandler.prototype.init=function(){this.graph.addMouseListener(this);this.marker=this.createMarker();this.constraintHandler=new mxConstraintHandler(this.graph);this.changeHandler=mxUtils.bind(this,function(a){null!=this.iconState&&(this.iconState=this.graph.getView().getState(this.iconState.cell));null!=this.iconState?(this.redrawIcons(this.icons,this.iconState),this.constraintHandler.reset()):null!=this.previous&&null==this.graph.view.getState(this.previous.cell)&&this.reset()});this.graph.getModel().addListener(mxEvent.CHANGE,
-this.changeHandler);this.graph.getView().addListener(mxEvent.SCALE,this.changeHandler);this.graph.getView().addListener(mxEvent.TRANSLATE,this.changeHandler);this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE,this.changeHandler);this.drillHandler=mxUtils.bind(this,function(a){this.reset()});this.graph.addListener(mxEvent.START_EDITING,this.drillHandler);this.graph.getView().addListener(mxEvent.DOWN,this.drillHandler);this.graph.getView().addListener(mxEvent.UP,this.drillHandler)};
-mxConnectionHandler.prototype.isConnectableCell=function(a){return!0};
-mxConnectionHandler.prototype.createMarker=function(){var a=new mxCellMarker(this.graph);a.hotspotEnabled=!0;a.getCell=mxUtils.bind(this,function(b){var c=mxCellMarker.prototype.getCell.apply(a,arguments);this.error=null;null==c&&null!=this.currentPoint&&(c=this.graph.getCellAt(this.currentPoint.x,this.currentPoint.y));if(null!=c&&!this.graph.isCellConnectable(c)){var d=this.graph.getModel().getParent(c);this.graph.getModel().isVertex(d)&&this.graph.isCellConnectable(d)&&(c=d)}if(this.graph.isSwimlane(c)&&
-null!=this.currentPoint&&this.graph.hitsSwimlaneContent(c,this.currentPoint.x,this.currentPoint.y)||!this.isConnectableCell(c))c=null;null!=c?this.isConnecting()?null!=this.previous&&(this.error=this.validateConnection(this.previous.cell,c),null!=this.error&&0==this.error.length&&(c=null,this.isCreateTarget(b.getEvent())&&(this.error=null))):this.isValidSource(c,b)||(c=null):!this.isConnecting()||this.isCreateTarget(b.getEvent())||this.graph.allowDanglingEdges||(this.error="");return c});a.isValidState=
-mxUtils.bind(this,function(b){return this.isConnecting()?null==this.error:mxCellMarker.prototype.isValidState.apply(a,arguments)});a.getMarkerColor=mxUtils.bind(this,function(b,c,d){return null==this.connectImage||this.isConnecting()?mxCellMarker.prototype.getMarkerColor.apply(a,arguments):null});a.intersects=mxUtils.bind(this,function(b,c){return null!=this.connectImage||this.isConnecting()?!0:mxCellMarker.prototype.intersects.apply(a,arguments)});return a};
-mxConnectionHandler.prototype.start=function(a,b,c,d){this.previous=a;this.first=new mxPoint(b,c);this.edgeState=null!=d?d:this.createEdgeState(null);this.marker.currentColor=this.marker.validColor;this.marker.markedState=a;this.marker.mark();this.fireEvent(new mxEventObject(mxEvent.START,"state",this.previous))};mxConnectionHandler.prototype.isConnecting=function(){return null!=this.first&&null!=this.shape};mxConnectionHandler.prototype.isValidSource=function(a,b){return this.graph.isValidSource(a)};
-mxConnectionHandler.prototype.isValidTarget=function(a){return!0};mxConnectionHandler.prototype.validateConnection=function(a,b){return this.isValidTarget(b)?this.graph.getEdgeValidationError(null,a,b):""};mxConnectionHandler.prototype.getConnectImage=function(a){return this.connectImage};mxConnectionHandler.prototype.isMoveIconToFrontForState=function(a){return null!=a.text&&a.text.node.parentNode==this.graph.container?!0:this.moveIconFront};
-mxConnectionHandler.prototype.createIcons=function(a){var b=this.getConnectImage(a);if(null!=b&&null!=a){this.iconState=a;var c=[],d=new mxRectangle(0,0,b.width,b.height),e=new mxImageShape(d,b.src,null,null,0);e.preserveImageAspect=!1;this.isMoveIconToFrontForState(a)?(e.dialect=mxConstants.DIALECT_STRICTHTML,e.init(this.graph.container)):(e.dialect=this.graph.dialect==mxConstants.DIALECT_SVG?mxConstants.DIALECT_SVG:mxConstants.DIALECT_VML,e.init(this.graph.getView().getOverlayPane()),this.moveIconBack&&
-null!=e.node.previousSibling&&e.node.parentNode.insertBefore(e.node,e.node.parentNode.firstChild));e.node.style.cursor=mxConstants.CURSOR_CONNECT;var f=mxUtils.bind(this,function(){return null!=this.currentState?this.currentState:a}),b=mxUtils.bind(this,function(a){mxEvent.isConsumed(a)||(this.icon=e,this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(a,f())))});mxEvent.redirectMouseEvents(e.node,this.graph,f,b);c.push(e);this.redrawIcons(c,this.iconState);return c}return null};
-mxConnectionHandler.prototype.redrawIcons=function(a,b){if(null!=a&&null!=a[0]&&null!=b){var c=this.getIconPosition(a[0],b);a[0].bounds.x=c.x;a[0].bounds.y=c.y;a[0].redraw()}};
-mxConnectionHandler.prototype.getIconPosition=function(a,b){var c=this.graph.getView().scale,d=b.getCenterX(),e=b.getCenterY();if(this.graph.isSwimlane(b.cell)){var f=this.graph.getStartSize(b.cell),d=0!=f.width?b.x+f.width*c/2:d,e=0!=f.height?b.y+f.height*c/2:e,f=mxUtils.toRadians(mxUtils.getValue(b.style,mxConstants.STYLE_ROTATION)||0);if(0!=f)var c=Math.cos(f),f=Math.sin(f),g=new mxPoint(b.getCenterX(),b.getCenterY()),e=mxUtils.getRotatedPoint(new mxPoint(d,e),c,f,g),d=e.x,e=e.y}return new mxPoint(d-
-a.bounds.width/2,e-a.bounds.height/2)};mxConnectionHandler.prototype.destroyIcons=function(){if(null!=this.icons){for(var a=0;a<this.icons.length;a++)this.icons[a].destroy();this.iconState=this.selectedIcon=this.icon=this.icons=null}};mxConnectionHandler.prototype.isStartEvent=function(a){return null!=this.constraintHandler.currentFocus&&null!=this.constraintHandler.currentConstraint||null!=this.previous&&null==this.error&&(null==this.icons||null!=this.icons&&null!=this.icon)};
-mxConnectionHandler.prototype.mouseDown=function(a,b){this.mouseDownCounter++;if(this.isEnabled()&&this.graph.isEnabled()&&!b.isConsumed()&&!this.isConnecting()&&this.isStartEvent(b)){null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus&&null!=this.constraintHandler.currentPoint?(this.sourceConstraint=this.constraintHandler.currentConstraint,this.previous=this.constraintHandler.currentFocus,this.first=this.constraintHandler.currentPoint.clone()):this.first=new mxPoint(b.getGraphX(),
-b.getGraphY());this.edgeState=this.createEdgeState(b);this.mouseDownCounter=1;this.waypointsEnabled&&null==this.shape&&(this.waypoints=null,this.shape=this.createShape(),null!=this.edgeState&&this.shape.apply(this.edgeState));if(null==this.previous&&null!=this.edgeState){var c=this.graph.getPointForEvent(b.getEvent());this.edgeState.cell.geometry.setTerminalPoint(c,!0)}this.fireEvent(new mxEventObject(mxEvent.START,"state",this.previous));b.consume()}this.selectedIcon=this.icon;this.icon=null};
-mxConnectionHandler.prototype.isImmediateConnectSource=function(a){return!this.graph.isCellMovable(a.cell)};mxConnectionHandler.prototype.createEdgeState=function(a){return null};
-mxConnectionHandler.prototype.isOutlineConnectEvent=function(a){var b=mxUtils.getOffset(this.graph.container),c=a.getEvent(),d=mxEvent.getClientX(c),c=mxEvent.getClientY(c),e=document.documentElement,f=this.currentPoint.x-this.graph.container.scrollLeft+b.x-((window.pageXOffset||e.scrollLeft)-(e.clientLeft||0)),b=this.currentPoint.y-this.graph.container.scrollTop+b.y-((window.pageYOffset||e.scrollTop)-(e.clientTop||0));return this.outlineConnect&&!mxEvent.isShiftDown(a.getEvent())&&(a.isSource(this.marker.highlight.shape)||
-mxEvent.isAltDown(a.getEvent())&&null!=a.getState()||this.marker.highlight.isHighlightAt(d,c)||(f!=d||b!=c)&&null==a.getState()&&this.marker.highlight.isHighlightAt(f,b))};
-mxConnectionHandler.prototype.updateCurrentState=function(a,b){this.constraintHandler.update(a,null==this.first,!1,null==this.first||a.isSource(this.marker.highlight.shape)?null:b);if(null!=this.constraintHandler.currentFocus&&null!=this.constraintHandler.currentConstraint)null!=this.marker.highlight&&null!=this.marker.highlight.state&&this.marker.highlight.state.cell==this.constraintHandler.currentFocus.cell?"transparent"!=this.marker.highlight.shape.stroke&&(this.marker.highlight.shape.stroke="transparent",
-this.marker.highlight.repaint()):this.marker.markCell(this.constraintHandler.currentFocus.cell,"transparent"),null!=this.previous&&(this.error=this.validateConnection(this.previous.cell,this.constraintHandler.currentFocus.cell),null==this.error&&(this.currentState=this.constraintHandler.currentFocus),(null!=this.error||null!=this.currentState&&!this.isCellEnabled(this.currentState.cell))&&this.constraintHandler.reset());else{this.graph.isIgnoreTerminalEvent(a.getEvent())?(this.marker.reset(),this.currentState=
-null):(this.marker.process(a),this.currentState=this.marker.getValidState());null==this.currentState||this.isCellEnabled(this.currentState.cell)||(this.constraintHandler.reset(),this.marker.reset(),this.currentState=null);var c=this.isOutlineConnectEvent(a);null!=this.currentState&&c&&(a.isSource(this.marker.highlight.shape)&&(b=new mxPoint(a.getGraphX(),a.getGraphY())),c=this.graph.getOutlineConstraint(b,this.currentState,a),this.constraintHandler.setFocus(a,this.currentState,!1),this.constraintHandler.currentConstraint=
-c,this.constraintHandler.currentPoint=b);this.outlineConnect&&null!=this.marker.highlight&&null!=this.marker.highlight.shape&&(c=this.graph.view.scale,null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus?(this.marker.highlight.shape.stroke=mxConstants.OUTLINE_HIGHLIGHT_COLOR,this.marker.highlight.shape.strokewidth=mxConstants.OUTLINE_HIGHLIGHT_STROKEWIDTH/c/c,this.marker.highlight.repaint()):this.marker.hasValidState()&&(this.graph.isCellConnectable(a.getCell())&&
-this.marker.getValidState()!=a.getState()?(this.marker.highlight.shape.stroke="transparent",this.currentState=null):this.marker.highlight.shape.stroke=mxConstants.DEFAULT_VALID_COLOR,this.marker.highlight.shape.strokewidth=mxConstants.HIGHLIGHT_STROKEWIDTH/c/c,this.marker.highlight.repaint()))}};mxConnectionHandler.prototype.isCellEnabled=function(a){return!0};
-mxConnectionHandler.prototype.convertWaypoint=function(a){var b=this.graph.getView().getScale(),c=this.graph.getView().getTranslate();a.x=a.x/b-c.x;a.y=a.y/b-c.y};
-mxConnectionHandler.prototype.snapToPreview=function(a,b){if(!mxEvent.isAltDown(a.getEvent())&&null!=this.previous){var c=this.graph.gridSize*this.graph.view.scale/2,d=null!=this.sourceConstraint?this.first:new mxPoint(this.previous.getCenterX(),this.previous.getCenterY());Math.abs(d.x-a.getGraphX())<c&&(b.x=d.x);Math.abs(d.y-a.getGraphY())<c&&(b.y=d.y)}};
-mxConnectionHandler.prototype.mouseMove=function(a,b){if(b.isConsumed()||!this.ignoreMouseDown&&null==this.first&&this.graph.isMouseDown)this.constraintHandler.reset();else{this.isEnabled()||null==this.currentState||(this.destroyIcons(),this.currentState=null);var c=this.graph.getView(),d=c.scale,e=c.translate,c=new mxPoint(b.getGraphX(),b.getGraphY());this.error=null;this.graph.isGridEnabledEvent(b.getEvent())&&(c=new mxPoint((this.graph.snap(c.x/d-e.x)+e.x)*d,(this.graph.snap(c.y/d-e.y)+e.y)*d));
-this.snapToPreview(b,c);this.currentPoint=c;(null!=this.first||this.isEnabled()&&this.graph.isEnabled())&&(null!=this.shape||null==this.first||Math.abs(b.getGraphX()-this.first.x)>this.graph.tolerance||Math.abs(b.getGraphY()-this.first.y)>this.graph.tolerance)&&this.updateCurrentState(b,c);if(null!=this.first){var f=null,d=c;null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus&&null!=this.constraintHandler.currentPoint?(f=this.constraintHandler.currentConstraint,
-d=this.constraintHandler.currentPoint.clone()):null!=this.previous&&!this.graph.isIgnoreTerminalEvent(b.getEvent())&&mxEvent.isShiftDown(b.getEvent())&&(Math.abs(this.previous.getCenterX()-c.x)<Math.abs(this.previous.getCenterY()-c.y)?c.x=this.previous.getCenterX():c.y=this.previous.getCenterY());e=this.first;if(null!=this.selectedIcon){var g=this.selectedIcon.bounds.width,k=this.selectedIcon.bounds.height;null!=this.currentState&&this.targetConnectImage?(g=this.getIconPosition(this.selectedIcon,
-this.currentState),this.selectedIcon.bounds.x=g.x,this.selectedIcon.bounds.y=g.y):(g=new mxRectangle(b.getGraphX()+this.connectIconOffset.x,b.getGraphY()+this.connectIconOffset.y,g,k),this.selectedIcon.bounds=g);this.selectedIcon.redraw()}null!=this.edgeState?(this.updateEdgeState(d,f),d=this.edgeState.absolutePoints[this.edgeState.absolutePoints.length-1],e=this.edgeState.absolutePoints[0]):(null!=this.currentState&&null==this.constraintHandler.currentConstraint&&(g=this.getTargetPerimeterPoint(this.currentState,
-b),null!=g&&(d=g)),null==this.sourceConstraint&&null!=this.previous&&(g=this.getSourcePerimeterPoint(this.previous,null!=this.waypoints&&0<this.waypoints.length?this.waypoints[0]:d,b),null!=g&&(e=g)));if(null==this.currentState&&this.movePreviewAway){g=e;null!=this.edgeState&&2<=this.edgeState.absolutePoints.length&&(f=this.edgeState.absolutePoints[this.edgeState.absolutePoints.length-2],null!=f&&(g=f));f=d.x-g.x;g=d.y-g.y;k=Math.sqrt(f*f+g*g);if(0==k)return;this.originalPoint=d.clone();d.x-=4*f/
-k;d.y-=4*g/k}else this.originalPoint=null;null==this.shape&&(f=Math.abs(b.getGraphX()-this.first.x),g=Math.abs(b.getGraphY()-this.first.y),f>this.graph.tolerance||g>this.graph.tolerance)&&(this.shape=this.createShape(),null!=this.edgeState&&this.shape.apply(this.edgeState),this.updateCurrentState(b,c));null!=this.shape&&(null!=this.edgeState?this.shape.points=this.edgeState.absolutePoints:(c=[e],null!=this.waypoints&&(c=c.concat(this.waypoints)),c.push(d),this.shape.points=c),this.drawPreview());
-null!=this.cursor&&(this.graph.container.style.cursor=this.cursor);mxEvent.consume(b.getEvent());b.consume()}else this.isEnabled()&&this.graph.isEnabled()?this.previous!=this.currentState&&null==this.edgeState?(this.destroyIcons(),null!=this.currentState&&null==this.error&&null==this.constraintHandler.currentConstraint&&(this.icons=this.createIcons(this.currentState),null==this.icons&&(this.currentState.setCursor(mxConstants.CURSOR_CONNECT),b.consume())),this.previous=this.currentState):this.previous!=
-this.currentState||null==this.currentState||null!=this.icons||this.graph.isMouseDown||b.consume():this.constraintHandler.reset();if(!this.graph.isMouseDown&&null!=this.currentState&&null!=this.icons){c=!1;d=b.getSource();for(e=0;e<this.icons.length&&!c;e++)c=d==this.icons[e].node||d.parentNode==this.icons[e].node;c||this.updateIcons(this.currentState,this.icons,b)}}};
-mxConnectionHandler.prototype.updateEdgeState=function(a,b){null!=this.sourceConstraint&&null!=this.sourceConstraint.point&&(this.edgeState.style[mxConstants.STYLE_EXIT_X]=this.sourceConstraint.point.x,this.edgeState.style[mxConstants.STYLE_EXIT_Y]=this.sourceConstraint.point.y);null!=b&&null!=b.point?(this.edgeState.style[mxConstants.STYLE_ENTRY_X]=b.point.x,this.edgeState.style[mxConstants.STYLE_ENTRY_Y]=b.point.y):(delete this.edgeState.style[mxConstants.STYLE_ENTRY_X],delete this.edgeState.style[mxConstants.STYLE_ENTRY_Y]);
-this.edgeState.absolutePoints=[null,null!=this.currentState?null:a];this.graph.view.updateFixedTerminalPoint(this.edgeState,this.previous,!0,this.sourceConstraint);null!=this.currentState&&(null==b&&(b=this.graph.getConnectionConstraint(this.edgeState,this.previous,!1)),this.edgeState.setAbsoluteTerminalPoint(null,!1),this.graph.view.updateFixedTerminalPoint(this.edgeState,this.currentState,!1,b));var c=null;if(null!=this.waypoints)for(var c=[],d=0;d<this.waypoints.length;d++){var e=this.waypoints[d].clone();
-this.convertWaypoint(e);c[d]=e}this.graph.view.updatePoints(this.edgeState,c,this.previous,this.currentState);this.graph.view.updateFloatingTerminalPoints(this.edgeState,this.previous,this.currentState)};
-mxConnectionHandler.prototype.getTargetPerimeterPoint=function(a,b){var c=null,d=a.view,e=d.getPerimeterFunction(a);if(null!=e){var f=null!=this.waypoints&&0<this.waypoints.length?this.waypoints[this.waypoints.length-1]:new mxPoint(this.previous.getCenterX(),this.previous.getCenterY()),d=e(d.getPerimeterBounds(a),this.edgeState,f,!1);null!=d&&(c=d)}else c=new mxPoint(a.getCenterX(),a.getCenterY());return c};
-mxConnectionHandler.prototype.getSourcePerimeterPoint=function(a,b,c){c=null;var d=a.view,e=d.getPerimeterFunction(a),f=new mxPoint(a.getCenterX(),a.getCenterY());if(null!=e){var g=mxUtils.getValue(a.style,mxConstants.STYLE_ROTATION,0),k=Math.PI/180*-g;0!=g&&(b=mxUtils.getRotatedPoint(new mxPoint(b.x,b.y),Math.cos(k),Math.sin(k),f));a=e(d.getPerimeterBounds(a),a,b,!1);null!=a&&(0!=g&&(a=mxUtils.getRotatedPoint(new mxPoint(a.x,a.y),Math.cos(-k),Math.sin(-k),f)),c=a)}else c=f;return c};
-mxConnectionHandler.prototype.updateIcons=function(a,b,c){};mxConnectionHandler.prototype.isStopEvent=function(a){return null!=a.getState()};
-mxConnectionHandler.prototype.addWaypointForEvent=function(a){var b=mxUtils.convertPoint(this.graph.container,a.getX(),a.getY()),c=Math.abs(b.x-this.first.x),b=Math.abs(b.y-this.first.y);if(null!=this.waypoints||1<this.mouseDownCounter&&(c>this.graph.tolerance||b>this.graph.tolerance))null==this.waypoints&&(this.waypoints=[]),c=this.graph.view.scale,b=new mxPoint(this.graph.snap(a.getGraphX()/c)*c,this.graph.snap(a.getGraphY()/c)*c),this.waypoints.push(b)};
-mxConnectionHandler.prototype.checkConstraints=function(a,b){return null==a||null==b||null==a.point||null==b.point||!a.point.equals(b.point)||a.dx!=b.dx||a.dy!=b.dy||a.perimeter!=b.perimeter};
-mxConnectionHandler.prototype.mouseUp=function(a,b){if(!b.isConsumed()&&this.isConnecting()){if(this.waypointsEnabled&&!this.isStopEvent(b)){this.addWaypointForEvent(b);b.consume();return}var c=this.sourceConstraint,d=this.constraintHandler.currentConstraint,e=null!=this.previous?this.previous.cell:null,f=null;null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus&&(f=this.constraintHandler.currentFocus.cell);null==f&&null!=this.currentState&&(f=this.currentState.cell);
-null!=this.error||null!=e&&null!=f&&e==f&&!this.checkConstraints(c,d)?(null!=this.previous&&null!=this.marker.validState&&this.previous.cell==this.marker.validState.cell&&this.graph.selectCellForEvent(this.marker.source,b.getEvent()),null!=this.error&&0<this.error.length&&this.graph.validationAlert(this.error)):this.connect(e,f,b.getEvent(),b.getCell());this.destroyIcons();b.consume()}null!=this.first&&this.reset()};
-mxConnectionHandler.prototype.reset=function(){null!=this.shape&&(this.shape.destroy(),this.shape=null);null!=this.cursor&&null!=this.graph.container&&(this.graph.container.style.cursor="");this.destroyIcons();this.marker.reset();this.constraintHandler.reset();this.sourceConstraint=this.error=this.previous=this.edgeState=this.currentPoint=this.originalPoint=null;this.mouseDownCounter=0;this.first=null;this.fireEvent(new mxEventObject(mxEvent.RESET))};
-mxConnectionHandler.prototype.drawPreview=function(){this.updatePreview(null==this.error);this.shape.redraw()};mxConnectionHandler.prototype.updatePreview=function(a){this.shape.strokewidth=this.getEdgeWidth(a);this.shape.stroke=this.getEdgeColor(a)};mxConnectionHandler.prototype.getEdgeColor=function(a){return a?mxConstants.VALID_COLOR:mxConstants.INVALID_COLOR};mxConnectionHandler.prototype.getEdgeWidth=function(a){return a?3:1};
-mxConnectionHandler.prototype.connect=function(a,b,c,d){if(null!=b||this.isCreateTarget(c)||this.graph.allowDanglingEdges){var e=this.graph.getModel(),f=!1,g=null;e.beginUpdate();try{if(null!=a&&null==b&&!this.graph.isIgnoreTerminalEvent(c)&&this.isCreateTarget(c)&&(b=this.createTargetVertex(c,a),null!=b)){d=this.graph.getDropTarget([b],c,d);f=!0;if(null!=d&&this.graph.getModel().isEdge(d))d=this.graph.getDefaultParent();else{var k=this.graph.getView().getState(d);if(null!=k){var l=e.getGeometry(b);
-l.x-=k.origin.x;l.y-=k.origin.y}}this.graph.addCell(b,d)}var m=this.graph.getDefaultParent();null!=a&&null!=b&&e.getParent(a)==e.getParent(b)&&e.getParent(e.getParent(a))!=e.getRoot()&&(m=e.getParent(a),null!=a.geometry&&a.geometry.relative&&null!=b.geometry&&b.geometry.relative&&(m=e.getParent(m)));var n=k=null;null!=this.edgeState&&(k=this.edgeState.cell.value,n=this.edgeState.cell.style);g=this.insertEdge(m,null,k,a,b,n);if(null!=g){this.graph.setConnectionConstraint(g,a,!0,this.sourceConstraint);
-this.graph.setConnectionConstraint(g,b,!1,this.constraintHandler.currentConstraint);null!=this.edgeState&&e.setGeometry(g,this.edgeState.cell.geometry);m=e.getParent(a);if(this.isInsertBefore(g,a,b,c,d)){for(l=a;null!=l.parent&&null!=l.geometry&&l.geometry.relative&&l.parent!=g.parent;)l=this.graph.model.getParent(l);null!=l&&null!=l.parent&&l.parent==g.parent&&e.add(m,g,l.parent.getIndex(l))}var p=e.getGeometry(g);null==p&&(p=new mxGeometry,p.relative=!0,e.setGeometry(g,p));if(null!=this.waypoints&&
-0<this.waypoints.length){var q=this.graph.view.scale,r=this.graph.view.translate;p.points=[];for(a=0;a<this.waypoints.length;a++){var t=this.waypoints[a];p.points.push(new mxPoint(t.x/q-r.x,t.y/q-r.y))}}if(null==b){var u=this.graph.view.translate,q=this.graph.view.scale,t=null!=this.originalPoint?new mxPoint(this.originalPoint.x/q-u.x,this.originalPoint.y/q-u.y):new mxPoint(this.currentPoint.x/q-u.x,this.currentPoint.y/q-u.y);t.x-=this.graph.panDx/this.graph.view.scale;t.y-=this.graph.panDy/this.graph.view.scale;
-p.setTerminalPoint(t,!1)}this.fireEvent(new mxEventObject(mxEvent.CONNECT,"cell",g,"terminal",b,"event",c,"target",d,"terminalInserted",f))}}catch(x){mxLog.show(),mxLog.debug(x.message)}finally{e.endUpdate()}this.select&&this.selectCells(g,f?b:null)}};mxConnectionHandler.prototype.selectCells=function(a,b){this.graph.setSelectionCell(a)};
-mxConnectionHandler.prototype.insertEdge=function(a,b,c,d,e,f){if(null==this.factoryMethod)return this.graph.insertEdge(a,b,c,d,e,f);b=this.createEdge(c,d,e,f);return b=this.graph.addEdge(b,a,d,e)};
-mxConnectionHandler.prototype.createTargetVertex=function(a,b){for(var c=this.graph.getCellGeometry(b);null!=c&&c.relative;)b=this.graph.getModel().getParent(b),c=this.graph.getCellGeometry(b);var d=this.graph.cloneCell(b),c=this.graph.getModel().getGeometry(d);if(null!=c){var e=this.graph.view.translate,f=this.graph.view.scale,g=new mxPoint(this.currentPoint.x/f-e.x,this.currentPoint.y/f-e.y);c.x=Math.round(g.x-c.width/2-this.graph.panDx/f);c.y=Math.round(g.y-c.height/2-this.graph.panDy/f);g=this.getAlignmentTolerance();
-if(0<g){var k=this.graph.view.getState(b);if(null!=k){var l=k.x/f-e.x,e=k.y/f-e.y;Math.abs(l-c.x)<=g&&(c.x=Math.round(l));Math.abs(e-c.y)<=g&&(c.y=Math.round(e))}}}return d};mxConnectionHandler.prototype.getAlignmentTolerance=function(a){return this.graph.isGridEnabled()?this.graph.gridSize/2:this.graph.tolerance};
-mxConnectionHandler.prototype.createEdge=function(a,b,c,d){var e=null;null!=this.factoryMethod&&(e=this.factoryMethod(b,c,d));null==e&&(e=new mxCell(a||""),e.setEdge(!0),e.setStyle(d),a=new mxGeometry,a.relative=!0,e.setGeometry(a));return e};
-mxConnectionHandler.prototype.destroy=function(){this.graph.removeMouseListener(this);null!=this.shape&&(this.shape.destroy(),this.shape=null);null!=this.marker&&(this.marker.destroy(),this.marker=null);null!=this.constraintHandler&&(this.constraintHandler.destroy(),this.constraintHandler=null);null!=this.changeHandler&&(this.graph.getModel().removeListener(this.changeHandler),this.graph.getView().removeListener(this.changeHandler),this.changeHandler=null);null!=this.drillHandler&&(this.graph.removeListener(this.drillHandler),
-this.graph.getView().removeListener(this.drillHandler),this.drillHandler=null);null!=this.escapeHandler&&(this.graph.removeListener(this.escapeHandler),this.escapeHandler=null)};
-function mxConstraintHandler(a){this.graph=a;this.resetHandler=mxUtils.bind(this,function(a,c){null!=this.currentFocus&&null==this.graph.view.getState(this.currentFocus.cell)?this.reset():this.redraw()});this.graph.model.addListener(mxEvent.CHANGE,this.resetHandler);this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE,this.resetHandler);this.graph.view.addListener(mxEvent.TRANSLATE,this.resetHandler);this.graph.view.addListener(mxEvent.SCALE,this.resetHandler);this.graph.addListener(mxEvent.ROOT,
-this.resetHandler)}mxConstraintHandler.prototype.pointImage=new mxImage(mxClient.imageBasePath+"/point.gif",5,5);mxConstraintHandler.prototype.graph=null;mxConstraintHandler.prototype.enabled=!0;mxConstraintHandler.prototype.highlightColor=mxConstants.DEFAULT_VALID_COLOR;mxConstraintHandler.prototype.isEnabled=function(){return this.enabled};mxConstraintHandler.prototype.setEnabled=function(a){this.enabled=a};
-mxConstraintHandler.prototype.reset=function(){if(null!=this.focusIcons){for(var a=0;a<this.focusIcons.length;a++)this.focusIcons[a].destroy();this.focusIcons=null}null!=this.focusHighlight&&(this.focusHighlight.destroy(),this.focusHighlight=null);this.focusPoints=this.currentFocus=this.currentPoint=this.currentFocusArea=this.currentConstraint=null};mxConstraintHandler.prototype.getTolerance=function(a){return this.graph.getTolerance()};
-mxConstraintHandler.prototype.getImageForConstraint=function(a,b,c){return this.pointImage};mxConstraintHandler.prototype.isEventIgnored=function(a,b){return!1};mxConstraintHandler.prototype.isStateIgnored=function(a,b){return!1};mxConstraintHandler.prototype.destroyIcons=function(){if(null!=this.focusIcons){for(var a=0;a<this.focusIcons.length;a++)this.focusIcons[a].destroy();this.focusPoints=this.focusIcons=null}};
-mxConstraintHandler.prototype.destroyFocusHighlight=function(){null!=this.focusHighlight&&(this.focusHighlight.destroy(),this.focusHighlight=null)};mxConstraintHandler.prototype.isKeepFocusEvent=function(a){return mxEvent.isShiftDown(a.getEvent())};
-mxConstraintHandler.prototype.getCellForEvent=function(a,b){var c=a.getCell();null!=c||null==b||a.getGraphX()==b.x&&a.getGraphY()==b.y||(c=this.graph.getCellAt(b.x,b.y));if(null!=c&&!this.graph.isCellConnectable(c)){var d=this.graph.getModel().getParent(c);this.graph.getModel().isVertex(d)&&this.graph.isCellConnectable(d)&&(c=d)}return this.graph.isCellLocked(c)?null:c};
-mxConstraintHandler.prototype.update=function(a,b,c,d){if(this.isEnabled()&&!this.isEventIgnored(a)){null==this.mouseleaveHandler&&null!=this.graph.container&&(this.mouseleaveHandler=mxUtils.bind(this,function(){this.reset()}),mxEvent.addListener(this.graph.container,"mouseleave",this.resetHandler));var e=this.getTolerance(a),f=null!=d?d.x:a.getGraphX(),g=null!=d?d.y:a.getGraphY(),f=new mxRectangle(f-e,g-e,2*e,2*e),e=new mxRectangle(a.getGraphX()-e,a.getGraphY()-e,2*e,2*e),k=this.graph.view.getState(this.getCellForEvent(a,
-d));this.isKeepFocusEvent(a)||null!=this.currentFocusArea&&null!=this.currentFocus&&null==k&&this.graph.getModel().isVertex(this.currentFocus.cell)&&mxUtils.intersects(this.currentFocusArea,e)||k==this.currentFocus||(this.currentFocus=this.currentFocusArea=null,this.setFocus(a,k,b));a=this.currentPoint=this.currentConstraint=null;if(null!=this.focusIcons&&null!=this.constraints&&(null==k||this.currentFocus==k))for(var g=e.getCenterX(),l=e.getCenterY(),m=0;m<this.focusIcons.length;m++){var n=g-this.focusIcons[m].bounds.getCenterX(),
-p=l-this.focusIcons[m].bounds.getCenterY(),n=n*n+p*p;if((this.intersects(this.focusIcons[m],e,b,c)||null!=d&&this.intersects(this.focusIcons[m],f,b,c))&&(null==a||n<a)){this.currentConstraint=this.constraints[m];this.currentPoint=this.focusPoints[m];a=n;n=this.focusIcons[m].bounds.clone();n.grow(mxConstants.HIGHLIGHT_SIZE+1);--n.width;--n.height;if(null==this.focusHighlight){p=this.createHighlightShape();p.dialect=this.graph.dialect==mxConstants.DIALECT_SVG?mxConstants.DIALECT_SVG:mxConstants.DIALECT_VML;
-p.pointerEvents=!1;p.init(this.graph.getView().getOverlayPane());this.focusHighlight=p;var q=mxUtils.bind(this,function(){return null!=this.currentFocus?this.currentFocus:k});mxEvent.redirectMouseEvents(p.node,this.graph,q)}this.focusHighlight.bounds=n;this.focusHighlight.redraw()}}null==this.currentConstraint&&this.destroyFocusHighlight()}else this.currentPoint=this.currentFocus=this.currentConstraint=null};
-mxConstraintHandler.prototype.redraw=function(){if(null!=this.currentFocus&&null!=this.constraints&&null!=this.focusIcons){var a=this.graph.view.getState(this.currentFocus.cell);this.currentFocus=a;this.currentFocusArea=new mxRectangle(a.x,a.y,a.width,a.height);for(var b=0;b<this.constraints.length;b++){var c=this.graph.getConnectionPoint(a,this.constraints[b]),d=this.getImageForConstraint(a,this.constraints[b],c),d=new mxRectangle(Math.round(c.x-d.width/2),Math.round(c.y-d.height/2),d.width,d.height);
-this.focusIcons[b].bounds=d;this.focusIcons[b].redraw();this.currentFocusArea.add(this.focusIcons[b].bounds);this.focusPoints[b]=c}}};
-mxConstraintHandler.prototype.setFocus=function(a,b,c){this.constraints=null!=b&&!this.isStateIgnored(b,c)&&this.graph.isCellConnectable(b.cell)?this.isEnabled()?this.graph.getAllConnectionConstraints(b,c)||[]:[]:null;if(null!=this.constraints){this.currentFocus=b;this.currentFocusArea=new mxRectangle(b.x,b.y,b.width,b.height);if(null!=this.focusIcons){for(c=0;c<this.focusIcons.length;c++)this.focusIcons[c].destroy();this.focusPoints=this.focusIcons=null}this.focusPoints=[];this.focusIcons=[];for(c=
-0;c<this.constraints.length;c++){var d=this.graph.getConnectionPoint(b,this.constraints[c]),e=this.getImageForConstraint(b,this.constraints[c],d),f=e.src,e=new mxRectangle(Math.round(d.x-e.width/2),Math.round(d.y-e.height/2),e.width,e.height),f=new mxImageShape(e,f);f.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_MIXEDHTML:mxConstants.DIALECT_SVG;f.preserveImageAspect=!1;f.init(this.graph.getView().getDecoratorPane());(mxClient.IS_QUIRKS||8==document.documentMode)&&mxEvent.addListener(f.node,
-"dragstart",function(a){mxEvent.consume(a);return!1});null!=f.node.previousSibling&&f.node.parentNode.insertBefore(f.node,f.node.parentNode.firstChild);e=mxUtils.bind(this,function(){return null!=this.currentFocus?this.currentFocus:b});f.redraw();mxEvent.redirectMouseEvents(f.node,this.graph,e);this.currentFocusArea.add(f.bounds);this.focusIcons.push(f);this.focusPoints.push(d)}this.currentFocusArea.grow(this.getTolerance(a))}else this.destroyIcons(),this.destroyFocusHighlight()};
-mxConstraintHandler.prototype.createHighlightShape=function(){var a=new mxRectangleShape(null,this.highlightColor,this.highlightColor,mxConstants.HIGHLIGHT_STROKEWIDTH);a.opacity=mxConstants.HIGHLIGHT_OPACITY;return a};mxConstraintHandler.prototype.intersects=function(a,b,c,d){return mxUtils.intersects(a.bounds,b)};
-mxConstraintHandler.prototype.destroy=function(){this.reset();null!=this.resetHandler&&(this.graph.model.removeListener(this.resetHandler),this.graph.view.removeListener(this.resetHandler),this.graph.removeListener(this.resetHandler),this.resetHandler=null);null!=this.mouseleaveHandler&&null!=this.graph.container&&(mxEvent.removeListener(this.graph.container,"mouseleave",this.mouseleaveHandler),this.mouseleaveHandler=null)};
-function mxRubberband(a){null!=a&&(this.graph=a,this.graph.addMouseListener(this),this.forceRubberbandHandler=mxUtils.bind(this,function(a,c){var b=c.getProperty("eventName"),e=c.getProperty("event");if(b==mxEvent.MOUSE_DOWN&&this.isForceRubberbandEvent(e)){var b=mxUtils.getOffset(this.graph.container),f=mxUtils.getScrollOrigin(this.graph.container);f.x-=b.x;f.y-=b.y;this.start(e.getX()+f.x,e.getY()+f.y);e.consume(!1)}}),this.graph.addListener(mxEvent.FIRE_MOUSE_EVENT,this.forceRubberbandHandler),
-this.panHandler=mxUtils.bind(this,function(){this.repaint()}),this.graph.addListener(mxEvent.PAN,this.panHandler),this.gestureHandler=mxUtils.bind(this,function(a,c){null!=this.first&&this.reset()}),this.graph.addListener(mxEvent.GESTURE,this.gestureHandler),mxClient.IS_IE&&mxEvent.addListener(window,"unload",mxUtils.bind(this,function(){this.destroy()})))}mxRubberband.prototype.defaultOpacity=20;mxRubberband.prototype.enabled=!0;mxRubberband.prototype.div=null;mxRubberband.prototype.sharedDiv=null;
-mxRubberband.prototype.currentX=0;mxRubberband.prototype.currentY=0;mxRubberband.prototype.fadeOut=!1;mxRubberband.prototype.isEnabled=function(){return this.enabled};mxRubberband.prototype.setEnabled=function(a){this.enabled=a};mxRubberband.prototype.isForceRubberbandEvent=function(a){return mxEvent.isAltDown(a.getEvent())};
-mxRubberband.prototype.mouseDown=function(a,b){if(!b.isConsumed()&&this.isEnabled()&&this.graph.isEnabled()&&null==b.getState()&&!mxEvent.isMultiTouchEvent(b.getEvent())){var c=mxUtils.getOffset(this.graph.container),d=mxUtils.getScrollOrigin(this.graph.container);d.x-=c.x;d.y-=c.y;this.start(b.getX()+d.x,b.getY()+d.y);b.consume(!1)}};
-mxRubberband.prototype.start=function(a,b){function c(a){a=new mxMouseEvent(a);var b=mxUtils.convertPoint(d,a.getX(),a.getY());a.graphX=b.x;a.graphY=b.y;return a}this.first=new mxPoint(a,b);var d=this.graph.container;this.dragHandler=mxUtils.bind(this,function(a){this.mouseMove(this.graph,c(a))});this.dropHandler=mxUtils.bind(this,function(a){this.mouseUp(this.graph,c(a))});mxClient.IS_FF&&mxEvent.addGestureListeners(document,null,this.dragHandler,this.dropHandler)};
-mxRubberband.prototype.mouseMove=function(a,b){if(!b.isConsumed()&&null!=this.first){var c=mxUtils.getScrollOrigin(this.graph.container),d=mxUtils.getOffset(this.graph.container);c.x-=d.x;c.y-=d.y;var d=b.getX()+c.x,c=b.getY()+c.y,e=this.first.x-d,f=this.first.y-c,g=this.graph.tolerance;if(null!=this.div||Math.abs(e)>g||Math.abs(f)>g)null==this.div&&(this.div=this.createShape()),mxUtils.clearSelection(),this.update(d,c),b.consume()}};
-mxRubberband.prototype.createShape=function(){null==this.sharedDiv&&(this.sharedDiv=document.createElement("div"),this.sharedDiv.className="mxRubberband",mxUtils.setOpacity(this.sharedDiv,this.defaultOpacity));this.graph.container.appendChild(this.sharedDiv);var a=this.sharedDiv;mxClient.IS_SVG&&(!mxClient.IS_IE||10<=document.documentMode)&&this.fadeOut&&(this.sharedDiv=null);return a};mxRubberband.prototype.isActive=function(a,b){return null!=this.div&&"none"!=this.div.style.display};
-mxRubberband.prototype.mouseUp=function(a,b){var c=this.isActive();this.reset();c&&(this.execute(b.getEvent()),b.consume())};mxRubberband.prototype.execute=function(a){var b=new mxRectangle(this.x,this.y,this.width,this.height);this.graph.selectRegion(b,a)};
-mxRubberband.prototype.reset=function(){if(null!=this.div)if(mxClient.IS_SVG&&(!mxClient.IS_IE||10<=document.documentMode)&&this.fadeOut){var a=this.div;mxUtils.setPrefixedStyle(a.style,"transition","all 0.2s linear");a.style.pointerEvents="none";a.style.opacity=0;window.setTimeout(function(){a.parentNode.removeChild(a)},200)}else this.div.parentNode.removeChild(this.div);mxEvent.removeGestureListeners(document,null,this.dragHandler,this.dropHandler);this.dropHandler=this.dragHandler=null;this.currentY=
-this.currentX=0;this.div=this.first=null};mxRubberband.prototype.update=function(a,b){this.currentX=a;this.currentY=b;this.repaint()};
-mxRubberband.prototype.repaint=function(){if(null!=this.div){var a=this.currentX-this.graph.panDx,b=this.currentY-this.graph.panDy;this.x=Math.min(this.first.x,a);this.y=Math.min(this.first.y,b);this.width=Math.max(this.first.x,a)-this.x;this.height=Math.max(this.first.y,b)-this.y;a=mxClient.IS_VML?this.graph.panDy:0;this.div.style.left=this.x+(mxClient.IS_VML?this.graph.panDx:0)+"px";this.div.style.top=this.y+a+"px";this.div.style.width=Math.max(1,this.width)+"px";this.div.style.height=Math.max(1,
-this.height)+"px"}};mxRubberband.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.graph.removeMouseListener(this),this.graph.removeListener(this.forceRubberbandHandler),this.graph.removeListener(this.panHandler),this.reset(),null!=this.sharedDiv&&(this.sharedDiv=null))};function mxHandle(a,b,c,d){this.graph=a.view.graph;this.state=a;this.cursor=null!=b?b:this.cursor;this.image=null!=c?c:this.image;this.shape=null!=d?d:null;this.init()}mxHandle.prototype.cursor="default";
-mxHandle.prototype.image=null;mxHandle.prototype.ignoreGrid=!1;mxHandle.prototype.getPosition=function(a){};mxHandle.prototype.setPosition=function(a,b,c){};mxHandle.prototype.execute=function(a){};mxHandle.prototype.copyStyle=function(a){this.graph.setCellStyles(a,this.state.style[a],[this.state.cell])};
-mxHandle.prototype.processEvent=function(a){var b=this.graph.view.scale,c=this.graph.view.translate,c=new mxPoint(a.getGraphX()/b-c.x,a.getGraphY()/b-c.y);null!=this.shape&&null!=this.shape.bounds&&(c.x-=this.shape.bounds.width/b/4,c.y-=this.shape.bounds.height/b/4);var b=-mxUtils.toRadians(this.getRotation()),d=-mxUtils.toRadians(this.getTotalRotation())-b,c=this.flipPoint(this.rotatePoint(this.snapPoint(this.rotatePoint(c,b),this.ignoreGrid||!this.graph.isGridEnabledEvent(a.getEvent())),d));this.setPosition(this.state.getPaintBounds(),
-c,a);this.redraw()};mxHandle.prototype.positionChanged=function(){null!=this.state.text&&this.state.text.apply(this.state);null!=this.state.shape&&this.state.shape.apply(this.state);this.graph.cellRenderer.redraw(this.state,!0)};mxHandle.prototype.getRotation=function(){return null!=this.state.shape?this.state.shape.getRotation():0};mxHandle.prototype.getTotalRotation=function(){return null!=this.state.shape?this.state.shape.getShapeRotation():0};
-mxHandle.prototype.init=function(){var a=this.isHtmlRequired();null!=this.image?(this.shape=new mxImageShape(new mxRectangle(0,0,this.image.width,this.image.height),this.image.src),this.shape.preserveImageAspect=!1):null==this.shape&&(this.shape=this.createShape(a));this.initShape(a)};mxHandle.prototype.createShape=function(a){a=new mxRectangle(0,0,mxConstants.HANDLE_SIZE,mxConstants.HANDLE_SIZE);return new mxRectangleShape(a,mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)};
-mxHandle.prototype.initShape=function(a){a&&this.shape.isHtmlAllowed()?(this.shape.dialect=mxConstants.DIALECT_STRICTHTML,this.shape.init(this.graph.container)):(this.shape.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_MIXEDHTML:mxConstants.DIALECT_SVG,null!=this.cursor&&this.shape.init(this.graph.getView().getOverlayPane()));mxEvent.redirectMouseEvents(this.shape.node,this.graph,this.state);this.shape.node.style.cursor=this.cursor};
-mxHandle.prototype.redraw=function(){if(null!=this.shape&&null!=this.state.shape){var a=this.getPosition(this.state.getPaintBounds());if(null!=a){var b=mxUtils.toRadians(this.getTotalRotation()),a=this.rotatePoint(this.flipPoint(a),b),b=this.graph.view.scale,c=this.graph.view.translate;this.shape.bounds.x=Math.floor((a.x+c.x)*b-this.shape.bounds.width/2);this.shape.bounds.y=Math.floor((a.y+c.y)*b-this.shape.bounds.height/2);this.shape.redraw()}}};
-mxHandle.prototype.isHtmlRequired=function(){return null!=this.state.text&&this.state.text.node.parentNode==this.graph.container};mxHandle.prototype.rotatePoint=function(a,b){var c=this.state.getCellBounds(),c=new mxPoint(c.getCenterX(),c.getCenterY());return mxUtils.getRotatedPoint(a,Math.cos(b),Math.sin(b),c)};
-mxHandle.prototype.flipPoint=function(a){if(null!=this.state.shape){var b=this.state.getCellBounds();this.state.shape.flipH&&(a.x=2*b.x+b.width-a.x);this.state.shape.flipV&&(a.y=2*b.y+b.height-a.y)}return a};mxHandle.prototype.snapPoint=function(a,b){b||(a.x=this.graph.snap(a.x),a.y=this.graph.snap(a.y));return a};mxHandle.prototype.setVisible=function(a){null!=this.shape&&null!=this.shape.node&&(this.shape.node.style.display=a?"":"none")};
-mxHandle.prototype.reset=function(){this.setVisible(!0);this.state.style=this.graph.getCellStyle(this.state.cell);this.positionChanged()};mxHandle.prototype.destroy=function(){null!=this.shape&&(this.shape.destroy(),this.shape=null)};
-function mxVertexHandler(a){null!=a&&(this.state=a,this.init(),this.escapeHandler=mxUtils.bind(this,function(a,c){this.livePreview&&null!=this.index&&(this.state.view.graph.cellRenderer.redraw(this.state,!0),this.state.view.invalidate(this.state.cell),this.state.invalid=!1,this.state.view.validate());this.reset()}),this.state.view.graph.addListener(mxEvent.ESCAPE,this.escapeHandler))}mxVertexHandler.prototype.graph=null;mxVertexHandler.prototype.state=null;mxVertexHandler.prototype.singleSizer=!1;
-mxVertexHandler.prototype.index=null;mxVertexHandler.prototype.allowHandleBoundsCheck=!0;mxVertexHandler.prototype.handleImage=null;mxVertexHandler.prototype.handlesVisible=!0;mxVertexHandler.prototype.tolerance=0;mxVertexHandler.prototype.rotationEnabled=!1;mxVertexHandler.prototype.parentHighlightEnabled=!1;mxVertexHandler.prototype.rotationRaster=!0;mxVertexHandler.prototype.rotationCursor="crosshair";mxVertexHandler.prototype.livePreview=!1;mxVertexHandler.prototype.movePreviewToFront=!1;
-mxVertexHandler.prototype.manageSizers=!1;mxVertexHandler.prototype.constrainGroupByChildren=!1;mxVertexHandler.prototype.rotationHandleVSpacing=-16;mxVertexHandler.prototype.horizontalOffset=0;mxVertexHandler.prototype.verticalOffset=0;
-mxVertexHandler.prototype.init=function(){this.graph=this.state.view.graph;this.selectionBounds=this.getSelectionBounds(this.state);this.bounds=new mxRectangle(this.selectionBounds.x,this.selectionBounds.y,this.selectionBounds.width,this.selectionBounds.height);this.selectionBorder=this.createSelectionShape(this.bounds);this.selectionBorder.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG;this.selectionBorder.pointerEvents=!1;this.selectionBorder.rotation=
-Number(this.state.style[mxConstants.STYLE_ROTATION]||"0");this.selectionBorder.init(this.graph.getView().getOverlayPane());mxEvent.redirectMouseEvents(this.selectionBorder.node,this.graph,this.state);this.graph.isCellMovable(this.state.cell)&&this.selectionBorder.setCursor(mxConstants.CURSOR_MOVABLE_VERTEX);if(0>=mxGraphHandler.prototype.maxCells||this.graph.getSelectionCount()<mxGraphHandler.prototype.maxCells){var a=this.graph.isCellResizable(this.state.cell);this.sizers=[];if(a||this.graph.isLabelMovable(this.state.cell)&&
-2<=this.state.width&&2<=this.state.height){var b=0;a&&(this.singleSizer||(this.sizers.push(this.createSizer("nw-resize",b++)),this.sizers.push(this.createSizer("n-resize",b++)),this.sizers.push(this.createSizer("ne-resize",b++)),this.sizers.push(this.createSizer("w-resize",b++)),this.sizers.push(this.createSizer("e-resize",b++)),this.sizers.push(this.createSizer("sw-resize",b++)),this.sizers.push(this.createSizer("s-resize",b++))),this.sizers.push(this.createSizer("se-resize",b++)));a=this.graph.model.getGeometry(this.state.cell);
-null==a||a.relative||this.graph.isSwimlane(this.state.cell)||!this.graph.isLabelMovable(this.state.cell)||(this.labelShape=this.createSizer(mxConstants.CURSOR_LABEL_HANDLE,mxEvent.LABEL_HANDLE,mxConstants.LABEL_HANDLE_SIZE,mxConstants.LABEL_HANDLE_FILLCOLOR),this.sizers.push(this.labelShape))}else this.graph.isCellMovable(this.state.cell)&&!this.graph.isCellResizable(this.state.cell)&&2>this.state.width&&2>this.state.height&&(this.labelShape=this.createSizer(mxConstants.CURSOR_MOVABLE_VERTEX,mxEvent.LABEL_HANDLE,
-null,mxConstants.LABEL_HANDLE_FILLCOLOR),this.sizers.push(this.labelShape))}this.isRotationHandleVisible()&&(this.rotationShape=this.createSizer(this.rotationCursor,mxEvent.ROTATION_HANDLE,mxConstants.HANDLE_SIZE+3,mxConstants.HANDLE_FILLCOLOR),this.sizers.push(this.rotationShape));this.customHandles=this.createCustomHandles();this.redraw();this.constrainGroupByChildren&&this.updateMinBounds()};
-mxVertexHandler.prototype.isRotationHandleVisible=function(){return this.graph.isEnabled()&&this.rotationEnabled&&this.graph.isCellRotatable(this.state.cell)&&(0>=mxGraphHandler.prototype.maxCells||this.graph.getSelectionCount()<mxGraphHandler.prototype.maxCells)};mxVertexHandler.prototype.isConstrainedEvent=function(a){return mxEvent.isShiftDown(a.getEvent())||"fixed"==this.state.style[mxConstants.STYLE_ASPECT]};mxVertexHandler.prototype.isCenteredEvent=function(a,b){return!1};
-mxVertexHandler.prototype.createCustomHandles=function(){return null};
-mxVertexHandler.prototype.updateMinBounds=function(){var a=this.graph.getChildCells(this.state.cell);if(0<a.length&&(this.minBounds=this.graph.view.getBounds(a),null!=this.minBounds)){var a=this.state.view.scale,b=this.state.view.translate;this.minBounds.x-=this.state.x;this.minBounds.y-=this.state.y;this.minBounds.x/=a;this.minBounds.y/=a;this.minBounds.width/=a;this.minBounds.height/=a;this.x0=this.state.x/a-b.x;this.y0=this.state.y/a-b.y}};
-mxVertexHandler.prototype.getSelectionBounds=function(a){return new mxRectangle(Math.round(a.x),Math.round(a.y),Math.round(a.width),Math.round(a.height))};mxVertexHandler.prototype.createParentHighlightShape=function(a){return this.createSelectionShape(a)};mxVertexHandler.prototype.createSelectionShape=function(a){a=new mxRectangleShape(mxRectangle.fromRectangle(a),null,this.getSelectionColor());a.strokewidth=this.getSelectionStrokeWidth();a.isDashed=this.isSelectionDashed();return a};
-mxVertexHandler.prototype.getSelectionColor=function(){return mxConstants.VERTEX_SELECTION_COLOR};mxVertexHandler.prototype.getSelectionStrokeWidth=function(){return mxConstants.VERTEX_SELECTION_STROKEWIDTH};mxVertexHandler.prototype.isSelectionDashed=function(){return mxConstants.VERTEX_SELECTION_DASHED};
-mxVertexHandler.prototype.createSizer=function(a,b,c,d){c=c||mxConstants.HANDLE_SIZE;c=new mxRectangle(0,0,c,c);d=this.createSizerShape(c,b,d);d.isHtmlAllowed()&&null!=this.state.text&&this.state.text.node.parentNode==this.graph.container?(--d.bounds.height,--d.bounds.width,d.dialect=mxConstants.DIALECT_STRICTHTML,d.init(this.graph.container)):(d.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_MIXEDHTML:mxConstants.DIALECT_SVG,d.init(this.graph.getView().getOverlayPane()));
-mxEvent.redirectMouseEvents(d.node,this.graph,this.state);this.graph.isEnabled()&&d.setCursor(a);this.isSizerVisible(b)||(d.visible=!1);return d};mxVertexHandler.prototype.isSizerVisible=function(a){return!0};
-mxVertexHandler.prototype.createSizerShape=function(a,b,c){return null!=this.handleImage?(a=new mxRectangle(a.x,a.y,this.handleImage.width,this.handleImage.height),a=new mxImageShape(a,this.handleImage.src),a.preserveImageAspect=!1,a):b==mxEvent.ROTATION_HANDLE?new mxEllipse(a,c||mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR):new mxRectangleShape(a,c||mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)};
-mxVertexHandler.prototype.moveSizerTo=function(a,b,c){null!=a&&(a.bounds.x=Math.floor(b-a.bounds.width/2),a.bounds.y=Math.floor(c-a.bounds.height/2),null!=a.node&&"none"!=a.node.style.display&&a.redraw())};
-mxVertexHandler.prototype.getHandleForEvent=function(a){var b=mxEvent.isMouseEvent(a.getEvent())?1:this.tolerance,c=this.allowHandleBoundsCheck&&(mxClient.IS_IE||0<b)?new mxRectangle(a.getGraphX()-b,a.getGraphY()-b,2*b,2*b):null,b=mxUtils.bind(this,function(b){var d=null!=b&&b.constructor!=mxImageShape&&this.allowHandleBoundsCheck?b.strokewidth+b.svgStrokeTolerance:null,d=null!=d?new mxRectangle(a.getGraphX()-Math.floor(d/2),a.getGraphY()-Math.floor(d/2),d,d):c;return null!=b&&(a.isSource(b)||null!=
-d&&mxUtils.intersects(b.bounds,d)&&"none"!=b.node.style.display&&"hidden"!=b.node.style.visibility)});if(b(this.rotationShape))return mxEvent.ROTATION_HANDLE;if(b(this.labelShape))return mxEvent.LABEL_HANDLE;if(null!=this.sizers)for(var d=0;d<this.sizers.length;d++)if(b(this.sizers[d]))return d;if(null!=this.customHandles&&this.isCustomHandleEvent(a))for(d=this.customHandles.length-1;0<=d;d--)if(b(this.customHandles[d].shape))return mxEvent.CUSTOM_HANDLE-d;return null};
-mxVertexHandler.prototype.isCustomHandleEvent=function(a){return!0};mxVertexHandler.prototype.mouseDown=function(a,b){if(!b.isConsumed()&&this.graph.isEnabled()){var c=this.getHandleForEvent(b);null!=c&&(this.start(b.getGraphX(),b.getGraphY(),c),b.consume())}};mxVertexHandler.prototype.isLivePreviewBorder=function(){return null!=this.state.shape&&null==this.state.shape.fill&&null==this.state.shape.stroke};
-mxVertexHandler.prototype.start=function(a,b,c){if(null!=this.selectionBorder)if(this.livePreviewActive=this.livePreview&&0==this.graph.model.getChildCount(this.state.cell),this.inTolerance=!0,this.childOffsetY=this.childOffsetX=0,this.index=c,this.startX=a,this.startY=b,this.index<=mxEvent.CUSTOM_HANDLE&&this.isGhostPreview())this.ghostPreview=this.createGhostPreview();else{a=this.state.view.graph.model;b=a.getParent(this.state.cell);this.state.view.currentRoot!=b&&(a.isVertex(b)||a.isEdge(b))&&
-(this.parentState=this.state.view.graph.view.getState(b));this.selectionBorder.node.style.display=c==mxEvent.ROTATION_HANDLE?"inline":"none";if(!this.livePreviewActive||this.isLivePreviewBorder())this.preview=this.createSelectionShape(this.bounds),mxClient.IS_SVG&&0!=Number(this.state.style[mxConstants.STYLE_ROTATION]||"0")||null==this.state.text||this.state.text.node.parentNode!=this.graph.container?(this.preview.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG,
-this.preview.init(this.graph.view.getOverlayPane())):(this.preview.dialect=mxConstants.DIALECT_STRICTHTML,this.preview.init(this.graph.container));c==mxEvent.ROTATION_HANDLE&&(b=this.getRotationHandlePosition(),a=b.x-this.state.getCenterX(),b=b.y-this.state.getCenterY(),this.startAngle=0!=a?180*Math.atan(b/a)/Math.PI+90:0,this.startDist=Math.sqrt(a*a+b*b));if(this.livePreviewActive)for(this.hideSizers(),c==mxEvent.ROTATION_HANDLE?this.rotationShape.node.style.display="":c==mxEvent.LABEL_HANDLE?this.labelShape.node.style.display=
-"":null!=this.sizers&&null!=this.sizers[c]?this.sizers[c].node.style.display="":c<=mxEvent.CUSTOM_HANDLE&&null!=this.customHandles&&this.customHandles[mxEvent.CUSTOM_HANDLE-c].setVisible(!0),c=this.graph.getEdges(this.state.cell),this.edgeHandlers=[],a=0;a<c.length;a++)b=this.graph.selectionCellsHandler.getHandler(c[a]),null!=b&&this.edgeHandlers.push(b)}};
-mxVertexHandler.prototype.createGhostPreview=function(){var a=this.graph.cellRenderer.createShape(this.state);a.init(this.graph.view.getOverlayPane());a.scale=this.state.view.scale;a.bounds=this.bounds;a.outline=!0;return a};mxVertexHandler.prototype.setHandlesVisible=function(a){this.handlesVisible=a;if(null!=this.sizers)for(var b=0;b<this.sizers.length;b++)this.sizers[b].node.style.display=a?"":"none";if(null!=this.customHandles)for(b=0;b<this.customHandles.length;b++)this.customHandles[b].setVisible(a)};
-mxVertexHandler.prototype.hideSizers=function(){this.setHandlesVisible(!1)};mxVertexHandler.prototype.checkTolerance=function(a){this.inTolerance&&null!=this.startX&&null!=this.startY&&(mxEvent.isMouseEvent(a.getEvent())||Math.abs(a.getGraphX()-this.startX)>this.graph.tolerance||Math.abs(a.getGraphY()-this.startY)>this.graph.tolerance)&&(this.inTolerance=!1)};mxVertexHandler.prototype.updateHint=function(a){};mxVertexHandler.prototype.removeHint=function(){};
-mxVertexHandler.prototype.roundAngle=function(a){return Math.round(10*a)/10};mxVertexHandler.prototype.roundLength=function(a){return Math.round(100*a)/100};
-mxVertexHandler.prototype.mouseMove=function(a,b){b.isConsumed()||null==this.index?this.graph.isMouseDown||null==this.getHandleForEvent(b)||b.consume(!1):(this.checkTolerance(b),this.inTolerance||(this.index<=mxEvent.CUSTOM_HANDLE?null!=this.customHandles&&(this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].processEvent(b),this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].active=!0,null!=this.ghostPreview?(this.ghostPreview.apply(this.state),this.ghostPreview.strokewidth=this.getSelectionStrokeWidth()/
-this.ghostPreview.scale/this.ghostPreview.scale,this.ghostPreview.isDashed=this.isSelectionDashed(),this.ghostPreview.stroke=this.getSelectionColor(),this.ghostPreview.redraw(),null!=this.selectionBounds&&(this.selectionBorder.node.style.display="none")):(this.movePreviewToFront&&this.moveToFront(),this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].positionChanged())):this.index==mxEvent.LABEL_HANDLE?this.moveLabel(b):(this.index==mxEvent.ROTATION_HANDLE?this.rotateVertex(b):this.resizeVertex(b),
-this.updateHint(b))),b.consume())};mxVertexHandler.prototype.isGhostPreview=function(){return 0<this.state.view.graph.model.getChildCount(this.state.cell)};
-mxVertexHandler.prototype.moveLabel=function(a){var b=new mxPoint(a.getGraphX(),a.getGraphY()),c=this.graph.view.translate,d=this.graph.view.scale;this.graph.isGridEnabledEvent(a.getEvent())&&(b.x=(this.graph.snap(b.x/d-c.x)+c.x)*d,b.y=(this.graph.snap(b.y/d-c.y)+c.y)*d);this.moveSizerTo(this.sizers[null!=this.rotationShape?this.sizers.length-2:this.sizers.length-1],b.x,b.y)};
-mxVertexHandler.prototype.rotateVertex=function(a){var b=new mxPoint(a.getGraphX(),a.getGraphY()),c=this.state.x+this.state.width/2-b.x,d=this.state.y+this.state.height/2-b.y;this.currentAlpha=0!=c?180*Math.atan(d/c)/Math.PI+90:0>d?180:0;0<c&&(this.currentAlpha-=180);this.currentAlpha-=this.startAngle;this.rotationRaster&&this.graph.isGridEnabledEvent(a.getEvent())?(c=b.x-this.state.getCenterX(),d=b.y-this.state.getCenterY(),a=Math.sqrt(c*c+d*d),raster=2>a-this.startDist?15:25>a-this.startDist?5:
-1,this.currentAlpha=Math.round(this.currentAlpha/raster)*raster):this.currentAlpha=this.roundAngle(this.currentAlpha);this.selectionBorder.rotation=this.currentAlpha;this.selectionBorder.redraw();this.livePreviewActive&&this.redrawHandles()};
-mxVertexHandler.prototype.resizeVertex=function(a){var b=new mxPoint(this.state.getCenterX(),this.state.getCenterY()),c=mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION]||"0"),d=new mxPoint(a.getGraphX(),a.getGraphY()),e=this.graph.view.translate,f=this.graph.view.scale,g=Math.cos(-c),k=Math.sin(-c),l=d.x-this.startX,m=d.y-this.startY,d=k*l+g*m,l=g*l-k*m,m=d,g=this.graph.getCellGeometry(this.state.cell);this.unscaledBounds=this.union(g,l/f,m/f,this.index,this.graph.isGridEnabledEvent(a.getEvent()),
-1,new mxPoint(0,0),this.isConstrainedEvent(a),this.isCenteredEvent(this.state,a));g.relative||(k=this.graph.getMaximumGraphBounds(),null!=k&&null!=this.parentState&&(k=mxRectangle.fromRectangle(k),k.x-=(this.parentState.x-e.x*f)/f,k.y-=(this.parentState.y-e.y*f)/f),this.graph.isConstrainChild(this.state.cell)&&(d=this.graph.getCellContainmentArea(this.state.cell),null!=d&&(l=this.graph.getOverlap(this.state.cell),0<l&&(d=mxRectangle.fromRectangle(d),d.x-=d.width*l,d.y-=d.height*l,d.width+=2*d.width*
-l,d.height+=2*d.height*l),null==k?k=d:(k=mxRectangle.fromRectangle(k),k.intersect(d)))),null!=k&&(this.unscaledBounds.x<k.x&&(this.unscaledBounds.width-=k.x-this.unscaledBounds.x,this.unscaledBounds.x=k.x),this.unscaledBounds.y<k.y&&(this.unscaledBounds.height-=k.y-this.unscaledBounds.y,this.unscaledBounds.y=k.y),this.unscaledBounds.x+this.unscaledBounds.width>k.x+k.width&&(this.unscaledBounds.width-=this.unscaledBounds.x+this.unscaledBounds.width-k.x-k.width),this.unscaledBounds.y+this.unscaledBounds.height>
-k.y+k.height&&(this.unscaledBounds.height-=this.unscaledBounds.y+this.unscaledBounds.height-k.y-k.height)));d=this.bounds;this.bounds=new mxRectangle((null!=this.parentState?this.parentState.x:e.x*f)+this.unscaledBounds.x*f,(null!=this.parentState?this.parentState.y:e.y*f)+this.unscaledBounds.y*f,this.unscaledBounds.width*f,this.unscaledBounds.height*f);g.relative&&null!=this.parentState&&(this.bounds.x+=this.state.x-this.parentState.x,this.bounds.y+=this.state.y-this.parentState.y);g=Math.cos(c);
-k=Math.sin(c);c=new mxPoint(this.bounds.getCenterX(),this.bounds.getCenterY());l=c.x-b.x;m=c.y-b.y;b=g*l-k*m-l;c=k*l+g*m-m;l=this.bounds.x-this.state.x;m=this.bounds.y-this.state.y;e=g*l-k*m;g=k*l+g*m;this.bounds.x+=b;this.bounds.y+=c;this.unscaledBounds.x=this.roundLength(this.unscaledBounds.x+b/f);this.unscaledBounds.y=this.roundLength(this.unscaledBounds.y+c/f);this.unscaledBounds.width=this.roundLength(this.unscaledBounds.width);this.unscaledBounds.height=this.roundLength(this.unscaledBounds.height);
-this.graph.isCellCollapsed(this.state.cell)||0==b&&0==c?this.childOffsetY=this.childOffsetX=0:(this.childOffsetX=this.state.x-this.bounds.x+e,this.childOffsetY=this.state.y-this.bounds.y+g);d.equals(this.bounds)||(this.livePreviewActive&&this.updateLivePreview(a),null!=this.preview?this.drawPreview():this.updateParentHighlight())};
-mxVertexHandler.prototype.updateLivePreview=function(a){var b=this.graph.view.scale,c=this.graph.view.translate;a=this.state.clone();this.state.x=this.bounds.x;this.state.y=this.bounds.y;this.state.origin=new mxPoint(this.state.x/b-c.x,this.state.y/b-c.y);this.state.width=this.bounds.width;this.state.height=this.bounds.height;b=this.state.absoluteOffset;new mxPoint(b.x,b.y);this.state.absoluteOffset.x=0;this.state.absoluteOffset.y=0;b=this.graph.getCellGeometry(this.state.cell);null!=b&&(c=b.offset||
-this.EMPTY_POINT,null==c||b.relative||(this.state.absoluteOffset.x=this.state.view.scale*c.x,this.state.absoluteOffset.y=this.state.view.scale*c.y),this.state.view.updateVertexLabelOffset(this.state));this.state.view.graph.cellRenderer.redraw(this.state,!0);this.state.view.invalidate(this.state.cell);this.state.invalid=!1;this.state.view.validate();this.redrawHandles();this.movePreviewToFront&&this.moveToFront();null!=this.state.control&&null!=this.state.control.node&&(this.state.control.node.style.visibility=
-"hidden");this.state.setState(a)};
-mxVertexHandler.prototype.moveToFront=function(){if(null!=this.state.text&&null!=this.state.text.node&&null!=this.state.text.node.nextSibling||null!=this.state.shape&&null!=this.state.shape.node&&null!=this.state.shape.node.nextSibling&&(null==this.state.text||this.state.shape.node.nextSibling!=this.state.text.node))null!=this.state.shape&&null!=this.state.shape.node&&this.state.shape.node.parentNode.appendChild(this.state.shape.node),null!=this.state.text&&null!=this.state.text.node&&this.state.text.node.parentNode.appendChild(this.state.text.node)};
-mxVertexHandler.prototype.mouseUp=function(a,b){if(null!=this.index&&null!=this.state){var c=new mxPoint(b.getGraphX(),b.getGraphY()),d=this.index;this.index=null;null==this.ghostPreview&&(this.state.view.invalidate(this.state.cell,!1,!1),this.state.view.validate());this.graph.getModel().beginUpdate();try{if(d<=mxEvent.CUSTOM_HANDLE){if(null!=this.customHandles){var e=this.state.view.graph.getCellStyle(this.state.cell);this.customHandles[mxEvent.CUSTOM_HANDLE-d].active=!1;this.customHandles[mxEvent.CUSTOM_HANDLE-
-d].execute(b);null!=this.customHandles&&null!=this.customHandles[mxEvent.CUSTOM_HANDLE-d]&&(this.state.style=e,this.customHandles[mxEvent.CUSTOM_HANDLE-d].positionChanged())}}else if(d==mxEvent.ROTATION_HANDLE)if(null!=this.currentAlpha){var f=this.currentAlpha-(this.state.style[mxConstants.STYLE_ROTATION]||0);0!=f&&this.rotateCell(this.state.cell,f)}else this.rotateClick();else{var g=this.graph.isGridEnabledEvent(b.getEvent()),k=mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION]||"0"),
-l=Math.cos(-k),m=Math.sin(-k),n=c.x-this.startX,p=c.y-this.startY,c=m*n+l*p,n=l*n-m*p,p=c,q=this.graph.view.scale,r=this.isRecursiveResize(this.state,b);this.resizeCell(this.state.cell,this.roundLength(n/q),this.roundLength(p/q),d,g,this.isConstrainedEvent(b),r)}}finally{this.graph.getModel().endUpdate()}b.consume();this.reset();this.redrawHandles()}};mxVertexHandler.prototype.isRecursiveResize=function(a,b){return this.graph.isRecursiveResize(this.state)};mxVertexHandler.prototype.rotateClick=function(){};
-mxVertexHandler.prototype.rotateCell=function(a,b,c){if(0!=b){var d=this.graph.getModel();if(d.isVertex(a)||d.isEdge(a)){if(!d.isEdge(a)){var e=(this.graph.getCurrentCellStyle(a)[mxConstants.STYLE_ROTATION]||0)+b;this.graph.setCellStyles(mxConstants.STYLE_ROTATION,e,[a])}e=this.graph.getCellGeometry(a);if(null!=e){var f=this.graph.getCellGeometry(c);null==f||d.isEdge(c)||(e=e.clone(),e.rotate(b,new mxPoint(f.width/2,f.height/2)),d.setGeometry(a,e));if(d.isVertex(a)&&!e.relative||d.isEdge(a))for(c=
-d.getChildCount(a),e=0;e<c;e++)this.rotateCell(d.getChildAt(a,e),b,a)}}}};
-mxVertexHandler.prototype.reset=function(){null!=this.sizers&&null!=this.index&&null!=this.sizers[this.index]&&"none"==this.sizers[this.index].node.style.display&&(this.sizers[this.index].node.style.display="");this.index=this.inTolerance=this.currentAlpha=null;null!=this.preview&&(this.preview.destroy(),this.preview=null);null!=this.ghostPreview&&(this.ghostPreview.destroy(),this.ghostPreview=null);if(this.livePreviewActive&&null!=this.sizers){for(var a=0;a<this.sizers.length;a++)null!=this.sizers[a]&&
-(this.sizers[a].node.style.display="");null!=this.state.control&&null!=this.state.control.node&&(this.state.control.node.style.visibility="")}if(null!=this.customHandles)for(a=0;a<this.customHandles.length;a++)this.customHandles[a].active?(this.customHandles[a].active=!1,this.customHandles[a].reset()):this.customHandles[a].setVisible(!0);null!=this.selectionBorder&&(this.selectionBorder.node.style.display="inline",this.selectionBounds=this.getSelectionBounds(this.state),this.bounds=new mxRectangle(this.selectionBounds.x,
-this.selectionBounds.y,this.selectionBounds.width,this.selectionBounds.height),this.drawPreview());this.removeHint();this.redrawHandles();this.edgeHandlers=null;this.handlesVisible=!0;this.livePreviewActive=this.unscaledBounds=null};
-mxVertexHandler.prototype.resizeCell=function(a,b,c,d,e,f,g){b=this.graph.model.getGeometry(a);null!=b&&(d==mxEvent.LABEL_HANDLE?(d=-mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION]||"0"),g=Math.cos(d),c=Math.sin(d),d=this.graph.view.scale,g=mxUtils.getRotatedPoint(new mxPoint(Math.round((this.labelShape.bounds.getCenterX()-this.startX)/d),Math.round((this.labelShape.bounds.getCenterY()-this.startY)/d)),g,c),b=b.clone(),null==b.offset?b.offset=g:(b.offset.x+=g.x,b.offset.y+=g.y),this.graph.model.setGeometry(a,
-b)):null!=this.unscaledBounds&&(d=this.graph.view.scale,0==this.childOffsetX&&0==this.childOffsetY||this.moveChildren(a,Math.round(this.childOffsetX/d),Math.round(this.childOffsetY/d)),this.graph.resizeCell(a,this.unscaledBounds,g)))};mxVertexHandler.prototype.moveChildren=function(a,b,c){for(var d=this.graph.getModel(),e=d.getChildCount(a),f=0;f<e;f++){var g=d.getChildAt(a,f),k=this.graph.getCellGeometry(g);null!=k&&(k=k.clone(),k.translate(b,c),d.setGeometry(g,k))}};
-mxVertexHandler.prototype.union=function(a,b,c,d,e,f,g,k,l){e=null!=e?e&&this.graph.gridEnabled:this.graph.gridEnabled;if(this.singleSizer)return d=a.x+a.width+b,g=a.y+a.height+c,e&&(d=this.graph.snap(d/f)*f,g=this.graph.snap(g/f)*f),f=new mxRectangle(a.x,a.y,0,0),f.add(new mxRectangle(d,g,0,0)),f;var m=a.width,n=a.height,p=a.x-g.x*f,q=p+m;a=a.y-g.y*f;var r=a+n,t=p+m/2,u=a+n/2;4<d?(r+=c,r=e?this.graph.snap(r/f)*f:Math.round(r/f)*f):3>d&&(a+=c,a=e?this.graph.snap(a/f)*f:Math.round(a/f)*f);if(0==d||
-3==d||5==d)p+=b,p=e?this.graph.snap(p/f)*f:Math.round(p/f)*f;else if(2==d||4==d||7==d)q+=b,q=e?this.graph.snap(q/f)*f:Math.round(q/f)*f;e=q-p;c=r-a;k&&(k=this.graph.getCellGeometry(this.state.cell),null!=k&&(k=k.width/k.height,1==d||2==d||7==d||6==d?e=c*k:c=e/k,0==d&&(p=q-e,a=r-c)));l&&(e+=e-m,c+=c-n,p+=t-(p+e/2),a+=u-(a+c/2));0>e&&(p+=e,e=Math.abs(e));0>c&&(a+=c,c=Math.abs(c));d=new mxRectangle(p+g.x*f,a+g.y*f,e,c);null!=this.minBounds&&(d.width=Math.max(d.width,this.minBounds.x*f+this.minBounds.width*
-f+Math.max(0,this.x0*f-d.x)),d.height=Math.max(d.height,this.minBounds.y*f+this.minBounds.height*f+Math.max(0,this.y0*f-d.y)));return d};mxVertexHandler.prototype.redraw=function(a){this.selectionBounds=this.getSelectionBounds(this.state);this.bounds=new mxRectangle(this.selectionBounds.x,this.selectionBounds.y,this.selectionBounds.width,this.selectionBounds.height);this.drawPreview();a||this.redrawHandles()};
-mxVertexHandler.prototype.getHandlePadding=function(){var a=new mxPoint(0,0),b=this.tolerance;null!=this.sizers&&0<this.sizers.length&&null!=this.sizers[0]&&(this.bounds.width<2*this.sizers[0].bounds.width+2*b||this.bounds.height<2*this.sizers[0].bounds.height+2*b)&&(b/=2,a.x=this.sizers[0].bounds.width+b,a.y=this.sizers[0].bounds.height+b);return a};mxVertexHandler.prototype.getSizerBounds=function(){return this.bounds};
-mxVertexHandler.prototype.redrawHandles=function(){var a=this.getSizerBounds(),b=this.tolerance;this.verticalOffset=this.horizontalOffset=0;if(null!=this.customHandles)for(var c=0;c<this.customHandles.length;c++){var d=this.customHandles[c].shape.node.style.display;this.customHandles[c].redraw();this.customHandles[c].shape.node.style.display=d;this.customHandles[c].shape.node.style.visibility=this.handlesVisible&&this.isCustomHandleVisible(this.customHandles[c])?"":"hidden"}if(null!=this.sizers&&
-0<this.sizers.length&&null!=this.sizers[0]){if(null==this.index&&this.manageSizers&&8<=this.sizers.length){c=this.getHandlePadding();this.horizontalOffset=c.x;this.verticalOffset=c.y;if(0!=this.horizontalOffset||0!=this.verticalOffset)a=new mxRectangle(a.x,a.y,a.width,a.height),a.x-=this.horizontalOffset/2,a.width+=this.horizontalOffset,a.y-=this.verticalOffset/2,a.height+=this.verticalOffset;8<=this.sizers.length&&(a.width<2*this.sizers[0].bounds.width+2*b||a.height<2*this.sizers[0].bounds.height+
-2*b?(this.sizers[0].node.style.display="none",this.sizers[2].node.style.display="none",this.sizers[5].node.style.display="none",this.sizers[7].node.style.display="none"):this.handlesVisible&&(this.sizers[0].node.style.display="",this.sizers[2].node.style.display="",this.sizers[5].node.style.display="",this.sizers[7].node.style.display=""))}b=a.x+a.width;c=a.y+a.height;if(this.singleSizer)this.moveSizerTo(this.sizers[0],b,c);else{var d=a.x+a.width/2,e=a.y+a.height/2;if(8<=this.sizers.length){var f=
-"nw-resize n-resize ne-resize e-resize se-resize s-resize sw-resize w-resize".split(" "),g=mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION]||"0"),k=Math.cos(g),l=Math.sin(g),g=Math.round(4*g/Math.PI),m=new mxPoint(a.getCenterX(),a.getCenterY()),n=mxUtils.getRotatedPoint(new mxPoint(a.x,a.y),k,l,m);this.moveSizerTo(this.sizers[0],n.x,n.y);this.sizers[0].setCursor(f[mxUtils.mod(0+g,f.length)]);n.x=d;n.y=a.y;n=mxUtils.getRotatedPoint(n,k,l,m);this.moveSizerTo(this.sizers[1],n.x,n.y);this.sizers[1].setCursor(f[mxUtils.mod(1+
-g,f.length)]);n.x=b;n.y=a.y;n=mxUtils.getRotatedPoint(n,k,l,m);this.moveSizerTo(this.sizers[2],n.x,n.y);this.sizers[2].setCursor(f[mxUtils.mod(2+g,f.length)]);n.x=a.x;n.y=e;n=mxUtils.getRotatedPoint(n,k,l,m);this.moveSizerTo(this.sizers[3],n.x,n.y);this.sizers[3].setCursor(f[mxUtils.mod(7+g,f.length)]);n.x=b;n.y=e;n=mxUtils.getRotatedPoint(n,k,l,m);this.moveSizerTo(this.sizers[4],n.x,n.y);this.sizers[4].setCursor(f[mxUtils.mod(3+g,f.length)]);n.x=a.x;n.y=c;n=mxUtils.getRotatedPoint(n,k,l,m);this.moveSizerTo(this.sizers[5],
-n.x,n.y);this.sizers[5].setCursor(f[mxUtils.mod(6+g,f.length)]);n.x=d;n.y=c;n=mxUtils.getRotatedPoint(n,k,l,m);this.moveSizerTo(this.sizers[6],n.x,n.y);this.sizers[6].setCursor(f[mxUtils.mod(5+g,f.length)]);n.x=b;n.y=c;n=mxUtils.getRotatedPoint(n,k,l,m);this.moveSizerTo(this.sizers[7],n.x,n.y);this.sizers[7].setCursor(f[mxUtils.mod(4+g,f.length)]);n.x=d+this.state.absoluteOffset.x;n.y=e+this.state.absoluteOffset.y;n=mxUtils.getRotatedPoint(n,k,l,m);this.moveSizerTo(this.sizers[8],n.x,n.y)}else 2<=
-this.state.width&&2<=this.state.height?this.moveSizerTo(this.sizers[0],d+this.state.absoluteOffset.x,e+this.state.absoluteOffset.y):this.moveSizerTo(this.sizers[0],this.state.x,this.state.y)}}null!=this.rotationShape&&(g=mxUtils.toRadians(null!=this.currentAlpha?this.currentAlpha:this.state.style[mxConstants.STYLE_ROTATION]||"0"),k=Math.cos(g),l=Math.sin(g),m=new mxPoint(this.state.getCenterX(),this.state.getCenterY()),n=mxUtils.getRotatedPoint(this.getRotationHandlePosition(),k,l,m),null!=this.rotationShape.node&&
-(this.moveSizerTo(this.rotationShape,n.x,n.y),this.rotationShape.node.style.visibility=this.state.view.graph.isEditing()||!this.handlesVisible?"hidden":""));null!=this.selectionBorder&&(this.selectionBorder.rotation=Number(this.state.style[mxConstants.STYLE_ROTATION]||"0"));if(null!=this.edgeHandlers)for(c=0;c<this.edgeHandlers.length;c++)this.edgeHandlers[c].redraw()};mxVertexHandler.prototype.isCustomHandleVisible=function(a){return!this.graph.isEditing()&&1==this.state.view.graph.getSelectionCount()};
-mxVertexHandler.prototype.getRotationHandlePosition=function(){return new mxPoint(this.bounds.x+this.bounds.width/2,this.bounds.y+this.rotationHandleVSpacing)};mxVertexHandler.prototype.isParentHighlightVisible=function(){return!this.graph.isCellSelected(this.graph.model.getParent(this.state.cell))};
-mxVertexHandler.prototype.updateParentHighlight=function(){if(!this.isDestroyed()){var a=this.isParentHighlightVisible(),b=this.graph.model.getParent(this.state.cell),c=this.graph.view.getState(b);null!=this.parentHighlight?this.graph.model.isVertex(b)&&a?(a=this.parentHighlight.bounds,null==c||a.x==c.x&&a.y==c.y&&a.width==c.width&&a.height==c.height||(this.parentHighlight.bounds=mxRectangle.fromRectangle(c),this.parentHighlight.redraw())):(null!=c&&c.parentHighlight==this.parentHighlight&&(c.parentHighlight=
-null),this.parentHighlight.destroy(),this.parentHighlight=null):this.parentHighlightEnabled&&a&&this.graph.model.isVertex(b)&&null!=c&&null==c.parentHighlight&&(this.parentHighlight=this.createParentHighlightShape(c),this.parentHighlight.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG,this.parentHighlight.pointerEvents=!1,this.parentHighlight.rotation=Number(c.style[mxConstants.STYLE_ROTATION]||"0"),this.parentHighlight.init(this.graph.getView().getOverlayPane()),
-this.parentHighlight.redraw(),c.parentHighlight=this.parentHighlight)}};
-mxVertexHandler.prototype.drawPreview=function(){null!=this.preview&&(this.preview.bounds=this.bounds,this.preview.node.parentNode==this.graph.container&&(this.preview.bounds.width=Math.max(0,this.preview.bounds.width-1),this.preview.bounds.height=Math.max(0,this.preview.bounds.height-1)),this.preview.rotation=Number(this.state.style[mxConstants.STYLE_ROTATION]||"0"),this.preview.redraw());this.selectionBorder.bounds=this.getSelectionBorderBounds();this.selectionBorder.redraw();this.updateParentHighlight()};
-mxVertexHandler.prototype.getSelectionBorderBounds=function(){return this.bounds};mxVertexHandler.prototype.isDestroyed=function(){return null==this.selectionBorder};
-mxVertexHandler.prototype.destroy=function(){null!=this.escapeHandler&&(this.state.view.graph.removeListener(this.escapeHandler),this.escapeHandler=null);null!=this.preview&&(this.preview.destroy(),this.preview=null);if(null!=this.parentHighlight){var a=this.graph.model.getParent(this.state.cell),a=this.graph.view.getState(a);null!=a&&a.parentHighlight==this.parentHighlight&&(a.parentHighlight=null);this.parentHighlight.destroy();this.parentHighlight=null}null!=this.ghostPreview&&(this.ghostPreview.destroy(),
-this.ghostPreview=null);null!=this.selectionBorder&&(this.selectionBorder.destroy(),this.selectionBorder=null);this.labelShape=null;this.removeHint();if(null!=this.sizers){for(a=0;a<this.sizers.length;a++)this.sizers[a].destroy();this.sizers=null}if(null!=this.customHandles){for(a=0;a<this.customHandles.length;a++)this.customHandles[a].destroy();this.customHandles=null}};
-function mxEdgeHandler(a){null!=a&&null!=a.shape&&(this.state=a,this.init(),this.escapeHandler=mxUtils.bind(this,function(b,c){var d=null!=this.index;this.reset();d&&this.graph.cellRenderer.redraw(this.state,!1,a.view.isRendering())}),this.state.view.graph.addListener(mxEvent.ESCAPE,this.escapeHandler))}mxEdgeHandler.prototype.graph=null;mxEdgeHandler.prototype.state=null;mxEdgeHandler.prototype.marker=null;mxEdgeHandler.prototype.constraintHandler=null;mxEdgeHandler.prototype.error=null;
-mxEdgeHandler.prototype.shape=null;mxEdgeHandler.prototype.bends=null;mxEdgeHandler.prototype.labelShape=null;mxEdgeHandler.prototype.cloneEnabled=!0;mxEdgeHandler.prototype.addEnabled=!1;mxEdgeHandler.prototype.removeEnabled=!1;mxEdgeHandler.prototype.dblClickRemoveEnabled=!1;mxEdgeHandler.prototype.mergeRemoveEnabled=!1;mxEdgeHandler.prototype.straightRemoveEnabled=!1;mxEdgeHandler.prototype.virtualBendsEnabled=!1;mxEdgeHandler.prototype.virtualBendOpacity=20;
-mxEdgeHandler.prototype.parentHighlightEnabled=!1;mxEdgeHandler.prototype.preferHtml=!1;mxEdgeHandler.prototype.allowHandleBoundsCheck=!0;mxEdgeHandler.prototype.snapToTerminals=!1;mxEdgeHandler.prototype.handleImage=null;mxEdgeHandler.prototype.tolerance=0;mxEdgeHandler.prototype.outlineConnect=!1;mxEdgeHandler.prototype.manageLabelHandle=!1;
-mxEdgeHandler.prototype.init=function(){this.graph=this.state.view.graph;this.marker=this.createMarker();this.constraintHandler=new mxConstraintHandler(this.graph);this.points=[];this.abspoints=this.getSelectionPoints(this.state);this.shape=this.createSelectionShape(this.abspoints);this.shape.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_MIXEDHTML:mxConstants.DIALECT_SVG;this.shape.init(this.graph.getView().getOverlayPane());this.shape.pointerEvents=!1;this.shape.setCursor(mxConstants.CURSOR_MOVABLE_EDGE);
-mxEvent.redirectMouseEvents(this.shape.node,this.graph,this.state);this.preferHtml=null!=this.state.text&&this.state.text.node.parentNode==this.graph.container;if(!this.preferHtml){var a=this.state.getVisibleTerminalState(!0);null!=a&&(this.preferHtml=null!=a.text&&a.text.node.parentNode==this.graph.container);this.preferHtml||(a=this.state.getVisibleTerminalState(!1),null!=a&&(this.preferHtml=null!=a.text&&a.text.node.parentNode==this.graph.container))}if(this.graph.getSelectionCount()<mxGraphHandler.prototype.maxCells||
-0>=mxGraphHandler.prototype.maxCells)this.bends=this.createBends(),this.isVirtualBendsEnabled()&&(this.virtualBends=this.createVirtualBends());this.label=new mxPoint(this.state.absoluteOffset.x,this.state.absoluteOffset.y);this.labelShape=this.createLabelHandleShape();this.initBend(this.labelShape);this.labelShape.setCursor(mxConstants.CURSOR_LABEL_HANDLE);this.customHandles=this.createCustomHandles();this.updateParentHighlight();this.redraw()};mxEdgeHandler.prototype.isParentHighlightVisible=mxVertexHandler.prototype.isParentHighlightVisible;
-mxEdgeHandler.prototype.updateParentHighlight=mxVertexHandler.prototype.updateParentHighlight;mxEdgeHandler.prototype.createCustomHandles=function(){return null};mxEdgeHandler.prototype.isVirtualBendsEnabled=function(a){return this.virtualBendsEnabled&&(null==this.state.style[mxConstants.STYLE_EDGE]||this.state.style[mxConstants.STYLE_EDGE]==mxConstants.NONE||1==this.state.style[mxConstants.STYLE_NOEDGESTYLE])&&"arrow"!=mxUtils.getValue(this.state.style,mxConstants.STYLE_SHAPE,null)};
-mxEdgeHandler.prototype.isCellEnabled=function(a){return!0};mxEdgeHandler.prototype.isAddPointEvent=function(a){return mxEvent.isShiftDown(a)};mxEdgeHandler.prototype.isRemovePointEvent=function(a){return mxEvent.isShiftDown(a)};mxEdgeHandler.prototype.getSelectionPoints=function(a){return a.absolutePoints};
-mxEdgeHandler.prototype.createParentHighlightShape=function(a){a=new mxRectangleShape(mxRectangle.fromRectangle(a),null,this.getSelectionColor());a.strokewidth=this.getSelectionStrokeWidth();a.isDashed=this.isSelectionDashed();return a};mxEdgeHandler.prototype.createSelectionShape=function(a){a=new this.state.shape.constructor;a.outline=!0;a.apply(this.state);a.isDashed=this.isSelectionDashed();a.stroke=this.getSelectionColor();a.isShadow=!1;return a};mxEdgeHandler.prototype.getSelectionColor=function(){return mxConstants.EDGE_SELECTION_COLOR};
-mxEdgeHandler.prototype.getSelectionStrokeWidth=function(){return mxConstants.EDGE_SELECTION_STROKEWIDTH};mxEdgeHandler.prototype.isSelectionDashed=function(){return mxConstants.EDGE_SELECTION_DASHED};mxEdgeHandler.prototype.isConnectableCell=function(a){return!0};mxEdgeHandler.prototype.getCellAt=function(a,b){return this.outlineConnect?null:this.graph.getCellAt(a,b)};
-mxEdgeHandler.prototype.createMarker=function(){var a=new mxCellMarker(this.graph),b=this;a.getCell=function(a){var c=mxCellMarker.prototype.getCell.apply(this,arguments);c!=b.state.cell&&null!=c||null==b.currentPoint||(c=b.graph.getCellAt(b.currentPoint.x,b.currentPoint.y));if(null!=c&&!this.graph.isCellConnectable(c)){var e=this.graph.getModel().getParent(c);this.graph.getModel().isVertex(e)&&this.graph.isCellConnectable(e)&&(c=e)}e=b.graph.getModel();if(this.graph.isSwimlane(c)&&null!=b.currentPoint&&
-this.graph.hitsSwimlaneContent(c,b.currentPoint.x,b.currentPoint.y)||!b.isConnectableCell(c)||c==b.state.cell||null!=c&&!b.graph.connectableEdges&&e.isEdge(c)||e.isAncestor(b.state.cell,c))c=null;this.graph.isCellConnectable(c)||(c=null);return c};a.isValidState=function(a){var c=b.graph.getModel(),c=b.graph.view.getTerminalPort(a,b.graph.view.getState(c.getTerminal(b.state.cell,!b.isSource)),!b.isSource),c=null!=c?c.cell:null;b.error=b.validateConnection(b.isSource?a.cell:c,b.isSource?c:a.cell);
-return null==b.error};return a};mxEdgeHandler.prototype.validateConnection=function(a,b){return this.graph.getEdgeValidationError(this.state.cell,a,b)};
-mxEdgeHandler.prototype.createBends=function(){for(var a=this.state.cell,b=[],c=0;c<this.abspoints.length;c++)if(this.isHandleVisible(c)){var d=c==this.abspoints.length-1,e=0==c||d;(e||this.graph.isCellBendable(a))&&mxUtils.bind(this,function(a){var d=this.createHandleShape(a);this.initBend(d,mxUtils.bind(this,mxUtils.bind(this,function(){this.dblClickRemoveEnabled&&this.removePoint(this.state,a)})));this.isHandleEnabled(c)&&d.setCursor(e?mxConstants.CURSOR_TERMINAL_HANDLE:mxConstants.CURSOR_BEND_HANDLE);
-b.push(d);e||(this.points.push(new mxPoint(0,0)),d.node.style.visibility="hidden")})(c)}return b};mxEdgeHandler.prototype.createVirtualBends=function(){var a=[];if(this.graph.isCellBendable(this.state.cell))for(var b=1;b<this.abspoints.length;b++)mxUtils.bind(this,function(b){this.initBend(b);b.setCursor(mxConstants.CURSOR_VIRTUAL_BEND_HANDLE);a.push(b)})(this.createHandleShape());return a};mxEdgeHandler.prototype.isHandleEnabled=function(a){return!0};
-mxEdgeHandler.prototype.isHandleVisible=function(a){var b=this.state.getVisibleTerminalState(!0),c=this.state.getVisibleTerminalState(!1),d=this.graph.getCellGeometry(this.state.cell);return(null!=d?this.graph.view.getEdgeStyle(this.state,d.points,b,c):null)!=mxEdgeStyle.EntityRelation||0==a||a==this.abspoints.length-1};
-mxEdgeHandler.prototype.createHandleShape=function(a){if(null!=this.handleImage)return a=new mxImageShape(new mxRectangle(0,0,this.handleImage.width,this.handleImage.height),this.handleImage.src),a.preserveImageAspect=!1,a;a=mxConstants.HANDLE_SIZE;this.preferHtml&&--a;return new mxRectangleShape(new mxRectangle(0,0,a,a),mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)};
-mxEdgeHandler.prototype.createLabelHandleShape=function(){if(null!=this.labelHandleImage){var a=new mxImageShape(new mxRectangle(0,0,this.labelHandleImage.width,this.labelHandleImage.height),this.labelHandleImage.src);a.preserveImageAspect=!1;return a}a=mxConstants.LABEL_HANDLE_SIZE;return new mxRectangleShape(new mxRectangle(0,0,a,a),mxConstants.LABEL_HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)};
-mxEdgeHandler.prototype.initBend=function(a,b){this.preferHtml?(a.dialect=mxConstants.DIALECT_STRICTHTML,a.init(this.graph.container)):(a.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_MIXEDHTML:mxConstants.DIALECT_SVG,a.init(this.graph.getView().getOverlayPane()));mxEvent.redirectMouseEvents(a.node,this.graph,this.state,null,null,null,b);(mxClient.IS_QUIRKS||8==document.documentMode)&&mxEvent.addListener(a.node,"dragstart",function(a){mxEvent.consume(a);return!1});mxClient.IS_TOUCH&&
-a.node.setAttribute("pointer-events","none")};
-mxEdgeHandler.prototype.getHandleForEvent=function(a){var b=null;if(null!=this.state){var c=function(b){if(null!=b&&null!=b.node&&"none"!=b.node.style.display&&"hidden"!=b.node.style.visibility&&(a.isSource(b)||null!=e&&mxUtils.intersects(b.bounds,e))){var c=a.getGraphX()-b.bounds.getCenterX();b=a.getGraphY()-b.bounds.getCenterY();c=c*c+b*b;if(null==f||c<=f)return f=c,!0}return!1},d=mxEvent.isMouseEvent(a.getEvent())?1:this.tolerance,e=this.allowHandleBoundsCheck&&(mxClient.IS_IE||0<d)?new mxRectangle(a.getGraphX()-
-d,a.getGraphY()-d,2*d,2*d):null,f=null;if(null!=this.customHandles&&this.isCustomHandleEvent(a))for(d=this.customHandles.length-1;0<=d;d--)if(c(this.customHandles[d].shape))return mxEvent.CUSTOM_HANDLE-d;if(a.isSource(this.state.text)||c(this.labelShape))b=mxEvent.LABEL_HANDLE;if(null!=this.bends)for(d=0;d<this.bends.length;d++)c(this.bends[d])&&(b=d);if(null!=this.virtualBends&&this.isAddVirtualBendEvent(a))for(d=0;d<this.virtualBends.length;d++)c(this.virtualBends[d])&&(b=mxEvent.VIRTUAL_HANDLE-
-d)}return b};mxEdgeHandler.prototype.isAddVirtualBendEvent=function(a){return!0};mxEdgeHandler.prototype.isCustomHandleEvent=function(a){return!0};
-mxEdgeHandler.prototype.mouseDown=function(a,b){var c=this.getHandleForEvent(b);if(null!=this.bends&&null!=this.bends[c]){var d=this.bends[c].bounds;this.snapPoint=new mxPoint(d.getCenterX(),d.getCenterY())}if(this.addEnabled&&null==c&&this.isAddPointEvent(b.getEvent()))this.addPoint(this.state,b.getEvent()),b.consume();else if(null!=c&&!b.isConsumed()&&this.graph.isEnabled()){if(this.removeEnabled&&this.isRemovePointEvent(b.getEvent()))this.removePoint(this.state,c);else if(c!=mxEvent.LABEL_HANDLE||
-this.graph.isLabelMovable(b.getCell()))c<=mxEvent.VIRTUAL_HANDLE&&mxUtils.setOpacity(this.virtualBends[mxEvent.VIRTUAL_HANDLE-c].node,100),this.start(b.getX(),b.getY(),c);b.consume()}};
-mxEdgeHandler.prototype.start=function(a,b,c){this.startX=a;this.startY=b;this.isSource=null==this.bends?!1:0==c;this.isTarget=null==this.bends?!1:c==this.bends.length-1;this.isLabel=c==mxEvent.LABEL_HANDLE;if(this.isSource||this.isTarget){if(a=this.state.cell,b=this.graph.model.getTerminal(a,this.isSource),null==b&&this.graph.isTerminalPointMovable(a,this.isSource)||null!=b&&this.graph.isCellDisconnectable(a,b,this.isSource))this.index=c}else this.index=c;if(this.index<=mxEvent.CUSTOM_HANDLE&&this.index>
-mxEvent.VIRTUAL_HANDLE&&null!=this.customHandles)for(c=0;c<this.customHandles.length;c++)c!=mxEvent.CUSTOM_HANDLE-this.index&&this.customHandles[c].setVisible(!1)};mxEdgeHandler.prototype.clonePreviewState=function(a,b){return this.state.clone()};mxEdgeHandler.prototype.getSnapToTerminalTolerance=function(){return this.graph.gridSize*this.graph.view.scale/2};mxEdgeHandler.prototype.updateHint=function(a,b){};mxEdgeHandler.prototype.removeHint=function(){};mxEdgeHandler.prototype.roundLength=function(a){return Math.round(a)};
-mxEdgeHandler.prototype.isSnapToTerminalsEvent=function(a){return this.snapToTerminals&&!mxEvent.isAltDown(a.getEvent())};
-mxEdgeHandler.prototype.getPointForEvent=function(a){var b=this.graph.getView(),c=b.scale,d=new mxPoint(this.roundLength(a.getGraphX()/c)*c,this.roundLength(a.getGraphY()/c)*c),e=this.getSnapToTerminalTolerance(),f=!1,g=!1;if(0<e&&this.isSnapToTerminalsEvent(a)){var k=function(a){null!=a&&l.call(this,new mxPoint(b.getRoutingCenterX(a),b.getRoutingCenterY(a)))},l=function(a){if(null!=a){var b=a.x;Math.abs(d.x-b)<e&&(d.x=b,f=!0);a=a.y;Math.abs(d.y-a)<e&&(d.y=a,g=!0)}};k.call(this,this.state.getVisibleTerminalState(!0));
-k.call(this,this.state.getVisibleTerminalState(!1));if(null!=this.state.absolutePoints)for(k=0;k<this.state.absolutePoints.length;k++)l.call(this,this.state.absolutePoints[k])}this.graph.isGridEnabledEvent(a.getEvent())&&(a=b.translate,f||(d.x=(this.graph.snap(d.x/c-a.x)+a.x)*c),g||(d.y=(this.graph.snap(d.y/c-a.y)+a.y)*c));return d};
-mxEdgeHandler.prototype.getPreviewTerminalState=function(a){this.constraintHandler.update(a,this.isSource,!0,a.isSource(this.marker.highlight.shape)?null:this.currentPoint);if(null!=this.constraintHandler.currentFocus&&null!=this.constraintHandler.currentConstraint)return null!=this.marker.highlight&&null!=this.marker.highlight.state&&this.marker.highlight.state.cell==this.constraintHandler.currentFocus.cell?"transparent"!=this.marker.highlight.shape.stroke&&(this.marker.highlight.shape.stroke="transparent",
-this.marker.highlight.repaint()):this.marker.markCell(this.constraintHandler.currentFocus.cell,"transparent"),a=this.graph.getModel(),a=this.graph.view.getTerminalPort(this.state,this.graph.view.getState(a.getTerminal(this.state.cell,!this.isSource)),!this.isSource),a=null!=a?a.cell:null,this.error=this.validateConnection(this.isSource?this.constraintHandler.currentFocus.cell:a,this.isSource?a:this.constraintHandler.currentFocus.cell),a=null,null==this.error&&(a=this.constraintHandler.currentFocus),
-(null!=this.error||null!=a&&!this.isCellEnabled(a.cell))&&this.constraintHandler.reset(),a;if(this.graph.isIgnoreTerminalEvent(a.getEvent()))return this.marker.reset(),null;this.marker.process(a);a=this.marker.getValidState();null==a||this.isCellEnabled(a.cell)||(this.constraintHandler.reset(),this.marker.reset());return this.marker.getValidState()};
-mxEdgeHandler.prototype.getPreviewPoints=function(a,b){var c=this.graph.getCellGeometry(this.state.cell),c=null!=c.points?c.points.slice():null,d=new mxPoint(a.x,a.y),e=null;if(this.isSource||this.isTarget)this.graph.resetEdgesOnConnect&&(c=null);else if(this.convertPoint(d,!1),null==c)c=[d];else{this.index<=mxEvent.VIRTUAL_HANDLE&&c.splice(mxEvent.VIRTUAL_HANDLE-this.index,0,d);if(!this.isSource&&!this.isTarget){for(var f=0;f<this.bends.length;f++)if(f!=this.index){var g=this.bends[f];null!=g&&mxUtils.contains(g.bounds,
-a.x,a.y)&&(this.index<=mxEvent.VIRTUAL_HANDLE?c.splice(mxEvent.VIRTUAL_HANDLE-this.index,1):c.splice(this.index-1,1),e=c)}if(null==e&&this.straightRemoveEnabled&&(null==b||!mxEvent.isAltDown(b.getEvent()))){f=this.graph.tolerance*this.graph.tolerance;g=this.state.absolutePoints.slice();g[this.index]=a;var k=this.state.getVisibleTerminalState(!0);if(null!=k){var l=this.graph.getConnectionConstraint(this.state,k,!0);if(null==l||null==this.graph.getConnectionPoint(k,l))g[0]=new mxPoint(k.view.getRoutingCenterX(k),
-k.view.getRoutingCenterY(k))}k=this.state.getVisibleTerminalState(!1);null!=k&&(l=this.graph.getConnectionConstraint(this.state,k,!1),null==l||null==this.graph.getConnectionPoint(k,l))&&(g[g.length-1]=new mxPoint(k.view.getRoutingCenterX(k),k.view.getRoutingCenterY(k)));l=this.index;0<l&&l<g.length-1&&mxUtils.ptSegDistSq(g[l-1].x,g[l-1].y,g[l+1].x,g[l+1].y,a.x,a.y)<f&&(c.splice(l-1,1),e=c)}}null==e&&this.index>mxEvent.VIRTUAL_HANDLE&&(c[this.index-1]=d)}return null!=e?e:c};
-mxEdgeHandler.prototype.isOutlineConnectEvent=function(a){var b=mxUtils.getOffset(this.graph.container),c=a.getEvent(),d=mxEvent.getClientX(c),c=mxEvent.getClientY(c),e=document.documentElement,f=this.currentPoint.x-this.graph.container.scrollLeft+b.x-((window.pageXOffset||e.scrollLeft)-(e.clientLeft||0)),b=this.currentPoint.y-this.graph.container.scrollTop+b.y-((window.pageYOffset||e.scrollTop)-(e.clientTop||0));return this.outlineConnect&&!mxEvent.isShiftDown(a.getEvent())&&(a.isSource(this.marker.highlight.shape)||
-mxEvent.isAltDown(a.getEvent())&&null!=a.getState()||this.marker.highlight.isHighlightAt(d,c)||(f!=d||b!=c)&&null==a.getState()&&this.marker.highlight.isHighlightAt(f,b))};
-mxEdgeHandler.prototype.updatePreviewState=function(a,b,c,d,e){var f=this.isSource?c:this.state.getVisibleTerminalState(!0),g=this.isTarget?c:this.state.getVisibleTerminalState(!1),k=this.graph.getConnectionConstraint(a,f,!0),l=this.graph.getConnectionConstraint(a,g,!1),m=this.constraintHandler.currentConstraint;null==m&&e&&(null!=c?(d.isSource(this.marker.highlight.shape)&&(b=new mxPoint(d.getGraphX(),d.getGraphY())),m=this.graph.getOutlineConstraint(b,c,d),this.constraintHandler.setFocus(d,c,this.isSource),
-this.constraintHandler.currentConstraint=m,this.constraintHandler.currentPoint=b):m=new mxConnectionConstraint);if(this.outlineConnect&&null!=this.marker.highlight&&null!=this.marker.highlight.shape){var n=this.graph.view.scale;null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus?(this.marker.highlight.shape.stroke=e?mxConstants.OUTLINE_HIGHLIGHT_COLOR:"transparent",this.marker.highlight.shape.strokewidth=mxConstants.OUTLINE_HIGHLIGHT_STROKEWIDTH/n/n,this.marker.highlight.repaint()):
-this.marker.hasValidState()&&(this.marker.highlight.shape.stroke=this.graph.isCellConnectable(d.getCell())&&this.marker.getValidState()!=d.getState()?"transparent":mxConstants.DEFAULT_VALID_COLOR,this.marker.highlight.shape.strokewidth=mxConstants.HIGHLIGHT_STROKEWIDTH/n/n,this.marker.highlight.repaint())}this.isSource?k=m:this.isTarget&&(l=m);if(this.isSource||this.isTarget)null!=m&&null!=m.point?(a.style[this.isSource?mxConstants.STYLE_EXIT_X:mxConstants.STYLE_ENTRY_X]=m.point.x,a.style[this.isSource?
-mxConstants.STYLE_EXIT_Y:mxConstants.STYLE_ENTRY_Y]=m.point.y):(delete a.style[this.isSource?mxConstants.STYLE_EXIT_X:mxConstants.STYLE_ENTRY_X],delete a.style[this.isSource?mxConstants.STYLE_EXIT_Y:mxConstants.STYLE_ENTRY_Y]);a.setVisibleTerminalState(f,!0);a.setVisibleTerminalState(g,!1);this.isSource&&null==f||a.view.updateFixedTerminalPoint(a,f,!0,k);this.isTarget&&null==g||a.view.updateFixedTerminalPoint(a,g,!1,l);(this.isSource||this.isTarget)&&null==c&&(a.setAbsoluteTerminalPoint(b,this.isSource),
-null==this.marker.getMarkedState()&&(this.error=this.graph.allowDanglingEdges?null:""));a.view.updatePoints(a,this.points,f,g);a.view.updateFloatingTerminalPoints(a,f,g)};
-mxEdgeHandler.prototype.mouseMove=function(a,b){if(null!=this.index&&null!=this.marker){this.currentPoint=this.getPointForEvent(b);this.error=null;!this.graph.isIgnoreTerminalEvent(b.getEvent())&&mxEvent.isShiftDown(b.getEvent())&&null!=this.snapPoint&&(Math.abs(this.snapPoint.x-this.currentPoint.x)<Math.abs(this.snapPoint.y-this.currentPoint.y)?this.currentPoint.x=this.snapPoint.x:this.currentPoint.y=this.snapPoint.y);if(this.index<=mxEvent.CUSTOM_HANDLE&&this.index>mxEvent.VIRTUAL_HANDLE)null!=
-this.customHandles&&(this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].processEvent(b),this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].positionChanged(),null!=this.shape&&null!=this.shape.node&&(this.shape.node.style.display="none"));else if(this.isLabel)this.label.x=this.currentPoint.x,this.label.y=this.currentPoint.y;else{this.points=this.getPreviewPoints(this.currentPoint,b);var c=this.isSource||this.isTarget?this.getPreviewTerminalState(b):null;if(null!=this.constraintHandler.currentConstraint&&
-null!=this.constraintHandler.currentFocus&&null!=this.constraintHandler.currentPoint)this.currentPoint=this.constraintHandler.currentPoint.clone();else if(this.outlineConnect){var d=this.isSource||this.isTarget?this.isOutlineConnectEvent(b):!1;d?c=this.marker.highlight.state:null!=c&&c!=b.getState()&&this.graph.isCellConnectable(b.getCell())&&null!=this.marker.highlight.shape&&(this.marker.highlight.shape.stroke="transparent",this.marker.highlight.repaint(),c=null)}null==c||this.isCellEnabled(c.cell)||
-(c=null,this.marker.reset());var e=this.clonePreviewState(this.currentPoint,null!=c?c.cell:null);this.updatePreviewState(e,this.currentPoint,c,b,d);this.setPreviewColor(null==this.error?this.marker.validColor:this.marker.invalidColor);this.abspoints=e.absolutePoints;this.active=!0;this.updateHint(b,this.currentPoint)}this.drawPreview();mxEvent.consume(b.getEvent());b.consume()}else mxClient.IS_IE&&null!=this.getHandleForEvent(b)&&b.consume(!1)};
-mxEdgeHandler.prototype.mouseUp=function(a,b){if(null!=this.index&&null!=this.marker){null!=this.shape&&null!=this.shape.node&&(this.shape.node.style.display="");var c=this.state.cell,d=this.index;this.index=null;if(b.getX()!=this.startX||b.getY()!=this.startY){var e=!this.graph.isIgnoreTerminalEvent(b.getEvent())&&this.graph.isCloneEvent(b.getEvent())&&this.cloneEnabled&&this.graph.isCellsCloneable();if(null!=this.error)0<this.error.length&&this.graph.validationAlert(this.error);else if(d<=mxEvent.CUSTOM_HANDLE&&
-d>mxEvent.VIRTUAL_HANDLE){if(null!=this.customHandles){var f=this.graph.getModel();f.beginUpdate();try{this.customHandles[mxEvent.CUSTOM_HANDLE-d].execute(b),null!=this.shape&&null!=this.shape.node&&(this.shape.apply(this.state),this.shape.redraw())}finally{f.endUpdate()}}}else if(this.isLabel)this.moveLabel(this.state,this.label.x,this.label.y);else if(this.isSource||this.isTarget)if(d=null,null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus&&(d=this.constraintHandler.currentFocus.cell),
-null==d&&this.marker.hasValidState()&&null!=this.marker.highlight&&null!=this.marker.highlight.shape&&"transparent"!=this.marker.highlight.shape.stroke&&"white"!=this.marker.highlight.shape.stroke&&(d=this.marker.validState.cell),null!=d){var f=this.graph.getModel(),g=f.getParent(c);f.beginUpdate();try{if(e){var k=f.getGeometry(c),e=this.graph.cloneCell(c);f.add(g,e,f.getChildCount(g));null!=k&&(k=k.clone(),f.setGeometry(e,k));var l=f.getTerminal(c,!this.isSource);this.graph.connectCell(e,l,!this.isSource);
-c=e}c=this.connect(c,d,this.isSource,e,b)}finally{f.endUpdate()}}else this.graph.isAllowDanglingEdges()&&(f=this.abspoints[this.isSource?0:this.abspoints.length-1],f.x=this.roundLength(f.x/this.graph.view.scale-this.graph.view.translate.x),f.y=this.roundLength(f.y/this.graph.view.scale-this.graph.view.translate.y),k=this.graph.getView().getState(this.graph.getModel().getParent(c)),null!=k&&(f.x-=k.origin.x,f.y-=k.origin.y),f.x-=this.graph.panDx/this.graph.view.scale,f.y-=this.graph.panDy/this.graph.view.scale,
-c=this.changeTerminalPoint(c,f,this.isSource,e));else this.active?c=this.changePoints(c,this.points,e):(this.graph.getView().invalidate(this.state.cell),this.graph.getView().validate(this.state.cell))}else this.graph.isToggleEvent(b.getEvent())&&this.graph.selectCellForEvent(this.state.cell,b.getEvent());null!=this.marker&&(this.reset(),c!=this.state.cell&&this.graph.setSelectionCell(c));b.consume()}};
-mxEdgeHandler.prototype.reset=function(){this.active&&this.refresh();this.snapPoint=this.points=this.label=this.index=this.error=null;this.active=this.isTarget=this.isSource=this.isLabel=!1;if(this.livePreview&&null!=this.sizers)for(var a=0;a<this.sizers.length;a++)null!=this.sizers[a]&&(this.sizers[a].node.style.display="");null!=this.marker&&this.marker.reset();null!=this.constraintHandler&&this.constraintHandler.reset();if(null!=this.customHandles)for(a=0;a<this.customHandles.length;a++)this.customHandles[a].reset();
-this.setPreviewColor(mxConstants.EDGE_SELECTION_COLOR);this.removeHint();this.redraw()};mxEdgeHandler.prototype.setPreviewColor=function(a){null!=this.shape&&(this.shape.stroke=a)};
-mxEdgeHandler.prototype.convertPoint=function(a,b){var c=this.graph.getView().getScale(),d=this.graph.getView().getTranslate();b&&(a.x=this.graph.snap(a.x),a.y=this.graph.snap(a.y));a.x=Math.round(a.x/c-d.x);a.y=Math.round(a.y/c-d.y);c=this.graph.getView().getState(this.graph.getModel().getParent(this.state.cell));null!=c&&(a.x-=c.origin.x,a.y-=c.origin.y);return a};
-mxEdgeHandler.prototype.moveLabel=function(a,b,c){var d=this.graph.getModel(),e=d.getGeometry(a.cell);if(null!=e){var f=this.graph.getView().scale,e=e.clone();if(e.relative){var g=this.graph.getView().getRelativePoint(a,b,c);e.x=Math.round(1E4*g.x)/1E4;e.y=Math.round(g.y);e.offset=new mxPoint(0,0);g=this.graph.view.getPoint(a,e);e.offset=new mxPoint(Math.round((b-g.x)/f),Math.round((c-g.y)/f))}else{var k=a.absolutePoints,g=k[0],k=k[k.length-1];null!=g&&null!=k&&(e.offset=new mxPoint(Math.round((b-
-(g.x+(k.x-g.x)/2))/f),Math.round((c-(g.y+(k.y-g.y)/2))/f)),e.x=0,e.y=0)}d.setGeometry(a.cell,e)}};mxEdgeHandler.prototype.connect=function(a,b,c,d,e){d=this.graph.getModel();d.getParent(a);d.beginUpdate();try{var f=this.constraintHandler.currentConstraint;null==f&&(f=new mxConnectionConstraint);this.graph.connectCell(a,b,c,f)}finally{d.endUpdate()}return a};
-mxEdgeHandler.prototype.changeTerminalPoint=function(a,b,c,d){var e=this.graph.getModel();e.beginUpdate();try{if(d){var f=e.getParent(a),g=e.getTerminal(a,!c);a=this.graph.cloneCell(a);e.add(f,a,e.getChildCount(f));e.setTerminal(a,g,!c)}var k=e.getGeometry(a);null!=k&&(k=k.clone(),k.setTerminalPoint(b,c),e.setGeometry(a,k),this.graph.connectCell(a,null,c,new mxConnectionConstraint))}finally{e.endUpdate()}return a};
-mxEdgeHandler.prototype.changePoints=function(a,b,c){var d=this.graph.getModel();d.beginUpdate();try{if(c){var e=d.getParent(a),f=d.getTerminal(a,!0),g=d.getTerminal(a,!1);a=this.graph.cloneCell(a);d.add(e,a,d.getChildCount(e));d.setTerminal(a,f,!0);d.setTerminal(a,g,!1)}var k=d.getGeometry(a);null!=k&&(k=k.clone(),k.points=b,d.setGeometry(a,k))}finally{d.endUpdate()}return a};
-mxEdgeHandler.prototype.addPoint=function(a,b){var c=mxUtils.convertPoint(this.graph.container,mxEvent.getClientX(b),mxEvent.getClientY(b)),d=this.graph.isGridEnabledEvent(b);this.convertPoint(c,d);this.addPointAt(a,c.x,c.y);mxEvent.consume(b)};
-mxEdgeHandler.prototype.addPointAt=function(a,b,c){var d=this.graph.getCellGeometry(a.cell);b=new mxPoint(b,c);if(null!=d){var d=d.clone(),e=this.graph.view.translate;c=this.graph.view.scale;var e=new mxPoint(e.x*c,e.y*c),f=this.graph.model.getParent(this.state.cell);this.graph.model.isVertex(f)&&(e=this.graph.view.getState(f),e=new mxPoint(e.x,e.y));c=mxUtils.findNearestSegment(a,b.x*c+e.x,b.y*c+e.y);null==d.points?d.points=[b]:d.points.splice(c,0,b);this.graph.getModel().setGeometry(a.cell,d);this.refresh();
-this.redraw()}};mxEdgeHandler.prototype.removePoint=function(a,b){if(0<b&&b<this.abspoints.length-1){var c=this.graph.getCellGeometry(this.state.cell);null!=c&&null!=c.points&&(c=c.clone(),c.points.splice(b-1,1),this.graph.getModel().setGeometry(a.cell,c),this.refresh(),this.redraw())}};
-mxEdgeHandler.prototype.getHandleFillColor=function(a){a=0==a;var b=this.state.cell,c=this.graph.getModel().getTerminal(b,a),d=mxConstants.HANDLE_FILLCOLOR;null!=c&&!this.graph.isCellDisconnectable(b,c,a)||null==c&&!this.graph.isTerminalPointMovable(b,a)?d=mxConstants.LOCKED_HANDLE_FILLCOLOR:null!=c&&this.graph.isCellDisconnectable(b,c,a)&&(d=mxConstants.CONNECT_HANDLE_FILLCOLOR);return d};
-mxEdgeHandler.prototype.redraw=function(a){if(null!=this.state){this.abspoints=this.state.absolutePoints.slice();var b=this.graph.getModel().getGeometry(this.state.cell);if(null!=b&&(b=b.points,null!=this.bends&&0<this.bends.length&&null!=b)){null==this.points&&(this.points=[]);for(var c=1;c<this.bends.length-1;c++)null!=this.bends[c]&&null!=this.abspoints[c]&&(this.points[c-1]=b[c-1])}this.drawPreview();a||this.redrawHandles()}};
-mxEdgeHandler.prototype.redrawHandles=function(){var a=this.state.cell,b=this.labelShape.bounds;this.label=new mxPoint(this.state.absoluteOffset.x,this.state.absoluteOffset.y);this.labelShape.bounds=new mxRectangle(Math.round(this.label.x-b.width/2),Math.round(this.label.y-b.height/2),b.width,b.height);b=this.graph.getLabel(a);this.labelShape.visible=null!=b&&0<b.length&&this.graph.isLabelMovable(a);if(null!=this.bends&&0<this.bends.length){var c=this.abspoints.length-1,a=this.abspoints[0],d=a.x,
-e=a.y,b=this.bends[0].bounds;this.bends[0].bounds=new mxRectangle(Math.floor(d-b.width/2),Math.floor(e-b.height/2),b.width,b.height);this.bends[0].fill=this.getHandleFillColor(0);this.bends[0].redraw();this.manageLabelHandle&&this.checkLabelHandle(this.bends[0].bounds);var c=this.abspoints[c],d=c.x,e=c.y,f=this.bends.length-1,b=this.bends[f].bounds;this.bends[f].bounds=new mxRectangle(Math.floor(d-b.width/2),Math.floor(e-b.height/2),b.width,b.height);this.bends[f].fill=this.getHandleFillColor(f);
-this.bends[f].redraw();this.manageLabelHandle&&this.checkLabelHandle(this.bends[f].bounds);this.redrawInnerBends(a,c)}if(null!=this.abspoints&&null!=this.virtualBends&&0<this.virtualBends.length)for(c=this.abspoints[0],a=0;a<this.virtualBends.length;a++)null!=this.virtualBends[a]&&null!=this.abspoints[a+1]&&(d=this.abspoints[a+1],b=this.virtualBends[a],b.bounds=new mxRectangle(Math.floor(c.x+(d.x-c.x)/2-b.bounds.width/2),Math.floor(c.y+(d.y-c.y)/2-b.bounds.height/2),b.bounds.width,b.bounds.height),
-b.redraw(),mxUtils.setOpacity(b.node,this.virtualBendOpacity),c=d,this.manageLabelHandle&&this.checkLabelHandle(b.bounds));null!=this.labelShape&&this.labelShape.redraw();if(null!=this.customHandles)for(a=0;a<this.customHandles.length;a++)b=this.customHandles[a].shape.node.style.display,this.customHandles[a].redraw(),this.customHandles[a].shape.node.style.display=b,this.customHandles[a].shape.node.style.visibility=this.isCustomHandleVisible(this.customHandles[a])?"":"hidden"};
-mxEdgeHandler.prototype.isCustomHandleVisible=function(a){return!this.graph.isEditing()&&1==this.state.view.graph.getSelectionCount()};
-mxEdgeHandler.prototype.setHandlesVisible=function(a){if(null!=this.bends)for(var b=0;b<this.bends.length;b++)this.bends[b].node.style.display=a?"":"none";if(null!=this.virtualBends)for(b=0;b<this.virtualBends.length;b++)this.virtualBends[b].node.style.display=a?"":"none";null!=this.labelShape&&(this.labelShape.node.style.display=a?"":"none");if(null!=this.customHandles)for(b=0;b<this.customHandles.length;b++)this.customHandles[b].setVisible(a)};
-mxEdgeHandler.prototype.redrawInnerBends=function(a,b){for(var c=1;c<this.bends.length-1;c++)if(null!=this.bends[c])if(null!=this.abspoints[c]){var d=this.abspoints[c].x,e=this.abspoints[c].y,f=this.bends[c].bounds;this.bends[c].node.style.visibility="visible";this.bends[c].bounds=new mxRectangle(Math.round(d-f.width/2),Math.round(e-f.height/2),f.width,f.height);this.manageLabelHandle?this.checkLabelHandle(this.bends[c].bounds):null==this.handleImage&&this.labelShape.visible&&mxUtils.intersects(this.bends[c].bounds,
-this.labelShape.bounds)&&(w=mxConstants.HANDLE_SIZE+3,h=mxConstants.HANDLE_SIZE+3,this.bends[c].bounds=new mxRectangle(Math.round(d-w/2),Math.round(e-h/2),w,h));this.bends[c].redraw()}else this.bends[c].destroy(),this.bends[c]=null};mxEdgeHandler.prototype.checkLabelHandle=function(a){if(null!=this.labelShape){var b=this.labelShape.bounds;mxUtils.intersects(a,b)&&(a.getCenterY()<b.getCenterY()?b.y=a.y+a.height:b.y=a.y-b.height)}};
-mxEdgeHandler.prototype.drawPreview=function(){try{if(this.isLabel){var a=this.labelShape.bounds,b=new mxRectangle(Math.round(this.label.x-a.width/2),Math.round(this.label.y-a.height/2),a.width,a.height);this.labelShape.bounds.equals(b)||(this.labelShape.bounds=b,this.labelShape.redraw())}null==this.shape||mxUtils.equalPoints(this.shape.points,this.abspoints)||(this.shape.apply(this.state),this.shape.points=this.abspoints.slice(),this.shape.scale=this.state.view.scale,this.shape.isDashed=this.isSelectionDashed(),
-this.shape.stroke=this.getSelectionColor(),this.shape.strokewidth=this.getSelectionStrokeWidth()/this.shape.scale/this.shape.scale,this.shape.isShadow=!1,this.shape.redraw());this.updateParentHighlight()}catch(c){}};
-mxEdgeHandler.prototype.refresh=function(){null!=this.state&&(this.abspoints=this.getSelectionPoints(this.state),this.points=[],null!=this.bends&&(this.destroyBends(this.bends),this.bends=this.createBends()),null!=this.virtualBends&&(this.destroyBends(this.virtualBends),this.virtualBends=this.createVirtualBends()),null!=this.customHandles&&(this.destroyBends(this.customHandles),this.customHandles=this.createCustomHandles()),null!=this.labelShape&&null!=this.labelShape.node&&null!=this.labelShape.node.parentNode&&
-this.labelShape.node.parentNode.appendChild(this.labelShape.node))};mxEdgeHandler.prototype.isDestroyed=function(){return null==this.shape};mxEdgeHandler.prototype.destroyBends=function(a){if(null!=a)for(var b=0;b<a.length;b++)null!=a[b]&&a[b].destroy()};
-mxEdgeHandler.prototype.destroy=function(){null!=this.escapeHandler&&(this.state.view.graph.removeListener(this.escapeHandler),this.escapeHandler=null);null!=this.marker&&(this.marker.destroy(),this.marker=null);null!=this.shape&&(this.shape.destroy(),this.shape=null);if(null!=this.parentHighlight){var a=this.graph.model.getParent(this.state.cell),a=this.graph.view.getState(a);null!=a&&a.parentHighlight==this.parentHighlight&&(a.parentHighlight=null);this.parentHighlight.destroy();this.parentHighlight=
-null}null!=this.labelShape&&(this.labelShape.destroy(),this.labelShape=null);null!=this.constraintHandler&&(this.constraintHandler.destroy(),this.constraintHandler=null);this.destroyBends(this.virtualBends);this.virtualBends=null;this.destroyBends(this.customHandles);this.customHandles=null;this.destroyBends(this.bends);this.bends=null;this.removeHint()};function mxElbowEdgeHandler(a){mxEdgeHandler.call(this,a)}mxUtils.extend(mxElbowEdgeHandler,mxEdgeHandler);
-mxElbowEdgeHandler.prototype.flipEnabled=!0;mxElbowEdgeHandler.prototype.doubleClickOrientationResource="none"!=mxClient.language?"doubleClickOrientation":"";
-mxElbowEdgeHandler.prototype.createBends=function(){var a=[],b=this.createHandleShape(0);this.initBend(b);b.setCursor(mxConstants.CURSOR_TERMINAL_HANDLE);a.push(b);a.push(this.createVirtualBend(mxUtils.bind(this,function(a){!mxEvent.isConsumed(a)&&this.flipEnabled&&(this.graph.flipEdge(this.state.cell,a),mxEvent.consume(a))})));this.points.push(new mxPoint(0,0));b=this.createHandleShape(2);this.initBend(b);b.setCursor(mxConstants.CURSOR_TERMINAL_HANDLE);a.push(b);return a};
-mxElbowEdgeHandler.prototype.createVirtualBend=function(a){var b=this.createHandleShape();this.initBend(b,a);b.setCursor(this.getCursorForBend());this.graph.isCellBendable(this.state.cell)||(b.node.style.display="none");return b};
-mxElbowEdgeHandler.prototype.getCursorForBend=function(){return this.state.style[mxConstants.STYLE_EDGE]==mxEdgeStyle.TopToBottom||this.state.style[mxConstants.STYLE_EDGE]==mxConstants.EDGESTYLE_TOPTOBOTTOM||(this.state.style[mxConstants.STYLE_EDGE]==mxEdgeStyle.ElbowConnector||this.state.style[mxConstants.STYLE_EDGE]==mxConstants.EDGESTYLE_ELBOW)&&this.state.style[mxConstants.STYLE_ELBOW]==mxConstants.ELBOW_VERTICAL?"row-resize":"col-resize"};
-mxElbowEdgeHandler.prototype.getTooltipForNode=function(a){var b=null;null==this.bends||null==this.bends[1]||a!=this.bends[1].node&&a.parentNode!=this.bends[1].node||(b=this.doubleClickOrientationResource,b=mxResources.get(b)||b);return b};
-mxElbowEdgeHandler.prototype.convertPoint=function(a,b){var c=this.graph.getView().getScale(),d=this.graph.getView().getTranslate(),e=this.state.origin;b&&(a.x=this.graph.snap(a.x),a.y=this.graph.snap(a.y));a.x=Math.round(a.x/c-d.x-e.x);a.y=Math.round(a.y/c-d.y-e.y);return a};
-mxElbowEdgeHandler.prototype.redrawInnerBends=function(a,b){var c=this.graph.getModel().getGeometry(this.state.cell),d=this.state.absolutePoints,e=null;1<d.length?(a=d[1],b=d[d.length-2]):null!=c.points&&0<c.points.length&&(e=d[0]);e=null==e?new mxPoint(a.x+(b.x-a.x)/2,a.y+(b.y-a.y)/2):new mxPoint(this.graph.getView().scale*(e.x+this.graph.getView().translate.x+this.state.origin.x),this.graph.getView().scale*(e.y+this.graph.getView().translate.y+this.state.origin.y));d=this.bends[1].bounds;c=d.width;
-d=d.height;c=new mxRectangle(Math.round(e.x-c/2),Math.round(e.y-d/2),c,d);this.manageLabelHandle?this.checkLabelHandle(c):null==this.handleImage&&this.labelShape.visible&&mxUtils.intersects(c,this.labelShape.bounds)&&(c=mxConstants.HANDLE_SIZE+3,d=mxConstants.HANDLE_SIZE+3,c=new mxRectangle(Math.floor(e.x-c/2),Math.floor(e.y-d/2),c,d));this.bends[1].bounds=c;this.bends[1].redraw();this.manageLabelHandle&&this.checkLabelHandle(this.bends[1].bounds)};
-function mxEdgeSegmentHandler(a){mxEdgeHandler.call(this,a)}mxUtils.extend(mxEdgeSegmentHandler,mxElbowEdgeHandler);
-mxEdgeSegmentHandler.prototype.getCurrentPoints=function(){var a=this.state.absolutePoints;if(null!=a){var b=Math.max(1,this.graph.view.scale);if(2==a.length||3==a.length&&(Math.abs(a[0].x-a[1].x)<b&&Math.abs(a[1].x-a[2].x)<b||Math.abs(a[0].y-a[1].y)<b&&Math.abs(a[1].y-a[2].y)<b))var b=a[0].x+(a[a.length-1].x-a[0].x)/2,c=a[0].y+(a[a.length-1].y-a[0].y)/2,a=[a[0],new mxPoint(b,c),new mxPoint(b,c),a[a.length-1]]}return a};
-mxEdgeSegmentHandler.prototype.getPreviewPoints=function(a){if(this.isSource||this.isTarget)return mxElbowEdgeHandler.prototype.getPreviewPoints.apply(this,arguments);var b=this.getCurrentPoints(),c=this.convertPoint(b[0].clone(),!1);a=this.convertPoint(a.clone(),!1);for(var d=[],e=1;e<b.length;e++){var f=this.convertPoint(b[e].clone(),!1);e==this.index&&(0==Math.round(c.x-f.x)&&(c.x=a.x,f.x=a.x),0==Math.round(c.y-f.y)&&(c.y=a.y,f.y=a.y));e<b.length-1&&d.push(f);c=f}if(1==d.length){var b=this.state.getVisibleTerminalState(!0),
-c=this.state.getVisibleTerminalState(!1),f=this.state.view.getScale(),g=this.state.view.getTranslate(),e=d[0].x*f+g.x,f=d[0].y*f+g.y;if(null!=b&&mxUtils.contains(b,e,f)||null!=c&&mxUtils.contains(c,e,f))d=[a,a]}return d};
-mxEdgeSegmentHandler.prototype.updatePreviewState=function(a,b,c,d){mxEdgeHandler.prototype.updatePreviewState.apply(this,arguments);if(!this.isSource&&!this.isTarget){b=this.convertPoint(b.clone(),!1);for(var e=a.absolutePoints,f=e[0],g=e[1],k=[],l=2;l<e.length;l++){var m=e[l];0==Math.round(f.x-g.x)&&0==Math.round(g.x-m.x)||0==Math.round(f.y-g.y)&&0==Math.round(g.y-m.y)||k.push(this.convertPoint(g.clone(),!1));f=g;g=m}f=this.state.getVisibleTerminalState(!0);g=this.state.getVisibleTerminalState(!1);
-l=this.state.absolutePoints;if(0==k.length&&(0==Math.round(e[0].x-e[e.length-1].x)||0==Math.round(e[0].y-e[e.length-1].y)))k=[b,b];else if(5==e.length&&2==k.length&&null!=f&&null!=g&&null!=l&&0==Math.round(l[0].x-l[l.length-1].x)){var k=this.graph.getView(),l=k.getScale(),m=k.getTranslate(),e=k.getRoutingCenterY(f)/l-m.y,n=this.graph.getConnectionConstraint(a,f,!0);null!=n&&(n=this.graph.getConnectionPoint(f,n),null!=n&&(this.convertPoint(n,!1),e=n.y));k=k.getRoutingCenterY(g)/l-m.y;if(l=this.graph.getConnectionConstraint(a,
-g,!1))n=this.graph.getConnectionPoint(g,l),null!=n&&(this.convertPoint(n,!1),k=n.y);k=[new mxPoint(b.x,e),new mxPoint(b.x,k)]}this.points=k;a.view.updateFixedTerminalPoints(a,f,g);a.view.updatePoints(a,this.points,f,g);a.view.updateFloatingTerminalPoints(a,f,g)}};
-mxEdgeSegmentHandler.prototype.connect=function(a,b,c,d,e){var f=this.graph.getModel(),g=f.getGeometry(a),k=null;if(null!=g&&null!=g.points&&0<g.points.length)for(var l=this.abspoints,m=l[0],n=l[1],k=[],p=2;p<l.length;p++){var q=l[p];0==Math.round(m.x-n.x)&&0==Math.round(n.x-q.x)||0==Math.round(m.y-n.y)&&0==Math.round(n.y-q.y)||k.push(this.convertPoint(n.clone(),!1));m=n;n=q}f.beginUpdate();try{null!=k&&(g=f.getGeometry(a),null!=g&&(g=g.clone(),g.points=k,f.setGeometry(a,g))),a=mxEdgeHandler.prototype.connect.apply(this,
-arguments)}finally{f.endUpdate()}return a};mxEdgeSegmentHandler.prototype.getTooltipForNode=function(a){return null};mxEdgeSegmentHandler.prototype.start=function(a,b,c){mxEdgeHandler.prototype.start.apply(this,arguments);null==this.bends||null==this.bends[c]||this.isSource||this.isTarget||mxUtils.setOpacity(this.bends[c].node,100)};
-mxEdgeSegmentHandler.prototype.createBends=function(){var a=[],b=this.createHandleShape(0);this.initBend(b);b.setCursor(mxConstants.CURSOR_TERMINAL_HANDLE);a.push(b);var c=this.getCurrentPoints();if(this.graph.isCellBendable(this.state.cell)){null==this.points&&(this.points=[]);for(var d=0;d<c.length-1;d++){b=this.createVirtualBend();a.push(b);var e=0==Math.round(c[d].x-c[d+1].x);0==Math.round(c[d].y-c[d+1].y)&&d<c.length-2&&(e=0==Math.round(c[d].x-c[d+2].x));b.setCursor(e?"col-resize":"row-resize");
-this.points.push(new mxPoint(0,0))}}b=this.createHandleShape(c.length);this.initBend(b);b.setCursor(mxConstants.CURSOR_TERMINAL_HANDLE);a.push(b);return a};mxEdgeSegmentHandler.prototype.redraw=function(){this.refresh();mxEdgeHandler.prototype.redraw.apply(this,arguments)};
-mxEdgeSegmentHandler.prototype.redrawInnerBends=function(a,b){if(this.graph.isCellBendable(this.state.cell)){var c=this.getCurrentPoints();if(null!=c&&1<c.length){var d=!1;if(4==c.length&&0==Math.round(c[1].x-c[2].x)&&0==Math.round(c[1].y-c[2].y))if(d=!0,0==Math.round(c[0].y-c[c.length-1].y)){var e=c[0].x+(c[c.length-1].x-c[0].x)/2;c[1]=new mxPoint(e,c[1].y);c[2]=new mxPoint(e,c[2].y)}else e=c[0].y+(c[c.length-1].y-c[0].y)/2,c[1]=new mxPoint(c[1].x,e),c[2]=new mxPoint(c[2].x,e);for(e=0;e<c.length-
-1;e++)if(null!=this.bends[e+1]){a=c[e];b=c[e+1];var f=new mxPoint(a.x+(b.x-a.x)/2,a.y+(b.y-a.y)/2),g=this.bends[e+1].bounds;this.bends[e+1].bounds=new mxRectangle(Math.floor(f.x-g.width/2),Math.floor(f.y-g.height/2),g.width,g.height);this.bends[e+1].redraw();this.manageLabelHandle&&this.checkLabelHandle(this.bends[e+1].bounds)}d&&(mxUtils.setOpacity(this.bends[1].node,this.virtualBendOpacity),mxUtils.setOpacity(this.bends[3].node,this.virtualBendOpacity))}}};
-function mxKeyHandler(a,b){null!=a&&(this.graph=a,this.target=b||document.documentElement,this.normalKeys=[],this.shiftKeys=[],this.controlKeys=[],this.controlShiftKeys=[],this.keydownHandler=mxUtils.bind(this,function(a){this.keyDown(a)}),mxEvent.addListener(this.target,"keydown",this.keydownHandler),mxClient.IS_IE&&mxEvent.addListener(window,"unload",mxUtils.bind(this,function(){this.destroy()})))}mxKeyHandler.prototype.graph=null;mxKeyHandler.prototype.target=null;
-mxKeyHandler.prototype.normalKeys=null;mxKeyHandler.prototype.shiftKeys=null;mxKeyHandler.prototype.controlKeys=null;mxKeyHandler.prototype.controlShiftKeys=null;mxKeyHandler.prototype.enabled=!0;mxKeyHandler.prototype.isEnabled=function(){return this.enabled};mxKeyHandler.prototype.setEnabled=function(a){this.enabled=a};mxKeyHandler.prototype.bindKey=function(a,b){this.normalKeys[a]=b};mxKeyHandler.prototype.bindShiftKey=function(a,b){this.shiftKeys[a]=b};
-mxKeyHandler.prototype.bindControlKey=function(a,b){this.controlKeys[a]=b};mxKeyHandler.prototype.bindControlShiftKey=function(a,b){this.controlShiftKeys[a]=b};mxKeyHandler.prototype.isControlDown=function(a){return mxEvent.isControlDown(a)};mxKeyHandler.prototype.getFunction=function(a){return null==a||mxEvent.isAltDown(a)?null:this.isControlDown(a)?mxEvent.isShiftDown(a)?this.controlShiftKeys[a.keyCode]:this.controlKeys[a.keyCode]:mxEvent.isShiftDown(a)?this.shiftKeys[a.keyCode]:this.normalKeys[a.keyCode]};
-mxKeyHandler.prototype.isGraphEvent=function(a){var b=mxEvent.getSource(a);return b==this.target||b.parentNode==this.target||null!=this.graph.cellEditor&&this.graph.cellEditor.isEventSource(a)?!0:mxUtils.isAncestorNode(this.graph.container,b)};mxKeyHandler.prototype.keyDown=function(a){if(this.isEnabledForEvent(a))if(27==a.keyCode)this.escape(a);else if(!this.isEventIgnored(a)){var b=this.getFunction(a);null!=b&&(b(a),mxEvent.consume(a))}};
-mxKeyHandler.prototype.isEnabledForEvent=function(a){return this.graph.isEnabled()&&!mxEvent.isConsumed(a)&&this.isGraphEvent(a)&&this.isEnabled()};mxKeyHandler.prototype.isEventIgnored=function(a){return this.graph.isEditing()};mxKeyHandler.prototype.escape=function(a){this.graph.isEscapeEnabled()&&this.graph.escape(a)};
-mxKeyHandler.prototype.destroy=function(){null!=this.target&&null!=this.keydownHandler&&(mxEvent.removeListener(this.target,"keydown",this.keydownHandler),this.keydownHandler=null);this.target=null};function mxTooltipHandler(a,b){null!=a&&(this.graph=a,this.delay=b||500,this.graph.addMouseListener(this))}mxTooltipHandler.prototype.zIndex=10005;mxTooltipHandler.prototype.graph=null;mxTooltipHandler.prototype.delay=null;mxTooltipHandler.prototype.ignoreTouchEvents=!0;
-mxTooltipHandler.prototype.hideOnHover=!1;mxTooltipHandler.prototype.destroyed=!1;mxTooltipHandler.prototype.enabled=!0;mxTooltipHandler.prototype.isEnabled=function(){return this.enabled};mxTooltipHandler.prototype.setEnabled=function(a){this.enabled=a};mxTooltipHandler.prototype.isHideOnHover=function(){return this.hideOnHover};mxTooltipHandler.prototype.setHideOnHover=function(a){this.hideOnHover=a};
-mxTooltipHandler.prototype.init=function(){null!=document.body&&(this.div=document.createElement("div"),this.div.className="mxTooltip",this.div.style.visibility="hidden",document.body.appendChild(this.div),mxEvent.addGestureListeners(this.div,mxUtils.bind(this,function(a){"A"!=mxEvent.getSource(a).nodeName&&this.hideTooltip()})))};mxTooltipHandler.prototype.getStateForEvent=function(a){return a.getState()};mxTooltipHandler.prototype.mouseDown=function(a,b){this.reset(b,!1);this.hideTooltip()};
-mxTooltipHandler.prototype.mouseMove=function(a,b){if(b.getX()!=this.lastX||b.getY()!=this.lastY){this.reset(b,!0);var c=this.getStateForEvent(b);(this.isHideOnHover()||c!=this.state||b.getSource()!=this.node&&(!this.stateSource||null!=c&&this.stateSource==(b.isSource(c.shape)||!b.isSource(c.text))))&&this.hideTooltip()}this.lastX=b.getX();this.lastY=b.getY()};mxTooltipHandler.prototype.mouseUp=function(a,b){this.reset(b,!0);this.hideTooltip()};
-mxTooltipHandler.prototype.resetTimer=function(){null!=this.thread&&(window.clearTimeout(this.thread),this.thread=null)};
-mxTooltipHandler.prototype.reset=function(a,b,c){if(!this.ignoreTouchEvents||mxEvent.isMouseEvent(a.getEvent()))if(this.resetTimer(),c=null!=c?c:this.getStateForEvent(a),b&&this.isEnabled()&&null!=c&&(null==this.div||"hidden"==this.div.style.visibility)){var d=a.getSource(),e=a.getX(),f=a.getY(),g=a.isSource(c.shape)||a.isSource(c.text);this.thread=window.setTimeout(mxUtils.bind(this,function(){if(!this.graph.isEditing()&&!this.graph.popupMenuHandler.isMenuShowing()&&!this.graph.isMouseDown){var a=
-this.graph.getTooltip(c,d,e,f);this.show(a,e,f);this.state=c;this.node=d;this.stateSource=g}}),this.delay)}};mxTooltipHandler.prototype.hide=function(){this.resetTimer();this.hideTooltip()};mxTooltipHandler.prototype.hideTooltip=function(){null!=this.div&&(this.div.style.visibility="hidden",this.div.innerHTML="")};
-mxTooltipHandler.prototype.show=function(a,b,c){if(!this.destroyed&&null!=a&&0<a.length){null==this.div&&this.init();var d=mxUtils.getScrollOrigin();this.div.style.zIndex=this.zIndex;this.div.style.left=b+d.x+"px";this.div.style.top=c+mxConstants.TOOLTIP_VERTICAL_OFFSET+d.y+"px";mxUtils.isNode(a)?(this.div.innerHTML="",this.div.appendChild(a)):this.div.innerHTML=a.replace(/\n/g,"<br>");this.div.style.visibility="";mxUtils.fit(this.div)}};
-mxTooltipHandler.prototype.destroy=function(){this.destroyed||(this.graph.removeMouseListener(this),mxEvent.release(this.div),null!=this.div&&null!=this.div.parentNode&&this.div.parentNode.removeChild(this.div),this.destroyed=!0,this.div=null)};function mxCellTracker(a,b,c){mxCellMarker.call(this,a,b);this.graph.addMouseListener(this);null!=c&&(this.getCell=c);mxClient.IS_IE&&mxEvent.addListener(window,"unload",mxUtils.bind(this,function(){this.destroy()}))}mxUtils.extend(mxCellTracker,mxCellMarker);
-mxCellTracker.prototype.mouseDown=function(a,b){};mxCellTracker.prototype.mouseMove=function(a,b){this.isEnabled()&&this.process(b)};mxCellTracker.prototype.mouseUp=function(a,b){};mxCellTracker.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.graph.removeMouseListener(this),mxCellMarker.prototype.destroy.apply(this))};
-function mxCellHighlight(a,b,c,d){null!=a&&(this.graph=a,this.highlightColor=null!=b?b:mxConstants.DEFAULT_VALID_COLOR,this.strokeWidth=null!=c?c:mxConstants.HIGHLIGHT_STROKEWIDTH,this.dashed=null!=d?d:!1,this.opacity=mxConstants.HIGHLIGHT_OPACITY,this.repaintHandler=mxUtils.bind(this,function(){if(null!=this.state){var a=this.graph.view.getState(this.state.cell);null==a?this.hide():(this.state=a,this.repaint())}}),this.graph.getView().addListener(mxEvent.SCALE,this.repaintHandler),this.graph.getView().addListener(mxEvent.TRANSLATE,
-this.repaintHandler),this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE,this.repaintHandler),this.graph.getModel().addListener(mxEvent.CHANGE,this.repaintHandler),this.resetHandler=mxUtils.bind(this,function(){this.hide()}),this.graph.getView().addListener(mxEvent.DOWN,this.resetHandler),this.graph.getView().addListener(mxEvent.UP,this.resetHandler))}mxCellHighlight.prototype.keepOnTop=!1;mxCellHighlight.prototype.graph=null;mxCellHighlight.prototype.state=null;
-mxCellHighlight.prototype.spacing=2;mxCellHighlight.prototype.resetHandler=null;mxCellHighlight.prototype.setHighlightColor=function(a){this.highlightColor=a;null!=this.shape&&(this.shape.stroke=a)};mxCellHighlight.prototype.drawHighlight=function(){this.shape=this.createShape();this.repaint();this.keepOnTop||this.shape.node.parentNode.firstChild==this.shape.node||this.shape.node.parentNode.insertBefore(this.shape.node,this.shape.node.parentNode.firstChild)};
-mxCellHighlight.prototype.createShape=function(){var a=this.graph.cellRenderer.createShape(this.state);a.svgStrokeTolerance=this.graph.tolerance;a.points=this.state.absolutePoints;a.apply(this.state);a.stroke=this.highlightColor;a.opacity=this.opacity;a.isDashed=this.dashed;a.isShadow=!1;a.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG;a.init(this.graph.getView().getOverlayPane());mxEvent.redirectMouseEvents(a.node,this.graph,this.state);this.graph.dialect!=
-mxConstants.DIALECT_SVG?a.pointerEvents=!1:a.svgPointerEvents="stroke";return a};mxCellHighlight.prototype.getStrokeWidth=function(a){return this.strokeWidth};
-mxCellHighlight.prototype.repaint=function(){if(null!=this.state&&null!=this.shape){this.shape.scale=this.state.view.scale;this.graph.model.isEdge(this.state.cell)?(this.shape.strokewidth=this.getStrokeWidth(),this.shape.points=this.state.absolutePoints,this.shape.outline=!1):(this.shape.bounds=new mxRectangle(this.state.x-this.spacing,this.state.y-this.spacing,this.state.width+2*this.spacing,this.state.height+2*this.spacing),this.shape.rotation=Number(this.state.style[mxConstants.STYLE_ROTATION]||
-"0"),this.shape.strokewidth=this.getStrokeWidth()/this.state.view.scale,this.shape.outline=!0);null!=this.state.shape&&this.shape.setCursor(this.state.shape.getCursor());if(mxClient.IS_QUIRKS||8==document.documentMode)"transparent"==this.shape.stroke?(this.shape.stroke="white",this.shape.opacity=1):this.shape.opacity=this.opacity;this.shape.redraw()}};mxCellHighlight.prototype.hide=function(){this.highlight(null)};
-mxCellHighlight.prototype.highlight=function(a){this.state!=a&&(null!=this.shape&&(this.shape.destroy(),this.shape=null),this.state=a,null!=this.state&&this.drawHighlight())};mxCellHighlight.prototype.isHighlightAt=function(a,b){var c=!1;if(null!=this.shape&&null!=document.elementFromPoint&&!mxClient.IS_QUIRKS)for(var d=document.elementFromPoint(a,b);null!=d;){if(d==this.shape.node){c=!0;break}d=d.parentNode}return c};
-mxCellHighlight.prototype.destroy=function(){this.graph.getView().removeListener(this.resetHandler);this.graph.getView().removeListener(this.repaintHandler);this.graph.getModel().removeListener(this.repaintHandler);null!=this.shape&&(this.shape.destroy(),this.shape=null)};
-var mxCodecRegistry={codecs:[],aliases:[],register:function(a){if(null!=a){var b=a.getName();mxCodecRegistry.codecs[b]=a;var c=mxUtils.getFunctionName(a.template.constructor);c!=b&&mxCodecRegistry.addAlias(c,b)}return a},addAlias:function(a,b){mxCodecRegistry.aliases[a]=b},getCodec:function(a){var b=null;if(null!=a){var b=mxUtils.getFunctionName(a),c=mxCodecRegistry.aliases[b];null!=c&&(b=c);b=mxCodecRegistry.codecs[b];if(null==b)try{b=new mxObjectCodec(new a),mxCodecRegistry.register(b)}catch(d){}}return b}};
-function mxCodec(a){this.document=a||mxUtils.createXmlDocument();this.objects=[]}mxCodec.prototype.document=null;mxCodec.prototype.objects=null;mxCodec.prototype.elements=null;mxCodec.prototype.encodeDefaults=!1;mxCodec.prototype.putObject=function(a,b){return this.objects[a]=b};mxCodec.prototype.getObject=function(a){var b=null;null!=a&&(b=this.objects[a],null==b&&(b=this.lookup(a),null==b&&(a=this.getElementById(a),null!=a&&(b=this.decode(a)))));return b};mxCodec.prototype.lookup=function(a){return null};
-mxCodec.prototype.getElementById=function(a){this.updateElements();return this.elements[a]};mxCodec.prototype.updateElements=function(){null==this.elements&&(this.elements={},null!=this.document.documentElement&&this.addElement(this.document.documentElement))};
-mxCodec.prototype.addElement=function(a){if(a.nodeType==mxConstants.NODETYPE_ELEMENT){var b=a.getAttribute("id");if(null!=b)if(null==this.elements[b])this.elements[b]=a;else if(this.elements[b]!=a)throw Error(b+": Duplicate ID");}for(a=a.firstChild;null!=a;)this.addElement(a),a=a.nextSibling};mxCodec.prototype.getId=function(a){var b=null;null!=a&&(b=this.reference(a),null==b&&a instanceof mxCell&&(b=a.getId(),null==b&&(b=mxCellPath.create(a),0==b.length&&(b="root"))));return b};
-mxCodec.prototype.reference=function(a){return null};mxCodec.prototype.encode=function(a){var b=null;if(null!=a&&null!=a.constructor){var c=mxCodecRegistry.getCodec(a.constructor);null!=c?b=c.encode(this,a):mxUtils.isNode(a)?b=mxUtils.importNode(this.document,a,!0):mxLog.warn("mxCodec.encode: No codec for "+mxUtils.getFunctionName(a.constructor))}return b};
-mxCodec.prototype.decode=function(a,b){this.updateElements();var c=null;if(null!=a&&a.nodeType==mxConstants.NODETYPE_ELEMENT){c=null;try{c=window[a.nodeName]}catch(d){}c=mxCodecRegistry.getCodec(c);null!=c?c=c.decode(this,a,b):(c=a.cloneNode(!0),c.removeAttribute("as"))}return c};mxCodec.prototype.encodeCell=function(a,b,c){b.appendChild(this.encode(a));if(null==c||c){c=a.getChildCount();for(var d=0;d<c;d++)this.encodeCell(a.getChildAt(d),b)}};
-mxCodec.prototype.isCellCodec=function(a){return null!=a&&"function"==typeof a.isCellCodec?a.isCellCodec():!1};mxCodec.prototype.decodeCell=function(a,b){b=null!=b?b:!0;var c=null;if(null!=a&&a.nodeType==mxConstants.NODETYPE_ELEMENT){c=mxCodecRegistry.getCodec(a.nodeName);if(!this.isCellCodec(c))for(var d=a.firstChild;null!=d&&!this.isCellCodec(c);)c=mxCodecRegistry.getCodec(d.nodeName),d=d.nextSibling;this.isCellCodec(c)||(c=mxCodecRegistry.getCodec(mxCell));c=c.decode(this,a);b&&this.insertIntoGraph(c)}return c};
-mxCodec.prototype.insertIntoGraph=function(a){var b=a.parent,c=a.getTerminal(!0),d=a.getTerminal(!1);a.setTerminal(null,!1);a.setTerminal(null,!0);a.parent=null;if(null!=b){if(b==a)throw Error(b.id+": Self Reference");b.insert(a)}null!=c&&c.insertEdge(a,!0);null!=d&&d.insertEdge(a,!1)};mxCodec.prototype.setAttribute=function(a,b,c){null!=b&&null!=c&&a.setAttribute(b,c)};
-function mxObjectCodec(a,b,c,d){this.template=a;this.exclude=null!=b?b:[];this.idrefs=null!=c?c:[];this.mapping=null!=d?d:[];this.reverse={};for(var e in this.mapping)this.reverse[this.mapping[e]]=e}mxObjectCodec.allowEval=!1;mxObjectCodec.prototype.template=null;mxObjectCodec.prototype.exclude=null;mxObjectCodec.prototype.idrefs=null;mxObjectCodec.prototype.mapping=null;mxObjectCodec.prototype.reverse=null;mxObjectCodec.prototype.getName=function(){return mxUtils.getFunctionName(this.template.constructor)};
-mxObjectCodec.prototype.cloneTemplate=function(){return new this.template.constructor};mxObjectCodec.prototype.getFieldName=function(a){if(null!=a){var b=this.reverse[a];null!=b&&(a=b)}return a};mxObjectCodec.prototype.getAttributeName=function(a){if(null!=a){var b=this.mapping[a];null!=b&&(a=b)}return a};mxObjectCodec.prototype.isExcluded=function(a,b,c,d){return b==mxObjectIdentity.FIELD_NAME||0<=mxUtils.indexOf(this.exclude,b)};
-mxObjectCodec.prototype.isReference=function(a,b,c,d){return 0<=mxUtils.indexOf(this.idrefs,b)};mxObjectCodec.prototype.encode=function(a,b){var c=a.document.createElement(this.getName());b=this.beforeEncode(a,b,c);this.encodeObject(a,b,c);return this.afterEncode(a,b,c)};mxObjectCodec.prototype.encodeObject=function(a,b,c){a.setAttribute(c,"id",a.getId(b));for(var d in b){var e=d,f=b[e];null==f||this.isExcluded(b,e,f,!0)||(mxUtils.isInteger(e)&&(e=null),this.encodeValue(a,b,e,f,c))}};
-mxObjectCodec.prototype.encodeValue=function(a,b,c,d,e){if(null!=d){if(this.isReference(b,c,d,!0)){var f=a.getId(d);if(null==f){mxLog.warn("mxObjectCodec.encode: No ID for "+this.getName()+"."+c+"="+d);return}d=f}f=this.template[c];if(null==c||a.encodeDefaults||f!=d)c=this.getAttributeName(c),this.writeAttribute(a,b,c,d,e)}};mxObjectCodec.prototype.writeAttribute=function(a,b,c,d,e){"object"!=typeof d?this.writePrimitiveAttribute(a,b,c,d,e):this.writeComplexAttribute(a,b,c,d,e)};
-mxObjectCodec.prototype.writePrimitiveAttribute=function(a,b,c,d,e){d=this.convertAttributeToXml(a,b,c,d,e);null==c?(b=a.document.createElement("add"),"function"==typeof d?b.appendChild(a.document.createTextNode(d)):a.setAttribute(b,"value",d),e.appendChild(b)):"function"!=typeof d&&a.setAttribute(e,c,d)};
-mxObjectCodec.prototype.writeComplexAttribute=function(a,b,c,d,e){a=a.encode(d);null!=a?(null!=c&&a.setAttribute("as",c),e.appendChild(a)):mxLog.warn("mxObjectCodec.encode: No node for "+this.getName()+"."+c+": "+d)};mxObjectCodec.prototype.convertAttributeToXml=function(a,b,c,d){this.isBooleanAttribute(a,b,c,d)&&(d=1==d?"1":"0");return d};mxObjectCodec.prototype.isBooleanAttribute=function(a,b,c,d){return"undefined"==typeof d.length&&(1==d||0==d)};
-mxObjectCodec.prototype.convertAttributeFromXml=function(a,b,c){var d=b.value;this.isNumericAttribute(a,b,c)&&(d=parseFloat(d),isNaN(d)||!isFinite(d))&&(d=0);return d};mxObjectCodec.prototype.isNumericAttribute=function(a,b,c){return c.constructor==mxGeometry&&("x"==b.name||"y"==b.name||"width"==b.name||"height"==b.name)||c.constructor==mxPoint&&("x"==b.name||"y"==b.name)||mxUtils.isNumeric(b.value)};mxObjectCodec.prototype.beforeEncode=function(a,b,c){return b};
-mxObjectCodec.prototype.afterEncode=function(a,b,c){return c};mxObjectCodec.prototype.decode=function(a,b,c){var d=b.getAttribute("id"),e=a.objects[d];null==e&&(e=c||this.cloneTemplate(),null!=d&&a.putObject(d,e));b=this.beforeDecode(a,b,e);this.decodeNode(a,b,e);return this.afterDecode(a,b,e)};mxObjectCodec.prototype.decodeNode=function(a,b,c){null!=b&&(this.decodeAttributes(a,b,c),this.decodeChildren(a,b,c))};
-mxObjectCodec.prototype.decodeAttributes=function(a,b,c){b=b.attributes;if(null!=b)for(var d=0;d<b.length;d++)this.decodeAttribute(a,b[d],c)};mxObjectCodec.prototype.isIgnoredAttribute=function(a,b,c){return"as"==b.nodeName||"id"==b.nodeName};
-mxObjectCodec.prototype.decodeAttribute=function(a,b,c){if(!this.isIgnoredAttribute(a,b,c)){var d=b.nodeName;b=this.convertAttributeFromXml(a,b,c);var e=this.getFieldName(d);if(this.isReference(c,e,b,!1)){a=a.getObject(b);if(null==a){mxLog.warn("mxObjectCodec.decode: No object for "+this.getName()+"."+d+"="+b);return}b=a}this.isExcluded(c,d,b,!1)||(c[d]=b)}};
-mxObjectCodec.prototype.decodeChildren=function(a,b,c){for(b=b.firstChild;null!=b;){var d=b.nextSibling;b.nodeType!=mxConstants.NODETYPE_ELEMENT||this.processInclude(a,b,c)||this.decodeChild(a,b,c);b=d}};
-mxObjectCodec.prototype.decodeChild=function(a,b,c){var d=this.getFieldName(b.getAttribute("as"));if(null==d||!this.isExcluded(c,d,b,!1)){var e=this.getFieldTemplate(c,d,b);"add"==b.nodeName?(a=b.getAttribute("value"),null==a&&mxObjectCodec.allowEval&&(a=mxUtils.eval(mxUtils.getTextContent(b)))):a=a.decode(b,e);try{this.addObjectValue(c,d,a,e)}catch(f){throw Error(f.message+" for "+b.nodeName);}}};
-mxObjectCodec.prototype.getFieldTemplate=function(a,b,c){a=a[b];a instanceof Array&&0<a.length&&(a=null);return a};mxObjectCodec.prototype.addObjectValue=function(a,b,c,d){null!=c&&c!=d&&(null!=b&&0<b.length?a[b]=c:a.push(c))};mxObjectCodec.prototype.processInclude=function(a,b,c){if("include"==b.nodeName){b=b.getAttribute("name");if(null!=b)try{var d=mxUtils.load(b).getDocumentElement();null!=d&&a.decode(d,c)}catch(e){}return!0}return!1};mxObjectCodec.prototype.beforeDecode=function(a,b,c){return b};
-mxObjectCodec.prototype.afterDecode=function(a,b,c){return c};
-mxCodecRegistry.register(function(){var a=new mxObjectCodec(new mxCell,["children","edges","overlays","mxTransient"],["parent","source","target"]);a.isCellCodec=function(){return!0};a.isNumericAttribute=function(a,c,d){return"value"!==c.nodeName&&mxObjectCodec.prototype.isNumericAttribute.apply(this,arguments)};a.isExcluded=function(a,c,d,e){return mxObjectCodec.prototype.isExcluded.apply(this,arguments)||e&&"value"==c&&d.nodeType==mxConstants.NODETYPE_ELEMENT};a.afterEncode=function(a,c,d){if(null!=
-c.value&&c.value.nodeType==mxConstants.NODETYPE_ELEMENT){var b=d;d=mxUtils.importNode(a.document,c.value,!0);d.appendChild(b);a=b.getAttribute("id");d.setAttribute("id",a);b.removeAttribute("id")}return d};a.beforeDecode=function(a,c,d){var b=c.cloneNode(!0),f=this.getName();c.nodeName!=f?(b=c.getElementsByTagName(f)[0],null!=b&&b.parentNode==c?(mxUtils.removeWhitespace(b,!0),mxUtils.removeWhitespace(b,!1),b.parentNode.removeChild(b)):b=null,d.value=c.cloneNode(!0),c=d.value.getAttribute("id"),null!=
-c&&(d.setId(c),d.value.removeAttribute("id"))):d.setId(c.getAttribute("id"));if(null!=b)for(c=0;c<this.idrefs.length;c++){var f=this.idrefs[c],g=b.getAttribute(f);if(null!=g){b.removeAttribute(f);var k=a.objects[g]||a.lookup(g);null==k&&(g=a.getElementById(g),null!=g&&(k=(mxCodecRegistry.codecs[g.nodeName]||this).decode(a,g)));d[f]=k}}return b};return a}());
-mxCodecRegistry.register(function(){var a=new mxObjectCodec(new mxGraphModel);a.encodeObject=function(a,c,d){var b=a.document.createElement("root");a.encodeCell(c.getRoot(),b);d.appendChild(b)};a.decodeChild=function(a,c,d){"root"==c.nodeName?this.decodeRoot(a,c,d):mxObjectCodec.prototype.decodeChild.apply(this,arguments)};a.decodeRoot=function(a,c,d){var b=null;for(c=c.firstChild;null!=c;){var f=a.decodeCell(c);null!=f&&null==f.getParent()&&(b=f);c=c.nextSibling}null!=b&&d.setRoot(b)};return a}());
-mxCodecRegistry.register(function(){var a=new mxObjectCodec(new mxRootChange,["model","previous","root"]);a.afterEncode=function(a,c,d){a.encodeCell(c.root,d);return d};a.beforeDecode=function(a,c,d){if(null!=c.firstChild&&c.firstChild.nodeType==mxConstants.NODETYPE_ELEMENT){c=c.cloneNode(!0);var b=c.firstChild;d.root=a.decodeCell(b,!1);d=b.nextSibling;b.parentNode.removeChild(b);for(b=d;null!=b;)d=b.nextSibling,a.decodeCell(b),b.parentNode.removeChild(b),b=d}return c};a.afterDecode=function(a,c,
-d){d.previous=d.root;return d};return a}());
-mxCodecRegistry.register(function(){var a=new mxObjectCodec(new mxChildChange,["model","child","previousIndex"],["parent","previous"]);a.isReference=function(a,c,d,e){return"child"!=c||e&&!a.model.contains(a.previous)?0<=mxUtils.indexOf(this.idrefs,c):!0};a.isExcluded=function(a,c,d,e){return mxObjectCodec.prototype.isExcluded.apply(this,arguments)||e&&null!=d&&("previous"==c||"parent"==c)&&!a.model.contains(d)};a.afterEncode=function(a,c,d){this.isReference(c,"child",c.child,!0)?d.setAttribute("child",
-a.getId(c.child)):a.encodeCell(c.child,d);return d};a.beforeDecode=function(a,c,d){if(null!=c.firstChild&&c.firstChild.nodeType==mxConstants.NODETYPE_ELEMENT){c=c.cloneNode(!0);var b=c.firstChild;d.child=a.decodeCell(b,!1);d=b.nextSibling;b.parentNode.removeChild(b);for(b=d;null!=b;){d=b.nextSibling;if(b.nodeType==mxConstants.NODETYPE_ELEMENT){var f=b.getAttribute("id");null==a.lookup(f)&&a.decodeCell(b)}b.parentNode.removeChild(b);b=d}}else b=c.getAttribute("child"),d.child=a.getObject(b);return c};
-a.afterDecode=function(a,c,d){null!=d.child&&(null!=d.child.parent&&null!=d.previous&&d.child.parent!=d.previous&&(d.previous=d.child.parent),d.child.parent=d.previous,d.previous=d.parent,d.previousIndex=d.index);return d};return a}());mxCodecRegistry.register(function(){var a=new mxObjectCodec(new mxTerminalChange,["model","previous"],["cell","terminal"]);a.afterDecode=function(a,c,d){d.previous=d.terminal;return d};return a}());
-var mxGenericChangeCodec=function(a,b){var c=new mxObjectCodec(a,["model","previous"],["cell"]);c.afterDecode=function(a,c,f){mxUtils.isNode(f.cell)&&(f.cell=a.decodeCell(f.cell,!1));f.previous=f[b];return f};return c};mxCodecRegistry.register(mxGenericChangeCodec(new mxValueChange,"value"));mxCodecRegistry.register(mxGenericChangeCodec(new mxStyleChange,"style"));mxCodecRegistry.register(mxGenericChangeCodec(new mxGeometryChange,"geometry"));
-mxCodecRegistry.register(mxGenericChangeCodec(new mxCollapseChange,"collapsed"));mxCodecRegistry.register(mxGenericChangeCodec(new mxVisibleChange,"visible"));mxCodecRegistry.register(mxGenericChangeCodec(new mxCellAttributeChange,"value"));mxCodecRegistry.register(function(){return new mxObjectCodec(new mxGraph,"graphListeners eventListeners view container cellRenderer editor selection".split(" "))}());
-mxCodecRegistry.register(function(){var a=new mxObjectCodec(new mxGraphView);a.encode=function(a,c){return this.encodeCell(a,c,c.graph.getModel().getRoot())};a.encodeCell=function(a,c,d){var b=c.graph.getModel(),f=c.getState(d),g=b.getParent(d);if(null==g||null!=f){var k=b.getChildCount(d),l=c.graph.getCellGeometry(d),m=null;g==b.getRoot()?m="layer":null==g?m="graph":b.isEdge(d)?m="edge":0<k&&null!=l?m="group":b.isVertex(d)&&(m="vertex");if(null!=m){var n=a.document.createElement(m);null!=c.graph.getLabel(d)&&
-(n.setAttribute("label",c.graph.getLabel(d)),c.graph.isHtmlLabel(d)&&n.setAttribute("html",!0));if(null==g){var p=c.getGraphBounds();null!=p&&(n.setAttribute("x",Math.round(p.x)),n.setAttribute("y",Math.round(p.y)),n.setAttribute("width",Math.round(p.width)),n.setAttribute("height",Math.round(p.height)));n.setAttribute("scale",c.scale)}else if(null!=f&&null!=l){for(p in f.style)g=f.style[p],"function"==typeof g&&"object"==typeof g&&(g=mxStyleRegistry.getName(g)),null!=g&&"function"!=typeof g&&"object"!=
-typeof g&&n.setAttribute(p,g);g=f.absolutePoints;if(null!=g&&0<g.length){l=Math.round(g[0].x)+","+Math.round(g[0].y);for(p=1;p<g.length;p++)l+=" "+Math.round(g[p].x)+","+Math.round(g[p].y);n.setAttribute("points",l)}else n.setAttribute("x",Math.round(f.x)),n.setAttribute("y",Math.round(f.y)),n.setAttribute("width",Math.round(f.width)),n.setAttribute("height",Math.round(f.height));p=f.absoluteOffset;null!=p&&(0!=p.x&&n.setAttribute("dx",Math.round(p.x)),0!=p.y&&n.setAttribute("dy",Math.round(p.y)))}for(p=
-0;p<k;p++)f=this.encodeCell(a,c,b.getChildAt(d,p)),null!=f&&n.appendChild(f)}}return n};return a}());
-var mxStylesheetCodec=mxCodecRegistry.register(function(){var a=new mxObjectCodec(new mxStylesheet);a.encode=function(a,c){var b=a.document.createElement(this.getName()),e;for(e in c.styles){var f=c.styles[e],g=a.document.createElement("add");if(null!=e){g.setAttribute("as",e);for(var k in f){var l=this.getStringValue(k,f[k]);if(null!=l){var m=a.document.createElement("add");m.setAttribute("value",l);m.setAttribute("as",k);g.appendChild(m)}}0<g.childNodes.length&&b.appendChild(g)}}return b};a.getStringValue=
-function(a,c){var b=typeof c;"function"==b?c=mxStyleRegistry.getName(c):"object"==b&&(c=null);return c};a.decode=function(a,c,d){d=d||new this.template.constructor;var b=c.getAttribute("id");null!=b&&(a.objects[b]=d);for(c=c.firstChild;null!=c;){if(!this.processInclude(a,c,d)&&"add"==c.nodeName&&(b=c.getAttribute("as"),null!=b)){var f=c.getAttribute("extend"),g=null!=f?mxUtils.clone(d.styles[f]):null;null==g&&(null!=f&&mxLog.warn("mxStylesheetCodec.decode: stylesheet "+f+" not found to extend"),g=
-{});for(f=c.firstChild;null!=f;){if(f.nodeType==mxConstants.NODETYPE_ELEMENT){var k=f.getAttribute("as");if("add"==f.nodeName){var l=mxUtils.getTextContent(f);null!=l&&0<l.length&&mxStylesheetCodec.allowEval?l=mxUtils.eval(l):(l=f.getAttribute("value"),mxUtils.isNumeric(l)&&(l=parseFloat(l)));null!=l&&(g[k]=l)}else"remove"==f.nodeName&&delete g[k]}f=f.nextSibling}d.putCellStyle(b,g)}c=c.nextSibling}return d};return a}());mxStylesheetCodec.allowEval=!0; \ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/google_client_redirect_uri b/src/main/webapp/WEB-INF/google_client_redirect_uri
deleted file mode 100644
index ec8ee4bc..00000000
--- a/src/main/webapp/WEB-INF/google_client_redirect_uri
+++ /dev/null
@@ -1 +0,0 @@
-Replace_with_your_own_google_client_redirect_url \ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/google_old_client_id b/src/main/webapp/WEB-INF/google_old_client_id
deleted file mode 100644
index 3379637d..00000000
--- a/src/main/webapp/WEB-INF/google_old_client_id
+++ /dev/null
@@ -1 +0,0 @@
-Replace_with_your_own_google_client_id \ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/google_old_client_redirect_uri b/src/main/webapp/WEB-INF/google_old_client_redirect_uri
deleted file mode 100644
index ec8ee4bc..00000000
--- a/src/main/webapp/WEB-INF/google_old_client_redirect_uri
+++ /dev/null
@@ -1 +0,0 @@
-Replace_with_your_own_google_client_redirect_url \ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/lib/cache-api-1.1.1.jar b/src/main/webapp/WEB-INF/lib/cache-api-1.1.1.jar
deleted file mode 100644
index 53665d23..00000000
--- a/src/main/webapp/WEB-INF/lib/cache-api-1.1.1.jar
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/WEB-INF/lib/ehcache-3.8.1.jar b/src/main/webapp/WEB-INF/lib/ehcache-3.8.1.jar
deleted file mode 100644
index 4f9ce5f5..00000000
--- a/src/main/webapp/WEB-INF/lib/ehcache-3.8.1.jar
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/WEB-INF/lib/gae-stub-1.0.3.jar b/src/main/webapp/WEB-INF/lib/gae-stub-1.0.3.jar
deleted file mode 100644
index 04a388d1..00000000
--- a/src/main/webapp/WEB-INF/lib/gae-stub-1.0.3.jar
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/WEB-INF/lib/mxgraph-core.jar b/src/main/webapp/WEB-INF/lib/mxgraph-core.jar
deleted file mode 100644
index a2f78299..00000000
--- a/src/main/webapp/WEB-INF/lib/mxgraph-core.jar
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/WEB-INF/lib/slf4j-api-1.7.25.jar b/src/main/webapp/WEB-INF/lib/slf4j-api-1.7.25.jar
deleted file mode 100644
index 0143c099..00000000
--- a/src/main/webapp/WEB-INF/lib/slf4j-api-1.7.25.jar
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/WEB-INF/msgraph_client_redirect_uri b/src/main/webapp/WEB-INF/msgraph_client_redirect_uri
deleted file mode 100644
index 3f761e0b..00000000
--- a/src/main/webapp/WEB-INF/msgraph_client_redirect_uri
+++ /dev/null
@@ -1 +0,0 @@
-Replace_with_your_own_microsoft_graph_client_redirect_uri \ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/msgraph_dev_client_id b/src/main/webapp/WEB-INF/msgraph_dev_client_id
deleted file mode 100644
index df8d0c78..00000000
--- a/src/main/webapp/WEB-INF/msgraph_dev_client_id
+++ /dev/null
@@ -1 +0,0 @@
-Replace_with_your_own_microsoft_graph_client_id \ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/msgraph_dev_client_secret b/src/main/webapp/WEB-INF/msgraph_dev_client_secret
deleted file mode 100644
index 571aeb01..00000000
--- a/src/main/webapp/WEB-INF/msgraph_dev_client_secret
+++ /dev/null
@@ -1 +0,0 @@
-Replace_with_your_own_microsoft_graph_client_secret \ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/msgraph_old_client_redirect_uri b/src/main/webapp/WEB-INF/msgraph_old_client_redirect_uri
deleted file mode 100644
index 3f761e0b..00000000
--- a/src/main/webapp/WEB-INF/msgraph_old_client_redirect_uri
+++ /dev/null
@@ -1 +0,0 @@
-Replace_with_your_own_microsoft_graph_client_redirect_uri \ No newline at end of file
diff --git a/src/main/webapp/about.html b/src/main/webapp/about.html
deleted file mode 100644
index 1250b1a6..00000000
--- a/src/main/webapp/about.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta http-equiv="refresh" content="0;url=index.html">
-</head>
-</html>
diff --git a/src/main/webapp/app.html b/src/main/webapp/app.html
deleted file mode 100644
index 32753a90..00000000
--- a/src/main/webapp/app.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta http-equiv="refresh" content="0;url=https://app.diagrams.net/">
-</head>
-</html>
diff --git a/src/main/webapp/cache.manifest b/src/main/webapp/cache.manifest
deleted file mode 100644
index 0271e829..00000000
--- a/src/main/webapp/cache.manifest
+++ /dev/null
@@ -1,64 +0,0 @@
-CACHE MANIFEST
-
-# THIS FILE WAS GENERATED. DO NOT MODIFY!
-# 02/17/2020 01:02 pm
-
-app.html
-index.html?offline=1
-index.html?offline=1&ui=min
-index.html?offline=1&https=0
-offline.html
-open.html
-js/app.min.js
-js/shapes.min.js
-js/stencils.min.js
-js/extensions.min.js
-js/diagramly/ElectronApp.js
-styles/grapheditor.css
-styles/atlas.css
-styles/dark.css
-favicon.ico
-mxgraph/css/common.css
-mxgraph/images/maximize.gif
-mxgraph/images/minimize.gif
-mxgraph/images/close.gif
-mxgraph/images/resize.gif
-mxgraph/images/separator.gif
-mxgraph/images/window.gif
-mxgraph/images/window-title.gif
-mxgraph/images/button.gif
-mxgraph/images/point.gif
-resources/dia.txt
-images/delete.png
-images/droptarget.png
-images/help.png
-images/download.png
-images/drawlogo.svg
-images/drawlogo-gray.svg
-images/drawlogo-text-bottom.svg
-images/logo-flat.png
-images/osa_drive-harddisk.png
-images/osa_database.png
-images/glyphicons_star.png
-images/logo-confluence.png
-images/logo-jira.png
-images/clear.gif
-images/spin.gif
-images/checkmark.gif
-images/favicon-16x16.png
-images/favicon-32x32.png
-images/android-chrome-192x192.png
-images/android-chrome-512x512.png
-images/glyphicons_google.png
-images/glyphicons_facebook.png
-images/glyphicons_twitter.png
-images/glyphicons_github.png
-images/hs.png
-
-# Redirect app to app.html which redirects to index.html?offline=1
-# this is required to get the URL parameters into the index page.
-FALLBACK:
-app app.html
-
-NETWORK:
-*
diff --git a/src/main/webapp/connect/att_common/att-editor.js b/src/main/webapp/connect/att_common/att-editor.js
deleted file mode 100644
index fc411668..00000000
--- a/src/main/webapp/connect/att_common/att-editor.js
+++ /dev/null
@@ -1,570 +0,0 @@
-function AttViewerEditor(onSubmit, getFileInfoFn, idSuffix, notStandalone, drawioOnly, genImage)
-{
- idSuffix = idSuffix || '';
- var isDrawio = false;
-
- var opts =
- {
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
- this.spinner = spinner;
- spinner.spin(AC.$('#spinner-container' + idSuffix));
-
- var head = document.getElementsByTagName('head')[0];
-
- // Handles timeouts
- var acceptResponse = true;
-
- var timeoutHandler = function()
- {
- acceptResponse = false;
- spinner.stop();
- alert('The connection has timed out');
- };
-
- var timeoutThread = window.setTimeout(timeoutHandler, 25000);
-
- var selectedFile = null, selFileContent = null, editedFile = null;
- var curViewer = null;
-
- function showError(elem, errMsg)
- {
- elem.innerHTML = '<img src="data:image/gif;base64,R0lGODlhEAAQAPcAAADGAIQAAISEhP8AAP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAAALAAAAAAQABAAAAhoAAEIFBigYMGBCAkGGMCQ4cGECxtKHBAAYUQCEzFSHLiQgMeGHjEGEAAg4oCQJz86LCkxpEqHAkwyRClxpEyXGmGaREmTIsmOL1GO/DkzI0yOE2sKIMlRJsWhCQHENDiUaVSpS5cmDAgAOw==" border="0" align="absmiddle"/> ' +
- AC.htmlEntities(errMsg);
- };
-
- function prevDrawioFile(doc, prevDiv, filename, aspect)
- {
- spinner.stop();
-
- var container = document.createElement('div');
- // NOTE: Height must be specified with default value "auto" to force automatic fit in viewer
- container.style.cssText = 'position:absolute;width:auto;left:0px;right:0px;height:auto;bottom:0px;top:0px;border:1px solid transparent;';
- prevDiv.appendChild(container);
-
- var pageId, layerIds;
-
- if (aspect != null)
- {
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- Graph.prototype.shadowId = 'attachmentDropShadow';
- var viewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', border: 8, 'auto-fit': true,
- resize: false, nav: true, lightbox: false, title: filename,
- 'toolbar-nohide': true, 'toolbar-position': 'top', toolbar: 'pages layers',
- pageId: pageId, layerIds: layerIds});
-
- viewer.graph.addListener('size', function()
- {
- var root = this.view.getDrawPane().ownerSVGElement;
-
- if (root != null)
- {
- root.style.minHeight = '';
- }
- });
-
- curViewer = viewer;
-
- if (typeof AP != 'undefined')
- {
- AP.dialog.getButton('submit').enable();
- var altSubmitBtn = AP.dialog.getButton('altSubmitBtn');
-
- if (altSubmitBtn) altSubmitBtn.enable();
- }
- };
-
- function prevImageFile(url, prevDiv, success, error)
- {
- var img = new Image();
-
- img.onload = function()
- {
- var s = Math.min(prevDiv.offsetWidth / img.width, prevDiv.offsetHeight / img.height);
-
- if (s < 1)
- {
- img.width = s * img.width;
- img.height = s * img.height;
- }
-
- img.style.verticalAlign = 'middle';
- prevDiv.style.lineHeight = prevDiv.offsetHeight + 'px';
- prevDiv.appendChild(img);
-
- if (typeof AP != 'undefined')
- {
- AP.dialog.getButton('submit').enable();
- var altSubmitBtn = AP.dialog.getButton('altSubmitBtn');
-
- if (altSubmitBtn) altSubmitBtn.enable();
- }
-
- spinner.stop();
-
- if (success)
- {
- success(img);
- }
- };
-
- img.onerror = function()
- {
- if (error)
- {
- error();
- }
-
- spinner.stop();
- };
-
- img.src = url;
- curViewer = null;
- };
-
- function genericOnSubmit()
- {
- var hasError = false;
- //this cannot happen as the submit button is disabled until a file is selected
- if (editedFile == null && selectedFile == null)
- {
- AC.$('#filenameError' + idSuffix).innerHTML = 'Please select a file';
- hasError = true;
- }
-
- var width = parseInt(AC.$('#width' + idSuffix).value);
- var height = parseInt(AC.$('#height' + idSuffix).value);
- var autoSize = AC.$('#autoSize' + idSuffix).checked;
-
- if (!autoSize && (isNaN(width) || width <= 0))
- {
- AC.$('#widthError' + idSuffix).innerHTML = 'Width must be greater than zero';
- hasError = true;
- }
-
- if (!autoSize && (isNaN(height) || height <= 0))
- {
- AC.$('#heightError' + idSuffix).innerHTML = 'Height must be greater than zero';
- hasError = true;
- }
-
- if (hasError)
- {
- return;
- }
-
- var aspect = null;
-
- if (curViewer != null)
- {
- var layerIds = [];
-
- var model = curViewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- aspect = curViewer.diagrams[curViewer.currentPage].getAttribute('id') + ' ' + layerIds.join(' ');
-
- if (autoSize)
- {
- var bounds = curViewer.graph.view.graphBounds;
- width = Math.round(bounds.width) || null;
- height = Math.round(bounds.height) || null;
- }
- }
-
- if (typeof AP != 'undefined')
- {
- AP.dialog.getButton('submit').disable();
- var altSubmitBtn = AP.dialog.getButton('altSubmitBtn');
-
- if (altSubmitBtn) altSubmitBtn.disable();
- }
-
- spinner.spin(AC.$('#preview' + idSuffix));
-
-
- var image = null;
-
- function finalize()
- {
- onSubmit(selectedFile, selFileContent, editedFile, width, height, autoSize, isDrawio, aspect, function()
- {
- if (typeof AP != 'undefined')
- {
- AP.dialog.getButton('submit').enable();
- var altSubmitBtn = AP.dialog.getButton('altSubmitBtn');
-
- if (altSubmitBtn) altSubmitBtn.enable();
- }
-
- showError(AC.$('#errorMsg' + idSuffix), 'Uploading file failed');
- spinner.stop();
- }, image);
- };
-
- if (genImage && curViewer.editor.isExportToCanvas())
- {
- curViewer.editor.exportToCanvas(function(canvas)
- {
- var data = canvas.toDataURL('image/png');
- image = data.substring(data.lastIndexOf(',') + 1);
- finalize();
- }
- , null, null, null, finalize);
- }
- else
- {
- finalize()
- }
- }
-
- this.doSubmit = genericOnSubmit;
-
- function main()
- {
- window.clearTimeout(timeoutThread);
- spinner.stop();
-
- AC.$('#filePicker' + idSuffix).addEventListener('click', function(evt)
- {
- AC.$('#fileupload' + idSuffix).click();
- evt.preventDefault();
- });
-
- AC.$('#fileupload' + idSuffix).addEventListener('change', function(evt)
- {
- if (this.files != null)
- {
- var file = this.files[0];
-
- if (this.files.length == 1 && file != null)
- {
- AC.$('#filenameError' + idSuffix).innerHTML = '';
- AC.$('#filename' + idSuffix).value = file.name;
-
- var prevDiv = AC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- if (typeof convertVSDXtoMX != 'undefined' && /\.v(dx|sdx?)$/i.test(file.name))
- {
- convertVSDXtoMX(file, file.name, function(xml)
- {
- selFileContent = xml;
- isDrawio = true;
- prevDrawioFile(mxUtils.parseXml(xml), prevDiv, file.name);
- }, function()
- {
- showError(prevDiv, 'Unsupported vsdx file');
- });
- }
- else
- {
- var reader = new FileReader();
-
- reader.onload = function(e)
- {
- var data = e.target.result;
- var potentialDraw = true;
- var isImage = false;
- isDrawio = false;
-
- if (file.type == 'image/svg+xml' && data.substring(0, 26) == 'data:image/svg+xml;base64,')
- {
- var base64 = data.substring(data.indexOf(',') + 1);
-
- // Workaround for invalid character error in Safari
- data = (window.atob && !mxClient.IS_SF) ? atob(base64) : Base64.decode(base64, true);
- }
- else if (!drawioOnly && file.type.indexOf('image') == 0)
- {
- isImage = true;
- var pngData = null;
-
- if (file.type == 'image/png')
- {
- pngData = AC.extractGraphModelFromPng(data);
- }
-
- if (pngData == null)
- {
- potentialDraw = false;
- }
- else
- {
- data = pngData;
- }
- }
-
- selFileContent = data;
-
- if (potentialDraw)
- {
- try
- {
- var doc = mxUtils.parseXml(data);
-
- if (new Editor().extractGraphModel(doc.documentElement) != null)
- {
- isDrawio = true;
- isImage = false
- prevDrawioFile(doc, prevDiv, file.name);
- }
- }
- catch(e) {}
- }
-
- if (isImage)
- {
- prevImageFile(data, prevDiv, null, function()
- {
- showError(prevDiv, 'Unsupported image file');
- selectedFile = null;
- });
- }
- else if (!isDrawio)
- {
- showError(prevDiv, 'Unsupported file format');
- selectedFile = null;
- spinner.stop();
- }
- }
-
- if (file.type.indexOf('image') == 0)
- {
- reader.readAsDataURL(file);
- }
- else
- {
- reader.readAsText(file);
- }
- }
-
- selectedFile = file;
- editedFile = null;
- }
- else
- {
- AC.$('#filenameError' + idSuffix).innerHTML = 'Please select a single file only';
- }
- }
-
- // Resets input to force change event for same file (type reset required for IE)
- this.type = '';
- this.type = 'file';
- this.value = '';
- evt.preventDefault();
- });
-
- function removeErrMsg()
- {
- AC.$('#' + this.id + 'Error' + idSuffix).innerHTML = '';
- };
-
- AC.$('#width' + idSuffix).addEventListener('change', removeErrMsg);
- AC.$('#height' + idSuffix).addEventListener('change', removeErrMsg);
-
- if (getFileInfoFn)
- {
- var prevDiv = AC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- getFileInfoFn(function(fileInfo, fileContent)
- {
- var altSubmitBtn = AP.dialog.createButton({
- text: fileInfo? 'Save' : 'Insert',
- identifier: 'altSubmitBtn'
- });
- altSubmitBtn.bind(genericOnSubmit);
- altSubmitBtn.disable();
- var autoSize = true;
-
- if (fileInfo && fileInfo.attId)
- {
- autoSize = fileInfo.autoSize == '1';
- AC.$('#width' + idSuffix).value = fileInfo.width;
- AC.$('#height' + idSuffix).value = fileInfo.height;
- AC.$('#filename' + idSuffix).value = fileInfo.filename;
-
- editedFile = fileInfo;
-
- if (fileInfo.isDrawio == '1')
- {
- if (fileInfo.mimeType == 'image/png')
- {
- fileContent = AC.extractGraphModelFromPng(fileContent);
- }
-
- var doc = mxUtils.parseXml(fileContent);
-
- try
- {
- prevDrawioFile(doc, prevDiv, fileInfo.filename, fileInfo.aspect);
- }
- catch(e)
- {
- showError(prevDiv, 'Attachment file "' + fileInfo.filename + '" is corrupted');
- }
- }
- else
- {
- prevImageFile(fileContent, prevDiv, null, function()
- {
- showError(prevDiv, 'Attachment file "' + fileInfo.filename + '" is corrupted');
- });
- }
- }
- else
- {
- spinner.stop();
- }
-
- AC.$('#autoSize' + idSuffix).checked = autoSize;
- autoSizeChanged(autoSize);
- }, function(fileInfo)
- {
- if (fileInfo != null && fileInfo.filename == null)
- {
- prevDiv.innerHTML = '<a style="display:block;text-align:center;position:absolute;' +
- 'top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer">Choose a file...</button>'
-
- prevDiv.getElementsByTagName('a')[0].addEventListener('click', function(evt)
- {
- document.getElementById('filePicker').click();
- evt.preventDefault();
- });
- }
- else
- {
- showError(prevDiv, fileInfo? 'Failed to load attachment file "' + fileInfo.filename + '"' : 'Unexpected Error');
- }
- });
- }
- };
-
- //This function expects having the downloadUrl in the fileInfo
- this.loadDrawioFile = function(fileInfo)
- {
- editedFile = fileInfo;
- AC.$('#filename' + idSuffix).value = fileInfo.diagramDisplayName;
- AC.$('#autoSize' + idSuffix).checked = true;
- var prevDiv = AC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- var req = new XMLHttpRequest();
- req.open('GET', fileInfo.downloadUrl);
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- selFileContent = req.responseText;
- var doc = mxUtils.parseXml(selFileContent);
-
- try
- {
- prevDrawioFile(doc, prevDiv, fileInfo.diagramDisplayName, fileInfo.aspect);
- }
- catch(e)
- {
- showError(prevDiv, 'Attachment file "' + fileInfo.diagramName + '" is corrupted');
- }
- }
- else
- {
- showError(prevDiv, 'Cannot read attachment file "' + fileInfo.diagramName + '".');
- }
- }
- };
-
- req.send();
- };
-
- function autoSizeChanged(isChecked)
- {
- if(isChecked)
- {
- AC.$('#width' + idSuffix).setAttribute('disabled', 'disabled');
- AC.$('#height' + idSuffix).setAttribute('disabled', 'disabled');
- }
- else
- {
- AC.$('#width' + idSuffix).removeAttribute('disabled');
- AC.$('#height' + idSuffix).removeAttribute('disabled');
- }
- };
-
- AC.$('#autoSize' + idSuffix).addEventListener('change', function(evt)
- {
- autoSizeChanged(this.checked);
- });
-
- function loadAtlassianApi()
- {
- var script = document.createElement('script');
-
- script.onload = function()
- {
- AP.dialog.disableCloseOnSubmit();
-
- //TODO when conf bug of submit is fixed, re-enable this and remove the button above
- AP.dialog.getButton('submit').hide();
-
- AP.events.on('dialog.submit', genericOnSubmit);
- AP.dialog.getButton('submit').disable();
- main();
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
- head.appendChild(script);
- };
-
- // Loads APIs
- if (!notStandalone)
- {
- loadAtlassianApi();
- }
- else
- {
- main();
- }
-};
-
diff --git a/src/main/webapp/connect/bitbucket/connect-dev.json b/src/main/webapp/connect/bitbucket/connect-dev.json
deleted file mode 100644
index b339020c..00000000
--- a/src/main/webapp/connect/bitbucket/connect-dev.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "key": "com.mxgraph.bitbucket.plugins.diagramly",
- "name": "Draw.io Viewer",
- "description": "Viewer for files created with draw.io",
- "baseUrl": "https://8d3077df.ngrok.io",
- "modules": {
- "fileViews": [
- {
- "key": "diagram",
- "name": {
- "value": "Diagram"
- },
- "url": "/viewer.html?repo={repo_uuid}&cset={file_cset}&path={file_path}&name={file_name}",
- "file_matches": {
- "extensions": ["xml"]
- }
- }
- ],
- "oauthConsumer": {
- "clientId": "Ss8dQHwm4RaeMqCaak"
- }
- },
- "scopes": [
- "repository"
- ],
- "contexts": [
- "personal"
- ]
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/bitbucket/viewer.html b/src/main/webapp/connect/bitbucket/viewer.html
deleted file mode 100644
index ff4b227e..00000000
--- a/src/main/webapp/connect/bitbucket/viewer.html
+++ /dev/null
@@ -1,200 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Draw.io Viewer</title>
-<script src="https://bitbucket.org/atlassian-connect/all.js"></script>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/logo-flat.png);
- background-repeat:no-repeat;
- background-position:center;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-</head>
-<body>
-<script type="text/javascript">
-// Parses URL parameters
-function getUrlParam(param)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
-};
-
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-
-// Overrides browser language with Confluence user language
-var lang = getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript">
-(function()
-{
- // Enables dynamic loading of shapes and stencils (same domain)
- mxStencilRegistry.dynamicLoading = true;
-
- var srcRawUrl = '/1.0/repositories/{}/' + RBR.queryParam('repo') +
- '/raw/' + RBR.queryParam('cset') +
- '/' + RBR.queryParam('path');
-
- var tbHeight = GraphViewer.prototype.toolbarHeight;
- var border = 8;
-
- document.body.style.backgroundImage = 'url(/images/ajax-loader.gif)';
-
- function main()
- {
- //keeping the block of AP.require to minimize the number of changes!
- {
- AP.request(
- {
- url: srcRawUrl,
- responseType: 'text/plain',
- success: function (xml)
- {
-
- // LATER: Fix horizontal alignment ignored with 100% width of iframe
- // LATER: Fix page scrolling on touch device if trigger event on diagram
- // LATER: Hide toolbar after second container click for iOS
- // LATER: Disable responsive resize while lightbox shows
- var container = document.createElement('div');
- container.style.cssText = 'position:absolute;box-sizing:border-box;' +
- 'max-width:100%;margin-bottom:' + tbHeight +'px;border:1px solid transparent;';
- document.body.appendChild(container);
- var doc = mxUtils.parseXml(xml);
-
- var viewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', 'toolbar-position': 'top', nav: true,
- 'max-height': screen.height / 1.5,
- toolbar: 'zoom layers lightbox', title: name, border: border});
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- function updateHeight()
- {
- AP.resize('100%', container.offsetHeight + tbHeight);
- }
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight();
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight();
- };
-
- updateHeight();
-
- viewer.showLightbox = function()
- {
- dialog.create(
- {
- header: name,
- key: 'lightbox',
- size: 'fullscreen',
- customData: {id: id, name: name},
- chrome: true
- });
- };
-
-
- },
- error: function(err)
- {
- document.body.innerHTML = 'Failed to load source file from Bitbucket. (' +
- JSON.stringify(err) + ')';
- }
- });
-
- };
- };
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
- // Prefetches asynchronous requests so that below code runs synchronous
- // Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
- // is compiled into JS in the build process and is only needed for local development.
- var bundleLoaded = false;
- var scriptLoaded = false;
- var validSize = document.documentElement.offsetWidth > 0;
-
- function mainBarrier()
- {
- if (validSize && bundleLoaded && scriptLoaded)
- {
- main();
- }
- };
-
- // Workaround for collapsed side panel is to delay main until size is not 0
- if (!validSize)
- {
- var listener = function()
- {
- if (document.documentElement.offsetWidth > 0)
- {
- window.removeEventListener('resize', listener);
- validSize = true;
- mainBarrier();
- }
- };
-
- window.addEventListener('resize', listener);
- }
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
- });
-
- script.onload = function()
- {
- scriptLoaded = true;
- mainBarrier();
- };
-
- script.src = baseUrl + '/atlassian-connect/all.js';
- script.setAttribute('data-options', 'sizeToParent:true;');
- document.getElementsByTagName('head')[0].appendChild(script);
-})();
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/common/images/reader/checkmark.gif b/src/main/webapp/connect/common/images/reader/checkmark.gif
deleted file mode 100644
index 3a40c089..00000000
--- a/src/main/webapp/connect/common/images/reader/checkmark.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/closeLargeView.gif b/src/main/webapp/connect/common/images/reader/closeLargeView.gif
deleted file mode 100644
index 877e1281..00000000
--- a/src/main/webapp/connect/common/images/reader/closeLargeView.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/edit.png b/src/main/webapp/connect/common/images/reader/edit.png
deleted file mode 100644
index 84adb14a..00000000
--- a/src/main/webapp/connect/common/images/reader/edit.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/grid.gif b/src/main/webapp/connect/common/images/reader/grid.gif
deleted file mode 100644
index f4e7063e..00000000
--- a/src/main/webapp/connect/common/images/reader/grid.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/largeView.png b/src/main/webapp/connect/common/images/reader/largeView.png
deleted file mode 100644
index 12ffe387..00000000
--- a/src/main/webapp/connect/common/images/reader/largeView.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/remove.png b/src/main/webapp/connect/common/images/reader/remove.png
deleted file mode 100644
index 0fda0040..00000000
--- a/src/main/webapp/connect/common/images/reader/remove.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/zoomActual.png b/src/main/webapp/connect/common/images/reader/zoomActual.png
deleted file mode 100644
index 7ef23dcc..00000000
--- a/src/main/webapp/connect/common/images/reader/zoomActual.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/zoomFit.gif b/src/main/webapp/connect/common/images/reader/zoomFit.gif
deleted file mode 100644
index fbf42f77..00000000
--- a/src/main/webapp/connect/common/images/reader/zoomFit.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/zoomIn.gif b/src/main/webapp/connect/common/images/reader/zoomIn.gif
deleted file mode 100644
index 56ccdc1e..00000000
--- a/src/main/webapp/connect/common/images/reader/zoomIn.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/images/reader/zoomOut.gif b/src/main/webapp/connect/common/images/reader/zoomOut.gif
deleted file mode 100644
index 7ece5baa..00000000
--- a/src/main/webapp/connect/common/images/reader/zoomOut.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/common/js/mxProperties.js b/src/main/webapp/connect/common/js/mxProperties.js
deleted file mode 100644
index 54d53765..00000000
--- a/src/main/webapp/connect/common/js/mxProperties.js
+++ /dev/null
@@ -1,115 +0,0 @@
-var ATLAS_RESOURCE_BASE = '../..';
-var RESOURCES_PATH = ATLAS_RESOURCE_BASE + '/resources';
-var RESOURCE_BASE = RESOURCES_PATH + '/dia';
-var STENCIL_PATH = ATLAS_RESOURCE_BASE + '/stencils';
-var SHAPES_PATH = ATLAS_RESOURCE_BASE + '/shapes';
-var IMAGE_PATH = '../../images';
-var GRAPH_IMAGE_PATH = ATLAS_RESOURCE_BASE + '/img';
-var STYLE_PATH = '../../styles';
-var CSS_PATH = STYLE_PATH;
-var OPEN_FORM = ATLAS_RESOURCE_BASE + '/html/open.html';
-var TEMPLATE_PATH = ATLAS_RESOURCE_BASE + '/templates';
-
-var mxBasePath = ATLAS_RESOURCE_BASE + '/mxgraph';
-var mxLoadResources = false;
-
-var umlDomain = false;
-var collab = null;
-
-// Specifies connection mode for touch devices (at least one should be true)
-var isLocalStorage = typeof(Storage) != 'undefined';
-var uiTheme = 'atlas';
-
-var urlParams = (function(url) {
- var result = new Object();
- var idx = url.lastIndexOf('?');
-
- if (idx > 0) {
- var params = url.substring(idx + 1).split('&');
-
- for ( var i = 0; i < params.length; i++) {
- idx = params[i].indexOf('=');
-
- if (idx > 0) {
- result[params[i].substring(0, idx)] = params[i].substring(idx + 1);
- }
- }
- }
-
- return result;
-})(window.location.href);
-
-function getLanguage()
-{
- var lang = urlParams['lang'];
-
- if (lang == null)
- {
- // Cannot use mxSettings here
- if (isLocalStorage)
- {
- try
- {
- var value = localStorage.getItem('.drawio-config');
-
- if (value != null)
- {
- lang = JSON.parse(value).language || null;
- }
- }
- catch (e)
- {
- // cookies are disabled, attempts to use local storage will cause
- // a DOM error at a minimum on Chrome
- isLocalStorage = false;
- }
- }
- }
-
- return lang;
-};
-
-var mxLanguage = getLanguage();
-
-// Add new languages here. First entry is translated to [Automatic]
-// in the menu defintion in Diagramly.js.
-var mxLanguageMap = {'i18n': '', 'id' : 'Bahasa Indonesia', 'ms' : 'Bahasa Melayu', 'bs' : 'Bosanski', 'ca' : 'Català', 'cs' : 'Čeština', 'da' : 'Dansk', 'de' : 'Deutsch', 'et' : 'Eesti', 'en' : 'English', 'es' : 'Español',
- 'fil' : 'Filipino', 'fr' : 'Français', 'gl' : 'Galego', 'it' : 'Italiano', 'hu' : 'Magyar', 'nl' : 'Nederlands', 'no' : 'Norsk',
- 'pl' : 'Polski', 'pt-br' : 'Português (Brasil)', 'pt' : 'Português (Portugal)', 'ro' : 'Română', 'fi' : 'Suomi', 'sv' : 'Svenska', 'vi' : 'Tiếng Việt', 'tr' : 'Türkçe',
- 'el' : 'Ελληνικά', 'ru' : 'РуÑÑкий', 'sr' : 'СрпÑки', 'uk' : 'УкраїнÑька', 'he' : 'עברית',
- 'ar' : 'العربية', 'th' : 'ไทย', 'ko' : '한국어', 'ja' : '日本語', 'zh' : '简体中文', 'zh-tw' : 'ç¹é«”中文'};
-
-var mxLanguages = [];
-
-// Populates the list of supported special language bundles
-for (var lang in mxLanguageMap)
-{
- // Empty means default (ie. browser language), "en" means English (default for unsupported languages)
- // Since "en" uses no extension this must not be added to the array of supported language bundles.
- if (lang != 'en')
- {
- mxLanguages.push(lang);
- }
-}
-
-function mxscript(src)
-{
- document.write('<script src="'+src+'"></scri' + 'pt>');
-};
-
-/* for debugging */
-if (urlParams['dev'] == '1')
-{
- var mxDevUrl = document.location.protocol + '//devhost.jgraph.com/mxgraph2';
- var drawDevUrl = document.location.protocol + '//test.draw.io/';
- geBasePath = mxDevUrl + '/javascript/examples/grapheditor/www/js';
- mxBasePath = mxDevUrl + '/javascript/src';
-
- mxscript(mxBasePath + '/js/mxClient.js');
- mxscript(drawDevUrl + 'js/diagramly/Devel.js');
- mxscript(drawDevUrl + 'connect/common/js/mxReader.js');
-}
-else
-{
- mxscript('../../js/atlas.min.js');
-}
diff --git a/src/main/webapp/connect/common/js/mxReader.js b/src/main/webapp/connect/common/js/mxReader.js
deleted file mode 100644
index 9a4f08bc..00000000
--- a/src/main/webapp/connect/common/js/mxReader.js
+++ /dev/null
@@ -1,827 +0,0 @@
-/**
- * A Draw.io diagram viewer component with configurable toolbar buttons for editing, deleting and zooming buttons.
- * Parameters :
- * diagramName - name of the diagram
- * attachmentId - ID of the diagram attachment
- * ceoId - page ID or issue key
- * readerOpts - JSON object with options :
- * loadUrl - url from which to load the diagram
- * editUrl - url of the editor
- * stylePath - url from which to load the css
- * stencilPath - url from which to load the stencils
- * imagePath - url from which to load the graph mages
- * resourcePath - path to the translations
- * viewerToolbar - show toolbar or not
- * autoSize - resizes the graph container to match the graph bounds
- * width - width of the container
- * height - height of the container
- * disableButtons - disables all buttons
- * center - should the diagram be horizontally centered or not
- * evaluation - evaluation mode
- * lightbox - boolean indicating if this viewer is a lightbox
- * graphDocument - optional document containing the XML data
- */
-function DrawioViewer(diagramName, attachmentId, ceoId, readerOpts, lightbox, graphDocument, connect)
-{
- this.id = attachmentId;
- this.diagramName = diagramName;
- this.ceoId = ceoId;
- this.options = readerOpts;
- this.lightbox = lightbox;
- this.graphDocument = graphDocument;
- this.connect = connect;
- this.paddingBottom = (connect) ? 0 : 30;
-
- // Overrides browser language with Confluence user language
- var lang = null;
-
- // Language is in the readOpts in Server and in the URL in Connect
- if (!connect && readerOpts.language != null)
- {
- lang = readerOpts.language
- }
- else if (connect != null && urlParams['loc'] != null)
- {
- lang = urlParams['loc'];
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- lang = lang.substring(0, dash);
- }
- }
-
- // Only german and english supported currently. English is default.
- if (lang == 'de')
- {
- mxClient.language = 'de';
- }
-
- // Special extension used for the message bundle. For this bundle there is only a German
- // translation and the default English bundle so we temporarily override isLanguageSupported
- // to return true only if German is used and fallback to English for all other languages.
- var prevExtension = mxResources.extension;
- var prevIsLangSupported = mxResources.isLanguageSupported;
- mxResources.extension = '.txt';
-
- mxResources.isLanguageSupported = function(lan)
- {
- return lan == 'de';
- };
-
- mxResources.add(this.options.resourcePath);
-
- // Restores previous settings
- mxResources.extension = prevExtension;
- mxResources.isLanguageSupported = prevIsLangSupported;
-
- this.buttons = this.createButtons();
-
- this.transparentImage = Editor.prototype.transparentImage;
- this.extractGraphModel = Editor.prototype.extractGraphModel;
- this.setGraphXml = Editor.prototype.setGraphXml;
- this.readGraphState = Editor.prototype.readGraphState;
- this.resetGraph = Editor.prototype.resetGraph;
- this.decompress = Editor.prototype.decompress;
- this.updateGraphComponents = Editor.prototype.updateGraphComponents;
- this.fireEvent = Editor.prototype.fireEvent;
- this.addListener = Editor.prototype.addListener;
- this.originalNoForeignObject = Editor.prototype.originalNoForeignObject;
- this.gridImage = '';
-
- this.addListener('resetGraphView', this.resetGraphView);
-}
-
-DrawioViewer.prototype = new mxEventSource();
-
-DrawioViewer.prototype.graph = null;
-DrawioViewer.prototype.id = null;
-DrawioViewer.prototype.toolbar = null;
-DrawioViewer.prototype.options = null;
-DrawioViewer.prototype.originX = 0;
-DrawioViewer.prototype.originY = 0;
-DrawioViewer.prototype.popupWindow = null;
-DrawioViewer.prototype.buttons = {};
-
-DrawioViewer.prototype.graphXmlString = null;
-
-DrawioViewer.prototype.installToolbar = function()
-{
- this.toolbar = document.createElement('div');
- var toolbar = this.toolbar;
- var container = this.graph.container;
- toolbar.id = 'diagramly-reader-toolbar-' + this.id;
- toolbar.className = 'diagramly-reader-toolbar';
- toolbar.style.position = 'absolute';
-
- container.parentNode.appendChild(toolbar);
-
- toolbar.style.height = '30px';
- toolbar.style.width = this.countVisibleButtons() * 29 + 'px';
-
- // Makes sure the toolbar is always visible and
- // disables toolbar for all overflow content
- container.parentNode.style.overflow = 'visible';
-
- if (this.lightbox)
- {
- toolbar.style.bottom = '4px';
- toolbar.style.left = '50%';
- toolbar.style.width = this.countVisibleButtons() * 29 + 'px';
- toolbar.style.marginLeft = -Math.round(this.countVisibleButtons() * 29 / 2) + 'px'
- }
- else
- {
- container.parentNode.style.paddingBottom = this.paddingBottom + 'px';
-
- var bs = this.graph.getBorderSizes();
- toolbar.style.bottom = (container.offsetTop + bs.y + 4) + 'px';
- toolbar.style.left = (container.offsetLeft + bs.x) + 'px';
-
- if (!mxClient.IS_TOUCH)
- {
- toolbar.style.display = 'none';
-
- $(container.parentNode).hover(function()
- {
- toolbar.style.bottom = (container.offsetTop + bs.y + 4) + 'px';
- toolbar.style.left = (container.offsetLeft + bs.x) + 'px';
-
- $(toolbar).fadeIn(100);
- },
- function()
- {
- $(toolbar).fadeOut(100);
- });
- }
- }
-}
-
-DrawioViewer.prototype.countVisibleButtons = function()
-{
- var counter = 0;
-
- for(var key in this.buttons)
- {
- var button = this.buttons[key];
-
- if (button.visible)
- {
- counter++;
- }
- }
-
- return counter;
-}
-
-DrawioViewer.prototype.init = function()
-{
- this.loadStylesheet();
-
- // Makes the shadow brighter
- mxConstants.SHADOWCOLOR = '#000000';
- mxConstants.SHADOW_OPACITY = 0.25;
- this.graph.setEnabled(false);
- this.graph.autoScroll = false;
- this.graph.container.style.overflow = 'hidden';
- this.graph.container.style.cursor = 'move';
-
- // Panning only enabled in lightbox to allow text selection in viewer
- this.graph.setPanning(true);
-
- // Workaround for context trigger starting panning if ignoreCell is true
- this.graph.panningHandler.useLeftButtonForPanning = true;
- this.graph.panningHandler.usePopupTrigger = false;
- this.graph.panningHandler.ignoreCell = true;
-
- this.graph.panningHandler.isForcePanningEvent = function(me)
- {
- return mxEvent.isLeftMouseButton(me.getEvent());
- };
-
- // Folding only enabled in lightbox
- this.graph.foldingEnabled = this.lightbox;
-
- // Overrides click handler to ignore graph enabled state
- if (this.graph.foldingEnabled)
- {
- this.graph.cellRenderer.createControlClickHandler = function(state)
- {
- var graph = state.view.graph;
-
- return function (evt)
- {
- var collapse = !graph.isCellCollapsed(state.cell);
- graph.foldCells(collapse, false, [state.cell], null, evt);
- mxEvent.consume(evt);
- };
- };
- }
- else
- {
- // Hides collapse/expand icon if folding is disabled
- this.graph.getFoldingImage = function()
- {
- return null;
- };
- };
-
- // HTML entities are displayed as plain text in wrapped plain text labels
- this.graph.cellRenderer.getLabelValue = function(state)
- {
- var result = mxCellRenderer.prototype.getLabelValue.apply(this, arguments);
-
- if (state.view.graph.isHtmlLabel(state.cell))
- {
- if (state.style['html'] != 1)
- {
- result = mxUtils.htmlEntities(result, false);
- }
- else
- {
- result = state.view.graph.sanitizeHtml(result);
- }
- }
-
- return result;
- };
-
- // Enables links if graph is "disabled" (ie. read-only)
- this.graph.click = function(me)
- {
- var cell = me.getCell();
-
- if (cell != null && !me.isConsumed() && (mxEvent.isTouchEvent(me.getEvent()) ||
- mxEvent.isLeftMouseButton(me.getEvent())))
- {
- var href = this.getLinkForCell(cell);
-
- // Test cases:
- // 1) the relative link without the Conf base path, with a leading slash, e.g. /download/attachment/....
- // 2) the relative link with the Conf base path, with a leading slash, e.g. /confluence/download/attachmentss/...
- // 3) the relative link without the conf base path, without a leading slash, e.g. download/attachments/...
- // 4) the full absolute path, e.g. https://localhost:1990/confluence/download/attachments/...
- // 5) full path without protocol, e.g. //confluence/download/attachments/...
-
- if (href != null)
- {
- var r = new RegExp('^(?:[a-z]+:)?//', 'i'); // https://stackoverflow.com/questions/10687099/how-to-test-if-a-url-string-is-absolute-or-relative
-
- if (!r.test(href))
- {
- // relative link
-
- if (href.lastIndexOf('/', 0) !== 0) // http://stackoverflow.com/a/4579228/226469 seems to be the fastest check
- {
- // Need a leading slash in case we need to prepend the base path
- href = '/' + href;
- }
-
- // var cp = AJS.Confluence.getContextPath(); // TODO confluence call in a common module
-
- // Originally, links included the base path (but not the host), so there might be cases of the base path
- // already being prepended. If the base path has changed, we can't recover those cases
- // window.location.href = href.substring(0, cp.length) === cp ? href : cp + href; // prepends the context path if it's not already there
- window.location.href = href;
- }
- else
- {
- // Test if it's an absolute URL, but on the same domain (i.e. open in same window)
- // There's a security setting (unknown which) that seems to stop the IE hack below working in
- // IE 11, https://desk.draw.io/browse/DS-175, https://desk.draw.io/browse/DFCS-52
- // Worst case is these users will open an absolute same domain link in a window
-
- var link = document.createElement('a');
- link.href = href;
- link.href = link.href; // hack to populate 'host' under IE
-
- if (link.host === location.host)
- {
- window.location.href = href;
- }
- else
- {
- window.open(href);
- }
- }
- }
-
- me.consume();
- }
- };
-
- this.graph.setTooltips(!mxClient.IS_TOUCH);
-
- if (this.options.width != null)
- {
- this.graph.container.style.width = this.options.width + 'px';
- }
-
- if (this.options.height != null)
- {
- this.graph.container.style.height = this.options.height + 'px';
- }
-
- // Accumulates the zoom factor while the rendering is taking place
- // so that not the complete sequence of zoom steps must be painted
- var graph = this.graph;
- graph.updateZoomTimeout = null;
- graph.cumulativeZoomFactor = 1;
-
- graph.lazyZoom = function(zoomIn)
- {
- if (this.updateZoomTimeout != null)
- {
- window.clearTimeout(this.updateZoomTimeout);
- }
-
- if (zoomIn)
- {
- this.cumulativeZoomFactor *= this.zoomFactor;
- }
- else
- {
- this.cumulativeZoomFactor /= this.zoomFactor;
- }
-
- this.cumulativeZoomFactor = Math.round(this.view.scale * this.cumulativeZoomFactor * 100) / 100 / this.view.scale;
-
- this.updateZoomTimeout = window.setTimeout(mxUtils.bind(this, function()
- {
- this.zoom(this.cumulativeZoomFactor);
- this.cumulativeZoomFactor = 1;
- this.updateZoomTimeout = null;
- }), 20);
- };
-
- if (this.lightbox)
- {
- mxEvent.addMouseWheelListener(mxUtils.bind(this, function(evt, up)
- {
- if (!mxClient.IS_MAC || !mxEvent.isControlDown(evt))
- {
- var source = mxEvent.getSource(evt);
-
- while (source != null)
- {
- if (source == graph.container)
- {
- graph.lazyZoom(up);
- mxEvent.consume(evt);
-
- return;
- }
-
- source = source.parentNode;
- }
- }
- }));
- }
-};
-
-DrawioViewer.prototype.resetGraphView = function()
-{
- this.graph.pageBreaksVisible = false;
- this.graph.preferPageSize = false;
- this.graph.pageVisible = false;
-
- if (!this.lightbox)
- {
- var update = mxUtils.bind(this, function()
- {
- this.graph.centerZoom = this.graph.panningHandler.panningEnabled;
-
- // If width and height are specified the height is overridden to match the diagram size
- var autoSizeWidth = this.options.width == null;
- var autoSizeHeight = this.options.height == null;
- var bounds = this.graph.getGraphBounds();
- var ratio = bounds.width / bounds.height;
-
- var width = autoSizeWidth ? bounds.width + 2 : this.options.width;
- var height = autoSizeHeight ? (width / ratio) + 1 : this.options.height;
-
- this.graph.container.style.width = Math.ceil(width) + 'px';
- this.graph.container.style.height = Math.ceil(height) + 'px';
- this.graph.container.style.maxWidth = '100%';
-
- if (autoSizeWidth && autoSizeHeight)
- {
- this.translateOrigin();
-
- // Used for fast restore of initial position in zoom to fit button
- this.initialX = this.graph.view.translate.x;
- this.initialY = this.graph.view.translate.y;
- }
- else if (this.options.zoomToFit)
- {
- this.graph.fit();
- }
-
- //set the border after calling updateGraphComponnets() because the call sets it to ''
- this.graph.container.style.border = this.options.border ? '1px solid #DDDDDD' : 'none';
- this.graph.container.style.backgroundColor = (this.graph.background == null ||
- this.graph.background == 'none') ? '#ffffff' : this.graph.background;
- });
-
- // Workaround for invisible container is to move the container to the document body for rendering
- if (!this.connect && (this.graph.container.clientWidth == 0 || this.graph.container.clientHeight == 0))
- {
- var previousParent = this.graph.container.parentNode;
- var nextSibling = this.graph.container.nextSibling;
- var prevPosition = this.graph.container.style.position;
- var prevVisible = this.graph.container.style.visible;
-
- // Moves to document body for rendering (needed for text measuring)
- this.graph.container.style.position = 'absolute';
- this.graph.container.style.visible = 'hidden';
-
- document.body.appendChild(this.graph.container);
-
- // Refresh required in visible DOM to update text bounding boxes
- this.graph.refresh();
- update();
-
- // Move it back into DOM tree position
- if (nextSibling != null)
- {
- nextSibling.parentNode.insertBefore(this.graph.container, nextSibling);
- }
- else
- {
- previousParent.appendChild(this.graph.container);
- }
-
- // Restore position CSS
- this.graph.container.style.visible = prevVisible;
- this.graph.container.style.position = prevPosition;
- }
- else
- {
- update();
- }
- }
- else
- {
- this.graph.container.style.backgroundColor = (this.graph.background == null ||
- this.graph.background == 'none') ? '#ffffff' : this.graph.background;
- }
-};
-
-DrawioViewer.prototype.translateOrigin = function()
-{
- var bounds = this.graph.getGraphBounds();
- this.graph.view.setTranslate(this.originX - Math.floor(bounds.x), this.originY - Math.floor(bounds.y));
-};
-
-DrawioViewer.prototype.loadGraph = function(diagramName, ceoId)
-{
- var spinner = this.createSpinner(this.graph.container);
-
- try
- {
- mxUtils.get(this.options.loadUrl, mxUtils.bind(this, function(req)
- {
- spinner.stop();
-
- if (req.getStatus() < 200 || req.getStatus() > 299)
- {
- this.showWarning(mxResources.get('error') + ' ' + req.getStatus());
- this.graph.container.style.border = this.options.border ? '1px solid #DDDDDD' : 'none';
- this.graph.container.style.backgroundColor = '#ffffff';
- this.graph.container.style.height = '20px';
- }
- else
- {
- var json = JSON.parse(req.getText());
- this.graphXmlString = json.xml;
- var doc = mxUtils.parseXml(json.xml);
- this.xmlDoc = doc;
- this.filename = json.filename;
- this.setGraphXml(doc.documentElement);
- this.graphDocument = doc;
- }
- }),
- function()
- {
- spinner.stop();
- });
- }
- catch (e)
- {
- spinner.stop();
- }
-};
-
-DrawioViewer.prototype.loadStylesheet = function()
-{
- var node = mxUtils.load(this.options.stylePath + '/default.xml').getDocumentElement();
- var dec = new mxCodec(node.ownerDocument);
- dec.decode(node, this.graph.getStylesheet());
-};
-
-DrawioViewer.prototype.renderButtons = function()
-{
- for (var key in this.buttons)
- {
- var button = this.buttons[key];
-
- if (button.visible)
- {
- this.addToolbarButton(this.toolbar, button);
- }
- }
-};
-
-DrawioViewer.prototype.addToolbarButton = function(toolbar, drawioButton)
-{
- var enabled = typeof drawioButton.enabled === 'undefined' ? true : enabled;
- var button = drawioButton.linkButton ? document.createElement('a') : document.createElement('div');
- button.className = 'diagramly-reader-toolbar-button';
-
- if (drawioButton.icon != null)
- {
- var img = document.createElement('img');
- img.setAttribute('src', drawioButton.icon);
- img.style.verticalAlign = 'middle';
- img.style.marginRight = '2px';
- button.appendChild(img);
- button.title = drawioButton.label;
- }
-
- if (!drawioButton.enabled)
- {
- button.style.opacity = 0.2;
-
- } else
- {
- if(drawioButton.linkButton)
- {
- button.href = drawioButton.url;
- }
- else
- {
- mxEvent.addListener(button, 'click', function(evt)
- {
- drawioButton.clickHandler.apply(this, arguments);
- });
- }
- mxEvent.addListener(button, 'mouseover', function(evt)
- {
- button.className += ' diagramly-reader-toolbar-button-hover';
- });
- mxEvent.addListener(button, 'mouseout', function(evt)
- {
- button.className = 'diagramly-reader-toolbar-button';
- });
- }
-
- toolbar.appendChild(button);
- return button;
-};
-
-DrawioViewer.prototype.createSpinner = function(container)
-{
- var opts =
- {
- lines : 12, // The number of lines to draw
- length : 12, // The length of each line
- width : 5, // The line thickness
- radius : 10, // The radius of the inner circle
- rotate : 0, // The rotation offset
- color : '#000', // #rgb or #rrggbb
- speed : 1, // Rounds per second
- trail : 60, // Afterglow percentage
- shadow : false, // Whether to render a shadow
- hwaccel : false, // Whether to use hardware acceleration
- className : 'spinner', // The CSS class to assign to the spinner
- zIndex : 2e9 // The z-index (defaults to 2000000000)
- };
-
- return new Spinner(opts).spin(container);
-};
-
-DrawioViewer.prototype.show = function(container)
-{
- this.graph = new Graph(container);
- this.graph.id = this.id;
- this.init();
-
- // Uses the XML document that was loaded for the viewer in the lightbox
- if (this.graphDocument != null)
- {
- this.setGraphXml(this.graphDocument.documentElement);
- }
- else
- {
- this.loadGraph(this.diagramName, this.ceoId);
- }
-
- if (this.options.viewerToolbar)
- {
- this.installToolbar();
- this.renderButtons();
- }
-
- if (this.options.licenseStatus == 'NO_LICENSE')
- {
- this.showWarning(mxResources.get('drawio.reader.noLicense'));
- }
- else if (this.options.licenseStatus == 'EVAL_LICENSE')
- {
- this.showWarning(mxResources.get('drawio.reader.evaluation'));
- }
- else if (this.options.licenseStatus == 'EVAL_EXPIRED')
- {
- this.showWarning(mxResources.get('drawio.reader.evaluationExpired'));
- }
- else if (this.options.licenseStatus == 'VERSION_MISMATCH')
- {
- this.showWarning(mxResources.get('drawio.reader.versionMismatch', ['https://support.draw.io/pages/viewpage.action?pageId=11829320']));
- }
- else if (this.options.licenseStatus == 'USER_MISMATCH')
- {
- this.showWarning(mxResources.get('drawio.reader.userMismatch', ['https://support.draw.io/pages/viewpage.action?pageId=11829323']));
- }
-
-
-};
-
-DrawioViewer.prototype.showWarning = function(msg)
-{
- var div = document.createElement('div');
- div.style.position = 'absolute';
- div.style.overflow = 'hidden';
- div.style.left = '0px';
- div.style.top = '0px';
- div.style.right = '0px';
- div.style.fontSize = '12px';
- div.style.margin = '2px';
- mxUtils.setOpacity(div, 50);
- div.style.color = 'gray';
- div.style.textAlign = 'center';
- div.style.whiteSpace = 'nowrap';
- span = document.createElement('span');
- span.innerHTML = msg;
-
- div.appendChild(span);
-
- this.graph.container.parentNode.appendChild(div);
-};
-
-DrawioViewer.prototype.showLightbox = function()
-{
- console.log('Lightbox feature not implemented.');
-};
-
-DrawioViewer.prototype.createButtons = function()
-{
- var viewer = this;
- var buttons = {};
-
- var enableButton = typeof this.options.disableButtons === 'undefined' ? true : !this.options.disableButtons;
- var canEdit = this.options.userCanEdit && enableButton;
- var canRemove = this.options.userCanRemove && enableButton;
-
- var autoSizeWidth = this.options.width == null;
- var autoSizeHeight = this.options.height == null;
-
- buttons[DrawioViewerActions.EDIT] = new DrawioViewerButton(
- {
- label : mxResources.get('diagramly.reader.edit'),
- icon : viewer.options.imagePath + '/edit.png',
- url : viewer.options.editUrl,
- enabled : canEdit,
- linkButton : true
- });
-
- buttons[DrawioViewerActions.REMOVE] = new DrawioViewerButton(
- {
- label : mxResources.get('diagramly.reader.remove'),
- icon : viewer.options.imagePath + '/remove.png',
- clickHandler : function()
- {
- if (confirm(mxResources.get('diagramly.reader.confirmDelete')))
- {
- window.location.href = viewer.options.removeUrl;
- }
- },
- enabled : canRemove
- });
-
- buttons[DrawioViewerActions.ACTUAL_SIZE] = new DrawioViewerButton(
- {
- label : mxResources.get('diagramly.reader.zoomActual'),
- icon : viewer.options.imagePath + '/zoomActual.png',
- clickHandler : function()
- {
- viewer.graph.zoomActual();
- viewer.translateOrigin();
- },
- enabled : enableButton
- });
-
- buttons[DrawioViewerActions.ZOOM_TO_FIT] = new DrawioViewerButton(
- {
- label : (this.lightbox) ? mxResources.get('diagramly.reader.zoomActual') : mxResources.get('diagramly.reader.fit'),
- icon : (this.lightbox) ? viewer.options.imagePath + '/zoomActual.png' : viewer.options.imagePath + '/zoomFit.gif',
- clickHandler : mxUtils.bind(this, function()
- {
- if (this.lightbox)
- {
- // NOTE: Maxscale is 1 here so only make smaller but not larger
- viewer.graph.fit(8);
- viewer.graph.center(true, true, null, 0.42);
- }
- else
- {
- if (autoSizeWidth && autoSizeHeight)
- {
- this.graph.view.scaleAndTranslate(1, this.initialX, this.initialY);
- }
- else
- {
- this.graph.fit();
- }
- }
- }),
- enabled : enableButton
- });
-
- buttons[DrawioViewerActions.ZOOM_OUT] = new DrawioViewerButton(
- {
- label : mxResources.get('diagramly.reader.zoomOut'),
- icon : viewer.options.imagePath + '/zoomOut.gif',
- clickHandler : function()
- {
- viewer.graph.zoomOut();
- },
- enabled : enableButton
- });
-
- buttons[DrawioViewerActions.ZOOM_IN] = new DrawioViewerButton(
- {
- label : mxResources.get('diagramly.reader.zoomIn'),
- icon : viewer.options.imagePath + '/zoomIn.gif',
- clickHandler : function()
- {
- viewer.graph.zoomIn();
- },
- enabled : enableButton
- });
-
- buttons[DrawioViewerActions.EXPAND] = new DrawioViewerButton(
- {
- label : mxResources.get('diagramly.reader.fullScreen'),
- icon : viewer.options.imagePath + '/largeView.png',
- clickHandler : mxUtils.bind(this, function()
- {
- this.showLightbox();
- }),
- enabled : enableButton
- });
-
- buttons[DrawioViewerActions.CLOSE] = new DrawioViewerButton(
- {
- label : mxResources.get('diagramly.reader.closeFullScreen'),
- icon : viewer.options.imagePath + '/closeLargeView.gif',
- clickHandler : function()
- {
- viewer.popupWindow.remove();
- },
- enabled : enableButton,
- visible : false
- });
-
- return buttons;
-};
-
-DrawioViewerActions =
-{
- EDIT : 'edit',
- REMOVE : 'remove',
- ACTUAL_SIZE : 'actualSize',
- ZOOM_TO_FIT : 'zoomToFit',
- ZOOM_OUT : 'zoomOut',
- ZOOM_IN : 'zoomIn',
- EXPAND : 'expand',
- CLOSE : 'close'
-};
-
-function DrawioViewerButton(options)
-{
- this.label = options.label;
- this.clickHandler = options.clickHandler;
- this.enabled = typeof options.enabled != 'undefined' ? options.enabled : true;
- this.icon = options.icon;
- this.visible = typeof options.visible != 'undefined' ? options.visible : true;
- this.linkButton = typeof options.linkButton != 'undefined' ? options.linkButton : false;
- this.url = options.url;
-};
-
-DrawioViewerButton.prototype.label = null;
-DrawioViewerButton.prototype.clickHandler = null;
-DrawioViewerButton.prototype.enabled = true;
-DrawioViewerButton.prototype.icon = null;
-DrawioViewerButton.prototype.visible = true;
-DrawioViewerButton.prototype.linkButton = false;
-DrawioViewerButton.prototype.url = null; \ No newline at end of file
diff --git a/src/main/webapp/connect/common/message.txt b/src/main/webapp/connect/common/message.txt
deleted file mode 100644
index ca37ebe4..00000000
--- a/src/main/webapp/connect/common/message.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-diagramly.new.diagram=Draw.io diagram
-diagramly.edit.diagram=Edit
-diagramly.reader.edit=Edit
-diagramly.reader.remove=Remove
-diagramly.reader.fit=Zoom to fit
-diagramly.reader.zoomActual=Actual size
-diagramly.reader.zoomOut=Zoom out
-diagramly.reader.zoomIn=Zoom in
-diagramly.reader.confirmDelete=Are you sure you want to delete this diagram?
-diagramly.reader.fullScreen=Full screen
-diagramly.reader.closeFullScreen=Close
-drawio.reader.evaluation=draw.io evaluation copy
-
-#macro properties editor
-drawio.macrooptions.size.label=Size
-drawio.macrooptions.options.label=Options
-drawio.macrooptions.width.label=Width
-drawio.macrooptions.height.label=Height
-drawio.macrooptions.border.label=Border
-drawio.macrooptions.border.desc=Display a border around the graph
-drawio.macrooptions.grid.label=Grid
-drawio.macrooptions.grid.desc=Display grid on the graph reader
-drawio.macrooptions.fitWindow.label=Fit to Window
-drawio.macrooptions.fitWindow.desc=Zoom the diagram to fit the reader
-drawio.macrooptions.autoSize.label=Auto Size
-drawio.macrooptions.viewerToolbar.label=Toolbar
-drawio.macrooptions.autoSize.desc=Update width and height of the reader to fit the diagram
-drawio.macrooptions.save.button=Save
-com.mxgraph.confluence.plugins.diagramly.diagramly.desc=Draw.io is a free online diagram drawing application for workflow, BPM, org charts, UML, ER, network diagrams.
-
-diagramly.propertypanel.macrooptions=Draw.io Macro Settings
-diagramly.propertypanel.editMacro=Edit Macro
-diagramly.propertypanel.dupediagram=Duplicate
-drawio.propertypanel.size.original=Original
-
-#search labels
-diagramly.search.header=Search for diagrams
-diagramly.search.button=Search
-diagramly.search.allspaces=All spaces
-diagramly.search.description=Enter the name of a diagram
-diagramly.search.diagramName=Diagram
-diagramly.search.spaceName=Space name
-diagramly.search.lastModified=Last modified
-diagramly.search.noResults=No diagrams have been found
-diagramly.search.error=Error during search. Specified reason
-diagramly.search.select.button=Select
-diagramly.search.copy.button=Copy
-diagramly.search.import.button=Import
-diagramly.search.cancel.button=Cancel
-
-#blueprint popup create dialog
-diagramly.create.header=How do you want to create the diagram?
-diagramly.create.blank=Blank
-diagramly.create.search=Search
-diagramly.create.select.button=Select
-diagramly.create.search.button=Search
-diagramly.create.back.button=Back
-diagramly.create.cancel.button=Cancel
-
-diagramly.import.description=Select a Visio file (.vdx)
-diagramly.import.error=There was an error during import
-diagramly.duplicate.newName=Please enter the name
-diagramly.duplicate.nameConflict=Could not duplicate diagram. Please choose a different name.
-diagramly.duplicate.error=Could not duplicate diagram. Please try again later.
-diagramly.import.uploading=Uploading file...
-drawio-rest.name=Drawio Rest
-drawio-rest.description=The Drawio Rest Plugin
-drawio.pagetemplate.cantadddiagram=Diagrams cannot be added to page templates. You can only add them to pages.
-drawio.linktodiagram.button=Link to Diagram
-
-#new diagram dialog
-drawio.templates.label=Draw.io Templates
-drawio.search.recent=Recent diagrams
-drawio.template.businessprocess=Business Process
-drawio.template.charts=Charts
-drawio.template.engineering=Engineering
-drawio.template.flowcharts=Flowcharts
-drawio.template.mindmaps=Mindmaps
-drawio.template.mockups=Mockups
-drawio.template.networkdiagrams=Network Diagrams
-drawio.template.other=Other
-drawio.template.softwaredesign=Software Design
-drawio.template.venndiagrams=Venn diagrams
-drawio.template.wireframes=Wireframes
-
-drawio.admin.info=Plugin Information
-drawio.admin.config=Plugin Configuration
-drawio.admin.config.externalImageService=Use external image service
-drawio.admin.config.saveChanges=Save changes
-
diff --git a/src/main/webapp/connect/common/message_de.txt b/src/main/webapp/connect/common/message_de.txt
deleted file mode 100644
index 34bc1543..00000000
--- a/src/main/webapp/connect/common/message_de.txt
+++ /dev/null
@@ -1,89 +0,0 @@
-diagramly.new.diagram=Draw.io Diagramm
-diagramly.edit.diagram=Bearbeiten
-diagramly.reader.edit=Bearbeiten
-diagramly.reader.remove=Entfernen
-diagramly.reader.fit=Zoom anpassen
-diagramly.reader.zoomActual=Tatsächliche Grösse
-diagramly.reader.zoomOut=Herauszoomen
-diagramly.reader.zoomIn=Hineinzoomen
-diagramly.reader.confirmDelete=Möchten Sie das Diagramm wirklich löschen?
-diagramly.reader.fullScreen=Vollbild
-diagramly.reader.closeFullScreen=Schließen
-drawio.reader.evaluation=draw.io Testlizenz
-
-#macro properties editor
-drawio.macrooptions.size.label=Grösse
-drawio.macrooptions.options.label=Optionen
-drawio.macrooptions.width.label=Breite
-drawio.macrooptions.height.label=Höhe
-drawio.macrooptions.border.label=Rahmen
-drawio.macrooptions.border.desc=Rahmen um das Diagramm anzeigen
-drawio.macrooptions.grid.label=Gitternetz
-drawio.macrooptions.grid.desc=Gitternetz anzeigen
-drawio.macrooptions.fitWindow.label=An Fenstergrösse anpassen
-drawio.macrooptions.fitWindow.desc=Diagramm auf Fenstergrösse zoomen
-drawio.macrooptions.autoSize.label=Automatische Grösse
-drawio.macrooptions.viewerToolbar.label=Toolbar
-drawio.macrooptions.autoSize.desc=Breite und Höhe an Diagramm anpassen
-drawio.macrooptions.save.button=Speichern
-com.mxgraph.confluence.plugins.diagramly.diagramly.desc=Draw.io is a free online diagram drawing application for workflow, BPM, org charts, UML, ER, network diagrams.
-
-diagramly.propertypanel.macrooptions=Draw.io Makro Einstellungen
-diagramly.propertypanel.editMacro=Makro bearbeiten
-diagramly.propertypanel.dupediagram=Duplizieren
-drawio.propertypanel.size.original=Original
-
-#search labels
-diagramly.search.header=Nach Diagrammen suchen
-diagramly.search.button=Suchen
-diagramly.search.allspaces=Alle Bereiche
-diagramly.search.description=Geben Sie den Namen eines Diagramms ein
-diagramly.search.diagramName=Diagramm
-diagramly.search.spaceName=Bereichsname
-diagramly.search.lastModified=Zuletzt geändert
-diagramly.search.noResults=Es wurden keine Diagramme gefunden
-diagramly.search.error=Fehler bei der Suche. Ursache
-diagramly.search.select.button=Erstellen
-diagramly.search.copy.button=Kopieren
-diagramly.search.import.button=Importieren
-diagramly.search.cancel.button=Abbrechen
-
-#blueprint popup create dialog
-diagramly.create.header=Wie möchten Sie das Diagramm erstellen?
-diagramly.create.blank=Leer
-diagramly.create.search=Suchen
-diagramly.create.select.button=Erstellen
-diagramly.create.search.button=Suchen
-diagramly.create.back.button=Zurück
-diagramly.create.cancel.button=Abbrechen
-
-diagramly.import.description=Wählen Sie eine Visio-Datei (.vdx)
-diagramly.import.error=Es gab einen Fehler beim Import
-diagramly.duplicate.newName=Bitte geben Sie den Namen ein
-diagramly.duplicate.nameConflict=Diagramm konnte nicht dupliziert werden. Bitte geben Sie einen anderen Namen ein.
-diagramly.duplicate.error=Diagramm konnte nicht dupliziert werden. Bitte versuchen Sie es später.
-diagramly.import.uploading=Datei wird geladen...
-drawio-rest.name=Drawio Rest
-drawio-rest.description=Drawio Rest Plugin
-drawio.pagetemplate.cantadddiagram=Diagramme können nicht in Vorlagen sondern nur in Seiten eingefügt werden.
-drawio.linktodiagram.button=Link zum Diagramm
-
-#new diagram dialog
-drawio.templates.label=Draw.io Vorlagen
-drawio.search.recent=Zuletzt geöffnet
-drawio.template.businessprocess=Geschäftsprozesse
-drawio.template.charts=Grafiken
-drawio.template.engineering=Technik
-drawio.template.flowcharts=Ablaufdiagramme
-drawio.template.mindmaps=Mindmaps
-drawio.template.mockups=Mockups
-drawio.template.networkdiagrams=Netzwerkdiagramme
-drawio.template.other=Andere
-drawio.template.softwaredesign=Software Design
-drawio.template.venndiagrams=Venn Diagramme
-drawio.template.wireframes=Drahtgittermodelle
-
-drawio.admin.info=Plugin Information
-drawio.admin.config=Plugin Konfiguration
-drawio.admin.config.externalImageService=Externen Bild-Service verwenden
-drawio.admin.config.saveChanges=Änderungen speichern
diff --git a/src/main/webapp/connect/common/styles/plugin/aui-buttons.css b/src/main/webapp/connect/common/styles/plugin/aui-buttons.css
deleted file mode 100644
index 532a182c..00000000
--- a/src/main/webapp/connect/common/styles/plugin/aui-buttons.css
+++ /dev/null
@@ -1,536 +0,0 @@
-/* AUI BUTTONS
- * Note hover/disabled styles set directly as they are not precisely the same as
- * if we used straight opacity.
- */
-
-/* Basic Button Style */
-.aui-button,
-a.aui-button,
-.aui-button:visited {
- background: #f2f2f2;
- background: -webkit-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -moz-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -ms-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -o-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: linear-gradient(to bottom, #fff 0%, #f2f2f2 100%);
- border: 1px solid #ccc;
- border-radius: 3.01px;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- color: #333;
- cursor: pointer;
- display: inline-block;
- font-family: inherit;
- font-size: 14px;
- font-variant: normal;
- font-weight: normal;
- height: 2.1428571428571em; /* 30px - using ems so the fields increase in line with user specified font-sizes */
- line-height: 1.4285714285714;
- margin: 0;
- padding: 4px 10px;
- text-decoration: none;
- text-shadow: 0 1px 0 white;
- vertical-align: baseline;
- white-space: nowrap;
-}
-.aui-button ~ .aui-button {
- margin-left: 10px;
-}
-/* Ensure underlines not added by link styles */
-a.aui-button:hover,
-a.aui-button:active,
-a.aui-button:focus {
- text-decoration: none;
-}
-
-/* Control button height in Firefox. See http://www.experimentgarden.com/2010/11/firefox-buttontext-height-and-padding.html */
-.aui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-
-.aui-button:focus,
-.aui-button:hover,
-.aui-button-subtle.aui-button:focus,
-.aui-button-subtle.aui-button:hover {
- background: #f7f7f7;
- background: -webkit-linear-gradient(top, #fff 0%, #f7f7f7 100%);
- background: -moz-linear-gradient(top, #fff 0%, #f7f7f7 100%);
- background: -ms-linear-gradient(top, #fff 0%, #f7f7f7 100%);
- background: -o-linear-gradient(top, #fff 0%, #f7f7f7 100%);
- background: linear-gradient(to bottom, #fff 0%, #f7f7f7 100%);
- border-color: #999;
- color: #000;
- text-decoration:none;
-}
-
-.aui-button:active,
-.aui-button.active,
-.aui-header .aui-button-split-more.active,
-.aui-button-subtle.aui-button:active,
-.aui-button-subtle.aui-button.active {
- background-image: none;
- background-color: #f2f2f2;
- box-shadow: inset 0 3px 6px rgba(0,0,0,.1);
- text-shadow: none;
- text-decoration:none;
-}
-
-/* Primary Buttons */
-.aui-button.aui-button-primary,
-.aui-button.aui-button-primary:visited {
- background: #3068a2;
- background: -webkit-linear-gradient(top, #4687ce 0%, #3068a2 100%);
- background: -moz-linear-gradient(top, #4687ce 0%, #3068a2 100%);
- background: -ms-linear-gradient(top, #4687ce 0%, #3068a2 100%);
- background: -o-linear-gradient(top, #4687ce 0%, #3068a2 100%);
- background: linear-gradient(to bottom, #4687ce 0%, #3068a2 100%);
- border-color: #486582;
- color: #fff;
- font-weight: bold;
- -webkit-font-smoothing: antialiased; /* for chrome on mac */
- text-shadow: 0 1px 0 #205081;
-}
-
-.aui-button.aui-button-primary:hover,
-.aui-button.aui-button-primary:focus {
- background: #3673B5;
- background: -webkit-linear-gradient(top, #5A94D3 0%, #3673B5 100%);
- background: -moz-linear-gradient(top, #5A94D3 0%, #3673B5 100%);
- background: -ms-linear-gradient(top, #5A94D3 0%, #3673B5 100%);
- background: -o-linear-gradient(top, #5A94D3 0%, #3673B5 100%);
- background: linear-gradient(to bottom, #5A94D3 0%,#3673B5 100%);
- border-color: #205081;
- color: #fff;
- text-shadow: 0 1px 0 #205081;
-}
-
-.aui-button.aui-button-primary:active {
- background: #3673B5;
- background-image: none;
- background-color: #3673B5;
- box-shadow: inset 0 3px 6px rgba(0,0,0,.1);
- text-shadow: none;
- text-decoration:none;
-}
-
-/* Link style buttons - used for destructive/cancel actions ONLY */
-.aui-button.aui-button-link,
-.aui-button.aui-button-link:visited {
- background: transparent;
- border-color: transparent;
- color: #3b73af;
- padding: 5px 0;
- text-decoration: none;
- text-shadow: none;
- box-shadow: none;
-}
-
-.aui-button.aui-button-link:focus,
-.aui-button.aui-button-link:hover,
-.aui-button.aui-button-link:active,
-.aui-buttons .aui-button.aui-button-link:focus,
-.aui-buttons .aui-button.aui-button-link:hover,
-.aui-buttons .aui-button.aui-button-link:active,
-.aui-buttons .aui-button.aui-button-link[aria-pressed="true"] {
- background: transparent;
- border-color: transparent;
- box-shadow: none;
- text-decoration: underline;
-}
-
-/* Subtle/hybrid/entity action/mugger buttons */
-.aui-button.aui-button-subtle {
- background: transparent;
- border-color: transparent;
- color: #707070;
-}
-.aui-buttons .aui-button.aui-button-subtle {
- border-radius: 3.01px;
-}
-.aui-button.aui-button-subtle .aui-icon {
- margin-right: 1px;
-}
-
-/* aui-buttons groups buttons together into one button lozenge. */
-.aui-buttons {
- display: inline-block;
- font-size: 0;
-}
-.aui-buttons:after {
- clear: both;
- content: "";
- display: table;
-}
-.aui-buttons .aui-button {
- border-radius: 0;
- margin: 0;
-}
-.aui-buttons .aui-button:first-child {
- border-top-left-radius: 3.01px;
- border-bottom-left-radius: 3.01px;
-}
-.aui-buttons .aui-button:last-child {
- border-top-right-radius: 3.01px;
- border-bottom-right-radius: 3.01px;
-}
-.aui-buttons + .aui-buttons {
- margin-left: 10px;
-}
-
-/* Grouped buttons go into toolbar style */
-.aui-buttons .aui-button:focus,
-.aui-buttons .aui-button:hover,
-.aui-buttons .aui-button:active {
- border-color: #999;
-}
-.aui-buttons .aui-button[disabled],
-.aui-buttons .aui-button[disabled]:hover,
-.aui-buttons .aui-button[disabled]:focus,
-.aui-buttons .aui-button[disabled]:active,
-.aui-buttons .aui-button[aria-disabled="true"],
-.aui-buttons .aui-button[aria-disabled="true"]:hover,
-.aui-buttons .aui-button[aria-disabled="true"]:focus,
-.aui-buttons .aui-button[aria-disabled="true"]:active {
- border-color: #ccc;
-}
-
-
-/* Grouped Primary Buttons */
-
-/* Primary Buttons */
-.aui-buttons .aui-button.aui-button-primary {
- background: #f2f2f2;
- background: -webkit-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -moz-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -ms-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -o-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: linear-gradient(to bottom, #fff 0%, #f2f2f2 100%);
- border-color: #ccc;
- color: #3b73af;
- text-shadow: none;
-}
-
-.aui-buttons .aui-button ~ .aui-button {
- border-left-width: 0;
- padding-left: 11px;
-}
-
-.aui-buttons .aui-button.aui-button-primary:hover,
-.aui-buttons .aui-button.aui-button-primary:focus,
-.aui-buttons .aui-button.aui-button-primary:active {
- border-color: #999;
- color: #205081;
-}
-
-.aui-buttons .aui-button ~ .aui-button:hover,
-.aui-buttons .aui-button ~ .aui-button:focus,
-.aui-buttons .aui-button ~ .aui-button:active {
- border-width: 1px;
- margin-left: -1px;
- position: relative;
-}
-
-/* Selected buttons - NOT supported for free-standing primary buttons
-ARIA usage from http://www.paciellogroup.com/blog/misc/ARIA/togglebutton.html */
-.aui-button[aria-pressed="true"],
-.aui-buttons .aui-button[aria-pressed="true"],
-.aui-buttons .aui-button[aria-pressed="true"].aui-button-primary,
-.aui-buttons .aui-button[aria-pressed="true"].aui-button-subtle {
- background: #ccc;
- background: -webkit-linear-gradient(top, #ccc 0%, #ddd 13%);
- background: -moz-linear-gradient(top, #ccc 0%, #ddd 13%);
- background: -ms-linear-gradient(top, #ccc 0%, #ddd 13%);
- background: -o-linear-gradient(top, #ccc 0%, #ddd 13%);
- background: linear-gradient(to bottom, #ccc 0%, #ddd 13%);
-}
-
-.aui-button[aria-pressed="true"].aui-button-subtle,
-.aui-buttons .aui-button[aria-pressed="true"].aui-button-subtle {
- color: #333;
- border-color: #ccc;
-}
-
-.aui-buttons .aui-button[aria-pressed="true"]:active {
- background: #ccc;
- box-shadow: inset 0px 3px 6px rgba(0,0,0,.2);
-}
-
-
-/* Disabled states (keep last to avoid excessive selector weight)
----------------------------------------------------------------------- */
-.aui-button[disabled],
-.aui-button[disabled]:hover,
-.aui-button[disabled]:focus,
-.aui-button[disabled]:active,
-.aui-button[aria-disabled="true"],
-.aui-button[aria-disabled="true"]:hover,
-.aui-button[aria-disabled="true"]:focus,
-.aui-button[aria-disabled="true"]:active,
-.aui-button[aria-disabled="true"][aria-pressed] {
- background: #f2f2f2;
- background: -webkit-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -moz-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -ms-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -o-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: linear-gradient(to bottom, #fff 0%, #f2f2f2 100%);
- border-color: #ccc;
- box-shadow: none;
- color: #999;
- cursor: default;
- text-shadow: none;
-}
-
-/* Subtle buttons have their own disabled stated*/
-.aui-button.aui-button-subtle[disabled],
-.aui-button.aui-button-subtle[aria-disabled="true"] {
- border: 0;
- background: none;
-}
-
-.aui-button.aui-button-primary[disabled],
-.aui-button.aui-button-primary[disabled]:hover,
-.aui-button.aui-button-primary[disabled]:focus,
-.aui-button.aui-button-primary[disabled]:active,
-.aui-button.aui-button-primary[aria-disabled="true"],
-.aui-button.aui-button-primary[aria-disabled="true"]:hover,
-.aui-button.aui-button-primary[aria-disabled="true"]:focus,
-.aui-button.aui-button-primary[aria-disabled="true"]:active {
- background: #97b3d0;
- background: -webkit-linear-gradient(top, #a2c3e6 0%, #97b3d0 100%);
- background: -moz-linear-gradient(top, #a2c3e6 0%, #97b3d0 100%);
- background: -ms-linear-gradient(top, #a2c3e6 0%, #97b3d0 100%);
- background: -o-linear-gradient(top, #a2c3e6 0%, #97b3d0 100%);
- background: linear-gradient(to bottom, #a2c3e6 0%, #97b3d0 100%);
- border-color: #7f9cb9;
- box-shadow:none;
- color: #fff;
- text-shadow: none;
-}
-
-.aui-button.aui-button-link[disabled],
-.aui-button.aui-button-link[disabled]:hover,
-.aui-button.aui-button-link[disabled]:focus,
-.aui-button.aui-button-link[disabled]:active,
-.aui-button.aui-button-link[aria-disabled="true"],
-.aui-button.aui-button-link[aria-disabled="true"]:hover,
-.aui-button.aui-button-link[aria-disabled="true"]:focus,
-.aui-button.aui-button-link[aria-disabled="true"]:active {
- background: transparent;
- border-color: transparent;
- color: #999;
- text-shadow: none;
- text-decoration: none;
-}
-
-.aui-buttons .aui-button.aui-button-primary[disabled],
-.aui-buttons .aui-button.aui-button-primary[disabled]:hover,
-.aui-buttons .aui-button.aui-button-primary[disabled]:focus,
-.aui-buttons .aui-button.aui-button-primary[disabled]:active,
-.aui-buttons .aui-button.aui-button-primary[aria-disabled="true"],
-.aui-buttons .aui-button.aui-button-primary[aria-disabled="true"]:hover,
-.aui-buttons .aui-button.aui-button-primary[aria-disabled="true"]:focus,
-.aui-buttons .aui-button.aui-button-primary[aria-disabled="true"]:active {
- background: #f2f2f2;
- background: -webkit-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -moz-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -ms-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: -o-linear-gradient(top, #fff 0%, #f2f2f2 100%);
- background: linear-gradient(to bottom, #fff 0%, #f2f2f2 100%);
- border-color: #ccc;
- color: #9dbbd9;
- text-shadow: none;
-}
-
-
-/* Cross-component integration
----------------------------------------------------------------------- */
-
-/* Dropdown2 integration
----------- */
-.aui-button.aui-dropdown2-trigger:first-child.active,
-.aui-button.aui-dropdown2-trigger.active {
- /* square off bottom corners */
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
- border-bottom-width: 0; /* avoid double border when the dropdown is active - increase padding to cater for this reduction */
- padding-bottom: 5px; /* increase the padding to cater for the lack of border so the button doesn't change size */
-}
-.aui-button-link.aui-dropdown2-trigger:first-child.active,
-.aui-button-link.aui-dropdown2-trigger.active {
- border-bottom-width: 1px;
- box-shadow: none;
- padding-bottom: 5px;
-}
-
-.aui-buttons .aui-button.aui-button-subtle.aui-dropdown2-trigger.active,
-.aui-button.aui-button-subtle.aui-dropdown2-trigger.active {
- border-color: #ccc;
-}
-.aui-button.aui-button-subtle.aui-dropdown2-trigger:hover {
- border-color: #999;
-}
-
-.aui-button.aui-dropdown2-trigger {
- padding-right: 23px !important; /* 8px (arrow width) + 10px (right padding) + 5px (margin between arrow and logo) */
- position: relative;
-}
-.aui-button.aui-dropdown2-trigger:after {
- border: 4px solid transparent;
- content: "";
- height: 0;
- left: 100%; /* "left" + "margin-left" required because of webkit not working properly with "right" */
- margin-left: -18px;
- margin-top: -2px;
- opacity: 0.8;
- position: absolute;
- top: 50%;
- width: 0;
-}
-.aui-button.aui-dropdown2-trigger:after,
-.aui-buttons .aui-button.aui-button-primary.aui-dropdown2-trigger:after {
- border-top-color: #333;
-}
-.aui-button.aui-button-primary.aui-dropdown2-trigger:after {
- border-top-color: #fff;
-}
-.aui-button.aui-dropdown2-trigger:hover:after,
-.aui-button.aui-dropdown2-trigger.active:after {
- opacity: 1;
-}
-.aui-button.aui-button.aui-dropdown2-trigger:after {
- margin-top: 0;
- top: 13px;
-}
-
-/* suppress old icon pattern for dropdown widget so we don't get double arrows */
-.aui-button.aui-dropdown2-trigger > .icon-dropdown,
-.aui-button.aui-dropdown2-trigger > .aui-icon-dropdown {
- display: none;
-}
-
-
-/* INPUT does not play with :after - dropdown2 does not support arrow styles for INPUT buttons */
-input.aui-button.aui-dropdown2-trigger {
- padding-right: 10px !important; /* someone used important now we're all doomed */
-}
-input.aui-button.aui-dropdown2-trigger:after {
- display: none;
-}
-
-/* Dropdown2-only / Split Button
----------- */
-.aui-button.aui-dropdown2-trigger.aui-button-split-more,
-.aui-button.aui-dropdown2-trigger.aui-button-split-more.active {
- /* don't touch vertical padding or things jump around, jump around, jump up jump up and get down */
- padding-left: 5px;
- padding-right: 10px;
- text-align: left;
- text-indent: -9999em;
-}
-
-/* remove the element border... */
-.aui-button-split-main {
- border-right: 0;
-}
-
-.aui-button.aui-dropdown2-trigger.aui-button-split-more:hover {
- border-left: 0;
- margin-left: 0;
-}
-
-/* ...then replace it with a border on a pseudo element so we can control the height. */
-.aui-button.aui-dropdown2-trigger.aui-button-split-more:before {
- border-left: 1px solid #ccc;
- bottom: 4px;
- content: "";
- display: block;
- left: 0;
- position: absolute;
- top: 4px;
-}
-
-/* ...then extend it to full height border on hover */
-.aui-button.aui-button-split-main:hover + .aui-button.aui-dropdown2-trigger.aui-button-split-more:before,
-.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:hover:before,
-.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:before,
-.aui-button.aui-dropdown2-trigger.aui-button-split-more:hover:before {
- border-left-color: #999; /* dark border for hover. */
- bottom: -1px; /* -1 to pull it out over the border */
- top: -1px; /* -1 to pull it out over the border */
-}
-/* ...and change the colour on dropdown .active */
-.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:before {
- border-left-color: #ccc; /* lighter border for dropdown-active */
-}
-
-
-/* App Header Buttons and Split Button
----------- */
-.aui-header .aui-nav .aui-button,
-.aui-header .aui-nav .aui-button-primary {
- margin: 5px 0 0 10px;
-}
-
-.aui-header .aui-nav .aui-button-split-main {
- margin-right: 0;
-}
-
-/* long selector set required to avoid a jump in non-hover focus */
-.aui-header .aui-nav .aui-buttons .aui-button ~ .aui-button:hover,
-.aui-header .aui-nav .aui-buttons .aui-button ~ .aui-button:focus,
-.aui-header .aui-nav .aui-buttons .aui-button ~ .aui-button:active,
-.aui-header .aui-nav .aui-button-split-more {
- margin-left: 0;
-}
-
-.aui-header .aui-nav .aui-button-primary,
-.aui-header .aui-nav .aui-button-primary:link,
-.aui-header .aui-nav .aui-button-primary:visited {
- background: #336ea9;
- background-image: -moz-linear-gradient(top, #3b7fc4, #336ea9);
- background-image: -ms-linear-gradient(top, #3b7fc4, #336ea9);
- background-image: -webkit-linear-gradient(top, #3b7fc4, #336ea9);
- background-image: -o-linear-gradient(top, #3b7fc4, #336ea9);
- background-image: linear-gradient(top, #3b7fc4, #336ea9);
- border: 0;
- box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0 0 inset, rgba(0, 0, 0, 0.2) 0 1px 1px 0;
- color: #fff;
- text-shadow: 0 1px 0 #295989;
-}
-
-.aui-header .aui-nav .aui-button.aui-button-primary:focus,
-.aui-header .aui-nav .aui-button.aui-button-primary:hover {
- background: #2D5F9C;
- background-image: -moz-linear-gradient(top, #4796e6, #3773af);
- background-image: -ms-linear-gradient(top, #4796e6, #3773af);
- background-image: -webkit-linear-gradient(top, #4796e6, #3773af);
- background-image: -o-linear-gradient(top, #4796e6, #3773af);
- background-image: linear-gradient(top, #4796e6, #3773af);
- color: #fff;
-}
-
-.aui-header .aui-nav .aui-button.aui-button-primary:active,
-.aui-header .aui-nav .aui-button.aui-button-primary.active {
- background-color: #3572b0;
- background-image: none;
-}
-
-.aui-header .aui-nav .aui-buttons .aui-button-primary.aui-dropdown2-trigger:after {
- border-top-color: #fff;
-}
-
-.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more.active {
- top: -1px;
-}
-
-.aui-header .aui-button-primary.aui-button-split-main:hover + .aui-button.aui-dropdown2-trigger.aui-button-split-more:before,
-.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more.active:hover:before,
-.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more.active:before,
-.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more:hover:before,
-.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more:before {
- border-color: #1f4e7e;
- bottom: 0;
- top: 0;
-}
-
diff --git a/src/main/webapp/connect/common/styles/plugin/blueprint.css b/src/main/webapp/connect/common/styles/plugin/blueprint.css
deleted file mode 100644
index e69de29b..00000000
--- a/src/main/webapp/connect/common/styles/plugin/blueprint.css
+++ /dev/null
diff --git a/src/main/webapp/connect/common/styles/plugin/common.css b/src/main/webapp/connect/common/styles/plugin/common.css
deleted file mode 100644
index 960de985..00000000
--- a/src/main/webapp/connect/common/styles/plugin/common.css
+++ /dev/null
@@ -1,150 +0,0 @@
-div.mxRubberband {
- position: absolute;
- overflow: hidden;
- border-style: solid;
- border-width: 1px;
- border-color: #0000FF;
- background: #0077FF;
-}
-textarea.mxCellEditor {
- background: url('../images/transparent.gif');
- border-style: solid;
- border-color: black;
- border-width: 0;
- overflow: auto;
-}
-div.mxWindow {
- -webkit-box-shadow: 3px 3px 12px #C0C0C0;
- -moz-box-shadow: 3px 3px 12px #C0C0C0;
- box-shadow: 3px 3px 12px #C0C0C0;
- background: url('../images/window.gif');
- border:1px solid #c3c3c3;
- position: absolute;
- overflow: hidden;
- z-index: 1;
-}
-table.mxWindow {
- border-collapse: collapse;
- table-layout: fixed;
- font-family: Arial;
- font-size: 8pt;
-}
-td.mxWindowTitle {
- background: url('../images/window-title.gif') repeat-x;
- text-overflow: ellipsis;
- white-space: nowrap;
- text-align: center;
- font-weight: bold;
- overflow: hidden;
- height: 13px;
- padding: 2px;
- padding-top: 4px;
- padding-bottom: 6px;
- color: black;
-}
-td.mxWindowPane {
- vertical-align: top;
- padding: 0px;
-}
-div.mxWindowPane {
- overflow: hidden;
- position: absolute;
-}
-td.mxWindowPane td {
- font-family: Arial;
- font-size: 8pt;
-}
-td.mxWindowPane input, td.mxWindowPane select, td.mxWindowPane textarea, td.mxWindowPane radio {
- border-color: #8C8C8C;
- border-style: solid;
- border-width: 1px;
- font-family: Arial;
- font-size: 8pt;
- padding: 1px;
-}
-td.mxWindowPane button {
- background: url('../images/button.gif') repeat-x;
- font-family: Arial;
- font-size: 8pt;
- padding: 2px;
- float: left;
-}
-img.mxToolbarItem {
- margin-right: 6px;
- margin-bottom: 6px;
- border-width: 1px;
-}
-select.mxToolbarCombo {
- vertical-align: top;
- border-style: inset;
- border-width: 2px;
-}
-div.mxToolbarComboContainer {
- padding: 2px;
-}
-img.mxToolbarMode {
- margin: 2px;
- margin-right: 4px;
- margin-bottom: 4px;
- border-width: 0px;
-}
-img.mxToolbarModeSelected {
- margin: 0px;
- margin-right: 2px;
- margin-bottom: 2px;
- border-width: 2px;
- border-style: inset;
-}
-div.mxTooltip {
- -webkit-box-shadow: 3px 3px 12px #C0C0C0;
- -moz-box-shadow: 3px 3px 12px #C0C0C0;
- box-shadow: 3px 3px 12px #C0C0C0;
- background: #FFFFCC;
- border-style: solid;
- border-width: 1px;
- border-color: black;
- font-family: Arial;
- font-size: 8pt;
- position: absolute;
- cursor: default;
- padding: 4px;
- color: black;
-}
-div.mxPopupMenu {
- -webkit-box-shadow: 3px 3px 12px #C0C0C0;
- -moz-box-shadow: 3px 3px 12px #C0C0C0;
- box-shadow: 3px 3px 12px #C0C0C0;
- background: url('../images/window.gif');
- position: absolute;
- border-style: solid;
- border-width: 1px;
- border-color: black;
-}
-table.mxPopupMenu {
- border-collapse: collapse;
- margin-top: 1px;
- margin-bottom: 1px;
-}
-tr.mxPopupMenuItem {
- color: black;
- cursor: pointer;
-}
-tr.mxPopupMenuItemHover {
- background-color: #000066;
- color: #FFFFFF;
- cursor: pointer;
-}
-td.mxPopupMenuItem {
- padding: 2px 30px 2px 10px;
- white-space: nowrap;
- font-family: Arial;
- font-size: 8pt;
-}
-td.mxPopupMenuIcon {
- background-color: #D0D0D0;
- padding: 2px 4px 2px 4px;
-}
-.mxDisabled {
- opacity: 0.2 !important;
- cursor:default !important;
-}
diff --git a/src/main/webapp/connect/common/styles/plugin/dropdown-menu.css b/src/main/webapp/connect/common/styles/plugin/dropdown-menu.css
deleted file mode 100644
index 70b54d05..00000000
--- a/src/main/webapp/connect/common/styles/plugin/dropdown-menu.css
+++ /dev/null
@@ -1,4 +0,0 @@
-#insert-menu .macro-drawio .icon {
- background:transparent url("images/logo-16x16.png") 0 0 no-repeat;
- margin-top:0px;
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/common/styles/plugin/explorer.css b/src/main/webapp/connect/common/styles/plugin/explorer.css
deleted file mode 100644
index daa5e487..00000000
--- a/src/main/webapp/connect/common/styles/plugin/explorer.css
+++ /dev/null
@@ -1,18 +0,0 @@
-div.mxTooltip {
- filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4,
- Color='#A2A2A2', Positive='true');
-}
-div.mxPopupMenu {
- filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4,
- Color='#C0C0C0', Positive='true');
-}
-div.mxWindow {
- filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=4, OffY=4,
- Color='#C0C0C0', Positive='true');
-}
-td.mxWindowTitle {
- _height: 23px;
-}
-.mxDisabled {
- _filter:alpha(opacity=20) !important;
-}
diff --git a/src/main/webapp/connect/common/styles/plugin/linkBrowser.css b/src/main/webapp/connect/common/styles/plugin/linkBrowser.css
deleted file mode 100644
index c4519311..00000000
--- a/src/main/webapp/connect/common/styles/plugin/linkBrowser.css
+++ /dev/null
@@ -1,296 +0,0 @@
-.drawio-dialog
-{
- width: 100%;
- height: 100%;
-}
-.dialog-title
-{
- border-bottom: 1px solid #ccc;
- padding: 20px 25px;
- box-sizing: border-box;
- height: 56px;
- width : 100%;
- background: #f5f5f5;
- color: #333;
- font-weight: normal;
- font-size: medium;
-}
-
-.dialog-button-panel
-{
- border-top: 1px solid #ccc;
- padding: 12px 20px;
- box-sizing: border-box;
- height: 56px;
- width: 100%;
- margin: 0 10px 0 0;
- text-align: right;
- background: #f5f5f5;
-}
-.dialog-page
-{
- height : 483px;
-}
-.dialog-page-menu
-{
- background: none repeat scroll 0 0 #FFFFFF;
- border-right: 1px solid #CCCCCC;
- box-sizing: border-box;
- float: left;
- height: 100%;
- list-style: none outside none;
- margin: 0;
- overflow-x: hidden;
- overflow-y: auto;
- padding: 10px 10px 20px;
- width: 25%;
- float : left;
- list-style: none outside none;
-}
-.dialog-page-menu li.page-menu-item.selected button.item-button {
- color: #333333;
- font-weight: bold;
-}
-.dialog-page-menu li.page-menu-item button.item-button
-{
- background: none repeat scroll 0 0 rgba(0, 0, 0, 0);
- border: 0 none;
- color: #3B73AF;
- cursor: pointer;
- font-family: inherit;
- font-size: inherit;
- line-height: 1.1428;
- margin: 0;
- padding: 7px 10px;
- text-align: left;
- text-decoration: none;
- /*width: 100%;*/
- word-wrap : none;
-}
-.page-menu-item-hover
-{
- background-color: #E6E6E6;
-}
-.page-menu-item-selected button.item-button
-{
- color : #333333 !important;
- font-weight : bold;
-}
-.dialog-page-contents
-{
- height : 100%;
- float : left;
- width : 620px;
-}
-.search-input
-{
- width : 220px;
- float : left;
-}
-.text
-{
- height: 2.14286em;
- line-height: 1.42857;
- padding: 4px 5px;
- border: 1px solid #ccc;
- border-radius: 3.01px;
- box-shadow: 0 1px 3px #ccc inset;
- box-sizing: border-box;
- color: #333;
- font-size: inherit;
- margin: 5px;
- max-width: 250px;
- vertical-align: baseline;
- width: 100%;
-}
-.dialog-panel-body
-{
- padding : 20px 10px;
-}
-.data-table-header
-{
- padding: 7px 10px;
- text-align: left;
- vertical-align: top;
-}
-table.aui
-{
- width : 100%;
- border-collapse: collapse;;
-}
-table.aui>thead>tr>th, table.aui>tbody>tr>th, table.aui>thead>tr>td, table.aui>tbody>tr>td, table.aui>tfoot>tr>td
-{
- padding: 7px 10px;
- text-align: left;
- vertical-align: top;
-
-}
-table.aui>tbody>tr>td, table.aui>tfoot>tr
-{
- background: #fff;
- border-top: 1px solid #ccc;
- color: #333;
-}
-.button-panel-button
-{
- background: #f2f2f2;
- background: -webkit-linear-gradient(top,#fff 0,#f2f2f2 100%);
- background: -moz-linear-gradient(top,#fff 0,#f2f2f2 100%);
- background: -ms-linear-gradient(top,#fff 0,#f2f2f2 100%);
- background: -o-linear-gradient(top,#fff 0,#f2f2f2 100%);
- background: linear-gradient(to bottom,#fff 0,#f2f2f2 100%);
- border-color: #ccc;
- -moz-border-radius: 3.01px;
- -webkit-border-radius: 3.01px;
- border-radius: 3.01px;
- border-style: solid;
- border-width: 1px;
- color: #333;
- cursor: pointer;
- display: inline-block;
- font-size: 14px;
- font-family: Arial,sans-serif;
- font-variant: normal;
- line-height: 20px;
- padding: 4px 10px;
- text-decoration: none;
- text-shadow: 0 1px 0 white;
- vertical-align: baseline;
- margin : 0 10px 0 0;
-}
-
-.data-table-panel tr.selected, .data-table-panel tr.selected a, .data-table-panel tr.selected td
-{
- background-color: #ebf2f9;
-}
-.data-table-panel
-{
- margin : 0px -10px;
- overflow-x: visible;
- overflow-y: auto;
- height : 388px;
- clear : both;
-}
-
-.location-info, .location-info-top
-{
- overflow: hidden;
- width: 100%;
- position: absolute;
- left: 210px;
- padding : 10px;
-}
-.location-info
-{
- border-top: 1px solid #ccc;
- bottom: 51px;
-}
-.location-info-top
-{
- top: 51px;
-}
-.field-group
-{
- padding: 0 0 0 100px;
- position: relative;
- word-wrap: break-word;
-}
-
-#search-panel-button
-{
- position : relative;
- top : 4px;
-}
-
-#alias
-{
- display: none;
-}
-
-#url
-{
- margin : 30px;
-}
-.message-panel
-{
- padding-left : 10px;
- padding-top : 10px;
-}
-
-button:focus, li:focus {
- outline: 0;
-}
-
-div.description {
- color: #707070;
- font-size: 12px;
- line-height: 1.66666666666667;
- margin: 5px 0 0 57px;
-}
-#url:hover, .button-panel-link:hover
-{
- text-decoration: underline !important;
-}
-#url, .button-panel-link
-{
- text-decoration: none !important;
-}
-
-.ui-tree li a,
-a.content-type-page span,
-div.content-type-page,
-span.content-type-page,
-.icon-page {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAPFBMVEX///+1tbWwsLCtra3///+Li4v5+fnZ2dnT09P8/PzPz8+rq6uhoaHR0dFycnJwcHB6enp4eHiDg4OAgIDxJSXRAAAADnRSTlMAIiJV3e7u7u7u7u7u7rDOyYEAAABUSURBVHhepcpLDoAwCABRqkBbP9Dq/e9qLYS1ibN8GQBYSFVGfQWLWmFEZG0uknGmuz+CDnjYEzDqDpF8BrV+HBxHNThjyBPo2qpBuemFROIpJXgAPRkGZhcD+TMAAAAASUVORK5CYII=);
- background-repeat: no-repeat;
- padding-left: 20px;
-}
-
-a.content-type-blogpost span,
-div.content-type-blogpost,
-span.content-type-blogpost,
-.icon-blog,
-.icon-blogpost {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAUVBMVEX///+1tbWwsLCtra3////GxsaLi4uzs7PPz8/5+fnr6+v19fXZ2dnT09P8/Pyrq6uhoaHR0dFwcHBycnJ4eHiAgIB6enqRkZF3d3eDg4OIiIgEhg+GAAAAEnRSTlMAIiJV3e7u7u7u7u7u7u7u7u5mVDB9AAAAdElEQVR4Xk3K2xbCIAxEUaqTcGurJtCq//+hItAF53HPGGNuLKKldDctPjYPwMvRRVfU5NE/ig541s+AUmow0g7WujhBfb9pBgTKQhOUPX5THGBPIRI3gHDmKPYCH3KwggJ7gxeu1gr8cXuDLfMfFtae8GJ+G+sIH3qkr1wAAAAASUVORK5CYII=);
- background-repeat: no-repeat;
- padding-left: 20px;
-}
-
-a.content-type-attachment-image span,
-div.content-type-attachment-image,
-span.content-type-attachment-image,
-.icon-file-image {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAaVBMVEX///+1tbWzs7OwsLD///+Li4vq6ur4+Pji4uLPz8/Hx8e1tbWmpqb29vazs7PW1tb///+srKzY2NjAwMCIiIiHh4d0dHRycnKLi4uDg4OTk5ORkZFwcHCHh4d6enqFhYV3d3d8fHyZmZke2Bp4AAAAFnRSTlMAIiIi3e7u7u7u7u7u7u7u7u7u7u7uxh/uMQAAAHZJREFUeF6Fz8kOwjAMRVEDdjozY2dsC///kSQB0goWHCmLdyUvAj+2JCu0AQoKi/NEIHVZ8R08yGc77xCPsoTZzzHn0Jp01rjmHTpmjdkrnDjq4qj2fZUCZzWq3trLEnRrk6EEDnoy5v4QuPHKOBLsrl9/+esJNi4MYbEkhTkAAAAASUVORK5CYII=);
- background-repeat: no-repeat;
- padding-left: 20px;
-}
-
-a.content-type-attachment-pdf span,
-div.content-type-attachment-pdf,
-span.content-type-attachment-pdf,
-.icon-file-pdf {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAWlBMVEX///+1tbWzs7OwsLD////7+/v88vHm5ubi4uLf39/12dbY2NjyzMnS0tLPz8/stK/pqKLmnJXjkYnghXyLi4veenDbb2WFhYWBgYHYY1lycnLVWU1wcHDQRDd8ojdZAAAAFXRSTlMAIiIi3e7u7u7u7u7u7u7u7u7u7u4cXfPyAAAAaUlEQVQYV13PRxaAMAgEUNTYC0awRb3/NY1pz2RW8NkwAFCw8uEcdHivhU178AfK71qUgW9cFyM/wATknABSAufWRYCyuxYpA1QnzQMSecAL3SMOHhIxhJQWmgCTAT56dx9tuTzUvzmDF/8aCYb2SVzBAAAAAElFTkSuQmCC);
- background-repeat: no-repeat;
- padding-left: 20px;
-}
-
-a.content-type-attachment-text-html span,
-div.content-type-attachment-text-html,
-span.content-type-attachment-text-html,
-a.content-type-attachment-html span,
-div.content-type-attachment-html,
-span.content-type-attachment-html,
-a.content-type-attachment-text-xml span,
-div.content-type-attachment-text-xml,
-span.content-type-attachment-text-xml,
-a.content-type-attachment-xml span,
-div.content-type-attachment-xml,
-span.content-type-attachment-xml,
-a.content-type-attachment-js span,
-div.content-type-attachment-js,
-span.content-type-attachment-js,
-.icon-file-html,
-.icon-file-xml {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAZlBMVEX///+1tbWzs7OxsbH///+RkZGPj4/R0dG5ubnMzMzPz8+zs7OcnJzExMT39/f5+fnHx8fm5ubY2Nj09PTz8/OxsbGnp6ft7e1ycnJvb29wcHB2dnaRkZGNjY2FhYWBgYF+fn54eHhKjR8EAAAAGHRSTlMAIiIi3d3d7u7u7u7u7u7u7u7u7u7u7u5Iiv/NAAAAcklEQVR4Xl3Pxw4DMQgEUJyMy5b0Bnbq//9kFssJkufG0xwGIhcy/+IdEfnXgJbh7RfgiH/2rLAzOFcAIMC9SgOZcJwN9MYldY3HQQwAuT0xiQGQrlAxmGPX+AB6ox92qjB2030ZW2e7KfrcOnBL5rCiLxz1CbC+jprRAAAAAElFTkSuQmCC);
- background-repeat: no-repeat;
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/common/styles/plugin/mx-editor.css b/src/main/webapp/connect/common/styles/plugin/mx-editor.css
deleted file mode 100644
index 48eccbe7..00000000
--- a/src/main/webapp/connect/common/styles/plugin/mx-editor.css
+++ /dev/null
@@ -1,34 +0,0 @@
-/* contains styles specific to the Confluence integration */
-
-
-html tr.mxPopupMenuItemHover {
- background-color: #3B73AF;
- color: #FFFFFF;
-}
-
-html div.mxPopupMenu {
- background-color: #FFFFFF;
- border: 1px solid #CCCCCC;
- border-bottom-left-radius: 3px;
- border-bottom-right-radius: 3px;
- box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2);
-
- font-size: 14px;
- line-height: 1;
-}
-
-.geMenubar
-{
- background-color: #205081;
-}
-
-.geMenubarContainer a
-{
- color: #FFFFFF !important;
- padding: 10px 10px !important;
-}
-
-.geMenubarContainer .geItem:hover
-{
- background-color: #3B73A7 !important;
-}
diff --git a/src/main/webapp/connect/common/styles/plugin/newDiagramDialog.css b/src/main/webapp/connect/common/styles/plugin/newDiagramDialog.css
deleted file mode 100644
index 1d43d24e..00000000
--- a/src/main/webapp/connect/common/styles/plugin/newDiagramDialog.css
+++ /dev/null
@@ -1,49 +0,0 @@
-.drawio-list {
- width: 120px;
- height: 120px;
- text-align: center;
- padding-bottom: 50px;
- padding-right: 30px;
- float: left;
-}
-
-.drawio-list-item {
- width: 100%;
- height: 100%;
- border: 3px solid #F0F0F0;
- border-radius: 5px;
- padding: 2px;
-}
-
-.drawio-list-item-hover {
- border: 3px solid #c5c5c5;
-}
-
-.drawio-list-item-selected {
- border: 3px solid #3b73af;
-}
-
-.drawio-separator {
- border-top: 1px solid #F0F0F0;
- clear: both;
- padding-top : 10px;
- padding-bottom : 10px;
-}
-
-.drawio-thumbnail {
- width: 100%;
- height: 100%; background-repeat : no-repeat;
- background-size: contain;
- background-repeat: no-repeat;
-}
-
-.drawio-template-panel-header {
- padding-left: 10px;
- padding-top: 5px;
- padding-bottom: 5px;
- font-style: italic;
-}
-
-.drawio-search-results {
- padding-top : 10px;
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/common/styles/plugin/reader.css b/src/main/webapp/connect/common/styles/plugin/reader.css
deleted file mode 100644
index 49c2c37b..00000000
--- a/src/main/webapp/connect/common/styles/plugin/reader.css
+++ /dev/null
@@ -1,39 +0,0 @@
-.drawio-viewer {
- max-width: 100%;
-}
-
-.diagramly-reader-toolbar {
-
- height : 27px;
- margin-left: 1px;
- margin-bottom: 1px;
- background-color: #EEEEEE;
- border-radius : 3px;
-}
-
-.diagramly-reader-toolbar-button, .diagramly-reader-toolbar-button-hover {
- float : left;
- border-radius : 3px;
- padding: 2px;
- opacity : 0.7;
-}
-
-.diagramly-reader-toolbar-button {
- border: 1px solid transparent;
-}
-
-.diagramly-reader-toolbar-button-hover {
- border: 1px solid #404040;
- opacity : 1.0;
-}
-
-.drawio-reader-popup-header
-{
- text-align: center;
-}
-
-.drawio-reader-heading
-{
- margin-top: 2px;
- margin-bottom: 2px;
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/common/styles/plugin/search.css b/src/main/webapp/connect/common/styles/plugin/search.css
deleted file mode 100644
index abf19d90..00000000
--- a/src/main/webapp/connect/common/styles/plugin/search.css
+++ /dev/null
@@ -1,84 +0,0 @@
-.diagramly-selected {
- background-color: #EEEEEE;
-}
-
-.diagramly-search-results {
-
-}
-
-.diagramly-results-table {
- width: 100%;
- border-spacing: 0px;
- padding: 0 10px 0 10px;
-
-}
-
-.diagramly-results-table td {
- line-height: 24px;
- color: #666666;
- cursor: default;
- text-decoration: none;
-}
-
-.diagramly-results-table th {
- font-size: 12px;
- line-height: 24px;
- margin: 0;
- overflow: hidden;
- border-bottom: 1px solid #F0F0F0;
- color: #666666;
- font-weight: bold;
- text-align: left;
-}
-
-
-
-.diagramly-blueprint-list {
-
-}
-
-.diagramly-blueprint-list-item-wrapper {
- width : 90px;
- height : 90px;
- text-align : center;
-
-}
-
-.diagramly-blueprint-list-item {
- width : 100%;
- height : 100%;
- border : 3px solid #F0F0F0;
- border-radius : 5px;
- padding : 2px;
-}
-
-.diagramly-blueprint-list-item-hover {
- border : 3px solid #c5c5c5;
-}
-
-.diagramly-blueprint-list-item-selected {
- border : 3px solid #3b73af;
-}
-
-.drawio-list-item-wrapper {
- width : 90px;
- height : 90px;
- text-align : center;
-
-}
-
-.drawio-list-item {
- width : 100%;
- height : 100%;
- border : 3px solid #F0F0F0;
- border-radius : 5px;
- padding : 2px;
-}
-
-.drawio-list-item-hover {
- border : 3px solid #c5c5c5;
-}
-
-.drawio-list-item-selected {
- border : 3px solid #3b73af;
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/common/viewer.txt b/src/main/webapp/connect/common/viewer.txt
deleted file mode 100644
index 739080e7..00000000
--- a/src/main/webapp/connect/common/viewer.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-diagramly.reader.edit=Edit
-diagramly.reader.remove=Remove
-diagramly.reader.fit=Zoom to Fit
-diagramly.reader.zoomActual=Actual Size
-diagramly.reader.zoomOut=Zoom Out
-diagramly.reader.zoomIn=Zoom In
-diagramly.reader.confirmDelete=Are you sure you want to delete this diagram?
-diagramly.reader.fullScreen=Full screen
-diagramly.reader.closeFullScreen=Close full screen \ No newline at end of file
diff --git a/src/main/webapp/connect/common/viewer_de.txt b/src/main/webapp/connect/common/viewer_de.txt
deleted file mode 100644
index 2a92b650..00000000
--- a/src/main/webapp/connect/common/viewer_de.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-diagramly.reader.edit=Bearbeiten
-diagramly.reader.remove=Entfernen
-diagramly.reader.fit=Zoom anpassen
-diagramly.reader.zoomActual=Tatsächliche Grösse
-diagramly.reader.zoomOut=Herauszoomen
-diagramly.reader.zoomIn=Hineinzoomen
-diagramly.reader.confirmDelete=Sind Sie sicher, Sie wollen dieses Diagramm zu löschen?
-diagramly.reader.fullScreen=Vollbild
-diagramly.reader.closeFullScreen=Schließen vollbild \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/admin-page.js b/src/main/webapp/connect/confluence/admin-page.js
deleted file mode 100644
index 0dd3e308..00000000
--- a/src/main/webapp/connect/confluence/admin-page.js
+++ /dev/null
@@ -1,47 +0,0 @@
-//Logs uncaught errors
-window.onerror = function(message, url, linenumber, colno, err)
-{
- message = 'Confluence Cloud Admin: ' + ((message != null) ? message : '');
-
- AC.logError(message, url, linenumber, colno, err);
-};
-
-var baseUrl = AC.getBaseUrl();
-
-var script = document.createElement('script');
-
-script.onload = function()
-{
- AP.sizeToParent(true);
-
- setTimeout(function()
- {
- AP.sizeToParent(true);
- }, 5000); //Try resizing again after 5 sec since the first one fails sometimes
-
- getAndApplyTranslation(function()
- {
- //JQuery is loaded in this page, so we can use it
- var logDiv = $('#operationLog');
-
- var importBtn = $('#importBtn');
-
- importBtn.attr("disabled", null);
-
- importBtn.click(function()
- {
- $('#busyIcon').show();
- importBtn.prop('disabled', true); //Disable button to prevent concurrent execution
-
- GliffyMassImporter(logDiv, function()
- {
- $('#busyIcon').hide();
- importBtn.prop('disabled', false);
- });
- });
- });
-};
-
-script.src = 'https://connect-cdn.atl-paas.net/all.js';
-script.setAttribute('data-options', 'resize:false;margin:false');
-document.getElementsByTagName('head')[0].appendChild(script);
diff --git a/src/main/webapp/connect/confluence/admin.html b/src/main/webapp/connect/confluence/admin.html
deleted file mode 100644
index 575e2b25..00000000
--- a/src/main/webapp/connect/confluence/admin.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="UTF-8">
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
- <script src="connectUtils-1-4-8.js" type="text/javascript"></script>
- <script src="admin.js" type="text/javascript"></script>
- <link rel="stylesheet" type="text/css" href="//aui-cdn.atlassian.com/aui-adg/6.0.4/css/aui.css">
- </head>
- <body class="aui-layout aui-theme-default" style="background-color:rgb(255, 255, 255);">
- <div class="aui-page-panel" style="margin-top:0px;">
- <h4 style="padding-top:20px;" data-i18n="gliffyImport">Gliffy Import</h4>
- <div><br><span data-i18n="gliffyImportInst1">Click the "Start Import" button to import all Gliffy diagrams to draw.io.</span><br>
- <span data-i18n="gliffyImportInst2">Please note that the import procedure will take some time and the browser window must remain open until the import is completed.</span></div>
- <div style="padding-bottom:4px;"><br><button id="importBtn" disabled="disabled" class="aui-button aui-button-primary" data-i18n="startImport">Start Import</button>
- <img id="busyIcon" src="/images/spin.gif" style="display: none">
- </div>
- <div id="operationLog"><br></div>
- </div>
- <script src="admin-page.js" type="text/javascript"></script>
- </body>
-</html>
diff --git a/src/main/webapp/connect/confluence/admin.js b/src/main/webapp/connect/confluence/admin.js
deleted file mode 100644
index 39009f90..00000000
--- a/src/main/webapp/connect/confluence/admin.js
+++ /dev/null
@@ -1,1142 +0,0 @@
-function guid()
-{
- function s4()
- {
- return Math.floor((1 + Math.random()) * 0x10000)
- .toString(16)
- .substring(1);
- }
-
- return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
- s4() + '-' + s4() + s4() + s4();
-};
-
-var drawioMacroParams = ['diagramName', 'contentId', 'contentVer', 'revision', 'width', 'height', 'tempPreview', 'zoom', 'lbox',
- 'diagramDisplayName', 'tbstyle', 'links', 'simple', 'hiResPreview', 'inComment', 'aspect', 'pageId', 'baseUrl',
- //inc-drawio macro specific params
- 'diagramUrl', 'includedDiagram', 'aspectHash', 'imgPageId', 'attVer', 'custContentId',
- 'pCenter'
-];
-
-function getMacroRegExps(macroName, attParams)
-{
- //RegExp that will be used
- var findMacrosRegEx = new RegExp('\\<ac\\:structured\\-macro[^\\>]+?(?=ac\\:name\\=)ac\\:name\\=\\"' + macroName + '\\".*?(?=\\<\\/ac\\:structured\\-macro\\>)\\<\\/ac\\:structured\\-macro\\>', 'g');
- var findMacroIdRegEx = new RegExp('ac\\:macro\\-id\\=\\"([^\\"]+)');
-
- var findOldMacrosRegEx = new RegExp('\\<ac\\:macro[^\\>]+?(?=ac\\:name\\=)ac\\:name\\=\\"' + macroName + '\\".*?(?=\\<\\/ac\\:macro\\>)\\<\\/ac\\:macro\\>', 'g');
-
- var findAttParamsRegExs = [];
-
- for (var i = 0; i < attParams.length; i++)
- {
- findAttParamsRegExs.push(new RegExp('\\<ac\\:parameter\\s+ac\\:name\\=\\"' + attParams[i] + '\\"\\s*\\>([^\\<]+)'));
- }
-
- return {findMacrosRegEx: findMacrosRegEx, findMacroIdRegEx: findMacroIdRegEx, findOldMacrosRegEx: findOldMacrosRegEx, findAttParamsRegExs: findAttParamsRegExs};
-};
-
-function replacePageMacro(page, regExps, processAttFn, pageUpdateSuccess, pageUpdateError, alwaysCallSuccess)
-{
- var originalBody = page.body.storage.value;
-
- var pageXml = originalBody;
-
- var foundMacros = pageXml.match(regExps.findMacrosRegEx);
- var foundOldMacros = pageXml.match(regExps.findOldMacrosRegEx);
-
- var macrosParsed = 0;
- var drawIoMacros = {};
- var foundMarcosIds = [];
- var spaceKey = AC.getSpaceKey(page._expandable.space);
- var macrosCount = (foundMacros? foundMacros.length : 0) + (foundOldMacros? foundOldMacros.length : 0);
-
-
- function attProcessedFn(attInfo, skipErrorFlag)
- {
- //Replace found macro with a draw.io one and use the same preview image
- if (skipErrorFlag)
- {
- drawIoMacros[attInfo.macroId] = skipErrorFlag;
- }
- else
- {
- //generate draw.io macro HTML
- var drawIoMacro = '<ac:structured-macro ac:name="' + (attInfo.isInc? 'inc-drawio' : 'drawio') + '" ac:schema-version="1" ac:macro-id="' + attInfo.macroId
- + '"><ac:parameter ac:name="baseUrl">' + baseUrl
- + '</ac:parameter><ac:parameter ac:name="diagramName">' + AC.htmlEntities(attInfo.name)
- + '</ac:parameter><ac:parameter ac:name="zoom">' + (attInfo.zoom ? attInfo.zoom : '1')
- + '</ac:parameter><ac:parameter ac:name="pageId">' + (attInfo.pageId || page.id)
- + '</ac:parameter><ac:parameter ac:name="lbox">' + (attInfo.lbox == 'false' || attInfo.lbox == '0'? '0' : '1')
- + (attInfo.width? ('</ac:parameter><ac:parameter ac:name="width">' + attInfo.width) : '')
- + (attInfo.height? ('</ac:parameter><ac:parameter ac:name="height">' + attInfo.height) : '')
- + (!attInfo.isInc && attInfo.revision? ('</ac:parameter><ac:parameter ac:name="revision">' + attInfo.revision) : '')
- + (attInfo.previewPng? ('</ac:parameter><ac:parameter ac:name="tempPreview">' + AC.htmlEntities(attInfo.previewPng)) : '')
- + (attInfo.contentId? ('</ac:parameter><ac:parameter ac:name="custContentId">' + attInfo.contentId) : '')
- + (!attInfo.isInc && attInfo.contentVer? ('</ac:parameter><ac:parameter ac:name="contentVer">' + attInfo.contentVer) : '')
- + (attInfo.diagramDisplayName? ('</ac:parameter><ac:parameter ac:name="diagramDisplayName">' + attInfo.diagramDisplayName) : '')
- + (attInfo.tbstyle? ('</ac:parameter><ac:parameter ac:name="tbstyle">' + attInfo.tbstyle) : '')
- + (attInfo.links? ('</ac:parameter><ac:parameter ac:name="links">' + attInfo.links) : '')
- + (attInfo.simple? ('</ac:parameter><ac:parameter ac:name="simple">' + attInfo.simple) : '')
- + (attInfo.hiResPreview? ('</ac:parameter><ac:parameter ac:name="hiResPreview">' + attInfo.hiResPreview) : '')
- + (attInfo.inComment? ('</ac:parameter><ac:parameter ac:name="inComment">' + attInfo.inComment) : '')
- + (attInfo.aspect? ('</ac:parameter><ac:parameter ac:name="aspect">' + attInfo.aspect) : '')
- + (attInfo.diagramUrl? ('</ac:parameter><ac:parameter ac:name="diagramUrl">' + attInfo.diagramUrl) : '')
- + (attInfo.aspectHash? ('</ac:parameter><ac:parameter ac:name="aspectHash">' + attInfo.aspectHash) : '')
- + (attInfo.imgPageId? ('</ac:parameter><ac:parameter ac:name="imgPageId">' + attInfo.imgPageId) : '')
- + (attInfo.attVer? ('</ac:parameter><ac:parameter ac:name="attVer">' + attInfo.attVer) : '')
- + (attInfo.isInc? ('</ac:parameter><ac:parameter ac:name="includedDiagram">1') : '')
- + (attInfo.pCenter? ('</ac:parameter><ac:parameter ac:name="pCenter">' + attInfo.pCenter) : '')
- + '</ac:parameter></ac:structured-macro>';
-
- drawIoMacros[attInfo.macroId] = drawIoMacro;
- }
-
- macrosParsed++;
-
- if (macrosCount == macrosParsed)
- {
- var successfullyConverted = 0;
- var skippedCount = 0;
-
- for (var j = 0; j < macrosParsed; j++)
- {
- var id = foundMarcosIds[j].id;
-
- if (isFinite(drawIoMacros[id]))
- {
- if (drawIoMacros[id] == 2)
- {
- successfullyConverted++; //skipping is successful
- skippedCount++;
- }
- }
- else
- {
- var macroTxt = foundMarcosIds[j].macroTxt;
-
- originalBody = originalBody.replace(macroTxt, drawIoMacros[id]);
- successfullyConverted++;
- }
- }
-
- //If all macros are skipped, no need to change the page
- if (skippedCount == successfullyConverted)
- {
- pageUpdateSuccess(successfullyConverted, macrosParsed);
- }
- else
- {
- //update page contents
- AP.request({
- type: 'PUT',
- data: JSON.stringify({
- "body": {
- "storage": {
- "value": originalBody,
- "representation": "storage",
- "embeddedContent": []
- }
- },
- "version": {
- "number": page.version.number + 1
- },
- "type": page.type,
- "title": page.title,
- "status": "current"
- }),
- url: "/rest/api/content/"+ page.id,
- contentType: 'application/json;charset=UTF-8',
- success: function(resp) {
- //update page object for next phase
- page.body.storage.value = originalBody;
- pageUpdateSuccess(successfullyConverted, macrosParsed);
- },
- error: pageUpdateError
- });
- }
- }
- };
-
- if (foundMacros && foundMacros.length > 0)
- {
- var doneIndex = 0;
- var PARTITION_SIZE = 5;
-
- //Process macros 5 (PARTITION_SIZE) at a time to throttle the process
- function processPartition(limit)
- {
- function partitionDone()
- {
- doneIndex++;
-
- if (foundMacros.length != limit && doneIndex == limit)
- {
- processPartition(limit + PARTITION_SIZE);
- }
- };
-
-
- limit = Math.min(foundMacros.length, limit);
-
- for (var i = doneIndex; i < limit; i++)
- {
- var potentialId = foundMacros[i].match(regExps.findMacroIdRegEx);
- var macroId = potentialId? potentialId[1] : guid();
-
- foundMarcosIds.push({id: macroId, macroTxt: foundMacros[i]});
-
- var params = [];
-
- for (var j = 0; j < regExps.findAttParamsRegExs.length; j++)
- {
- var paramFound = foundMacros[i].match(regExps.findAttParamsRegExs[j]);
-
- params.push(paramFound != null && paramFound[1] != null? AC.fromHtmlEntities(paramFound[1]) : null);
- }
-
- //get the attachment content
- processAttFn(page.id, page.type, spaceKey, params, macroId, function(attInfo)
- {
- attProcessedFn(attInfo);
- partitionDone();
- },
- function(attInfo)
- {
- attProcessedFn(attInfo, 1);
- partitionDone();
- },
- function(attInfo)
- {
- attProcessedFn(attInfo, 2);
- partitionDone();
- });
- };
- }
-
- processPartition(PARTITION_SIZE);
- }
-
- if (foundOldMacros && foundOldMacros.length > 0)
- {
- for (var i = 0; i < foundOldMacros.length; i++)
- {
- //these macros has no id, so generate a unique id
- var macroId = guid();
-
- foundMarcosIds.push({id: macroId, macroTxt: foundOldMacros[i]});
-
- var params = [];
-
- for (var j = 0; j < regExps.findAttParamsRegExs.length; j++)
- {
- var paramFound = foundOldMacros[i].match(regExps.findAttParamsRegExs[j]);
-
- params.push(paramFound? AC.fromHtmlEntities(paramFound[1]) : null);
- }
-
- //get the attachment content
- processAttFn(page.id, page.type, spaceKey, params, macroId, attProcessedFn,
- function(attInfo)
- {
- attProcessedFn(attInfo, 1);
- },
- function(attInfo)
- {
- attProcessedFn(attInfo, 2);
- });
- };
- }
-
- if (macrosCount == 0 && alwaysCallSuccess)
- {
- pageUpdateSuccess(0, 0);
- }
-
- return macrosCount;
-};
-
-var MassDiagramsProcessor = function(macroName, readableName, attParams, processAttFn, logDiv, doneFn)
-{
- var start = 0, limit = 100;
- var regExps = getMacroRegExps(macroName, attParams);
-
- var pagesCount = 0, pagesIndex = 0;
- var pagesList = [], pagesMap = {};
-
- function searchContentForMacro(onSuccess, onError)
- {
- //keeping the block of AP.require to minimize the number of changes!
- {
- AP.request({
- type: 'GET',
- url : '/rest/api/content/search?cql=' + encodeURIComponent('macro="' + macroName + '"') + '&start=' + start + '&limit=' + limit,
- contentType: 'application/json;charset=UTF-8',
- success: function(resp) {
- var resp = JSON.parse(resp);
- var list = resp.results;
-
- //Ensure pages list is unique since search api return duplicates
- for (var i = 0; i < list.length; i++)
- {
- if (!pagesMap[list[i].id] && list[i].status != 'trashed') //remove duplicates & trashed pages
- {
- pagesList.push(list[i]);
- pagesMap[list[i].id] = true;
- pagesCount++;
- }
- }
-
- //Support pageing
- if (resp._links && resp._links.next)
- {
- start += resp.limit; //Sometimes the limit is changed by the server
- searchContentForMacro(onSuccess, onError);
- }
- else
- {
- //Done
- onSuccess();
- }
- },
- error: onError
- });
- };
- };
-
- function getPageContent(pageId, success, error)
- {
- //keeping the block of AP.require to minimize the number of changes!
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + pageId + '/?expand=body.storage,version',
- contentType: 'application/json;charset=UTF-8',
- success: success,
- error: error
- });
- };
- };
-
- //Process pages one at a time
- function processPage()
- {
- if (pagesIndex >= pagesCount)
- {
- return true; //loop is finished
- }
-
- var page = pagesList[pagesIndex];
-
- logDiv.append($('<div>' + mxResources.get('confAPageFoundFetch', [AC.htmlEntities(page.title)]) + '...</div>'));
-
- getPageContent(page.id, loadPageSuccess, loadPageError);
-
- return false;
- };
-
- function pageProcessed()
- {
- pagesIndex++;
-
- if (processPage())
- {
- logDiv.append($('<div>' + mxResources.get('confAAllDiagDone', [readableName]) + '</div>'));
-
- if (doneFn)
- {
- doneFn();
- }
- }
- };
-
- function loadPageSuccess(page)
- {
- page = JSON.parse(page);
-
- logDiv.append($('<div>' + mxResources.get('confAStartedProcessing', [AC.htmlEntities(page.title)]) + '...</div>'));
-
- var macrosCount = replacePageMacro(page, regExps, processAttFn, function(successfullyConverted, macrosParsed)
- {
- if (successfullyConverted == macrosParsed)
- {
- logDiv.append($('<div>' + mxResources.get('confAAllDiagInPageDone', [readableName, AC.htmlEntities(page.title)]) + '</div>'));
- }
- else
- {
- logDiv.append($('<div>' + mxResources.get('confAPartialDiagDone', [successfullyConverted, macrosParsed, readableName, AC.htmlEntities(page.title)]) + '</div>'));
- }
-
- pageProcessed();
- }, function(resp)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAUpdatePageFailed', [AC.htmlEntities(page.title)]) + '</div>'));
- pageProcessed();
- console.log(resp);
- });
-
- if (macrosCount == 0)
- {
- logDiv.append($('<div>' + mxResources.get('confANoDiagFoundInPage', [readableName, AC.htmlEntities(page.title)]) + '</div>'));
- pageProcessed();
- }
- };
-
- function loadPageError(resp)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAFetchPageFailed') + '</div>'));
- console.log(resp);
- pageProcessed();
- };
-
- //Code starts execution here
- searchContentForMacro(function success()
- {
- if (pagesCount == 0)
- {
- logDiv.append($('<div>' + mxResources.get('confANoDiagFound', [readableName]) + '</div>'));
-
- if (doneFn)
- {
- doneFn();
- }
- }
- else
- {
- processPage();
- }
- }, function error(err)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confASearchFailed', [readableName]) + '</div>'));
- console.log(err);
- });
-};
-
-var GliffyMassImporter = function(logDiv, doneFn)
-{
- var link = document.createElement('a');
- link.href = location.href;
- link.href = link.href; //to have 'host' populated under IE
- var hostUrl = link.protocol + '//' + link.hostname;
- var convertedDiagrams = {};
-
- function importGliffyAtt(pageId, pageType, spaceKey, params, macroId, success, error, skip)
- {
- var attName = params[0];
- var linkedPageId = params[1];
- pageId = linkedPageId || pageId;
-
- if (!attName)
- { //This is a draft diagram that is stored on Gliffy servers and only accessed by 'macroId' and requires authentication
- error({macroId:macroId});
- return;
- }
-
- var diagKey = pageId + '-' + attName;
- logDiv.append($('<div>' + mxResources.get('confAGliffyDiagFound', [AC.htmlEntities(attName), 'Gliffy']) + '...</div>'));
-
- function localSuccess(info)
- {
- var attInfo = {
- name: attName + ".drawio",
- macroId: macroId,
- contentId: info.contentId,
- contentVer: info.contentVer,
- //TODO get the actual width & height
- //TODO It works with this hardcoded number, but it is better to get the actual value
- width: 500,
- height: 500
- };
-
- if (linkedPageId != null)
- {
- attInfo.isInc = true;
- attInfo.pageId = linkedPageId;
-
- logDiv.append($('<div>' + mxResources.get('confAGliffyDiagImported', [AC.htmlEntities(attName), 'Gliffy (Linked)']) + '</div>'));
- }
- else
- {
- attInfo.revision = info.revision;
- attInfo.previewPng = attName + ".png";
-
- logDiv.append($('<div>' + mxResources.get('confAGliffyDiagImported', [AC.htmlEntities(attName), 'Gliffy']) + '</div>'));
- }
-
- success(attInfo);
- };
-
- function convertDiagram()
- {
- //Get the latest version (no version parameter)
- AP.request({
- url: "/download/attachments/" + pageId + "/"
- + encodeURIComponent(attName.trim()), //Conf removes spaces from attachments file names
- success: function(resp)
- {
- var blob = new Blob([resp], {type : 'application/json'});
-
- var formData = new FormData();
- formData.append('format', 'xml');
- formData.append("upfile", blob);
-
- var xhr = new XMLHttpRequest();
- xhr.open('POST', hostUrl + '/import');
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == 4)
- {
- if (xhr.status >= 200 && xhr.status <= 299 &&
- xhr.responseText.substring(0, 13) == '<mxGraphModel')
- {
- //upload draw.io xml as an attachment and also generate the preview image
- var xml = xhr.responseText;
- AC.saveDiagram(pageId, attName + ".drawio", xml,
- function(resp)
- {
- resp = JSON.parse(resp);
- var revision = resp.results[0].version.number;
-
- //Add custom content
- AC.saveCustomContent(spaceKey, pageId, pageType, attName + ".drawio", attName + ".drawio", revision, null, null,
- function(responseText)
- {
- var content = JSON.parse(responseText);
-
- var info = {
- revision: revision,
- contentId: content.id,
- contentVer: content.version.number
- };
-
- convertedDiagrams[diagKey] = info;
- localSuccess(info);
- }, function(err)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confASavingImpGliffyFailed', [AC.htmlEntities(attName), 'Gliffy']) + '</div>'));
- console.log(err);
- error({macroId:macroId});
- });
- }, function(err)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confASavingImpGliffyFailed', [AC.htmlEntities(attName), 'Gliffy']) + '</div>'));
- console.log(err);
- error({macroId:macroId});
- }, false, 'application/vnd.jgraph.mxfile', mxResources.get('confAImportedFromByDraw', [attName]));
- }
- else
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAImportGliffyFailed', [AC.htmlEntities(attName), 'Gliffy']) + '</div>'));
- console.log(xhr.status, xhr.responseText);
- error({macroId:macroId});
- }
- }
- };
-
- xhr.send(formData);
- },
- error: function(resp)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAFetchGliffyFailed', [AC.htmlEntities(attName), 'Gliffy']) + '</div>'));
- console.log(resp);
- error({macroId:macroId});
- }
- });
- };
-
- var info = convertedDiagrams[diagKey];
-
- if (info === true) //Pending, wait
- {
- var trials = 0;
-
- function waitForConversion()
- {
- trials++;
- info = convertedDiagrams[diagKey];
-
- if (info !== true)
- {
- localSuccess(info)
- }
- else if (trials < 15) //4.5 second wait, during test. It took about 2 sec
- {
- setTimeout(waitForConversion, 300);
- }
- else
- {
- //Try conversion again in case an error occured
- convertDiagram();
- }
- }
-
- setTimeout(waitForConversion, 300);
- }
- else if (info != null)
- {
- //Diagram is already converted, so directly convert the macro
- localSuccess(info);
- }
- else
- {
- convertedDiagrams[diagKey] = true;
- convertDiagram();
- }
- };
-
- logDiv.html("<br>");
-
- MassDiagramsProcessor('gliffy', 'Gliffy', ['name', 'pageid'], importGliffyAtt, logDiv, doneFn);
-};
-
-function cleanBrokenCustomContents(logDiv, callback, error)
-{
- logDiv.append($('<div>' + mxResources.get('confACheckBrokenDiagLnk') + '</div>'));
-
- var customContent2Del = [];
- var pagesAttachments = {};
- var itemsToProcess = 0;
- var processedItems = 0;
- var allChunksDone = false;
- var pendingCallbacks = {};
- var pageCustomContents = {};
- var customContentsMap = {};
-
- function checkDelDone()
- {
- processedItems++;
-
- if (processedItems == itemsToProcess)
- {
- callback(pageCustomContents, customContentsMap);
- }
- };
-
- function addToPage(pageId, contentId, contentVer, diagramName)
- {
- if (pageCustomContents[pageId] == null)
- {
- var obj = {};
- obj[diagramName] = {id: contentId, ver: contentVer};
- pageCustomContents[pageId] = obj;
- }
- else if (pageCustomContents[pageId][diagramName] && pageCustomContents[pageId][diagramName].id != contentId) //Sometimes, search returns duplicate entries!
- {
- customContent2Del.push({id: contentId, name: diagramName, duplicate: true});
- return false;
- }
- else
- {
- pageCustomContents[pageId][diagramName] = {id: contentId, ver: contentVer};
- }
-
- return true;
- };
-
- function checkDone(panic)
- {
- function deleteAtt(id, name, duplicate)
- {
- logDiv.append($('<div>' + mxResources.get('confADelDiagLinkOf', [name]) + (duplicate? ' ' + mxResources.get('confADupLnk') : '') + '.</div>'));
-
- AP.request({
- type: 'DELETE',
- url: '/rest/api/content/' + id,
- contentType: 'application/json;charset=UTF-8',
- success: checkDelDone,
- error: function()
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confADelDiagLnkFailed', [name]) + '</div>'));
- checkDelDone(); //Consider error as done also as we cannot do something else
- }
- });
- };
-
- if (panic || (allChunksDone && processedItems == itemsToProcess))
- {
- processedItems = 0;
- itemsToProcess = customContent2Del.length;
-
- if (itemsToProcess > 0)
- {
- //delete collected broken custom contents then callback
- for (var i = 0; i < customContent2Del.length; i++)
- {
- var c2del = customContent2Del[i];
- deleteAtt(c2del.id, c2del.name, c2del.duplicate);
- }
- }
- else
- {
- //if nothing needs to be deleted, callback directly
- callback(pageCustomContents, customContentsMap);
- }
- }
- };
-
- function collectAtts(pageId, callback, error, start, atts)
- {
- //first call
- if (start == null)
- {
- start = 0;
-
- if (typeof(pendingCallbacks[pageId]) === 'undefined')
- {
- atts = {};
- pendingCallbacks[pageId] = [callback];
- }
- else //Another call for the same page before getting the response
- {
- pendingCallbacks[pageId].push(callback); //data race?
- return;
- }
- }
-
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + pageId + '/child/attachment?limit=100&expand=version&start=' + start,
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- for (var i = 0; i < resp.results.length; i++)
- {
- var obj = resp.results[i];
- atts[obj.title] = obj.version.number;
- }
-
- //Support pageing
- if (resp._links && resp._links.next)
- {
- start += resp.limit; //Sometimes the limit is changed by the server
- collectAtts(pageId, callback, error, start, atts);
- }
- else
- {
- pagesAttachments[pageId] = atts;
-
- for (var i = 0; i < pendingCallbacks[pageId].length; i++)
- {
- pendingCallbacks[pageId][i]();
- }
-
- delete pendingCallbacks[pageId];
- }
- },
- error: function(err)
- {
- //If not found, mark this page as not found
- if (err.status == 404)
- {
- pagesAttachments[pageId] = false;
-
- for (var i = 0; i < pendingCallbacks[pageId].length; i++)
- {
- pendingCallbacks[pageId][i]();
- }
-
- delete pendingCallbacks[pageId];
- }
- else
- {
- //All other errors are unexpected and will stop the process
- error(err);
- }
- }
- });
- };
-
- function processChunk(start)
- {
- AP.request({
- url: '/rest/api/content/search?cql=' + encodeURIComponent('type="ac:com.mxgraph.confluence.plugins.diagramly:drawio-diagram"') + '&limit=50&expand=body.storage,version&start=' + start,
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var list = resp.results;
-
- if (list)
- {
- list = list.filter(function(cc)
- {
- return cc.status != 'trashed'; //remove trashed custom content
- });
-
- itemsToProcess += list.length;
-
- //Check each item in the list
- for (var i = 0; i < list.length; i++)
- {
- try
- {
- (function(attInfo, contentId, contentVer)
- {
- if (!addToPage(attInfo.pageId, contentId, contentVer, attInfo.diagramName))
- {
- processedItems++;
- checkDone();
- return; //No need to check as it is a duplicate
- }
-
-
- function checkAtt(pageAtts)
- {
- //not found or wrong version
- if (pageAtts == false || pageAtts[attInfo.diagramName] == null || pageAtts[attInfo.diagramName] < attInfo.version)
- {
- customContent2Del.push({id: contentId, name: attInfo.diagramName});
- }
- else
- {
- customContentsMap[contentId] = attInfo;
- }
-
- processedItems++;
- checkDone();
- };
-
- var pageAtts = pagesAttachments[attInfo.pageId];
-
- if (pageAtts != null)
- {
- checkAtt(pageAtts);
- }
- else
- {
- //fetch page attachments
- collectAtts(attInfo.pageId, function()
- {
- checkAtt(pagesAttachments[attInfo.pageId]);
- }, function(err)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAUnexpErrProcessPage', [attInfo.pageId]) + '.</div>'));
- console.log(err);
-
- checkDone(true);
- });
- }
- })(JSON.parse(decodeURIComponent(list[i]["body"]["storage"]["value"])), list[i].id, list[i].version.number);
- }
- catch(e)
- {
- //ignore, this should not happen! But, if it happens, it means a corrupted custom content. Just delete it
- console.log(e);
- customContent2Del.push({id: list[i].id, name: list[i].title});
- processedItems++;
- checkDone();
- }
- }
- }
-
- checkDone();
-
- //Support pageing
- if (resp._links && resp._links.next)
- {
- start += resp.limit; //Sometimes the limit is changed by the server
- processChunk(start);
- }
- else
- {
- allChunksDone = true;
- checkDone();
- }
- },
- error : error
- });
- };
-
- processChunk(0);
-};
-
-var DrawIoDiagramsIndexer = function(logDiv, doneFn)
-{
- var pageCustomContents = {}, customContentsMap = {};
-
- function fixDrawIoCustomContent(pageId, pageType, spaceKey, params, macroId, success, error, skip)
- {
- //['diagramName', 'contentId', 'contentVer', 'revision', 'width', 'height', 'tempPreview', 'zoom', 'lbox', 'diagramDisplayName', 'tbstyle', 'links', 'simple', 'hiResPreview', 'inComment', 'aspect', 'pageId', 'baseUrl', 'diagramUrl', 'includedDiagram', 'aspectHash', 'imgPageId', 'attVer', 'custContentId', 'pCenter']
- var attName = params[0];
- var contentId = params[1] || params[23];
- var contentVer = params[2];
- var revision = params[3];
- var width = params[4];
- var height = params[5];
- var tempPreview = params[6];
- var zoom = params[7];
- var lbox = params[8];
- var diagramDisplayName = params[9];
- var tbstyle = params[10];
- var links = params[11];
- var simple = params[12];
- var hiResPreview = params[13];
- var inComment = params[14];
- var aspect = params[15];
- var macroPageId = params[16];
- var macroBaseUrl = params[17];
- var pCenter = params[24];
-
- logDiv.append($('<div>' + mxResources.get('confADiagFoundIndex', [AC.htmlEntities(attName)]) + '...</div>'));
-
- var attInfo = {
- macroId: macroId,
- name: attName,
- contentId: contentId,
- contentVer: contentVer,
- revision: revision,
- width: width,
- height: height,
- previewPng: tempPreview,
- zoom: zoom,
- lbox: lbox,
- diagramDisplayName: diagramDisplayName,
- tbstyle: tbstyle,
- links: links,
- simple: simple,
- hiResPreview: hiResPreview,
- inComment: inComment,
- aspect: aspect,
- pCenter: pCenter
- };
-
- function addNewCustomContent()
- {
- AC.saveCustomContent(spaceKey, pageId, pageType, attName, attName, revision, null, null,
- function(responseText)
- {
- logDiv.append($('<div>' + mxResources.get('confADiagIndexSucc', [AC.htmlEntities(attName)]) + '</div>'));
-
- var content = JSON.parse(responseText);
-
- attInfo.contentId = content.id;
- attInfo.contentVer = content.version.number;
-
- success(attInfo);
- }, function(err)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAIndexDiagFailed', [AC.htmlEntities(attName)]) + '</div>'));
- console.log(err);
- error(attInfo);
- });
- };
-
- var info = customContentsMap[contentId];
-
- //Copy & Paste macros result in macros that belongs to another page. We can simply skip those macros
- if (macroPageId != pageId)
- {
- logDiv.append($('<div>' + mxResources.get('confASkipDiagOtherPage', [AC.htmlEntities(attName)]) + '</div>'));
- skip(attInfo);
- }
- else if (info == null && pageCustomContents[pageId] != null && pageCustomContents[pageId][attName] != null) //Reuse existing one in case the same diagram is used more than once
- {
- logDiv.append($('<div>' + mxResources.get('confADiagIndexSucc', [AC.htmlEntities(attName)]) + '</div>'));
- var exiting = pageCustomContents[pageId][attName];
- attInfo.contentId = exiting.id;
- attInfo.contentVer = exiting.ver;
- success(attInfo);
- }
- else if (info == null || info.pageId != pageId || info.diagramName != attName || info.version != revision) //Invalid contentId (not found) or invalid content, add it
- {
- addNewCustomContent(); //Add a correct custom content
- }
- else if (macroBaseUrl != baseUrl) //This can happen when the Confluence domain is changed
- {
- logDiv.append($('<div>' + mxResources.get('confADiagIndexSucc', [AC.htmlEntities(attName)]) + '</div>'));
- success(attInfo);
- }
- else
- {
- //nothing needs to be done, just skip
- logDiv.append($('<div>' + mxResources.get('confADiagUptoDate', [AC.htmlEntities(attName)]) + '</div>'));
- skip(attInfo);
- }
- };
-
- logDiv.html("<br>");
-
- //Remove existing custom contents that are broken
- cleanBrokenCustomContents(logDiv, function(pageCustomContents_p, customContentsMap_p)
- {
- pageCustomContents = pageCustomContents_p;
- customContentsMap = customContentsMap_p;
-
- logDiv.append($('<div>' + mxResources.get('done') + '.</div>'));
- logDiv.append($('<div>' + mxResources.get('confACheckPagesWDraw') + '</div>'));
-
- MassDiagramsProcessor('drawio', 'draw.io',
- drawioMacroParams,
- fixDrawIoCustomContent, logDiv, doneFn);
- });
-};
-
-function getAndApplyTranslation(callback)
-{
- AP.user.getLocale(function(locale)
- {
- if (locale != null)
- {
- var dash = locale.indexOf('_');
-
- if (dash >= 0)
- {
- locale = locale.substring(0, dash);
- }
-
- AC.initI18nAsync(locale, function()
- {
- //HTML elements localization
- var i18nElems = document.querySelectorAll('*[data-i18n]'); //get all elements having data-i18n attribute, should be fine given a small html file
-
- for (var i = 0; i < i18nElems.length; i++)
- {
- var i18nKey = i18nElems[i].getAttribute('data-i18n');
- i18nElems[i].innerHTML = AC.htmlEntities(mxResources.get(i18nKey, null, i18nElems[i].innerHTML));
- }
-
- callback();
- });
- }
- else
- {
- callback();
- }
- });
-};
-
-var LucidConnMassImporter = function(docsMap, importExtensionId, logDiv, doneFn)
-{
- var link = document.createElement('a');
- link.href = location.href;
- link.href = link.href; //to have 'host' populated under IE
- var hostUrl = link.protocol + '//' + link.hostname;
-
- function importLucidDoc(pageId, pageType, spaceKey, params, macroId, success, error, skip)
- {
- var docId = params[0];
- var autoSize = params[1];
- var pageCount = params[2];
- var pages = params[3];
- var autoUpdate = params[4]; //TODO How can we get an old version based on the "updated" timestamp?
- var width = params[5];
- var height = params[6];
- var align = params[7];
- var updated = params[8];
-
- var docInfo = docsMap[docId];
- var docName = docInfo? docInfo.text : docId;
- var diagramName = docName + '-' + docId + '.drawio';
- var diagramDisplayName = docName;
-
- logDiv.append($('<div>' + mxResources.get('confAGliffyDiagFound', [AC.htmlEntities(docName), 'Lucidchart']) + '...</div>'));
-
- chrome.runtime.sendMessage(importExtensionId, {msg: 'fileContent', docId: docId}, function(resp)
- {
- if (resp.error)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAImportGliffyFailed', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- error({macroId:macroId});
- }
- else
- {
- try
- {
- var drawXML = LucidImporter.importState(resp.content);
- var pageIndex = pages? parseInt(pages) : 1;
- var imgWidth = autoSize == 1? null : width;
- var imageData = null, imageType = null;
-
- chrome.runtime.sendMessage(importExtensionId,
- {msg: 'fileImage', docId: docId, pageId: pageIndex <= pageCount? (pageIndex - 1) : 0, width: imgWidth}, function(resp)
- {
- //If image failed, just warn. No need to skip this file
- if (resp.error)
- {
- logDiv.append($('<div style="color:orange">' + mxResources.get('confASavingLucidDiagImgFailed', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- }
- else
- {
- imageData = resp.content;
- var p = resp.content.indexOf('base64,');
- imageData = resp.content.substring(p + 7); //7 is the length of "base64,"
- imageType = resp.content.substring(5, p-1); //5 is the length of "data:"
- }
-
- AC.saveDiagram(pageId, diagramName, drawXML,
- function(resp)
- {
- resp = JSON.parse(resp);
-
- var attInfo = {
- name: diagramName,
- diagramDisplayName: diagramDisplayName,
- revision: resp.results[0].version.number,
- macroId: macroId,
- width: autoSize == 1? null : width,
- height: autoSize == 1? null : height,
- pCenter: align == 'center'? 1 : null,
- aspect: pages? ((pageIndex - 1) + ' 1') : null
- };
-
- //Add custom content
- AC.saveCustomContent(spaceKey, pageId, pageType, diagramName, diagramDisplayName, attInfo.revision, null, null,
- function(responseText)
- {
- var content = JSON.parse(responseText);
-
- attInfo.contentId = content.id;
- attInfo.contentVer = content.version.number;
-
- if (imageData != null)
- {
- AC.saveDiagram(pageId, diagramName + '.png', AC.b64toBlob(imageData, imageType),
- function()
- {
- logDiv.append($('<div>' + mxResources.get('confALucidDiagImgImported', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- logDiv.append($('<div>' + mxResources.get('confAGliffyDiagImported', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- success(attInfo);
- }, function()
- {
- logDiv.append($('<div style="color:orange">' + mxResources.get('confASavingLucidDiagImgFailed', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- success(attInfo);
- }, false, 'image/png', mxResources.get('drawPrev'));
- }
- else
- {
- logDiv.append($('<div>' + mxResources.get('confAGliffyDiagImported', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- success(attInfo);
- }
- }, function(err)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confASavingImpGliffyFailed', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- console.log(err);
- error({macroId:macroId});
- });
-
- }, function(err)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confASavingImpGliffyFailed', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- console.log(err);
- error({macroId:macroId});
- }, false, 'application/vnd.jgraph.mxfile', mxResources.get('confAImportedFromByDraw', [docName]));
- });
- }
- catch(e)
- {
- console.log(e);
- logDiv.append($('<div style="color:red">' + mxResources.get('confAImportGliffyFailed', [AC.htmlEntities(docName), 'Lucidchart']) + '</div>'));
- error({macroId:macroId});
- }
- }
- });
- };
-
- logDiv.html("<br>");
-
- MassDiagramsProcessor('lucidchart', 'Lucidchart',
- ['documentId', 'autoSize', 'pageCount', 'pages', 'autoUpdate', 'width', 'height', 'align', 'updated'],
- importLucidDoc, logDiv, doneFn);
-};
diff --git a/src/main/webapp/connect/confluence/config.html b/src/main/webapp/connect/confluence/config.html
deleted file mode 100644
index 75fbcf5c..00000000
--- a/src/main/webapp/connect/confluence/config.html
+++ /dev/null
@@ -1,171 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="UTF-8">
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
- <script src="//aui-cdn.atlassian.com/aui-adg/6.0.4/js/aui.min.js"></script>
- <script src="prism/prism.js"></script>
- <script src="prism/bililiteRange.js"></script>
- <script src="prism/bililiteRange.undo.js"></script>
- <script src="prism/bililiteRange.util.js"></script>
- <script src="prism/bililiteRange.fancytext.js"></script>
-
- <script src="connectUtils-1-4-8.js" type="text/javascript"></script>
- <script src="admin.js" type="text/javascript"></script>
- <script src="config.js" type="text/javascript"></script>
- <link rel="stylesheet" type="text/css" href="//aui-cdn.atlassian.com/aui-adg/6.0.4/css/aui.css">
- <link rel="stylesheet" type="text/css" href="prism/prism.css" />
- <style type="text/css">
- code:focus {
- outline: none;
- }
- .upload-btn-wrapper {
- position: relative;
- overflow: hidden;
- display: inline-block;
- }
-
- .upload-btn-wrapper input[type=file] {
- font-size: 100px;
- position: absolute;
- left: 0;
- top: 0;
- opacity: 0;
- }
- table {
- border: 1px solid #eee;
- text-align: left;
- border-collapse: collapse;
- border-spacing: 0;
- }
-
- table td, th{
- border: 1px solid #999;
- padding-left: 4px;
- }
- </style>
- </head>
- <body class="aui-layout aui-theme-default" style="background-color:rgb(255, 255, 255);">
- <div class="aui-tabs horizontal-tabs">
- <ul class="tabs-menu">
- <li class="menu-item active-tab">
- <a href="#configTab"><strong data-i18n="drawConfig">draw.io Configuration</strong></a>
- </li>
- <li class="menu-item" id="cLibTabHeader" style="display: none">
- <a href="#cLibsTab"><strong data-i18n="customLib">Custom Libraries</strong></a>
- </li>
- <li class="menu-item" id="cTempTabHeader" style="display: none">
- <a href="#cTempTab"><strong data-i18n="customTemp">Custom Templates</strong></a>
- </li>
- <li class="menu-item">
- <a href="#pageIdsTab"><strong data-i18n="pageIdsExp">Page IDs Export</strong></a>
- </li>
- <li class="menu-item">
- <a href="#pageIdsImportTab"><strong data-i18n="pageIdsImp">Page IDs Import</strong></a>
- </li>
- <li class="menu-item">
- <a href="#reindexingTab"><strong data-i18n="drawReindex">draw.io re-indexing (Beta)</strong></a>
- </li>
- </ul>
- <div class="tabs-pane active-pane" id="configTab">
- <br>
- <h4 data-i18n="drawConfig">draw.io Configuration</h4>
- <div id="busyIndicator">
- <img src="/images/spin.gif"> <span data-i18n="working">Working</span>...
- </div>
- <div id="createSpace" style="display: none;">
- <br>
- <span data-i18n="drawConfigNotFoundInst">draw.io Configuration Space (DRAWIOCONFIG) does not exist. This space is needed to store draw.io configuration files and custom libraries/templates.</span>
- <br>
- <div>
- <br>
- <button id="createConfSpaceBtn" disabled="disabled" class="aui-button aui-button-primary" data-i18n="createConfSp">Create Config Space</button>
- </div>
- </div>
- <div id="confError" style="display: none; color: #bb0000" data-i18n="unexpErrRefresh">
- Unexpected error, please refresh the page and try again.
- </div>
- <div id="manageConfig" style="display: none;">
- <br>
- <span data-i18n="configJSONInst">Write draw.io JSON configuration in the editor below then click save. If you need help, please refer to</span> <a href="https://desk.draw.io/support/solutions/articles/16000058316" target="_blank" data-i18n="thisPage">this page</a>.
- <br>
- <div id="jsonMsg">&nbsp;</div>
- <pre class="line-numbers language-json" style="height: 400px"><code contenteditable="true" id="configJSON" class="language-json" style="height: 100%; width: 100%; display: block"></code></pre>
- <div>
- <button id="saveConfigBtn" class="aui-button aui-button-primary" data-i18n="save">Save</button>
- </div>
- </div>
- </div>
- <div class="tabs-pane" id="cLibsTab">
- <br>
- <h4 data-i18n="curCustLib">Current Custom Libraries</h4>
- <br>
- <table id="curLibs" style="box-sizing: border-box; max-width: 100%">
- <tr>
- <th style="min-width: 400px" data-i18n="libName">Library Name</th>
- <th style="width: 47px" data-i18n="action">Action</th>
- <th data-i18n="drawConfID">draw.io Config ID</th>
- </tr>
- </table>
- <div><br><span data-i18n="addLibInst">Click the "Add Library" button to upload a new library.</span></div>
- <div>
- <div id="cLibMsg">&nbsp;</div>
- <div class="upload-btn-wrapper">
- <button class="aui-button aui-button-primary" data-i18n="addLib">Add Library</button>
- <input type="file" id="uploadLib" />
- </div>
- </div>
- </div>
- <div class="tabs-pane" id="cTempTab">
- <br>
- <h4 data-i18n="customTemp">Custom Templates</h4>
- <br>
- <div>
- <span data-i18n="customTempInst1">Custom Templates are draw.io diagrams saved in children pages of</span> <a id="tempPageLnk" target="_blank" data-i18n="tempsPage">Templates page</a>. <br>
- <span data-i18n="customTempInst2">For more details, please refer to</span> <a href="https://desk.draw.io/" target="_blank" data-i18n="thisPage">this page</a>.
- </div>
- </div>
- <div class="tabs-pane" id="pageIdsTab">
- <div><br><span data-i18n="pageIdsExpInst1">Select export target, then click the "Start Export" button to export all page IDs.</span><br>
- <span data-i18n="pageIdsExpInst2">Please note that the export procedure will take some time and the browser window must remain open until the export is completed.</span></div>
- <br>
- <div>
- <span style="font-weight: bold;" data-i18n="pageIdsExpTrg">Export target</span>:<br>
- <input type="radio" value="cloud" name="expTrg" id="expTrgCloud" checked="checked"><label for="expTrgCloud">Cloud</label>
- <input type="radio" value="server" name="expTrg" id="expTrgServer"><label for="expTrgServer">Server</label>
- <input type="radio" value="dc" name="expTrg" id="expTrgDC"><label for="expTrgDC">Data Center</label>
- </div>
- <div style="padding-bottom:4px;">
- <br><button id="exportBtn" disabled="disabled" class="aui-button aui-button-primary" data-i18n="startExp">Start Export</button>
- <img id="busyIcon" src="/images/spin.gif" style="display: none">
- <span id="idExportInfo"></span>
- <div id="idExportErrors" style="color: red"></div>
- </div>
- <textarea id="exportResult" style="width:800px; height: 300px"></textarea>
- <br><a id="pageIdsDownload" style="display: none; cursor: pointer;" data-i18n="download">Download</a>
- </div>
- <div class="tabs-pane" id="pageIdsImportTab">
- <div><br><span data-i18n="pageIdsImpInst1">After importing a space from another cloud/server instance or migrating from a cloud/server instance. Use "Page IDs Export" on that instance (the source), download the "pageIds.csv" file, then use this tool to complete the import process.</span><br><br>
- <span data-i18n="pageIdsImpInst2">Click "Start Import" button to upload the "pageIds.csv" file to this tool and start the import process. Please note that the import procedure will take some time and the browser window must remain open until the import is completed.</span></div>
- <div style="padding-bottom:4px;">
- <br>
- <button id="importBtn" disabled="disabled" class="aui-button aui-button-primary" data-i18n="startImp">Start Import</button>
- <img id="PIBusyIcon" src="/images/spin.gif" style="display: none">
- <span id="idImportInfo"></span>
- <div id="idImportErrors" style="color: red"></div>
- </div>
- <div id="pageIdsImportLog"><br></div>
- </div>
- <div class="tabs-pane" id="reindexingTab">
- <br>
- <h4 data-i18n="refreshDrawIndex">Refresh draw.io Diagrams Index</h4>
- <div><br><span data-i18n="reindexInst1">Click the "Start Indexing" button to refresh draw.io diagrams index.</span><br>
- <span data-i18n="reindexInst2">Please note that the indexing procedure will take some time and the browser window must remain open until the indexing is completed.</span></div>
- <div><br><button id="indexBtn" disabled="disabled" class="aui-button aui-button-primary" data-i18n="startIndexing">Start Indexing</button>
- <img id="DRIbusyIcon" src="/images/spin.gif" style="display: none">
- </div>
- <div id="operationLog"><br></div>
- </div>
- </div>
- </body>
-</html>
diff --git a/src/main/webapp/connect/confluence/config.js b/src/main/webapp/connect/confluence/config.js
deleted file mode 100644
index 1b47a921..00000000
--- a/src/main/webapp/connect/confluence/config.js
+++ /dev/null
@@ -1,1750 +0,0 @@
-//Logs uncaught errors
-window.onerror = function(message, url, linenumber, colno, err)
-{
- message = 'Confluence Cloud Config: ' + ((message != null) ? message : '');
-
- AC.logError(message, url, linenumber, colno, err);
-};
-
-
-function restrictContentToAdmins(contentId)
-{
- AP.user.getCurrentUser(function(user)
- {
- AP.request({
- type: 'PUT',
- url: '/rest/api/content/' + contentId + '/restriction',
- contentType: 'application/json;charset=UTF-8',
- data: JSON.stringify([{
- "operation": "update",
- "restrictions": {
- "user": [
- {
- "type": "known",
- "accountId": user.atlassianAccountId
- }
- ],
- "group": [
- {
- "type": "group",
- "name": "administrators"
- },
- {
- "type": "group",
- "name": "site-admins"
- }
- ]
- }
- }
- ]),
- error: function(err)
- {
- AC.logError('Confluence Cloud Config: Error in setting restrictions ' + err.responseText);
- }
- });
- });
-};
-
-var collectAllPages = function(callback, error)
-{
- var start = 0, limit = 200;
- var pages = [];
-
- function getChunck()
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/content?start=' + start + '&limit=' + limit,
- contentType: 'application/json;charset=UTF-8',
- success: function(resp) {
- var resp = JSON.parse(resp);
-
- for (var i = 0; i < resp.results.length; i++)
- {
- pages.push({
- id: resp.results[i].id,
- title: resp.results[i].title,
- type: resp.results[i].type,
- spaceKey: AC.getSpaceKey(resp.results[i]._expandable? resp.results[i]._expandable.space : '')
- });
- }
-
- //Support pageing
- if (resp._links && resp._links.next)
- {
- start += resp.limit; //Sometimes the limit is changed by the server
- getChunck();
- }
- else
- {
- callback(pages);
- }
- },
- error: error
- });
- };
-
- getChunck();
-};
-
-var exportPageIds = function(exportTxt)
-{
- $('#busyIcon').show();
- var idExportInfo = $('#idExportInfo');
- var errors = [];
- var quoteCharRegex = /\"/g;
-
- function convertMimeType(doneFn)
- {
- idExportInfo.html('Processing draw.io diagrams...');
-
- collectDrawAtts(function(attList)
- {
- var doneIndex = 0;
- var PARTITION_SIZE = 5;
-
- //Process macros 5 (PARTITION_SIZE) at a time to throttle the process
- function processPartition(limit)
- {
- function partitionDone()
- {
- doneIndex++;
-
- if (attList.length != limit && doneIndex == limit)
- {
- processPartition(limit + PARTITION_SIZE);
- }
- else if (attList.length == limit)
- {
- //Repeat twice since the API return duplicate entries!!
- if (doneFn)
- {
- idExportInfo.html('Processing draw.io diagrams is done.');
- doneFn(mimeConversionDone);
- }
- }
- };
-
-
- limit = Math.min(attList.length, limit);
-
- if (attList.length == 0)
- {
- partitionDone();
- }
-
- for (var i = doneIndex; i < limit; i++)
- {
- var att = attList[i];
- idExportInfo.html('Checking ' + att.title + '...');
-
- att.metadata.mediaType = 'application/vnd.jgraph.mxfile';
-
- AP.request({
- type: 'PUT',
- url: '/rest/api/content/' + att.container.id + '/child/attachment/' + att.id,
- data: JSON.stringify({
- id: att.id,
- version: att.version,
- type: 'attachment',
- metadata: att.metadata
- }),
- contentType: 'application/json;charset=UTF-8',
- success: partitionDone,
- error: function()
- {
- errors.push(mxResources.get('confAErrCheckDrawDiag'));
- partitionDone();
- }
- });
- };
- }
-
- processPartition(PARTITION_SIZE);
- },
- function()
- {
- errors.push(mxResources.get('confAErrFetchDrawList'));
- });
- };
-
- //Code adapted from EditorUi.prototype.doSaveLocalFile
- function downloadTxtFile(data, filename)
- {
- var mimeType = 'text/plain';
-
- // Newer versions of IE
- if (window.Blob && navigator.msSaveOrOpenBlob)
- {
- var blob = new Blob([data], {type: mimeType});
- navigator.msSaveOrOpenBlob(blob, filename);
- }
- else
- {
- var a = document.createElement('a');
-
- // Workaround for mxXmlRequest.simulate no longer working in PaleMoon
- // if this is used (ie PNG export broken after XML export in PaleMoon)
- // and for "WebKitBlobResource error 1" for all browsers on iOS.
- var useDownload = (navigator.userAgent == null ||
- navigator.userAgent.indexOf("PaleMoon/") < 0) &&
- typeof a.download !== 'undefined';
-
- // Workaround for Chromium 65 cross-domain anchor download issue
- if (mxClient.IS_GC && navigator.userAgent != null)
- {
- var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)
- var vers = raw ? parseInt(raw[2], 10) : false;
- useDownload = vers == 65 ? false : useDownload;
- }
-
- if (useDownload)
- {
- a.href = URL.createObjectURL(new Blob([data], {type: mimeType}));
- a.download = filename;
- document.body.appendChild(a);
-
- try
- {
- window.setTimeout(function()
- {
- URL.revokeObjectURL(a.href);
- }, 20000);
-
- a.click();
- a.parentNode.removeChild(a);
- }
- catch (e)
- {
- // ignore
- }
- }
- else
- {
- alert('Your browser does not support file download');
- }
- }
- };
-
-
- function mimeConversionDone()
- {
- var exportStr = 'cloud;\nbaseUrl=' + baseUrl + ';\n';
-
- function safe(str)
- {
- if (typeof str === 'undefined' || str === null)
- return '';
-
- str = str.replace(quoteCharRegex, '""');
-
- var needsQuotes = str.indexOf('"') > -1
- || str.indexOf('\n') > -1
- || str.indexOf('\r') > -1
- || str.indexOf(';') > -1
- || str.indexOf(',') > -1
- || str.charAt(0) === ' '
- || str.charAt(str.length - 1) === ' ';
-
- return needsQuotes ? '"' + str + '"' : str;
- }
-
- collectAllPages(function(pages)
- {
- for (var i = 0; i < pages.length; i++)
- {
- exportStr += pages[i].id + ',' + safe(pages[i].title) + ',' + pages[i].spaceKey + ';\n';
- }
-
- exportTxt.val(exportStr);
-
- $('#pageIdsDownload').show();
- $('#pageIdsDownload').click(function()
- {
- downloadTxtFile(exportStr, 'pageIds.csv');
- });
-
- if (errors.length > 0)
- {
- $('#idExportErrors').html(errors.join('<br>'));
- }
-
- $('#busyIcon').hide();
- }, function()
- {
- errors.push(mxResources.get('confAErrFetchPageList'));
- exportTxt.val(exportStr + '\n\n' + mxResources.get('confAErrOccured'));
- });
- };
-
- //Cloud import doesn't need mimeType fixing
- if ($('#expTrgCloud').is(':checked'))
- {
- mimeConversionDone();
- }
- else
- {
- //Repeat twice since the API return duplicate entries!!
- convertMimeType(convertMimeType);
- }
-};
-
-function showError()
-{
- $('#confError').show();
- $('#createSpace').hide();
-};
-
-var configPageId = null;
-var libsPageId = null;
-var CONFIG_FILENAME = 'configuration.json';
-
-function getConfigFile(callback, error)
-{
- AP.request({
- url: '/download/attachments/' + configPageId + '/' + encodeURIComponent(CONFIG_FILENAME),
- success: callback,
- error : error
- });
-};
-
-function createAttFile(pageId, filename, mimeType, content, callback, error, checkExist)
-{
- function doCreateFile()
- {
- var attFile = new Blob([content], {type : mimeType});
- attFile.name = filename;
-
- var reqData = {file: attFile, minorEdit: true};
-
- AP.request({
- type: 'PUT',
- data: reqData,
- url: '/rest/api/content/' + pageId + '/child/attachment',
- contentType: 'multipart/form-data',
- success: callback,
- error: error
- });
- };
-
- //check file exists
- if (checkExist)
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + pageId + '/child/attachment',
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var found = false;
-
- for (var i = 0; i < resp.results.length; i++)
- {
- var item = resp.results[i];
-
- if (item.title == filename)
- {
- found = true;
- break;
- }
- }
-
- if (!found)
- {
- doCreateFile();
- }
- else
- {
- callback(true);
- }
- },
- error: error
- });
- }
- else
- {
- doCreateFile();
- }
-};
-
-var lastConfigVersion = 1;
-
-function checkConfigAndSave()
-{
- var editor = document.querySelector('#configJSON');
- editor.parentNode.removeAttribute('data-line');
- var content = editor.textContent;
- $('#jsonMsg').css('color', '#000000').html('<img src="/images/spin.gif"> ' + mxResources.get('saving') + '...');
-
- try
- {
- if (content != null && content.trim().length > 0)
- {
- var config = JSON.parse(content);
-
- // is user didn't set version manually or forgot to increase - increase it
- if (!config.version || config.version <= lastConfigVersion)
- {
- lastConfigVersion = lastConfigVersion + 0.1;
- config.version = Number(lastConfigVersion.toFixed(1)).toString();
- content = JSON.stringify(config);
- }
- }
- else
- {
- content = '';
- }
-
- createAttFile(configPageId, CONFIG_FILENAME, 'application/json', content, function(resp)
- {
- $('#jsonMsg').css('color', '#00bb00').html(mxResources.get('savedSucc'));
- }, function()
- {
- $('#jsonMsg').css('color', '#bb0000').html(mxResources.get('confASaveFailedErr'));
- });
- }
- catch(e)
- {
- var errMsg = e.message;
-
- try
- {
- var formatedErrMsg = errMsg, lineNum = -1;
-
- if (errMsg.indexOf('at position') > 0)
- {
- var errPos = parseInt(errMsg.match(/at position(:| )(\d+)/)[2]);
- var txtBefore = content.substring(0, errPos);
- var lineNum = (txtBefore.match(/\n/g) || []).length + 1;
- var lastNL = txtBefore.lastIndexOf('\n');
- var linePos = errPos - (lastNL > 0? lastNL : 0);
-
- formatedErrMsg = errMsg + ' [' + mxResources.get('line') + ' ' + lineNum + ', ' + mxResources.get('character') + ' ' + linePos + ']';
- }
- else if (errMsg.indexOf('at line ') > 0)
- {
- var lineNum = parseInt(errMsg.match(/at line (\d+)/)[1]);
- }
-
- $('#jsonMsg').css('color', '#bb0000').html(formatedErrMsg);
-
- if (lineNum >= 0)
- {
- editor.parentNode.setAttribute('data-line', lineNum);
- Prism.highlightElement(editor);
- editor.parentNode.scrollTo(0, (lineNum - 1) * 20);
- }
- }
- catch(e2)
- {
- $('#jsonMsg').css('color', '#bb0000').html(errMsg);
- }
- }
-};
-
-var fixMissingComponents = function(existingPages)
-{
- var doneCount = 0;
-
- function checkAllDone()
- {
- doneCount++;
-
- if (doneCount == 3)
- {
- getConfigFile(function(configContent)
- {
- //Initialize the editor
- var editor = document.querySelector('#configJSON');
-
- try
- {
- var config = JSON.parse(configContent);
-
- if (config.version)
- {
- lastConfigVersion = parseFloat(config.version);
- }
-
- configContent = JSON.stringify(config, null, 2);
- }
- catch(e) {} //Ignore
-
- editor.textContent = configContent;
- editor = bililiteRange.fancyText(editor, Prism.highlightElement, 50);
-
- // add the undo's
- bililiteRange(editor).undo(0).data().autoindent = true; // init
-
- editor.addEventListener ('keydown', function(evt)
- {
- if (evt.keyCode === 9) // tab key
- {
- // now insert four non-breaking spaces for the tab key
- var editor = evt.target;
- var doc = editor.ownerDocument.defaultView;
- var sel = doc.getSelection();
- var range = sel.getRangeAt(0);
-
- var tabNode = document.createTextNode("\t");
- range.insertNode(tabNode);
-
- range.setStartAfter(tabNode);
- range.setEndAfter(tabNode);
- sel.removeAllRanges();
- sel.addRange(range);
-
- evt.preventDefault(); // this will prevent us from tabbing out of the editor
- }
- // control z
- else if ((evt.ctrlKey || evt.metaKey) && evt.which == 90)
- {
- bililiteRange.undo(evt);
- }
- // control y
- else if ((evt.ctrlKey && evt.which == 89) || (evt.metaKey && evt.shiftKey && evt.which == 90))
- {
- bililiteRange.redo(evt);
- }
-
- $('#jsonMsg').html('&nbsp;');
- });
-
- $('#busyIndicator').hide();
- $('#createSpace').hide();
- $('#manageConfig').show();
- $('#cLibTabHeader').show();
- $('#cTempTabHeader').show();
-
- fetchCustomLibs();
- setupUploadLibrary();
- }, showError);
- }
- };
-
- function createPage(title, desc, callback)
- {
- if (existingPages[title])
- {
- if (callback)
- {
- callback(existingPages[title], true);
- }
- else
- {
- checkAllDone();
- }
- return;
- }
-
- AP.request({
- type: 'POST',
- url: '/rest/api/content',
- contentType: 'application/json;charset=UTF-8',
- data: JSON.stringify({
- space: {
- key: 'DRAWIOCONFIG'
- },
- title: title,
- status: 'current',
- type: 'page',
- body: {
- storage: {
- value: desc,
- representation: 'storage'
- }
- }
- }),
- success: function (resp)
- {
- var pageId = JSON.parse(resp).id;
- restrictContentToAdmins(pageId);
-
- if (callback)
- {
- callback(pageId);
- }
- else
- {
- checkAllDone();
- }
- },
- error: showError
- });
- };
-
- //Note: name shouldn't be translated as we search by page name
- createPage('Configuration', mxResources.get('confAConfPageDesc'), function(pageId, pageExist)
- {
- configPageId = pageId;
- createAttFile(pageId, CONFIG_FILENAME, 'application/json', '{}', checkAllDone, showError, pageExist);
- });
-
- createPage('Libraries', mxResources.get('confALibPageDesc'), function(pageId)
- {
- libsPageId = pageId;
- checkAllDone();
- });
-
- createPage('Templates', mxResources.get('confATempPageDesc'), function(pageId)
- {
- $('#tempPageLnk').attr('href', baseUrl + '/spaces/DRAWIOCONFIG/pages/' + pageId);
- checkAllDone();
- });
-};
-
-var createConfigSpace = function()
-{
- $('#createSpace').html('<img src="/images/spin.gif"> ' + mxResources.get('working') + '...');
-
- AP.request({
- type: 'POST',
- url: '/rest/api/space',
- contentType: 'application/json;charset=UTF-8',
- data: JSON.stringify({
- key: 'DRAWIOCONFIG',
- name: 'draw.io Configuration',
- description: {
- plain: {
- value: mxResources.get('confAConfSpaceDesc'),
- representation: 'plain'
- }
- }
- }),
- success: function ()
- {
- fixMissingComponents({});
- },
- error: showError
- });
-};
-
-function addLibRow(item)
-{
- var libTable = $('#curLibs');
-
- var tr = $('<tr>');
- libTable.append(tr);
- var title = $('<td>');
- tr.append(title);
- title.text(item.title);
- var action = $('<td style="text-align: center;padding: 3px 0 0 0;">')
- tr.append(action);
- var delBtn = $('<img src="/images/delete.png" style="width: 20px;cursor: pointer" title="' + mxResources.get('delete') + '">');
- delBtn.click(function(e)
- {
- if (confirm("Are you sure?"))
- {
- AP.request({
- type: 'DELETE',
- url: '/rest/api/content/' + item.id,
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- tr.remove();
-
- if (libTable.find('td').length == 0)
- {
- $('<div id="noLibMsg">' + mxResources.get('confANoCustLib') + '</div>').insertAfter(libTable);
- }
- },
- error: function()
- {
- alert(mxResources.get('delFailed'));
- }
- });
- }
- });
- action.append(delBtn);
-
- var idTd = $('<td>');
- //This code is from RemoteLibrary. It's better to call that code but it is not available in this page
- var libConfigId = 'R' + encodeURIComponent(JSON.stringify([item.id, item.title, item._links.download]));
- var showConfigIDBtn = $('<button class="aui-button showIDBtn">' + mxResources.get('showID') + '</button>');
- showConfigIDBtn.click(function()
- {
- $('.libConfigID').show();
- $('.showIDBtn').hide();
- });
-
- idTd.append(showConfigIDBtn);
- idTd.append($('<span class="libConfigID" style="display: none">' + libConfigId + '</span>'));
- tr.append(idTd);
-};
-
-function fetchCustomLibs()
-{
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + libsPageId + '/child/attachment',
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.results.length == 0)
- {
- $('<div id="noLibMsg">' + mxResources.get('confANoCustLib') + '</div>').insertAfter('#curLibs');
- }
- else
- {
- for (var i = 0; i < resp.results.length; i++)
- {
- addLibRow(resp.results[i]);
- }
- }
- },
- error: function()
- {
-
- }
- });
-};
-
-function setupUploadLibrary()
-{
- var uploadLib = document.getElementById('uploadLib');
-
- uploadLib.addEventListener("click", function ()
- {
- this.value = null;
- });
-
- uploadLib.addEventListener('change', function (e) {
- var libFile = uploadLib.files[0];
-
- if (libFile.type != 'text/xml')
- {
- $('#cLibMsg').css('color', '#bb0000').html(mxResources.get('confAIncorrectLibFileType'));
- return;
- }
-
- $('#cLibMsg').css('color', '#000000').html('<img src="/images/spin.gif"> ' + mxResources.get('uploading') + '...');
-
- reader = new FileReader();
-
- reader.onload = function(event)
- {
- createAttFile(libsPageId, libFile.name, libFile.type, event.target.result, function(resp)
- {
- if (resp == true)
- {
- $('#cLibMsg').css('color', '#bb0000').html(mxResources.get('confALibExist'));
- }
- else
- {
- $('#noLibMsg').remove();
- addLibRow(JSON.parse(resp).results[0]);
- $('#cLibMsg').css('color', '#00bb00').html(mxResources.get('confAUploadSucc'));
- }
- }, function()
- {
- $('#cLibMsg').css('color', '#bb0000').html(mxResources.get('confAUploadFailErr'));
- }, true);
- }
-
- reader.readAsText(libFile);
- }, false);
-};
-
-function collectDrawAtts(success, error)
-{
- var allTextPlainAtts = [];
- var drawioAtts = [];
- var pngAttMap = {};
- var start = 0, limit = 200;
- var searchUrl = '/rest/api/content/search?cql=' + encodeURIComponent('type=attachment') + '&expand=metadata,container,version'
- //Collect all attachments in the system and filter them into text/plain (old draw.io mime type) and png.
- // Then, if a text/plain attachment has an associated png image, then most probably this is a draw.io diagram
- function getChunck()
- {
- AP.request({
- type: 'GET',
- url: searchUrl + '&start=' + start + '&limit=' + limit,
- contentType: 'application/json;charset=UTF-8',
- success: function(resp) {
- var resp = JSON.parse(resp);
-
- for (var i = 0; i < resp.results.length; i++)
- {
- var att = resp.results[i];
- var mimeType = att.metadata.mediaType;
-
- if (mimeType == 'text/plain')
- {
- allTextPlainAtts.push(att);
- }
- else if (mimeType == 'image/png')
- {
- pngAttMap[att.container.id + '%' + att.title] = true;
- }
- }
-
- //Support pageing
- if (resp._links && resp._links.next)
- {
- start += resp.limit; //Sometimes the limit is changed by the server
- getChunck();
- }
- else
- {
- for (var i = 0; i < allTextPlainAtts.length; i++)
- {
- var att = allTextPlainAtts[i];
-
- if (pngAttMap[att.container.id + '%' + att.title + '.png'])
- {
- drawioAtts.push(att);
- }
- }
-
- success(drawioAtts);
- }
- },
- error: error
- });
- };
-
- getChunck();
-};
-
-function processCustomContents(pagesList, srcToDstMap, custCntMap, impBaseUrl, index, allDone, logDiv)
-{
- if (index >= pagesList.length)
- {
- allDone();
- return;
- }
-
- var pageInfo = pagesList[index];
- var curPageId = pageInfo.id;
- logDiv.append($('<div>' + mxResources.get('confAPrcsDiagInPage', [AC.htmlEntities(pageInfo.name)]) + '...</div>'));
-
- //No need for paging?
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + curPageId + '/child/ac:com.mxgraph.confluence.plugins.diagramly:drawio-diagram?expand=body.storage,version&limit=200',
- contentType: 'application/json;charset=UTF-8',
- success: function(custCnts)
- {
- var custCnts = JSON.parse(custCnts);
- var ccIndex = 0;
-
- function checkDone()
- {
- ccIndex++;
-
- if (custCnts.size <= ccIndex)
- {
- logDiv.append($('<div>' + mxResources.get('confAPrcsDiagInPageDone', [AC.htmlEntities(pageInfo.name)]) + '</div>'));
- processCustomContents(pagesList, srcToDstMap, custCntMap, impBaseUrl, ++index, allDone, logDiv);
- }
- };
-
- if (custCnts.size == 0)
- {
- checkDone();
- }
-
- //build map by spaceKey and title -> id, version
- for (var i = 0; i < custCnts.size; i++)
- {
- (function(custCnt)
- {
- var spaceKey = AC.getSpaceKey(custCnt._expandable? custCnt._expandable.space : '');
-
- if (custCntMap[spaceKey] == null)
- {
- custCntMap[spaceKey] = {};
- }
-
- //Check custom content internal pageId and fix if needed
- var info = JSON.parse(decodeURIComponent(custCnt.body.storage.value));
-
- custCntMap[spaceKey][custCnt.title] = {id: custCnt.id, version: custCnt.version.number, revision: info.version};
-
- if (curPageId != info.pageId)
- {
- logDiv.append($('<div>' + mxResources.get('confAImpDiagram', [AC.htmlEntities(custCnt.title)]) + '...</div>'));
- var custCntObj = custCntMap[spaceKey][custCnt.title];
- info.name = info.diagramName;
- info.pageId = curPageId;
- info.revision = info.version;
-
- processDiagramLinks(info, srcToDstMap, spaceKey, impBaseUrl, function(resp)
- {
- if (resp != null)
- {
- try
- {
- info.version = JSON.parse(resp).results[0].version.number;
- custCntObj.revision = info.version;
- }
- catch(e){} //ignore
- }
-
- AC.saveCustomContent(spaceKey, curPageId, pageInfo.type, info.diagramName, custCnt.title, info.version,
- custCnt.id, custCnt.version.number,
- function(responseText)
- {
- var content = JSON.parse(responseText);
- //Update info
- custCntObj.id = content.id;
- custCntObj.version = content.version.number;
- logDiv.append($('<div>' + mxResources.get('confImpDiagramSuccess', [AC.htmlEntities(custCnt.title)]) + '</div>'));
- checkDone();
- }, function()
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAUpdateDgrmCCFailed', [AC.htmlEntities(custCnt.title)]) + '</div>'));
- checkDone();
- }, info.comments);
- }, function()
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAImpDiagramError', [AC.htmlEntities(custCnt.title)]) + '</div>'));
- checkDone();
- }, logDiv);
- }
- else
- {
- logDiv.append($('<div style="color:orange">' + mxResources.get('confAImpDiagramFailed', [AC.htmlEntities(custCnt.title)]) + '</div>'));
- checkDone();
- }
- })(custCnts.results[i], i);
- }
- },
- error: function()
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAErrPrcsDiagInPage', [AC.htmlEntities(pageInfo.name)]) + '</div>'));
- processCustomContents(pagesList, srcToDstMap, custCntMap, impBaseUrl, ++index, allDone, logDiv);
- }
- });
-};
-
-function processPageIdsImport(pagesList, srcToDstMap, custCntMap, drawioRegExps, incDrawioRegExps, impBaseUrl, index, allDone, logDiv)
-{
- if (index >= pagesList.length)
- {
- allDone();
- return;
- }
-
- var pageInfo = pagesList[index];
- var curPageId = pageInfo.id;
- logDiv.append($('<div>' + mxResources.get('confAPrcsMacrosInPage', [AC.htmlEntities(pageInfo.name)]) + '...</div>'));
-
- function fixDrawIoMacros(pageId, pageType, spaceKey, params, macroId, success, error, skip)
- {
- //['diagramName', 'contentId', 'contentVer', 'revision', 'width', 'height', 'tempPreview', 'zoom', 'lbox', 'diagramDisplayName', 'tbstyle', 'links', 'simple', 'hiResPreview', 'inComment', 'aspect', 'pageId', 'baseUrl']
- //inc-drawio macro specific params
- //'diagramUrl', 'includedDiagram', 'aspectHash', 'imgPageId', 'attVer', 'custContentId'
- //'pCenter'
- var attName = params[0];
- var contentId = params[1] || params[23];
- var contentVer = params[2];
- var revision = params[3];
- var width = params[4];
- var height = params[5];
- var tempPreview = params[6];
- var zoom = params[7];
- var lbox = params[8];
- var diagramDisplayName = params[9];
- var tbstyle = params[10];
- var links = params[11];
- var simple = params[12];
- var hiResPreview = params[13];
- var inComment = params[14];
- var aspect = params[15];
- var macroPageId = params[16];
- var macroBaseUrl = params[17];
-
- var diagramUrl = params[18];
- var isInc = params[19] == '1';
- var aspectHash = params[20];
- var imgPageId = params[21];
- var attVer = params[22];
- var pCenter = params[24];
- logDiv.append($('<div>' + mxResources.get('confAFixingMacro', [AC.htmlEntities(attName)]) + '...</div>'));
-
- var macroCurPageId = srcToDstMap[macroPageId];
- var attInfo = {
- pageId: macroCurPageId || pageId,
- macroId: macroId,
- name: attName,
- contentId: contentId,
- contentVer: contentVer,
- revision: revision,
- width: width,
- height: height,
- previewPng: tempPreview,
- zoom: zoom,
- lbox: lbox,
- diagramDisplayName: diagramDisplayName || attName,
- tbstyle: tbstyle,
- links: links,
- simple: simple,
- hiResPreview: hiResPreview,
- inComment: inComment,
- aspect: aspect,
- diagramUrl: diagramUrl,
- isInc: isInc,
- aspectHash: aspectHash,
- imgPageId: imgPageId,
- attVer: attVer,
- pCenter: pCenter
- };
-
- //If the diagram points to another page, change macro type to inc-drawio
- if (attInfo.pageId != pageId)
- {
- attInfo.isInc = true;
- }
-
- //(macroPageId == null) when a server macro without a pageId is imported
- if (macroPageId == null || (macroCurPageId != null && macroCurPageId != macroPageId))
- {
- var custCntInfo = custCntMap[spaceKey]? custCntMap[spaceKey][attInfo.diagramDisplayName] : null;
-
- if (custCntInfo != null)
- {
- attInfo.contentId = custCntInfo.id;
- attInfo.contentVer = custCntInfo.version;
- attInfo.revision = custCntInfo.revision;
- logDiv.append($('<div>' + mxResources.get('confImpDiagramSuccess', [AC.htmlEntities(attInfo.diagramDisplayName)]) + '</div>'));
- success(attInfo);
- }
- else if (!attInfo.isInc) //Check links and Create a custom content
- {
- processDiagramLinks(attInfo, srcToDstMap, spaceKey, impBaseUrl, function(resp)
- {
- if (resp != null)
- {
- try
- {
- attInfo.revision = JSON.parse(resp).results[0].version.number;
- }
- catch(e){} //ignore
- }
-
- AC.saveCustomContent(spaceKey, attInfo.pageId, pageInfo.type, attInfo.name, attInfo.diagramDisplayName, attInfo.revision,
- null, null,
- function(responseText)
- {
- var content = JSON.parse(responseText);
- //Update info
- attInfo.contentId = content.id;
- attInfo.contentVer = content.version.number;
- logDiv.append($('<div>' + mxResources.get('confImpDiagramSuccess', [AC.htmlEntities(attInfo.diagramDisplayName)]) + '</div>'));
- success(attInfo);
- }, function()
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAUpdateDgrmCCFailed', [AC.htmlEntities(attInfo.diagramDisplayName)]) + '</div>'));
- success(attInfo);
- });
- }, function()
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAImpDiagramError', [AC.htmlEntities(attInfo.diagramDisplayName)]) + '</div>'));
- success(attInfo);
- }, logDiv);
- }
- else
- {
- logDiv.append($('<div>' + mxResources.get('confImpDiagramSuccess', [AC.htmlEntities(attInfo.diagramDisplayName)]) + '</div>'));
- success(attInfo);
- }
- }
- else
- {
- //skip
- logDiv.append($('<div style="color:orange">' + mxResources.get('confAFixingMacroSkipped', [AC.htmlEntities(attName)]) + '</div>'));
- skip(attInfo);
- }
- };
-
- function pageProcessed()
- {
- processPageIdsImport(pagesList, srcToDstMap, custCntMap, drawioRegExps, incDrawioRegExps, impBaseUrl, ++index, allDone, logDiv);
- };
-
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + curPageId + '?expand=body.storage,version',
- contentType: 'application/json;charset=UTF-8',
- success: function(page)
- {
- var page = JSON.parse(page);
-
- replacePageMacro(page, drawioRegExps, fixDrawIoMacros, function(successfullyConverted1, macrosParsed1)
- {
- replacePageMacro(page, incDrawioRegExps, fixDrawIoMacros, function(successfullyConverted, macrosParsed)
- {
- successfullyConverted += successfullyConverted1;
- macrosParsed += macrosParsed1;
-
- if (macrosParsed == 0)
- {
- logDiv.append($('<div>' + mxResources.get('confANoDiagFoundInPage', ['draw.io', AC.htmlEntities(page.title)]) + '</div>'));
- }
- if (successfullyConverted == macrosParsed)
- {
- logDiv.append($('<div>' + mxResources.get('confAAllDiagInPageDone', ['draw.io', AC.htmlEntities(page.title)]) + '</div>'));
- }
- else
- {
- logDiv.append($('<div>' + mxResources.get('confAPartialDiagDone', [successfullyConverted, macrosParsed, 'draw.io', AC.htmlEntities(page.title)]) + '</div>'));
- }
-
- pageProcessed();
- }, function(resp)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAUpdatePageFailed', [AC.htmlEntities(page.title)]) + '</div>'));
- pageProcessed();
- }, true);
- }, function(resp)
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAUpdatePageFailed', [AC.htmlEntities(page.title)]) + '</div>'));
- pageProcessed();
- }, true);
- },
- error: function()
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAErrFetchPage', [AC.htmlEntities(pageInfo.name)]) + '</div>'));
- pageProcessed();
- }
- });
-};
-
-RegExp.escape = function(string)
-{
- return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
-};
-
-function updateGraphModelLinks(xmlDoc, srcToDstMap, spaceKey, srcBaseUrl, attInfo, logDiv)
-{
- //TinyURL
- // In Java: Base64.encodeBase64(longToByteArray(id));
- // https://community.atlassian.com/t5/Confluence-questions/What-is-the-algorithm-used-to-create-the-quot-Tiny-links-quot/qaq-p/186555
- // The long to byte array conversion is taken from this source:
- // https://stackoverflow.com/questions/8482309/converting-javascript-integer-to-byte-array-and-back
- function byteArrayToLong(byteArray)
- {
- var value = 0;
-
- for ( var i = byteArray.length - 1; i >= 0; i--)
- {
- value = (value * 256) + byteArray[i];
- }
-
- return value;
- };
-
- function shortUrlToPageId(shortUrl)
- {
- try
- {
- return byteArrayToLong(atob(shortUrl)
- .split('')
- .map(function (b) { return b.charCodeAt()}));
- }
- catch(e)
- {
- console.log('Failed to decode this short url: ', shortUrl, e);
- return null;
- }
- };
-
- var pageIdFullUrl = /\/pages\/viewpage\.action\?pageId=(\d+)/;
-
- var attachmentFullUrl = /\/download\/attachments\/(\d+)/;
-
- var tinyPageUrl = /\/x\/(\S+)/;
-
- var cloudPageUrl = /\/spaces\/\S+\/pages\/([^\/]+)/;
-
- var ceoLightboxUrl = /ceoId=(.*?)(?=&)/;
-
- function extractPageIdFromFullUrl(link)
- {
- var m = link.match(pageIdFullUrl);
-
- if (m != null)
- {
- return m[1];
- }
-
- var m = link.match(attachmentFullUrl);
-
- if (m != null)
- {
- return m[1];
- }
-
- return null;
- };
-
- function extractPageIdFromTinyUrl(link)
- {
- var m = link.match(tinyPageUrl);
-
- if (m != null)
- {
- var encoded = m[1];
- var pageId = shortUrlToPageId(encoded);
- return pageId != null? String(pageId) : null;
- }
- return null;
- };
-
- function extractPageIdFromCloudUrl(link)
- {
- var m = link.match(cloudPageUrl);
-
- if (m != null)
- {
- return m[1];
- }
- return null;
- };
-
- function getPageIdFromAnyUrl(url)
- {
- var pageId = null;
-
- try
- {
- pageId = extractPageIdFromFullUrl(url);
-
- if (pageId == null)
- {
- pageId = extractPageIdFromTinyUrl(url);
- }
-
- if (pageId == null)
- {
- pageId = extractPageIdFromCloudUrl(url);
- }
- }
- catch(e)
- {
- console.log('Failed to process url: ', url, e);
- }
-
- return pageId;
- };
-
- function extractPageIdFromLightboxUrl(link)
- {
- var m = link.match(ceoLightboxUrl);
-
- if (m != null)
- {
- return m[1];
- }
-
- return null;
- };
-
- function fixLink(link)
- {
- var linkUpdated = false;
-
- if (link != null && link.length != 0)
- {
- var pmm = getPageIdFromAnyUrl(link);
-
- if (pmm != null)
- {
- var curPageId = srcToDstMap[pmm];
-
- if (curPageId != null)
- {
- link = baseUrl + '/spaces/' + encodeURIComponent(spaceKey) + '/pages/' + curPageId;
- logDiv.append($('<div>' + mxResources.get('confAUpdateLnkToPg', [AC.htmlEntities(curPageId), AC.htmlEntities(attInfo.name)]) + '</div>'));
- linkUpdated = true;
- }
- }
- else
- {
- //TODO Add support to lightbox links via custom contents. This requires saving the custom content first without a version
- //[baseUrl]/plugins/servlet/ac/com.mxgraph.confluence.plugins.diagramly/customContentViewer?content.plugin=ac%3Acom.mxgraph.confluence.plugins.diagramly%3Adrawio-diagram&space.key=[spaceKey]&content.id=[contentId]&content.version=[contentVer]&content.type=custom
- var lightboxPageId = extractPageIdFromLightboxUrl(link);
-
- if (lightboxPageId != null)
- {
- var curPageId = srcToDstMap[lightboxPageId];
-
- if (curPageId != null)
- {
- link = link.replace(lightboxPageId, curPageId);
- logDiv.append($('<div>' + mxResources.get('confAUpdateLBLnkToPg', [AC.htmlEntities(curPageId), AC.htmlEntities(attInfo.name)]) + '</div>'));
- linkUpdated = true;
- }
- }
- }
-
- if (link.indexOf(srcBaseUrl) >= 0)
- {
- link = link.replace(new RegExp(RegExp.escape(srcBaseUrl), 'g'), baseUrl);
- logDiv.append($('<div>' + mxResources.get('confAUpdateLnkBase', [AC.htmlEntities(srcBaseUrl), AC.htmlEntities(baseUrl), AC.htmlEntities(attInfo.name)]) + '</div>'));
- linkUpdated = true;
- }
- }
-
- return linkUpdated? link : null;
- };
-
- function fixText(text)
- {
- if (text == null) return null;
-
- var linkUpdated = false;
- var parser = new DOMParser();
- var labelDoc = parser.parseFromString(text, 'text/html');
-
- var els = labelDoc.getElementsByTagName('a');
-
- for (var i = 0; i < els.length; i++)
- {
- var el = els[i];
- var href = null;
-
- try
- {
- href = fixLink(el.getAttribute('href'));
- }
- catch(e)
- {
- console.log(e);
- }
-
- if (href != null)
- {
- el.setAttribute('href', href);
- linkUpdated = true;
- }
- }
-
- return linkUpdated? labelDoc.body.innerHTML : null;
- };
-
- var graph = new Graph();
- var codec = new mxCodec(xmlDoc);
- var model = graph.getModel();
- codec.decode(xmlDoc.documentElement, model);
-
- var linkUpdated = false;
-
- for (var cellId in model.cells)
- {
- var cell = model.cells[cellId];
- var value = model.getValue(cell);
-
- if (value != null)
- {
- if (mxUtils.isNode(value))
- {
- var el = value;
- var text = fixText(el.getAttribute('label'));
-
- if (text != null)
- {
- el.setAttribute('label', text);
- linkUpdated = true;
- }
-
- var link = null;
-
- try
- {
- link = fixLink(el.getAttribute('link'));
- }
- catch(e)
- {
- console.log(e);
- }
-
- if (link != null)
- {
- el.setAttribute('link', link);
- linkUpdated = true;
- }
- }
- else if (typeof(value.toString) == 'function')
- {
- var text = fixText(value.toString());
-
- if (text != null)
- {
- cell.setValue(text);
- linkUpdated = true;
- }
- }
- }
- }
-
- if (linkUpdated)
- {
- var enc = new mxCodec(mxUtils.createXmlDocument());
- return enc.encode(model);
- }
- else
- {
- return null;
- }
-};
-
-function processDiagramLinks(attInfo, srcToDstMap, spaceKey, impBaseUrl, callback, error, logDiv)
-{
- //Used to keep the same attributes for the mxGraphModel
- function copyAttributes(src, dst)
- {
- var attrs = src.attributes;
-
- for(var i = 0; attrs!= null && i < attrs.length; i++)
- {
- dst.setAttribute(attrs[i].name, attrs[i].value);
- }
- };
-
- AP.request(
- {
- url: '/download/attachments/' + attInfo.pageId + '/' + encodeURIComponent(attInfo.name) +
- (attInfo.revision != null ? '?version=' + attInfo.revision : ''),
- success: function(xml)
- {
- try
- {
- var xmlDoc = mxUtils.parseXml(xml);
- var xmlNode = xmlDoc.documentElement;
- var fileChanged = false, fileXml = null;
-
- if (xmlNode.nodeName == 'mxfile')
- {
- var diagrams = xmlNode.getElementsByTagName('diagram');
-
- for (var i = 0; i < diagrams.length; i++)
- {
- var xmlDoc = Editor.parseDiagramNode(diagrams[i]);
-
- if (xmlDoc != null)
- {
- xmlDoc = xmlDoc.ownerDocument;
- }
-
- var newDiagram = updateGraphModelLinks(xmlDoc, srcToDstMap, spaceKey, impBaseUrl, attInfo, logDiv);
-
- if (newDiagram != null)
- {
- fileChanged = true;
- copyAttributes(xmlDoc.documentElement, newDiagram);
- EditorUi.removeChildNodes(diagrams[i]);
- diagrams[i].appendChild(newDiagram);
- }
- }
-
- if (fileChanged)
- {
- fileXml = mxUtils.getXml(xmlNode);
- }
- }
- else
- {
- var newDiagram = updateGraphModelLinks(xmlDoc, srcToDstMap, spaceKey, impBaseUrl, attInfo, logDiv);
-
- if (newDiagram != null)
- {
- fileChanged = true;
- copyAttributes(xmlNode, newDiagram);
- fileXml = mxUtils.getXml(newDiagram);
- }
- }
-
- if (fileChanged)
- {
- AC.saveDiagram(attInfo.pageId, attInfo.name, fileXml, callback, error, false, 'application/vnd.jgraph.mxfile', mxResources.get('drawDiag'), false, false); //We don't support draft pages
- }
- else
- {
- logDiv.append($('<div>' + mxResources.get('confANoLnksInDrgm', [AC.htmlEntities(attInfo.name)]) + '</div>'));
- callback();
- }
- }
- catch(e)
- {
- error();
- console.log('Processing of diagram ' + attInfo.name + ' failed', e);
- }
- },
- error: error
- });
-};
-
-//TODO Import comments from server
-//Page IDs import
-function importPageIds(csvData, logDiv)
-{
- $('#PIBusyIcon').show();
- logDiv.html('<br>');
- //Code from https://gist.github.com/Jezternz/c8e9fafc2c114e079829974e3764db75 and https://stackoverflow.com/questions/1293147/javascript-code-to-parse-csv-data
- function csvStringToArray(strData)
- {
- var objPattern = new RegExp(("(\\,|\\r?\\n|\\r|^)(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|([^\\,\\r\\n]*))"), "gi");
- var arrMatches = null, arrData = [[]];
-
- while (arrMatches = objPattern.exec(strData))
- {
- if (arrMatches[1].length && arrMatches[1] !== ",") arrData.push([]);
-
- arrData[arrData.length - 1].push(arrMatches[2] ?
- arrMatches[2].replace(new RegExp( "\"\"", "g" ), "\"") :
- arrMatches[3]);
- }
-
- return arrData;
- };
-
- function removeLastChar(str)
- {
- return str.substr(0, str.length -1);
- };
-
- try
- {
- var srcPageNamesMap = {}, srcToDstMap = {};
- var lines = csvStringToArray(csvData);
- var fileType = removeLastChar(lines[0][0]);
- var impBaseUrl = removeLastChar(lines[1][0]);
-
- if (impBaseUrl.indexOf('baseUrl=') == 0)
- {
- impBaseUrl = impBaseUrl.substr(8);
- }
- else
- {
- $('#PIBusyIcon').hide();
- logDiv.append($('<div style="color:red">' + mxResources.get('confAInvalidPageIdsFormat') + '</div>'));
- return;
- }
-
- if (fileType == 'cloud' || fileType == 'server')
- {
- for (var i = 2; i < lines.length - 1; i++)
- {
- if (lines[i].length == 3)
- {
- var pageId = lines[i][0],
- pageName = lines[i][1],
- spaceKey = removeLastChar(lines[i][2]);
-
- if (srcPageNamesMap[spaceKey] == null)
- {
- srcPageNamesMap[spaceKey] = {};
- }
-
- srcPageNamesMap[spaceKey][pageName] = pageId;
- }
- else
- {
- logDiv.append($('<div style="color:red">' + mxResources.get('confAInvalidPageIdsFormat') + '</div>'));
- $('#PIBusyIcon').hide();
- return;
- }
- }
-
- var drawioRegExps = getMacroRegExps('drawio', drawioMacroParams);
- var incDrawioRegExps = getMacroRegExps('inc-drawio', drawioMacroParams);
-
- logDiv.append($('<div>' + mxResources.get('confACollectingCurPages') + '...</div>'));
-
- collectAllPages(function(curPages)
- {
- logDiv.append($('<div>' + mxResources.get('confABuildingPagesMap') + '...</div>'));
- var pages = [];
-
- for (var i = 0; i < curPages.length; i++)
- {
- if (srcPageNamesMap[curPages[i].spaceKey] != null)
- {
- var srcPageId = srcPageNamesMap[curPages[i].spaceKey][curPages[i].title];
-
- if (srcPageId != null)
- {
- srcToDstMap[srcPageId] = curPages[i].id;
- pages.push({id: curPages[i].id, type: curPages[i].type, name: curPages[i].title});
- }
- }
- }
-
- var custCntMap = {};
-
- logDiv.append($('<div>' + mxResources.get('confAProcessDrawDiag') + '...</div>'));
- //Fix custom contents first to build its ids map
- processCustomContents(pages, srcToDstMap, custCntMap, impBaseUrl, 0, function()
- {
- logDiv.append($('<div>' + mxResources.get('confAProcessDrawDiagDone') + '</div>'));
- logDiv.append($('<div>' + mxResources.get('confAProcessImpPages') + '</div>'));
-
- processPageIdsImport(pages, srcToDstMap, custCntMap, drawioRegExps, incDrawioRegExps, impBaseUrl, 0, function()
- {
- logDiv.append($('<div>' + mxResources.get('confAPageIdsImpDone') + '</div>'));
- $('#PIBusyIcon').hide();
- }, logDiv);
- }, logDiv);
- }, function()
- {
- $('#PIBusyIcon').hide();
- logDiv.append($('<div style="color:red">' + mxResources.get('confAErrFetchPageList') + '</div>'));
- });
- }
- else
- {
- $('#PIBusyIcon').hide();
- logDiv.append($('<div style="color:red">' + mxResources.get('confAInvalidPageIdsFormat') + '</div>'));
- }
- }
- catch (e)
- {
- $('#PIBusyIcon').hide();
- logDiv.append($('<div style="color:red">' + mxResources.get('confAInvalidPageIdsFormat') + '</div>'));
- }
-};
-
-var baseUrl = AC.getBaseUrl();
-
-var script = document.createElement('script');
-
-script.onload = function()
-{
- AP.sizeToParent(true);
-
- setTimeout(function()
- {
- AP.sizeToParent(true);
- }, 5000); //Try resizing again after 5 sec since the first one fails sometimes
-
- AP.request({
- type: 'GET',
- url: '/rest/api/space?spaceKey=DRAWIOCONFIG',
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.results.length > 0)
- {
- //Check all pages exists, automatically fix if a page/attachment doesn't exist
- AP.request({
- type: 'GET',
- url: '/rest/api/content/search?cql=type%3Dpage%20and%20space%3DDRAWIOCONFIG',
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
- var configSpaceFoundComponents = {};
-
- for (var i = 0; i < resp.results.length; i++)
- {
- var item = resp.results[i];
- restrictContentToAdmins(item.id);
- configSpaceFoundComponents[item.title] = item.id;
- }
-
- fixMissingComponents(configSpaceFoundComponents);
- },
- error: showError
- });
- }
- else
- {
- $('#busyIndicator').hide();
- $('#createSpace').show();
- }
- },
- error: showError
- });
-
- getAndApplyTranslation(function()
- {
- //JQuery is loaded in this page, so we can use it
- var indexBtn = $('#indexBtn');
-
- indexBtn.attr("disabled", null);
-
- indexBtn.click(function()
- {
- $('#DRIbusyIcon').show();
- DrawIoDiagramsIndexer($('#operationLog'), function()
- {
- $('#DRIbusyIcon').hide();
- });
- });
-
- var exportBtn = $('#exportBtn');
-
- exportBtn.attr("disabled", null);
-
- exportBtn.click(function()
- {
- exportPageIds($('#exportResult'));
- });
-
- var createConfig = $('#createConfSpaceBtn');
-
- createConfig.attr("disabled", null);
-
- createConfig.click(createConfigSpace);
-
- $('#saveConfigBtn').click(checkConfigAndSave);
-
- var importBtn = $('#importBtn');
- importBtn.attr("disabled", null);
- var uploadExpFileElt = null;
-
- importBtn.click(function()
- {
- if (uploadExpFileElt == null)
- {
- var input = document.createElement('input');
- input.setAttribute('type', 'file');
-
- $(input).change(function()
- {
- if (input.files != null)
- {
- var file = input.files[0];
- var reader = new FileReader();
-
- reader.onload = function(e)
- {
- importPageIds(e.target.result, $('#pageIdsImportLog'));
- };
-
- reader.onerror = function(e)
- {
- $('#idImportErrors').html(mxResources.get('confAErrReadingExpFile'));
- };
-
- reader.readAsText(file);
-
- // Resets input to force change event for same file (type reset required for IE)
- input.type = '';
- input.type = 'file';
- input.value = '';
- }
- });
-
- input.style.display = 'none';
- document.body.appendChild(input);
- uploadExpFileElt = input;
- }
-
- uploadExpFileElt.click();
- });
- });
-
- AJS.tabs.setup();
-};
-
-script.src = 'https://connect-cdn.atl-paas.net/all.js';
-script.setAttribute('data-options', 'resize:false;margin:false');
-document.getElementsByTagName('head')[0].appendChild(script);
diff --git a/src/main/webapp/connect/confluence/connect-dev.json b/src/main/webapp/connect/confluence/connect-dev.json
deleted file mode 100644
index 6efd48f7..00000000
--- a/src/main/webapp/connect/confluence/connect-dev.json
+++ /dev/null
@@ -1,482 +0,0 @@
-{
- "name": "draw.io",
- "description": "draw.io add-on for Confluence",
- "key": "com.mxgraph.confluence.plugins.diagramly",
- "baseUrl": "https://test.draw.io",
- "enableLicensing": true,
- "apiMigrations": {
- "gdpr": true
- },
- "vendor":
- {
- "name": "//SEIBERT/MEDIA",
- "url": "https://www.seibert-media.net/"
- },
- "links": {
- "documentation": "https://support.draw.io/display/DFCC/draw.io+for+Confluence+Cloud"
- },
- "version": "1.4.42",
- "authentication":
- {
- "type": "none"
- },
- "modules":
- {
- "adminPages": [
- {
- "key": "gliffyImport",
- "url": "/connect/confluence/admin.html",
- "name": {
- "value": "draw.io Gliffy Import",
- "i18n": "gliffyImport"
- }
- },
- {
- "key": "lucidImport",
- "url": "/connect/confluence/lucidMassImport.html",
- "name": {
- "value": "draw.io Lucidchart Import",
- "i18n": "lucidImport"
- }
- },
- {
- "key": "drawioConfig",
- "url": "/connect/confluence/config.html",
- "name": {
- "value": "draw.io Configuration",
- "i18n": "drawConfig"
- }
- }
- ],
- "postInstallPage": {
- "key": "postInstall",
- "url": "/connect/confluence/support.html",
- "name": {
- "value": "Welcome to draw.io",
- "i18n": "postinstall"
- }
- },
- "generalPages": [
- {
- "key": "lightbox",
- "location": "hidden",
- "url": "/connect/confluence/viewer-1-4-42.html?lightbox=1",
- "name": {
- "value": "Lightbox",
- "i18n": "lightbox"
- }
- },
- {
- "key": "customContentViewer",
- "location": "hidden",
- "url": "/connect/confluence/viewer-1-4-42.html?custom=1&contentId={content.id}",
- "name": {
- "value": "draw.io Viewer",
- "i18n": "drawViewer"
- }
- },
- {
- "key": "customContentEditor",
- "location": "hidden",
- "url": "/connect/confluence/macroEditor-1-4-8.html?custom=1",
- "name": {
- "value": "draw.io Editor",
- "i18n": "drawEditor"
- }
- },
- {
- "key": "macroEditor",
- "location": "hidden",
- "url": "/connect/confluence/macroEditor-1-4-8.html",
- "name": {
- "value": "draw.io Editor",
- "i18n": "drawEditor"
- }
- },
- {
- "key": "splashEditor",
- "location": "hidden",
- "url": "/connect/confluence/splashEditor.html",
- "name": {
- "value": "draw.io Splash Editor",
- "i18n": "drawSplashEditor"
- }
- },
- {
- "key": "support",
- "location": "system.help/pages",
- "url": "/connect/confluence/support.html",
- "name": {
- "value": "draw.io Support",
- "i18n": "support"
- }
- }
- ],
- "customContent": [{
- "key": "drawio-diagram",
- "name": {
- "value": "draw.io Diagrams",
- "i18n": "drawDiagrams"
- },
- "uiSupport": {
- "contentViewComponent": {
- "moduleKey": "customContentViewer"
- },
- "icons": {
- "item": {
- "url": "/images/drawlogo48.png"
- }
- }
- },
- "apiSupport": {
- "supportedContainerTypes": ["page", "comment", "space", "blogpost"],
- "supportedChildTypes": ["attachment"],
- "indexing": {
- "enabled": true
- }
- }
- }
- ],
- "dynamicContentMacros":
- [
- {
- "name":
- {
- "i18n": "drawioMacro",
- "value": "draw.io Diagram"
- },
- "url": "/connect/confluence/viewer-1-4-42.html?ceoId=${page.id}&diagramName=${diagramName}&revision=${revision}&width=${width}&height=${height}&tbstyle=${tbstyle}&simple=${simple}&lbox=${lbox}&zoom=${zoom}&links=${links}&owningPageId=${pageId}&displayName=${diagramDisplayName}&contentId={contentId}&custContentId={custContentId}&contentVer={contentVer}&inComment={inComment}&aspect={aspect}&pCenter={pCenter}",
- "width": "100%",
- "description":
- {
- "i18n": "drawDesc",
- "value": "Inserts a new draw.io diagram"
- }, "icon":
- {
- "width": 128,
- "height": 128,
- "url": "/images/drawlogo128.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": true,
- "key": "drawio",
- "parameters":
- [
- {
- "identifier": "diagramName",
- "name":
- {
- "value": "Diagram name (do not change)",
- "i18n": "diagramName"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "automatic size",
- "i18n": "automaticSize"
- },
- "type": "boolean",
- "defaultValue": "true"
- },
- {
- "identifier": "PageId",
- "name":
- {
- "value": "Parent page ID",
- "i18n": "pPageID"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "baseUrl",
- "name":
- {
- "value": "Confluence Base URL",
- "i18n": "baseUrl"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "Diagram width",
- "i18n": "dWidth"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Diagram height",
- "i18n": "dHeight"
- },
- "type": "string"
- }
- ],
- "editor": {
- "url": "/connect/confluence/initEditor.html?ceoId=${page.id}&diagramName=${diagramName}",
- "width": "100%",
- "height": "100%",
- "editTitle":
- {
- "value" : "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
- },
- "insertTitle":
- {
- "value" : "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
- }
- },
- "imagePlaceholder": {
- "width": 500,
- "height": 300,
- "url": "/connectImage",
- "applyChrome": true
- },
- "renderModes": {
- "default": {
- "url": "/connectRender?pageId=${page.id}&diagramName=${diagramName}&tempPreview=${tempPreview}&width=${width}&height=${height}&zoom=${zoom}"
- }
- }
- },
- {
- "name":
- {
- "i18n": "incDrawioMacro",
- "value": "Embed draw.io Diagram"
- },
- "url": "/connect/confluence/viewer-1-4-42.html?linked=1&ceoId=${page.id}&imgPageId=${imgPageId}&diagramName=${diagramName}&revision=${revision}&width=${width}&height=${height}&tbstyle=${tbstyle}&simple=${simple}&lbox=${lbox}&zoom=${zoom}&links=${links}&owningPageId=${pageId}&displayName=${diagramDisplayName}&contentId=${contentId}&custContentId={custContentId}&contentVer=${contentVer}&diagramUrl=${diagramUrl}&csvFileUrl=${csvFileUrl}&aspect=${aspect}&aspectHash=${aspectHash}&attVer=${attVer}&service=${service}&sFileId=${sFileId}&odriveId=${odriveId}",
- "width": "100%",
- "description":
- {
- "i18n": "embedDesc",
- "value": "Embed an existing draw.io diagram"
- }, "icon":
- {
- "width": 128,
- "height": 128,
- "url": "/images/drawlogo128.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": true,
- "key": "inc-drawio",
- "parameters":
- [
- {
- "identifier": "diagramName",
- "name":
- {
- "value": "Diagram name (do not change)",
- "i18n": "diagramName"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "automatic size",
- "i18n": "automaticSize"
- },
- "type": "boolean",
- "defaultValue": "true"
- },
- {
- "identifier": "PageId",
- "name":
- {
- "value": "Parent page ID",
- "i18n": "pPageID"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "baseUrl",
- "name":
- {
- "value": "Confluence Base URL",
- "i18n": "baseUrl"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "Diagram width",
- "i18n": "dWidth"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Diagram height",
- "i18n": "dHeight"
- },
- "type": "string"
- }
- ],
- "editor": {
- "url": "/connect/confluence/includeDiagram.html",
- "width": "80%",
- "height": "60%"
- },
- "imagePlaceholder": {
- "width": 500,
- "height": 300,
- "url": "/connectImage",
- "applyChrome": true
- },
- "renderModes": {
- "default": {
- "url": "/connectRender?pageId=${pageId}&imgPageId=${imgPageId}&diagramName=${diagramName}&tempPreview=${tempPreview}&width=${width}&height=${height}&zoom=${zoom}&aspectHash={aspectHash}"
- }
- }
- },
- {
- "name":
- {
- "i18n": "legacyDrawioMacro",
- "value": "Legacy macro - do not use"
- },
- "url": "/connect/confluence/viewer.html?ceoId=${page.id}&diagramName=${diagramName}&revision=${revision}&width=${width}&height=${height}",
- "width": "100%",
- "description":
- {
- "i18n": "legacyDesc",
- "value": "Do not use"
- }, "icon":
- {
- "width": 80,
- "height": 80,
- "url": "/images/stop-flat-icon-80.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": false,
- "key": "drawio-macro",
- "parameters":
- [
- {
- "identifier": "diagramName",
- "name":
- {
- "value": "Diagram name (do not change)",
- "i18n": "diagramName"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "automatic size",
- "i18n": "automaticSize"
- },
- "type": "boolean"
- },
- {
- "identifier": "PageId",
- "name":
- {
- "value": "Parent page ID",
- "i18n": "pPageID"
- },
- "type": "string"
- },
- {
- "identifier": "baseUrl",
- "name":
- {
- "value": "Confluence Base URL",
- "i18n": "baseUrl"
- },
- "type": "string"
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "Diagram width",
- "i18n": "dWidth"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Diagram Height",
- "i18n": "dHeight"
- },
- "type": "string"
- }
- ],
- "editor": {
- "url": "/connect/confluence/macroEditor.html?ceoId=${page.id}&diagramName=${diagramName}",
- "editTitle": {
- "value": "Edit Markdown",
- "i18n": "macro.md.edit"
- },
- "insertTitle": {
- "value": "Insert Markdown",
- "i18n": "macro.md.insert"
- },
- "width": "100%",
- "height": "100%"
- },
- "imagePlaceholder": {
- "width": 500,
- "height": 300,
- "url": "/connectImage",
- "applyChrome": true
- },
- "renderModes": {
- "default": {
- "url": "/connectRender?pageId=${page.id}&diagramName=${diagramName}&revision=${revision}&tempPreview=${tempPreview}"
- }
- }
- }
- ]
- },
- "scopes": [
- "read",
- "write",
- "delete"
- ]
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/connect.json b/src/main/webapp/connect/confluence/connect.json
deleted file mode 100644
index be839d59..00000000
--- a/src/main/webapp/connect/confluence/connect.json
+++ /dev/null
@@ -1,493 +0,0 @@
-{
- "name": "draw.io",
- "description": "draw.io add-on for Confluence",
- "key": "com.mxgraph.confluence.plugins.diagramly",
- "baseUrl": "https://confluence.draw.io",
- "enableLicensing": true,
- "apiMigrations": {
- "gdpr": true
- },
- "vendor":
- {
- "name": "//SEIBERT/MEDIA",
- "url": "https://www.seibert-media.net/"
- },
- "links": {
- "documentation": "https://support.draw.io/display/DFCC/draw.io+for+Confluence+Cloud"
- },
- "version": "1.4.42",
- "authentication":
- {
- "type": "none"
- },
- "modules":
- {
- "adminPages": [
- {
- "key": "gliffyImport",
- "url": "/connect/confluence/admin.html",
- "name": {
- "value": "draw.io Gliffy Import",
- "i18n": "gliffyImport"
- }
- },
- {
- "key": "lucidImport",
- "url": "/connect/confluence/lucidMassImport.html",
- "name": {
- "value": "draw.io Lucidchart Import",
- "i18n": "lucidImport"
- }
- },
- {
- "key": "drawioConfig",
- "url": "/connect/confluence/config.html",
- "name": {
- "value": "draw.io Configuration",
- "i18n": "drawConfig"
- }
- }
- ],
- "postInstallPage": {
- "key": "postInstall",
- "url": "/connect/confluence/support.html",
- "name": {
- "value": "Welcome to draw.io",
- "i18n": "postinstall"
- }
- },
- "generalPages": [
- {
- "key": "lightbox",
- "location": "hidden",
- "url": "/connect/confluence/viewer-1-4-42.html?lightbox=1",
- "name": {
- "value": "Lightbox",
- "i18n": "lightbox"
- }
- },
- {
- "key": "customContentViewer",
- "location": "hidden",
- "url": "/connect/confluence/viewer-1-4-42.html?custom=1&contentId={content.id}",
- "name": {
- "value": "draw.io Viewer",
- "i18n": "drawViewer"
- }
- },
- {
- "key": "customContentEditor",
- "location": "hidden",
- "url": "/connect/confluence/macroEditor-1-4-8.html?custom=1",
- "name": {
- "value": "draw.io Editor",
- "i18n": "drawEditor"
- }
- },
- {
- "key": "macroEditor",
- "location": "hidden",
- "url": "/connect/confluence/macroEditor-1-4-8.html",
- "name": {
- "value": "draw.io Editor",
- "i18n": "drawEditor"
- }
- },
- {
- "key": "splashEditor",
- "location": "hidden",
- "url": "/connect/confluence/splashEditor.html",
- "name": {
- "value": "draw.io Splash Editor",
- "i18n": "drawSplashEditor"
- }
- },
- {
- "key": "support",
- "location": "system.help/pages",
- "url": "/connect/confluence/support.html",
- "name": {
- "value": "draw.io Support",
- "i18n": "support"
- }
- }
- ],
- "customContent": [{
- "key": "drawio-diagram",
- "name": {
- "value": "draw.io Diagrams",
- "i18n": "drawDiagrams"
- },
- "uiSupport": {
- "contentViewComponent": {
- "moduleKey": "customContentViewer"
- },
- "icons": {
- "item": {
- "url": "/images/drawlogo48.png"
- }
- }
- },
- "apiSupport": {
- "supportedContainerTypes": ["page", "comment", "space", "blogpost"],
- "supportedChildTypes": ["attachment"],
- "indexing": {
- "enabled": true
- }
- }
- }
- ],
- "dynamicContentMacros":
- [
- {
- "name":
- {
- "i18n": "drawioMacro",
- "value": "draw.io Diagram"
- },
- "url": "/connect/confluence/viewer-1-4-42.html?ceoId=${page.id}&diagramName=${diagramName}&revision=${revision}&width=${width}&height=${height}&tbstyle=${tbstyle}&simple=${simple}&lbox=${lbox}&zoom=${zoom}&links=${links}&owningPageId=${pageId}&displayName=${diagramDisplayName}&contentId={contentId}&custContentId={custContentId}&contentVer={contentVer}&inComment={inComment}&aspect={aspect}&pCenter={pCenter}",
- "width": "100%",
- "description":
- {
- "i18n": "drawDesc",
- "value": "Inserts a new draw.io diagram"
- }, "icon":
- {
- "width": 128,
- "height": 128,
- "url": "/images/drawlogo128.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": true,
- "key": "drawio",
- "parameters":
- [
- {
- "identifier": "diagramName",
- "name":
- {
- "value": "Diagram name (do not change)",
- "i18n": "diagramName"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "automatic size",
- "i18n": "automaticSize"
- },
- "type": "boolean",
- "defaultValue": "true"
- },
- {
- "identifier": "PageId",
- "name":
- {
- "value": "Parent page ID",
- "i18n": "pPageID"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "baseUrl",
- "name":
- {
- "value": "Confluence Base URL",
- "i18n": "baseUrl"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "Diagram width",
- "i18n": "dWidth"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Diagram height",
- "i18n": "dHeight"
- },
- "type": "string"
- }
- ],
- "editor": {
- "url": "/connect/confluence/initEditor.html?ceoId=${page.id}&diagramName=${diagramName}",
- "width": "100%",
- "height": "100%",
- "editTitle":
- {
- "value" : "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
- },
- "insertTitle":
- {
- "value" : "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
- }
- },
- "imagePlaceholder": {
- "width": 500,
- "height": 300,
- "url": "/connectImage",
- "applyChrome": true
- },
- "renderModes": {
- "default": {
- "url": "/connectRender?pageId=${page.id}&diagramName=${diagramName}&tempPreview=${tempPreview}&width=${width}&height=${height}&zoom=${zoom}"
- }
- }
- },
- {
- "name":
- {
- "i18n": "incDrawioMacro",
- "value": "Embed draw.io Diagram"
- },
- "url": "/connect/confluence/viewer-1-4-42.html?linked=1&ceoId=${page.id}&imgPageId=${imgPageId}&diagramName=${diagramName}&revision=${revision}&width=${width}&height=${height}&tbstyle=${tbstyle}&simple=${simple}&lbox=${lbox}&zoom=${zoom}&links=${links}&owningPageId=${pageId}&displayName=${diagramDisplayName}&contentId=${contentId}&custContentId={custContentId}&contentVer=${contentVer}&diagramUrl=${diagramUrl}&csvFileUrl=${csvFileUrl}&aspect=${aspect}&aspectHash=${aspectHash}&attVer=${attVer}&service=${service}&sFileId=${sFileId}&odriveId=${odriveId}",
- "width": "100%",
- "description":
- {
- "i18n": "embedDesc",
- "value": "Embed an existing draw.io diagram"
- }, "icon":
- {
- "width": 128,
- "height": 128,
- "url": "/images/drawlogo128.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": true,
- "key": "inc-drawio",
- "parameters":
- [
- {
- "identifier": "diagramName",
- "name":
- {
- "value": "Diagram name (do not change)",
- "i18n": "diagramName"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "automatic size",
- "i18n": "automaticSize"
- },
- "type": "boolean",
- "defaultValue": "true"
- },
- {
- "identifier": "PageId",
- "name":
- {
- "value": "Parent page ID",
- "i18n": "pPageID"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "baseUrl",
- "name":
- {
- "value": "Confluence Base URL",
- "i18n": "baseUrl"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "Diagram width",
- "i18n": "dWidth"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Diagram height",
- "i18n": "dHeight"
- },
- "type": "string"
- }
- ],
- "editor": {
- "url": "/connect/confluence/includeDiagram.html",
- "width": "80%",
- "height": "60%"
- },
- "imagePlaceholder": {
- "width": 500,
- "height": 300,
- "url": "/connectImage",
- "applyChrome": true
- },
- "renderModes": {
- "default": {
- "url": "/connectRender?pageId=${pageId}&imgPageId=${imgPageId}&diagramName=${diagramName}&tempPreview=${tempPreview}&width=${width}&height=${height}&zoom=${zoom}&aspectHash={aspectHash}"
- }
- }
- },
- {
- "name":
- {
- "i18n": "legacyDrawioMacro",
- "value": "Legacy macro - do not use"
- },
- "url": "/connect/confluence/viewer.html?ceoId=${page.id}&diagramName=${diagramName}&revision=${revision}&width=${width}&height=${height}",
- "width": "100%",
- "description":
- {
- "i18n": "legacyDesc",
- "value": "Do not use"
- }, "icon":
- {
- "width": 80,
- "height": 80,
- "url": "/images/stop-flat-icon-80.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": false,
- "key": "drawio-macro",
- "parameters":
- [
- {
- "identifier": "diagramName",
- "name":
- {
- "value": "Diagram name (do not change)",
- "i18n": "diagramName"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "automatic size",
- "i18n": "automaticSize"
- },
- "type": "boolean"
- },
- {
- "identifier": "PageId",
- "name":
- {
- "value": "Parent page ID",
- "i18n": "pPageID"
- },
- "type": "string"
- },
- {
- "identifier": "baseUrl",
- "name":
- {
- "value": "Confluence Base URL",
- "i18n": "baseUrl"
- },
- "type": "string"
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "Diagram width",
- "i18n": "dWidth"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Diagram Height",
- "i18n": "dHeight"
- },
- "type": "string"
- }
- ],
- "editor": {
- "url": "/connect/confluence/macroEditor.html?ceoId=${page.id}&diagramName=${diagramName}",
- "editTitle": {
- "value": "Edit Markdown",
- "i18n": "macro.md.edit"
- },
- "insertTitle": {
- "value": "Insert Markdown",
- "i18n": "macro.md.insert"
- },
- "width": "100%",
- "height": "100%"
- },
- "imagePlaceholder": {
- "width": 500,
- "height": 300,
- "url": "/connectImage",
- "applyChrome": true
- },
- "renderModes": {
- "default": {
- "url": "/connectRender?pageId=${page.id}&diagramName=${diagramName}&revision=${revision}&tempPreview=${tempPreview}"
- }
- }
- }
- ]
- },
- "scopes": [
- "read",
- "write",
- "delete"
- ],
- "translations": {
- "paths": {
- "en-US": "/connect/confluence/i18n/en.json",
- "fr-FR": "/connect/confluence/i18n/fr_FR.json",
- "de-DE": "/connect/confluence/i18n/de_DE.json",
- "ja-JP": "/connect/confluence/i18n/ja_JP.json",
- "ko-KR": "/connect/confluence/i18n/ko_KR.json",
- "es-ES": "/connect/confluence/i18n/es_ES.json",
- "ru-RU": "/connect/confluence/i18n/ru_RU.json"
- }
- }
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/connectUtils-1-4-8.js b/src/main/webapp/connect/confluence/connectUtils-1-4-8.js
deleted file mode 100644
index c2a4742f..00000000
--- a/src/main/webapp/connect/confluence/connectUtils-1-4-8.js
+++ /dev/null
@@ -1,3477 +0,0 @@
-// Sets base path for mxgraph library
-if (typeof window.mxBasePath === 'undefined')
-{
- window.mxBasePath = '/mxgraph';
-}
-
-// Sets absolute path for proxy
-window.PROXY_URL = window.PROXY_URL || '/proxy';
-
-// Renamed from ac.js. This is the version used for release 1.4.8-AC onwards
-var AC = {};
-
-AC.autosaveTimeout = 10000;
-AC.draftExtension = '.tmp';
-AC.draftPrefix = '~';
-AC.timeout = 25000;
-
-//Allow saving multiple times
-AC.autoExit = true;
-
-// Last Checked on 08-AUG-2017: No delete scope needed to delete drafts
-// LATER: If delete scope is needed users must upgrade to the latest json
-// Disabled. Flag to mute notifications for drafts is needed. 16-AUG-2017
-AC.draftEnabled = true; //Enabled with the new save that mute notifications for saving TODO is there notification for deleting a draft?
-
-AC.customContentEditMode = false;
-
-AC.findMacrosRegEx = new RegExp('\\<ac\\:structured\\-macro[^\\>]+?(?=ac\\:name\\=)ac\\:name\\=\\"drawio\\".*?(?=\\<\\/ac\\:structured\\-macro\\>)', 'g');
-
-AC.VERSION = '1.4.8'; //TODO Get the version
-
-AC.logError = function(message, url, linenumber, colno, err, severity)
-{
- try
- {
- if (message == AC.lastErrorMessage || (message != null && url != null &&
- ((message.indexOf('Script error') != -1) || (message.indexOf('extension') != -1))))
- {
- // TODO log external domain script failure "Script error." is
- // reported when the error occurs in a script that is hosted
- // on a domain other than the domain of the current page
- }
- // DocumentClosedError seems to be an FF bug an can be ignored for now
- else if (message != null && message.indexOf('DocumentClosedError') < 0)
- {
- AC.lastErrorMessage = message;
- severity = ((severity != null) ? severity : (message.indexOf('NetworkError') >= 0 ||
- message.indexOf('SecurityError') >= 0 || message.indexOf('NS_ERROR_FAILURE') >= 0 ||
- message.indexOf('out of memory') >= 0) ? 'CONFIG' : 'SEVERE');
- err = (err != null) ? err : new Error(message);
-
- var img = new Image();
- img.src = 'https://log.draw.io/log?severity=' + severity + '&v=' + encodeURIComponent(AC.VERSION) +
- '&msg=clientError:' + encodeURIComponent(message) + ':url:' + encodeURIComponent(window.location.href) +
- ':lnum:' + encodeURIComponent(linenumber) + ((colno != null) ? ':colno:' + encodeURIComponent(colno) : '') +
- ((err != null && err.stack != null) ? '&stack=' + encodeURIComponent(err.stack) : '');
- }
- }
- catch (err)
- {
- // do nothing
- }
-};
-
-(function() {
- AC.macroParams = ["diagramName", "diagramDisplayName", "revision", "pageId", "contentId", "contentVer", "baseUrl", "width", "height", "tbstyle", "links", "simple", "lbox", "zoom", "hiResPreview", "inComment", "aspect", "custContentId", "pCenter"];
- AC.findMacroParamRegEx = {};
-
- for (var i = 0; i < AC.macroParams.length; i++)
- {
- AC.findMacroParamRegEx[AC.macroParams[i]] = new RegExp('\\<ac\\:parameter\\s+ac\\:name\\=\\"'+ AC.macroParams[i] +'\\"\\s*\\>([^\\<]+)');
- }
-})();
-
-AC.getUrlParam = function(param, escape, url){
- try{
- var url = url || window.location.search;
- var regex = new RegExp(param + '=([^&]+)'),
- data = regex.exec(url)[1];
- // decode URI with plus sign fix.
- return (escape) ? window.decodeURIComponent(data.replace(/\+/g, '%20')) : data;
- } catch (e){
- return undefined;
- }
-};
-
-AC.getSpaceKey = function(url)
-{
- try{
- var url = url || window.location.href;
- var regex = new RegExp(/\/(spaces|space)\/([^\/]+)/);
- return decodeURIComponent(regex.exec(url)[2]);
- } catch (e){
- return undefined;
- }
-};
-
-AC.getMetaTag = function(name) {
- return document.getElementsByTagName('meta')[name].getAttribute('content');
-}
-
-AC.getBaseUrl = function()
-{
- var baseUrl = AC.getUrlParam('xdm_e', true) + AC.getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-AC.getSiteUrl = function()
-{
- var siteUrl = AC.getUrlParam('xdm_e', true);
- //Ensure siteUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- if (/^https:\/\/([^\.])+\.jira\.com$/.test(siteUrl) || /^https:\/\/([^\.])+\.atlassian\.net$/.test(siteUrl))
- {
- return siteUrl;
- }
- throw 'Invalid siteUrl!';
-};
-
-//Code from: https://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript
-AC.b64toBlob = function(b64Data, contentType, sliceSize, isByteCharacters)
-{
- contentType = contentType || '';
- sliceSize = sliceSize || 512;
-
- var byteCharacters = isByteCharacters? b64Data : atob(b64Data);
- var byteArrays = [];
-
- for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
- var slice = byteCharacters.slice(offset, offset + sliceSize);
-
- var byteNumbers = new Array(slice.length);
- for (var i = 0; i < slice.length; i++) {
- byteNumbers[i] = slice.charCodeAt(i);
- }
-
- var byteArray = new Uint8Array(byteNumbers);
-
- byteArrays.push(byteArray);
- }
-
- var blob = new Blob(byteArrays, {type: contentType});
- return blob;
-};
-
-//We need language translation for error messages mainly which are not needed immediately
-AC.initI18nAsync = function(lang, callback)
-{
- RESOURCE_BASE = '/resources/dia';
-
- //define mxResources such that it is available until code is loaded
- mxResources = {
- get: function(key, params, def)
- {
- return (def || '').replace('{1}', params? (params[0] || '') : ''); //Simple replacement which covers most cases
- }
- };
-
- var script = document.createElement('script');
-
- script.onload = function()
- {
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, lang) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, lang);
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
-
- if (callback)
- {
- callback();
- }
- });
- };
-
- script.src = '/js/viewer-static.min.js';
- document.getElementsByTagName('head')[0].appendChild(script);
-};
-
-//AP.flag has a bug and stopped working, we'll use alert until it is fixed
-// https://ecosystem.atlassian.net/browse/ACJS-1052
-AC.showNotification = function(notifConfig)
-{
- AP.flag.create(notifConfig);
- alert(notifConfig.title + ': ' + notifConfig.body);
-};
-
-AC.initAsync = function(baseUrl, contentId, initMacroData, config, lang)
-{
- AC.customContentEditMode = contentId != null;
- var contentVer = initMacroData != null? initMacroData.contentVer : null;
-
- var link = document.createElement('a');
- link.href = location.href;
- link.href = link.href; //to have 'host' populated under IE
- var hostUrl = link.protocol + '//' + link.hostname;
- var site = AC.getSiteUrl();
- var user = null;
-
- AP.user.getCurrentUser(function(atlUser)
- {
- user = atlUser.atlassianAccountId;
- });
-
- if (lang != null)
- {
- var dash = lang.indexOf('_');
-
- if (dash >= 0)
- {
- lang = lang.substring(0, dash);
- }
-
- AC.initI18nAsync(lang);
- }
-
- var ui = 'atlas';
- var plugins = 'ac148;ac148cmnt';
-
- try
- {
- var configObj = (config != null) ? JSON.parse(config) : null;
-
- if (configObj != null)
- {
- // Adds support for ui theme
- if (configObj.ui != null)
- {
- ui = configObj.ui;
- }
-
- // Redirects plugins to p URL parameter
- if (configObj.plugins != null)
- {
- plugins = plugins + ';' + configObj.plugins;
- }
-
- AC.hiResPreview = configObj.hiResPreview || false;
- }
- }
- catch (e)
- {
- console.log('Configuration error', e);
- }
-
- var editor = document.createElement('iframe');
- editor.setAttribute('width', '100%');
- editor.setAttribute('height', '100%');
- editor.style.width = '100%';
- editor.style.height = '100%';
- editor.setAttribute('id', 'editorFrame');
- editor.setAttribute('frameborder', '0');
- //editor.setAttribute('src', hostUrl + '/?dev=1&' +
- editor.setAttribute('src', hostUrl + '/?' +
- 'ui=' + ui + '&p=' + plugins + '&embed=1&modified=unsavedChanges' +
- ((AC.autoExit) ? '&noSaveBtn=1' : '&saveAndExit=1') +
- '&keepmodified=1&spin=1&libraries=1&confLib=1&proto=json' +
- ((lang != null) ? '&lang=' + lang : '') + ((site != null) ? '&site=' + encodeURIComponent(site) : '') +
- ((user != null) ? '&user=' + encodeURIComponent(user) : ''));
-
- var initReceived = false;
- var draftHandled = false;
- var waitingForAttachments = false;
- var xmlReceived = null;
- var draftXml = null;
- var draftName = null;
- var filename = null;
- var theMacroData = null;
- var pageId = null;
- var draftPage = false;
- var theLocation = null;
- var attachments = null;
-
- var serverName = AC.getSiteUrl();
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- else
- {
- serverName = serverName.substring(index1 + 2);
- }
- }
-
- function startEditor()
- {
- if (initReceived && xmlReceived != null && draftHandled && !waitingForAttachments)
- {
- AC.init(baseUrl, theLocation, pageId, editor, filename, xmlReceived, draftName, draftXml, theMacroData, draftPage);
- }
- };
-
- function loadDraft()
- {
- if (waitingForAttachments)
- {
- return;
- }
-
- if (AC.draftEnabled && pageId != null && attachments != null &&
- (draftName != null || xmlReceived == '') && !draftHandled)
- {
- // Searches for pending new drafts from this user
- var prefix = '~drawio~' + user + '~';
-
- // Check if attachments contains draftName
- for (var i = 0; i < attachments.length; i++)
- {
- var fn = attachments[i].title;
-
- if (draftName == null && attachments[i].fileSize > 0 &&
- fn.substring(0, prefix.length) === prefix &&
- fn.substring(fn.length - AC.draftExtension.length) === AC.draftExtension)
- {
- filename = fn.substring(prefix.length, fn.length - AC.draftExtension.length);
- draftName = fn;
- }
-
- if (fn == draftName)
- {
- //keeping the block of AP.require to minimize the number of changes!
- {
- var acceptResponse = true;
- var timeoutHandler = function()
- {
- acceptResponse = false;
- document.body.style.backgroundSize = 'auto auto';
- document.body.style.backgroundImage = 'url(/images/stop-flat-icon-80.png)';
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
-
- AC.showNotification({
- title: mxResources.get('confTimeout'),
- body: mxResources.get('confSrvTakeTooLong', [serverName]),
- type: 'error',
- close: 'manual'
- });
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
-// messages.onClose(message, function()
-// {
- AP.dialog.close();
-// });
- };
-
- var timeoutThread = window.setTimeout(timeoutHandler, AC.timeout);
-
- AC.loadDiagram(pageId, draftName, null, function(loadResp)
- {
- //console.trace('DRAFT: Found', draftName, loadResp);
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- if (loadResp != null && loadResp.length > 0)
- {
- draftXml = loadResp;
- }
-
- draftHandled = true;
- startEditor();
- }
- }, function()
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- draftHandled = true;
- startEditor();
- }
- });
- };
-
- // Terminates function
- return;
- }
- }
- }
-
- draftHandled = true;
- startEditor();
- };
-
- var initHandler = function(evt)
- {
- if (evt.origin == hostUrl)
- {
- var msg = JSON.parse(evt.data);
-
- if (msg.event == 'configure')
- {
- // Configure must be sent even if JSON invalid
- var configObj = {compressXml: false};
-
- try
- {
- configObj = JSON.parse(config);
-
- // Overrides default
- if (configObj != null && configObj.compressXml == null)
- {
- configObj.compressXml = false;
- }
- }
- catch (e)
- {
- // ignore
- }
-
- editor.contentWindow.postMessage(JSON.stringify({action: 'configure',
- config: configObj}), '*');
- }
- else if (msg.event == 'init')
- {
- window.removeEventListener('message', initHandler);
- document.body.style.backgroundImage = 'none';
- initReceived = true;
- startEditor();
- }
- }
- };
-
- window.addEventListener('message', initHandler);
-
- AP.getLocation(function(location)
- {
- theLocation = location;
-
- var infoReady = function(data, macroData_p)
- {
- if (pageId == null || isNaN(pageId))
- {
- document.body.style.backgroundImage = 'url(/images/stop-flat-icon-80.png)';
- document.body.style.backgroundSize = 'auto auto';
-
- if (data != null && data.target == 'contentcreate')
- {
- AC.showNotification({
- title: mxResources.get('confCannotInsertNew'),
- body: mxResources.get('confSaveTry'),
- type: 'error',
- close: 'manual'
- });
- }
- else
- {
- AC.showNotification({
- title: mxResources.get('confCannotGetID'),
- body: mxResources.get('confContactAdmin'),
- type: 'error',
- close: 'manual'
- });
- }
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
-// messages.onClose(message, function()
-// {
- AP.dialog.close();
-// });
- }
- else
- {
- // Workaround for blocked referrer policy in iframe
- editor.setAttribute('src', editor.getAttribute('src') + '&base=' +
- encodeURIComponent(baseUrl + '/pages/viewpage.action?pageId=' + pageId) +
- //adding config here to be the last in the url
- (config != null? '&configure=1' : ''));
- document.body.appendChild(editor);
-
- // Not needed if drafts not enabled
- if (AC.draftEnabled)
- {
- waitingForAttachments = true;
- var acceptResponse2 = true;
- var timeoutHandler2 = function()
- {
- acceptResponse2 = false;
- document.body.style.backgroundSize = 'auto auto';
- document.body.style.backgroundImage = 'url(/images/stop-flat-icon-80.png)';
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
-
- AC.showNotification({
- title: mxResources.get('confTimeout'),
- body: mxResources.get('confSrvTakeTooLong', [serverName]),
- type: 'error',
- close: 'manual'
- });
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
-// messages.onClose(message, function()
-// {
- AP.dialog.close();
-// });
- };
-
- var timeoutThread2 = window.setTimeout(timeoutHandler2, AC.timeout);
-
- //TODO do a search instead if possible
- AC.getPageAttachments(pageId, function(atts)
- {
- window.clearTimeout(timeoutThread2);
-
- if (acceptResponse2)
- {
- waitingForAttachments = false;
- attachments = atts;
- loadDraft();
- }
- }, function(res)
- {
- window.clearTimeout(timeoutThread2);
-
- if (acceptResponse2)
- {
- waitingForAttachments = false;
- draftHandled = true;
- }
- });
- }
-
- var acceptResponse = true;
- var timeoutHandler = function()
- {
- acceptResponse = false;
- document.body.style.backgroundSize = 'auto auto';
- document.body.style.backgroundImage = 'url(/images/stop-flat-icon-80.png)';
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
-
- AC.showNotification({
- title: mxResources.get('confTimeout'),
- body: mxResources.get('confSrvTakeTooLong', [serverName]),
- type: 'error',
- close: 'manual'
- });
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
-// messages.onClose(message, function()
-// {
- AP.dialog.close();
-// });
- };
-
- var timeoutThread = window.setTimeout(timeoutHandler, AC.timeout);
-
- AP.confluence.getMacroData(function (macroData)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- var name = null, revision, owningPageId;
-
- if (AC.customContentEditMode)
- {
- name = macroData_p.diagramName;
- revision = macroData_p.revision;
- owningPageId = pageId;
-
- //fill the macro data
- theMacroData = macroData_p;
- }
- else if (macroData != null)
- {
- theMacroData = macroData;
- name = macroData.diagramName || '';
- revision = parseInt(macroData.revision);
- owningPageId = macroData.pageId;
- }
-
- if (name != null && name.length > 0)
- {
- draftName = (name != null) ? AC.draftPrefix + name + AC.draftExtension : null;
- loadDraft();
-
- if (isNaN(revision))
- {
- revision = null;
- }
-
- timeoutThread = window.setTimeout(timeoutHandler, AC.timeout);
-
- AC.loadDiagram(pageId, name, revision, function(loadResp, curPageId, curDiagName)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- //Get current diagram information which is needed for comments
- AC.getAttachmentInfo(curPageId, curDiagName, function(info)
- {
- AC.curDiagVer = info.version.number;
- AC.curDiagId = info.id;
- }, function()
- {
- AC.curDiagId = false;
- });
-
- xmlReceived = loadResp;
- filename = name;
- //console.trace('DRAFT: Created', AC.draftPrefix + filename + AC.draftExtension);
- startEditor();
- }
- },
- function(resp)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- editor.parentNode.removeChild(editor);
-
- AC.showNotification({
- title: mxResources.get('readErr'),
- body: (resp.status == 404) ?
- mxResources.get('fileNotFound') : mxResources.get('errorLoadingFile'),
- type: 'error',
- close: 'manual'
- });
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
-// messages.onClose(message, function()
-// {
- AP.dialog.close();
-// });
- }
- }, owningPageId, true);
- }
- else
- {
- filename = null;
- xmlReceived = '';
- loadDraft();
- }
- }
- });
- }
- };
-
- var extEditingError = function()
- {
- AC.showNotification({
- title: mxResources.get('editingErr'),
- body: mxResources.get('confExtEditNotPossible'),
- type: 'error',
- close: 'manual'
- });
-
- AP.dialog.close({noBack: true});
- };
-
- //keeping the block of AP.require to minimize the number of changes!
- {
- AP.navigator.getLocation(function (data)
- {
- AC.inComment = (data != null && data.context != null && data.context.contentType == 'comment');
-
- if (AC.customContentEditMode) //we can also find the contentId in data.target == 'addonmodule' and data.context.context["content.id"][0]
- {
- //load the custom content to get the page info
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + contentId + '/?expand=body.storage,version' + (contentVer != null? ('&version=' + contentVer) : ''),
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- var info = JSON.parse(decodeURIComponent(resp.body.storage.value));
-
- pageId = info.pageId;
- info.displayName = resp.title;
- info.contentVer = resp.version.number;
-
- //Out of sync custom content. This happen when a page is moved/copied
- if (initMacroData != null &&
- ((initMacroData.pageId != null && initMacroData.pageId != pageId)
- || (initMacroData.diagramName != null && initMacroData.diagramName != info.diagramName)
- || (initMacroData.diagramDisplayName != null && initMacroData.diagramDisplayName != info.displayName)
- || (initMacroData.revision != null && initMacroData.revision != info.version)))
- {
- pageId = initMacroData.pageId;
-
- info.createCustomContent = true;
- }
-
- AC.findMacroInPage(pageId, info.diagramName, info.version, function(macroFound, originalBody, matchingMacros, page)
- {
- if (macroFound)
- {
- if (info.createCustomContent)
- {
- info.diagramName = initMacroData.diagramName;
- info.displayName = initMacroData.diagramDisplayName;
- info.version = initMacroData.revision || 1; //using version one when null is received which is usually the case
-
- //Create a new custom content and update the macro
- var spaceKey = AC.getSpaceKey(page._expandable.space);
- var pageType = page.type;
-
- AC.saveCustomContent(spaceKey, pageId, pageType, info.diagramName, info.displayName, info.version,
- null, null,
- function(responseText)
- {
- var content = JSON.parse(responseText);
-
- contentId = content.id;
- info.contentVer = content.version? content.version.number : 1;
- contentVer = info.contentVer;
-
- AC.adjustMacroParametersDirect(pageId,
- {pageId: pageId, revision: info.version, contentId: content.id, custContentId: content.id, contentVer: contentVer},
- originalBody, matchingMacros, page, function()
- {
- infoReady(null, matchingMacros[0].macroParams);
- }, extEditingError);
- }, extEditingError);
- }
- else
- {
- infoReady(null, matchingMacros[0].macroParams);
- }
- }
- else //A published page that has a draft content containing the diagram OR the diagram is deleted from the page OR diagram is edited and page is old!
- {
- var directPageEdit = contentVer != null;
-
- if (directPageEdit)
- {
- //We added translation since sometimes resources doesn't load quickly for this error
- AC.showNotification({
- title: mxResources.get('confEditedExt', null, 'Diagram/Page edited externally'),
- body: mxResources.get('confEditedExtRefresh', null, 'Diagram/Page is edited externally. Please refresh the page.'),
- type: 'error',
- close: 'manual'
- });
- AP.dialog.close({noBack: true, noBackOnClose: directPageEdit});
- }
- else //If this is edit of a custom content, we allow editing since it can be a stranded diagram (only exists as an attachment and custom contents BUT not as a macro)
- {
- //We added translation since sometimes resources doesn't load quickly for this error
- AC.showNotification({
- title: mxResources.get('macroNotFound', null, 'Macro Not Found'),
- body: mxResources.get('confEditDraftDelOrExt', null, 'This diagram is in a draft page, is deleted from the page, or is edited externally. ' +
- 'It will be saved as a new attachment version and may not be reflected in the page.'),
- type: 'warning',
- close: 'manual'
- });
- AC.strandedMode = true;
- //Add required info that is usually found in the macro
- info.contentId = contentId;
- info.custContentId = contentId;
- info.revision = info.version;
- info.diagramDisplayName = info.displayName;
- infoReady(null, info);
- }
- }
- }, function() //On error, it means the page is a newly created draft that is not published
- {
- AC.showNotification({
- title: mxResources.get('diagNotFound'),
- body: mxResources.get('confDiagNotPublished'),
- type: 'error',
- close: 'manual',
- actions: {
- 'actionkey': mxResources.get('retBack')
- }
- });
-
- AP.dialog.close({noBack: true});
- });
- },
- error: extEditingError //We can create the custom content and fix this case but it adds more complexity to rare situation (e.g., a page is copied then the source page is deleted)
- });
- }
- else if (data != null && data.context != null
- && (data.target == 'contentedit' || data.target == 'contentcreate' || AC.inComment))
- {
- draftPage = (data.target == 'contentcreate');
- pageId = data.context.contentId;
- infoReady(data);
- }
- else
- {
- infoReady();
- }
- });
- };
- });
-};
-
-
-AC.getPageAttachments = function(pageId, success, error)
-{
- var attachments = [];
-
- function getAttsChunk(start)
- {
- AP.request({
- url: '/rest/api/content/' + pageId + '/child/attachment?limit=100&start=' + start,
- type: 'GET',
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- resp = JSON.parse(resp);
- Array.prototype.push.apply(attachments, resp.results);
-
- //Support paging
- if (resp._links && resp._links.next)
- {
- start += resp.limit; //Sometimes the limit is changed by the server
- getAttsChunk(start);
- }
- else
- {
- success(attachments);
- }
- },
- error : error
- });
- };
-
- getAttsChunk(0);
-};
-
-AC.searchDiagrams = function(searchStr, success, error)
-{
- //Note: we manually filter trashed diagrams as we couldn't make cqlcontext={"contentStatuses":["current"]} work
- AP.request({
- url: '/rest/api/content/search?cql=' + encodeURIComponent('type="ac:com.mxgraph.confluence.plugins.diagramly:drawio-diagram" and title ~ "*' + searchStr + '*"') + '&limit=50&expand=body.storage,version',
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var retList = [];
- var gliffyList = [];
- var list = resp.results;
- var customContentMap = {};
- if (list)
- {
- //Add items in the list and convert the list to map so we can search by name efficiently
- for (var i = 0; i < list.length; i++)
- {
- if (list[i].status == 'trashed') continue;
-
- try
- {
- var attInfo = JSON.parse(decodeURIComponent(list[i]["body"]["storage"]["value"]));
-
- customContentMap[attInfo.pageId + '|' + attInfo.diagramName] = true;
-
- retList.push({
- title: list[i].title,
- url: "/download/attachments/" + attInfo.pageId + "/"
- + encodeURIComponent(attInfo.diagramName)
- + '?version=' + attInfo.version,
- info: {
- id: list[i].id,
- contentId: list[i].id,
- custContentId: list[i].id,
- contentVer: list[i].version.number,
- pageId: attInfo.pageId,
- version: attInfo.version,
- name: attInfo.diagramName,
- displayName: list[i].title
- },
- imgUrl: baseUrl + "/download/attachments/" + attInfo.pageId + "/"
- + encodeURIComponent(attInfo.diagramName)
- + ".png?api=v2&version=" + attInfo.version
- });
- }
- catch(e)
- {
- //ignore, this should not happen!
- console.log(e);
- }
- }
- }
-
- //This request search for Gliffy files as well as to support old draw.io diagrams that have no associated draw.io custom contents
- AP.request({
- url: '/rest/api/content/search?cql=' + encodeURIComponent('type=attachment and (title ~ "*' + searchStr + '*" or title ~ "*' + searchStr + '*.png")') + '&limit=200&expand=metadata', //limit is 200 to get as much results as possible
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var list = resp.results;
- if (list)
- {
- var attMap = {};
- //convert the list to map so we can search by name efficiently
- for (var i = 0; i < list.length; i++)
- {
- if (list[i].status == 'trashed') continue;
-
- //key is pageId + | + att name
- var pageId = list[i]["_links"]["webui"].match(/pages\/(\d+)/);
-
- if (pageId != null)
- {
- var key = pageId[1] + '|' + list[i].title;
-
- //exclude contents already found in the custom contents
- if (!customContentMap[key])
- {
- attMap[key] = {att: list[i], pageId: pageId[1]};
- }
- }
- }
-
- function getAttObj(att, isImport, noImg)
- {
- var obj = {
- title: att.att.title,
- url: "/download/attachments/" + att.pageId + "/"
- + encodeURIComponent(att.att.title),
- info: {
- id: att.att.id,
- pageId: att.pageId,
- name: att.att.title,
- isImport: isImport
- }
- };
-
- if (noImg)
- {
- obj.noImg = true;
- }
- else
- {
- obj.imgUrl = baseUrl + '/download/attachments/' + att.pageId + '/'
- + encodeURIComponent(att.att.title)
- + '.png?api=v2';
- }
-
- return obj;
- };
-
- for (var key in attMap)
- {
- var att = attMap[key];
- var mimeType = att.att.metadata.mediaType;
-
- if (mimeType == 'application/gliffy+json')
- {
- gliffyList.push(getAttObj(att, true));
- }
- else if (mimeType == 'text/plain' && attMap[key+'.png']) //each draw.io attachment should have an associated png preview and mimeType is text/plain
- {
- //We cannot get the latest version info, it can be searched when a diagram is selected
- retList.push(getAttObj(att));
- }
- }
- }
-
- success(retList, null, {"Gliffy": gliffyList});
- },
- error : error
- });
- },
- error : error
- });
-};
-
-AC.getRecentDiagrams = function(success, error)
-{
- //I think it is safe now to base the recent documents on draw.io custom contents only since it is in production for long time now
- AP.request({
- url: '/rest/api/content/search?cql=type%3D%22ac%3Acom.mxgraph.confluence.plugins.diagramly%3Adrawio-diagram%22%20and%20lastmodified%20%3E%20startOfDay(%22-7d%22)&limit=50&expand=body.storage,version', // type="ac:com.mxgraph.confluence.plugins.diagramly:drawio-diagram" and lastmodified > startOfDay("-7d") //modified in the last 7 days
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var retList = [];
- var list = resp.results;
- if (list)
- {
- //Add items in the list
- for (var i = 0; i < list.length; i++)
- {
- try
- {
- var attInfo = JSON.parse(decodeURIComponent(list[i]["body"]["storage"]["value"]));
-
- retList.push({
- title: list[i].title,
- url: "/download/attachments/" + attInfo.pageId + "/"
- + encodeURIComponent(attInfo.diagramName)
- + '?version=' + attInfo.version,
- info: {
- id: list[i].id,
- contentId: list[i].id,
- custContentId: list[i].id,
- contentVer: list[i].version.number,
- pageId: attInfo.pageId,
- version: attInfo.version,
- name: attInfo.diagramName,
- displayName: list[i].title
- },
- imgUrl: baseUrl + "/download/attachments/" + attInfo.pageId + "/"
- + encodeURIComponent(attInfo.diagramName)
- + ".png?api=v2&version=" + attInfo.version
- });
- }
- catch(e)
- {
- //ignore, this should not happen!
- console.log(e);
- }
- }
- }
-
- success(retList);
- },
- error : error
- });
-};
-
-AC.getPageDrawioDiagrams = function(pageId, success, error)
-{
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + pageId + '/child/ac:com.mxgraph.confluence.plugins.diagramly:drawio-diagram?limit=100&expand=body.storage,version',
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
- var retList = [];
- var list = resp.results;
-
- if (list)
- {
- //Add items in the list
- for (var i = 0; i < list.length; i++)
- {
- try
- {
- var attInfo = JSON.parse(decodeURIComponent(list[i]["body"]["storage"]["value"]));
- var diagramName = list[i].title.replace('.drawio', '');
-
- retList.push({
- title: diagramName,
- url: "/download/attachments/" + attInfo.pageId + "/"
- + encodeURIComponent(attInfo.diagramName)
- + '?version=' + attInfo.version,
- info: {
- id: list[i].id,
- contentId: list[i].id,
- custContentId: list[i].id,
- contentVer: list[i].version.number,
- pageId: attInfo.pageId,
- version: attInfo.version,
- name: attInfo.diagramName,
- displayName: diagramName
- },
- imgUrl: baseUrl + "/download/attachments/" + attInfo.pageId + "/"
- + encodeURIComponent(attInfo.diagramName)
- + ".png?api=v2&version=" + attInfo.version
- });
- }
- catch(e)
- {
- //ignore, this should not happen!
- console.log(e);
- }
- }
- }
-
- success(retList);
- },
- error: error
- });
-};
-
-AC.getCustomTemplates = function(success, error)
-{
- var customCats = {};
- var customCatsCount = 0;
- var customCatsDone = 0;
-
- function checkDone()
- {
- customCatsDone++;
-
- if (customCatsCount == customCatsDone)
- {
- success(customCats, customCatsDone);
- }
- }
-
- AP.request({
- type: 'GET',
- url: '/rest/api/content/search?cql=type%3Dpage%20and%20space%3DDRAWIOCONFIG%20and%20title%3DTemplates', //type=page and space=DRAWIOCONFIG and title=Templates.
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.size == 1)
- {
- var tempPageId = resp.results[0].id;
- //load the configuration file
- AP.request({
- type: 'GET',
- url: '/rest/api/content/search?limit=50&cql=type%3Dpage%20and%20space%3DDRAWIOCONFIG%20and%20ancestor%3D' + tempPageId, //type=page and space=DRAWIOCONFIG and ancestor={tempPageId}. Limit 50 which is most probably more than enough
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.size > 0)
- {
- for (var i = 0; i < resp.results.length; i++)
- {
- var cat = resp.results[i];
- customCats[cat.title] = [];
- customCatsCount++;
-
- (function(cat2){
- AC.getPageDrawioDiagrams(cat2.id, function(catList)
- {
- customCats[cat2.title] = catList;
- checkDone();
- }, checkDone); //On error, just ignore this page
- })(cat);
- }
- }
- else
- {
- success({}, 0);
- }
- },
- error: error
- });
- }
- else
- {
- success({}, 0);
- }
- },
- error: error
- });
-};
-
-AC.init = function(baseUrl, location, pageId, editor, diagramName, initialXml, draftName, draftXml, macroData, draftPage)
-{
- // Hides the logo
- document.body.style.backgroundImage = 'none';
- var user = null;
-
- AP.user.getCurrentUser(function(atlUser)
- {
- user = atlUser.atlassianAccountId;
- });
-
- var draftExists = false;
-
- var diagramDisplayName = diagramName, contentId = null, contentVer = null, lastMacroVer = null, revision = null;
-
- if (macroData != null)
- {
- diagramDisplayName = macroData.diagramDisplayName || diagramName;
- contentId = macroData.contentId || macroData.custContentId;
- contentVer = macroData.contentVer;
- lastMacroVer = macroData.revision;
- AC.aspect = macroData.aspect;
- AC.hiResPreview = macroData.hiResPreview != null? macroData.hiResPreview == '1' : AC.hiResPreview;
- }
-
- //keeping the block of AP.require to minimize the number of changes!
- {
- var newPage = location.indexOf('createpage.action') > -1 ? true : false;
- var diagramXml = null;
- var link = document.createElement('a');
- link.href = location.href;
- link.href = link.href; //to have 'host' populated under IE
- var hostUrl = link.protocol + '//' + link.hostname;
-
- function removeDraft(fn, err)
- {
- if (draftExists)
- {
- AC.removeAttachment(pageId, draftName, fn, err);
- }
- else
- {
- fn();
- }
- };
-
- function saveDraft(xml, fn, err)
- {
- //console.trace('DRAFT: Save', draftName, xml);
-
- AC.saveDiagram(pageId, draftName,
- xml,
- function(res)
- {
- var obj = null;
-
- try
- {
- obj = JSON.parse(res);
- }
- catch (e)
- {
- // ignore
- }
-
- //console.trace('DRAFT: Saved', obj);
-
- if (obj != null && obj.error != null)
- {
- if (err != null)
- {
- err(obj);
- }
- }
- else
- {
- draftExists = true;
-
- if (fn != null)
- {
- fn(obj);
- }
- }
- },
- function(res)
- {
- //console.trace('DRAFT: Save error');
- var obj = null;
-
- try
- {
- obj = JSON.parse(res);
- }
- catch (e)
- {
- // ignore
- }
-
- if (obj != null && obj.error != null)
- {
- if (err != null)
- {
- err(obj);
- }
- }
- }, false, 'application/vnd.jgraph.mxfile', mxResources.get('createdByDraw'), false, draftPage);
- };
-
- function showTemplateDialog()
- {
- if (AC.draftEnabled)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'template', callback: true, enableRecent: true, enableSearch: true, enableCustomTemp: true}), '*');
- }
- else
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'template', enableRecent: true, enableSearch: true, enableCustomTemp: true}), '*');
- }
- };
-
- function promptName(name, err, errKey)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'prompt',
- titleKey: 'filename', okKey: 'save', defaultValue: name || '' }), '*');
-
- if (err != null || errKey != null)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: err, messageKey: errKey,
- buttonKey: 'ok'}), '*');
- }
- };
-
- function checkName(name, fn, err)
- {
- if (name == null || name.length == 0)
- {
- err(name, mxResources.get('filenameShort'));
- }
- else if (/[&\*+=\\;/{}|\":<>\?~]/g.test(name))
- {
- err(name, mxResources.get('invalidChars') + ' \\ / | : { } < > & + ? = ; * " ~');
- }
- else
- {
- name = name.trim();
- //TODO do a search instead if possible
- AC.getPageAttachments(pageId, function(attachments)
- {
- var draftPattern = new RegExp('^~drawio~.*~' + name.
- replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + '.tmp$', 'i');
- var lc = name.toLowerCase();
- var dn = AC.draftPrefix + lc + AC.draftExtension
- var fileExists = false;
-
- // Checks if any files will be overwritten
- for (var i = 0; i < attachments.length && !fileExists; i++)
- {
- // To avoid name clash with new diagrams of other users,
- // we need to check for ~drawio~.*~filename.tmp
- var an = attachments[i].title.toLowerCase();
-
- if (an == lc || an == lc + '.png' || (AC.draftEnabled &&
- (an == dn || draftPattern.test(an))))
- {
- fileExists = true;
- }
- }
-
- if (fileExists)
- {
- err(name, mxResources.get('alreadyExst', [name]));
- }
- else
- {
- fn(name);
- }
-
- }, function(res)
- {
- // TODO: What error message to return here?
- err(name, res);
- });
- }
- };
-
- var autosaveThread = null;
- var autosaveCounter = 0;
- var currentXml = null;
-
- // Shows template dialog for new diagrams with no draft state
- if (initialXml != '')
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'load',
- autosave: 1, xml: initialXml, title: diagramDisplayName,
- macroData: macroData}), '*');
- }
-
- if (draftXml != null)
- {
- // Keeps ignore option even for existing files
- editor.contentWindow.postMessage(JSON.stringify({action: 'draft', xml: draftXml,
- name: diagramDisplayName, discardKey: 'discardChanges', ignore: true}), '*');
- }
- else if (initialXml == '')
- {
- showTemplateDialog();
- }
-
- var messageListener = function(evt)
- {
- if (typeof window.AC !== 'undefined' && evt.origin == hostUrl)
- {
- var drawMsg = JSON.parse(evt.data);
-
- if (drawMsg.event == 'draft')
- {
- if (drawMsg.error != null)
- {
- //console.log('DRAFT: error', drawMsg);
-
- editor.parentNode.removeChild(editor);
-
- AC.showNotification({
- title: mxResources.get('draftReadErr'),
- body: drawMsg.error,
- type: 'error',
- close: 'manual'
- });
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
-// messages.onClose(message, function()
-// {
- AP.dialog.close();
-// });
- }
- else if (drawMsg.result == 'edit')
- {
- // Use draft
- //console.trace('DRAFT: Using', draftName);
-
- editor.contentWindow.postMessage(JSON.stringify({action: 'load',
- autosave: 1, xml: drawMsg.message.xml, title: diagramDisplayName}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'status',
- messageKey: 'unsavedChanges', modified: true}), '*');
- draftExists = true;
- }
- else
- {
- if (drawMsg.result == 'discard')
- {
- //console.trace('DRAFT: Discarding', draftName);
-
- AC.removeAttachment(pageId, draftName);
- }
-
- if (initialXml == '' || drawMsg.result == 'ignore')
- {
- if (initialXml != '')
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'load',
- autosave: 1, xml: initialXml, title: diagramDisplayName,
- macroData: macroData}), '*');
- }
- else
- {
- diagramName = null;
- showTemplateDialog();
- }
- }
- }
- }
- else if (drawMsg.event == 'template')
- {
- AC.curDiagId = false; //New diagram, so no diagram id
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: true, messageKey: 'inserting'}), '*');
-
- if (drawMsg.docUrl)
- {
- checkName(drawMsg.name, function(name)
- {
- diagramName = name;
- diagramDisplayName = name;
-
- //keeping the block of AP.require to minimize the number of changes!
- {
- var loadTemplate = function(version)
- {
- AP.request({
- url: drawMsg.docUrl + (version != null? "?version=" + version : ""),
- success: function(xml)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'load',
- autosave: 1, xml: xml, title: diagramDisplayName}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- },
- error : function(resp)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: mxResources.get('diagCantLoad'), messageKey: null,
- buttonKey: 'ok'}), '*');
- }
- });
- }
-
- AP.request({
- url: '/rest/api/content/' + drawMsg.info.id,
- success: function(resp)
- {
- resp = JSON.parse(resp);
-
- try
- {
- loadTemplate(resp.version.number);
- }
- catch(e)
- {
- loadTemplate();
- }
- },
- error : function(resp)
- {
- loadTemplate();
- }
- });
- };
- },
- function(name, err, errKey)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: err, messageKey: errKey,
- buttonKey: 'ok'}), '*');
- });
- }
- else
- {
- checkName(drawMsg.name, function(name)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- diagramName = name;
- diagramDisplayName = name;
-
- if (AC.draftEnabled)
- {
- draftName = '~drawio~' + user + '~' + diagramName + AC.draftExtension;
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: true, messageKey: 'inserting'}), '*');
-
- saveDraft(drawMsg.xml, function()
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'load',
- autosave: 1, xml: drawMsg.xml, title: diagramDisplayName}), '*');
- },
- function()
- {
- editor.parentNode.removeChild(editor);
-
- AC.showNotification({
- title: mxResources.get('draftWriteErr'),
- body: mxResources.get('draftCantCreate'),
- type: 'error',
- close: 'manual'
- });
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
-// messages.onClose(message, function()
-// {
- AP.dialog.close();
-// });
- });
- }
- else
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'load',
- autosave: 1, xml: drawMsg.xml, title: diagramDisplayName}), '*');
- }
- },
- function(name, err, errKey)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: err, messageKey: errKey,
- buttonKey: 'ok'}), '*');
- });
- }
- }
- else if (drawMsg.event == 'autosave')
- {
- // Saves all changes to draft attachment
- currentXml = drawMsg.xml;
-
- if (autosaveThread == null && AC.draftEnabled)
- {
- //console.trace('DRAFT: Starting timer');
-
- autosaveThread = window.setTimeout(function()
- {
- //console.log('DRAFT: Saving', currentXml);
-
- autosaveThread = null
- saveDraft(currentXml);
- autosaveCounter++;
- }, (autosaveCounter == 0) ? 0 : AC.autosaveTimeout);
- }
- }
- else if (drawMsg.event == 'exit')
- {
- removeDraft(function()
- {
- //revision is non-null if the diagram is saved
- AP.dialog.close(revision? {newRev: revision, newContentVer: contentVer, newContentId: contentId, newAspect: AC.aspect} : null);
- });
- }
- else if (drawMsg.event == 'save')
- {
- diagramXml = drawMsg.xml;
-
- if (diagramName == null)
- {
- promptName('');
- }
- else
- {
- var aspectObj = AC.getAspectObj();
-
- //Copy & Paste causes multiple diagrams in a page to have the same attachment name. Rename doesn't help as it only changes the display name (not the attachment name)
- //So, prompt the use for a new attachment name
- AP.request({
- url: '/rest/api/content/' + pageId + '/?expand=body.storage,version&status=draft', //always request draft content which will match published content if no draft is found
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- var page = JSON.parse(resp);
-
- //find all macros and check if diagram name (attachment) is used more than once
- var foundMacros = page.body.storage.value.match(AC.findMacrosRegEx);
- matchingCount = 0;
-
- for (var i = 0; foundMacros != null && i < foundMacros.length; i++)
- {
- var macroDiagName = foundMacros[i].match(AC.findMacroParamRegEx["diagramName"]);
-
- if (macroDiagName != null && macroDiagName[1] == diagramName)
- {
- matchingCount++;
- }
- }
-
- if (matchingCount > 1)
- {
- promptName(diagramName, mxResources.get('confDuplName'));
- }
- else
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'export',
- format: 'png', spinKey: 'saving', scale: AC.hiResPreview? 2 : 1,
- pageId: aspectObj.pageId, layerIds: aspectObj.layerIds, message: drawMsg}), '*');
-
- }
- },
- error : function(resp)
- {
- //We can safely ignore errors to avoid complicating loading diagram process
- editor.contentWindow.postMessage(JSON.stringify({action: 'export',
- format: 'png', spinKey: 'saving', scale: AC.hiResPreview? 2 : 1,
- pageId: aspectPageId, layerIds: aspectLayerIds, message: drawMsg}), '*');
- }
- });
- }
- }
- else if (drawMsg.event == 'prompt')
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: true, messageKey: 'inserting'}), '*');
-
- checkName(drawMsg.value, function(name)
- {
- var aspectObj = AC.getAspectObj();
-
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- diagramName = name;
- diagramDisplayName = name;
- contentId = null;
- contentVer = null;
- editor.contentWindow.postMessage(JSON.stringify({action: 'export',
- format: 'png', spinKey: 'saving', scale: AC.hiResPreview? 2 : 1,
- pageId: aspectObj.pageId, layerIds: aspectObj.layerIds}), '*');
- },
- function(name, err, errKey)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- promptName(name, err, errKey);
- });
- }
- else if (drawMsg.event == 'rename')
- {
- //If diagram name is not set yet, use the new name for both file and diagram
- //TODO should we disable renaming if diagramName is null?
- if (diagramName == null)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: true}), '*');
-
- checkName(drawMsg.name, function(name)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- diagramName = name;
- diagramDisplayName = name;
- },
- function(name, err, errKey)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: err, messageKey: errKey,
- buttonKey: 'ok'}), '*');
- });
- }
- else
- {
- diagramDisplayName = drawMsg.name;
- }
-
- editor.contentWindow.postMessage(JSON.stringify({action: 'status',
- messageKey: 'unsavedChanges', modified: true}), '*');
- }
- else if (drawMsg.event == 'export')
- {
- // Proceeds from sending the export message by saving the exported files
- var imageData = drawMsg.data.substring(drawMsg.data.indexOf(',') + 1);
- var diaWidth = drawMsg.bounds.width / drawMsg.scale;
- var diaHeight = drawMsg.bounds.height / drawMsg.scale;
-
- function showError(key, message)
- {
- var msg = {action: 'dialog', titleKey: 'error', modified: true, buttonKey: 'close'};
-
- if (message != null)
- {
- msg.message = message;
- }
- else
- {
- msg.messageKey = key || 'errorSavingFile';
- }
-
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
- editor.contentWindow.postMessage(JSON.stringify(msg), '*');
- };
-
- function saveError(err)
- {
- var key = null;
- var message = null;
-
- if (err.status == 409)
- {
- diagramName = null;
- key = 'fileExists';
- }
- else if (err.status == 401)
- {
- // Session expired
- message = mxResources.get('confSessionExpired') +
- ' <a href="' + baseUrl + '/pages/dashboard.action" target="_blank">' + mxResources.get('login') + '</a>';
- }
- else if (err.status == 400)
- {
- try
- {
- var errObj = JSON.parse(err.responseText);
-
- if (errObj.message.indexOf('Content body cannot be converted to new editor') > 0)
- {
- message = 'A Confluence Bug (CONFCLOUD-69902) prevented saving the page. Please edit the diagram from "Confluence Page Editor" where you can restore you changes from "File -> Revision history".';
- }
- }
- catch(e){} //Ignore
- }
-
- showError(key, message);
- };
-
- function successXml(responseText)
- {
- var resp = null;
- revision = '1';
-
- //TODO Why this code (Is it expected to have incorrect responseText?)
- try
- {
- resp = JSON.parse(responseText);
- }
- catch (e)
- {
- // Ignores and use default value for revision
- }
-
- // LATER: Get revision from metadata of attachment and check
- // what condition makes the response not contain an URL
- //TODO Is prev comment still needed with REST API?
- if (resp != null && resp.results != null && resp.results[0])
- {
- var attObj = resp.results[0];
- revision = attObj.version.number;
- //Save/update the custom content
- var spaceKey = AC.getSpaceKey(attObj._expandable.space);
- var pageType = attObj.container.type;
-
- AC.saveCustomContent(spaceKey, pageId, pageType, diagramName, diagramDisplayName, revision,
- contentId, contentVer,
- function(responseText)
- {
- var content = JSON.parse(responseText);
-
- contentId = content.id;
- contentVer = content.version? content.version.number : 1;
-
- AC.saveDiagram(pageId, diagramName + '.png', AC.b64toBlob(imageData, 'image/png'),
- successPng, saveError, false, 'image/png', mxResources.get('drawPrev'), false, draftPage);
- }, saveError, drawMsg.comments);
- }
- else
- {
- // Logs special case where save response has no URL
- try
- {
- var img = new Image();
- var message = 'Invalid Confluence Cloud response';
- img.src = '/images/2x2.png?msg=' + encodeURIComponent(message) +
- ((responseText != null) ? '&resp=' + encodeURIComponent(responseText) : '&resp=[null]');
- '&url=' + encodeURIComponent(window.location.href);
- }
- catch (err)
- {
- // do nothing
- }
-
- //TODO Save png here in case responseText is incorrect (But why it can be incorrect?)
- AC.saveDiagram(pageId, diagramName + '.png', AC.b64toBlob(imageData, 'image/png'),
- successPng, saveError, false, 'image/png', mxResources.get('drawPrev'), false, draftPage);
- }
-
- function successPng(pngResponseText)
- {
- try
- {
- // IMPORTANT: New macro parameters must be added to AC.macroParams to for adjustMacroParametersDirect to parse existing parameters correctly.
- var newMacroData = {
- diagramName: diagramName,
- diagramDisplayName: diagramDisplayName,
- revision: revision,
- pageId: newPage ? null : pageId,
- custContentId: contentId,
- contentVer: contentVer,
- baseUrl: baseUrl,
- width: diaWidth,
- height: diaHeight,
- tbstyle: (drawMsg.macroData != null && drawMsg.macroData.tbstyle) ? drawMsg.macroData.tbstyle : '',
- links: (drawMsg.macroData != null && drawMsg.macroData.links) ? drawMsg.macroData.links : '',
- simple: (drawMsg.macroData != null && drawMsg.macroData.simple != null) ? drawMsg.macroData.simple : '0',
- lbox: (drawMsg.macroData != null && drawMsg.macroData.lbox != null) ? drawMsg.macroData.lbox : '1',
- zoom: (drawMsg.macroData != null && drawMsg.macroData.zoom != null) ? drawMsg.macroData.zoom : '1',
- pCenter: (drawMsg.macroData != null && drawMsg.macroData.pCenter != null) ? drawMsg.macroData.pCenter : '0',
- aspect: AC.aspect,
- inComment: AC.inComment? '1' : '0'
- };
-
- //Set the hiResPreview only if the user set it in the UI which overrides the global settings
- if (drawMsg.macroData != null && drawMsg.macroData.hiResPreview != null)
- {
- newMacroData.hiResPreview = drawMsg.macroData.hiResPreview;
- }
-
- var finalizeSaving = function()
- {
- if (AC.autoExit || drawMsg.message == null || drawMsg.message.message == null || drawMsg.message.message.exit)
- {
- var savingCallback = function()
- {
- removeDraft(function()
- {
- AP.dialog.close({newRev: revision, newContentVer: contentVer, newContentId: contentId, newAspect: AC.aspect});
- });
- };
-
- //Save indexing text
- //Exit is done when the response is received!
- //This is needed for advanced search by draw.io diagrams type
- AC.remoteInvoke('getDiagramTextContent', null, null, function(textContent)
- {
- AC.saveContentSearchBody(contentId, diagramDisplayName + ' ' + textContent,
- savingCallback, savingCallback); //ignore error and just exit
- }, savingCallback);
- }
- else
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', message: '', modified: false}), '*');
- }
- };
-
- if (AC.customContentEditMode)
- {
- //load the page to edit the macro
- AC.findMacroInPage(pageId, diagramName, lastMacroVer, function(macroFound, originalBody, matchingMacros, page)
- {
- if (macroFound)
- {
- AC.adjustMacroParametersDirect(pageId, newMacroData, originalBody, matchingMacros, page, finalizeSaving, saveError);
- lastMacroVer = revision; //for next save
- }
- else //macro is not found in the page content, so just continue with saving instead of showing an error and losing users modifications
- {
- //Using alert here to pause execution as some execution flows go back and Confluence error messages will be lost
- //In strandedMode, we already warned the user at the beginning
- if (!AC.strandedMode)
- {
- alert(mxResources.get('confDiagEditedExt'));
- }
-
- finalizeSaving();
- }
- }, saveError);
- }
- else
- {
- AP.confluence.saveMacro(newMacroData);
- finalizeSaving();
- }
- }
- catch (e)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
- editor.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'errorSavingFile', message: e.message, buttonKey: 'ok'}), '*');
- }
- };
- };
-
- if (diagramName != null)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: true, messageKey: 'saving'}), '*');
-
- AC.saveDiagram(pageId, diagramName, diagramXml,
- successXml, saveError, false, 'application/vnd.jgraph.mxfile', mxResources.get('drawDiag'), false, draftPage);
- }
- }
- else if (drawMsg.event == 'remoteInvoke')
- {
- AC.handleRemoteInvoke(drawMsg);
- }
- else if (drawMsg.event == 'remoteInvokeResponse')
- {
- AC.handleRemoteInvokeResponse(drawMsg);
- }
- }
- };
-
- window.addEventListener('message', messageListener);
- editor.contentWindow.postMessage(JSON.stringify({action: 'remoteInvokeReady'}), '*');
- AC.remoteWin = editor.contentWindow;
- };
-};
-
-AC.loadDiagram = function (pageId, diagramName, revision, success, error, owningPageId, tryRev1, dontCheckVer)
-{
- var curDiagName = diagramName;
- var curPageId = pageId;
- // TODO: Get binary
-
- //keeping the block of AP.require to minimize the number of changes!
- {
- var localSuccess = function(resp)
- {
- success(resp, curPageId, curDiagName);
- }
-
- AP.request({
- //TODO find out the ID of the page that actually holds the attachments because historical revisions do not have attachments
- url: '/download/attachments/' + pageId + '/' + encodeURIComponent(diagramName) +
- ((revision != null) ? '?version=' + revision : ''),
- success: localSuccess,
- error : function(resp)
- {
- //When a page is copied, attachments are reset to version 1 while the revision parameter remains the same
- if (tryRev1 && revision > 1 && resp.status == 404)
- {
- AP.request({
- url: '/download/attachments/' + pageId + '/' + encodeURIComponent(diagramName),
- success: localSuccess,
- error : function(resp) { //If revesion 1 failed, then try the owningPageId
- if (owningPageId && resp.status == 404)
- {
- curPageId = owningPageId;
- AP.request({
- url: '/download/attachments/' + owningPageId + '/' + encodeURIComponent(diagramName)
- +'?version=' + revision, //this version should exists in the original owning page
- success: localSuccess,
- error : function(resp)
- {
- if (/(^\s|\s$)/.test(diagramName))
- {
- AC.loadDiagram(pageId, diagramName.trim(), revision, success, error, owningPageId, tryRev1, dontCheckVer);
- }
- else
- {
- error(resp);
- }
- }
- });
- }
- }
- });
- }
- else if (owningPageId && resp.status == 404) //We are at revesion 1, so try the owningPageId directly
- {
- curPageId = owningPageId;
- AP.request({
- url: '/download/attachments/' + owningPageId + '/' + encodeURIComponent(diagramName),
- success: localSuccess,
- error : function(resp)
- {
- if (/(^\s|\s$)/.test(diagramName))
- {
- AC.loadDiagram(pageId, diagramName.trim(), revision, success, error, owningPageId, tryRev1, dontCheckVer);
- }
- else
- {
- error(resp);
- }
- }
- });
- }
- else
- {
- error(resp);
- }
- }
- });
- };
-};
-
-AC.findMacroInPage = function(pageId, diagramName, lastMacroVer, success, error, draftPage)
-{
- //load the page to edit the macro
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + pageId + '/?expand=body.storage,version' + (draftPage ? "&status=draft" : ""),
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- var page = JSON.parse(resp);
-
- var originalBody = page.body.storage.value;
-
- var foundMacros = originalBody.match(AC.findMacrosRegEx);
-
- var macroFound = false;
- var matchingMacros = [];
-
- for (var i = 0; foundMacros != null && i < foundMacros.length; i++)
- {
- var macroDiagName = foundMacros[i].match(AC.findMacroParamRegEx["diagramName"]);
- var macroRevision = foundMacros[i].match(AC.findMacroParamRegEx["revision"]);
-
- if (macroDiagName != null && macroRevision != null && macroDiagName[1] == diagramName && (macroRevision[1] == lastMacroVer || lastMacroVer == false))
- {
- var macroParams = {};
-
- for (var j = 0; j < AC.macroParams.length; j++)
- {
- var param = AC.macroParams[j];
- var val = foundMacros[i].match(AC.findMacroParamRegEx[param]);
-
- if (val != null)
- macroParams[param] = val[1];
- }
-
- matchingMacros.push({macro: foundMacros[i], macroParams: macroParams});
- macroFound = true;
- }
- }
-
- success(macroFound, originalBody, matchingMacros, page);
- },
- error: error
- });
-};
-
-//FIXME Confluence adjust macros in draft such that there is no way to adjust the content of drafts currently! So, drafts code is removed
-AC.adjustMacroParametersDirect = function(pageId, macroData, originalBody, matchingMacros, page, success, error)
-{
- for (var i = 0; i < matchingMacros.length; i++)
- {
- var modMacro = matchingMacros[i].macro;
-
- for (var param in macroData)
- {
- var pRegEx = AC.findMacroParamRegEx[param];
-
- //This to avoid errors if a new parameter/key is added to the macro and is not in the macro regexps
- if (pRegEx == null) continue;
-
- var newParamVal = '<ac:parameter ac:name="'+ param +'">' + macroData[param];
-
- //If parameter exists, change it. Otherwise, add it
- if (modMacro.match(pRegEx))
- {
- modMacro = modMacro.replace(pRegEx, newParamVal);
- }
- else
- {
- modMacro += newParamVal + "</ac:parameter>";
- }
- }
-
- originalBody = originalBody.replace(matchingMacros[i].macro, modMacro);
- }
-
- page.body.storage.value = originalBody;
- page.version.number++;
-
- AP.request({
- type: 'PUT',
- data: JSON.stringify(page),
- url: "/rest/api/content/" + pageId,
- contentType: "application/json",
- success: success,
- error: error
- });
-};
-
-AC.saveCustomContent = function(spaceKey, pageId, pageType, diagramName, diagramDisplayName, revision, contentId, contentVer, success, error, comments, reportAllErr)
-{
- //Make sure comments are not lost
- if (comments == null)
- {
- AC.getOldComments(contentId, function(comments)
- {
- AC.saveCustomContent(spaceKey, pageId, pageType, diagramName, diagramDisplayName, revision, contentId, contentVer, success, error, comments, reportAllErr);
- },
- //On error, whether the custom content is deleted or corrupted. It is better to proceed with saving and losing the comments than losing the diagram
- function()
- {
- AC.saveCustomContent(spaceKey, pageId, pageType, diagramName, diagramDisplayName, revision, contentId, contentVer, success, error, [], reportAllErr);
- });
-
- return;
- }
-
- var info = {
- "pageId": pageId,
- "diagramName": diagramName,
- "version": revision,
- "inComment": AC.inComment,
- "comments": comments || []
- };
-
- var customObj = {
- "type": "ac:com.mxgraph.confluence.plugins.diagramly:drawio-diagram",
- "space": {
- "key": spaceKey
- },
- "container": {
- "type": pageType,
- "id": pageId
- },
- "title": diagramDisplayName,
- "body": {
- "storage": {
- "value": encodeURIComponent(JSON.stringify(info)),
- "representation": "storage"
- }
- },
- "status": "current"
- };
-
- if (contentId)
- {
- customObj.version = {
- "number": ++contentVer
- };
- }
-
- //keeping the block of AP.require to minimize the number of changes!
- {
- AP.request({
- type: contentId? 'PUT' : 'POST',
- data: JSON.stringify(customObj),
- url: "/rest/api/content/" + (contentId? contentId : ""),
- contentType: "application/json",
- success: success,
- error: function(resp)
- {
- if (reportAllErr)
- {
- error(resp);
- return;
- }
-
- //User can delete a custom content externally and we will get error 403 and message will contain the given id
- //Then save a new one
- var err = JSON.parse(resp.responseText);
-
- //Sometimes the macro is not updated such that the version is not correct. The same happens when a page version is restored
- if (err.statusCode == 409 && err.message.indexOf("Current version is:") > 0)
- {
- //We will use the error message to detect the correct version instead of doing another request.
- //It should be safe as long as error messages are not translated or changed
- var curContentVer = err.message.match(/\d+/);
-
- if (curContentVer != null)
- {
- AC.saveCustomContent(spaceKey, pageId, pageType, diagramName, diagramDisplayName, revision, contentId, curContentVer[0], success, error, comments);
- }
- }
- //Sometimes, when a page is copied or site is cloned, custom contents are lost, so create a new one
- //For example, error 400: When a page is moved to another space, an error occur since the original custom content belong to another space/page
- else if (contentId != null)
- {
- AC.saveCustomContent(spaceKey, pageId, pageType, diagramName, diagramDisplayName, revision, null, null, success, error, comments);
- }
- else
- {
- error(resp);
- }
- }
- });
- };
-};
-
-AC.saveContentSearchBody = function(contentId, searchBody, success, error)
-{
- var doSaveSearchBody = function(version)
- {
- AC.setContentProperty(contentId, 'ac:custom-content:search-body', searchBody, version, success, error);
- };
-
-
- AC.getContentProperty(contentId, 'ac:custom-content:search-body', function(resp)
- {
- resp = JSON.parse(resp);
-
- doSaveSearchBody(resp.version.number);
- },
- function(resp)
- {
- var err = JSON.parse(resp.responseText);
-
- //if not found, create one
- if (err.statusCode == 404)
- {
- doSaveSearchBody();
- }
- else
- error();
- });
-};
-
-//TODO We can upload both the diagram and its png in one call if needed?
-AC.saveDiagram = function(pageId, diagramName, xml, success, error, newSave, mime, comment, sendNotif, draftPage)
-{
- loadSucess = function(resp)
- {
- error({status: 409, message: mxResources.get('fileExists')});
- };
-
- loadError = function(resp)
- {
- if (resp.status == 404) // file under given name does not exist means we can proceed with saving
- {
- doSave();
- }
- else
- {
- error({status: resp.status, message : resp.statusText });
- }
- };
-
- var sessionCheck = function(responseText)
- {
- if (responseText != null)
- {
- var obj = JSON.parse(responseText);
-
- if (obj != null && obj.code == -32600) //TODO is the codes the same with new REST APIs
- {
- error({status: 401});
-
- return;
- }
- }
-
- success(responseText);
- }
-
- doSave = function()
- {
- //keeping the block of AP.require to minimize the number of changes!
- {
- var attFile = (xml instanceof Blob)? xml : new Blob([xml], {type: mime});
- attFile.name = diagramName;
-
- var reqData = {file: attFile, minorEdit: !sendNotif};
- var draft = draftPage ? "?status=draft" : "";
-
- if (comment != null)
- {
- reqData.comment = comment;
- }
-
- AP.request({
- type: 'PUT',
- data: reqData,
- url: "/rest/api/content/"+ pageId +"/child/attachment" + draft,
- contentType: "multipart/form-data",
- success: sessionCheck,
- error: error
- });
- };
- };
-
- if(newSave && mime == 'application/vnd.jgraph.mxfile')
- {
- this.loadDiagram(pageId, diagramName, 0, loadSucess, loadError);
- }
- else
- {
- doSave();
- }
-};
-
-AC.removeAttachment = function(pageId, filename, fn, err)
-{
- if (pageId != null && filename != null)
- {
- var errFn = function()
- {
- if (err != null)
- {
- err();
- }
-
- if (fn != null)
- {
- fn();
- }
- };
-
- //Empty the draft file without deleting it to prevent email notifications
- var attFile = new Blob(['']);
- attFile.name = filename;
-
- var reqData = {
- file: attFile,
- minorEdit: true,
- comment: 'draw.io draft (D)'
- };
-
- AP.request({
- type: 'PUT',
- data: reqData,
- url: "/rest/api/content/"+ pageId +"/child/attachment",
- contentType: "multipart/form-data",
- success: function ()
- {
- if (fn != null)
- {
- fn();
- }
- },
- error: errFn
- });
- }
- else
- {
- fn();
- }
-};
-
-AC.getMacroData = function(fn)
-{
- AP.confluence.getMacroData(fn);
-}
-
-//From mxUtils
-AC.htmlEntities = function(s, newline)
-{
- s = String(s || '');
-
- s = s.replace(/&/g,'&amp;'); // 38 26
- s = s.replace(/"/g,'&quot;'); // 34 22
- s = s.replace(/\'/g,'&#39;'); // 39 27
- s = s.replace(/</g,'&lt;'); // 60 3C
- s = s.replace(/>/g,'&gt;'); // 62 3E
-
- if (newline == null || newline)
- {
- s = s.replace(/\n/g, '&#xa;');
- }
-
- return s;
-};
-
-AC.fromHtmlEntities = function(str)
-{
- var doc = new DOMParser().parseFromString(str || '', "text/html");
- return doc.documentElement.textContent;
-};
-
-AC.getCustomLibraries = function(callback, error)
-{
- var ret = [];
-
- function getChunk(url)
- {
- AP.request({
- type: 'GET',
- url: url,
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- for (var i = 0; i < resp.results.length; i++)
- {
- var obj = resp.results[i];
- ret.push({
- id: obj.id,
- title: obj.title,
- downloadUrl: obj._links? obj._links.download : null
- });
- }
-
- //Support pageing
- if (resp._links && resp._links.next)
- {
- getChunk(resp._links.next);
- }
- else
- {
- callback(ret);
- }
- },
- error: error
- });
- };
-
- AP.request({
- type: 'GET',
- url: '/rest/api/content/search?cql=type%3Dpage%20and%20space%3DDRAWIOCONFIG%20and%20title%3DLibraries', //type=page and space=DRAWIOCONFIG and title=Libraries. Search doesn't return 404 if not found
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.size == 1)
- {
- var libsPageId = resp.results[0].id;
-
- getChunk('/rest/api/content/' + libsPageId + '/child/attachment?limit=100');
- }
- else
- {
- callback(ret);
- }
- },
- error: error
- });
-};
-
-AC.getFileContent = function(url, callback, error)
-{
- AP.request({
- type: 'GET',
- url: url,
- contentType: 'text/xml;charset=UTF-8',
- success: function (fileContent)
- {
- callback(fileContent);
- },
- error: error
- });
-};
-
-AC.getCurrentUser = function(callback, error)
-{
- var baseUrl = AC.getBaseUrl();
-
- AP.request({
- type: 'GET',
- url: '/rest/api/user/current',
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- callback({
- id: resp.accountId,
- username: resp.username,
- email: resp.email,
- displayName: resp.displayName,
- pictureUrl: resp.profilePicture? baseUrl.substr(0, baseUrl.lastIndexOf('/')) + resp.profilePicture.path : null
- });
- },
- error: error
- });
-};
-
-AC.RESOLVED_MARKER = '$$RES$$ ';
-AC.REPLY_MARKER = '$$REP$$';
-AC.REPLY_MARKER_END = '$$ ';
-AC.DELETED_MARKER = '$$DELETED$$';
-AC.PREV_VERSIONS_KEY = '$$PREV_VER$$';
-AC.PREV_VERSIONS_START = '{"' + AC.PREV_VERSIONS_KEY + '": [';
-AC.PREV_VERSIONS_END = ']}';
-AC.COMMENTS_INDEX_PROP = 'commentsAttVerIndex';
-
-AC.getPrevVersionsComment = function(attId, attVer, callback, error)
-{
- AP.request({
- url : '/rest/api/content/' + attId +
- '/child/comment?limit=200&expand=body.storage&parentVersion=' + attVer,
- type : 'GET',
- success : function(comments)
- {
- comments = JSON.parse(comments).results;
- var count = comments.length;
- var prevVer = [];
-
- for (var i = 0; i < comments.length; i++)
- {
- var decCntn = decodeURIComponent(comments[i].body.storage.value);
-
- if (decCntn.indexOf(AC.PREV_VERSIONS_START) == 0)
- {
- count--;
-
- try
- {
- prevVer = JSON.parse(decCntn)[AC.PREV_VERSIONS_KEY];
- }
- catch(e){} //Ignore
- }
- }
-
- if (count > 0)
- {
- prevVer.push(attVer);
- }
-
- callback(prevVer.length == 0? null : AC.PREV_VERSIONS_START + prevVer.join(',') + AC.PREV_VERSIONS_END);
- },
- error : error
- });
-};
-
-//TODO Use of globals is risky and error-prone. Find another way to get attachment id and version?
-AC.commentsFnWrapper = function(fn, noErrCheck)
-{
- //Wait for attId and ver to be ready
- function wrappedFn()
- {
- if (AC.curDiagId == false && !noErrCheck)
- {
- //Call error (last argument)
- arguments[arguments.length - 1]();
- }
- else if (AC.curDiagId != null)
- {
- fn.apply(this, arguments);
- }
- else
- {
- var fnArgs = arguments;
- //Wait
- setTimeout(function()
- {
- wrappedFn.apply(this, fnArgs);
- }, 300);
- }
- }
-
- return wrappedFn;
-};
-
-AC.getComments = AC.commentsFnWrapper(function(attVer, checkUnresolvedOnly, success, error)
-{
- function isResolvedComment(atlasComment)
- {
- if (atlasComment.children != null)
- {
- var lastReply = atlasComment.children.comment.results.pop();
-
- if (lastReply != null && decodeURIComponent(lastReply.body.storage.value).indexOf(AC.RESOLVED_MARKER) == 0)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- };
-
- var attId = AC.curDiagId;
- attVer = attVer || AC.curDiagVer;
-
- var confComments = [], remaining;
-
- if (attId)
- {
- AC.getCommentsAttVersIndex(attId, function()
- {
- remaining = AC.curCommentIndex.length;
- doNextChunk();
- indexIntegrityCheck();
- }, function()
- {
- indexIntegrityCheck(function()
- {
- remaining = AC.curCommentIndex.length;
- doNextChunk();
- }, error);
- });
-
- function indexIntegrityCheck(callback, error)
- {
- if (checkUnresolvedOnly && callback == null) return;
-
- AC.getAttVersWithComments(attId, attVer, function(vers, versMap)
- {
- var matches = 0;
-
- for (var i = 0; i < AC.curCommentIndex.length; i++)
- {
- if (versMap[AC.curCommentIndex[i]])
- {
- matches++;
- }
- }
-
- if (matches != vers.length || AC.curCommentIndex.length != vers.length)
- {
- AC.curCommentIndex = vers;
- AC.setCommentsAttVersIndex(attId, vers);
- }
-
- if (callback)
- {
- callback();
- }
- },
- function()
- {
- console.log('Error while checking integrity of comments index for ' + attVer); //TODO What to do when integrity call fails?
-
- if (error)
- {
- error();
- }
- });
- };
-
- function doGetComments(ver, callback, error)
- {
- AP.request({
- url : '/rest/api/content/' + attId +
- '/child/comment?limit=200&expand=body.storage,version,history,children.comment.body.storage,children.comment.version,children.comment.history' +
- '&parentVersion=' + ver,
- type : 'GET',
- success : function(comments)
- {
- //TODO handle paging or 200 comments + 25 replies are enough?
- comments = JSON.parse(comments).results;
-
- for (var i = 0; i < comments.length; i++)
- {
- if (checkUnresolvedOnly)
- {
- if (!isResolvedComment(comments[i]))
- {
- success(true);
- return;
- }
- }
- else
- {
- comments[i].attVer = ver;
- confComments.push(comments[i]);
- }
- }
-
- callback();
- },
- error : error
- });
- };
-
- function doNextChunk()
- {
- remaining--;
-
- if (remaining < 0)
- {
- success(checkUnresolvedOnly? false : confComments, AC.getSiteUrl());
- return;
- }
-
- doGetComments(AC.curCommentIndex[remaining], doNextChunk, error);
- }
- }
- else
- {
- error({message: mxResources.get('saveDiagramFirst', null, 'Save diagram first!')});
- }
-}, true);
-
-AC.hasUnresolvedComments = function(pageId, contentId, diagramName, callback, error)
-{
- AC.getOldComments(contentId, function(comments)
- {
- var hasOldComments = false;
-
- for (var i = 0; i < comments.length; i++)
- {
- if (comments[i].isDeleted) continue;
-
- hasOldComments = true;
-
- if (!comments[i].isResolved)
- {
- callback(true);
- break;
- }
- }
-
- if (!hasOldComments)
- {
- //Get current diagram information which is needed for comments
- //This call is needed since we allow calling this from viewer without using AC.loadDiagram
- //TODO viewer needs to use AC for interaction with Confluence
- AC.getAttachmentInfo(pageId, diagramName, function(info)
- {
- AC.curDiagVer = info.version.number;
- AC.curDiagId = info.id;
-
- AC.getComments(null, true, callback, error);
- },
- error);
- }
- },
- error);
-};
-
-AC.setCommentsAttVersIndex = function(attId, vers)
-{
- AC.setContentProperty(attId, AC.COMMENTS_INDEX_PROP, JSON.stringify(vers), AC.curCommentIndexVer,
- function(resp)
- {
- resp = JSON.parse(resp);
- AC.curCommentIndexVer = resp.version.number;
- },
- function(){}); //Ignore errors
-};
-
-AC.getCommentsAttVersIndex = function(attId, success, error)
-{
- AC.getContentProperty(attId, AC.COMMENTS_INDEX_PROP, function(resp)
- {
- resp = JSON.parse(resp);
- AC.curCommentIndexVer = resp.version.number;
-
- try
- {
- AC.curCommentIndex = JSON.parse(resp.value);
-
- if (AC.curCommentIndex.length > AC.curDiagVer)
- {
- AC.curCommentIndex = []; //The length of the index cannot exceed the number of the versions, so, index is corrupt
- }
- }
- catch(e)
- {
- AC.curCommentIndex = [];
- }
-
- success(AC.curCommentIndex);
- }, function()
- {
- AC.curCommentIndex = [];
- error();
- });
-};
-
-AC.getAttVersWithComments = function(attId, attVer, callback, error)
-{
- var start = 1;
- var vers = [], versMap = {};
-
- function checkChunk(start, end, callback, error)
- {
- var doneCount = 0, total = end - start + 1;
-
- function checkDone()
- {
- doneCount++;
-
- if (doneCount == total)
- {
- callback();
- }
- }
-
- function checkVer(ver)
- {
- AP.request({
- url : '/rest/api/content/' + attId +
- '/child/comment?limit=200&parentVersion=' + ver,
- type : 'GET',
- success : function(comments)
- {
- //TODO handle paging or 200 comments + 25 replies are enough?
- if (JSON.parse(comments).results.length > 0)
- {
- vers.push(ver);
- versMap[ver] = true;
- }
-
- checkDone();
- },
- error : error
- });
- };
-
- for (var i = start; i <= end; i++)
- {
- checkVer(i);
- }
- };
-
- function doNextChunk()
- {
- if (start > attVer)
- {
- callback(vers, versMap);
- return;
- }
-
- //Check all versions 5 at a time
- checkChunk(start, Math.min(start + 4, attVer), doNextChunk, error);
- start += 5;
- }
-
- doNextChunk();
-};
-
-AC.addComment = AC.commentsFnWrapper(function(commentContent, success, error)
-{
- var attId = AC.curDiagId;
-
- if (attId)
- {
- AP.request({
- url : '/rest/api/content',
- type : 'POST',
- data: JSON.stringify({
- type: 'comment',
- container: {
- "type": 'attachment',
- "id": attId
- },
- "body": {
- "storage": {
- "value": encodeURIComponent(commentContent),
- "representation": "storage"
- }
- }
- }),
- success : function(addedComment)
- {
- addedComment = JSON.parse(addedComment);
- success(addedComment.id, addedComment.version.number, AC.curDiagVer);
-
- //Add cur ver to list of versions
- if (AC.curCommentIndex.indexOf(AC.curDiagVer) == -1)
- {
- AC.curCommentIndex.push(AC.curDiagVer);
- AC.setCommentsAttVersIndex(attId, AC.curCommentIndex);
- }
- },
- error : error,
- contentType: 'application/json'
- });
- }
- else
- {
- error({message: mxResources.get('saveDiagramFirst', null, 'Save diagram first!')});
- }
-}, true);
-
-AC.addCommentReply = AC.commentsFnWrapper(function(parentId, parentAttVer, replyContent, doResolve, callback, error)
-{
- var attId = AC.curDiagId;
-
- //We cannot add replies to comments that belong to old versions of the attachment, so, as a workaround we add a special regular comment
- if (parentAttVer != AC.curDiagVer)
- {
- AC.addComment(AC.REPLY_MARKER + parentId + AC.REPLY_MARKER_END + (doResolve? AC.RESOLVED_MARKER : '') + replyContent, callback, error);
- }
- else
- {
- AP.request({
- url : '/rest/api/content',
- type : 'POST',
- data: JSON.stringify({
- "type": 'comment',
- "ancestors": [
- {
- "id": parentId
- }
- ],
- "container": {
- "type": 'attachment',
- "id": attId
- },
- "body": {
- "storage": {
- "value": encodeURIComponent((doResolve? AC.RESOLVED_MARKER : '') + replyContent),
- "representation": "storage"
- }
- }
- }),
- success : function(addedReply)
- {
- addedReply = JSON.parse(addedReply);
- callback(addedReply.id, addedReply.version.number);
- },
- error : function(xhr)
- {
- if (xhr.responseText.indexOf('messageKey=parent.comment.does.not.exist') > 0)
- {
- error({message: mxResources.get('parentCommentDel', null, 'Parent comment has been deleted. A reply cannot be added.')});
- }
- else
- {
- error(xhr)
- }
- },
- contentType: 'application/json'
- });
- }
-});
-
-AC.editComment = AC.commentsFnWrapper(function(id, version, newContent, success, error)
-{
- var attId = AC.curDiagId;
-
- AP.request({
- url : '/rest/api/content/' + id,
- type : 'PUT',
- data: JSON.stringify({
- "type": 'comment',
- "body": {
- "storage": {
- "value": encodeURIComponent(newContent),
- "representation": "storage"
- }
- },
- "container": {
- "type": 'attachment',
- "id": attId
- },
- "version": {
- "number": version + 1
- }
- }),
- success : function(editedComment)
- {
- editedComment = JSON.parse(editedComment);
- success(editedComment.version.number);
- },
- error : error,
- contentType: 'application/json'
- });
-});
-
-AC.deleteComment = function(id, version, hasReplies, success, error)
-{
- function doDel()
- {
- AP.request({
- url : '/rest/api/content/' + id,
- type : 'DELETE',
- success : success,
- error : error
- });
- };
-
- if (hasReplies)
- {
- //Mark as deleted if there is replies
- AC.editComment(id, version, AC.DELETED_MARKER, function()
- {
- success(true);
- }, error);
- }
- else
- {
- doDel();
- }
-};
-
-AC.getOldComments = function(contentId, callback, error)
-{
- if (contentId)
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + contentId + '/?expand=body.storage,version,container',
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- try
- {
- resp = JSON.parse(resp);
- var infoObj = JSON.parse(decodeURIComponent(resp.body.storage.value));
- var spaceKey = AC.getSpaceKey(resp._expandable.space);
- var pageId = resp.container.id;
- var pageType = resp.container.type;
- var contentVer = resp.version.number;
-
- callback(infoObj.comments || [], spaceKey, pageId, pageType, contentVer);
- }
- catch(e)
- {
- error(e);
- }
- },
- error: error
- });
- }
- else
- {
- callback([]);
- }
-};
-
-//Check if user can edit content (page or another content)
-//Confluence doesn't provide an easy way to check for permissions.
-// E.g., https://draw-test.atlassian.net/wiki/rest/api/content/{contentId}/restriction/byOperation/update/user?accountId={userAccountId}
-// It returns 404 even if the user has permission. It only returns 200 (OK) if the user is explicitly in restrictions list (doesn't check groups also)
-AC.userCanEdit = function(contentId, callback, error)
-{
- var userFound = false;
- var accountId, groupsCount, parsedGroups = 0;
-
- function checkGroupMembers(resp)
- {
- //If the user belong to multiple groups, callback will be called more than once
- if (userFound) return;
-
- resp = JSON.parse(resp);
-
- var list = resp.results;
-
- for (var i = 0; i < list.length; i++)
- {
- if (list[i].accountId == accountId)
- {
- callback(true);
- userFound = true;
- return;
- }
- }
-
- parsedGroups++;
-
- //All groups parsed
- if (groupsCount == parsedGroups)
- {
- callback(false);
- }
- };
-
- AP.user.getCurrentUser(function(user) {
- accountId = user.atlassianAccountId;
-
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + contentId + '/restriction/byOperation/update', //This API doesn't work well with paging, BUT 100 as a default limit looks enough
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.restrictions.user.size == 0) //When restrictions are empty, it means all are allowed
- {
- callback(true);
- }
- else
- {
- //Search users
- var list = resp.restrictions.user.results;
-
- for (var i = 0; i < list.length; i++)
- {
- if (list[i].accountId == accountId)
- {
- callback(true);
- userFound = true;
- break;
- }
- }
-
- //Check groups
- if (!userFound)
- {
- if (resp.restrictions.group.size == 0) //The owner must be in the list of editors, so, a group cannot exist without a user in the list
- {
- callback(false); //User cannot edit
- }
- else //For each group check its members!
- {
- var groups = resp.restrictions.group.results;
- groupsCount = groups.length;
-
- for (var i = 0; i < groups.length; i++)
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/group/' + encodeURIComponent(groups[i].name) + '/member',
- contentType: 'application/json;charset=UTF-8',
- success: checkGroupMembers,
- error: error
- });
- }
- }
- }
- }
- },
- error: error
- });
- });
-};
-
-AC.getPageInfo = function(urlOnly, success, error)
-{
- AP.getLocation(function(url)
- {
- if (urlOnly)
- {
- success({url: url});
- }
- else
- {
- AP.navigator.getLocation(function (location)
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + location.context.contentId,
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- resp = JSON.parse(resp);
- resp.url = url;
- success(resp);
- },
- error: error
- });
- });
-
- }
- });
-};
-
-AC.getContentProperty = function(contentId, propName, success, error)
-{
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + contentId + '/property/' + encodeURIComponent(propName) + '?expand=version',
- contentType: 'application/json;charset=UTF-8',
- success: success,
- error: error
- });
-};
-
-AC.setContentProperty = function(contentId, propName, propVal, propVersion, success, error)
-{
- var obj = {
- 'value': propVal
- };
-
- if (propVersion)
- {
- obj['version'] = {
- 'number': propVersion + 1,
- 'minorEdit': true
- };
- }
- else
- {
- obj['key'] = propName;
- }
-
- AP.request({
- url: '/rest/api/content/' + contentId + '/property' + (propVersion? '/' + encodeURIComponent(propName) + '?expand=version' : ''),
- type: propVersion? 'PUT' : 'POST',
- contentType: 'application/json',
- data: JSON.stringify(obj),
- success: success,
- error: error
- });
-};
-
-AC.getConfPageEditorVer = function(pageId, callback)
-{
- AC.getContentProperty(pageId, 'editor', function(resp)
- {
- resp = JSON.parse(resp);
- callback(resp.value == 'v2'? 2 : 1);
- }, function()
- {
- callback(1);// On error, assume the old editor
- })
-};
-
-AC.gotoAnchor = function(anchor)
-{
- AC.getPageInfo(false, function(info)
- {
- var url = info.url;
-
- if (url != null)
- {
- //remove any hash
- var hash = url.indexOf('#');
-
- if (hash > -1)
- {
- url = url.substring(0, hash);
- }
-
- AC.getConfPageEditorVer(info.id, function(ver)
- {
- if (ver == 1)
- {
- //When page title has a [ at the beginning, conf adds id- to anchor name
- url = url + '#' + (info.title.indexOf('[') == 0? 'id-' : '') +
- encodeURI(info.title.replace(/\s/g, '') + '-' + anchor.replace(/\s/g, ''));
- }
- else
- {
- url = url + '#' + encodeURIComponent(anchor.replace(/\s/g, '-'));
- }
-
- top.window.location = url;
- });
-
- }
- }, function()
- {
- //ignore as we cannot get the page info
- });
-};
-
-AC.getDiagramRevisions = function(diagramName, pageId, success, error)
-{
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + pageId + '/child/attachment',
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var attObj = null;
-
- for (var i = 0; i < resp.results.length; i++)
- {
- if (resp.results[i].title == diagramName)
- {
- attObj = resp.results[i];
- }
- }
-
- if (attObj != null)
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + attObj.id + '/version',
- contentType: 'application/json;charset=UTF-8',
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var revs = [];
-
- for (var i = 0; i < resp.results.length; i++)
- {
- var rev = resp.results[i];
-
- revs.unshift({
- modifiedDate: rev.when,
- lastModifyingUserName: rev.by? rev.by.displayName : '',
- downloadUrl: '/download/attachments/' + pageId + '/' + encodeURIComponent(diagramName) + '?version=' + rev.number,
- obj: rev
- });
- }
-
- success(revs);
- },
- error: error
- });
- }
- else
- {
- error();
- }
- },
- error: error
- });
-};
-
-AC.setHiResPreview = function(hiResPreview, success, error)
-{
- AC.hiResPreview = hiResPreview;
-};
-
-AC.setAspect = function(aspect, success, error)
-{
- AC.aspect = aspect;
-};
-
-AC.getAspectObj = function()
-{
- if (AC.aspect != null)
- {
- var aspectArray = AC.aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- return {pageId: aspectArray[0], layerIds: aspectArray.slice(1)};
- }
- }
-
- return {};
-};
-
-AC.getAttachmentInfo = function(pageId, attName, sucess, error)
-{
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + pageId + '/child/attachment?expand=version&filename=' +
- encodeURIComponent(attName),
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- var tmp = JSON.parse(resp);
-
- if (tmp.results && tmp.results.length == 1)
- {
- sucess(tmp.results[0]);
- }
- else
- {
- error({status: 404});
- }
- },
- error: error
- });
-};
-
-//White-listed functions and some info about it
-AC.remoteInvokableFns = {
- getRecentDiagrams: {isAsync: true},
- searchDiagrams: {isAsync: true},
- getCustomLibraries: {isAsync: true},
- getFileContent: {isAsync: true},
- getCurrentUser: {isAsync: true},
- getOldComments: {isAsync: true},
- getComments: {isAsync: true},
- addComment: {isAsync: true},
- addCommentReply: {isAsync: true},
- editComment: {isAsync: true},
- deleteComment: {isAsync: true},
- userCanEdit: {isAsync: true},
- getCustomTemplates: {isAsync: true},
- getPageInfo: {isAsync: true},
- getDiagramRevisions: {isAsync: true},
- setHiResPreview: {isAsync: false},
- setAspect: {isAsync: false}
-};
-
-AC.remoteInvokeCallbacks = [];
-
-AC.handleRemoteInvokeResponse = function(msg)
-{
- var msgMarkers = msg.msgMarkers;
- var callback = AC.remoteInvokeCallbacks[msgMarkers.callbackId];
-
- if (msg.error)
- {
- if (callback.error) callback.error(msg.error.errResp);
- }
- else if (callback.callback)
- {
- callback.callback.apply(this, msg.resp);
- }
-
- AC.remoteInvokeCallbacks[msgMarkers.callbackId] = null; //set it to null only to keep the index
-};
-
-//Here, the editor is ready before sending init even which starts everything, so no need for waiting for ready message. Init is enough
-AC.remoteInvoke = function(remoteFn, remoteFnArgs, msgMarkers, callback, error)
-{
- msgMarkers = msgMarkers || {};
- msgMarkers.callbackId = AC.remoteInvokeCallbacks.length;
- AC.remoteInvokeCallbacks.push({callback: callback, error: error});
- AC.remoteWin.postMessage(JSON.stringify({action: 'remoteInvoke', funtionName: remoteFn, functionArgs: remoteFnArgs, msgMarkers: msgMarkers}), '*');
-};
-
-AC.handleRemoteInvoke = function(msg)
-{
- function sendResponse(resp, error)
- {
- var respMsg = {action: 'remoteInvokeResponse', msgMarkers: msg.msgMarkers};
-
- if (error != null)
- {
- respMsg.error = {errResp: error};
- }
- else if (resp != null)
- {
- respMsg.resp = resp;
- }
-
- AC.remoteWin.postMessage(JSON.stringify(respMsg), '*');
- }
-
- try
- {
- //Remote invoke are allowed to call functions in AC
- var funtionName = msg.funtionName;
- var functionInfo = AC.remoteInvokableFns[funtionName];
-
- if (functionInfo != null && typeof AC[funtionName] === 'function')
- {
- var functionArgs = msg.functionArgs;
-
- //Confirm functionArgs are not null and is array, otherwise, discard it
- if (!Array.isArray(functionArgs))
- {
- functionArgs = [];
- }
-
- //for functions with callbacks (async) we assume last two arguments are success, error
- if (functionInfo.isAsync)
- {
- //success
- functionArgs.push(function()
- {
- sendResponse(Array.prototype.slice.apply(arguments));
- });
-
- //error
- functionArgs.push(function(err)
- {
- sendResponse(null, err || mxResources.get('unknownError'));
- });
-
- AC[funtionName].apply(this, functionArgs);
- }
- else
- {
- var resp = AC[funtionName].apply(this, functionArgs);
-
- sendResponse([resp]);
- }
- }
- else
- {
- sendResponse(null, mxResources.get('invalidCallFnNotFound', [funtionName]));
- }
- }
- catch(e)
- {
- sendResponse(null, mxResources.get('invalidCallErrOccured', [e.message]));
- }
-};
-
-//Allow loading of plugins (we need it for comments)
-AC.plugins = [];
-
-window.Draw = new Object();
-window.Draw.loadPlugin = function(callback)
-{
- AC.plugins.push(callback);
-};
-
-AC.loadPlugins = function(ui)
-{
- for (var i = 0; i < AC.plugins.length; i++)
- {
- AC.plugins[i](ui);
- }
-}; \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/cs_CZ.json b/src/main/webapp/connect/confluence/i18n/cs_CZ.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/cs_CZ.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/da_DK.json b/src/main/webapp/connect/confluence/i18n/da_DK.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/da_DK.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/de_DE.json b/src/main/webapp/connect/confluence/i18n/de_DE.json
deleted file mode 100644
index 9238b2ed..00000000
--- a/src/main/webapp/connect/confluence/i18n/de_DE.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Konfiguration",
- "drawDiagrams": "draw.io Diagramme",
- "drawioMacro": "draw.io Diagramm",
- "drawDesc": "Fügt eine neues draw.io Diagramm ein",
- "incDrawioMacro": "draw.io Diagramm einbetten",
- "embedDesc": "Bestehendes draw.io Diagramm einbetten",
- "legacyDrawioMacro": "Legacy Makro - bitte nicht verwenden",
- "legacyDesc": "Bitte nicht verwenden",
- "lightbox": "Vollbild",
- "drawViewer": "draw.io Ansicht",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Startbildschirm Editor",
- "diagramName": "Diagrammname (bitte nicht ändern)",
- "automaticSize": "automatische Grösse",
- "pPageID": "ID der übergeordneten Seite",
- "baseUrl": "Confluence Basis URL",
- "dWidth": "Diagrammbreite",
- "dHeight": "Diagrammhöhe",
- "macro.md.edit": "Markdown bearbeiten",
- "macro.md.insert": "Markdown einfügen"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/en.json b/src/main/webapp/connect/confluence/i18n/en.json
deleted file mode 100644
index b367d5b9..00000000
--- a/src/main/webapp/connect/confluence/i18n/en.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit Markdown",
- "macro.md.insert": "Insert Markdown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/es_ES.json b/src/main/webapp/connect/confluence/i18n/es_ES.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/es_ES.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/et_EE.json b/src/main/webapp/connect/confluence/i18n/et_EE.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/et_EE.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/fi_FI.json b/src/main/webapp/connect/confluence/i18n/fi_FI.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/fi_FI.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/fr_FR.json b/src/main/webapp/connect/confluence/i18n/fr_FR.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/fr_FR.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/hu_HU.json b/src/main/webapp/connect/confluence/i18n/hu_HU.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/hu_HU.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/is_IS.json b/src/main/webapp/connect/confluence/i18n/is_IS.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/is_IS.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/it_IT.json b/src/main/webapp/connect/confluence/i18n/it_IT.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/it_IT.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/ja_JP.json b/src/main/webapp/connect/confluence/i18n/ja_JP.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/ja_JP.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/ko_KR.json b/src/main/webapp/connect/confluence/i18n/ko_KR.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/ko_KR.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/nl_NL.json b/src/main/webapp/connect/confluence/i18n/nl_NL.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/nl_NL.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/no_NO.json b/src/main/webapp/connect/confluence/i18n/no_NO.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/no_NO.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/pl_PL.json b/src/main/webapp/connect/confluence/i18n/pl_PL.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/pl_PL.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/pt_BR.json b/src/main/webapp/connect/confluence/i18n/pt_BR.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/pt_BR.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/ro_RO.json b/src/main/webapp/connect/confluence/i18n/ro_RO.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/ro_RO.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/ru_RU.json b/src/main/webapp/connect/confluence/i18n/ru_RU.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/ru_RU.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/sk_SK.json b/src/main/webapp/connect/confluence/i18n/sk_SK.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/sk_SK.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/sv_SE.json b/src/main/webapp/connect/confluence/i18n/sv_SE.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/sv_SE.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/i18n/zh_CN.json b/src/main/webapp/connect/confluence/i18n/zh_CN.json
deleted file mode 100644
index df9b90b5..00000000
--- a/src/main/webapp/connect/confluence/i18n/zh_CN.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "gliffyImport": "draw.io Gliffy Import",
- "drawConfig": "draw.io Configuration",
- "drawDiagrams": "draw.io Diagrams",
- "drawioMacro": "draw.io Diagram",
- "drawDesc": "Inserts a new draw.io diagram",
- "incDrawioMacro": "Embed draw.io diagram",
- "embedDesc": "Embed an existing draw.io diagram",
- "legacyDrawioMacro": "Legacy macro - do not use",
- "legacyDesc": "Do not use",
- "lightbox": "Lightbox",
- "drawViewer": "draw.io Viewer",
- "drawEditor": "draw.io Editor",
- "drawSplashEditor": "draw.io Splash Editor",
- "diagramName": "Diagram name (do not change)",
- "automaticSize": "automatic size",
- "pPageID": "Parent page ID",
- "baseUrl": "Confluence Base URL",
- "dWidth": "Diagram width",
- "dHeight": "Diagram height",
- "macro.md.edit": "Edit MarkDown",
- "macro.md.insert": "Insert New MarkDown"
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/includeDiagram-1-4-8.js b/src/main/webapp/connect/confluence/includeDiagram-1-4-8.js
deleted file mode 100644
index d3a378fb..00000000
--- a/src/main/webapp/connect/confluence/includeDiagram-1-4-8.js
+++ /dev/null
@@ -1,1283 +0,0 @@
-function includeDiagramMain(confPageId, draftPage)
-{
- var EXPORT_URL = 'https://exp.draw.io/ImageExport4/export';
- var selectedDiagramInfo = null;
- var theMacroData = null;
- var selectedElt = null;
- var activeTab = 'recent';
- var recentLoaded = false;
- var searchLoaded = false;
- var curViewer = null;
- var attEditor, odEditor = null, gdEditor = null;
- var gSelFileContent = null;
- var gSelFileModifiedTS = null;
- var gAttVer = null;
- var async = false;
- var editMode = false;
- var gCsvFileContent = null;
-
- var opts =
- {
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
-
- function sha1 (str)
- {
- // discuss at: http://locutus.io/php/sha1/
- // original by: Webtoolkit.info (http://www.webtoolkit.info/)
- // improved by: Michael White (http://getsprink.com)
- // improved by: Kevin van Zonneveld (http://kvz.io)
- // input by: Brett Zamir (http://brett-zamir.me)
- // note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then
- // note 1: hashed. If available, we'd recommend using Node's native crypto modules directly
- // note 1: in a steaming fashion for faster and more efficient hashing
- // example 1: sha1('Kevin van Zonneveld')
- // returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
-
- var hash
- try {
- var crypto = require('crypto')
- var sha1sum = crypto.createHash('sha1')
- sha1sum.update(str)
- hash = sha1sum.digest('hex')
- } catch (e) {
- hash = undefined
- }
-
- if (hash !== undefined) {
- return hash
- }
-
- var _rotLeft = function (n, s) {
- var t4 = (n << s) | (n >>> (32 - s))
- return t4
- }
-
- var _cvtHex = function (val) {
- var str = ''
- var i
- var v
-
- for (i = 7; i >= 0; i--) {
- v = (val >>> (i * 4)) & 0x0f
- str += v.toString(16)
- }
- return str
- }
-
- var blockstart
- var i, j
- var W = new Array(80)
- var H0 = 0x67452301
- var H1 = 0xEFCDAB89
- var H2 = 0x98BADCFE
- var H3 = 0x10325476
- var H4 = 0xC3D2E1F0
- var A, B, C, D, E
- var temp
-
- // utf8_encode
- str = unescape(encodeURIComponent(str))
- var strLen = str.length
-
- var wordArray = []
- for (i = 0; i < strLen - 3; i += 4) {
- j = str.charCodeAt(i) << 24 |
- str.charCodeAt(i + 1) << 16 |
- str.charCodeAt(i + 2) << 8 |
- str.charCodeAt(i + 3)
- wordArray.push(j)
- }
-
- switch (strLen % 4) {
- case 0:
- i = 0x080000000
- break
- case 1:
- i = str.charCodeAt(strLen - 1) << 24 | 0x0800000
- break
- case 2:
- i = str.charCodeAt(strLen - 2) << 24 | str.charCodeAt(strLen - 1) << 16 | 0x08000
- break
- case 3:
- i = str.charCodeAt(strLen - 3) << 24 |
- str.charCodeAt(strLen - 2) << 16 |
- str.charCodeAt(strLen - 1) <<
- 8 | 0x80
- break
- }
-
- wordArray.push(i)
-
- while ((wordArray.length % 16) !== 14) {
- wordArray.push(0)
- }
-
- wordArray.push(strLen >>> 29)
- wordArray.push((strLen << 3) & 0x0ffffffff)
-
- for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) {
- for (i = 0; i < 16; i++) {
- W[i] = wordArray[blockstart + i]
- }
- for (i = 16; i <= 79; i++) {
- W[i] = _rotLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1)
- }
-
- A = H0
- B = H1
- C = H2
- D = H3
- E = H4
-
- for (i = 0; i <= 19; i++) {
- temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff
- E = D
- D = C
- C = _rotLeft(B, 30)
- B = A
- A = temp
- }
-
- for (i = 20; i <= 39; i++) {
- temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff
- E = D
- D = C
- C = _rotLeft(B, 30)
- B = A
- A = temp
- }
-
- for (i = 40; i <= 59; i++) {
- temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff
- E = D
- D = C
- C = _rotLeft(B, 30)
- B = A
- A = temp
- }
-
- for (i = 60; i <= 79; i++) {
- temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff
- E = D
- D = C
- C = _rotLeft(B, 30)
- B = A
- A = temp
- }
-
- H0 = (H0 + A) & 0x0ffffffff
- H1 = (H1 + B) & 0x0ffffffff
- H2 = (H2 + C) & 0x0ffffffff
- H3 = (H3 + D) & 0x0ffffffff
- H4 = (H4 + E) & 0x0ffffffff
- }
-
- temp = _cvtHex(H0) + _cvtHex(H1) + _cvtHex(H2) + _cvtHex(H3) + _cvtHex(H4)
- return temp.toLowerCase()
- };
-
- function showError(errMsg, nohide)
- {
- var errorMsg = document.getElementById('errorMsg');
- errorMsg.innerHTML = AC.htmlEntities(errMsg);
- errorMsg.className = 'fade';
-
- if (!nohide)
- {
- setTimeout(function()
- {
- errorMsg.className = '';
- }, 2000);
- }
- };
-
- function onSelect()
- {
- if (activeTab == 'extUrl')
- {
- var hasErr = false;
-
- if (!diagramUrl.value)
- {
- diagramUrl.style.border = '1px solid red';
- hasErr = true;
- }
-
- if (!diagramName.value)
- {
- diagramName.style.border = '1px solid red';
- hasErr = true;
- }
-
- if (hasErr)
- {
- return;
- }
-
- theMacroData = {
- baseUrl: baseUrl,
- diagramName: diagramName.value,
- diagramDisplayName: diagramName.value,
- diagramUrl: diagramUrl.value,
- includedDiagram: 1
- };
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }
- else if (activeTab == 'csvImp')
- {
- var hasErr = false;
-
- if (!csvFileUrl.value)
- {
- csvFileUrl.style.border = '1px solid red';
- hasErr = true;
- }
-
- if (!csvDiagName.value)
- {
- csvDiagName.style.border = '1px solid red';
- hasErr = true;
- }
-
- if (hasErr)
- {
- return;
- }
-
- theMacroData = {
- baseUrl: baseUrl,
- diagramName: csvDiagName.value,
- diagramDisplayName: csvDiagName.value,
- csvFileUrl: csvFileUrl.value,
- includedDiagram: 1
- };
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }
- else if (activeTab == 'gDrive')
- {
- gdEditor.doSubmit();
- }
- else if (activeTab == 'oneDrive')
- {
- odEditor.doSubmit();
- }
- else if (activeTab == 'upload')
- {
- attEditor.doSubmit();
- }
- else if (selectedDiagramInfo != null)
- {
- var info = selectedDiagramInfo.info;
- theMacroData = {
- diagramName: info.name,
- diagramDisplayName: info.displayName,
- pageId: info.pageId,
- custContentId: info.contentId || info.custContentId,
- baseUrl: baseUrl,
- includedDiagram: 1
- };
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }
- else
- {
- showError('Please select a diagram to insert it.');
- }
- };
-
- function onSubmit()
- {
- if (activeTab == 'current')
- {
- if (theMacroData != null && curViewer != null)
- {
- spinner.spin(document.getElementById('current'));
- AP.dialog.getButton('submit').disable();
- var aspectHash = null;
-
- if (!theMacroData.csvFileUrl)
- {
- var layerIds = [], pageId = curViewer.diagrams[curViewer.currentPage].getAttribute('id');
-
- var model = curViewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- var aspect = pageId + ' ' + layerIds.join(' ');
- aspectHash = sha1(aspect);
- theMacroData.aspect = aspect;
- theMacroData.aspectHash = aspectHash;
- }
-
- theMacroData.imgPageId = confPageId;
-
- var bounds = curViewer.graph.view.graphBounds;
- theMacroData.width = Math.round(bounds.width) || null;
- theMacroData.height = Math.round(bounds.height) || null;
-
- function saveMacro()
- {
- AP.confluence.saveMacro(theMacroData);
- AP.confluence.closeMacroEditor();
- };
-
- function saveError()
- {
- spinner.stop();
- AP.dialog.getButton('submit').enable();
- showError('Saving failed, please try again later.')
- };
-
- function doSaveImage(imageData)
- {
- if (imageData == null)
- {
- saveError();
- return;
- }
-
- AC.saveDiagram(confPageId, theMacroData.diagramName + (aspectHash? '-' + aspectHash : '') + '.png', AC.b64toBlob(imageData, 'image/png'),
- saveMacro, saveError, false, 'image/png', 'draw.io aspect image' + (gAttVer != null? ' - ' + gAttVer : ''), false, draftPage);
- };
-
- function serverFallback()
- {
-
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
- doSaveImage(null);
- }, 25000);
-
- var req = new mxXmlRequest(EXPORT_URL, 'format=png&base64=1' +
- (layerIds != null? '&extras=' + encodeURIComponent(JSON.stringify({layerIds: layerIds})) : '') +
- (pageId != null? '&pageId=' + pageId : '') + '&xml=' + encodeURIComponent(curViewer.xml));
-
- req.send(function(req)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- doSaveImage(req.getStatus() >= 200 && req.getStatus() <= 299? req.getText() : null);
- }
- },
- function()
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- doSaveImage(null);
- }
- });
-
- };
-
- function startSaving()
- {
- if (curViewer.editor.isExportToCanvas())
- {
- curViewer.editor.exportToCanvas(function(canvas)
- {
- var data = canvas.toDataURL('image/png');
- doSaveImage(data.substring(data.lastIndexOf(',') + 1));
- }
- , null, null, null, serverFallback);
- }
- else
- {
- serverFallback();
- }
- };
-
- //No caching is needed when referring to another conf diagram
- if (theMacroData.service != null || theMacroData.csvFileUrl != null || theMacroData.diagramUrl != null)
- {
- function saveDiagram()
- {
- AC.saveDiagram(confPageId, theMacroData.diagramName, gSelFileContent,
- startSaving, function(resp)
- {
- showError('Unexpected error. Cannot cannot save cached file');
- }, false, 'application/vnd.jgraph.mxfile.cached', 'Embedded draw.io diagram' + (gSelFileModifiedTS != null ? ' - ' + gSelFileModifiedTS : ''), false, draftPage);
- };
-
- function doSave()
- {
- if (theMacroData.csvFileUrl)
- {
- AC.saveDiagram(confPageId, theMacroData.diagramName + '.csv', gCsvFileContent,
- saveDiagram, function(resp)
- {
- showError('Unexpected error. Cannot cannot save cached file');
- }, false, 'text/csv', 'Embedded draw.io diagram (CSV)', false, draftPage);
- }
- else
- {
- saveDiagram();
- }
- };
-
- if (editMode)
- {
- doSave()
- }
- else
- {
- //Confirm filename is unique for new files
- AC.getPageAttachments(confPageId, function(attachments)
- {
- var fileExists = false;
- var lc = theMacroData.diagramName.toLowerCase();
-
- // Checks if any files will be overwritten
- for (var i = 0; i < attachments.length && !fileExists; i++)
- {
- var an = attachments[i].title.toLowerCase();
-
- if (an == lc)
- {
- fileExists = true;
- }
- }
-
- if (fileExists)
- {
- //Make filename unique
- theMacroData.diagramName = Date.now() + '-' + theMacroData.diagramName;
- }
-
- doSave();
- }, function(res)
- {
- showError('Unexpected error. Cannot cannot save cached file');
- });
- }
- }
- else
- {
- startSaving();
- }
- }
- else
- {
- showError('Unexpected error. Cannot show diagram');
- }
- }
- else
- {
- showError('Please select a diagram to insert it.');
- }
- };
-
- function deselectDiagram()
- {
- selectedDiagramInfo = null;
-
- if (selectedElt != null)
- {
- selectedElt.style.backgroundColor = 'transparent';
- selectedElt.style.border = '1px solid #ddd';
- }
- };
-
- function fillDiagramsList(list, listDiv, top, emptyMsg)
- {
- listDiv.innerHTML = '';
- var div = document.createElement('div');
- div.style.border = '1px solid #d3d3d3';
- div.style.margin = '6px 0 0 -1px';
- div.style.padding = '6px';
- div.style.overflow = 'auto';
- div.style.position = 'absolute';
- div.style.bottom = '10px';
- div.style.right = '10px';
- div.style.left = '10px';
- div.style.top = top + 'px';
-
- var w = 140;
- var h = 140;
-
- function selectElement(elt, infoObj)
- {
- deselectDiagram();
-
- selectedElt = elt;
- selectedDiagramInfo = infoObj;
-
- selectedElt.style.backgroundColor = '#e6eff8';
- selectedElt.style.border = '2px solid #ccd9ea';
- };
-
- function addButton(url, imgUrl, tooltip, infoObj)
- {
- var elt = document.createElement('div');
- elt.className = 'diagram';
- elt.style.height = w + 'px';
- elt.style.width = h + 'px';
-
- elt.setAttribute('title', tooltip);
-
- elt.style.backgroundImage = 'url(' + imgUrl + ')';
- elt.style.backgroundSize = 'contain';
- elt.style.backgroundPosition = 'center center';
- elt.style.backgroundRepeat = 'no-repeat';
-
- elt.addEventListener('click', function(evt)
- {
- selectElement(elt, infoObj);
- });
-
- elt.addEventListener('dblclick', function(evt)
- {
- selectedDiagramInfo = infoObj;
- onSelect();
- });
-
- div.appendChild(elt);
- }
-
- for (var i = 0; i < list.length; i++)
- {
- addButton(list[i].url, list[i].imgUrl, list[i].title, list[i]);
- }
-
- if (list.length == 0 && emptyMsg)
- {
- var msg = document.createElement('div');
- msg.style.width = '100%';
- msg.style.height = '100%';
- msg.style.textAlign = 'center';
- msg.innerHTML = AC.htmlEntities(emptyMsg);
-
- div.appendChild(msg);
- }
-
- listDiv.appendChild(div);
- return div;
- }
-
- function activateTab()
- {
- deselectDiagram();
- showError('', true);
- AP.dialog.getButton('selectBtn').show();
- AP.dialog.getButton('submit').hide();
- AP.dialog.getButton('submit').disable();
-
- switch (activeTab)
- {
- case 'recent':
- if (!recentLoaded)
- {
- recentLoaded = true;
- AC.getRecentDiagrams(function(retList)
- {
- fillDiagramsList(retList, document.getElementById('recentList'), 50, 'No recent diagrams found!');
- }, function()
- {
- showError('Failed to fetch recent diagrams.', true);
- });
- }
- break;
- case 'search':
- if (!searchLoaded)
- {
- searchLoaded = true;
- //fill the div with empty box
- fillDiagramsList([], document.getElementById('searchList'), 80, 'Use the search box to find draw.io diagrams');
- }
- break;
- case 'gDrive':
- if (gdEditor == null)
- {
- gdEditor = new GDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- gSelFileContent = selFileContent;
- gSelFileModifiedTS = new Date(selectedFile.modifiedDate).getTime();
- gAttVer = null;
- editMode = false;
- //Upload is the same as embedding an existing draw.io macro but without content id
- theMacroData = {
- diagramName: selectedFile.title,
- diagramDisplayName: selectedFile.title,
- pageId: confPageId,
- baseUrl: baseUrl,
- service: 'GDrive',
- sFileId: selectedFile.id,
- aspect: selectedFile.aspect,
- includedDiagram: 1
- };
-
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }, null, 'GD', true, true);
- }
- else
- {
- gdEditor.spinner.stop();
- }
- break;
- case 'oneDrive':
- if (odEditor == null)
- {
- odEditor = new OneDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- gSelFileContent = selFileContent;
- gSelFileModifiedTS = new Date(selectedFile.lastModifiedDateTime).getTime();
- gAttVer = null;
- editMode = false;
- //Upload is the same as embedding an existing draw.io macro but without content id
- theMacroData = {
- diagramName: selectedFile.name,
- diagramDisplayName: selectedFile.name,
- pageId: confPageId,
- baseUrl: baseUrl,
- service: 'OneDrive',
- sFileId: selectedFile.id,
- odriveId: selectedFile.parentReference.driveId,
- aspect: selectedFile.aspect,
- includedDiagram: 1
- };
-
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }, null, 'OD', true, true);
- }
- else
- {
- odEditor.spinner.stop();
- }
- break;
- case 'upload':
- attEditor.spinner.stop();
- break;
- case 'current':
- AP.dialog.getButton('selectBtn').hide();
- AP.dialog.getButton('submit').show();
-
- var div = document.getElementById('current');
- div.innerHTML = '';
- var container = document.createElement('div');
- // NOTE: Height must be specified with default value "auto" to force automatic fit in viewer
- container.style.cssText = 'position:absolute;width:100%;height:auto;bottom:0px;top:45px;border:1px solid transparent;';
- div.appendChild(container);
- spinner.spin(div);
-
- var pageId, layerIds;
-
- if (theMacroData.aspect != null)
- {
- var aspectArray = theMacroData.aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- function showFile(fileContent)
- {
- if (!async)
- {
- var doc = mxUtils.parseXml(fileContent);
-
- curViewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', border: 8, 'auto-fit': true,
- resize: false, nav: true, lightbox: false, title: (theMacroData.diagramDisplayName || theMacroData.diagramName),
- 'toolbar-nohide': true, 'toolbar-position': 'top', toolbar: 'pages layers',
- pageId: pageId, layerIds: layerIds
- });
-
- spinner.stop();
- AP.dialog.getButton('submit').enable();
- }
- };
-
- if (theMacroData.diagramUrl)
- {
- if (gSelFileContent == null)
- {
- processDiagramUrl(div, function(fileContent)
- {
- showFile(fileContent);
- });
- }
- else
- {
- showFile(gSelFileContent);
- }
- }
- else if (theMacroData.csvFileUrl)
- {
- if (gSelFileContent == null)
- {
- processCsvUrl(div, function(fileContent)
- {
- showFile(fileContent);
- });
- }
- else
- {
- showFile(gSelFileContent);
- }
- }
- else if (theMacroData.service != null && gSelFileContent != null)
- {
- showFile(gSelFileContent);
- }
- else
- {
- //Get version
- AC.getAttachmentInfo(theMacroData.pageId, theMacroData.diagramName, function(info)
- {
- gAttVer = info.version.number;
-
- AP.request({
- url: '/download/attachments/' + theMacroData.pageId + '/' + encodeURIComponent(theMacroData.diagramName),
- success: showFile,
- error : function()
- {
- showError('Cannot read the specified diagram. Please check you have read permission on that file.', true);
- }
- });
- }, function()
- {
- showError('Cannot fetch diagram info. Please check you have read permission on that file.', true);
- });
- }
- break;
- default:
- gSelFileContent = null;
- }
- }
-
- function openTab(evt)
- {
- var tabName = this.getAttribute('data-tabContetn');
- // Declare all variables
- var i, tabcontent, tablinks;
-
- // Get all elements with class='tabcontent' and hide them
- tabcontent = document.getElementsByClassName('tabcontent');
- for (i = 0; i < tabcontent.length; i++) {
- tabcontent[i].style.display = 'none';
- }
-
- // Get all elements with class='tablinks' and remove the class 'active'
- tablinks = document.getElementsByClassName('tablinks');
- for (i = 0; i < tablinks.length; i++) {
- tablinks[i].className = tablinks[i].className.replace(' active', '');
- }
-
- // Show the current tab, and add an 'active' class to the button that opened the tab
- document.getElementById(tabName).style.display = 'block';
- evt.currentTarget.className += ' active';
-
- activeTab = tabName;
- activateTab();
- }
-
- function doSearch()
- {
- var searchList = document.getElementById('searchList');
- var searchStr = document.getElementById('searchStr').value;
-
- if (searchStr != null && searchStr.length > 0)
- {
- spinner.spin(searchList);
-
- AC.searchDiagrams(searchStr, function(retList)
- {
- spinner.stop();
- fillDiagramsList(retList, searchList, 80, 'No diagrams found!');
- }, function()
- {
- showError('Searching failed. Please try again later.', true);
- });
- }
- else
- {
- showError('Please type a search string.');
- }
- };
-
- //=======Upload==========
- attEditor = new AttViewerEditor(function(selectedFile, selFileContent, editedFile, width, height, autoSize, isDrawio, aspect, onError)
- {
- //We only have add in Jira
- if (selectedFile != null)
- {
- gSelFileContent = selFileContent;
- gSelFileModifiedTS = null;
- gAttVer = null;
- editMode = false;
- //Upload is the same as embedding an existing draw.io macro but without content id
- theMacroData = {
- diagramName: selectedFile.name,
- diagramDisplayName: selectedFile.name,
- pageId: confPageId,
- baseUrl: baseUrl,
- service: 'AttFile',
- aspect: aspect,
- includedDiagram: 1
- };
-
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }
- }, null, 'UD', true, true);
-
- //Staring the editor
- //Setting events listeners
- document.getElementById('searchBtn').addEventListener('click', doSearch);
- document.getElementById('searchStr').addEventListener('keypress', function(e)
- {
- if (e.keyCode == 13) doSearch();
- });
-
- function renderDiagram(div, doc, title)
- {
- div.innerHTML = '';
- var container = document.createElement('div');
- // NOTE: Height must be specified with default value "auto" to force automatic fit in viewer
- container.style.cssText = 'position:absolute;width:auto;left:0px;right:0px;height:auto;bottom:0px;top:0px;border:1px solid transparent;';
- div.appendChild(container);
-
- new GraphViewer(container, doc,
- {highlight: '#3572b0', border: 8, 'auto-fit': true,
- resize: false, nav: true, lightbox: false, title: title,
- 'toolbar-nohide': true, 'toolbar-position': 'top', toolbar: 'pages layers',
- });
- };
-
-
- document.getElementById('showDiagBtn').addEventListener('click', showDiagFromUrl);
-
- function resetBorder()
- {
- if (this.value)
- this.style.border = '';
-
- //Reset file content on urrl change
- if (this.id.indexOf('Url') > 0)
- {
- gSelFileContent = null;
- csvModel = null;
- }
- };
-
- //TODO Optimize extUrl and Csv code as they are very similar. Also, showFile is similar (conf server code is better)
- var diagramUrl = document.getElementById('diagramUrl');
- var diagramName = document.getElementById('diagramName');
-
- diagramUrl.addEventListener('keypress', resetBorder);
- diagramName.addEventListener('keypress', resetBorder);
- diagramUrl.addEventListener('change', resetBorder);
- diagramName.addEventListener('change', resetBorder);
-
- var csvFileUrl = document.getElementById('csvFileUrl');
- var csvDiagName = document.getElementById('csvDiagName');
-
- csvFileUrl.addEventListener('keypress', resetBorder);
- csvDiagName.addEventListener('keypress', resetBorder);
- csvFileUrl.addEventListener('change', resetBorder);
- csvDiagName.addEventListener('change', resetBorder);
-
- function processDiagramUrl(div, callback)
- {
- spinner.spin(div);
-
- mxUtils.get(diagramUrl.value, function(req)
- {
- if (req.getStatus() >= 200 && req.getStatus() <= 299)
- {
- try
- {
- gSelFileContent = req.getText();
-
- if (callback)
- {
- callback(gSelFileContent);
- }
- else
- {
- renderDiagram(div, mxUtils.parseXml(gSelFileContent).documentElement, diagramName.value);
- }
- }
- catch(e)
- {
- showError('Unsupported file. Please check the specified URL', true);
- spinner.stop();
- }
- }
- else
- {
- showError('Diagram not found or cannot be accessed. Please check the specified URL', true);
- spinner.stop();
- }
- });
- };
-
- function showDiagFromUrl(e)
- {
- e.preventDefault();
-
- if (!diagramUrl.value)
- {
- diagramUrl.style.border = '1px solid red';
- return;
- }
-
- processDiagramUrl(document.getElementById('extUrlDiagram'));
- };
-
- function processCsvUrl(div, callback)
- {
- spinner.spin(div);
-
- mxUtils.get(csvFileUrl.value, function(req)
- {
- if (req.getStatus() >= 200 && req.getStatus() <= 299)
- {
- try
- {
- gCsvFileContent = req.getText();
-
- AC.importCsv(gCsvFileContent, function(csvModel, xml)
- {
- gSelFileContent = xml;
-
- if (callback)
- {
- callback(gSelFileContent, gCsvFileContent);
- }
- else
- {
- renderDiagram(div, csvModel, csvDiagName.value);
- }
- },
- function()
- {
- showError('Unsupported format. Please check the specified URL', true);
- spinner.stop();
- });
- }
- catch(e)
- {
- showError('Unsupported format. Please check the specified URL', true);
- spinner.stop();
- }
- }
- else
- {
- showError('CSV file not found or cannot be accessed. Please check the specified URL', true);
- spinner.stop();
- }
- });
- };
-
- document.getElementById('convertBtn').addEventListener('click', function(e)
- {
- e.preventDefault();
-
- if (!csvFileUrl.value)
- {
- csvFileUrl.style.border = '1px solid red';
- return;
- }
-
- processCsvUrl(document.getElementById('csvDiagram'));
- });
-
- var tabs = document.getElementsByClassName('tablinks');
-
- for (var i = 0; i < tabs.length; i++)
- {
- tabs[i].addEventListener('click', openTab);
- }
-
- AP.sizeToParent(true);
-
- AP.confluence.getMacroData(function (macroData)
- {
- if (macroData != null && macroData.includedDiagram != null)
- {
- theMacroData = macroData;
- editMode = true;
-
- if (macroData.diagramUrl)
- {
- diagramUrl.value = macroData.diagramUrl;
- diagramName.value = macroData.diagramName;
- }
- else if (macroData.csvFileUrl)
- {
- csvFileUrl.value = macroData.csvFileUrl;
- csvDiagName.value = macroData.diagramName;
- }
-
- function extractFileContents(resp, isPng)
- {
- if (isPng)
- {
- resp = 'data:image/png;base64,' + Editor.base64Encode (resp);
- resp = AC.extractGraphModelFromPng(resp);
- }
-
- gSelFileContent = resp;
- async = false;
- document.getElementById('currentTab').click();
- };
-
- async = true;
- gSelFileContent = ''; //To prevent fetching the cached file
-
- //Update file
- if (macroData.service == 'GDrive')
- {
- GAC.getFileInfo(macroData.sFileId, function(fileInfo)
- {
- var isPng = fileInfo.mimeType == 'image/png';
- gSelFileModifiedTS = new Date(fileInfo.modifiedDate).getTime();
-
- GAC.doAuthRequestPlain(fileInfo['downloadUrl'], 'GET', null, function(req)
- {
- extractFileContents(req.responseText, isPng);
- }, function()
- {
- showError('Cannot read "' + fileInfo.title + '" file from Google Drive.', true);
- }, null, isPng);
- }, function()
- {
- showError('Fetching file info from Google Drive failed.', true);
- });
- }
- else if (macroData.service == 'OneDrive')
- {
- AC.getFileInfo(macroData.sFileId, macroData.odriveId, function(fileInfo)
- {
- var isPng = fileInfo.file.mimeType == 'image/png';
- gSelFileModifiedTS = new Date(fileInfo.lastModifiedDateTime).getTime();
-
- var req = new XMLHttpRequest();
- req.open('GET', fileInfo['@microsoft.graph.downloadUrl']);
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- extractFileContents(req.responseText, isPng);
- }
- else
- {
- showError('Cannot read "' + fileInfo.name + '" file from OneDrive.', true);
- }
- }
- };
-
- if (isPng && req.overrideMimeType)
- {
- req.overrideMimeType('text/plain; charset=x-user-defined');
- }
-
- req.send();
- }, function()
- {
- showError('Fetching file info from OneDrive failed.', true);
- });
- }
- else if (macroData.service == 'AttFile')
- {
- AP.request({
- url: '/download/attachments/' + theMacroData.pageId + '/' + encodeURIComponent(theMacroData.diagramName),
- success: function(resp)
- {
- extractFileContents(resp);
- },
- error : function()
- {
- showError('Cannot read the uploaded diagram.', true);
- }
- });
- }
- else
- {
- async = false;
- gSelFileContent = null;
- }
-
- document.getElementById('currentTab').click();
- }
- else
- {
- document.getElementById('currentTab').style.display = 'none';
- document.getElementById('recentTab').click();
- }
- });
-
- var selectBtn = AP.dialog.createButton({
- text: 'Select...',
- identifier: 'selectBtn'
- });
- selectBtn.bind(onSelect);
-
- AP.dialog.disableCloseOnSubmit();
- AP.events.on('dialog.submit', onSubmit);
- AP.dialog.getButton('submit').hide();
- AP.dialog.getButton('submit').disable();
-};
-
-//Logs uncaught errors
-window.onerror = function(message, url, linenumber, colno, err)
-{
- message = 'Confluence Cloud Embed Editor: ' + ((message != null) ? message : '');
-
- AC.logError(message, url, linenumber, colno, err);
-};
-
-var xdm_e = AC.getSiteUrl();
-var license = AC.getUrlParam('lic', false);
-var baseUrl = AC.getBaseUrl(); //TODO FIXME search and recent depends on having baseUrl global
-var connectUrl = baseUrl + '/atlassian-connect';
-var head = document.getElementsByTagName('head')[0];
-var licenseValid = true;
-
-var script = document.createElement('script');
-script.setAttribute('data-options', 'resize:false;margin:false');
-
-if (license != null && xdm_e != null)
-{
- if (license == 'none')
- {
- var hostParse = document.createElement('a');
- hostParse.href = xdm_e;
- var hostname = hostParse.hostname;
-
- if (hostname != null)
- {
- if (hostname.indexOf('.ngrok.io') > -1)
- {
- console.log("License status = ", license);
- }
- else
- {
- var xhr = new XMLHttpRequest();
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == XMLHttpRequest.DONE && xhr.status >= 200 && xhr.status <= 299)
- {
- var resp = xhr.responseText;
-
- if (resp != null && resp.length > 0)
- {
- var lic = JSON.parse(resp);
-
- if (lic != null && lic.atlasCloudLic != null)
- {
- licenseValid = true;
- }
- }
- }
- };
-
- xhr.open('POST', '/license?domain=' + hostname, true);
- xhr.send(null);
- }
- }
- }
- else
- {
- licenseValid = true;
- }
-}
-
-// Adds event listeners
-document.getElementById('gdAnchor').onclick = function()
-{
- document.getElementById('filePickerGD').click();
-};
-
-document.getElementById('odAnchor').onclick = function()
-{
- document.getElementById('filePickerOD').click();
-};
-
-document.getElementById('fileUploadAnchor').onclick = function()
-{
- document.getElementById('fileuploadUD').click();
-};
-
-// Main
-script.onload = function()
-{
- if (!licenseValid)
- {
- setTimeout(function()
- {
- if (!licenseValid)
- {
- alert("Please install a license for the draw.io app");
- AP.confluence.closeMacroEditor();
- }
- }, 3000);
- }
-
- //start the macro editro
- AP.navigator.getLocation(function (data)
- {
- if (data != null && data.context != null)
- {
- var draftPage = (data.target == 'contentcreate');
- var pageId = data.context.contentId;
-
- includeDiagramMain(pageId, draftPage);
- }
- else
- {
- alert('Unexpected Error: Cannot get content id or type.');
- }
- });
-};
-
-script.src = 'https://connect-cdn.atl-paas.net/all.js';
-head.appendChild(script);
-
-var link = document.createElement('link');
-link.type = 'text/css';
-link.rel = 'stylesheet';
-link.href = connectUrl + '/all.css';
-head.appendChild(link);
diff --git a/src/main/webapp/connect/confluence/includeDiagram.html b/src/main/webapp/connect/confluence/includeDiagram.html
deleted file mode 100644
index a35ba3b3..00000000
--- a/src/main/webapp/connect/confluence/includeDiagram.html
+++ /dev/null
@@ -1,298 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Include draw.io Diagram</title>
-<script src="connectUtils-1-4-8.js" type="text/javascript"></script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script type="text/javascript" src="/js/viewer-static.min.js"></script>
-<script src="../onedrive_common/editor.js" type="text/javascript"></script>
-<script src="../gdrive_common/editor.js" type="text/javascript"></script>
-<script src="../att_common/att-editor.js" type="text/javascript"></script>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.9.12/css/aui.min.css" media="all">
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
-}
-
-/* Style the tab */
-.tab {
- overflow: hidden;
- border: 1px solid #ccc;
- background-color: #f1f1f1;
-}
-
-/* Style the buttons that are used to open the tab content */
-.tab button {
- background-color: inherit;
- float: left;
- border: none;
- outline: none;
- cursor: pointer;
- padding: 14px 16px;
- transition: 0.3s;
-}
-
-/* Change background color of buttons on hover */
-.tab button:hover {
- background-color: #ddd;
-}
-
-/* Create an active/current tablink class */
-.tab button.active {
- background-color: #ccc;
-}
-
-/* Style the tab content */
-.tabcontent {
- width: 100%;
- height: 100%;
- display: none;
- padding: 6px 12px;
- border: 1px solid #ccc;
- border-top: none;
- animation: fadeEffect 1s; /* Fading effect takes 1 second */
-}
-
-/* Go from zero to full opacity */
-@keyframes fadeEffect {
- from {opacity: 0;}
- to {opacity: 1;}
-}
-
-.diagram {
- border:1px solid #ddd;
- display:inline-block;
- vertical-align:top;
- border-radius:3px;
- overflow:hidden;
- font-size:14pt;
- cursor:pointer;
- margin:5px;
-}
-
-#errorMsg {
- position:absolute;
- bottom:10px;
- left:0px;
- right:0px;
- text-align:center;
- overflow:hidden;
- color:red;
- opacity: 0;
- transition: opacity 1s;
-}
-
-#errorMsg.fade {
- opacity: 1;
-}
-</style>
-</head>
-<body style="height:100%">
- <!-- Tab links -->
- <div class="tab">
- <button id="currentTab" class="tablinks" data-tabContetn="current">Current Diagram</button>
- <button id="recentTab" class="tablinks" data-tabContetn="recent">Recent Diagrams</button>
- <button id="searchTab" class="tablinks" data-tabContetn="search">Search</button>
- <button id="gDriveTab" class="tablinks" data-tabContetn="gDrive">Google Drive</button>
- <button id="oneDriveTab" class="tablinks" data-tabContetn="oneDrive">OneDrive</button>
- <button id="uploadTab" class="tablinks" data-tabContetn="upload">Upload</button>
- <button id="extUrlTab" class="tablinks" data-tabContetn="extUrl">From URL</button>
- <button id="csvTab" class="tablinks" data-tabContetn="csvImp">CSV Import</button>
- </div>
-
- <!-- Tab content -->
- <div id="current" class="tabcontent" style="padding: 0">
- </div>
-
- <div id="recent" class="tabcontent">
- <div id="recentList" style="width:100%; height: 100%">
-
- </div>
- </div>
-
- <div id="search" class="tabcontent">
- <div class="field-group">
- <label for="searchStr" style="display:inline-block;">Search:</label> <input class="text medium-field" id="searchStr" value="" placeholder="Diagram Name">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="searchBtn">Search</button>
- </div>
- <div id="searchList" style="width:100%; height: 100%">
-
- </div>
- </div>
-
- <div id="gDrive" class="tabcontent" style="padding: 0;height:100%;">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:42px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filename">File name</label>
- <input class="text macro-param-input" type="text" id="filenameGD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerGD" disabled>Choose</button>
- <div id="spinner-containerGD"></div>
- <div class="description">Google Drive file name</div>
- <div class="error" id="filenameErrorGD"></div>
- </div>
- <div style="display: none">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthGD">Width</label> <input class="text medium-field" id="widthGD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorGD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightGD">Height</label> <input class="text medium-field" id="heightGD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorGD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeGD" type="checkbox" >
- <label for="autoSizeGD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- <div class="field-group" style="padding-left:15px">
- <label for="thumbImg">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImgGD">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawioGD">
- <label for="useDrawio" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </div>
- <a id="signoutGD" style="position: absolute;bottom: 2px;right: 5px;font-size: 11px;cursor: pointer;">Sign Out</a>
- </form>
- </div>
- <div id="previewGD" style="bottom:0px;left:351px;position:absolute;top:42px;right:0px;display:inline-block;">
- <a id="gdAnchor" style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer">Choose a file...</a>
- </div>
- </div>
-
- <div id="oneDrive" class="tabcontent" style="padding: 0;height:100%">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:42px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filenameOD">File name</label>
- <input class="text macro-param-input" type="text" id="filenameOD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerOD" disabled>Choose</button>
- <div id="spinner-containerOD"></div>
- <div class="description">OneDrive file name</div>
- <div class="error" id="filenameErrorOD"></div>
- </div>
- <div style="display: none">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthOD">Width</label> <input class="text medium-field" id="widthOD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorOD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightOD">Height</label> <input class="text medium-field" id="heightOD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorOD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeOD" type="checkbox" >
- <label for="autoSizeOD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- <div class="field-group" style="padding-left:15px">
- <label for="thumbImgOD">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImgOD">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawioOD">
- <label for="useDrawioOD" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </div>
- <a id="signoutOD" style="position: absolute;bottom: 2px;right: 5px;font-size: 11px;cursor: pointer;">Sign Out</a>
- </form>
- </div>
- <div id="previewOD" style="bottom:0px;left:351px;position:absolute;top:42px;right:0px;display:inline-block;">
- <a id="odAnchor" style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer">Choose a file...</a>
- </div>
- </div>
-
- <div id="upload" class="tabcontent" style="padding: 0;height:100%">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:42px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filenameUD">File name</label>
- <input type="file" id="fileuploadUD" style="display: none">
- <input class="text macro-param-input" type="text" id="filenameUD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerUD">Choose</button>
- <div id="spinner-containerUD"></div>
- <div class="description">Diagram file name</div>
- <div class="error" id="filenameErrorUD"></div>
- </div>
- <div style="display: none">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthUD">Width</label> <input class="text medium-field" id="widthUD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorUD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightUD">Height</label> <input class="text medium-field" id="heightUD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorUD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeUD" type="checkbox" >
- <label for="autoSizeUD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- </div>
- <div class="error" id="errorMsgUD">
- </div>
- </form>
- </div>
- <div id="previewUD" style="bottom:0px;left:351px;position:absolute;top:42px;right:0px;display:inline-block;text-align: center;">
- <a id="fileUploadAnchor" style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer">Choose a file...</a>
- </div>
- </div>
-
- <div id="extUrl" class="tabcontent" style="padding: 0;height:100%">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:42px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="diagramName">Diagram Name</label>
- <input class="text large-field" id="diagramName" value="" placeholder="Diagram Name"><br>
- <label for="diagramUrl">Diagram URL</label>
- <input class="text large-field" id="diagramUrl" value="" placeholder="Diagram URL"><br>
- <button class="aui-button aui-button-primary" style="margin: 5px;float: right;" id="showDiagBtn">Show Diagram</button>
- </div>
- <div class="error" id="errorMsgUD">
- </div>
- </form>
- </div>
- <div id="extUrlDiagram" style="bottom:0px;left:351px;position:absolute;top:42px;right:0px;display:inline-block;text-align: center;">
- <span style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer" >Diagram Preview</span>
- </div>
- </div>
- <div id="csvImp" class="tabcontent" style="padding: 0;height:100%">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:42px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="csvDiagName">Diagram Name</label>
- <input class="text large-field" id="csvDiagName" value="" placeholder="Diagram Name"><br>
- <label for="csvFileUrl">CSV File URL</label>
- <input class="text large-field" id="csvFileUrl" value="" placeholder="CSV File URL"><br>
- <button class="aui-button aui-button-primary" style="margin: 5px;float: right;" id="convertBtn">Generate</button>
- </div>
- <div class="error" id="errorMsgUD">
- </div>
- </form>
- </div>
- <div id="csvDiagram" style="bottom:0px;left:351px;position:absolute;top:42px;right:0px;display:inline-block;text-align: center;">
- <span style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer" >Diagram Preview</span>
- </div>
- </div>
- <div id="errorMsg">
-
- </div>
- <script src="includeDiagram-1-4-8.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/confluence/includeDiagram.js b/src/main/webapp/connect/confluence/includeDiagram.js
deleted file mode 100644
index 4f3c07db..00000000
--- a/src/main/webapp/connect/confluence/includeDiagram.js
+++ /dev/null
@@ -1,985 +0,0 @@
-function includeDiagramMain(confPageId, draftPage)
-{
- var EXPORT_URL = 'https://exp.draw.io/ImageExport4/export';
- var selectedDiagramInfo = null;
- var theMacroData = null;
- var selectedElt = null;
- var activeTab = 'recent';
- var recentLoaded = false;
- var searchLoaded = false;
- var curViewer = null;
- var attEditor, odEditor = null, gdEditor = null;
- var gSelFileContent = null;
- var gSelFileModifiedTS = null;
- var gAttVer = null;
- var async = false;
- var editMode = false;
-
- var opts =
- {
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
-
- function sha1 (str)
- {
- // discuss at: http://locutus.io/php/sha1/
- // original by: Webtoolkit.info (http://www.webtoolkit.info/)
- // improved by: Michael White (http://getsprink.com)
- // improved by: Kevin van Zonneveld (http://kvz.io)
- // input by: Brett Zamir (http://brett-zamir.me)
- // note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then
- // note 1: hashed. If available, we'd recommend using Node's native crypto modules directly
- // note 1: in a steaming fashion for faster and more efficient hashing
- // example 1: sha1('Kevin van Zonneveld')
- // returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
-
- var hash
- try {
- var crypto = require('crypto')
- var sha1sum = crypto.createHash('sha1')
- sha1sum.update(str)
- hash = sha1sum.digest('hex')
- } catch (e) {
- hash = undefined
- }
-
- if (hash !== undefined) {
- return hash
- }
-
- var _rotLeft = function (n, s) {
- var t4 = (n << s) | (n >>> (32 - s))
- return t4
- }
-
- var _cvtHex = function (val) {
- var str = ''
- var i
- var v
-
- for (i = 7; i >= 0; i--) {
- v = (val >>> (i * 4)) & 0x0f
- str += v.toString(16)
- }
- return str
- }
-
- var blockstart
- var i, j
- var W = new Array(80)
- var H0 = 0x67452301
- var H1 = 0xEFCDAB89
- var H2 = 0x98BADCFE
- var H3 = 0x10325476
- var H4 = 0xC3D2E1F0
- var A, B, C, D, E
- var temp
-
- // utf8_encode
- str = unescape(encodeURIComponent(str))
- var strLen = str.length
-
- var wordArray = []
- for (i = 0; i < strLen - 3; i += 4) {
- j = str.charCodeAt(i) << 24 |
- str.charCodeAt(i + 1) << 16 |
- str.charCodeAt(i + 2) << 8 |
- str.charCodeAt(i + 3)
- wordArray.push(j)
- }
-
- switch (strLen % 4) {
- case 0:
- i = 0x080000000
- break
- case 1:
- i = str.charCodeAt(strLen - 1) << 24 | 0x0800000
- break
- case 2:
- i = str.charCodeAt(strLen - 2) << 24 | str.charCodeAt(strLen - 1) << 16 | 0x08000
- break
- case 3:
- i = str.charCodeAt(strLen - 3) << 24 |
- str.charCodeAt(strLen - 2) << 16 |
- str.charCodeAt(strLen - 1) <<
- 8 | 0x80
- break
- }
-
- wordArray.push(i)
-
- while ((wordArray.length % 16) !== 14) {
- wordArray.push(0)
- }
-
- wordArray.push(strLen >>> 29)
- wordArray.push((strLen << 3) & 0x0ffffffff)
-
- for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) {
- for (i = 0; i < 16; i++) {
- W[i] = wordArray[blockstart + i]
- }
- for (i = 16; i <= 79; i++) {
- W[i] = _rotLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1)
- }
-
- A = H0
- B = H1
- C = H2
- D = H3
- E = H4
-
- for (i = 0; i <= 19; i++) {
- temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff
- E = D
- D = C
- C = _rotLeft(B, 30)
- B = A
- A = temp
- }
-
- for (i = 20; i <= 39; i++) {
- temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff
- E = D
- D = C
- C = _rotLeft(B, 30)
- B = A
- A = temp
- }
-
- for (i = 40; i <= 59; i++) {
- temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff
- E = D
- D = C
- C = _rotLeft(B, 30)
- B = A
- A = temp
- }
-
- for (i = 60; i <= 79; i++) {
- temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff
- E = D
- D = C
- C = _rotLeft(B, 30)
- B = A
- A = temp
- }
-
- H0 = (H0 + A) & 0x0ffffffff
- H1 = (H1 + B) & 0x0ffffffff
- H2 = (H2 + C) & 0x0ffffffff
- H3 = (H3 + D) & 0x0ffffffff
- H4 = (H4 + E) & 0x0ffffffff
- }
-
- temp = _cvtHex(H0) + _cvtHex(H1) + _cvtHex(H2) + _cvtHex(H3) + _cvtHex(H4)
- return temp.toLowerCase()
- };
-
- function showError(errMsg, nohide)
- {
- var errorMsg = document.getElementById('errorMsg');
- errorMsg.innerHTML = AC.htmlEntities(errMsg);
- errorMsg.className = 'fade';
-
- if (!nohide)
- {
- setTimeout(function()
- {
- errorMsg.className = '';
- }, 2000);
- }
- };
-
- function onSelect()
- {
- if (activeTab == 'extUrl')
- {
- var hasErr = false;
- var diagramUrl = document.getElementById('diagramUrl');
-
- if (!diagramUrl.value)
- {
- diagramUrl.style.border = '1px solid red';
- hasErr = true;
- }
-
- var diagramName = document.getElementById('diagramName');
-
- if (!diagramName.value)
- {
- diagramName.style.border = '1px solid red';
- hasErr = true;
- }
-
- if (hasErr)
- {
- return;
- }
-
- theMacroData = {
- baseUrl: baseUrl,
- diagramName: diagramName.value,
- diagramDisplayName: diagramName.value,
- diagramUrl: diagramUrl.value,
- includedDiagram: 1
- };
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }
- else if (activeTab == 'gDrive')
- {
- gdEditor.doSubmit();
- }
- else if (activeTab == 'oneDrive')
- {
- odEditor.doSubmit();
- }
- else if (activeTab == 'upload')
- {
- attEditor.doSubmit();
- }
- else if (selectedDiagramInfo != null)
- {
- var info = selectedDiagramInfo.info;
- theMacroData = {
- diagramName: info.name,
- diagramDisplayName: info.displayName,
- pageId: info.pageId,
- custContentId: info.contentId || info.custContentId,
- baseUrl: baseUrl,
- includedDiagram: 1
- };
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }
- else
- {
- showError('Please select a diagram to insert it.');
- }
- };
-
- function onSubmit()
- {
- if (activeTab == 'current')
- {
- if (theMacroData != null && curViewer != null)
- {
- spinner.spin(document.getElementById('current'));
- AP.dialog.getButton('submit').disable();
-
- var layerIds = [], pageId = curViewer.diagrams[curViewer.currentPage].getAttribute('id');
-
- var model = curViewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- var aspect = pageId + ' ' + layerIds.join(' ');
- var aspectHash = sha1(aspect);
- theMacroData.aspect = aspect;
- theMacroData.aspectHash = aspectHash;
- theMacroData.imgPageId = confPageId;
-
- var bounds = curViewer.graph.view.graphBounds;
- theMacroData.width = Math.round(bounds.width) || null;
- theMacroData.height = Math.round(bounds.height) || null;
-
- function saveMacro()
- {
- AP.confluence.saveMacro(theMacroData);
- AP.confluence.closeMacroEditor();
- };
-
- function saveError()
- {
- spinner.stop();
- AP.dialog.getButton('submit').enable();
- showError('Saving failed, please try again later.')
- };
-
- function doSaveImage(imageData)
- {
- if (imageData == null)
- {
- saveError();
- return;
- }
-
- AC.saveDiagram(confPageId, theMacroData.diagramName + '-' + aspectHash + '.png', AC.b64toBlob(imageData, 'image/png'),
- saveMacro, saveError, false, 'image/png', 'draw.io aspect image' + (gAttVer != null? ' - ' + gAttVer : ''), false, draftPage);
- };
-
- function serverFallback()
- {
-
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
- doSaveImage(null);
- }, 25000);
-
- var req = new mxXmlRequest(EXPORT_URL, 'format=png&base64=1' +
- (layerIds != null? '&extras=' + encodeURIComponent(JSON.stringify({layerIds: layerIds})) : '') +
- (pageId != null? '&pageId=' + pageId : '') + '&xml=' + encodeURIComponent(curViewer.xml));
-
- req.send(function(req)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- doSaveImage(req.getStatus() >= 200 && req.getStatus() <= 299? req.getText() : null);
- }
- },
- function()
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- doSaveImage(null);
- }
- });
-
- };
-
- function startSaving()
- {
- if (curViewer.editor.isExportToCanvas())
- {
- curViewer.editor.exportToCanvas(function(canvas)
- {
- var data = canvas.toDataURL('image/png');
- doSaveImage(data.substring(data.lastIndexOf(',') + 1));
- }
- , null, null, null, serverFallback);
- }
- else
- {
- serverFallback();
- }
- };
-
- if (theMacroData.service != null)
- {
- function doSave()
- {
- AC.saveDiagram(confPageId, theMacroData.diagramName, gSelFileContent,
- startSaving, function(resp)
- {
- showError('Unexpected error. Cannot cannot save cached file');
- }, false, 'application/vnd.jgraph.mxfile.cached', 'Embedded draw.io diagram' + (gSelFileModifiedTS != null ? ' - ' + gSelFileModifiedTS : ''), false, draftPage);
- };
-
- if (editMode)
- {
- doSave()
- }
- else
- {
- //Confirm filename is unique for new files
- AC.getPageAttachments(confPageId, function(attachments)
- {
- var fileExists = false;
- var lc = theMacroData.diagramName.toLowerCase();
-
- // Checks if any files will be overwritten
- for (var i = 0; i < attachments.length && !fileExists; i++)
- {
- var an = attachments[i].title.toLowerCase();
-
- if (an == lc)
- {
- fileExists = true;
- }
- }
-
- if (fileExists)
- {
- //Make filename unique
- theMacroData.diagramName = Date.now() + '-' + theMacroData.diagramName;
- }
-
- doSave();
- }, function(res)
- {
- showError('Unexpected error. Cannot cannot save cached file');
- });
- }
- }
- else
- {
- startSaving()
- }
- }
- else
- {
- showError('Unexpected error. Cannot show diagram');
- }
- }
- else
- {
- showError('Please select a diagram to insert it.');
- }
- };
-
- function deselectDiagram()
- {
- selectedDiagramInfo = null;
-
- if (selectedElt != null)
- {
- selectedElt.style.backgroundColor = 'transparent';
- selectedElt.style.border = '1px solid #ddd';
- }
- };
-
- function fillDiagramsList(list, listDiv, top, emptyMsg)
- {
- listDiv.innerHTML = '';
- var div = document.createElement('div');
- div.style.border = '1px solid #d3d3d3';
- div.style.margin = '6px 0 0 -1px';
- div.style.padding = '6px';
- div.style.overflow = 'auto';
- div.style.position = 'absolute';
- div.style.bottom = '10px';
- div.style.right = '10px';
- div.style.left = '10px';
- div.style.top = top + 'px';
-
- var w = 140;
- var h = 140;
-
- function selectElement(elt, infoObj)
- {
- deselectDiagram();
-
- selectedElt = elt;
- selectedDiagramInfo = infoObj;
-
- selectedElt.style.backgroundColor = '#e6eff8';
- selectedElt.style.border = '2px solid #ccd9ea';
- };
-
- function addButton(url, imgUrl, tooltip, infoObj)
- {
- var elt = document.createElement('div');
- elt.className = 'diagram';
- elt.style.height = w + 'px';
- elt.style.width = h + 'px';
-
- elt.setAttribute('title', tooltip);
-
- elt.style.backgroundImage = 'url(' + imgUrl + ')';
- elt.style.backgroundSize = 'contain';
- elt.style.backgroundPosition = 'center center';
- elt.style.backgroundRepeat = 'no-repeat';
-
- elt.addEventListener('click', function(evt)
- {
- selectElement(elt, infoObj);
- });
-
- elt.addEventListener('dblclick', function(evt)
- {
- selectedDiagramInfo = infoObj;
- onSelect();
- });
-
- div.appendChild(elt);
- }
-
- for (var i = 0; i < list.length; i++)
- {
- addButton(list[i].url, list[i].imgUrl, list[i].title, list[i]);
- }
-
- if (list.length == 0 && emptyMsg)
- {
- var msg = document.createElement('div');
- msg.style.width = '100%';
- msg.style.height = '100%';
- msg.style.textAlign = 'center';
- msg.innerHTML = AC.htmlEntities(emptyMsg);
-
- div.appendChild(msg);
- }
-
- listDiv.appendChild(div);
- return div;
- }
-
- function activateTab()
- {
- deselectDiagram();
- showError('', true);
- AP.dialog.getButton('selectBtn').show();
- AP.dialog.getButton('submit').hide();
- AP.dialog.getButton('submit').disable();
-
- switch (activeTab)
- {
- case 'recent':
- if (!recentLoaded)
- {
- recentLoaded = true;
- AC.getRecentDiagrams(function(retList)
- {
- fillDiagramsList(retList, document.getElementById('recentList'), 50, 'No recent diagrams found!');
- }, function()
- {
- showError('Failed to fetch recent diagrams.', true);
- });
- }
- break;
- case 'search':
- if (!searchLoaded)
- {
- searchLoaded = true;
- //fill the div with empty box
- fillDiagramsList([], document.getElementById('searchList'), 80, 'Use the search box to find draw.io diagrams');
- }
- break;
- case 'gDrive':
- if (gdEditor == null)
- {
- gdEditor = new GDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- gSelFileContent = selFileContent;
- gSelFileModifiedTS = new Date(selectedFile.modifiedDate).getTime();
- gAttVer = null;
- editMode = false;
- //Upload is the same as embedding an existing draw.io macro but without content id
- theMacroData = {
- diagramName: selectedFile.title,
- diagramDisplayName: selectedFile.title,
- pageId: confPageId,
- baseUrl: baseUrl,
- service: 'GDrive',
- sFileId: selectedFile.id,
- aspect: selectedFile.aspect,
- includedDiagram: 1
- };
-
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }, null, 'GD', true, true);
- }
- else
- {
- gdEditor.spinner.stop();
- }
- break;
- case 'oneDrive':
- if (odEditor == null)
- {
- odEditor = new OneDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- gSelFileContent = selFileContent;
- gSelFileModifiedTS = new Date(selectedFile.lastModifiedDateTime).getTime();
- gAttVer = null;
- editMode = false;
- //Upload is the same as embedding an existing draw.io macro but without content id
- theMacroData = {
- diagramName: selectedFile.name,
- diagramDisplayName: selectedFile.name,
- pageId: confPageId,
- baseUrl: baseUrl,
- service: 'OneDrive',
- sFileId: selectedFile.id,
- odriveId: selectedFile.parentReference.driveId,
- aspect: selectedFile.aspect,
- includedDiagram: 1
- };
-
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }, null, 'OD', true, true);
- }
- else
- {
- odEditor.spinner.stop();
- }
- break;
- case 'upload':
- attEditor.spinner.stop();
- break;
- case 'current':
- AP.dialog.getButton('selectBtn').hide();
- AP.dialog.getButton('submit').show();
-
- var div = document.getElementById('current');
- div.innerHTML = '';
- var container = document.createElement('div');
- // NOTE: Height must be specified with default value "auto" to force automatic fit in viewer
- container.style.cssText = 'position:absolute;width:100%;height:auto;bottom:0px;top:45px;border:1px solid transparent;';
- div.appendChild(container);
- spinner.spin(div);
-
- var pageId, layerIds;
-
- if (theMacroData.aspect != null)
- {
- var aspectArray = theMacroData.aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- function showFile(fileContent)
- {
- if (!async)
- {
- var doc = mxUtils.parseXml(fileContent);
-
- curViewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', border: 8, 'auto-fit': true,
- resize: false, nav: true, lightbox: false, title: (theMacroData.diagramDisplayName || theMacroData.diagramName),
- 'toolbar-nohide': true, 'toolbar-position': 'top', toolbar: 'pages layers',
- pageId: pageId, layerIds: layerIds
- });
-
- spinner.stop();
- AP.dialog.getButton('submit').enable();
- }
- };
-
- if (theMacroData.diagramUrl)
- {
- mxUtils.get(theMacroData.diagramUrl, function(req)
- {
- if (req.getStatus() >= 200 && req.getStatus() <= 299)
- {
- try
- {
- showFile(req.getText());
- }
- catch(e)
- {
- showError('Unsupported file. Please check the specified URL', true);
- spinner.stop();
- }
- }
- else
- {
- showError('Diagram not found or cannot be accessed. Please check the specified URL', true);
- spinner.stop();
- }
- });
- }
- else if (theMacroData.service != null && gSelFileContent != null)
- {
- showFile(gSelFileContent);
- }
- else
- {
- //Get version
- AC.getAttachmentInfo(theMacroData.pageId, theMacroData.diagramName, function(info)
- {
- gAttVer = info.version.number;
-
- AP.request({
- url: '/download/attachments/' + theMacroData.pageId + '/' + encodeURIComponent(theMacroData.diagramName),
- success: showFile,
- error : function()
- {
- showError('Cannot read the specified diagram. Please check you have read permission on that file.', true);
- }
- });
- }, function()
- {
- showError('Cannot fetch diagram info. Please check you have read permission on that file.', true);
- });
- }
- break;
- }
- }
-
- function openTab(evt)
- {
- var tabName = this.getAttribute('data-tabContetn');
- // Declare all variables
- var i, tabcontent, tablinks;
-
- // Get all elements with class='tabcontent' and hide them
- tabcontent = document.getElementsByClassName('tabcontent');
- for (i = 0; i < tabcontent.length; i++) {
- tabcontent[i].style.display = 'none';
- }
-
- // Get all elements with class='tablinks' and remove the class 'active'
- tablinks = document.getElementsByClassName('tablinks');
- for (i = 0; i < tablinks.length; i++) {
- tablinks[i].className = tablinks[i].className.replace(' active', '');
- }
-
- // Show the current tab, and add an 'active' class to the button that opened the tab
- document.getElementById(tabName).style.display = 'block';
- evt.currentTarget.className += ' active';
-
- activeTab = tabName;
- activateTab();
- }
-
- function doSearch()
- {
- var searchList = document.getElementById('searchList');
- var searchStr = document.getElementById('searchStr').value;
-
- if (searchStr != null && searchStr.length > 0)
- {
- spinner.spin(searchList);
-
- AC.searchDiagrams(searchStr, function(retList)
- {
- spinner.stop();
- fillDiagramsList(retList, searchList, 80, 'No diagrams found!');
- }, function()
- {
- showError('Searching failed. Please try again later.', true);
- });
- }
- else
- {
- showError('Please type a search string.');
- }
- };
-
- function showDiagFromUrl()
- {
- var diagramUrl = document.getElementById('diagramUrl');
-
- if (!diagramUrl.value)
- {
- diagramUrl.style.border = '1px solid red';
- return;
- }
-
- var extUrlDiagram = document.getElementById('extUrlDiagram');
- extUrlDiagram.innerHTML = '';
- var diagramFrame = document.createElement('iframe');
- diagramFrame.setAttribute('width', '100%');
- diagramFrame.setAttribute('height', '100%');
- diagramFrame.style.width = '100%';
- diagramFrame.style.height = '100%';
- diagramFrame.setAttribute('frameborder', '0');
-
- diagramFrame.setAttribute('src', 'https://www.draw.io/?lightbox=1&toolbar-config=%7B"refreshBtn"%3Atrue%2C"fullscreenBtn"%3Atrue%2C"closeBtn"%3Atrue%7D&layers=1' +
- '#U' + encodeURIComponent(diagramUrl.value));
-
- extUrlDiagram.appendChild(diagramFrame);
- };
-
- //=======Upload==========
- attEditor = new AttViewerEditor(function(selectedFile, selFileContent, editedFile, width, height, autoSize, isDrawio, aspect, onError)
- {
- //We only have add in Jira
- if (selectedFile != null)
- {
- gSelFileContent = selFileContent;
- gSelFileModifiedTS = null;
- gAttVer = null;
- editMode = false;
- //Upload is the same as embedding an existing draw.io macro but without content id
- theMacroData = {
- diagramName: selectedFile.name,
- diagramDisplayName: selectedFile.name,
- pageId: confPageId,
- baseUrl: baseUrl,
- service: 'AttFile',
- aspect: aspect,
- includedDiagram: 1
- };
-
- document.getElementById('currentTab').style.display = '';
- document.getElementById('currentTab').click();
- }
- }, null, 'UD', true, true);
-
- //Staring the editor
- //Setting events listeners
- document.getElementById('searchBtn').addEventListener('click', doSearch);
- document.getElementById('searchStr').addEventListener('keypress', function(e)
- {
- if (e.keyCode == 13) doSearch();
- });
-
- document.getElementById('showDiagBtn').addEventListener('click', showDiagFromUrl);
-
- function resetBorder()
- {
- if (this.value)
- this.style.border = '';
- };
-
- var diagramUrl = document.getElementById('diagramUrl');
- var diagramName = document.getElementById('diagramName');
-
- diagramUrl.addEventListener('keypress', resetBorder);
- diagramName.addEventListener('keypress', resetBorder);
- diagramUrl.addEventListener('change', resetBorder);
- diagramName.addEventListener('change', resetBorder);
-
- var tabs = document.getElementsByClassName('tablinks');
-
- for (var i = 0; i < tabs.length; i++)
- {
- tabs[i].addEventListener('click', openTab);
- }
-
- AP.sizeToParent(true);
-
- AP.confluence.getMacroData(function (macroData)
- {
- if (macroData != null && macroData.includedDiagram != null)
- {
- theMacroData = macroData;
- editMode = true;
-
- if (macroData.diagramUrl)
- {
- diagramUrl.value = macroData.diagramUrl;
- diagramName.value = macroData.diagramName;
- }
-
- function extractFileContents(resp, isPng)
- {
- if (isPng)
- {
- resp = 'data:image/png;base64,' + Editor.base64Encode (resp);
- resp = AC.extractGraphModelFromPng(resp);
- }
-
- gSelFileContent = resp;
- async = false;
- document.getElementById('currentTab').click();
- };
-
- async = true;
- gSelFileContent = ''; //To prevent fetching the cached file
-
- //Update file
- if (macroData.service == 'GDrive')
- {
- GAC.getFileInfo(macroData.sFileId, function(fileInfo)
- {
- var isPng = fileInfo.mimeType == 'image/png';
- gSelFileModifiedTS = new Date(fileInfo.modifiedDate).getTime();
-
- GAC.doAuthRequestPlain(fileInfo['downloadUrl'], 'GET', null, function(req)
- {
- extractFileContents(req.responseText, isPng);
- }, function()
- {
- showError('Cannot read "' + fileInfo.title + '" file from Google Drive.', true);
- }, null, isPng);
- }, function()
- {
- showError('Fetching file info from Google Drive failed.', true);
- });
- }
- else if (macroData.service == 'OneDrive')
- {
- AC.getFileInfo(macroData.sFileId, macroData.odriveId, function(fileInfo)
- {
- var isPng = fileInfo.file.mimeType == 'image/png';
- gSelFileModifiedTS = new Date(fileInfo.lastModifiedDateTime).getTime();
-
- var req = new XMLHttpRequest();
- req.open('GET', fileInfo['@microsoft.graph.downloadUrl']);
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- extractFileContents(req.responseText, isPng);
- }
- else
- {
- showError('Cannot read "' + fileInfo.name + '" file from OneDrive.', true);
- }
- }
- };
-
- if (isPng && req.overrideMimeType)
- {
- req.overrideMimeType('text/plain; charset=x-user-defined');
- }
-
- req.send();
- }, function()
- {
- showError('Fetching file info from OneDrive failed.', true);
- });
- }
- else if (macroData.service == 'AttFile')
- {
- AP.request({
- url: '/download/attachments/' + theMacroData.pageId + '/' + encodeURIComponent(theMacroData.diagramName),
- success: function(resp)
- {
- extractFileContents(resp);
- },
- error : function()
- {
- showError('Cannot read the uploaded diagram.', true);
- }
- });
- }
- else
- {
- async = false;
- gSelFileContent = null;
- }
-
- document.getElementById('currentTab').click();
- }
- else
- {
- document.getElementById('currentTab').style.display = 'none';
- document.getElementById('recentTab').click();
- }
- });
-
- var selectBtn = AP.dialog.createButton({
- text: 'Select...',
- identifier: 'selectBtn'
- });
- selectBtn.bind(onSelect);
-
- AP.dialog.disableCloseOnSubmit();
- AP.events.on('dialog.submit', onSubmit);
- AP.dialog.getButton('submit').hide();
- AP.dialog.getButton('submit').disable();
-}; \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/init-editor.js b/src/main/webapp/connect/confluence/init-editor.js
deleted file mode 100644
index fe843317..00000000
--- a/src/main/webapp/connect/confluence/init-editor.js
+++ /dev/null
@@ -1,46 +0,0 @@
-var connectUrl = AC.getBaseUrl() + '/atlassian-connect';
-var head = document.getElementsByTagName('head')[0];
-
-var script = document.createElement('script');
-script.setAttribute('data-options', 'resize:false;margin:false');
-
-// Main
-script.onload = function()
-{
- // TODO: Try avoid this by using workaround in EditorUi.fileLoaded on line 2200
- //Firefox has a problem with focusing the can be fixed with a chrome dialog
- if(navigator.userAgent.indexOf('Firefox/') >= 0)
- {
- AP.dialog.create(
- {
- key: 'splashEditor',
- header: 'draw.io',
- chrome: true,
- width: "50%",
- height: "50%",
- }).on("close", function(flags)
- {
- AP.dialog.close();
- AP.confluence.closeMacroEditor();
- });
- AP.dialog.getButton('submit').hide();
- //Confluence refuse to hide cancel button!!!
- AP.dialog.getButton('cancel').hide();
- }
- else
- {
- AP.dialog.create(
- {
- key: 'macroEditor',
- customData: {},
- chrome: false,
- width: "100%",
- height: "100%",
- }).on("close", function(flags)
- {
- AP.confluence.closeMacroEditor();
- });
- }
-};
-script.src = 'https://connect-cdn.atl-paas.net/all.js';
-head.appendChild(script);
diff --git a/src/main/webapp/connect/confluence/initEditor.html b/src/main/webapp/connect/confluence/initEditor.html
deleted file mode 100644
index f5b1b7ed..00000000
--- a/src/main/webapp/connect/confluence/initEditor.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Editor</title>
-<script src="connectUtils-1-4-8.js" type="text/javascript"></script>
-<style type="text/css">
- html, body {
- height:100%;
- overflow:hidden;
- }
- body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-text-bottom.svg);
- background-repeat:no-repeat;
- background-position:center;
- background-size:128px;
- font-family:Arial,Sans-Serif;
- overflow:hidden;
- width:100%;
- margin:0;
- }
-</style>
-</head>
-<body>
-<script src="init-editor.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/confluence/lucid-import.js b/src/main/webapp/connect/confluence/lucid-import.js
deleted file mode 100644
index bdbad018..00000000
--- a/src/main/webapp/connect/confluence/lucid-import.js
+++ /dev/null
@@ -1,86 +0,0 @@
-//Logs uncaught errors
-window.onerror = function(message, url, linenumber, colno, err)
-{
- message = 'Confluence Cloud Lucid Mass Import: ' + ((message != null) ? message : '');
-
- AC.logError(message, url, linenumber, colno, err);
-};
-
-var baseUrl = AC.getBaseUrl();
-var script = document.createElement('script');
-
-script.onload = function()
-{
- var importExtensionId = 'cnoplimhpndhhhnmoigbanpjeghjpohi';
- var extensionInstallUrl = 'https://chrome.google.com/webstore/detail/diagramsnet-and-drawio-im/cnoplimhpndhhhnmoigbanpjeghjpohi';
- var logDiv = $('#operationLog');
-
- AP.sizeToParent(true);
-
- setTimeout(function()
- {
- AP.sizeToParent(true);
- }, 5000); //Try resizing again after 5 sec since the first one fails sometimes
-
- function prepareImporter(response)
- {
- //JQuery is loaded in this page, so we can use it
- var importBtn = $('#importBtn');
-
- if (!response) //Extension is not installed
- {
- logDiv.html(mxResources.get('installFirst', ['<a href="' + extensionInstallUrl + '" target="_blank">' + mxResources.get('drawioChromeExt') + '</a>']));
- }
- else if (response.error)
- {
- if (response.msg == 'LucidNotFound' || response.msg == 'LucidDisconnected')
- {
- setTimeout(function()
- {
- chrome.runtime.sendMessage(importExtensionId, {msg: 'filesTree', allAsMap: true}, prepareImporter);
- }, 1000);
- }
- else if (response.msg == 'AuthError')
- {
- logDiv.html(mxResources.get('loginFirstThen', ['Lucidchart', '<a href="javascript:location.reload();">' + mxResources.get('tryAgain') + '</a>']));
- }
- else
- {
- logDiv.html('<span style="color:red">' + mxResources.get('errFetchDocList') + '</span>');
- }
- }
- else
- {
- importBtn.attr("disabled", null);
- $('#loadingImg').hide();
-
- importBtn.click(function()
- {
- $('#loadingImg').show();
- importBtn.prop('disabled', true); //Disable button to prevent concurrent execution
-
- LucidConnMassImporter(response.filesMap, importExtensionId, logDiv, function()
- {
- $('#loadingImg').hide();
- importBtn.prop('disabled', false);
- })
- });
- }
- };
-
- getAndApplyTranslation(function()
- {
- if (typeof chrome === 'undefined')
- {
- logDiv.html('<span style="color:red">' + mxResources.get('chromeOnly') + '</span>');
- }
- else
- {
- chrome.runtime.sendMessage(importExtensionId, {msg: 'filesTree', allAsMap: true}, prepareImporter);
- }
- });
-};
-
-script.src = 'https://connect-cdn.atl-paas.net/all.js';
-script.setAttribute('data-options', 'resize:false;margin:false');
-document.getElementsByTagName('head')[0].appendChild(script);
diff --git a/src/main/webapp/connect/confluence/lucidMassImport.html b/src/main/webapp/connect/confluence/lucidMassImport.html
deleted file mode 100644
index 13f013ba..00000000
--- a/src/main/webapp/connect/confluence/lucidMassImport.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="UTF-8">
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
- <script src="connectUtils-1-4-8.js" type="text/javascript"></script>
- <script src="/js/app.min.js" type="text/javascript"></script>
- <script src="/js/extensions.min.js" type="text/javascript"></script>
- <script src="admin.js" type="text/javascript"></script>
- <link rel="stylesheet" type="text/css" href="//aui-cdn.atlassian.com/aui-adg/6.0.4/css/aui.css">
- </head>
- <body class="aui-layout aui-theme-default" style="background-color:rgb(255, 255, 255);">
- <iframe src="https://www.lucidchart.com/documents/external?callback=http%3A%2F%2Fdiagrams.net%0A" style="display: none"></iframe>
- <div class="aui-page-panel" style="margin-top:0px;">
- <h4 style="padding-top:20px;" data-i18n="lucidImport">Lucidchart Import</h4>
- <div><br><span data-i18n="lucidImportInst1">Click the "Start Import" button to import all Lucidchart diagrams to draw.io.</span><br>
- <span data-i18n="gliffyImportInst2">Please note that the import procedure will take some time and the browser window must remain open until the import is completed.</span></div>
- <div style="padding-bottom:4px;"><br><button id="importBtn" disabled="disabled" class="aui-button aui-button-primary" data-i18n="startImport">Start Import</button><img id="loadingImg" src="/images/spin.gif"></div>
- <div id="operationLog"><br></div>
- </div>
- <script src="lucid-import.js" type="text/javascript"></script>
- </body>
-</html>
diff --git a/src/main/webapp/connect/confluence/macro-editor.js b/src/main/webapp/connect/confluence/macro-editor.js
deleted file mode 100644
index 7bdf5e64..00000000
--- a/src/main/webapp/connect/confluence/macro-editor.js
+++ /dev/null
@@ -1,181 +0,0 @@
-//Logs uncaught errors
-window.onerror = function(message, url, linenumber, colno, err)
-{
- message = 'Confluence Cloud Editor: ' + ((message != null) ? message : '');
-
- AC.logError(message, url, linenumber, colno, err);
-};
-
-var xdm_e = AC.getSiteUrl();
-var baseUrl = AC.getBaseUrl();
-var license = AC.getUrlParam('lic', false);
-var connectUrl = baseUrl + '/atlassian-connect';
-var head = document.getElementsByTagName('head')[0];
-var licenseValid = true;
-
-var script = document.createElement('script');
-script.setAttribute('data-options', 'resize:false;margin:false');
-
-if (license != null && xdm_e != null)
-{
- if (license == 'none')
- {
- licenseValid = false;
- }
-
- var hostParse = document.createElement('a');
- hostParse.href = xdm_e;
- var hostname = hostParse.hostname;
-
- if (hostname != null)
- {
- var xhr = new XMLHttpRequest();
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == XMLHttpRequest.DONE && xhr.status >= 200 && xhr.status <= 299)
- {
- var resp = xhr.responseText;
-
- if (resp != null && resp.length > 0)
- {
- var lic = JSON.parse(resp);
-
- if (lic != null && lic.atlasCloudLic != null)
- {
- if (lic.atlasCloudLic != 'blocked')
- {
- licenseValid = true;
- }
- else
- {
- licenseValid = false;
- }
- }
- }
- }
- };
-
- xhr.open('POST', '/license?domain=' + hostname + '&confLicense=' + license, true);
- xhr.send(null);
- }
-}
-
-// Main
-script.onload = function()
-{
- if (!licenseValid)
- {
- setTimeout(function() // XHR call doesn't work inside AP.Request
- {
- if (!licenseValid)
- {
- alert("Please install a license for the draw.io app");
- AP.dialog.close();
- }
- }, 8000);
- }
-
- AP.resize('100%', '100%');
-
- var config = null;
- var lang = null;
- var SEN = null;
- var installedDate = null;
- var lastUpdated = null;
- var allDone = 0;
-
- var startEditor = function ()
- {
- allDone++;
-
- if (allDone == 2)
- {
- var isCustom = AC.getUrlParam('custom');
-
- if (isCustom == "1")
- {
- var contentId = AC.getUrlParam('contentId') || AC.getUrlParam('custContentId');
- AP.dialog.getCustomData(function (customData)
- {
- AC.initAsync(baseUrl, customData.contentId || customData.custContentId || contentId, customData.macroData, config, lang);
- });
- }
- else
- {
- AC.initAsync(baseUrl, null, null, config, lang);
- }
- }
- }
-
- AP.user.getLocale(function(locale)
- {
- lang = locale;
- startEditor();
- });
-
- AP.request({
- type: 'GET',
- url: '/rest/api/content/search?cql=type%3Dpage%20and%20space%3DDRAWIOCONFIG%20and%20title%3DConfiguration', //type=page and space=DRAWIOCONFIG and title=Configuration. Search doesn't return 404 if not found
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- if (resp != null && resp.size == 1)
- {
- var configPageId = resp.results[0].id;
- //load the configuration file
- AP.request({
- type: 'GET',
- url: '/download/attachments/' + configPageId + '/configuration.json',
- contentType: 'application/json;charset=UTF-8',
- success: function (fileContent)
- {
- config = fileContent;
- startEditor();
- },
- error: startEditor //if there is an error loading the configuration, just load the editor normally. E.g., 404 when the space doesn't exist
- });
-
- }
- else
- {
- startEditor();
- }
- },
- error: startEditor //if there is an error loading the configuration, just load the editor normally. E.g., 404 when the space doesn't exist
- });
-
- AP.request({
- type: 'GET',
- url: '/rest/atlassian-connect/1/addons/com.mxgraph.confluence.plugins.diagramly',
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- try
- {
- resp = JSON.parse(resp);
-
- if (resp != null && resp.license != null)
- {
- var xhr = new XMLHttpRequest();
- xhr.open('POST', '/license?licenseDump=' + encodeURIComponent(JSON.stringify(resp)), true);
- xhr.send(null);
- }
- }
- catch (e)
- {
- // just throw away if it breaks, not important
- }
- }
- });
-};
-script.src = 'https://connect-cdn.atl-paas.net/all.js';
-head.appendChild(script);
-
-var link = document.createElement('link');
-link.type = 'text/css';
-link.rel = 'stylesheet';
-link.href = connectUrl + '/all.css';
-head.appendChild(link);
diff --git a/src/main/webapp/connect/confluence/macroEditor-1-4-8.html b/src/main/webapp/connect/confluence/macroEditor-1-4-8.html
deleted file mode 100644
index d31b19b8..00000000
--- a/src/main/webapp/connect/confluence/macroEditor-1-4-8.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Editor</title>
-<script src="connectUtils-1-4-8.js" type="text/javascript"></script>
-<style type="text/css">
- html, body {
- height:100%;
- overflow:hidden;
- }
- body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-text-bottom.svg);
- background-repeat:no-repeat;
- background-position:center;
- background-size:128px;
- font-family:Arial,Sans-Serif;
- overflow:hidden;
- width:100%;
- margin:0;
- }
-</style>
-</head>
-<body>
-<script src="macro-editor.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/confluence/macroEditor.html b/src/main/webapp/connect/confluence/macroEditor.html
deleted file mode 100644
index b12b53ba..00000000
--- a/src/main/webapp/connect/confluence/macroEditor.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Draw.io Editor</title>
-<style type="text/css">
- html, body {
- height:100%;
- overflow:hidden;
- }
- body {
- background-color:#ffffff;
- background-image:url(/images/logo-flat.png);
- background-repeat:no-repeat;
- background-position:center;
- font-family:Arial,Sans-Serif;
- overflow:hidden;
- width:100%;
- margin:0;
- }
-</style>
-</head>
-<body>
-</body>
-</html>
diff --git a/src/main/webapp/connect/confluence/prism/bililiteRange.fancytext.js b/src/main/webapp/connect/confluence/prism/bililiteRange.fancytext.js
deleted file mode 100644
index fd23b07c..00000000
--- a/src/main/webapp/connect/confluence/prism/bililiteRange.fancytext.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// Turn a textarea element into a pre element that can use a highlighter
-// Designed for use with Prism (prismjs.com)
-// usage: editor = bililiteRange.fancytext(element, Prism.highlightElement, threshold);
-// the element should have the appropriate class=language-* for Prism.
-// Version: 1.0
-// Documentation: http://bililite.com/blog/2013/12/16/simple-syntax-highlighting-editor-with-prism/
-// Copyright (c) 2013 Daniel Wachsstock
-// depends: bililiteRange.js, bililiteRange.utils.js (the latter is only for autoindenting; if that's not used it is not necessary)
-
-// MIT license:
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-
-bililiteRange.fancyText = function(editor, highlighter, threshold){
- if (editor.tagName.toLowerCase() == 'textarea'){
- // turn the editor into an editable <pre>, since that is what Prism works on
- var replacement = document.createElement('pre');
- replacement.setAttribute ('contenteditable', true);
- [].forEach.call(editor.attributes, function(attr){
- replacement.setAttribute(attr.name, attr.value);
- });
- replacement.textContent = editor.value;
- editor.parentNode.replaceChild(replacement, editor);
- editor = replacement;
- }
- // for large texts, it can be too slow to run the highlighter on every input event.
- // use the code from http://unscriptable.com/2009/03/20/debouncing-javascript-methods/
- // to limit it to once every threshold milliseconds
- function debounce (func, threshold){
- if (!threshold) return func; // no debouncing
- var timeout;
- return function(){
- var self = this, args = arguments;
- clearTimeout(timeout);
- timeout = setTimeout(function(){
- func.apply(self, args);
- }, threshold);
- };
- }
-
- var rng = bililiteRange(editor);
- function highlight(){
- rng.bounds('selection');
- // handle what Lea Verou calls "Dirty fix to #2"--seems to be Chrome issue with missing newlines
- // from https://github.com/LeaVerou/dabblet/issues/2
- if (!/\n$/.test(editor.textContent)) editor.textContent += '\n';
- highlighter(editor);
- rng.select();
- }
- if (highlighter){
- highlight();
- rng.listen('input', debounce(highlight, threshold));
- }
- rng.listen('paste', function(evt){
- if (!evt.defaultPrevented) {
- // Firefox changes newlines to br's on paste!
- // Chrome pastes cr's! Nothing is easy.
- rng.bounds('selection').
- text(evt.clipboardData.getData("text/plain").replace(/\r/g,''), 'end').
- select();
- evt.preventDefault();
- }
- });
- rng.listen('keydown', function(evt){
- // avoid the fancy element-creation with newlines
- if (evt.keyCode == 13 && !evt.defaultPrevented){
- rng.bounds('selection').text('\n','end', rng.data().autoindent).select();
- evt.preventDefault();
- }
- });
-
- return editor;
-};
diff --git a/src/main/webapp/connect/confluence/prism/bililiteRange.js b/src/main/webapp/connect/confluence/prism/bililiteRange.js
deleted file mode 100644
index ebdeb697..00000000
--- a/src/main/webapp/connect/confluence/prism/bililiteRange.js
+++ /dev/null
@@ -1,763 +0,0 @@
-// Cross-broswer implementation of text ranges and selections
-// documentation: http://bililite.com/blog/2011/01/17/cross-browser-text-ranges-and-selections/
-// Version: 2.6
-// Copyright (c) 2013 Daniel Wachsstock
-// MIT license:
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-
-(function(){
-
-// a bit of weirdness with IE11: using 'focus' is flaky, even if I'm not bubbling, as far as I can tell.
-var focusEvent = 'onfocusin' in document.createElement('input') ? 'focusin' : 'focus';
-
-// IE11 normalize is buggy (http://connect.microsoft.com/IE/feedback/details/809424/node-normalize-removes-text-if-dashes-are-present)
-var n = document.createElement('div');
-n.appendChild(document.createTextNode('x-'));
-n.appendChild(document.createTextNode('x'));
-n.normalize();
-var canNormalize = n.firstChild.length == 3;
-
-
-bililiteRange = function(el, debug){
- var ret;
- if (debug){
- ret = new NothingRange(); // Easier to force it to use the no-selection type than to try to find an old browser
- }else if (window.getSelection && el.setSelectionRange){
- // Standards. Element is an input or textarea
- // note that some input elements do not allow selections
- try{
- el.selectionStart; // even getting the selection in such an element will throw
- ret = new InputRange();
- }catch(e){
- ret = new NothingRange();
- }
- }else if (window.getSelection){
- // Standards, with any other kind of element
- ret = new W3CRange();
- }else if (document.selection){
- // Internet Explorer
- ret = new IERange();
- }else{
- // doesn't support selection
- ret = new NothingRange();
- }
- ret._el = el;
- // determine parent document, as implemented by John McLear <john@mclear.co.uk>
- ret._doc = el.ownerDocument;
- ret._win = 'defaultView' in ret._doc ? ret._doc.defaultView : ret._doc.parentWindow;
- ret._textProp = textProp(el);
- ret._bounds = [0, ret.length()];
- // There's no way to detect whether a focus event happened as a result of a click (which should change the selection)
- // or as a result of a keyboard event (a tab in) or a script action (el.focus()). So we track it globally, which is a hack, and is likely to fail
- // in edge cases (right-clicks, drag-n-drop), and is vulnerable to a lower-down handler preventing bubbling.
- // I just don't know a better way.
- // I'll hack my event-listening code below, rather than create an entire new bilililiteRange, potentially before the DOM has loaded
- if (!('bililiteRangeMouseDown' in ret._doc)){
- var _doc = {_el: ret._doc};
- ret._doc.bililiteRangeMouseDown = false;
- bililiteRange.fn.listen.call(_doc, 'mousedown', function() {
- ret._doc.bililiteRangeMouseDown = true;
- });
- bililiteRange.fn.listen.call(_doc, 'mouseup', function() {
- ret._doc.bililiteRangeMouseDown = false;
- });
- }
- // note that bililiteRangeSelection is an array, which means that copying it only copies the address, which points to the original.
- // make sure that we never let it (always do return [bililiteRangeSelection[0], bililiteRangeSelection[1]]), which means never returning
- // this._bounds directly
- if (!('bililiteRangeSelection' in el)){
- // start tracking the selection
- function trackSelection(evt){
- if (evt && evt.which == 9){
- // do tabs my way, by restoring the selection
- // there's a flash of the browser's selection, but I don't see a way of avoiding that
- //The following line is commented out in order for supporting inserting tabs in the editor
- //ret._nativeSelect(ret._nativeRange(el.bililiteRangeSelection));
- }else{
- el.bililiteRangeSelection = ret._nativeSelection();
- }
- }
- trackSelection();
- // only IE does this right and allows us to grab the selection before blurring
- if ('onbeforedeactivate' in el){
- ret.listen('beforedeactivate', trackSelection);
- }else{
- // with standards-based browsers, have to listen for every user interaction
- ret.listen('mouseup', trackSelection).listen('keyup', trackSelection);
- }
- ret.listen(focusEvent, function(){
- // restore the correct selection when the element comes into focus (mouse clicks change the position of the selection)
- // Note that Firefox will not fire the focus event until the window/tab is active even if el.focus() is called
- // https://bugzilla.mozilla.org/show_bug.cgi?id=566671
- if (!ret._doc.bililiteRangeMouseDown){
- ret._nativeSelect(ret._nativeRange(el.bililiteRangeSelection));
- }
- });
- }
- if (!('oninput' in el)){
- // give IE8 a chance. Note that this still fails in IE11, which has has oninput on contenteditable elements but does not
- // dispatch input events. See http://connect.microsoft.com/IE/feedback/details/794285/ie10-11-input-event-does-not-fire-on-div-with-contenteditable-set
- // TODO: revisit this when I have IE11 running on my development machine
- var inputhack = function() {ret.dispatch({type: 'input', bubbles: true}) };
- ret.listen('keyup', inputhack);
- ret.listen('cut', inputhack);
- ret.listen('paste', inputhack);
- ret.listen('drop', inputhack);
- el.oninput = 'patched';
- }
- return ret;
-}
-
-function textProp(el){
- // returns the property that contains the text of the element
- // note that for <body> elements the text attribute represents the obsolete text color, not the textContent.
- // we document that these routines do not work for <body> elements so that should not be relevant
- if (typeof el.value != 'undefined') return 'value';
- if (typeof el.text != 'undefined') return 'text';
- if (typeof el.textContent != 'undefined') return 'textContent';
- return 'innerText';
-}
-
-// base class
-function Range(){}
-Range.prototype = {
- length: function() {
- return this._el[this._textProp].replace(/\r/g, '').length; // need to correct for IE's CrLf weirdness
- },
- bounds: function(s){
- if (bililiteRange.bounds[s]){
- this._bounds = bililiteRange.bounds[s].apply(this);
- }else if (s){
- this._bounds = s; // don't do error checking now; things may change at a moment's notice
- }else{
- var b = [
- Math.max(0, Math.min (this.length(), this._bounds[0])),
- Math.max(0, Math.min (this.length(), this._bounds[1]))
- ];
- b[1] = Math.max(b[0], b[1]);
- return b; // need to constrain it to fit
- }
- return this; // allow for chaining
- },
- select: function(){
- var b = this._el.bililiteRangeSelection = this.bounds();
- if (this._el === this._doc.activeElement){
- // only actually select if this element is active!
- this._nativeSelect(this._nativeRange(b));
- }
- this.dispatch({type: 'select', bubbles: true});
- return this; // allow for chaining
- },
- text: function(text, select){
- if (arguments.length){
- var bounds = this.bounds(), el = this._el;
- // signal the input per DOM 3 input events, http://www.w3.org/TR/DOM-Level-3-Events/#h4_events-inputevents
- // we add another field, bounds, which are the bounds of the original text before being changed.
- this.dispatch({type: 'beforeinput', bubbles: true,
- data: text, bounds: bounds});
- this._nativeSetText(text, this._nativeRange(bounds));
- if (select == 'start'){
- this.bounds ([bounds[0], bounds[0]]);
- }else if (select == 'end'){
- this.bounds ([bounds[0]+text.length, bounds[0]+text.length]);
- }else if (select == 'all'){
- this.bounds ([bounds[0], bounds[0]+text.length]);
- }
- this.dispatch({type: 'input', bubbles: true,
- data: text, bounds: bounds});
- return this; // allow for chaining
- }else{
- return this._nativeGetText(this._nativeRange(this.bounds())).replace(/\r/g, ''); // need to correct for IE's CrLf weirdness
- }
- },
- insertEOL: function (){
- this._nativeEOL();
- this._bounds = [this._bounds[0]+1, this._bounds[0]+1]; // move past the EOL marker
- return this;
- },
- sendkeys: function (text){
- var self = this;
- this.data().sendkeysOriginalText = this.text();
- this.data().sendkeysBounds = undefined;
- function simplechar (rng, c){
- if (/^{[^}]*}$/.test(c)) c = c.slice(1,-1); // deal with unknown {key}s
- for (var i =0; i < c.length; ++i){
- var x = c.charCodeAt(i);
- rng.dispatch({type: 'keypress', bubbles: true, keyCode: x, which: x, charCode: x});
- }
- rng.text(c, 'end');
- }
- text.replace(/{[^}]*}|[^{]+|{/g, function(part){
- (bililiteRange.sendkeys[part] || simplechar)(self, part, simplechar);
- });
- this.bounds(this.data().sendkeysBounds);
- this.dispatch({type: 'sendkeys', which: text});
- return this;
- },
- top: function(){
- return this._nativeTop(this._nativeRange(this.bounds()));
- },
- scrollIntoView: function(scroller){
- var top = this.top();
- // scroll into position if necessary
- if (this._el.scrollTop > top || this._el.scrollTop+this._el.clientHeight < top){
- if (scroller){
- scroller.call(this._el, top);
- }else{
- this._el.scrollTop = top;
- }
- }
- return this;
- },
- wrap: function (n){
- this._nativeWrap(n, this._nativeRange(this.bounds()));
- return this;
- },
- selection: function(text){
- if (arguments.length){
- return this.bounds('selection').text(text, 'end').select();
- }else{
- return this.bounds('selection').text();
- }
- },
- clone: function(){
- return bililiteRange(this._el).bounds(this.bounds());
- },
- all: function(text){
- if (arguments.length){
- this.dispatch ({type: 'beforeinput', bubbles: true, data: text});
- this._el[this._textProp] = text;
- this.dispatch ({type: 'input', bubbles: true, data: text});
- return this;
- }else{
- return this._el[this._textProp].replace(/\r/g, ''); // need to correct for IE's CrLf weirdness
- }
- },
- element: function() { return this._el },
- // includes a quickie polyfill for CustomEvent for IE that isn't perfect but works for me
- // IE10 allows custom events but not "new CustomEvent"; have to do it the old-fashioned way
- dispatch: function(opts){
- opts = opts || {};
- var event = document.createEvent ? document.createEvent('CustomEvent') : this._doc.createEventObject();
- event.initCustomEvent && event.initCustomEvent(opts.type, !!opts.bubbles, !!opts.cancelable, opts.detail);
- for (var key in opts) event[key] = opts[key];
- // dispatch event asynchronously (in the sense of on the next turn of the event loop; still should be fired in order of dispatch
- var el = this._el;
- setTimeout(function(){
- try {
- el.dispatchEvent ? el.dispatchEvent(event) : el.fireEvent("on" + opts.type, document.createEventObject());
- }catch(e){
- // IE8 will not let me fire custom events at all. Call them directly
- var listeners = el['listen'+opts.type];
- if (listeners) for (var i = 0; i < listeners.length; ++i){
- listeners[i].call(el, event);
- }
- }
- }, 0);
- return this;
- },
- listen: function (type, func){
- var el = this._el;
- if (el.addEventListener){
- el.addEventListener(type, func);
- }else{
- el.attachEvent("on" + type, func);
- // IE8 can't even handle custom events created with createEventObject (though it permits attachEvent), so we have to make our own
- var listeners = el['listen'+type] = el['listen'+type] || [];
- listeners.push(func);
- }
- return this;
- },
- dontlisten: function (type, func){
- var el = this._el;
- if (el.removeEventListener){
- el.removeEventListener(type, func);
- }else try{
- el.detachEvent("on" + type, func);
- }catch(e){
- var listeners = el['listen'+type];
- if (listeners) for (var i = 0; i < listeners.length; ++i){
- if (listeners[i] === func) listeners[i] = function(){}; // replace with a noop
- }
- }
- return this;
- }
-};
-
-// allow extensions ala jQuery
-bililiteRange.fn = Range.prototype; // to allow monkey patching
-bililiteRange.extend = function(fns){
- for (fn in fns) Range.prototype[fn] = fns[fn];
-};
-
-//bounds functions
-bililiteRange.bounds = {
- all: function() { return [0, this.length()] },
- start: function () { return [0,0] },
- end: function () { return [this.length(), this.length()] },
- selection: function(){
- if (this._el === this._doc.activeElement){
- this.bounds ('all'); // first select the whole thing for constraining
- return this._nativeSelection();
- }else{
- return this._el.bililiteRangeSelection;
- }
- }
-};
-
-// sendkeys functions
-bililiteRange.sendkeys = {
- '{enter}': function (rng){
- rng.dispatch({type: 'keypress', bubbles: true, keyCode: '\n', which: '\n', charCode: '\n'});
- rng.insertEOL();
- },
- '{tab}': function (rng, c, simplechar){
- simplechar(rng, '\t'); // useful for inserting what would be whitespace
- },
- '{newline}': function (rng, c, simplechar){
- simplechar(rng, '\n'); // useful for inserting what would be whitespace (and if I don't want to use insertEOL, which does some fancy things)
- },
- '{backspace}': function (rng){
- var b = rng.bounds();
- if (b[0] == b[1]) rng.bounds([b[0]-1, b[0]]); // no characters selected; it's just an insertion point. Remove the previous character
- rng.text('', 'end'); // delete the characters and update the selection
- },
- '{del}': function (rng){
- var b = rng.bounds();
- if (b[0] == b[1]) rng.bounds([b[0], b[0]+1]); // no characters selected; it's just an insertion point. Remove the next character
- rng.text('', 'end'); // delete the characters and update the selection
- },
- '{rightarrow}': function (rng){
- var b = rng.bounds();
- if (b[0] == b[1]) ++b[1]; // no characters selected; it's just an insertion point. Move to the right
- rng.bounds([b[1], b[1]]);
- },
- '{leftarrow}': function (rng){
- var b = rng.bounds();
- if (b[0] == b[1]) --b[0]; // no characters selected; it's just an insertion point. Move to the left
- rng.bounds([b[0], b[0]]);
- },
- '{selectall}' : function (rng){
- rng.bounds('all');
- },
- '{selection}': function (rng){
- // insert the characters without the sendkeys processing
- var s = rng.data().sendkeysOriginalText;
- for (var i =0; i < s.length; ++i){
- var x = s.charCodeAt(i);
- rng.dispatch({type: 'keypress', bubbles: true, keyCode: x, which: x, charCode: x});
- }
- rng.text(s, 'end');
- },
- '{mark}' : function (rng){
- rng.data().sendkeysBounds = rng.bounds();
- }
-};
-// Synonyms from the proposed DOM standard (http://www.w3.org/TR/DOM-Level-3-Events-key/)
-bililiteRange.sendkeys['{Enter}'] = bililiteRange.sendkeys['{enter}'];
-bililiteRange.sendkeys['{Backspace}'] = bililiteRange.sendkeys['{backspace}'];
-bililiteRange.sendkeys['{Delete}'] = bililiteRange.sendkeys['{del}'];
-bililiteRange.sendkeys['{ArrowRight}'] = bililiteRange.sendkeys['{rightarrow}'];
-bililiteRange.sendkeys['{ArrowLeft}'] = bililiteRange.sendkeys['{leftarrow}'];
-
-function IERange(){}
-IERange.prototype = new Range();
-IERange.prototype._nativeRange = function (bounds){
- var rng;
- if (this._el.tagName == 'INPUT'){
- // IE 8 is very inconsistent; textareas have createTextRange but it doesn't work
- rng = this._el.createTextRange();
- }else{
- rng = this._doc.body.createTextRange ();
- rng.moveToElementText(this._el);
- }
- if (bounds){
- if (bounds[1] < 0) bounds[1] = 0; // IE tends to run elements out of bounds
- if (bounds[0] > this.length()) bounds[0] = this.length();
- if (bounds[1] < rng.text.replace(/\r/g, '').length){ // correct for IE's CrLf weirdness
- // block-display elements have an invisible, uncounted end of element marker, so we move an extra one and use the current length of the range
- rng.moveEnd ('character', -1);
- rng.moveEnd ('character', bounds[1]-rng.text.replace(/\r/g, '').length);
- }
- if (bounds[0] > 0) rng.moveStart('character', bounds[0]);
- }
- return rng;
-};
-IERange.prototype._nativeSelect = function (rng){
- rng.select();
-};
-IERange.prototype._nativeSelection = function (){
- // returns [start, end] for the selection constrained to be in element
- var rng = this._nativeRange(); // range of the element to constrain to
- var len = this.length();
- var sel = this._doc.selection.createRange();
- try{
- return [
- iestart(sel, rng),
- ieend (sel, rng)
- ];
- }catch (e){
- // TODO: determine if this is still necessary, since we only call _nativeSelection if _el is active
- // IE gets upset sometimes about comparing text to input elements, but the selections cannot overlap, so make a best guess
- return (sel.parentElement().sourceIndex < this._el.sourceIndex) ? [0,0] : [len, len];
- }
-};
-IERange.prototype._nativeGetText = function (rng){
- return rng.text;
-};
-IERange.prototype._nativeSetText = function (text, rng){
- rng.text = text;
-};
-IERange.prototype._nativeEOL = function(){
- if ('value' in this._el){
- this.text('\n'); // for input and textarea, insert it straight
- }else{
- this._nativeRange(this.bounds()).pasteHTML('\n<br/>');
- }
-};
-IERange.prototype._nativeTop = function(rng){
- var startrng = this._nativeRange([0,0]);
- return rng.boundingTop - startrng.boundingTop;
-}
-IERange.prototype._nativeWrap = function(n, rng) {
- // hacky to use string manipulation but I don't see another way to do it.
- var div = document.createElement('div');
- div.appendChild(n);
- // insert the existing range HTML after the first tag
- var html = div.innerHTML.replace('><', '>'+rng.htmlText+'<');
- rng.pasteHTML(html);
-};
-
-// IE internals
-function iestart(rng, constraint){
- // returns the position (in character) of the start of rng within constraint. If it's not in constraint, returns 0 if it's before, length if it's after
- var len = constraint.text.replace(/\r/g, '').length; // correct for IE's CrLf weirdness
- if (rng.compareEndPoints ('StartToStart', constraint) <= 0) return 0; // at or before the beginning
- if (rng.compareEndPoints ('StartToEnd', constraint) >= 0) return len;
- for (var i = 0; rng.compareEndPoints ('StartToStart', constraint) > 0; ++i, rng.moveStart('character', -1));
- return i;
-}
-function ieend (rng, constraint){
- // returns the position (in character) of the end of rng within constraint. If it's not in constraint, returns 0 if it's before, length if it's after
- var len = constraint.text.replace(/\r/g, '').length; // correct for IE's CrLf weirdness
- if (rng.compareEndPoints ('EndToEnd', constraint) >= 0) return len; // at or after the end
- if (rng.compareEndPoints ('EndToStart', constraint) <= 0) return 0;
- for (var i = 0; rng.compareEndPoints ('EndToStart', constraint) > 0; ++i, rng.moveEnd('character', -1));
- return i;
-}
-
-// an input element in a standards document. "Native Range" is just the bounds array
-function InputRange(){}
-InputRange.prototype = new Range();
-InputRange.prototype._nativeRange = function(bounds) {
- return bounds || [0, this.length()];
-};
-InputRange.prototype._nativeSelect = function (rng){
- this._el.setSelectionRange(rng[0], rng[1]);
-};
-InputRange.prototype._nativeSelection = function(){
- return [this._el.selectionStart, this._el.selectionEnd];
-};
-InputRange.prototype._nativeGetText = function(rng){
- return this._el.value.substring(rng[0], rng[1]);
-};
-InputRange.prototype._nativeSetText = function(text, rng){
- var val = this._el.value;
- this._el.value = val.substring(0, rng[0]) + text + val.substring(rng[1]);
-};
-InputRange.prototype._nativeEOL = function(){
- this.text('\n');
-};
-InputRange.prototype._nativeTop = function(rng){
- // I can't remember where I found this clever hack to find the location of text in a text area
- var clone = this._el.cloneNode(true);
- clone.style.visibility = 'hidden';
- clone.style.position = 'absolute';
- this._el.parentNode.insertBefore(clone, this._el);
- clone.style.height = '1px';
- clone.value = this._el.value.slice(0, rng[0]);
- var top = clone.scrollHeight;
- // this gives the bottom of the text, so we have to subtract the height of a single line
- clone.value = 'X';
- top -= clone.scrollHeight;
- clone.parentNode.removeChild(clone);
- return top;
-}
-InputRange.prototype._nativeWrap = function() {throw new Error("Cannot wrap in a text element")};
-
-function W3CRange(){}
-W3CRange.prototype = new Range();
-W3CRange.prototype._nativeRange = function (bounds){
- var rng = this._doc.createRange();
- rng.selectNodeContents(this._el);
- if (bounds){
- w3cmoveBoundary (rng, bounds[0], true, this._el);
- rng.collapse (true);
- w3cmoveBoundary (rng, bounds[1]-bounds[0], false, this._el);
- }
- return rng;
-};
-W3CRange.prototype._nativeSelect = function (rng){
- this._win.getSelection().removeAllRanges();
- this._win.getSelection().addRange (rng);
-};
-W3CRange.prototype._nativeSelection = function (){
- // returns [start, end] for the selection constrained to be in element
- var rng = this._nativeRange(); // range of the element to constrain to
- if (this._win.getSelection().rangeCount == 0) return [this.length(), this.length()]; // append to the end
- var sel = this._win.getSelection().getRangeAt(0);
- return [
- w3cstart(sel, rng),
- w3cend (sel, rng)
- ];
- }
-W3CRange.prototype._nativeGetText = function (rng){
- return String.prototype.slice.apply(this._el.textContent, this.bounds());
- // return rng.toString(); // this fails in IE11 since it insists on inserting \r's before \n's in Ranges. node.textContent works as expected
-};
-W3CRange.prototype._nativeSetText = function (text, rng){
- rng.deleteContents();
- rng.insertNode (this._doc.createTextNode(text));
- if (canNormalize) this._el.normalize(); // merge the text with the surrounding text
-};
-W3CRange.prototype._nativeEOL = function(){
- var rng = this._nativeRange(this.bounds());
- rng.deleteContents();
- var br = this._doc.createElement('br');
- br.setAttribute ('_moz_dirty', ''); // for Firefox
- rng.insertNode (br);
- rng.insertNode (this._doc.createTextNode('\n'));
- rng.collapse (false);
-};
-W3CRange.prototype._nativeTop = function(rng){
- if (this.length == 0) return 0; // no text, no scrolling
- if (rng.toString() == ''){
- var textnode = this._doc.createTextNode('X');
- rng.insertNode (textnode);
- }
- var startrng = this._nativeRange([0,1]);
- var top = rng.getBoundingClientRect().top - startrng.getBoundingClientRect().top;
- if (textnode) textnode.parentNode.removeChild(textnode);
- return top;
-}
-W3CRange.prototype._nativeWrap = function(n, rng) {
- rng.surroundContents(n);
-};
-
-// W3C internals
-function nextnode (node, root){
- // in-order traversal
- // we've already visited node, so get kids then siblings
- if (node.firstChild) return node.firstChild;
- if (node.nextSibling) return node.nextSibling;
- if (node===root) return null;
- while (node.parentNode){
- // get uncles
- node = node.parentNode;
- if (node == root) return null;
- if (node.nextSibling) return node.nextSibling;
- }
- return null;
-}
-function w3cmoveBoundary (rng, n, bStart, el){
- // move the boundary (bStart == true ? start : end) n characters forward, up to the end of element el. Forward only!
- // if the start is moved after the end, then an exception is raised
- if (n <= 0) return;
- var node = rng[bStart ? 'startContainer' : 'endContainer'];
- if (node.nodeType == 3){
- // we may be starting somewhere into the text
- n += rng[bStart ? 'startOffset' : 'endOffset'];
- }
- while (node){
- if (node.nodeType == 3){
- var length = node.nodeValue.length;
- if (n <= length){
- rng[bStart ? 'setStart' : 'setEnd'](node, n);
- // special case: if we end next to a <br>, include that node.
- if (n == length){
- // skip past zero-length text nodes
- for (var next = nextnode (node, el); next && next.nodeType==3 && next.nodeValue.length == 0; next = nextnode(next, el)){
- rng[bStart ? 'setStartAfter' : 'setEndAfter'](next);
- }
- if (next && next.nodeType == 1 && next.nodeName == "BR") rng[bStart ? 'setStartAfter' : 'setEndAfter'](next);
- }
- return;
- }else{
- rng[bStart ? 'setStartAfter' : 'setEndAfter'](node); // skip past this one
- n -= length; // and eat these characters
- }
- }
- node = nextnode (node, el);
- }
-}
-var START_TO_START = 0; // from the w3c definitions
-var START_TO_END = 1;
-var END_TO_END = 2;
-var END_TO_START = 3;
-// from the Mozilla documentation, for range.compareBoundaryPoints(how, sourceRange)
-// -1, 0, or 1, indicating whether the corresponding boundary-point of range is respectively before, equal to, or after the corresponding boundary-point of sourceRange.
- // * Range.END_TO_END compares the end boundary-point of sourceRange to the end boundary-point of range.
- // * Range.END_TO_START compares the end boundary-point of sourceRange to the start boundary-point of range.
- // * Range.START_TO_END compares the start boundary-point of sourceRange to the end boundary-point of range.
- // * Range.START_TO_START compares the start boundary-point of sourceRange to the start boundary-point of range.
-function w3cstart(rng, constraint){
- if (rng.compareBoundaryPoints (START_TO_START, constraint) <= 0) return 0; // at or before the beginning
- if (rng.compareBoundaryPoints (END_TO_START, constraint) >= 0) return constraint.toString().length;
- rng = rng.cloneRange(); // don't change the original
- rng.setEnd (constraint.endContainer, constraint.endOffset); // they now end at the same place
- return constraint.toString().replace(/\r/g, '').length - rng.toString().replace(/\r/g, '').length;
-}
-function w3cend (rng, constraint){
- if (rng.compareBoundaryPoints (END_TO_END, constraint) >= 0) return constraint.toString().length; // at or after the end
- if (rng.compareBoundaryPoints (START_TO_END, constraint) <= 0) return 0;
- rng = rng.cloneRange(); // don't change the original
- rng.setStart (constraint.startContainer, constraint.startOffset); // they now start at the same place
- return rng.toString().replace(/\r/g, '').length;
-}
-
-function NothingRange(){}
-NothingRange.prototype = new Range();
-NothingRange.prototype._nativeRange = function(bounds) {
- return bounds || [0,this.length()];
-};
-NothingRange.prototype._nativeSelect = function (rng){ // do nothing
-};
-NothingRange.prototype._nativeSelection = function(){
- return [0,0];
-};
-NothingRange.prototype._nativeGetText = function (rng){
- return this._el[this._textProp].substring(rng[0], rng[1]);
-};
-NothingRange.prototype._nativeSetText = function (text, rng){
- var val = this._el[this._textProp];
- this._el[this._textProp] = val.substring(0, rng[0]) + text + val.substring(rng[1]);
-};
-NothingRange.prototype._nativeEOL = function(){
- this.text('\n');
-};
-NothingRange.prototype._nativeTop = function(){
- return 0;
-};
-NothingRange.prototype._nativeWrap = function() {throw new Error("Wrapping not implemented")};
-
-
-// data for elements, similar to jQuery data, but allows for monitoring with custom events
-var data = []; // to avoid attaching javascript objects to DOM elements, to avoid memory leaks
-bililiteRange.fn.data = function(){
- var index = this.element().bililiteRangeData;
- if (index == undefined){
- index = this.element().bililiteRangeData = data.length;
- data[index] = new Data(this);
- }
- return data[index];
-}
-try {
- Object.defineProperty({},'foo',{}); // IE8 will throw an error
- var Data = function(rng) {
- // we use JSON.stringify to display the data values. To make some of those non-enumerable, we have to use properties
- Object.defineProperty(this, 'values', {
- value: {}
- });
- Object.defineProperty(this, 'sourceRange', {
- value: rng
- });
- Object.defineProperty(this, 'toJSON', {
- value: function(){
- var ret = {};
- for (var i in Data.prototype) if (i in this.values) ret[i] = this.values[i];
- return ret;
- }
- });
- // to display all the properties (not just those changed), use JSON.stringify(state.all)
- Object.defineProperty(this, 'all', {
- get: function(){
- var ret = {};
- for (var i in Data.prototype) ret[i] = this[i];
- return ret;
- }
- });
- }
-
- Data.prototype = {};
- Object.defineProperty(Data.prototype, 'values', {
- value: {}
- });
- Object.defineProperty(Data.prototype, 'monitored', {
- value: {}
- });
-
- bililiteRange.data = function (name, newdesc){
- newdesc = newdesc || {};
- var desc = Object.getOwnPropertyDescriptor(Data.prototype, name) || {};
- if ('enumerable' in newdesc) desc.enumerable = !!newdesc.enumerable;
- if (!('enumerable' in desc)) desc.enumerable = true; // default
- if ('value' in newdesc) Data.prototype.values[name] = newdesc.value;
- if ('monitored' in newdesc) Data.prototype.monitored[name] = newdesc.monitored;
- desc.configurable = true;
- desc.get = function (){
- if (name in this.values) return this.values[name];
- return Data.prototype.values[name];
- };
- desc.set = function (value){
- this.values[name] = value;
- if (Data.prototype.monitored[name]) this.sourceRange.dispatch({
- type: 'bililiteRangeData',
- bubbles: true,
- detail: {name: name, value: value}
- });
- }
- Object.defineProperty(Data.prototype, name, desc);
- }
-}catch(err){
- // if we can't set object property properties, just use old-fashioned properties
- Data = function(rng){ this.sourceRange = rng };
- Data.prototype = {};
- bililiteRange.data = function(name, newdesc){
- if ('value' in newdesc) Data.prototype[name] = newdesc.value;
- }
-}
-
-})();
-
-// Polyfill for forEach, per Mozilla documentation. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill
-if (!Array.prototype.forEach)
-{
- Array.prototype.forEach = function(fun /*, thisArg */)
- {
- "use strict";
-
- if (this === void 0 || this === null)
- throw new TypeError();
-
- var t = Object(this);
- var len = t.length >>> 0;
- if (typeof fun !== "function")
- throw new TypeError();
-
- var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
- for (var i = 0; i < len; i++)
- {
- if (i in t)
- fun.call(thisArg, t[i], i, t);
- }
- };
-}
diff --git a/src/main/webapp/connect/confluence/prism/bililiteRange.undo.js b/src/main/webapp/connect/confluence/prism/bililiteRange.undo.js
deleted file mode 100644
index 63387869..00000000
--- a/src/main/webapp/connect/confluence/prism/bililiteRange.undo.js
+++ /dev/null
@@ -1,122 +0,0 @@
-// implements a simple undo stack for bililiteRange
-
-// version 1.2
-// Documentation at http://bililite.com/blog/2013/12/25/bililiterange-undo/
-
-// depends on bililiteRange.js
-
-// Copyright (c) 2013 Daniel Wachsstock
-// MIT license:
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-
-if (bililiteRange) (function(){
-
-bililiteRange.data ('undos', {enumerable: false});
-
-bililiteRange.fn.undo = function(n){
- if (arguments.length == 0) n = 1; // default
- var state = getundostate(this);
- if (n > 0){
- for (var i = 0; i < n; ++i) restore (state, 'undo', this);
- }else if (n < 0){
- for (i = 0; i > n; --i) restore (state, 'redo', this);
- }
- return this;
-};
-
-function getundostate(rng){
- var undos = rng.data().undos;
- if (undos) return undos;
- var state = new undostate (rng);
- setuplisteners (rng);
- return state;
-}
-
-function undostate (rng){
- // inefficiently just stores the whole text rather than trying to figure out a diff
- this.text = rng.all();
- var laststate = rng.data().undos;
- if (laststate && this.text == laststate.text) return; // is this too inefficient, to compare each time?
- this.bounds = rng.bounds('selection').bounds();
- this.undo = this; // set up a doubly linked list that never ends (so undo with only one element on the list does nothing)
- this.redo = this;
- if (laststate) {
- this.undo = laststate;
- laststate.redo = this;
- }
- rng.data().undos = this;
-}
-
-function restore (state, dir, rng){
- // dir is 'undo' or 'redo';
- rng.dispatch({type: dir}); // signal it
- state = state[dir];
- state.lastevent = dir; // mark the undo/redo so we don't add the change in text to the undo stack
- rng.data().undos = state;
- rng.all(state.text).bounds(state.bounds).select(); // restore the old state
-}
-
-function setuplisteners (rng){
- rng.listen('input', function(){
- var state = getundostate(rng), el = rng.element(), lastevent = state.lastevent;
- delete state.lastevent;
- switch (lastevent){
- // catch input events that we should not save (resulting from undo, redo and keypress events that are contiguous)
- case 'undo': case 'redo':
- return; // don't record the current input
- case 'keypress':
- // if the last event was also a keypress, drop that one (so we would undo back to the beginning of the typing)
- if (state.penultimateevent == 'keypress') rng.data().undos = state.undo;
- }
- (new undostate(rng)).penultimateevent = lastevent; // record so we can check for keypress sequences
- }).listen('keypress', function(evt){
- // key presses replace each other, which means that undo will undo all of them, unless the previous event was not a keypress (meaning we are starting a
- // new series of typing) or we type a carriage return, which starts a new series of typing, or the new keypress is in a different place than the old one
- if (evt.which < 32) return; // nonprinting characters; Firefox tends to send them all. We want them all undone individually
- if (evt.altKey || evt.altGraphKey || evt.ctrlKey || evt.metaKey) return;
- var bounds = rng.bounds('selection').bounds();
- if (bounds[0] != bounds[1]) return; // about to erase a selection; start a new undo sequence
- var state = getundostate(rng);
- // only mark this if the previous event was in the same place
- if (state.bounds[0] != bounds[0]) return;
- state.lastevent = 'keypress';
- });
-}
-
-// for use as an event handler
-bililiteRange.undo = function (event){
- bililiteRange(event.target).undo();
- event.preventDefault();
-}
-bililiteRange.redo = function (event){
- bililiteRange(event.target).undo(-1);
- event.preventDefault();
-}
-
-// for debugging
-function getstack(state, dir){
- dir = dir || 'undo';
- for (var ret = []; ret.push(state), state[dir] != state; state = state[dir]);
- return ret;
-}
-
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/prism/bililiteRange.util.js b/src/main/webapp/connect/confluence/prism/bililiteRange.util.js
deleted file mode 100644
index 95510a61..00000000
--- a/src/main/webapp/connect/confluence/prism/bililiteRange.util.js
+++ /dev/null
@@ -1,272 +0,0 @@
-// Text range utilities
-// documentation: http://bililite.com/blog/2013/02/08/bililiterange-plugins/
-// depends on bililiteRange.js (http://bililite.com/blog/2011/01/17/cross-browser-text-ranges-and-selections/)
-// Version: 1.3
-// Copyright (c) 2013 Daniel Wachsstock
-// MIT license:
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-
-if (bililiteRange) (function(){
-
-bililiteRange.bounds.EOL = function(){
- // set the range to the end of this line
- // if we start at the end of a line, find will go to the next line! Check for that case first
- this.bounds('startbounds');
- if (this.findprimitive (/$/mg, this.bounds())) return this.bounds();
- return this.find(/$/m, true).bounds(); // don't wrap
-};
-bililiteRange.bounds.BOL = function(){
- // set the range to the beginning of this line
- // if we start at the beginning of a line, findBack will go to the previous line! Check for that case first
- this.bounds('startbounds');
- if (this.findprimitive (/^/mg, this.bounds())) return this.bounds();
- return this.findBack(/^/m, true).bounds(); // don't wrap
-};
-bililiteRange.bounds.line = function(){
- this.bounds('BOL');
- var start = this.bounds()[0];
- this.bounds('EOL');
- return [start, this.bounds()[1]];
-};
-bililiteRange.bounds.startbounds = function(){
- return [this.bounds()[0], this.bounds()[0]];
-};
-bililiteRange.bounds.endbounds = function(){
- return [this.bounds()[1], this.bounds()[1]];
-};
-
-// add autoindent option
-var oldtext = bililiteRange.fn.text;
-bililiteRange.fn.text = function (text, select, autoindent){
- if (!arguments.length) return oldtext.call (this);
- if (autoindent) text = indent(text, this.indentation());
- return oldtext.call (this, text, select);
-}
-
-bililiteRange.extend({
-
- find: function(re, nowrap, backwards){
- // little hack: can put the "nowrap" as a flag on the RegExp itself, analagous to ignoreCase and multiline; overrides the parameter
- if (re.nowrap !== undefined) nowrap = re.nowrap;
- re = globalize(re);
- var bounds = this.bounds();
- if (!backwards){
- var findprimitive = 'findprimitive';
- var initialbounds = [bounds[0], Number.MAX_VALUE];
- var fallbackbounds = [bounds[0]+1, Number.MAX_VALUE];
- }else{
- findprimitive = 'findprimitiveback';
- initialbounds = [0, bounds[0]];
- fallbackbounds = [0, bounds[0]-1];
- }
- var match = this[findprimitive](re, initialbounds);
- if (matchIs(match, bounds)){ // if the match is exactly the current string, it doesn't count
- match = this[findprimitive](re, fallbackbounds);
- }
- if (!match && !nowrap) match = this[findprimitive](re, [0, Number.MAX_VALUE]);
- if (matchIs(match, bounds)) match = false; // again, even with wrapping, don't find the identical segment
- this.match = match; // remember this for the caller
- if (match) this.bounds([match.index, match.index+match[0].length]); // select the found string
- return this;
- },
-
- findBack: function (re, nowrap) { return this.find(re,nowrap,true) },
-
- indentation: function(){
- // returns the whitespace at the start of this line
- return /^\s*/.exec(this.clone().bounds('line').text())[0];
- },
-
- indent: function (tabs){
- // tabs is the string to insert before each line of the range
- var oldtext = this.text(), newtext = indent(oldtext, tabs), b = this.bounds();
- this.text(newtext);
- // Need to indent the line containing the start of the range (indent only adds the tabs after newlines)
- this.clone().bounds('BOL').text(tabs);
- // Adjust bounds
- return this.bounds([b[0]+tabs.length, b[1]+tabs.length+newtext.length-oldtext.length]);
- },
-
- unindent: function (n, tabSize){
- // remove n tabs or sets of tabSize spaces from the beginning of each line
- tabSize = tabSize || this.data().tabSize || 8; // 8 is the browser default
- // remove internal tabs
- var oldtext = this.text(), newtext = unindent(oldtext, n, tabSize, false), b = this.bounds();
- var diffInternal = newtext.length-oldtext.length;
- this.text(newtext).bounds([b[0], b[1]+diffInternal]);
- // remove initial tabs
- var line = this.clone().bounds('line');
- oldtext = line.text();
- newtext = unindent(oldtext, n, tabSize, true);
- line.text(newtext);
- var diffStart = newtext.length-oldtext.length;
- return this.bounds([Math.max(line.bounds()[0], b[0]+diffStart), b[1]+diffInternal+diffStart]);
- },
-
- line:function(n){
- // set the bounds to the nth line or
- // return the line number of the start of the bounds. Note that it is 1-indexed, the way ex writes it!
- if (arguments.length){
- n = parseInt(n);
- if (isNaN(n)) return this;
- // if n is too large,set the bounds to the end; if too small, to the beginning
- if (n > this.all().split('\n').length) return this.bounds('end');
- if (n < 1) return this.bounds([0,0]);
- // move to the given line number, at same character number as the initial bounds.
- var start = this.bounds();
- this.bounds('BOL');
- var c = start[0] - this.bounds()[0]; // character number
- // so find n-1 newlines to get to the correct line, then c characters over (if we don't have that many, go to the end of the line)
- var re = new RegExp('(.*\\n){'+(n-1)+'}(.{'+c+'}|.*$)', 'm');
- return this.bounds('all').find(re).bounds('endbounds');
- }else{
- // just count newlines before this.bounds
- // If we are on the boundary between lines (i.e. after the newline), this counts the next line
- return this.all().slice(0, this.bounds()[0]).split('\n').length;
- }
- },
-
- live: function(on){
- var self = this;
- if (arguments.length == 0 || on){
- this._oldtext = self.all(); // resync the text if it should be necessary
- if (this._inputHandler) return this; // don't double-bind
- this._inputHandler = function(ev){
- // first find the change.
- var start, oldend, newend;
- var newtext = self.all();
- if (newtext == self._oldtext) return; // no change
- if (!ev.bounds){
- // "real" input events don't tell us the bounds (and until they really support DOM 3 events, not even the text.
- // we have to start from scratch.
- var change = diff (self._oldtext, newtext);
- ev.bounds = change.bounds; // save it for future events
- ev.data = change.data;
- }
- start = ev.bounds[0];
- oldend = ev.bounds[1];
- newend = ev.bounds[0]+ev.data.length;
- self._oldtext = newtext;
- // adjust bounds; this tries to emulate the algorithm that Microsoft Word uses for bookmarks
- if (self._bounds[0] <= start){
- // no change
- }else if (self._bounds[0] > oldend){
- self._bounds[0] += newend - oldend;
- }else{
- self._bounds[0] = newend;
- }
- if (self._bounds[1] < start){
- // no change
- }else if (self._bounds[1] >= oldend){
- self._bounds[1] += newend - oldend;
- }else{
- self._bounds[1] = start;
- }
- };
- self.listen('input', self._inputHandler);
- }else{
- self.dontlisten('input', self._inputHandler);
- delete self._inputHandler;
- }
- return this;
- },
-
- findprimitive: function(re, bounds){
- // search for re within the bounds given. Return the result of the RegExp.exec call or false if not found.
- // re needs to be global for this to work!
- var text = this.all();
- re.lastIndex = bounds[0];
- var match = re.exec(text);
- if (!match || match.index+match[0].length > bounds[1]) return false;
- return match;
- },
-
- findprimitiveback: function (re, bounds){
- // no way to search backwards; have to search forward until we fail
- var match = false;
- do {
- var lastmatch = match;
- match = this.findprimitive(re, bounds);
- bounds[0] = match.index+1;
- }while (match);
- return lastmatch;
- }
-});
-
-// utilities
-function globalize (re){
- // make a RegExp global, to allow multiple searches
- return new RegExp(re.source, 'g'+(re.ignoreCase ? 'i' : '') + (re.multiline ? 'm' : ''));
-}
-function matchIs(match, bounds){
- // check if the match that we just found is the same as the existing bounds, since we shouldn't count that
- // this way, "Find Next" won't keep coming back to the same string.
- // I think this is the way that Word does it
- return match && match.index == bounds[0] && match[0].length == bounds[1]-bounds[0];
-}
-
-function diff (oldtext, newtext){
- // Try to find the changed text , assuming it was a continuous change
- // This is wrong for drag and drop, which only fires one input event for both removal and insertion
- var oldlen = oldtext.length;
- var newlen = newtext.length;
- for (var i = 0; i < newlen && i < oldlen; ++i){
- if (newtext.charAt(i) != oldtext.charAt(i)) break;
- }
- var start = i;
- for (i = 0; i < newlen && i < oldlen; ++i){
- var newpos = newlen-i-1, oldpos = oldlen-i-1;
- if (newpos < start || oldpos < start) break;
- if (newtext.charAt(newpos) != oldtext.charAt(oldpos)) break;
- }
- var oldend = oldlen-i;
- var newend = newlen-i;
- return {bounds: [start, oldend], data: newtext.slice(start, newend)}
-};
-bililiteRange.diff = diff; // expose
-
-function indent(text, tabs){
- return text.replace(/\n/g, '\n'+tabs);
-}
-function unindent(str, count, tabwidth, start){
- // count can be an integer >= 0 or Infinity.
- // (We delete up to 'count' tabs at the beginning of each line.)
- // If invalid, defaults to 1.
- //
- // tabwidth can be an integer >= 1.
- // (The number of spaces to consider a single tab.)
- // If invalid, defaults to 4.
- //
- // Either can also be a string or number that rounds to that.
- //
- // start=true: unindent only the first line of the string.
- // start=false: unindent any line in the string except the first.
- tabwidth = Math.round(tabwidth);
- count = Math.round(count);
- if (!isFinite(tabwidth) || tabwidth < 1) tabwidth = 4;
- if (isNaN(count) || count < 0) count = 1;
- if (!isFinite(count)) count = '';
- var re = new RegExp((start ? '(^)' : '(\\n)') + '(?:\t| {'+tabwidth+'}){1,'+count+'}', 'g');
- return str.replace(re, '$1');
-}
-
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/prism/prism.css b/src/main/webapp/connect/confluence/prism/prism.css
deleted file mode 100644
index 9bc4fd1d..00000000
--- a/src/main/webapp/connect/confluence/prism/prism.css
+++ /dev/null
@@ -1,234 +0,0 @@
-/* PrismJS 1.16.0
-https://prismjs.com/download.html#themes=prism&languages=json&plugins=line-highlight+line-numbers */
-/**
- * prism.js default theme for JavaScript, CSS and HTML
- * Based on dabblet (http://dabblet.com)
- * @author Lea Verou
- */
-
-code[class*="language-"],
-pre[class*="language-"] {
- color: black;
- background: none;
- text-shadow: 0 1px white;
- font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
- font-size: 1em;
- text-align: left;
- white-space: pre;
- word-spacing: normal;
- word-break: normal;
- word-wrap: normal;
- line-height: 1.5;
-
- -moz-tab-size: 4;
- -o-tab-size: 4;
- tab-size: 4;
-
- -webkit-hyphens: none;
- -moz-hyphens: none;
- -ms-hyphens: none;
- hyphens: none;
-}
-
-pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
-code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
- text-shadow: none;
- background: #b3d4fc;
-}
-
-pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
-code[class*="language-"]::selection, code[class*="language-"] ::selection {
- text-shadow: none;
- background: #b3d4fc;
-}
-
-@media print {
- code[class*="language-"],
- pre[class*="language-"] {
- text-shadow: none;
- }
-}
-
-/* Code blocks */
-pre[class*="language-"] {
- padding: 1em;
- margin: .5em 0;
- overflow: auto;
-}
-
-:not(pre) > code[class*="language-"],
-pre[class*="language-"] {
- background: #f5f2f0;
-}
-
-/* Inline code */
-:not(pre) > code[class*="language-"] {
- padding: .1em;
- border-radius: .3em;
- white-space: normal;
-}
-
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
- color: slategray;
-}
-
-.token.punctuation {
- color: #999;
-}
-
-.namespace {
- opacity: .7;
-}
-
-.token.property,
-.token.tag,
-.token.boolean,
-.token.number,
-.token.constant,
-.token.symbol,
-.token.deleted {
- color: #905;
-}
-
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.char,
-.token.builtin,
-.token.inserted {
- color: #690;
-}
-
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string {
- color: #9a6e3a;
- background: hsla(0, 0%, 100%, .5);
-}
-
-.token.atrule,
-.token.attr-value,
-.token.keyword {
- color: #07a;
-}
-
-.token.function,
-.token.class-name {
- color: #DD4A68;
-}
-
-.token.regex,
-.token.important,
-.token.variable {
- color: #e90;
-}
-
-.token.important,
-.token.bold {
- font-weight: bold;
-}
-.token.italic {
- font-style: italic;
-}
-
-.token.entity {
- cursor: help;
-}
-
-pre[data-line] {
- position: relative;
- padding: 1em 0 1em 3em;
-}
-
-.line-highlight {
- position: absolute;
- left: 0;
- right: 0;
- padding: inherit 0;
- margin-top: 1em; /* Same as .prism’s padding-top */
-
- background: hsla(24, 20%, 50%,.08);
- background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
-
- pointer-events: none;
-
- line-height: inherit;
- white-space: pre;
-}
-
- .line-highlight:before,
- .line-highlight[data-end]:after {
- content: attr(data-start);
- position: absolute;
- top: .4em;
- left: .6em;
- min-width: 1em;
- padding: 0 .5em;
- background-color: hsla(24, 20%, 50%,.4);
- color: hsl(24, 20%, 95%);
- font: bold 65%/1.5 sans-serif;
- text-align: center;
- vertical-align: .3em;
- border-radius: 999px;
- text-shadow: none;
- box-shadow: 0 1px white;
- }
-
- .line-highlight[data-end]:after {
- content: attr(data-end);
- top: auto;
- bottom: .4em;
- }
-
-.line-numbers .line-highlight:before,
-.line-numbers .line-highlight:after {
- content: none;
-}
-
-pre[class*="language-"].line-numbers {
- position: relative;
- padding-left: 3.8em;
- counter-reset: linenumber;
-}
-
-pre[class*="language-"].line-numbers > code {
- position: relative;
- white-space: inherit;
-}
-
-.line-numbers .line-numbers-rows {
- position: absolute;
- pointer-events: none;
- top: 0;
- font-size: 100%;
- left: -3.8em;
- width: 3em; /* works for line-numbers below 1000 lines */
- letter-spacing: -1px;
- border-right: 1px solid #999;
-
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
-}
-
- .line-numbers-rows > span {
- pointer-events: none;
- display: block;
- counter-increment: linenumber;
- }
-
- .line-numbers-rows > span:before {
- content: counter(linenumber);
- color: #999;
- display: block;
- padding-right: 0.8em;
- text-align: right;
- }
-
diff --git a/src/main/webapp/connect/confluence/prism/prism.js b/src/main/webapp/connect/confluence/prism/prism.js
deleted file mode 100644
index d270a860..00000000
--- a/src/main/webapp/connect/confluence/prism/prism.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/* PrismJS 1.16.0
-https://prismjs.com/download.html#themes=prism&languages=json&plugins=line-highlight+line-numbers */
-var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(g){var c=/\blang(?:uage)?-([\w-]+)\b/i,a=0,C={manual:g.Prism&&g.Prism.manual,disableWorkerMessageHandler:g.Prism&&g.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof M?new M(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++a}),e.__id},clone:function t(e,n){var r,a,i=C.util.type(e);switch(n=n||{},i){case"Object":if(a=C.util.objId(e),n[a])return n[a];for(var l in r={},n[a]=r,e)e.hasOwnProperty(l)&&(r[l]=t(e[l],n));return r;case"Array":return a=C.util.objId(e),n[a]?n[a]:(r=[],n[a]=r,e.forEach(function(e,a){r[a]=t(e,n)}),r);default:return e}}},languages:{extend:function(e,a){var t=C.util.clone(C.languages[e]);for(var n in a)t[n]=a[n];return t},insertBefore:function(t,e,a,n){var r=(n=n||C.languages)[t],i={};for(var l in r)if(r.hasOwnProperty(l)){if(l==e)for(var o in a)a.hasOwnProperty(o)&&(i[o]=a[o]);a.hasOwnProperty(l)||(i[l]=r[l])}var s=n[t];return n[t]=i,C.languages.DFS(C.languages,function(e,a){a===s&&e!=t&&(this[e]=i)}),i},DFS:function e(a,t,n,r){r=r||{};var i=C.util.objId;for(var l in a)if(a.hasOwnProperty(l)){t.call(a,l,a[l],n||l);var o=a[l],s=C.util.type(o);"Object"!==s||r[i(o)]?"Array"!==s||r[i(o)]||(r[i(o)]=!0,e(o,t,l,r)):(r[i(o)]=!0,e(o,t,null,r))}}},plugins:{},highlightAll:function(e,a){C.highlightAllUnder(document,e,a)},highlightAllUnder:function(e,a,t){var n={callback:t,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};C.hooks.run("before-highlightall",n);for(var r,i=n.elements||e.querySelectorAll(n.selector),l=0;r=i[l++];)C.highlightElement(r,!0===a,n.callback)},highlightElement:function(e,a,t){for(var n,r,i=e;i&&!c.test(i.className);)i=i.parentNode;i&&(n=(i.className.match(c)||[,""])[1].toLowerCase(),r=C.languages[n]),e.className=e.className.replace(c,"").replace(/\s+/g," ")+" language-"+n,e.parentNode&&(i=e.parentNode,/pre/i.test(i.nodeName)&&(i.className=i.className.replace(c,"").replace(/\s+/g," ")+" language-"+n));var l={element:e,language:n,grammar:r,code:e.textContent},o=function(e){l.highlightedCode=e,C.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,C.hooks.run("after-highlight",l),C.hooks.run("complete",l),t&&t.call(l.element)};if(C.hooks.run("before-sanity-check",l),l.code)if(C.hooks.run("before-highlight",l),l.grammar)if(a&&g.Worker){var s=new Worker(C.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(C.highlight(l.code,l.grammar,l.language));else o(C.util.encode(l.code));else C.hooks.run("complete",l)},highlight:function(e,a,t){var n={code:e,grammar:a,language:t};return C.hooks.run("before-tokenize",n),n.tokens=C.tokenize(n.code,n.grammar),C.hooks.run("after-tokenize",n),M.stringify(C.util.encode(n.tokens),n.language)},matchGrammar:function(e,a,t,n,r,i,l){for(var o in t)if(t.hasOwnProperty(o)&&t[o]){if(o==l)return;var s=t[o];s="Array"===C.util.type(s)?s:[s];for(var g=0;g<s.length;++g){var c=s[g],u=c.inside,h=!!c.lookbehind,f=!!c.greedy,d=0,m=c.alias;if(f&&!c.pattern.global){var p=c.pattern.toString().match(/[imuy]*$/)[0];c.pattern=RegExp(c.pattern.source,p+"g")}c=c.pattern||c;for(var y=n,v=r;y<a.length;v+=a[y].length,++y){var k=a[y];if(a.length>e.length)return;if(!(k instanceof M)){if(f&&y!=a.length-1){if(c.lastIndex=v,!(x=c.exec(e)))break;for(var b=x.index+(h?x[1].length:0),w=x.index+x[0].length,A=y,P=v,O=a.length;A<O&&(P<w||!a[A].type&&!a[A-1].greedy);++A)(P+=a[A].length)<=b&&(++y,v=P);if(a[y]instanceof M)continue;N=A-y,k=e.slice(v,P),x.index-=v}else{c.lastIndex=0;var x=c.exec(k),N=1}if(x){h&&(d=x[1]?x[1].length:0);w=(b=x.index+d)+(x=x[0].slice(d)).length;var j=k.slice(0,b),S=k.slice(w),E=[y,N];j&&(++y,v+=j.length,E.push(j));var _=new M(o,u?C.tokenize(x,u):x,m,x,f);if(E.push(_),S&&E.push(S),Array.prototype.splice.apply(a,E),1!=N&&C.matchGrammar(e,a,t,y,v,!0,o),i)break}else if(i)break}}}}},tokenize:function(e,a){var t=[e],n=a.rest;if(n){for(var r in n)a[r]=n[r];delete a.rest}return C.matchGrammar(e,t,a,0,0,!1),t},hooks:{all:{},add:function(e,a){var t=C.hooks.all;t[e]=t[e]||[],t[e].push(a)},run:function(e,a){var t=C.hooks.all[e];if(t&&t.length)for(var n,r=0;n=t[r++];)n(a)}},Token:M};function M(e,a,t,n,r){this.type=e,this.content=a,this.alias=t,this.length=0|(n||"").length,this.greedy=!!r}if(g.Prism=C,M.stringify=function(e,a){if("string"==typeof e)return e;if(Array.isArray(e))return e.map(function(e){return M.stringify(e,a)}).join("");var t={type:e.type,content:M.stringify(e.content,a),tag:"span",classes:["token",e.type],attributes:{},language:a};if(e.alias){var n=Array.isArray(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(t.classes,n)}C.hooks.run("wrap",t);var r=Object.keys(t.attributes).map(function(e){return e+'="'+(t.attributes[e]||"").replace(/"/g,"&quot;")+'"'}).join(" ");return"<"+t.tag+' class="'+t.classes.join(" ")+'"'+(r?" "+r:"")+">"+t.content+"</"+t.tag+">"},!g.document)return g.addEventListener&&(C.disableWorkerMessageHandler||g.addEventListener("message",function(e){var a=JSON.parse(e.data),t=a.language,n=a.code,r=a.immediateClose;g.postMessage(C.highlight(n,C.languages[t],t)),r&&g.close()},!1)),C;var e=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return e&&(C.filename=e.src,C.manual||e.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(C.highlightAll):window.setTimeout(C.highlightAll,16):document.addEventListener("DOMContentLoaded",C.highlightAll))),C}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
-Prism.languages.json={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,property:{pattern:/"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,greedy:!0},number:/-?\d+\.?\d*(e[+-]?\d+)?/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};
-!function(){if("undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector){var t,h=function(){if(void 0===t){var e=document.createElement("div");e.style.fontSize="13px",e.style.lineHeight="1.5",e.style.padding=0,e.style.border=0,e.innerHTML="&nbsp;<br />&nbsp;",document.body.appendChild(e),t=38===e.offsetHeight,document.body.removeChild(e)}return t},l=0;Prism.hooks.add("before-sanity-check",function(e){var t=e.element.parentNode,n=t&&t.getAttribute("data-line");if(t&&n&&/pre/i.test(t.nodeName)){var i=0;r(".line-highlight",t).forEach(function(e){i+=e.textContent.length,e.parentNode.removeChild(e)}),i&&/^( \n)+$/.test(e.code.slice(-i))&&(e.code=e.code.slice(0,-i))}}),Prism.hooks.add("complete",function e(t){var n=t.element.parentNode,i=n&&n.getAttribute("data-line");if(n&&i&&/pre/i.test(n.nodeName)){clearTimeout(l);var r=Prism.plugins.lineNumbers,o=t.plugins&&t.plugins.lineNumbers;g(n,"line-numbers")&&r&&!o?Prism.hooks.add("line-numbers",e):(a(n,i),l=setTimeout(s,1))}}),window.addEventListener("hashchange",s),window.addEventListener("resize",function(){var e=document.querySelectorAll("pre[data-line]");Array.prototype.forEach.call(e,function(e){a(e)})})}function r(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function g(e,t){return t=" "+t+" ",-1<(" "+e.className+" ").replace(/[\n\t]/g," ").indexOf(t)}function a(e,t,n){for(var i,r=(t="string"==typeof t?t:e.getAttribute("data-line")).replace(/\s+/g,"").split(","),o=+e.getAttribute("data-line-offset")||0,l=(h()?parseInt:parseFloat)(getComputedStyle(e).lineHeight),a=g(e,"line-numbers"),s=0;i=r[s++];){var d=i.split("-"),u=+d[0],c=+d[1]||u,m=e.querySelector('.line-highlight[data-range="'+i+'"]')||document.createElement("div");if(m.setAttribute("aria-hidden","true"),m.setAttribute("data-range",i),m.className=(n||"")+" line-highlight",a&&Prism.plugins.lineNumbers){var p=Prism.plugins.lineNumbers.getLine(e,u),f=Prism.plugins.lineNumbers.getLine(e,c);p&&(m.style.top=p.offsetTop+"px"),f&&(m.style.height=f.offsetTop-p.offsetTop+f.offsetHeight+"px")}else m.setAttribute("data-start",u),u<c&&m.setAttribute("data-end",c),m.style.top=(u-o-1)*l+"px",m.textContent=new Array(c-u+2).join(" \n");a?e.appendChild(m):(e.querySelector("code")||e).appendChild(m)}}function s(){var e=location.hash.slice(1);r(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var t=(e.match(/\.([\d,-]+)$/)||[,""])[1];if(t&&!document.getElementById(e)){var n=e.slice(0,e.lastIndexOf(".")),i=document.getElementById(n);i&&(i.hasAttribute("data-line")||i.setAttribute("data-line",""),a(i,t,"temporary "),document.querySelector(".temporary.line-highlight").scrollIntoView())}}}();
-!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var l="line-numbers",c=/\n(?!$)/g,m=function(e){var t=a(e)["white-space"];if("pre-wrap"===t||"pre-line"===t){var n=e.querySelector("code"),r=e.querySelector(".line-numbers-rows"),s=e.querySelector(".line-numbers-sizer"),i=n.textContent.split(c);s||((s=document.createElement("span")).className="line-numbers-sizer",n.appendChild(s)),s.style.display="block",i.forEach(function(e,t){s.textContent=e||"\n";var n=s.getBoundingClientRect().height;r.children[t].style.height=n+"px"}),s.textContent="",s.style.display="none"}},a=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null};window.addEventListener("resize",function(){Array.prototype.forEach.call(document.querySelectorAll("pre."+l),m)}),Prism.hooks.add("complete",function(e){if(e.code){var t=e.element,n=t.parentNode;if(n&&/pre/i.test(n.nodeName)&&!t.querySelector(".line-numbers-rows")){for(var r=!1,s=/(?:^|\s)line-numbers(?:\s|$)/,i=t;i;i=i.parentNode)if(s.test(i.className)){r=!0;break}if(r){t.className=t.className.replace(s," "),s.test(n.className)||(n.className+=" line-numbers");var l,a=e.code.match(c),o=a?a.length+1:1,u=new Array(o+1).join("<span></span>");(l=document.createElement("span")).setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=u,n.hasAttribute("data-start")&&(n.style.counterReset="linenumber "+(parseInt(n.getAttribute("data-start"),10)-1)),e.element.appendChild(l),m(n),Prism.hooks.run("line-numbers",e)}}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}),Prism.plugins.lineNumbers={getLine:function(e,t){if("PRE"===e.tagName&&e.classList.contains(l)){var n=e.querySelector(".line-numbers-rows"),r=parseInt(e.getAttribute("data-start"),10)||1,s=r+(n.children.length-1);t<r&&(t=r),s<t&&(t=s);var i=t-r;return n.children[i]}}}}}();
diff --git a/src/main/webapp/connect/confluence/splash-editor.js b/src/main/webapp/connect/confluence/splash-editor.js
deleted file mode 100644
index e9d6a911..00000000
--- a/src/main/webapp/connect/confluence/splash-editor.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var connectUrl = AC.getBaseUrl() + '/atlassian-connect';
-var head = document.getElementsByTagName('head')[0];
-
-var script = document.createElement('script');
-script.setAttribute('data-options', 'resize:false;margin:false');
-
-// Main
-script.onload = function()
-{
- AP.dialog.create(
- {
- key: 'macroEditor',
- customData: {},
- chrome: false,
- width: "100%",
- height: "100%",
- }).on("close", function(flags)
- {
- AP.dialog.close();
- });
-};
-script.src = 'https://connect-cdn.atl-paas.net/all.js';
-head.appendChild(script);
diff --git a/src/main/webapp/connect/confluence/splashEditor.html b/src/main/webapp/connect/confluence/splashEditor.html
deleted file mode 100644
index e4a0c2c1..00000000
--- a/src/main/webapp/connect/confluence/splashEditor.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Editor</title>
-<script src="connectUtils-1-4-8.js" type="text/javascript"></script>
-<style type="text/css">
- html, body {
- height:100%;
- overflow:hidden;
- }
- body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-text-bottom.svg);
- background-repeat:no-repeat;
- background-position:center;
- background-size:128px;
- font-family:Arial,Sans-Serif;
- overflow:hidden;
- width:100%;
- margin:0;
- }
-</style>
-</head>
-<body>
-<script src="splash-editor.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/confluence/support.html b/src/main/webapp/connect/confluence/support.html
deleted file mode 100644
index f11416ec..00000000
--- a/src/main/webapp/connect/confluence/support.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<html>
- <head>
- <script type="text/javascript" src="https://connect-cdn.atl-paas.net/all.js" data-options="sizeToParent:true;"></script>
- <link rel="stylesheet" type="text/css" href="https://aui-cdn.atlassian.com/aui-adg/6.0.4/css/aui.css">
- <title>draw.io Support</title>
- </head>
- <body>
- <div id="admin-content" style="padding: 20 0 0 30;">
- <div class="logo-heading-block">
- <span class="logoBlock"></span>
- <div id="admin-heading-container">
- <h1 class="admin-heading">
- draw.io Support
- </h1>
- <div>
- draw.io add-on for Confluence (Version: <span id="drawioVersion"></span> and License SEN: <span id="drawioLic"></span>)
- </div>
- </div>
- </div>
- <br>
- <div id="admin-body">
- <div id="admin-body-content">
- <div id="content_thank-you_page" align="left">
- <div id="p_head">
- <h3>Getting Support</h3>
- </div>
- <div id="p_content">
- <div class="p_lower_content">
- <ul>
- <li>For support requests relating to installation, data load/save, broken functionality problems, post to our <a href="https://drawio.atlassian.net/servicedesk/customer/portal/14/group/15/create/49" target="_blank">service desk</a>.
- <li>Please include the draw.io version and SEN shown on this page to speed up the support process.</li>
- <li>Support requests should be routed via an admin, wherever possible.</li>
- </ul>
- <p></p>
- </div>
- </div>
- <div id="p_head">
- <h3>Helpful resources for Admins</h3>
- </div>
- <div id="p_content">
- <div class="p_lower_content">
- <ul>
- <li>
- <a class="external-link"
- href="https://drawio-app.com/customise-default-colours-fonts-styles-and-the-draw-io-ui-in-confluence-cloud/"
- rel="nofollow" target="_blank">Customise colours, fonts
- and styles</a>&nbsp;of&nbsp;draw.io&nbsp;for Confluence
- </li>
- <li>
- <a class="external-link"
- href="https://drawio-app.com/learning/interactive-tutorials/"
- rel="nofollow" target="_blank">Embed our interactive
- tutorials for your user base</a>
- </li>
- <!-- li>Optionally configure draw.io by following the posts
- <a href="https://about.draw.io/customise-default-colours-fonts-styles-and-the-draw-io-ui-in-confluence-cloud/" target="_blank">here</a> and
- <a href="https://about.draw.io/customise-default-shape-libraries-templates-and-plugins-in-draw-io-for-confluence-cloud/">here</a>.
- </li-->
- </ul>
- <p></p>
- </div>
- </div>
- <div id="p_head">
- <h3>Helpful resources for Users</h3>
- </div>
- <div id="p_content">
- <div class="p_lower_content">
- <!-- <p>
- Some links you can send out to users to help them be more productive:
- </p>-->
- <ul>
- <li>
- <a class="external-link"
- href="https://about.draw.io/features/training-material/"
- rel="nofollow" target="_blank">Have a look at our
- training materials</a>
- </li>
- <li>
- <a class="external-link"
- href="https://www.youtube.com/watch?v=Z0D96ZikMkc"
- rel="nofollow" target="_blank">10 tips about draw.io core
- functionalities</a>&nbsp;(90 second video)
- </li>
- <li>
- <a class="external-link"
- href="https://drawio-app.com/customise-default-shape-libraries-templates-and-plugins-in-draw-io-for-confluence-cloud/"
- rel="nofollow" target="_blank">Customise draw.io libraries
- and templates</a>
- </li>
- <li>
- Search existing Q&amp;A on&nbsp;<a class="external-link"
- href="https://community.atlassian.com/t5/forums/searchpage/tab/message?advanced=false&amp;allow_punctuation=false&amp;q=%22draw.io%22&amp;sort_by=-topicPostDate"
- rel="nofollow" target="_blank">Atlassian Community</a>
- </li>
- <li>
- Search existing Q&amp;A on&nbsp;<a class="external-link"
- href="https://groups.google.com/forum/#!forum/drawio"
- rel="nofollow" target="_blank">Google Groups</a>
- </li>
- <li>
- See our Roadmap and feature requests for&nbsp;<a
- class="external-link"
- href="https://trello.com/b/24APPeGl/drawio-confluence-cloud"
- rel="nofollow" target="_blank">draw.io for Confluence
- Cloud</a>&nbsp;and our&nbsp;<a class="external-link"
- href="https://trello.com/b/y21hYbn6/drawio-core"
- rel="nofollow" target="_blank">core draw.io editor</a>&nbsp;
- </li>
- </ul>
- <p></p>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <script type="text/javascript" src="support.js"></script>
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/support.js b/src/main/webapp/connect/confluence/support.js
deleted file mode 100644
index f30fb213..00000000
--- a/src/main/webapp/connect/confluence/support.js
+++ /dev/null
@@ -1,17 +0,0 @@
-AP.request({
- type: 'GET',
- url: '/rest/atlassian-connect/1/addons/com.mxgraph.confluence.plugins.diagramly',
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
- document.getElementById('drawioLic').innerHTML = resp.license? resp.license.supportEntitlementNumber : 'Unlicensed';
- document.getElementById('drawioVersion').innerHTML = resp.version;
- }
-});
-
-window.intercomSettings = {
- app_id: "fz6gxyi6"
-};
-
-(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/fz6gxyi6';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})();
diff --git a/src/main/webapp/connect/confluence/viewer-1-4-42.html b/src/main/webapp/connect/confluence/viewer-1-4-42.html
deleted file mode 100644
index 57a39acb..00000000
--- a/src/main/webapp/connect/confluence/viewer-1-4-42.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-gray.svg);
- background-repeat:no-repeat;
- background-position:center top;
- background-size: 64px;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-<link rel="stylesheet" href="/mxgraph/css/common.css" />
-<link rel="stylesheet" href="/styles/grapheditor.css" />
-<script src="connectUtils-1-4-8.js" type="text/javascript"></script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script src="/plugins/cConf-comments.js" type="text/javascript"></script>
-</head>
-<body>
-<script type="text/javascript" src="viewer-init.js"></script>
-<script type="text/javascript" src="/js/viewer-static.min.js"></script>
-<script type="text/javascript" src="viewer.js"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/confluence/viewer-1-4-8.html b/src/main/webapp/connect/confluence/viewer-1-4-8.html
deleted file mode 100644
index b7650726..00000000
--- a/src/main/webapp/connect/confluence/viewer-1-4-8.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-gray.svg);
- background-repeat:no-repeat;
- background-position:center top;
- background-size: 64px;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-<link rel="stylesheet" href="/mxgraph/css/common.css" />
-<link rel="stylesheet" href="/styles/grapheditor.css" />
-<script src="connectUtils-1-4-8.js" type="text/javascript"></script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script src="/plugins/cConf-comments.js" type="text/javascript"></script>
-</head>
-<body>
-<script type="text/javascript">
-// Parses URL parameters
-function getUrlParam(param, treatEmptyAsNull)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- var val = decodeURIComponent(result[1].replace(/\+/g, '%20'));
- return treatEmptyAsNull && val != null && val.length == 0 ? null : val;
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Absolute for font conversion in lightbox to work
-PROXY_URL = '/proxy';
-
-var lightbox = getUrlParam('lightbox') == '1';
-var customContent = getUrlParam('custom') == '1';
-
-if (lightbox)
-{
- document.body.style.backgroundImage = 'url(/images/drawlogo-text-bottom.svg)';
- document.body.style.backgroundPosition = 'center 30%';
- document.body.style.backgroundSize = '128px';
-}
-</script>
-<script type="text/javascript" src="/js/viewer-static.min.js"></script>
-<script type="text/javascript" src="viewer.js"></script>
-<script type="text/javascript">
-// Logs uncaught errors
-EditorUi.enableLogging = true;
-
-window.onerror = function(message, url, linenumber, colno, err)
-{
- message = 'Confluence Cloud: ' + ((message != null) ? message : '');
-
- EditorUi.logError(message, url, linenumber, colno, err);
-};
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/confluence/viewer-init.js b/src/main/webapp/connect/confluence/viewer-init.js
deleted file mode 100644
index 60a0d234..00000000
--- a/src/main/webapp/connect/confluence/viewer-init.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// Parses URL parameters
-function getUrlParam(param, treatEmptyAsNull)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- var val = decodeURIComponent(result[1].replace(/\+/g, '%20'));
- return treatEmptyAsNull && val != null && val.length == 0 ? null : val;
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-OPEN_URL = '/import';
-PROXY_URL = '/proxy';
-SAVE_URL = '/save';
-
-// Absolute for font conversion in lightbox to work
-PROXY_URL = '/proxy';
-
-var lightbox = getUrlParam('lightbox') == '1';
-var customContent = getUrlParam('custom') == '1';
-
-if (lightbox)
-{
- document.body.style.backgroundImage = 'url(/images/drawlogo-text-bottom.svg)';
- document.body.style.backgroundPosition = 'center 30%';
- document.body.style.backgroundSize = '128px';
-}
diff --git a/src/main/webapp/connect/confluence/viewer.js b/src/main/webapp/connect/confluence/viewer.js
deleted file mode 100644
index 90ca89b9..00000000
--- a/src/main/webapp/connect/confluence/viewer.js
+++ /dev/null
@@ -1,1415 +0,0 @@
-(function()
-{
- // Logs uncaught errors
- EditorUi.enableLogging = true;
-
- window.onerror = function(message, url, linenumber, colno, err)
- {
- message = 'Confluence Cloud: ' + ((message != null) ? message : '');
-
- EditorUi.logError(message, url, linenumber, colno, err);
- };
-
- var EXPORT_URL = 'https://exp.draw.io/ImageExport4/export';
-
- // Enables dynamic loading of shapes and stencils (same domain)
- mxStencilRegistry.dynamicLoading = true;
-
- // Loads the Atlassian API
- var script = document.createElement('script');
- var baseUrl = getBaseUrl();
-
- // Loads the attachment and renders the diagram
- var diagramWidth = parseFloat(getUrlParam('width'));
- var diagramHeight = parseFloat(getUrlParam('height'));
- var diagramName = getUrlParam('diagramName');
- var displayName = getUrlParam('displayName');
-
- //ceoId and owningPageId are IDs of the page that potentially hold the attachment
- //they will differ when page history is shown, ceoId will be historical version ID,
- //owningPageId will be the ID of the current version that holds the attachment
- //ceoId is used as fallback in case owningPageId is not set(should be very rare)
- var ceoId = getUrlParam('ceoId');
- var owningPageId = getUrlParam('owningPageId');
- var revision = getUrlParam('revision');
-
- var tbStyle = getUrlParam('tbstyle') || 'top';
- var links = getUrlParam('links') || 'auto';
- var enableLightbox = getUrlParam('lbox') != '0';
- var simpleViewer = getUrlParam('simple') == '1';
- var tbHeight = (tbStyle == 'top' && !simpleViewer) ? GraphViewer.prototype.toolbarHeight : 0;
- var zoom = parseFloat(getUrlParam('zoom') || 1);
- var border = (simpleViewer) ? 0 : 8;
- var pCenter = getUrlParam('pCenter') == '1';
-
- var contentId = getUrlParam('contentId') || getUrlParam('custContentId');
- var contentVer = getUrlParam('contentVer');
- var linkedMode = getUrlParam('linked') == '1';
- var diagramUrl = getUrlParam('diagramUrl');
- var csvFileUrl = getUrlParam('csvFileUrl');
- var inComment = getUrlParam('inComment') == '1';
- var aspect = getUrlParam('aspect');
- var imgPageId = getUrlParam('imgPageId');
- var aspectHash = getUrlParam('aspectHash');
- var attVer = getUrlParam('attVer', true);
- var service = getUrlParam('service', true);
- var sFileId = getUrlParam('sFileId', true);
- var odriveId = getUrlParam('odriveId', true);
- var userCanEdit = {}; //0: Unknown, 1: Yes, -1: No. For each pageId
- // Workaround for blocked referrer in iframe
- Graph.prototype.baseUrl = baseUrl + '/pages/viewpage.action?pageId=' + owningPageId;
-
- var openPageImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4goKFCgQ6ZBdjgAAAvJJREFUWMPFlz+IFHcUxz/vt7Nzu7fuKYqGM7HQKBISUc8gwcYiRcDKJliqRYRUkkYtUgRUCIekCQFbxUIDFxBCimAKBUtRJEVQLyRGZV31yO1e9vbPzO+b4obLnl682bm99TW/md/Me+/7vr/3Z8boEkkTwDayiQFV4KCZ1TNZkHRXy5cHvfgM/md/EzDdg51/gDvADuBdSZPA+0DLzJSFgXIG9m4nuleT9Z6k0lJ6jv7LUeBikkt33wSA0MwOJyC2SJqUVJJkgwIggATEBWBLkh/FQQH4ry7NjiQgtgK/DgpAfREQ3wKbJf0uaSRNGS5H7kuaeWmvAUTAZuAGsGslAAwl68Yl3tu5UgzsXsRemLRogCbwC/BRTwCefBkWyyP6ChG97r2Z8fCVyVCr2em3z7SbXc2qk7YVz0uhqDEHJyLvF46dVoj8XHDmBEMt6Cr1MHAUh+MfgFtZZsErha1u752Q0md3cIW5hPbNaWrn95IrNgDf1Q2yD6PXS34Dwei2rlp+i/rUekZG/8I535Op/vUBg9rTAO+tJ7VsDEQV4hcP8a1GEkYBRRUsEDPVPOX1ndSWMwAQeCFX4tGp9yCX551z91AbLBDeQ60aEm6MsP4dgQHCbBhYxfCnPzL90zhujcOVY2o/f8OGzy8jimAlJE/9WZ6onesTAwLCTYR7jkOuSH77x0TXLiWZLqKpCqWxA0TVsyiapX79O3z0lMbzvEG7HwA8wQfHKOz/Yn5r7aGveXzy+/lrzFj9yTFwDt+epXn9LGbWxyPwLzVCxYAlJCRF71zS8eL+l6Fqfy64j2emIDAsMOL684XPXvyRKvr0R+DAT17h8fEJOlE+8dLECnORVsb3Qa4wx4T3WChCl64bBmnyH4GsyarRHI2/O7QbBjnNDzoLPTDbpeVTk7skAC8qztlvAbkWwMi6iFoUSJF1TdpFKHMMEVPN+mdUZgVE0g1JGthH6XKqoLVC/nzaHLgpabbPzmNgf1oAHw7qCP4Fs6J7VGnK/oIAAAAASUVORK5CYII=';
-
- if (!lightbox)
- {
- document.body.style.backgroundImage = 'url(/images/aui-wait.gif)';
- document.body.style.backgroundPosition = 'left top';
- document.body.style.backgroundSize = 'auto auto';
- }
-
- function main()
- {
- // Sets initial placeholder size to allow for scrollbars in fit to page width
- AP.resize('100%', (lightbox || customContent) ? '100%' : (diagramHeight * zoom + tbHeight + 2));
-
- function showError(msg)
- {
- document.body.style.backgroundImage = 'none';
- document.body.style.padding = '4px';
- mxUtils.write(document.body, msg);
- AP.resize('100%', 24);
- };
-
- //keeping the block of AP.require to mimimize the number of changes!
- {
- //This is a workaround Jira Service Desk preview which has no context.
- //AP.navigator.getLocation will just log an error and callback function won't be called
- var ignoreNavFallback = false;
- var isServiceDesk = false; //In service desk, we cannot show dialogs as we cannot pass customData
-
- var fallbackTimeoutThread = window.setTimeout(function()
- {
- if (!ignoreNavFallback)
- {
- isServiceDesk = true;
- startViewer();
- }
- }, 500); //allow 0.5 sec for AP.navigator.getLocation
-
- // Uses pageId from current page as page in macro may be outdated after export
- AP.navigator.getLocation(function (data)
- {
- ignoreNavFallback = true;
- window.clearTimeout(fallbackTimeoutThread);
- startViewer(data);
- });
-
- function startViewer(data)
- {
- var candidateId = (owningPageId != null && owningPageId.length > 0) ? owningPageId : ceoId;
-
- if (!linkedMode && data != null && data.target != null && data.context != null)
- {
- candidateId = data.context.contentId;
- }
-
- function showExtDiagram(name, url)
- {
- mxUtils.get(url, function(req)
- {
- if (req.getStatus() >= 200 && req.getStatus() <= 299)
- {
- try
- {
- var xml = req.getText();
-
- document.body.style.backgroundImage = 'none';
-
- //In case we want to load another diagram
- var oldContainer = document.getElementById("drawIODiagram");
-
- if (oldContainer != null)
- {
- oldContainer.parentNode.removeChild(oldContainer);
- }
- // LATER: Fix horizontal alignment ignored with 100% width of iframe
- // LATER: Fix page scrolling on touch device if trigger event on diagram
- // LATER: Hide toolbar after second container click for iOS
- // LATER: Disable responsive resize while lightbox shows
- var container = document.createElement('div');
- container.id = "drawIODiagram";
- container.style.cssText = 'position:absolute;' +
- 'max-width:100%;border:1px solid transparent;';
- document.body.appendChild(container);
- var doc = mxUtils.parseXml(xml);
-
- var config = {highlight: '#3572b0', 'toolbar-position': tbStyle,
- nav: true, zoom: zoom};
-
- config.lightbox = false;
- config.toolbar = 'pages zoom layers';
- config.border = border;
- config.title = name;
- config.resize = true;
-
- if (aspect != null)
- {
- //Set pageId and layers
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- config.pageId = aspectArray[0];
- config.layerIds = aspectArray.slice(1);
- }
- }
-
- var viewer = new GraphViewer(container, doc.documentElement, config);
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- function updateHeight(height)
- {
- AP.resize('100%', Math.ceil(height) + tbHeight + 2);
- };
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight(height);
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight(height);
- };
-
- updateHeight(container.offsetHeight);
- }
- catch(e)
- {
- showError(e.message);
- }
- }
- else
- {
- if (req.getStatus() == 404)
- {
- showError(mxResources.get('fileNotFound'));
- }
- }
- }, function()
- {
- showError(mxResources.get('unknownError'));
- }, false, 25000, function()
- {
- showError(mxResources.get('confTimeout'));
- });
- };
-
- // Loads the given XML into the viewer
- function showDiagram(id, backupId, name, revision, links, retryParams, displayName, contentId, spaceKey, openComments, aspect)
- {
- //Check if the user can edit this diagram
- if (userCanEdit[id] == null)
- {
- if (inComment || (owningPageId != null && candidateId != owningPageId)) //TODO If the page id in the macro doesn't match the current page, we cannot edit it, fix this by allowing finding macro by owningPageId
- {
- userCanEdit[id] = -1; //TODO enable editing macros in comments externally (requires finding which comment it belongs to and editing that comment content)
- }
- else
- {
- var acceptPermResponse = true;
-
- var permTimer = setTimeout(function()
- {
- acceptPermResponse = false;
- userCanEdit[id] = 0;
- showDiagram(id, backupId, name, revision, links, retryParams, displayName, contentId, spaceKey, openComments, aspect);
- }, 5000); //Five second timeout
-
- AC.userCanEdit(id, function(canEdit)
- {
- if (acceptPermResponse)
- {
- window.clearTimeout(permTimer);
- userCanEdit[id] = canEdit? 1 : -1;
- showDiagram(id, backupId, name, revision, links, retryParams, displayName, contentId, spaceKey, openComments, aspect);
- }
- }, function()
- {
- if (acceptPermResponse)
- {
- window.clearTimeout(permTimer);
- userCanEdit[id] = 0;
- showDiagram(id, backupId, name, revision, links, retryParams, displayName, contentId, spaceKey, openComments, aspect);
- }
- });
-
- return;
- }
- }
-
- displayName = displayName || name;
- retryParams = retryParams || {}; //so we can use it without NPE check
-
- var aspectPageId = null, aspectLayerIds = null;
-
- if (aspect != null)
- {
- //Set pageId and layers
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- aspectPageId = aspectArray[0];
- aspectLayerIds = aspectArray.slice(1);
- }
- }
-
- if (id != null)
- {
- id = id.toString();
- }
-
- if (id != null && id.length > 0 && name != null && name.length > 0)
- {
- // Option currently not available in the UI
- if (simpleViewer)
- {
- document.body.style.backgroundImage = 'none';
- var img = document.createElement('img');
- img.style.cssText = 'max-width:100%;';
- img.setAttribute('src', baseUrl + '/download/attachments/' + id + '/'
- + encodeURIComponent(name) + ".png?api=v2"
- + (revision != null ? "&version=" + revision : ""));
-
- if (zoom != 1)
- {
- img.style.width = Math.round(diagramWidth * zoom) + 'px';
- }
-
- document.body.appendChild(img);
- }
- else
- {
- var timeout = 25000;
- var serverName = getUrlParam('xdm_e');
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- else
- {
- serverName = serverName.substring(index1 + 2);
- }
- }
-
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
-
- if (lightbox)
- {
- AC.showNotification({
- title: mxResources.get('confTimeout'),
- body: mxResources.get('confSrvTakeTooLong', [serverName]),
- type: 'error',
- close: 'manual'
- });
-
- //TODO find how to listen to flag close event, currently just close the dialog immidiately
- //AP.events.on('flag.close', function()
- //{
- AP.dialog.close();
- //});
- }
- else
- {
- showError(mxResources.get('confTimeout') + ': ' +
- mxResources.get('confSrvTakeTooLong', [serverName]));
- }
- }, timeout);
-
- AP.request(
- {
- url: '/download/attachments/' + id + '/' + encodeURIComponent(name) +
- ((revision != null && revision.length > 0) ? '?version=' + revision : ''),
- success: function(xml)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- document.body.style.backgroundImage = 'none';
-
- var openParentPageFunc = function()
- {
- var openURL = function(pageURL)
- {
- try
- {
- top.window.location.href = pageURL;
- }
- catch(e) //In case of a security exception
- {
- window.location = pageURL;
- }
- };
-
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + id,
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- if (userCanEdit[id] != -1)
- {
- openURL(baseUrl + '/spaces/' + encodeURIComponent(spaceKey) + '/pages/edit/' + id);
- }
- else
- {
- //Open in view mode
- openURL(baseUrl + '/spaces/' + encodeURIComponent(spaceKey) + '/pages/' + id);
- }
- },
- error: function (resp)
- {
- //On error, we assume it is a draft page
- openURL(baseUrl + '/spaces/' + encodeURIComponent(spaceKey) + '/pages/create?draftId=' + id);
- //TODO we can confirm page exist with another request + "?status=draft" and show error message if page cannot be found
- }
- });
- };
-
- function monitorPopup(editWin)
- {
- if (editWin != null)
- {
- var checkClosedTimer = setInterval(function()
- {
- if (editWin.closed !== false)
- {
- clearInterval(checkClosedTimer);
- location.reload();
- }
- }, 200);
- }
- };
-
- var editFunc = function()
- {
- if (lightbox)
- {
- AP.dialog.close({noBack: true, openEditorId: contentId});
- }
- else
- {
- //We support editing Google Drive, OneDrive only
- if (linkedMode)
- {
- var editWin = null;
-
- if (service == 'GDrive')
- {
- editWin = window.open('https://' + window.location.hostname + '/#G' + encodeURIComponent(sFileId));
- }
- else if (service == 'OneDrive')
- {
- editWin = window.open('https://' + window.location.hostname + '/#W' + encodeURIComponent(odriveId + '/' + sFileId));
- }
-
- monitorPopup(editWin);
- return;
- }
-
- AP.dialog.create(
- {
- key: 'customContentEditor',
- //sending pageId and revision to verify custom content matches opened diagram
- customData: {contentId: contentId,
- macroData: {
- width: diagramWidth,
- height: diagramHeight,
- diagramName: name,
- diagramDisplayName: displayName,
- pageId: id,
- revision: revision,
- tbstyle: tbStyle,
- links: links,
- simple: simpleViewer,
- lbox: enableLightbox,
- zoom: zoom,
- contentVer: contentVer,
- contentId: contentId,
- custContentId: contentId,
- aspect: aspect
- }
- },
- chrome: false,
- width: "100%",
- height: "100%",
- }).on("close", function(flags)
- {
- //refresh the viewer
- if (flags && flags.newRev && flags.newContentVer && flags.newContentId)
- {
- contentVer = flags.newContentVer;
- contentId = flags.newContentId;
- showDiagram(id, backupId, name, flags.newRev, links, retryParams, displayName, contentId, null, null, flags.newAspect);
- }
- });
- }
- };
-
- var commentsWindow = null;
-
- //Comments are only shown in lightbox mode
- if (lightbox)
- {
- //Adjust some functions such that it can be instanciated without UI
- EditorUi.prototype.createUi = function(){};
- EditorUi.prototype.addTrees = function(){};
- EditorUi.prototype.updateActionStates = function(){};
- var editorUi = new EditorUi();
- AC.loadPlugins(editorUi);
-
- //Plugins doesn't have callbacks, so we use this hack. TODO Improve this
- function waitForUser()
- {
- if (editorUi.getCurrentUser().email == null)
- {
- setTimeout(waitForUser, 100);
- }
- else if (openComments) //Open the comments window here when the user is ready
- {
- openCommentsFunc();
- }
- }
-
- waitForUser();
- }
-
- var openCommentsFunc = function(e)
- {
- if (commentsWindow != null)
- {
- commentsWindow.window.setVisible(commentsWindow.window.isVisible()? false : true);
- }
- else
- {
- var busyIcon = null;
- //Show busy icon
- try
- {
- if (e && e.target)
- {
- busyIcon = document.createElement('img');
- busyIcon.src = '/images/spin.gif';
- e.target.parentNode.appendChild(busyIcon);
- }
- } catch(e){}
-
- var spaceKey, pageId, pageType, contentVer;
-
- editorUi.saveComments = function(comments, success, error)
- {
- AC.saveCustomContent(spaceKey, pageId, pageType, name, displayName, revision,
- contentId, contentVer,
- function(responseText)
- {
- var content = JSON.parse(responseText);
-
- contentId = content.id;
- contentVer = content.version.number;
-
- success();
- }, error, comments, true);
- };
-
- function createCommentsWindow()
- {
- commentsWindow = new CommentsWindow(editorUi, document.body.offsetWidth - 380, 120, 300, 350);
- commentsWindow.window.setVisible(true);
- //Lightbox Viewer has 999 zIndex
- commentsWindow.window.getElement().style.zIndex = 2000;
-
- if (busyIcon != null)
- {
- busyIcon.parentNode.removeChild(busyIcon);
- busyIcon = null;
- }
- };
-
- //Get current diagram information which is needed for comments
- //TODO Viewer should use AC to load diagrams, then this won't be needed
- AC.getAttachmentInfo(id, name, function(info)
- {
- AC.curDiagVer = info.version.number;
- AC.curDiagId = info.id;
- }, function()
- {
- AC.curDiagId = false;
- });
-
- editorUi.initComments(contentId, function(spaceKey_p, pageId_p, pageType_p, contentVer_p)
- {
- spaceKey = spaceKey_p; pageId = pageId_p; pageType = pageType_p; contentVer = contentVer_p;
- createCommentsWindow();
- }, createCommentsWindow);
- }
- };
-
- if (lightbox)
- {
- var config = {highlight: '#3572b0', nav: true, lightbox: false};
-
- var lbBtns = [];
-
- if (spaceKey != null && spaceKey.length > 0)
- {
- if (userCanEdit[id] != -1)
- {
- lbBtns.push({icon: Editor.editLargeImage, tooltip: mxResources.get('edit'), fn: editFunc});
- }
-
- lbBtns.push({icon: openPageImg, tooltip: mxResources.get('confGotoPage'), fn: openParentPageFunc});
- }
-
- lbBtns.push({icon: Editor.commentImageInverted, tooltip: mxResources.get('comments'), fn: openCommentsFunc});
- EditorUi.prototype.lightboxToolbarActions = lbBtns;
-
- if (links != 'auto')
- {
- config.target = links;
- }
-
- config.pageId = aspectPageId;
- config.layerIds = aspectLayerIds;
-
- var viewer = new GraphViewer(null, null, config);
-
- viewer.lightboxChrome = false;
- viewer.xml = xml;
-
- // Enables layers via flag to avoid toolbar
- viewer.layersEnabled = true;
-
- var ui = viewer.showLocalLightbox();
- // Destroy lightbox with ui instance
- var destroy = ui.destroy;
- ui.destroy = function()
- {
- AP.dialog.close();
- destroy.apply(this, arguments);
- };
-
- // Workaround for ignored header toolbar height for iframe
- ui.editor.graph.container.style.bottom = '51px';
- }
- else
- {
- //In case we want to load another diagram
- var oldContainer = document.getElementById("drawIODiagram");
-
- if (oldContainer != null)
- {
- oldContainer.parentNode.removeChild(oldContainer);
- }
- // LATER: Fix horizontal alignment ignored with 100% width of iframe
- // LATER: Fix page scrolling on touch device if trigger event on diagram
- // LATER: Hide toolbar after second container click for iOS
- // LATER: Disable responsive resize while lightbox shows
- var container = document.createElement('div');
- container.id = "drawIODiagram";
- //There is an issue with AP.resize when custom content is shown. It works only once!
- if (customContent) {
- document.body.style.overflow = "auto";
- }
- container.style.cssText = (customContent? '' : 'position:absolute;') +
- 'max-width:100%;border:1px solid transparent;';
- document.body.appendChild(container);
- var doc = mxUtils.parseXml(xml);
-
- var config = {highlight: '#3572b0', 'toolbar-position': tbStyle,
- nav: true, border: 2, zoom: zoom};
-
- if (pCenter)
- {
- config['auto-fit'] = true;
- config['resize'] = false;
- container.style.width = '100%';
- }
-
- if (tbStyle == 'top')
- {
- config.title = displayName;
- }
-
- if (links != 'auto')
- {
- config.target = links;
- }
-
- if (!enableLightbox)
- {
- config.lightbox = false;
- }
-
- if (tbStyle != 'hidden')
- {
- config.toolbar = 'pages zoom layers';
- config.border = border;
-
- if (enableLightbox)
- {
- config.toolbar += ' lightbox';
- }
- }
- else
- {
- // Workaround for invalid width if no toolbar is present
- var updateContainerWidth = GraphViewer.prototype.updateContainerWidth;
-
- GraphViewer.prototype.updateContainerWidth = function(container, width)
- {
- width += 3;
- updateContainerWidth.apply(this, arguments);
- };
-
- config.resize = true;
- }
-
-
- if ((userCanEdit[id] != -1 //We treat 0 (unknown as allowed since anyway the editor will show an error on save)
- && contentId != null && contentId.length > 0 && tbStyle != 'hidden' && !linkedMode && !isServiceDesk) ||
-
- (service != null && service.length > 0 && service != 'AttFile'))
- {
- config.toolbar = 'edit ' + config.toolbar;
- var editImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAD1BMVEUAAAAAAAAQEBBycnIgICBqwj3hAAAAAXRSTlMAQObYZgAAADlJREFUCNdjoBwoChrAmCyGggJwYWVBBSiTSVDICKFa0AEuLCiEJKyAX5gBSZgBSZgBKGwMBKQ7HAAWzQSfKKAyBgAAAABJRU5ErkJggg==';
-
- config['toolbar-buttons'] =
- {
- 'edit': {title: mxResources.get('edit'), enabled: true,
- image: editImage, handler: editFunc}
- };
- }
- else if (linkedMode && contentId != null && contentId.length > 0)
- {
- config.toolbar = 'gotoPage ' + config.toolbar;
- var gotoPageImg = 'data:image/png;base64,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';
-
- config['toolbar-buttons'] =
- {
- 'gotoPage': {title: mxResources.get('confGotoPage'), enabled: true,
- image: gotoPageImg, handler: function()
- {
- //Check if the parent page has its macro
- AC.findMacroInPage(id, name, false, function(macroFound, originalBody, matchingMacros, page)
- {
- var editWin = null;
- var spaceKey = page._expandable && page._expandable.space? page._expandable.space.substr(page._expandable.space.lastIndexOf('/') + 1) : '';
-
- if (macroFound)
- {
- editWin = window.open(baseUrl + '/spaces/' + encodeURIComponent(spaceKey) + '/pages/edit/' + id);
- }
- else
- {
- editWin = window.open(baseUrl + '/pages/viewpageattachments.action?pageId=' + id + '&activeContentType=ac:com.mxgraph.confluence.plugins.diagramly:drawio-diagram');
- }
-
- monitorPopup(editWin);
- });
- }}
- };
- }
-
- config.pageId = aspectPageId;
- config.layerIds = aspectLayerIds;
-
- var viewer = new GraphViewer(container, doc.documentElement, config);
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- function updateHeight(height)
- {
- AP.resize('100%', Math.ceil(height) + tbHeight + 2);
- };
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight(height);
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight(height);
- };
-
- updateHeight(container.offsetHeight);
-
- var orignShowLightbox = viewer.showLightbox;
-
- viewer.showLightbox = function(openComments)
- {
- //Revert back to opening the lightbox in a new tab since we cannot open Confluence dialogs as there is no custom data
- if (isServiceDesk)
- {
- orignShowLightbox.call(this, false); //Open in new tab without edit option
- return;
- }
-
- //Create an aspect reflecting current view
- var curPageDiagram = viewer.diagrams[viewer.currentPage];
- var curAspect = null;
-
- if (curPageDiagram != null)
- {
- var layerIds = [], pageId = curPageDiagram.getAttribute('id');
-
- var model = viewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- curAspect = pageId + ' ' + layerIds.join(' ');
- }
- else
- {
- EditorUi.logEvent('CONF_VIEWER_CURRENT_PAGE_NOT_FOUND: current page = ' + viewer.currentPage + ', diagrams length = ' + viewer.diagrams.length);
- }
-
- AP.dialog.create(
- {
- header: displayName,
- key: 'lightbox',
- size: 'fullscreen',
- customData: {id: id, name: name, revision: revision, aspect: curAspect, links: links, displayName: displayName, contentId: contentId, custContentId: contentId, openComments: openComments},
- chrome: true
- });
- };
-
- //Handle Anchor links
- var origCustomLinkClicked = viewer.graph.customLinkClicked;
-
- viewer.graph.customLinkClicked = function(href)
- {
- if (href.substring(0, 23) == 'data:confluence/anchor,')
- {
- AC.gotoAnchor(href.substring(23));
- return true;
- }
- else
- {
- return origCustomLinkClicked.apply(this, arguments);
- }
- };
-
- //Check embedded diagrams preview image is in sync in the background
- if (linkedMode && (diagramUrl == null || diagramUrl.length == 0))
- {
- var imgAttVer = null, curAttVer = null;
-
- function checkImgVer()
- {
- if (imgAttVer != null && curAttVer != null && curAttVer != imgAttVer)
- {
- updateImage();
- }
- }
-
- function updateImage()
- {
- //Update the image
- function doSaveImage(imageData)
- {
- if (imageData != null)
- {
- AC.saveDiagram(imgPageId, name + (aspectHash? '-' + aspectHash : '') + '.png', AC.b64toBlob(imageData, 'image/png'),
- ignoreFn, ignoreFn, false, 'image/png', 'draw.io aspect image' + (curAttVer != null? ' - ' + curAttVer : ''), false, false);
- }
- };
-
- function serverFallback()
- {
- var req = new mxXmlRequest(EXPORT_URL, 'format=png&base64=1' +
- (aspectLayerIds != null? '&extras=' + encodeURIComponent(JSON.stringify({layerIds: aspectLayerIds})) : '') +
- (aspectPageId != null? '&pageId=' + aspectPageId : '') + '&xml=' + encodeURIComponent(xml));
-
- req.send(function(req)
- {
- doSaveImage(req.getStatus() >= 200 && req.getStatus() <= 299? req.getText() : null);
- }, ignoreFn);
-
- };
-
- if (viewer.editor.isExportToCanvas())
- {
- viewer.editor.exportToCanvas(function(canvas)
- {
- var data = canvas.toDataURL('image/png');
- doSaveImage(data.substring(data.lastIndexOf(',') + 1));
- }
- , null, null, null, serverFallback);
- }
- else
- {
- serverFallback();
- }
- };
-
- function ignoreFn(){};
-
- function renderAndCache(newXml, timestamp, isPng)
- {
- if (isPng)
- {
- newXml = 'data:image/png;base64,' + Editor.base64Encode (newXml);
- newXml = AC.extractGraphModelFromPng(newXml);
- }
-
- //render diagram
- viewer.setXmlNode(mxUtils.parseXml(newXml).documentElement);
- //Apply aspect (layers) again
- viewer.showLayers(viewer.graph);
- //Update xml (used for server rendering)
- xml = newXml;
- //Save diagram
- AC.saveDiagram(id, name, newXml,
- updateImage, function(resp)
- {
- showError(mxResources.get('confSaveCacheFailed'));
- }, false, 'application/vnd.jgraph.mxfile.cached', 'Embedded draw.io diagram' + (timestamp? ' - ' + timestamp : ''), false, false);
- };
-
- if (csvFileUrl)
- {
- var cachedCsv, curCsv;
-
- function checkCsvChange()
- {
- if (cachedCsv != null && curCsv != null && cachedCsv != curCsv)
- {
- AC.importCsv(curCsv, function(csvModel, xml)
- {
- AC.saveDiagram(id, name + '.csv', curCsv,
- function()
- {
- renderAndCache(xml);
- }, function()
- {
- console.log('Cachinng csv file failed durinng saving');
- }, false, 'text/csv', 'Embedded draw.io diagram (CSV)', false, false);
- },
- function()
- {
- console.log('Fetched csv file has invalid format');
- });
- }
- };
-
- //Fetch csv file and re-generate if changed (Ignore errors and log them only)
- AP.request(
- {
- url: '/download/attachments/' + id + '/' + encodeURIComponent(name + '.csv'),
- success: function(csv)
- {
- cachedCsv = csv;
- checkCsvChange();
- },
- error: function()
- {
- cachedCsv = ""; //Force re-generation
- checkCsvChange();
- }
- });
-
- mxUtils.get(csvFileUrl, function(req)
- {
- if (req.getStatus() >= 200 && req.getStatus() <= 299)
- {
- curCsv = req.getText();
- checkCsvChange();
- }
- else
- {
- console.log('Failed to fetch csv file from ' + csvFileUrl + ' Error: ' + req.getStatus());
- }
- }, function()
- {
- console.log('Failed to fetch csv file from ' + csvFileUrl);
- }, false, 25000, function()
- {
- console.log('Failed to fetch csv file (timeout) from ' + csvFileUrl);
- });
- }
- else if (service != null)
- {
- if (service == 'GDrive')
- {
- GAC.getFileInfo(sFileId, function(fileInfo)
- {
- var isPng = fileInfo.mimeType == 'image/png';
- var timestamp = new Date(fileInfo.modifiedDate).getTime();
- viewer.updateTitle(fileInfo.title);
-
- AC.getAttachmentInfo(id, name, function(info)
- {
- var cachedTS = null;
-
- try
- {
- cachedTS = parseInt(info.metadata.comment.split(' - ').pop());
- }
- catch(e) {} //ignore
-
- //If cache is old or invalid, fetch the current version
- if (timestamp != cachedTS)
- {
- GAC.doAuthRequestPlain(fileInfo['downloadUrl'], 'GET', null, function(req)
- {
- renderAndCache(req.responseText, timestamp, isPng);
- }, function()
- {
- showError(mxResources.get('confReadFileErr', [name, 'Google Drive']));
- }, null, isPng);
- }
- }, function()
- {
- showError(mxResources.get('confCheckCacheFailed'));
- });
- }, function()
- {
- showError(mxResources.get('confGetInfoFailed', ['Google Drive']));
- });
- }
- else if (service == 'OneDrive')
- {
- AC.getFileInfo(sFileId, odriveId, function(fileInfo)
- {
- var isPng = fileInfo.file.mimeType == 'image/png';
- var timestamp = new Date(fileInfo.lastModifiedDateTime).getTime();
- viewer.updateTitle(fileInfo.name);
-
- AC.getAttachmentInfo(id, name, function(info)
- {
- var cachedTS = null;
-
- try
- {
- cachedTS = parseInt(info.metadata.comment.split(' - ').pop());
- }
- catch(e) {} //ignore
-
- //If cache is old or invalid, fetch the current version
- if (timestamp != cachedTS)
- {
- var req = new XMLHttpRequest();
- req.open('GET', fileInfo['@microsoft.graph.downloadUrl']);
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- renderAndCache(req.responseText, timestamp, isPng);
- }
- else
- {
- showError(mxResources.get('confReadFileErr', [name, 'OneDrive']));
- }
- }
- };
-
- if (isPng && req.overrideMimeType)
- {
- req.overrideMimeType('text/plain; charset=x-user-defined');
- }
-
- req.send();
- }
- }, function()
- {
- showError(mxResources.get('confCheckCacheFailed'));
- });
- }, function()
- {
- showError(mxResources.get('confGetInfoFailed', ['OneDrive']));
- });
- }
- }
- else
- {
- //The case of referring to a diagram in another page
-
- //Get image version from attachment comment
- AC.getAttachmentInfo(imgPageId, name + '-' + aspectHash + '.png', function(info)
- {
- try
- {
- imgAttVer = parseInt(info.metadata.comment.split(' - ').pop());
- }
- catch(e) {} //ignore
-
- imgAttVer = imgAttVer || attVer;
- checkImgVer();
- }, ignoreFn);
-
- //Get version
- AC.getAttachmentInfo(id, name, function(info)
- {
- curAttVer = info.version.number;
- checkImgVer();
- }, ignoreFn);
- }
- }
-
- //If there are comments, show the comments icon
- function addCommentsIcon()
- {
- var commentsIcon = document.createElement('img');
- commentsIcon.style.cssText = 'position:absolute;bottom: 5px; right: 5px;opacity: 0.25; cursor: pointer';
- commentsIcon.setAttribute('title', mxResources.get('showComments'));
- commentsIcon.src = Editor.commentImage;
- commentsIcon.addEventListener('click', function()
- {
- viewer.showLightbox(true);
- });
- container.appendChild(commentsIcon);
- };
-
- AC.hasUnresolvedComments(id, contentId, name, function(hasUnresolvedComments)
- {
- if (hasUnresolvedComments)
- {
- addCommentsIcon();
- }
- }, function(){}); //Nothing to do in case of an error
- }
- }
- },
- error: function (err)
- {
- window.clearTimeout(timeoutThread);
-
- if (err.status == 404)
- {
- if (/(^\s|\s$)/.test(name))
- {
- showDiagram(id, backupId, name.trim(), revision, links, retryParams, displayName, contentId, spaceKey, openComments, aspect)
- }
- //Copied pages are reset to revision 1, in addition, copy&paste pages saves diagrams imported from another page
- //So, try revision 1 first
- else if (revision > 1)
- {
- showDiagram(id, backupId, name, null, links, {revision: revision}, displayName, contentId, null, null, aspect);
- }
- else if (backupId != null)
- {
- //Since attachment wasn't found in this page, it is better to save it to this page
- showDiagram(backupId, null, name, revision || retryParams.revision, links, {saveIt: true, pageId: id}, displayName, contentId, null, null, aspect);
- }
- else //All alternatives failed, so this diagram is not found
- {
- document.body.style.backgroundImage = 'none';
- showError(mxResources.get('diagNotFound'));
- }
- }
- else if (err.status == 0)
- {
- document.body.style.backgroundImage = 'none';
-
- if (linkedMode) //When the embedded diagram refers to a page that current user has no permissions to view, and error status 0 is returned
- {
- showError(mxResources.get('confNoPermErr', [id]));
- }
- else // This can happen when a macro has a pageId (backupId) that the current user doesn't have access to it AND the diagram itself is deleted from this page (e.g, macro is copy/paste)
- // , so show a more meaningful error with a dot to differentiate
- {
- showError(mxResources.get('diagNotFound') + '.');
- }
- }
- else if (acceptResponse)
- {
- document.body.style.backgroundImage = 'none';
- showError(mxResources.get('confError', ['HTTP ' + err.status]));
- }
- }
- });
- }
- }
- else
- {
- showError(mxResources.get('confError', ['Invalid descriptor']));
- }
- };
-
- if (customContent)
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + contentId + '/?expand=body.storage',
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- var info = JSON.parse(decodeURIComponent(resp.body.storage.value));
- var spaceKey = resp._expandable && resp._expandable.space? resp._expandable.space.substr(resp._expandable.space.lastIndexOf('/') + 1) : "";
-
- AP.dialog.create(
- {
- header: resp.title,
- key: 'lightbox',
- size: 'fullscreen',
- //custom content can load old versions which will be overridden by version check
- customData: {id: info.pageId, name: info.diagramName, revision: info.version, aspect: info.aspect, links: links,
- displayName: resp.title, spaceKey: spaceKey, retryParams: {dontCheckVer: true}, contentId: contentId, custContentId: contentId, inComment: info.inComment},
- chrome: true
- }).on("close", function(flags)
- {
- if (flags && flags.noBack)
- {
- if (flags.openEditorId)
- {
- //setTimeout is needed such that the current dialog closes completely
- //without it, the on close event is not called!
- setTimeout(function()
- {
- AP.dialog.create(
- {
- key: 'customContentEditor',
- customData: {contentId: flags.openEditorId, custContentId: flags.openEditorId},
- chrome: false,
- width: "100%",
- height: "100%",
- }).on("close", function(flags)
- {
- if (flags && flags.noBack)
- {
- if (!flags.noBackOnClose)
- {
- //Go back after user (closes/clicks the link in) the flag
- AP.events.on('flag.close', function(){
- AP.history.go(-1);
- });
- AP.events.on('flag.action', function(){
- AP.history.go(-1);
- });
- }
- }
- else
- {
- AP.history.go(-1);
- }
- });
- }, 10);
- }
- }
- else
- {
- AP.history.go(-1);
- }
- });
- },
- error: function (resp)
- {
- AC.showNotification({
- title: mxResources.get('error'),
- body: mxResources.get('diagNotFound'),
- type: 'error'
- });
-
- //give the user some time to read the error!
- setTimeout(function()
- {
- AP.history.go(-1);
- }, 500);
- }
- });
- }
- else if (lightbox)
- {
- // Gets the paramters from the customData object in lightbox mode
- // LATER: Add XML to custom data (does not seem to work)
- AP.dialog.getCustomData(function (customData) {
- inComment = customData.inComment;
- showDiagram(customData.id, customData.id, customData.name, customData.revision,
- customData.links, customData.retryParams, customData.displayName, customData.contentId || customData.custContentId,
- customData.spaceKey, customData.openComments, customData.aspect);
- });
- }
- else
- {
- //TODO We cache diagramUrl file now, so handle its change detection and caching if the file doesn't exists
- if (diagramUrl)
- {
- showExtDiagram(diagramName, diagramUrl);
- }
- else
- {
- showDiagram(candidateId, (owningPageId != null && owningPageId.length > 0) ? owningPageId : ceoId, diagramName, revision, links, null, displayName, contentId, null, null, aspect);
- }
- }
- };
- };
- };
-
- // Prefetches asynchronous requests so that below code runs synchronous
- // Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
- // is compiled into JS in the build process and is only needed for local development.
- var bundleLoaded = false;
- var scriptLoaded = false;
- var fontsLoaded = false;
- var validSize = document.documentElement.offsetWidth > 0;
-
- function mainBarrier()
- {
- if (validSize && bundleLoaded && scriptLoaded && fontsLoaded)
- {
- main();
- }
- };
-
- // Disables delayed rendering since the container is created on the fly
- GraphViewer.prototype.checkVisibleState = false;
-
- // Workaround for collapsed panel is to delay main until size is not 0
- if (!validSize)
- {
- var listener = function()
- {
- if (document.documentElement.offsetWidth > 0)
- {
- window.removeEventListener('resize', listener);
- validSize = true;
- mainBarrier();
- }
- };
-
- window.addEventListener('resize', listener);
- }
-
- script.onload = function()
- {
- AP.user.getLocale(function(lang)
- {
- // Overrides browser language with Confluence user language
- if (lang != null)
- {
- var dash = lang.indexOf('_');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
- }
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
- });
- });
-
- // Workaround for Google Chrome triggering
- // no resize event if height is set to 0
- if (mxClient.IS_GC && !validSize)
- {
- AP.resize('100%', 1);
- }
-
- // Checks configuration and loads fontCss
- // While this is executed in parallel it still adds unnecessary
- // calls since it is only needed if global fontCss is used
- AP.request({
- type: 'GET',
- url: '/rest/api/content/search?cql=type%3Dpage%20and%20space%3DDRAWIOCONFIG%20and%20title%3DConfiguration', //type=page and space=DRAWIOCONFIG and title=Configuration. Search doesn't return 404 if not found
- contentType: 'application/json;charset=UTF-8',
- success: function (resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.size == 1)
- {
- var configPageId = resp.results[0].id;
-
- // Loads the configuration file
- AP.request({
- type: 'GET',
- url: '/download/attachments/' + configPageId + '/configuration.json',
- contentType: 'application/json;charset=UTF-8',
- success: function (fileContent)
- {
- try
- {
- var config = JSON.parse(fileContent);
- Editor.configureFontCss(config.fontCss);
- fontsLoaded = true;
- mainBarrier();
- }
- catch (e)
- {
- console.log('Configuration error', e);
- fontsLoaded = true;
- mainBarrier();
- }
- },
- error: function()
- {
- fontsLoaded = true;
- mainBarrier();
- }
- });
- }
- else
- {
- fontsLoaded = true;
- mainBarrier();
- }
- }, error: function()
- {
- fontsLoaded = true;
- mainBarrier();
- }});
-
- scriptLoaded = true;
- mainBarrier();
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
- document.getElementsByTagName('head')[0].appendChild(script);
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/confluence/viewer2.html b/src/main/webapp/connect/confluence/viewer2.html
deleted file mode 100644
index 0abc577f..00000000
--- a/src/main/webapp/connect/confluence/viewer2.html
+++ /dev/null
@@ -1,214 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Draw.io Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-gray.svg);
- background-repeat:no-repeat;
- background-position:center top;
- background-size: 64px;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-</head>
-<body>
-<script type="text/javascript">
-// Parses URL parameters
-function getUrlParam(param)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript">
-(function()
-{
- // Enables dynamic loading of shapes and stencils (same domain)
- mxStencilRegistry.dynamicLoading = true;
-
- // Loads the Atlassian API
- var script = document.createElement('script');
- var baseUrl = getBaseUrl();
-
- // Loads the attachment and renders the diagram
- var diagramWidth = parseFloat(getUrlParam('width'));
- var diagramHeight = parseFloat(getUrlParam('height'));
- var diagramName = getUrlParam('diagramName');
-
- //ceoId and owningPageId are IDs of the page that potentially hold the attachment
- //they will differ when page history is shown, ceoId will be historical version ID,
- //owningPageId will be the ID of the current version that holds the attachment
- //ceoId is used as fallback in case owningPageId is not set(should be very rare)
- var ceoId = getUrlParam('ceoId');
- var owningPageId = getUrlParam('owningPageId');
- var revision = null;
- var tbStyle = getUrlParam('tbstyle') || 'top';
- var links = getUrlParam('links') || 'auto';
- var tbHeight = tbStyle == 'top' ? GraphViewer.prototype.toolbarHeight : 0;
- var zoom = parseFloat(getUrlParam('zoom') || 1);
- var border = 0;
-
- document.body.style.backgroundImage = 'url(/images/aui-wait.gif)';
- document.body.style.backgroundPosition = 'left top';
- document.body.style.backgroundSize = 'auto auto';
-
- function main()
- {
- // Sets initial placeholder size to allow for scrollbars in fit to page width
- AP.resize('100%', (diagramHeight * zoom + tbHeight + 2 * border));
-
- function showError(msg)
- {
- document.body.style.backgroundImage = 'none';
- document.body.style.padding = '4px';
- mxUtils.write(document.body, msg);
- AP.resize('100%', 24);
- };
-
- AP.require(['request', 'dialog', 'messages', 'navigator'], function(request, dialog, messages, navigator)
- {
- // Uses pageId from current page as page in macro may be outdated after export
- navigator.getLocation(function (data)
- {
- var candidateId = (owningPageId != null && owningPageId.length > 0) ? owningPageId : ceoId;
-
- if (data != null && data.target != null && data.context != null)
- {
- candidateId = data.context.contentId;
- }
-
- // Loads the given XML into the viewer
- function showDiagram(id, backupId, name, revision, page, links, retryParams)
- {
- id = id.toString();
-
- retryParams = retryParams || {}; //so we can use it without NPE check
-
- if (id != null && id.length > 0 && name != null && name.length > 0)
- {
- document.body.style.backgroundImage = 'none';
- var img = document.createElement('img');
- img.style.cssText = 'max-width:100%;';
- img.setAttribute('src', baseUrl + '/download/attachments/' + id + '/'
- + encodeURIComponent(name) + ".png?api=v2"
- + (revision != null ? "&version=" + revision : ""));
-
- if (zoom != 1)
- {
- img.style.width = Math.round(diagramWidth * zoom) + 'px';
- }
-
- document.body.appendChild(img);
- }
- else
- {
- showError('Error: Invalid descriptor');
- }
- };
-
- var myPageId = (owningPageId != null && owningPageId.length > 0) ? owningPageId : ceoId;
- showDiagram(candidateId, (owningPageId != null && owningPageId.length > 0) ? owningPageId : ceoId, diagramName, revision, null, links);
- });
- });
- };
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
- // Prefetches asynchronous requests so that below code runs synchronous
- // Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
- // is compiled into JS in the build process and is only needed for local development.
- var bundleLoaded = false;
- var scriptLoaded = false;
- var validSize = document.documentElement.offsetWidth > 0;
-
- function mainBarrier()
- {
- if (validSize && bundleLoaded && scriptLoaded)
- {
- main();
- }
- };
-
- // Disables delayed rendering since the container is created on the fly
- GraphViewer.prototype.checkVisibleState = false;
-
- // Workaround for collapsed panel is to delay main until size is not 0
- if (!validSize)
- {
- var listener = function()
- {
- if (document.documentElement.offsetWidth > 0)
- {
- window.removeEventListener('resize', listener);
- validSize = true;
- mainBarrier();
- }
- };
-
- window.addEventListener('resize', listener);
- }
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
- });
-
- script.onload = function()
- {
- // Workaround for Google Chrome triggering
- // no resize event if height is set to 0
- if (mxClient.IS_GC && !validSize)
- {
- AP.resize('100%', 1);
- }
-
- scriptLoaded = true;
- mainBarrier();
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'sizeToParent:true;');
- document.getElementsByTagName('head')[0].appendChild(script);
-})();
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/gdrive_common/editor.js b/src/main/webapp/connect/gdrive_common/editor.js
deleted file mode 100644
index 564a67dd..00000000
--- a/src/main/webapp/connect/gdrive_common/editor.js
+++ /dev/null
@@ -1,547 +0,0 @@
-function GDriveEditor(onSubmit, getFileInfoFn, idSuffix, notStandalone, drawioOnly, genImage)
-{
- idSuffix = idSuffix || '';
- var noThumbImg = '/images/google-drive-logo.svg';
-
- var opts =
- {
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
- window.spinner = spinner; //TODO Remove this, it is used in the GAC
- this.spinner = spinner;
- spinner.spin(GAC.$('#spinner-container' + idSuffix));
-
- var head = document.getElementsByTagName('head')[0];
-
- // Handles timeouts
- var acceptResponse = true;
-
- var timeoutHandler = function()
- {
- acceptResponse = false;
- spinner.stop();
- alert('The connection has timed out');
- };
-
- var timeoutThread = window.setTimeout(timeoutHandler, 25000);
-
- var selectedFile = null, selFileContent = null;
- var curViewer = null;
- var status = document.getElementById('status');
-
- function debug(msg)
- {
- if (status != null)
- {
- mxUtils.write(status, msg);
- mxUtils.br(status);
- }
- };
-
- function showError(elem, errMsg)
- {
- elem.innerHTML = '<img src="data:image/gif;base64,R0lGODlhEAAQAPcAAADGAIQAAISEhP8AAP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAAALAAAAAAQABAAAAhoAAEIFBigYMGBCAkGGMCQ4cGECxtKHBAAYUQCEzFSHLiQgMeGHjEGEAAg4oCQJz86LCkxpEqHAkwyRClxpEyXGmGaREmTIsmOL1GO/DkzI0yOE2sKIMlRJsWhCQHENDiUaVSpS5cmDAgAOw==" border="0" align="absmiddle"/> ' +
- GAC.htmlEntities(errMsg);
- };
-
- function setPreview(file)
- {
- if (typeof AP != 'undefined')
- {
- AP.dialog.getButton('submit').enable();
- var altSubmitBtn = AP.dialog.getButton('altSubmitBtn');
-
- if (altSubmitBtn) altSubmitBtn.enable();
- }
-
- var thumbImg = GAC.$('#thumbImg' + idSuffix);
-
- thumbImg.onerror = function()
- {
- this.onerror = null;
- this.src = noThumbImg;
- };
-
- thumbImg.src = file.thumbnailLink;
-
- var prevDiv = GAC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- var iframe = document.createElement('iframe');
- iframe.src = file.embedLink;
- iframe.setAttribute('frameborder', '0');
- iframe.width = '100%';
- iframe.height = '100%';
- prevDiv.appendChild(iframe);
-
- var autoSizeCheck = GAC.$('#autoSize' + idSuffix);
- autoSizeCheck.checked = false;
- autoSizeCheck.setAttribute('disabled', 'disabled');
- autoSizeChanged(false);
- curViewer = null;
- };
-
- function prevDrawioFile(doc, prevDiv, file, aspect)
- {
- spinner.stop();
-
- var thumbImg = GAC.$('#thumbImg' + idSuffix);
-
- thumbImg.onerror = function()
- {
- this.onerror = null;
- this.src = noThumbImg;
- };
-
- thumbImg.src = file.thumbnailLink;
-
- var container = document.createElement('div');
- // NOTE: Height must be specified with default value "auto" to force automatic fit in viewer
- container.style.cssText = 'position:absolute;width:auto;left:0px;right:0px;height:auto;bottom:0px;top:0px;border:1px solid transparent;';
- prevDiv.appendChild(container);
-
- var pageId, layerIds;
-
- if (aspect != null)
- {
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- Graph.prototype.shadowId = 'googleDriveDropShadow';
- var viewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', border: 8, 'auto-fit': true,
- resize: false, nav: true, lightbox: false, title: file.title,
- 'toolbar-nohide': true, 'toolbar-position': 'top', toolbar: 'pages layers',
- pageId: pageId, layerIds: layerIds});
-
- viewer.graph.addListener('size', function()
- {
- var root = this.view.getDrawPane().ownerSVGElement;
-
- if (root != null)
- {
- root.style.minHeight = '';
- }
- });
-
- curViewer = viewer;
-
- if (typeof AP != 'undefined')
- {
- AP.dialog.getButton('submit').enable();
- var altSubmitBtn = AP.dialog.getButton('altSubmitBtn');
-
- if (altSubmitBtn) altSubmitBtn.enable();
- }
- };
-
- // Waits for both APIs to load in parallel
- function main()
- {
- if ((notStandalone || typeof window.AP !== 'undefined') && typeof window.google != 'undefined')
- {
- try
- {
- window.clearTimeout(timeoutThread);
-
- //Google Drive Auth before proceeding
- GAC.confirmGDAuth(mainAuth, function()
- {
- alert('Error authenticating to Google Drive!'); //TODO better error handling
- });
-
- if (status != null)
- {
- status.style.display = 'none';
- }
- }
- catch (e)
- {
- debug('Error in main: ' + e.message);
- }
- }
- };
-
- function genericOnSubmit()
- {
- var hasError = false;
- //this cannot happen as the submit button is disabled until a file is selected
- if (selectedFile == null)
- {
- GAC.$('#filenameError' + idSuffix).innerHTML = "Please select a file";
- hasError = true;
- }
-
- var width = parseInt(GAC.$('#width' + idSuffix).value);
- var height = parseInt(GAC.$('#height' + idSuffix).value);
- var autoSize = GAC.$('#autoSize' + idSuffix).checked;
-
- if (!autoSize && (isNaN(width) || width <= 0))
- {
- GAC.$('#widthError' + idSuffix).innerHTML = "Width must be greater than zero";
- hasError = true;
- }
-
- if (!autoSize && (isNaN(height) || height <= 0))
- {
- GAC.$('#heightError' + idSuffix).innerHTML = "Height must be greater than zero";
- hasError = true;
- }
-
- if (hasError)
- {
- return;
- }
-
- if (curViewer != null)
- {
- var layerIds = [];
-
- var model = curViewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- selectedFile.aspect = curViewer.diagrams[curViewer.currentPage].getAttribute('id') + ' ' + layerIds.join(' ');
-
- if (autoSize)
- {
- var bounds = curViewer.graph.view.graphBounds;
- width = Math.round(bounds.width) || null;
- height = Math.round(bounds.height) || null;
- }
- }
-
- spinner.spin(GAC.$('#preview' + idSuffix));
-
- var image = null;
-
- function finalize()
- {
- onSubmit(selectedFile, width, height, autoSize, selFileContent, image);
- };
-
- if (genImage && curViewer.editor.isExportToCanvas())
- {
- curViewer.editor.exportToCanvas(function(canvas)
- {
- var data = canvas.toDataURL('image/png');
- image = data.substring(data.lastIndexOf(',') + 1);
- finalize();
- }
- , null, null, null, finalize);
- }
- else
- {
- finalize()
- }
- }
-
- this.doSubmit = genericOnSubmit;
-
- function mainAuth()
- {
- if (acceptResponse)
- {
- spinner.stop();
-
- var chooseLink = document.getElementById('chooseLink');
-
- if (chooseLink != null)
- {
- chooseLink.style.display = '';
- }
-
- GAC.$('#filePicker' + idSuffix).removeAttribute('disabled');
-
- GAC.$('#filePicker' + idSuffix).addEventListener('click', function(evt)
- {
- evt.preventDefault();
-
- GAC.pickFile(function(file)
- {
- function handleNonDrawFile() //If the file is not a draw.io diagram
- {
- if (drawioOnly)
- {
- selectedFile = null;
- spinner.stop();
- AC.$('#filenameError' + idSuffix).innerHTML = 'Not a draw.io diagram file';
- }
- else
- {
- setPreview(file);
- }
-
- drawioCheck.checked = false;
- };
-
- function setAutosize()
- {
- drawioCheck.checked = true;
- drawioCheck.setAttribute('disabled', 'disabled');
- var autoSizeCheck = GAC.$('#autoSize' + idSuffix);
- autoSizeCheck.checked = true;
- autoSizeCheck.removeAttribute('disabled');
- autoSizeChanged(true);
- };
-
- selectedFile = file;
- GAC.$('#filenameError' + idSuffix).innerHTML = "";
- GAC.$('#filename' + idSuffix).value = file.title;
- var mimeType = file.mimeType;
- var drawioCheck = GAC.$('#useDrawio' + idSuffix);
- drawioCheck.removeAttribute('disabled');
- var useDrawio = drawioOnly? false : drawioCheck.checked;
- var prevDiv = GAC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- if (!drawioOnly && typeof convertVSDXtoMX != 'undefined' && /\.v(dx|sdx?)$/i.test(file.title)) //In Google Drive, all vsdx files are previewed with draw.io
- {
- GAC.getBinaryFile(file, function(blobFile)
- {
- convertVSDXtoMX(blobFile, file.title, function(xml)
- {
- selectedFile.isDrawio = true;
- selFileContent = xml;
- prevDrawioFile(mxUtils.parseXml(xml), prevDiv, file);
- setAutosize();
- }, handleNonDrawFile);
- }, handleNonDrawFile);
- }
- //Handle draw.io potential files (html & xml)
- else if (useDrawio || mimeType == 'text/html' || mimeType == 'text/xml' || mimeType == 'application/xml'
- || mimeType == 'image/png' || mimeType == 'application/vnd.jgraph.mxfile'
- || /\.svg$/i.test(file.title) || /\.html$/i.test(file.title) || /\.xml$/i.test(file.title)
- || /\.png$/i.test(file.title) || /\.drawio$/i.test(file.title))
- {
- GAC.checkDrawioFile(file, function(doc, cnt)
- {
- selFileContent = cnt;
- prevDrawioFile(doc, prevDiv, file);
- setAutosize();
- }, handleNonDrawFile);
- }
- else
- {
- handleNonDrawFile();
- }
- }, true); //Allow folder selection. If it's not needed in Jira use !notStandalone
- });
-
- function removeErrMsg()
- {
- GAC.$('#' + this.id + 'Error' + idSuffix).innerHTML = "";
- };
-
- GAC.$('#width' + idSuffix).addEventListener('change', removeErrMsg);
- GAC.$('#height' + idSuffix).addEventListener('change', removeErrMsg);
-
- if (getFileInfoFn)
- {
- getFileInfoFn(function(fileInfo)
- {
- var altSubmitBtn = AP.dialog.createButton({
- text: fileInfo? 'Save' : 'Insert',
- identifier: 'altSubmitBtn'
- });
- altSubmitBtn.bind(genericOnSubmit);
- altSubmitBtn.disable();
-
- if (fileInfo && fileInfo.fileId)
- {
- var autoSize = fileInfo.autoSize == '1';
- GAC.$('#width' + idSuffix).value = fileInfo.width;
- GAC.$('#height' + idSuffix).value = fileInfo.height;
- GAC.$('#filename' + idSuffix).value = fileInfo.filename;
- fileInfo.isDrawio = fileInfo.isDrawio == '1';
- GAC.$('#useDrawio' + idSuffix).checked = fileInfo.isDrawio;
- GAC.$('#autoSize' + idSuffix).checked = autoSize;
- autoSizeChanged(autoSize);
-
- var prevDiv = GAC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- GAC.getFileInfo(fileInfo.fileId, function(file)
- {
- function filePrevErr(err)
- {
- showError(prevDiv, 'Cannot load file preview.');
- };
-
- selectedFile = file;
-
- if (typeof convertVSDXtoMX != 'undefined' && /\.v(dx|sdx?)$/i.test(fileInfo.filename)) //In Google Drive, all vsdx files are previewed with draw.io
- {
- GAC.getBinaryFile(file, function(blobFile)
- {
- convertVSDXtoMX(blobFile, fileInfo.filename, function(xml)
- {
- selFileContent = xml;
- prevDrawioFile(mxUtils.parseXml(xml), prevDiv, file, fileInfo.aspect);
- }, filePrevErr);
- }, filePrevErr);
- }
- else if (fileInfo.isDrawio)
- {
- GAC.getDrawioFileDoc(file, function(doc, cnt)
- {
- selFileContent = cnt;
- prevDrawioFile(doc, prevDiv, file, fileInfo.aspect);
- }, filePrevErr);
- }
- else
- {
- setPreview(file);
- }
- },
- function(err)
- {
- if (err && (err.status == 403 || err.status == 400)) //400 is returned when a business account file is accessed via a personal account
- {
- showError(prevDiv, 'Error: Access Denied. You do not have permission to access this file "'+ fileInfo.filename +'".');
- }
- else
- {
- showError(prevDiv, 'Cannot load file preview.');
- }
- });
- }
- });
- }
- }
- };
-
- this.loadDrawioFile = function(fileInfo)
- {
- GAC.$('#filename' + idSuffix).value = fileInfo.diagramDisplayName;
- GAC.$('#autoSize' + idSuffix).checked = true;
- var prevDiv = GAC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- GAC.getFileInfo(fileInfo.sFileId, function(file)
- {
- selectedFile = file;
- GAC.$('#filename' + idSuffix).value = file.title;
-
- GAC.getDrawioFileDoc(file, function(doc, cnt)
- {
- selFileContent = cnt;
- prevDrawioFile(doc, prevDiv, file, fileInfo.aspect);
- }, function()
- {
- showError(prevDiv, 'Cannot read "' + file.title + '" file from Google Drive.');
- });
- }, function()
- {
- showError(prevDiv, 'Fetching file info from Google Drive failed.');
- });
- };
-
- function autoSizeChanged(isChecked)
- {
- if(isChecked)
- {
- GAC.$('#width' + idSuffix).setAttribute('disabled', 'disabled');
- GAC.$('#height' + idSuffix).setAttribute('disabled', 'disabled');
- }
- else
- {
- GAC.$('#width' + idSuffix).removeAttribute('disabled');
- GAC.$('#height' + idSuffix).removeAttribute('disabled');
- }
- };
-
- GAC.$('#autoSize' + idSuffix).addEventListener('change', function(evt)
- {
- autoSizeChanged(this.checked);
- });
-
- var signOut = GAC.$('#signout' + idSuffix);
-
- if (signOut)
- {
- signOut.addEventListener('click', function(evt)
- {
- evt.preventDefault();
- GAC.setPersistentAuth(null);
- main(); //To show auth button again
- });
- }
-
- function loadAtlassianApi()
- {
- var script = document.createElement("script");
-
- script.onload = function()
- {
- AP.dialog.disableCloseOnSubmit();
-
- //TODO when conf bug of submit is fixed, re-enable this and remove the button above
- if (getFileInfoFn)
- {
- AP.dialog.getButton('submit').hide();
- }
-
- AP.events.on('dialog.submit', genericOnSubmit);
- AP.dialog.getButton('submit').disable();
- debug('Atlassian API loaded...');
- main();
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
- head.appendChild(script);
- };
-
- function loadGoogleApi()
- {
- window.onGApiLoad = function()
- {
- debug('Google API loaded...');
- gapi.load('picker', main);
- };
- var script = document.createElement("script");
- script.src = "https://apis.google.com/js/api.js?onload=onGApiLoad";
- head.appendChild(script);
- };
-
- // Loads APIs in parallel and waits in main
- if (!notStandalone)
- {
- loadAtlassianApi();
- }
-
- loadGoogleApi();
-};
-
diff --git a/src/main/webapp/connect/gdrive_common/gac.js b/src/main/webapp/connect/gdrive_common/gac.js
deleted file mode 100644
index 175b9290..00000000
--- a/src/main/webapp/connect/gdrive_common/gac.js
+++ /dev/null
@@ -1,564 +0,0 @@
-//TODO Some functions are the same as OneDrive AC except for minor changes [sometimes only the URLs and constants are different]
-// (note also that google doesn't return the refresh token with every request + in office add-in we save the local storage differently)
-var GAC = {};
-
-GAC.host = window.location.host;
-GAC.clientId = '850530949725.apps.googleusercontent.com';
-GAC.redirectUri = window.location.protocol + '//' + GAC.host + '/google';
-GAC.scopes = ['https://www.googleapis.com/auth/drive.readonly',
- 'https://www.googleapis.com/auth/userinfo.profile'];
-GAC.isLocalStorage = typeof(Storage) != 'undefined';
-GAC.authLSKeyName = 'oDrawGDrive'; //Should be the same name as in draw.io
-GAC.GDriveBaseUrl = 'https://www.googleapis.com/drive/v2';
-GAC.reqQueue = [];
-GAC.authOnProgress = false;
-
-if (typeof CAC === 'undefined')
-{
- throw 'CAC object not found, please include file new_common/cac.js';
-}
-else
-{
- CAC.applyCAC(GAC);
-}
-
-GAC.authGDrive = function(success, error, direct)
-{
- GAC.reqQueue.push({success: success, error: error});
-
- if (GAC.authOnProgress)
- {
- return;
- }
-
- GAC.authOnProgress = true;
-
- if (window.onGoogleDriveCallback == null)
- {
- var authStep2 = function(state)
- {
- var acceptAuthResponse = true;
-
- var url = 'https://accounts.google.com/o/oauth2/v2/auth?client_id=' + GAC.clientId +
- '&redirect_uri=' + encodeURIComponent(GAC.redirectUri) +
- '&response_type=code&access_type=offline&prompt=consent%20select_account&include_granted_scopes=true' +
- '&scope=' + encodeURIComponent(GAC.scopes.join(' ')) +
- '&state=' + encodeURIComponent('cId=' + GAC.clientId + '&domain=' + GAC.host + '&ver=2&token=' + state); //To identify which app/domain is used
-
- var width = 525,
- height = 525,
- screenX = window.screenX,
- screenY = window.screenY,
- outerWidth = window.outerWidth,
- outerHeight = window.outerHeight;
-
- var left = screenX + Math.max(outerWidth - width, 0) / 2;
- var top = screenY + Math.max(outerHeight - height, 0) / 2;
-
- var features = ['width=' + width, 'height=' + height,
- 'top=' + top, 'left=' + left,
- 'status=no', 'resizable=yes',
- 'toolbar=no', 'menubar=no',
- 'scrollbars=yes'];
- var popup = window.open(url, 'gdauth', features.join(','));
-
- if (popup != null)
- {
- window.onGoogleDriveCallback = function(authInfo)
- {
- try
- {
- if (acceptAuthResponse)
- {
- window.onGoogleDriveCallback = null;
- acceptAuthResponse = false;
-
- try
- {
- if (authInfo == null)
- {
- error({message: 'Access Denied', retry: auth});
- }
- else
- {
- GAC.token = authInfo.access_token;
- authInfo.expires = Date.now() + parseInt(authInfo.expires_in) * 1000;
- authInfo.remember = true;
- authInfo.token = authInfo.access_token;
- authInfo.refreshToken = authInfo.refresh_token;
- GAC.setPersistentAuth(authInfo);
-
- for (var i = 0; i < GAC.reqQueue.length; i++)
- {
- GAC.reqQueue[i].success();
- }
-
- GAC.reqQueue = [];
- GAC.authOnProgress = false;
- }
- }
- catch (e)
- {
- error(e);
- }
- finally
- {
- popup.close();
- }
- }
- else
- {
- popup.close();
- }
- }
- finally
- {
- authDialog.parentNode.removeChild(authDialog);
- }
- };
-
- popup.focus();
- }
- else
- {
- alert('Error: Google Authentication window blocked');
- }
- };
-
- var auth = function()
- {
- var req = new XMLHttpRequest();
- req.open('GET', GAC.redirectUri + '?getState=1');
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- authStep2(req.responseText);
- }
- else
- {
- error(this);
- }
- }
- };
-
- req.send();
- };
-
- if (direct)
- {
- auth();
- }
- else
- {
- if (window.spinner != null)
- {
- spinner.stop();
- }
-
- var authDialog = document.createElement('div');
- var btn = document.createElement('button');
- btn.innerHTML = 'Authorize draw.io to access Google Drive';
- btn.className = 'aui-button aui-button-primary';
- authDialog.appendChild(btn);
-
- function adjustAuthBtn()
- {
- var w = window.innerWidth, h = window.innerHeight;
- authDialog.style.cssText = 'position: absolute; top: 0px; left: 0px; width: '+ w +'px; height: '+ h +'px; background: #fff;opacity: 0.85;z-index: 9999;';
- btn.style.cssText = 'position: absolute; width: 320px; height: 50px; top: '+ (h/2 - 25) +'px; left: '+ (w/2 - 160) +'px;opacity: 1;';
- }
-
- btn.addEventListener('click', function(evt)
- {
- auth();
- //Remove the event handler since the user already used the button
- window.removeEventListener("resize", adjustAuthBtn);
- });
-
- window.addEventListener('resize', adjustAuthBtn);
- adjustAuthBtn();
- document.body.appendChild(authDialog);
- }
- }
- else
- {
- error({message: 'Busy'});
- }
-};
-
-//JSON request with auth
-GAC.doAuthRequest = function(url, method, params, success, error)
-{
- GAC.doAuthRequestPlain(GAC.GDriveBaseUrl + url, method, params, function(req)
- {
- success(JSON.parse(req.responseText));
- }, error);
-};
-
-//JSON request with auth
-GAC.doAuthRequestPlain = function(url, method, params, success, error, contentType, isBinary, retryCount, isBlob, failIfNotAuth)
-{
- retryCount = retryCount || 0;
-
- if (retryCount > 4)
- {
- //Since we tried multiple times, the token itself maybe corrupted
- GAC.setPersistentAuth(null);
- error();
- return;
- }
-
- if (GAC.token == null)
- {
- var token = GAC.getPersistentToken();
-
- if (token == null)
- {
- if (failIfNotAuth)
- {
- error({authNeeded: true});
- }
- else
- {
- GAC.authGDrive(function()
- {
- //Retry request after authentication
- GAC.doAuthRequestPlain(url, method, params, success, error, contentType, isBinary, ++retryCount, isBlob);
- }, error);
- }
- return;
- }
- else
- {
- GAC.token = token;
- }
- }
-
- var req = new XMLHttpRequest();
- req.open(method, url);
- req.setRequestHeader('Authorization', 'Bearer ' + GAC.token);
- req.setRequestHeader('Content-Type', contentType || 'application/json;charset=UTF-8');
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- success(req);
- }
- else if (this.status == 401) // (Unauthorized) [e.g, invalid token]
- {
- //Try refresh token before asking for new authentication
- var authInfo = GAC.getPersistentAuth();
-
- if (authInfo != null && authInfo.refreshToken != null)
- {
- function doRefreshToken(state)
- {
- var req2 = new XMLHttpRequest();
- req2.open('GET', GAC.redirectUri + '?refresh_token=' + authInfo.refreshToken +
- '&state=' + encodeURIComponent('cId=' + GAC.clientId + '&domain=' + GAC.host + '&ver=2&token=' + state)); //To identify which app/domain is used
-
- req2.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- var newAuthInfo = JSON.parse(req2.responseText);
- GAC.token = newAuthInfo.access_token;
- //Update existing authInfo and save it
- authInfo.access_token = newAuthInfo.access_token;
- authInfo.refresh_token = newAuthInfo.refresh_token;
- authInfo.expires = Date.now() + newAuthInfo.expires_in * 1000;
- authInfo.token = authInfo.access_token;
- authInfo.refreshToken = authInfo.refresh_token;
- GAC.setPersistentAuth(authInfo);
- //Retry request with refreshed token
- GAC.doAuthRequestPlain(url, method, params, success, error, contentType, isBinary, ++retryCount, isBlob);
- }
- else // (Unauthorized) [e.g, invalid refresh token] (sometimes, the server returns errors other than 401 (e.g. 500))
- {
- if (failIfNotAuth)
- {
- error({authNeeded: true});
- }
- else
- {
- GAC.authGDrive(function()
- {
- //Retry request after authentication
- GAC.doAuthRequestPlain(url, method, params, success, error, contentType, isBinary, ++retryCount, isBlob);
- }, error);
- }
- }
- }
- }
-
- req2.send();
- };
-
- var req2 = new XMLHttpRequest();
- req2.open('GET', GAC.redirectUri + '?getState=1');
-
- req2.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- doRefreshToken(req2.responseText);
- }
- else
- {
- error(this);
- }
- }
- };
-
- req2.send();
- }
- else
- {
- if (failIfNotAuth)
- {
- error({authNeeded: true});
- }
- else
- {
- GAC.authGDrive(function()
- {
- //Retry request after authentication
- GAC.doAuthRequestPlain(url, method, params, success, error, contentType, isBinary, ++retryCount, isBlob);
- }, error);
- }
- }
- }
- else
- {
- error(this);
- }
- }
- };
-
- if (isBinary && req.overrideMimeType)
- {
- req.overrideMimeType('text/plain; charset=x-user-defined');
- }
-
- if (isBlob)
- {
- req.responseType = 'blob';
- }
-
- req.send(params != null? JSON.stringify(params) : null);
-};
-
-GAC.showError = function(err)
-{
- alert('Error: ' + e.message);
-};
-
-GAC.getFileInfo = function(id, success, error)
-{
- GAC.doAuthRequest('/files/' + id +
- '?fields=id,title,mimeType,modifiedDate,downloadUrl,thumbnailLink,webViewLink,embedLink,fileSize,lastModifyingUser,owners' +
- '&supportsAllDrives=true',
- 'GET', null, function(obj)
- {
- success(obj);
- }, error);
-};
-
-GAC.setOrigin = function(origin)
-{
- GAC.origin = origin;
-};
-
-GAC.getOrigin = function()
-{
- return GAC.origin || GAC.getUrlParam('xdm_e', true) || (window.location.protocol + '//' + window.location.host);
-};
-
-GAC.pickFile = function(fn, acceptFolders)
-{
- acceptFolders = acceptFolders || false;
-
- var view1 = new google.picker.DocsView(google.picker.ViewId.FOLDERS)
- .setParent('root')
- .setIncludeFolders(true)
- .setSelectFolderEnabled(acceptFolders)
- .setMimeTypes('*/*');
-
- var view2 = new google.picker.DocsView()
- .setIncludeFolders(true)
- .setSelectFolderEnabled(acceptFolders)
-
- var view3 = new google.picker.DocsView()
- .setEnableDrives(true)
- .setIncludeFolders(true)
- .setSelectFolderEnabled(acceptFolders)
-
- var dim = GAC.getDocDim();
-
- var builder = new google.picker.PickerBuilder()
- .addView(view1)
- .addView(view2)
- .addView(view3)
- .setOAuthToken(GAC.token)
- .enableFeature(google.picker.Feature.SUPPORT_DRIVES)
- .setCallback(function(data)
- {
- if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED)
- {
- picker.setVisible(false);
- var doc = data[google.picker.Response.DOCUMENTS][0];
-
- GAC.getFileInfo(doc.id, function(fullDoc)
- {
- fn(fullDoc);
- }, function()
- {
- fn(doc);
- });
- }
- })
- .setOrigin(GAC.getOrigin())
- .setSize(dim.w - 10, dim.h - 10);
-
- picker = builder.build();
- picker.setVisible(true);
-};
-
-GAC.confirmGDAuth = function(success, error, failIfNotAuth)
-{
- GAC.doAuthRequestPlain('https://www.googleapis.com/oauth2/v2/userinfo',
- 'GET', null, success, error, null, null, null, null, failIfNotAuth);
-};
-
-//This function depends on having GraphViewer loaded
-GAC.extractGraphModelFromPng = function(pngData)
-{
- return Editor.extractGraphModelFromPng(pngData);
-};
-
-GAC.getBinaryFile = function(file, success, error)
-{
- if (file['downloadUrl'] == null)
- {
- GAC.getFileInfo(file.id, function(completeFile)
- {
- GAC.getBinaryFile(completeFile, success, error);
- }, error);
-
- return;
- }
-
- GAC.doAuthRequestPlain(file['downloadUrl'], 'GET', null, function(req)
- {
- success(req.response);
- }, error, null, null, null, true);
-};
-
-//This function depends on having GraphViewer loaded
-GAC.getDrawioFileDoc = function(file, success, error, doCheck)
-{
- if (file['downloadUrl'] == null)
- {
- GAC.getFileInfo(file.id, function(completeFile)
- {
- GAC.getDrawioFileDoc(completeFile, success, error, doCheck);
- }, error);
-
- return;
- }
-
- var isPng = file.mimeType == 'image/png';
-
- GAC.doAuthRequestPlain(file['downloadUrl'], 'GET', null, function(req)
- {
- try
- {
- var cnt = req.responseText;
-
- if (isPng)
- {
- cnt = 'data:image/png;base64,' + Editor.base64Encode (cnt);
- cnt = GAC.extractGraphModelFromPng(cnt);
- }
-
- var doc = mxUtils.parseXml(cnt);
-
- if (!doCheck || new Editor().extractGraphModel(doc.documentElement) != null)
- {
- file.isDrawio = true;
- success(doc, cnt, true);
- return;
- }
- }
- catch(e) {} //on error and if the doc is null, the following line will call the error
-
- error();
-
- }, error, null, isPng);
-};
-
-//This function depends on having GraphViewer loaded
-GAC.checkDrawioFile = function(file, success, error)
-{
- GAC.getDrawioFileDoc(file, success, error, true);
-};
-
-GAC.setPersistentAuth = function(authInfo)
-{
- if (GAC.isLocalStorage)
- {
- if (authInfo != null)
- {
- //Google Auth doesn't return the refresh_token with every request, so we need to copy it when auth info is saved
- if (authInfo.refreshToken == null)
- {
- var curInfo = GAC.getPersistentAuth();
-
- if (curInfo != null) authInfo.refreshToken = curInfo.refreshToken;
- }
-
- localStorage.setItem('.' + GAC.authLSKeyName, JSON.stringify(authInfo));
- }
- else
- {
- GAC.token = null;
- localStorage.removeItem('.' + GAC.authLSKeyName);
- }
- }
-};
-
-GAC.getPersistentToken = function()
-{
- var authInfo = GAC.getPersistentAuth();
- var token = null;
-
- if (authInfo != null)
- {
- token = authInfo.access_token;
- }
-
- return token;
-};
-
-GAC.getPersistentAuth = function()
-{
- var authInfo = null;
-
- if (GAC.isLocalStorage)
- {
- authInfo = JSON.parse(localStorage.getItem('.' + GAC.authLSKeyName));
- }
-
- return authInfo;
-};
diff --git a/src/main/webapp/connect/gdriveconnector/ac.js b/src/main/webapp/connect/gdriveconnector/ac.js
deleted file mode 100644
index ab77b943..00000000
--- a/src/main/webapp/connect/gdriveconnector/ac.js
+++ /dev/null
@@ -1,44 +0,0 @@
-var AC = {};
-
-AC.getUrlParam = function(param, escape, url){
- try{
- var url = url || window.location.search;
- var regex = new RegExp(param + '=([^&]+)'),
- data = regex.exec(url)[1];
- // decode URI with plus sign fix.
- return (escape) ? window.decodeURIComponent(data.replace(/\+/g, '%20')) : data;
- } catch (e){
- return undefined;
- }
-};
-
-AC.getMetaTag = function(name) {
- return document.getElementsByTagName('meta')[name].getAttribute('content');
-};
-
-AC.getMacroData = function(fn) {
- AP.confluence.getMacroData(fn);
-}
-
-AC.getBaseUrl = function()
-{
- var baseUrl = AC.getUrlParam('xdm_e', true) + AC.getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-AC.getSiteUrl = function()
-{
- var siteUrl = AC.getUrlParam('xdm_e', true);
- //Ensure siteUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- if (/^https:\/\/([^\.])+\.jira\.com$/.test(siteUrl) || /^https:\/\/([^\.])+\.atlassian\.net$/.test(siteUrl))
- {
- return siteUrl;
- }
- throw 'Invalid siteUrl!';
-};
diff --git a/src/main/webapp/connect/gdriveconnector/att-macroEditor.html b/src/main/webapp/connect/gdriveconnector/att-macroEditor.html
deleted file mode 100644
index 3313e96d..00000000
--- a/src/main/webapp/connect/gdriveconnector/att-macroEditor.html
+++ /dev/null
@@ -1,165 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Diagram Upload Editor</title>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../../js/spin/spin.min.js" type="text/javascript"></script>
-<script type="text/javascript">
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Overrides browser language with Confluence user language
-var lang = AC.getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript" src="../vsdx/importer.js"></script>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.9.12/css/aui.min.css" media="all">
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
-}
-</style>
-</head>
-<body style="height:100%;">
-<div style="height:100%;">
- <div style="height:100%;width:350px;border-right:1px solid #cccccc;position:absolute;top:0px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filename">File name</label>
- <input type="file" id="fileupload" style="display: none">
- <input class="text macro-param-input" type="text" id="filename" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePicker">Choose</button>
- <div id="spinner-container"></div>
- <div class="description">Diagram file name</div>
- <div class="error" id="filenameError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="width">Width</label> <input class="text medium-field" id="width" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="height">Height</label> <input class="text medium-field" id="height" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSize" type="checkbox" >
- <label for="autoSize" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- <div class="error" id="errorMsg">
- </div>
- </form>
- </div>
- <div id="preview" style="height:100%;left:351px;position:absolute;top:0px;right:0px;display:inline-block;text-align: center;">
- <a style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer"
- onclick="document.getElementById('filename').click();">Choose a file...</a>
- </div>
-</div>
-<script src="../att_common/att-editor.js" type="text/javascript"></script>
-<script type="text/javascript">
- AttViewerEditor(function(selectedFile, selFileContent, editedFile, width, height, autoSize, isDrawio, aspect, onError)
- {
- AC.getCurPageId(function(pageId, draftPage)
- {
- if (selectedFile != null)
- {
- //AP.request doesn't support loading binary data, so we store binary data as Base64 strings (which is loaded using DataURL)
- var attFile = new Blob([selFileContent], {type: selectedFile.type});
- attFile.name = selectedFile.name;
-
- var reqData = {file: attFile, minorEdit: true};
- var draft = draftPage ? '?status=draft' : '';
-
- AP.request({
- type: 'PUT',
- data: reqData,
- url: '/rest/api/content/'+ pageId + '/child/attachment' + draft,
- contentType: 'multipart/form-data',
- success: function(resp)
- {
- resp = JSON.parse(resp).results[0];
-
- var macroParams =
- {
- filename : selectedFile.name,
- attId : resp.id,
- attVer: resp.version.number,
- width : width,
- height : height,
- isDrawio: isDrawio? '1' : '0',
- aspect: aspect,
- mimeType : selectedFile.type,
- autoSize: autoSize? '1' : '0',
- dummy: Date.now() //This allows adding the same file more than once
- };
-
- AP.confluence.saveMacro(macroParams);
- AP.confluence.closeMacroEditor();
- },
- error: onError
- });
- }
- else if (editedFile != null)
- {
- editedFile.width = width;
- editedFile.height = height;
- editedFile.autoSize = autoSize? '1' : '0';
- editedFile.aspect = aspect;
- editedFile.dummy = Date.now(); //This allows adding the same file more than once
-
- AP.confluence.saveMacro(editedFile);
- AP.confluence.closeMacroEditor();
- }
- });
- }, function(callback, onError)
- {
- AC.getCurPageId(function(pageId, draftPage)
- {
- AP.confluence.getMacroData(function(fileInfo)
- {
- if (fileInfo && fileInfo.attId)
- {
- AP.request({
- url: '/download/attachments/' + pageId + '/' + encodeURIComponent(fileInfo.filename) +
- '?version=' + fileInfo.attVer,
- success: function(resp)
- {
- callback(fileInfo, resp);
- },
- error : function()
- {
- onError(fileInfo);
- }
- });
- }
- else
- {
- callback();
- }
- });
- });
- });
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/gdriveconnector/att-viewer.html b/src/main/webapp/connect/gdriveconnector/att-viewer.html
deleted file mode 100644
index 98fe7016..00000000
--- a/src/main/webapp/connect/gdriveconnector/att-viewer.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Diagram Upload Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-image:url(/connect/gdriveconnector/spinner.gif);
- background-repeat:no-repeat;
- background-position:center;
-}
-</style>
-<script type="text/javascript">
-IMAGE_PATH = '/images';
-</script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-</head>
-<body style='overflow : none'>
-<div id="status" style="display : none"><span>Unable to load the attachment file.</span></div>
-<script type="text/javascript" src="att-viewer.js"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/gdriveconnector/att-viewer.js b/src/main/webapp/connect/gdriveconnector/att-viewer.js
deleted file mode 100644
index a56b55f5..00000000
--- a/src/main/webapp/connect/gdriveconnector/att-viewer.js
+++ /dev/null
@@ -1,278 +0,0 @@
-(function(){
- var lightbox = AC.getUrlParam('lightbox') == '1';
-
- if (lightbox)
- {
- document.body.style.backgroundImage = 'url(/images/drawlogo-text-bottom.svg)';
- document.body.style.backgroundPosition = 'center 30%';
- document.body.style.backgroundSize = '128px';
- }
-
- var connectUrl = AC.getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName('head')[0];
-
- var script = document.createElement('script');
- script.onload = main;
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
- head.appendChild(script);
-
- var link = document.createElement('link');
- link.type = 'text/css';
- link.rel = 'stylesheet';
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- function showError(errMsg)
- {
- document.body.style.backgroundImage = 'none';
- document.body.innerHTML = '<img src="/mxgraph/images/error.gif" border="0" align="absmiddle"/> ' +
- AC.htmlEntities(errMsg);
- AP.resize('100%', '20');
- };
-
- function viewAttachment(attId, attVer, pageId, width, height, filename, mimeType, autoSize, isDrawio, aspect)
- {
- document.body.innerHTML = '';
- document.body.style.backgroundImage = 'url(/connect/gdriveconnector/spinner.gif)';
- document.body.style.backgroundSize = null;
-
- AP.request({
- url: '/download/attachments/' + pageId + '/' + encodeURIComponent(filename) +
- '?version=' + attVer,
- success: function(resp)
- {
- if (isDrawio)
- {
- var isPng = mimeType == 'image/png';
-
- //TODO This code is shared with Google Drive viewer also, abstract it
- try
- {
- if (isPng)
- {
- resp = AC.extractGraphModelFromPng(resp);
- }
-
- var viewerPageId, layerIds;
-
- if (aspect != null)
- {
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- viewerPageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- if (lightbox)
- {
- AP.resize('100%', '100%');
-
- var config = {highlight: '#3572b0', nav: true, lightbox: false,
- pageId: viewerPageId, layerIds: layerIds};
-
- var viewer = new GraphViewer(null, null, config);
- viewer.lightboxChrome = false;
- viewer.xml = resp;
-
- // Enables layers via flag to avoid toolbar
- viewer.layersEnabled = true;
-
- var ui = viewer.showLocalLightbox();
- // Destroy lightbox with ui instance
- var destroy = ui.destroy;
- ui.destroy = function()
- {
- AP.dialog.close();
- destroy.apply(this, arguments);
- };
-
- // Workaround for ignored header toolbar height for iframe
- ui.editor.graph.container.style.bottom = '51px';
- }
- else
- {
- var refreshImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAhFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8qm6wAAAAK3RSTlMABr4XDQoC07pc+/Yq5dzYtaiSjXlkMx4U8u/NwrKZf1gl8eDKb2lOR0Q6/VKNjQAAAKlJREFUGNOtjlcOwjAQBd1jOwnpvdNh738/kuA4iE/EfI1Gu9JD/4RTyr+bNxDHCS8FKp62CXWAlSYj0n6MNZziLOt90EC2OgXQ5osoF/aagr/GgsBeRUpSsUgeSikHbG4xFpssamCU0lIYZVuMDkFw9oxeTaUOgE74e0T1+Ki1wvOl8iHituojVDJJiAuNhwxlG9+Jhhm3sxGJiaFy7MMuvjFksavRD7wAhtIMKUShI2QAAAAASUVORK5CYII=';
-
- var btnDefs = {
- 'refresh': {title: 'Refresh',
- image: refreshImg, handler: function()
- {
- viewAttachment(attId, attVer, pageId, width, height, filename, mimeType, autoSize, isDrawio, aspect);
- }
- }
- };
-
- var tbHeight = GraphViewer.prototype.toolbarHeight;
- var doc = mxUtils.parseXml(resp);
-
- var container = document.createElement('div');
-
- container.style.cssText = 'position:absolute;max-width:100%;border:1px solid transparent;';
- document.body.appendChild(container);
-
- var config = {highlight: '#3572b0', 'toolbar-position': 'top',
- nav: true, border: 2, title: filename, lightbox: true,
- toolbar: 'pages refresh zoom layers lightbox', 'toolbar-buttons': btnDefs,
- pageId: viewerPageId, layerIds: layerIds};
-
- if (!autoSize)
- {
- config['auto-fit'] = true;
- config.resize = false;
- }
-
- var viewer = new GraphViewer(container, doc.documentElement, config);
-
- viewer.showLightbox = function()
- {
- //Create an aspect reflecting current view
- var layerIds = [], viewerPageId = viewer.diagrams[viewer.currentPage].getAttribute('id');
-
- var model = viewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- var curAspect = viewerPageId + ' ' + layerIds.join(' ');
-
- AP.dialog.create(
- {
- header: filename,
- key: 'DULightbox',
- size: 'fullscreen',
- customData: {attId: attId, pageId: pageId, filename: filename, attVer: attVer,
- width: width, height: height, mimeType: mimeType, aspect: curAspect},
- chrome: true
- });
- };
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- if (!autoSize)
- {
- AP.resize(width, height);
- viewer.graph.doResizeContainer(width, height);
- }
- else
- {
- function updateHeight(height)
- {
- AP.resize('100%', Math.ceil(height) + tbHeight + 4);
- };
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight(height);
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight(height);
- };
-
- updateHeight(container.offsetHeight);
- }
- }
-
- document.body.style.backgroundImage = 'none';
- }
- catch(e)
- {
- console.log(e);
- showError('Attachment file "' + filename + '" is corrupted');
- }
- }
- else
- {
- var img = new Image();
-
- img.onload = function()
- {
- document.body.style.backgroundImage = 'none';
-
- if (!autoSize)
- {
- var s = Math.min(width / img.width, height / img.height);
-
- img.width = s * img.width;
- img.height = s * img.height;
-
- img.style.verticalAlign = 'middle';
- document.body.style.lineHeight = height + 'px';
- document.body.style.textAlign = 'center';
-
- AP.resize(width, height);
- }
- else
- {
- AP.resize(img.width, img.height);
- }
-
- document.body.appendChild(img);
- };
-
- img.onerror = function()
- {
- showError('Attachment file "' + filename + '" is corrupted');
- };
-
- img.src = resp;
- }
- },
- error: function()
- {
- showError('Failed to load attachment file "' + filename + '"');
- }
- });
- };
-
- function main()
- {
- if (lightbox)
- {
- AP.dialog.getCustomData(function (customData) {
- viewAttachment(customData.attId, customData.attVer, customData.pageId, customData.width,
- customData.height, customData.filename, customData.mimeType, null, true, customData.aspect);
- });
- }
- else
- {
- var pageId = AC.getUrlParam('pageId');
- var attId = AC.getUrlParam('attId');
- var attVer = AC.getUrlParam('attVer');
- var width = AC.getUrlParam('width');
- var height = AC.getUrlParam('height');
- var filename = AC.getUrlParam('filename', true);
- var mimeType = AC.getUrlParam('mimeType', true) || '';
- var isDrawio = AC.getUrlParam('isDrawio') == '1';
- var aspect = AC.getUrlParam('aspect', true);
- var autoSize = AC.getUrlParam('autoSize') == '1';
-
- if (attId == null || attVer == null)
- {
- showError('Error: Missing File ID');
- }
- else
- {
- viewAttachment(attId, attVer, pageId, width,
- height, filename, mimeType, autoSize, isDrawio, aspect);
- }
- }
- }
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/gdriveconnector/images/gdriveconnector.png b/src/main/webapp/connect/gdriveconnector/images/gdriveconnector.png
deleted file mode 100644
index aaa7c270..00000000
--- a/src/main/webapp/connect/gdriveconnector/images/gdriveconnector.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/gdriveconnector/images/gdriveconnector.svg b/src/main/webapp/connect/gdriveconnector/images/gdriveconnector.svg
deleted file mode 100644
index 51413a71..00000000
--- a/src/main/webapp/connect/gdriveconnector/images/gdriveconnector.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 144.05 144"><defs><style>.cls-1{fill:#f08705;}.cls-2,.cls-3{fill:#333;}.cls-3{fill:#df6c0c;}.cls-4{fill:#fff;}.cls-5{fill:none;stroke:#fff;stroke-miterlimit:10;stroke-width:5px;}</style></defs><g><rect class="cls-1" width="144" height="144" rx="5"/><path class="cls-2" d="M144,22V5a4.959,4.959,0,0,0-4.952-5h-134A5.04,5.04,0,0,0,0,5V22H144Z"/><path class="cls-3" d="M34.39,65.824l1.535,60.384L54.133,144H136.9c5.053,0,7.152-1.156,7.152-6.7S144,88.1,144,88.1L113.879,57.941,88.4,35.353,67.55,36.667,56.573,41.375,51.216,53.583,39.539,58.409Z"/><path class="cls-5" d="M69.216,55.5,92.383,78v31.833s1.75,18-14.167,18H45.883S33.05,128.5,33.05,110.167V70.833S31.55,55.5,51.383,55.5Z"/><polyline class="cls-5" points="70.383 57.833 70.383 76.833 90.383 76.833"/><path class="cls-5" d="M52.05,55V50.833S50.55,35.5,70.383,35.5H87.216L111.383,59V89.833s1.583,18-14.167,18H93.8"/><polyline class="cls-5" points="88.383 37.833 88.383 57.833 110.383 57.833"/><path class="cls-4" d="M131.947,113.832a16.777,16.777,0,0,0-4.932-11.9L131.947,97H119.322v12.625l4.718-4.719a12.625,12.625,0,1,1-18.4,17.278l-3.157,2.784a16.834,16.834,0,0,0,29.459-11.135Z"/></g></svg>
diff --git a/src/main/webapp/connect/gdriveconnector/macroEditor.html b/src/main/webapp/connect/gdriveconnector/macroEditor.html
deleted file mode 100644
index d1494c71..00000000
--- a/src/main/webapp/connect/gdriveconnector/macroEditor.html
+++ /dev/null
@@ -1,145 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>GDrive Connector Editor</title>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script src="../../js/spin/spin.min.js" type="text/javascript"></script>
-<script type="text/javascript">
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Overrides browser language with Confluence user language
-var lang = GAC.getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript" src="../vsdx/importer.js"></script>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.9.12/css/aui.min.css" media="all">
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
-}
-.thumbnail {
- box-sizing: border-box;
- height: 100px;
- width: 100px;
- border: 1px solid #CCCCCC;
- border-radius: 3px;
- line-height: 94px;
- text-align:center;
-}
-#thumbImg {
- vertical-align:middle;
- max-width: 96px;
- max-height: 96px;
-}
-</style>
-</head>
-<body style="height:100%;">
-<div style="height:100%;">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:0px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filename">File name</label>
- <input class="text macro-param-input" type="text" id="filename" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePicker" disabled>Choose</button>
- <div id="spinner-container"></div>
- <div class="description">Google Drive file name</div>
- <div class="error" id="filenameError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="width">Width</label> <input class="text medium-field" id="width" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="height">Height</label> <input class="text medium-field" id="height" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSize" type="checkbox" >
- <label for="autoSize" style="display:inline-block;">Automatically set the size of the viewer</label>
- </div>
- <div id="thumbGroup" class="field-group" style="padding-left:15px;">
- <label for="thumbImg">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImg">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawio">
- <label for="useDrawio" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </form>
- </div>
- <div id="preview" style="bottom:0px;left:351px;position:absolute;top:0px;right:0px;display:inline-block;">
- <a id="chooseLink" style="text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer;display:none;"
- onclick="document.getElementById('filePicker').click();">Choose a file...</a>
- <span id="status" style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);">
- Loading...</span>
- </div>
-</div>
-<script src="../gdrive_common/editor.js" type="text/javascript"></script>
-<script type="text/javascript">
- GAC.$('#thumbGroup').style.display = 'none';
-
- GDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- var useDrawio = selectedFile.isDrawio || GAC.$('#useDrawio').checked;
-
- function saveMacro()
- {
- var macroParams =
- {
- filename : selectedFile.title,
- fileId : selectedFile.id,
- width : width,
- height : height,
- isDrawio: useDrawio? '1' : '0',
- aspect: selectedFile.aspect,
- autoSize: autoSize? '1' : '0',
- mimeType : selectedFile.mimeType,
- macroVer: 2, //This version is used by viewer to detect the new macros
- dummy: Date.now() //This allows adding the same file more than once
- };
-
- AP.confluence.saveMacro(macroParams);
- AP.confluence.closeMacroEditor();
- };
-
- if (useDrawio && selFileContent != null)
- {
- var modifiedTS = new Date(selectedFile.modifiedDate).getTime();
- GAC.uploadCachedMxFile(selFileContent, modifiedTS + '_' + selectedFile.title, saveMacro, saveMacro); //Save without caching
- }
- else
- {
- saveMacro();
- }
- }, function(cp)
- {
- AP.confluence.getMacroData(cp);
- });
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/gdriveconnector/od-macroEditor.html b/src/main/webapp/connect/gdriveconnector/od-macroEditor.html
deleted file mode 100644
index f6f133d9..00000000
--- a/src/main/webapp/connect/gdriveconnector/od-macroEditor.html
+++ /dev/null
@@ -1,144 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>OneDrive Connector Editor</title>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../../js/spin/spin.min.js" type="text/javascript"></script>
-<script type="text/javascript">
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Overrides browser language with Confluence user language
-var lang = AC.getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript" src="../vsdx/importer.js"></script>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.9.12/css/aui.min.css" media="all">
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
-}
-.thumbnail {
- box-sizing: border-box;
- height: 100px;
- width: 100px;
- border: 1px solid #CCCCCC;
- border-radius: 3px;
- line-height: 94px;
- text-align:center;
-}
-#thumbImg {
- vertical-align:middle;
- max-width: 96px;
- max-height: 96px;
-}
-</style>
-</head>
-<body style="height:100%;">
-<div style="height:100%;">
- <div style="height:100%;width:350px;border-right:1px solid #cccccc;position:absolute;top:0px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filename">File name</label>
- <input class="text macro-param-input" type="text" id="filename" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePicker" disabled>Choose</button>
- <div id="spinner-container"></div>
- <div class="description">OneDrive file name</div>
- <div class="error" id="filenameError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="width">Width</label> <input class="text medium-field" id="width" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="height">Height</label> <input class="text medium-field" id="height" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSize" type="checkbox" >
- <label for="autoSize" style="display:inline-block;">Automatically set the size of the viewer</label>
- </div>
- <div id="thumbGroup" class="field-group" style="padding-left:15px;">
- <label for="thumbImg">Thumbnail</label>
- <div class="thumbnail">
- <img id="thumbImg">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawio">
- <label for="useDrawio" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </form>
- </div>
- <div id="preview" style="height:100%;left:351px;position:absolute;top:0px;right:0px;display:inline-block;">
- <a style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer"
- onclick="document.getElementById('filePicker').click();">Choose a file...</a>
- </div>
-</div>
-<script src="../onedrive_common/editor.js" type="text/javascript"></script>
-<script type="text/javascript">
- AC.$('#thumbGroup').style.display = 'none';
-
- OneDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- var useDrawio = selectedFile.isDrawio || AC.$('#useDrawio').checked;
-
- function saveMacro()
- {
- var macroParams =
- {
- filename : selectedFile.name,
- fileId : selectedFile.id,
- driveId: selectedFile.parentReference.driveId,
- width : width,
- height : height,
- isDrawio: useDrawio,
- aspect: selectedFile.aspect,
- autoSize: autoSize? '1' : '0',
- mimeType : selectedFile.file.mimeType,
- embeddedUrl : selectedFile.embeddedUrl,
- dummy: Date.now() //This allows adding the same file more than once
- };
-
- AP.confluence.saveMacro(macroParams);
- AP.confluence.closeMacroEditor();
- };
-
- if (useDrawio && selFileContent != null)
- {
- var modifiedTS = new Date(selectedFile.lastModifiedDateTime).getTime();
- AC.uploadCachedMxFile(selFileContent, modifiedTS + '_' + selectedFile.name, saveMacro, saveMacro); //Save without caching
- }
- else
- {
- saveMacro();
- }
- }, function(cp)
- {
- AP.confluence.getMacroData(cp);
- });
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/gdriveconnector/od-viewer.html b/src/main/webapp/connect/gdriveconnector/od-viewer.html
deleted file mode 100644
index 048c43cf..00000000
--- a/src/main/webapp/connect/gdriveconnector/od-viewer.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>OneDrive Connector Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-image:url(/connect/gdriveconnector/spinner.gif);
- background-repeat:no-repeat;
- background-position:center;
-}
-</style>
-<script type="text/javascript">
-IMAGE_PATH = '/images';
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript" src="../vsdx/importer.js"></script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-</head>
-<body style='overflow : none'>
-<div id="status" style="display : none"><span>Unable to load the OneDrive file.</span></div>
-<script type="text/javascript" src="od-viewer.js"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/gdriveconnector/od-viewer.js b/src/main/webapp/connect/gdriveconnector/od-viewer.js
deleted file mode 100644
index 23780353..00000000
--- a/src/main/webapp/connect/gdriveconnector/od-viewer.js
+++ /dev/null
@@ -1,350 +0,0 @@
-(function(){
- var lightbox = AC.getUrlParam('lightbox') == '1';
-
- if (lightbox)
- {
- document.body.style.backgroundImage = 'url(/images/drawlogo-text-bottom.svg)';
- document.body.style.backgroundPosition = 'center 30%';
- document.body.style.backgroundSize = '128px';
- }
-
- var connectUrl = AC.getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName("head")[0];
-
- var script = document.createElement("script");
-
- script.onload = function()
- {
- AC.getCurPageId(function(pageId, draftPage)
- {
- confPageId = pageId;
- isDraft = draftPage;
-
- main();
- });
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
- head.appendChild(script);
-
- var link = document.createElement("link");
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- var confPageId, isDraft;
-
- function showError(errMsg)
- {
- document.body.style.backgroundImage = 'none';
- document.body.innerHTML = '<img src="/mxgraph/images/error.gif" border="0" align="absmiddle"/> ' +
- AC.htmlEntities(errMsg);
- AP.resize('100%', '20');
- };
-
- function getFileInfoErr(err)
- {
- if (err && (err.status == 403 || err.status == 400)) //400 is returned when a business account file is accessed via a personal account
- {
- showError('Error: Access Denied. You do not have permission to access this file.');
- }
- else
- {
- showError('Error: Cannot get file information.');
- }
- };
-
- function showDiagram(fileId, driveId, width, height, name, mimeType, autoSize, aspect)
- {
- document.body.innerHTML = '';
- document.body.style.backgroundImage = 'url(/connect/gdriveconnector/spinner.gif)';
- document.body.style.backgroundSize = null;
-
- AC.getFileInfo(fileId, driveId, function(fileInfo)
- {
- var isPng = fileInfo.file.mimeType == 'image/png';
- var isVsdx = /\.v(dx|sdx?)$/i.test(name);
-
- function cacheAndRender(fileContent, timestamp, filename)
- {
- timestamp = String(timestamp);
- renderDiagram(fileContent);
-
- AC.uploadCachedMxFile(fileContent, timestamp + '_' + filename, AC.noop, AC.noop);
-
- //Delete old cached file
- AC.delOldCachedFiles(confPageId, filename, timestamp);
- };
-
- //TODO This code is shared with Google Drive viewer also, abstract it
- function renderDiagram(resp)
- {
- try
- {
- if (isPng)
- {
- resp = 'data:image/png;base64,' + Editor.base64Encode (resp);
- resp = AC.extractGraphModelFromPng(resp);
- }
-
- var pageId, layerIds;
-
- if (aspect != null)
- {
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- if (lightbox)
- {
- AP.resize('100%', '100%');
-
- var config = {highlight: '#3572b0', nav: true, lightbox: false,
- pageId: pageId, layerIds: layerIds};
-
- EditorUi.prototype.lightboxToolbarActions = [{icon: Editor.editLargeImage, tooltip: mxResources.get('edit'), fn: function()
- {
- window.open('https://' + window.location.hostname + '/#W' + encodeURIComponent(driveId + '/' + fileId));
- }}];
-
- var viewer = new GraphViewer(null, null, config);
- viewer.lightboxChrome = false;
- viewer.xml = resp;
-
- // Enables layers via flag to avoid toolbar
- viewer.layersEnabled = true;
-
- var ui = viewer.showLocalLightbox();
- // Destroy lightbox with ui instance
- var destroy = ui.destroy;
- ui.destroy = function()
- {
- AP.dialog.close();
- destroy.apply(this, arguments);
- };
-
- // Workaround for ignored header toolbar height for iframe
- ui.editor.graph.container.style.bottom = '51px';
- }
- else
- {
- var refreshImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAhFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8qm6wAAAAK3RSTlMABr4XDQoC07pc+/Yq5dzYtaiSjXlkMx4U8u/NwrKZf1gl8eDKb2lOR0Q6/VKNjQAAAKlJREFUGNOtjlcOwjAQBd1jOwnpvdNh738/kuA4iE/EfI1Gu9JD/4RTyr+bNxDHCS8FKp62CXWAlSYj0n6MNZziLOt90EC2OgXQ5osoF/aagr/GgsBeRUpSsUgeSikHbG4xFpssamCU0lIYZVuMDkFw9oxeTaUOgE74e0T1+Ki1wvOl8iHituojVDJJiAuNhwxlG9+Jhhm3sxGJiaFy7MMuvjFksavRD7wAhtIMKUShI2QAAAAASUVORK5CYII=';
-
- var btnDefs = {
- 'refresh': {title: 'Refresh',
- image: refreshImg, handler: function()
- {
- showDiagram(fileId, driveId, width, height, name, mimeType, autoSize, aspect);
- }
- }
- };
-
- var tbHeight = GraphViewer.prototype.toolbarHeight;
- var doc = mxUtils.parseXml(resp);
-
- var container = document.createElement('div');
-
- container.style.cssText = 'position:absolute;max-width:100%;border:1px solid transparent;';
- document.body.appendChild(container);
-
- var config = {highlight: '#3572b0', 'toolbar-position': 'top',
- nav: true, border: 2, title: name, lightbox: true,
- toolbar: 'pages refresh zoom layers lightbox', 'toolbar-buttons': btnDefs,
- pageId: pageId, layerIds: layerIds};
-
- if (!autoSize)
- {
- config['auto-fit'] = true;
- config.resize = false;
- }
-
- var viewer = new GraphViewer(container, doc.documentElement, config);
-
- viewer.showLightbox = function()
- {
- //Create an aspect reflecting current view
- var layerIds = [], pageId = viewer.diagrams[viewer.currentPage].getAttribute('id');
-
- var model = viewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- var curAspect = pageId + ' ' + layerIds.join(' ');
-
- AP.dialog.create(
- {
- header: name,
- key: 'lightbox',
- size: 'fullscreen',
- customData: {fileId: fileId, driveId: driveId, name: name, width: width,
- height: height, mimeType: mimeType, aspect: curAspect},
- chrome: true
- });
- };
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- if (!autoSize)
- {
- AP.resize(width, height);
- viewer.graph.doResizeContainer(width, height);
- }
- else
- {
- function updateHeight(height)
- {
- AP.resize('100%', Math.ceil(height) + tbHeight + 4);
- };
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight(height);
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight(height);
- };
-
- updateHeight(container.offsetHeight);
- }
- }
-
- document.body.style.backgroundImage = 'none';
- }
- catch(e)
- {
- console.log(e);
- showError('File "' + name + '" is corrupted');
- }
- };
-
- function loadFileErr()
- {
- showError('Failed to load OneDrive file "' + name + '"');
- };
-
- var timestamp = new Date(fileInfo.lastModifiedDateTime).getTime();
-
- AP.request({
- url: '/download/attachments/' + confPageId + '/' + encodeURIComponent(timestamp + '_' + fileInfo.name),
- success: renderDiagram,
- error : function() //Not found (e.g, file updated), fetch and cache
- {
- var req = new XMLHttpRequest();
- req.open('GET', fileInfo['@microsoft.graph.downloadUrl']);
-
- if (isVsdx)
- {
- req.responseType = 'blob';
- }
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- if (isVsdx)
- {
- convertVSDXtoMX(req.response, name, function(content)
- {
- cacheAndRender(content, timestamp, name);
- }, loadFileErr);
- }
- else
- {
- cacheAndRender(req.responseText, timestamp, name);
- }
- }
- else
- {
- loadFileErr();
- }
- }
- };
-
- if (isPng && req.overrideMimeType)
- {
- req.overrideMimeType('text/plain; charset=x-user-defined');
- }
-
- req.send();
- }
- });
- }, getFileInfoErr);
- };
-
- function main()
- {
- if (lightbox)
- {
- AP.dialog.getCustomData(function (customData) {
- showDiagram(customData.fileId, customData.driveId, customData.width, customData.height,
- customData.name, customData.mimeType, null, customData.aspect);
- });
- }
- else
- {
- var fileId = AC.getUrlParam('fileId');
- var driveId = AC.getUrlParam('driveId');
- var width = AC.getUrlParam('width');
- var height = AC.getUrlParam('height');
- var name = AC.getUrlParam('filename', true);
- var mimeType = AC.getUrlParam('mimeType', true) || '';
- var isDrawio = AC.getUrlParam('isDrawio');
- isDrawio = isDrawio == 'true' || isDrawio == '1';
- var aspect = AC.getUrlParam('aspect', true);
- var autoSize = AC.getUrlParam('autoSize') == '1';
- var embeddedUrl = AC.getUrlParam('embeddedUrl', true);
-
- if (fileId == null || driveId == null)
- {
- showError('Error: Missing File ID');
- }
- else
- {
- if (isDrawio)
- {
- showDiagram(fileId, driveId, width, height, name, mimeType, autoSize, aspect);
- }
- else if (embeddedUrl)
- {
- AP.resize(width, height);
- window.location.href = embeddedUrl;
- }
- else
- {
- AP.resize(width, height);
- AC.getPreviewUrl(fileId, driveId, function(url)
- {
- window.location.href = url;
- }, function()
- {
- showError('Error: Cannot get file preview.');
- });
- }
- }
- }
- };
-})();
diff --git a/src/main/webapp/connect/gdriveconnector/plugin.json b/src/main/webapp/connect/gdriveconnector/plugin.json
deleted file mode 100644
index 503f60fa..00000000
--- a/src/main/webapp/connect/gdriveconnector/plugin.json
+++ /dev/null
@@ -1,400 +0,0 @@
-{
- "name": "Diagram Viewer for Confluence",
- "description": "Deprecated Google Connector",
- "key": "com.mxgraph.confluence.plugins.driveconnector",
- "baseUrl": "https://www.draw.io",
- "apiMigrations": {
- "gdpr": true
- },
- "vendor":
- {
- "name": "Seibert Media",
- "url": "https://info.seibert-media.net"
- },
- "version": "1.0.3",
- "authentication":
- {
- "type": "none"
- },
- "modules":
- {
- "generalPages":
- [
- {
- "key": "lightbox",
- "url": "/connect/gdriveconnector/od-viewer.html?lightbox=1",
- "location": "hidden",
- "name": {
- "value": "Lightbox"
- }
- },
- {
- "key": "GDLightbox",
- "location": "hidden",
- "url": "/connect/gdriveconnector/viewer.html?lightbox=1",
- "name": {
- "value": "Lightbox",
- "i18n": "lightbox"
- }
- },
- {
- "key": "DULightbox",
- "location": "hidden",
- "url": "/connect/gdriveconnector/att-viewer.html?lightbox=1",
- "name": {
- "value": "Lightbox",
- "i18n": "lightbox"
- }
- },
- {
- "key": "macroEditor",
- "url": "/connect/gdriveconnector/od-macroEditor.html",
- "location": "hidden",
- "name": {
- "value": "OneDrive Editor"
- }
- }
- ],
- "dynamicContentMacros":
- [
- {
- "name":
- {
- "value": "Unused"
- },
- "url": "/connect/gdriveconnector/viewer.html?fileId=${fileId}&filename=${filename}&width=${width}&height=${height}&mimeType=${mimeType}&macroVer={macroVer}&isDrawio=${isDrawio}&autoSize=${autoSize}&aspect=${aspect}",
- "width": "600px",
- "height": "400px",
- "description":
- {
- "value": "Unused"
- }, "icon":
- {
- "width": 80,
- "height": 80,
- "url": "/images/stop-flat-icon-80.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": true,
- "key": "gdriveconnector",
- "editor": {
- "url": "/connect/gdriveconnector/macroEditor.html",
- "width": "80%",
- "height": "60%"
- },
- "parameters":
- [
- {
- "identifier": "fileId",
- "name":
- {
- "value": "Google Drive file ID"
- },
- "type": "string",
- "hidden": true,
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "mimeType",
- "name":
- {
- "value": "Google Drive file mime type"
- },
- "type": "string",
- "hidden": true
- },
- {
- "identifier": "filename",
- "name":
- {
- "value": "Name of the Google Drive file"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "isDrawio",
- "name":
- {
- "value": "Is the file a draw.io file"
- },
- "type": "boolean",
- "hidden": true,
- "defaultValue": "false"
- },
- {
- "identifier": "macroVer",
- "name":
- {
- "value": "Macro Version"
- },
- "type": "string",
- "hidden": true
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "width"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Height"
- },
- "type": "string"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "Auto Size"
- },
- "type": "string",
- "hidden": true
- }
- ]
- },
- {
- "name":
- {
- "value": "Unused"
- },
- "url": "/connect/gdriveconnector/od-viewer.html?fileId=${fileId}&driveId=${driveId}&filename=${filename}&width=${width}&height=${height}&mimeType=${mimeType}&isDrawio=${isDrawio}&embeddedUrl=${embeddedUrl}&autoSize=${autoSize}&aspect=${aspect}",
- "width": "600px",
- "height": "400px",
- "description":
- {
- "value": "Unused"
- }, "icon":
- {
- "width": 80,
- "height": 80,
- "url": "/images/stop-flat-icon-80.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": true,
- "key": "onedriveconnector",
- "parameters":
- [
- {
- "identifier": "filename",
- "name":
- {
- "value": "Name of the OneDrive file"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "fileId",
- "name":
- {
- "value": "OneDrive file ID"
- },
- "type": "string",
- "hidden": true,
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "driveId",
- "name":
- {
- "value": "OneDrive drive ID"
- },
- "type": "string",
- "hidden": true,
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "mimeType",
- "name":
- {
- "value": "OneDrive file mime type"
- },
- "type": "string",
- "hidden": true
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "width"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Height"
- },
- "type": "string"
- },
- {
- "identifier": "isDrawio",
- "name":
- {
- "value": "Is the file a draw.io file"
- },
- "type": "boolean",
- "hidden": true,
- "defaultValue": "false"
- },
- {
- "identifier": "embeddedUrl",
- "name":
- {
- "value": "Embedded Url for personal accounts"
- },
- "type": "string"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "Auto Size"
- },
- "type": "string",
- "hidden": true
- }
- ],
- "editor": {
- "url": "/connect/gdriveconnector/od-macroEditor.html",
- "width": "80%",
- "height": "60%"
- }
- },
- {
- "name":
- {
- "value": "Unused"
- },
- "url": "/connect/gdriveconnector/att-viewer.html?pageId=${page.id}&attId=${attId}&attVer=${attVer}&filename=${filename}&width=${width}&height=${height}&mimeType=${mimeType}&isDrawio=${isDrawio}&autoSize=${autoSize}&aspect=${aspect}",
- "width": "600px",
- "height": "400px",
- "description":
- {
- "value": "Unused"
- }, "icon":
- {
- "width": 80,
- "height": 80,
- "url": "/images/stop-flat-icon-80.png"
- },
- "categories": [
- "visuals"
- ],
- "outputType": "block",
- "featured": true,
- "key": "attviewerconnector",
- "parameters":
- [
- {
- "identifier": "filename",
- "name":
- {
- "value": "Name of the diagram file"
- },
- "type": "string",
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "attId",
- "name":
- {
- "value": "Attachment file ID"
- },
- "type": "string",
- "hidden": true,
- "required": true,
- "multiple": false,
- "defaultValue": "None"
- },
- {
- "identifier": "attVer",
- "name":
- {
- "value": "Attachment file version"
- },
- "type": "string",
- "hidden": true
- },
- {
- "identifier": "mimeType",
- "name":
- {
- "value": "Attachment file mime type"
- },
- "type": "string",
- "hidden": true
- },
- {
- "identifier": "isDrawio",
- "name":
- {
- "value": "Is the file a draw.io file"
- },
- "type": "boolean",
- "hidden": true,
- "defaultValue": "false"
- },
- {
- "identifier": "width",
- "name":
- {
- "value": "width"
- },
- "type": "string"
- },
- {
- "identifier": "height",
- "name":
- {
- "value": "Height"
- },
- "type": "string"
- },
- {
- "identifier": "autoSize",
- "name":
- {
- "value": "Auto Size"
- },
- "type": "string",
- "hidden": true
- }
- ],
- "editor": {
- "url": "/connect/gdriveconnector/att-macroEditor.html",
- "width": "80%",
- "height": "60%"
- }
- }
- ]
- },
- "scopes": [
- "read"
- ]
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/gdriveconnector/spinner.gif b/src/main/webapp/connect/gdriveconnector/spinner.gif
deleted file mode 100644
index 054973c9..00000000
--- a/src/main/webapp/connect/gdriveconnector/spinner.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/gdriveconnector/viewer.html b/src/main/webapp/connect/gdriveconnector/viewer.html
deleted file mode 100644
index 4efb623f..00000000
--- a/src/main/webapp/connect/gdriveconnector/viewer.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>GDrive Connector Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-image:url(/connect/gdriveconnector/spinner.gif);
- background-repeat:no-repeat;
- background-position:center;
-}
-</style>
-<script type="text/javascript">
-IMAGE_PATH = '/images';
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript" src="../vsdx/importer.js"></script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-</head>
-<body style='overflow : none'>
-<div id="status" style="display : none"><span>Unable to load the Google Drive file.</span></div>
-<script src="viewer.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/gdriveconnector/viewer.js b/src/main/webapp/connect/gdriveconnector/viewer.js
deleted file mode 100644
index 8f9f1c41..00000000
--- a/src/main/webapp/connect/gdriveconnector/viewer.js
+++ /dev/null
@@ -1,376 +0,0 @@
-(function()
-{
- var lightbox = GAC.getUrlParam('lightbox') == '1';
-
- if (lightbox)
- {
- document.body.style.backgroundImage = 'url(/images/drawlogo-text-bottom.svg)';
- document.body.style.backgroundPosition = 'center 30%';
- document.body.style.backgroundSize = '128px';
- }
-
- var connectUrl = GAC.getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName("head")[0];
-
- var script = document.createElement('script');
-
- script.onload = function()
- {
- GAC.getCurPageId(function(pageId, draftPage)
- {
- confPageId = pageId;
- isDraft = draftPage;
-
- main();
- });
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
- head.appendChild(script);
-
- var link = document.createElement('link');
- link.type = 'text/css';
- link.rel = 'stylesheet';
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- var diagramMimeTypes = 'application/mxe,application/vnd.jgraph.mxfile,' +
- 'application/mxr,application/vnd.jgraph.mxfile.realtime,' +
- 'application/vnd.jgraph.mxfile.rtlegacy';
-
- var formsMimeType = 'application/vnd.google-apps.form';
- var folderMimeType = 'application/vnd.google-apps.folder';
-
- var confPageId, isDraft;
-
- function showError(errMsg)
- {
- document.body.style.backgroundImage = 'none';
- document.body.innerHTML = '<img src="/mxgraph/images/error.gif" border="0" align="absmiddle"/> ' +
- GAC.htmlEntities(errMsg);
- AP.resize('100%', '20');
- };
-
- function getFileInfoErr(err)
- {
- if (err && (err.status == 403 || err.status == 400)) //400 is returned when a business account file is accessed via a personal account
- {
- showError('Error: Access Denied. You do not have permission to access this file.');
- }
- else
- {
- showError('Error: Cannot get file information.');
- }
- };
-
- function showDiagram(fileId, width, height, name, mimeType, autoSize, macroVer, aspect)
- {
- document.body.innerHTML = '';
- document.body.style.backgroundImage = 'url(/connect/gdriveconnector/spinner.gif)';
- document.body.style.backgroundSize = null;
-
- GAC.getFileInfo(fileId, function(fileInfo)
- {
- var isPng = fileInfo.mimeType == 'image/png';
-
- function cacheAndRender(fileContent, timestamp, filename)
- {
- timestamp = String(timestamp);
- renderDiagram(fileContent);
-
- GAC.uploadCachedMxFile(fileContent, timestamp + '_' + filename, GAC.noop, GAC.noop);
-
- //Delete old cached file
- GAC.delOldCachedFiles(confPageId, filename, timestamp);
- };
-
- function renderDiagram(resp)
- {
- try
- {
- if (isPng)
- {
- resp = 'data:image/png;base64,' + Editor.base64Encode (resp);
- resp = GAC.extractGraphModelFromPng(resp);
- }
-
- var pageId, layerIds;
-
- if (aspect != null)
- {
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- if (lightbox)
- {
- AP.resize('100%', '100%');
-
- var config = {highlight: '#3572b0', nav: true, lightbox: false,
- pageId: pageId, layerIds: layerIds};
-
- EditorUi.prototype.lightboxToolbarActions = [{icon: Editor.editLargeImage, tooltip: mxResources.get('edit'), fn: function()
- {
- window.open('https://' + window.location.hostname + '/#G' + encodeURIComponent(fileId));
- }}];
-
- var viewer = new GraphViewer(null, null, config);
- viewer.lightboxChrome = false;
- viewer.xml = resp;
-
- // Enables layers via flag to avoid toolbar
- viewer.layersEnabled = true;
-
- var ui = viewer.showLocalLightbox();
- // Destroy lightbox with ui instance
- var destroy = ui.destroy;
- ui.destroy = function()
- {
- AP.dialog.close();
- destroy.apply(this, arguments);
- };
-
- // Workaround for ignored header toolbar height for iframe
- ui.editor.graph.container.style.bottom = '51px';
- }
- else
- {
- var refreshImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAhFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8qm6wAAAAK3RSTlMABr4XDQoC07pc+/Yq5dzYtaiSjXlkMx4U8u/NwrKZf1gl8eDKb2lOR0Q6/VKNjQAAAKlJREFUGNOtjlcOwjAQBd1jOwnpvdNh738/kuA4iE/EfI1Gu9JD/4RTyr+bNxDHCS8FKp62CXWAlSYj0n6MNZziLOt90EC2OgXQ5osoF/aagr/GgsBeRUpSsUgeSikHbG4xFpssamCU0lIYZVuMDkFw9oxeTaUOgE74e0T1+Ki1wvOl8iHituojVDJJiAuNhwxlG9+Jhhm3sxGJiaFy7MMuvjFksavRD7wAhtIMKUShI2QAAAAASUVORK5CYII=';
-
- var btnDefs = {
- 'refresh': {title: 'Refresh',
- image: refreshImg, handler: function()
- {
- showDiagram(fileId, width, height, name, mimeType, autoSize, macroVer, aspect);
- }
- }
- };
- var tbHeight = GraphViewer.prototype.toolbarHeight;
- var doc = mxUtils.parseXml(resp);
-
- var container = document.createElement('div');
-
- container.style.cssText = 'position:absolute;max-width:100%;border:1px solid transparent;';
- document.body.appendChild(container);
-
- var config = {highlight: '#3572b0', 'toolbar-position': 'top',
- nav: true, border: 8, title: name, lightbox: true,
- toolbar: 'pages refresh zoom layers lightbox', 'toolbar-buttons': btnDefs,
- pageId: pageId, layerIds: layerIds};
-
- if (!autoSize)
- {
- config['auto-fit'] = true;
- config.resize = false;
- }
-
- var viewer = new GraphViewer(container, doc.documentElement, config);
-
- viewer.showLightbox = function()
- {
- //Create an aspect reflecting current view
- var layerIds = [], pageId = viewer.diagrams[viewer.currentPage].getAttribute('id');
-
- var model = viewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- var curAspect = pageId + ' ' + layerIds.join(' ');
-
- AP.dialog.create(
- {
- header: name,
- key: 'GDLightbox',
- size: 'fullscreen',
- customData: {fileId: fileId, name: name, width: width, height: height, mimeType: mimeType, macroVer: macroVer, aspect: curAspect},
- chrome: true
- });
- };
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- if (!autoSize)
- {
- AP.resize(width, height);
- viewer.graph.doResizeContainer(width, height);
- }
- else
- {
- function updateHeight(height)
- {
- AP.resize('100%', Math.ceil(height) + tbHeight + 4);
- };
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight(height);
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight(height);
- };
-
- updateHeight(container.offsetHeight);
- }
- }
- }
- catch(e)
- {
- console.log(e);
- showError('File "' + name + '" is corrupted');
- }
-
- document.body.style.backgroundImage = 'none';
- };
-
- function loadFileErr()
- {
- showError('Failed to load Google Drive file "' + name + '"');
- };
-
- var timestamp = new Date(fileInfo.modifiedDate).getTime();
-
- AP.request({
- url: '/download/attachments/' + confPageId + '/' + encodeURIComponent(timestamp + '_' + fileInfo.title),
- success: renderDiagram,
- error : function() //Not found (e.g, file updated), fetch and cache
- {
- if (/\.v(dx|sdx?)$/i.test(name))
- {
- GAC.getBinaryFile(fileInfo, function(blobFile)
- {
- convertVSDXtoMX(blobFile, name, function(content)
- {
- cacheAndRender(content, timestamp, name);
- }, loadFileErr);
- }, loadFileErr);
- }
- else
- {
- GAC.doAuthRequestPlain(fileInfo['downloadUrl'], 'GET', null, function(req)
- {
- cacheAndRender(req.responseText, timestamp, name);
- }, loadFileErr, null, isPng);
- }
- }
- });
- }, getFileInfoErr);
- };
-
- function main()
- {
- if (lightbox)
- {
- AP.dialog.getCustomData(function (customData) {
- showDiagram(customData.fileId, customData.width, customData.height, customData.name,
- customData.mimeType, null, customData.macroVer, customData.aspect);
- });
- }
- else
- {
- var fileId = GAC.getUrlParam('fileId');
- var width = GAC.getUrlParam('width');
- var height = GAC.getUrlParam('height');
- var name = GAC.getUrlParam('filename', true);
- var mimeType = GAC.getUrlParam('mimeType', true);
- var isDrawio = GAC.getUrlParam('isDrawio') == '1';
- var aspect = GAC.getUrlParam('aspect', true);
- var autoSize = GAC.getUrlParam('autoSize') == '1';
- var macroVer = GAC.getUrlParam('macroVer');
-
- if (fileId == null)
- {
- showError('Error: Missing File ID');
- }
- else if (macroVer == 2)
- {
- if (isDrawio || /\.v(dx|sdx?)$/i.test(name))
- {
- showDiagram(fileId, width, height, name, mimeType, autoSize, macroVer, aspect);
- }
- else
- {
- AP.resize(width, height);
- GAC.getFileInfo(fileId, function(fileInfo)
- {
- window.location.href = fileInfo.embedLink;
- }, getFileInfoErr);
- }
- }
- else
- {
- // Forces reload of document to override browser cache
- var nocache = 't=' + new Date().getTime();
- var url = null;
-
- if (mimeType == 'image')
- {
- document.body.style.backgroundImage = 'none';
- document.body.innerHTML = '<img width="100%" src="' + decodeURIComponent(fileId) +
- '" border="0"/>';
- }
- else if (mimeType == 'thumb')
- {
- document.body.style.backgroundImage = 'none';
- document.body.innerHTML = '<a target="_blank" href="' + decodeURIComponent(name) +
- '"><img width="100%" src="' + decodeURIComponent(fileId) + '" border="0"/></a>';
- }
- else
- {
- var drawioFile = diagramMimeTypes.indexOf(mimeType) > -1 || (name != null &&
- (/(\.xml)($|\?)/i.test(name) || /(\.drawio)($|\?)/i.test(name)));
-
- if (drawioFile || mimeType == 'application/json' || mimeType == 'application/octet-stream' ||
- (name != null && (/(\.v(dx|sdx?))($|\?)/i.test(name) || /(\.gliffy)($|\?)/i.test(name))))
- {
- // Uses public file URL, fallback implemented in editor
- var pubUrl = encodeURIComponent('https://drive.google.com/uc?id=' + fileId + '&export=download');
- var editUrl = (drawioFile) ? encodeURIComponent('https://www.draw.io/#G' + fileId) : '_blank';
-
- url = 'https://www.draw.io/?lightbox=1&toolbar-config=%7B"refreshBtn"%3Atrue%2C"fullscreenBtn"%3Atrue%2C"closeBtn"%3Atrue%7D&layers=1&' +
- 'edit=' + editUrl + ((name != null) ? ('&template-filename=' + encodeURIComponent(name)) : '') + '#U' + pubUrl;
- }
- else if (mimeType == formsMimeType)
- {
- url = 'https://docs.google.com/forms/d/' + fileId + '/viewform?' + nocache;
- }
- else if (mimeType == folderMimeType)
- {
- // Possible view options are #list and #grid
- url = 'https://drive.google.com/embeddedfolderview?id=' + fileId + '&authuser=0&' + nocache + '#list';
- }
- else if (mimeType == 'url')
- {
- url = decodeURIComponent(fileId);
- }
- else
- {
- url = 'https://drive.google.com/file/d/' + fileId + '/preview?authuser=0&' + nocache;
- }
-
- window.location.href = url;
- }
- }
- }
- };
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/ac.js b/src/main/webapp/connect/jira/ac.js
deleted file mode 100644
index 9a7db614..00000000
--- a/src/main/webapp/connect/jira/ac.js
+++ /dev/null
@@ -1,372 +0,0 @@
-var AC = {};
-
-AC.getUrlParam = function(param, escape, url){
- try{
- var url = url || window.location.search;
- var regex = new RegExp(param + '=([^&]+)'),
- data = regex.exec(url)[1];
- // decode URI with plus sign fix.
- return (escape) ? window.decodeURIComponent(data.replace(/\+/g, '%20')) : data;
- } catch (e){
- return '';
- }
-};
-
-AC.getMetaTag = function(name) {
- return document.getElementsByTagName('meta')[name].getAttribute('content');
-};
-
-AC.openEditor = function(baseUrl, issueId, diagramName)
-{
- var diagramXml = null;
- var link = document.createElement('a');
- link.href = location.href;
- link.href = link.href; //to have 'host' populated under IE
- var hostUrl = link.protocol + '//' + link.hostname;
-
- var lang = AC.getUrlParam['loc'];
-
- if (lang != null)
- {
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- lang = lang.substring(0, dash);
- }
- }
-
- var editor = $('<iframe id="editorFrame" frameborder="0" style="overflow:hidden;height:99.5%;width:100%" height="99%" width="100%">');
- editorUrl = hostUrl + '/?ui=atlas&p=acj&embed=1&modified=unsavedChanges&spin=1&proto=json' + ((lang != null) ? '&lang=' + lang : '');
- editorUrl += (hostUrl == "http://test.draw.io") ? '&https=0&dev=1' : '';
- editorUrl += '&issueId=' + issueId;
- editor.attr('src', editorUrl);
- editor.appendTo('body');
- editor = editor[0];
-
- var messageListener = function(evt)
- {
- if (typeof window.AC !== 'undefined' && evt.origin == hostUrl)
- {
- var drawMsg = JSON.parse(evt.data);
-
- if(drawMsg.event == 'init')
- {
- if(diagramName == null)
- editor.contentWindow.postMessage(JSON.stringify({action: 'load', xml: ''}), '*');
- else
- {
- AC.loadDiagram(issueId, diagramName,
- function(resp)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'load', xml: resp}), '*');
- },
- function(resp)
- {
- if(resp.status == 404)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', messageKey: 'fileNotFound', modified : false}), '*');
- }
- else
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', messageKey: 'errorLoadingFile', modified : false}), '*');
- }
- });
- }
- }
- else if (drawMsg.event == 'exit')
- {
- AP.require('dialog', function(dialog){
- dialog.close();
- });
- }
- else if (drawMsg.event == 'save')
- {
- // Maintains modified state while editor is open
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', modified: true}), '*');
- diagramXml = drawMsg.xml;
-
- var onSave = function()
- {
- AP.require(['jira', 'dialog'], function (jira, dialog) {
- jira.refreshIssuePage();
- dialog.close();
- });
- };
-
- var onError = function(resp)
- {
- // Post to save servlet to log the diagram XML
- var payload = {issueId : issueId, filename : diagramName, xml : diagramXml};
-
- $.ajax({
- url : "/connect/jira/save",
- type : "POST",
- contentType : "application/json; charset=UTF-8",
- data : JSON.stringify(payload)
- });
-
- var msgKey = null;
-
- if (resp.status != null && resp.status == 403)
- {
- msgKey = 'errorSavingFileForbidden';
- alert('Please see this article - https://support.draw.io/pages/viewpage.action?pageId=12877897');
- }
- else
- {
- msgKey = 'errorSavingFile';
- }
-
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', messageKey: msgKey, modified : true}), '*');
- };
-
- var onErrorNew = function(resp)
- {
- diagramName = null;
- onError(resp);
- }
-
- var askName = function(fileExists)
- {
- diagramName = prompt((fileExists) ? 'File exists! Please enter another name' : 'Please name your diagram', diagramName || '');
-
- if (diagramName != null)
- {
- if (diagramName.length < 3)
- {
- diagramName = null;
- alert('Invalid filename, filename too short');
- }
- else if (/[&\*+=\\;/{}|\":<>\?]/g.test(diagramName))
- {
- diagramName = null;
- alert('Invalid filename, remove special characters \\ / | : { } < > & + ? = ; * "');
- }
- else
- {
- AC.hasDiagram(issueId, diagramName, function(fileExists)
- {
- if (fileExists)
- {
- askName(true);
- }
- else
- {
- AC.saveDiagram(issueId, diagramName, diagramXml, onSave, onErrorNew);
- }
- });
- }
- }
- };
-
- if (diagramName == null)
- {
- askName(false);
- }
- else
- {
- AC.deleteDiagram(issueId, diagramName, function()
- {
- AC.saveDiagram(issueId, diagramName, diagramXml, onSave, onError);
- }, onError);
- }
- }
- /*else if (drawMsg.event == 'save')
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'export', format: 'xmlpng', spinKey: 'saving'}), '*');
- }*/
- }
- };
-
- window.addEventListener('message', messageListener);
-};
-
-AC.loadDiagram = function (issueId, diagramName, success, error)
-{
- function load(diagramId)
- {
- AP.require('request', function(request) {
- request({
- url: '/secure/attachment/' + diagramId + '/',
- success: success,
- error : error
- });
- });
- };
-
- AC.getDiagramId(issueId, diagramName, load, error);
-
-};
-
-AC.getDiagramId = function(issueId, diagramName, success, error)
-{
- AC.listDiagrams(issueId, function(diagrams)
- {
- var diagramId = null;
- for(var i=0; i< diagrams.length; i++)
- {
- if(diagrams[i].filename == diagramName)
- {
- diagramId = diagrams[i].id;
- break;
- }
- }
- success(diagramId);
-
- }, error);
-
-};
-
-AC.saveDiagram = function(issueId, diagramName, xml, success, error)
-{
- var blob = new Blob([xml], {type : 'application/drawio'});
- var file = new File([blob], diagramName, {type : 'application/drawio'});
-
- var headers = new Object();
- headers["X-Atlassian-Token"] = "nocheck";
-
- AP.require('request', function (request) {
- request({
- url: "/rest/api/2/issue/" + issueId + "/attachments",
- type: "POST",
- data: {file : file},
- contentType: "multipart/form-data",
- headers: headers,
- success: success,
- error : error
- });
- });
-};
-
-AC.deleteDiagram = function(issueId, diagramName, success, error)
-{
- //files creates via server are owned by the "addon_com.mxgraph.jira.plugins.drawio" user, so they can only be deleted by it
- deleteViaServer = function()
- {
- var payload = {clientKey : AC.getClientKey(), issueId : issueId, filename : diagramName};
- $.ajax({
- url : "/connect/jira/delete",
- type : "POST",
- contentType : "application/json; charset=UTF-8",
- data : JSON.stringify(payload),
- success : success,
- error : error
- });
- };
-
- deleteViaClient = function(attachmentId)
- {
- AP.require('request', function (request) {
- request({
- url: "/rest/api/2/attachment/" + attachmentId,
- type: "DELETE",
- success: success,
- error : error
- });
- });
- };
-
- doDelete = function(attachmentId)
- {
- getMetaSuccess = function(resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.author.key == "addon_com.mxgraph.jira.plugins.drawio")
- {
- deleteViaServer();
- }
- else
- {
- deleteViaClient(attachmentId);
-
- }
- };
-
- AC.getAttachmentMetaData(attachmentId, getMetaSuccess, error);
- }
-
- AC.getDiagramId(issueId, diagramName, doDelete, error);
-};
-
-AC.getAttachmentMetaData = function(attachmentId, success, error)
-{
- AP.require('request', function (request) {
- request({
- url: "/rest/api/2/attachment/" + attachmentId,
- type: "GET",
- success: success,
- error : error
- });
- });
-};
-
-AC.getUser = function(success, fail)
-{
- AP.require(['request'], function(request)
- {
- request({
- url: '/rest/api/2/myself/',
- type: 'GET',
- success: success,
- error: fail
- });
- });
-}
-
-/*
- * Lists attachments for a given issue
- */
-AC.listDiagrams = function(issueId, success, fail)
-{
- AP.require(['request'], function(request)
- {
- request({
- url: '/rest/api/2/issue/' + issueId + '?fields=attachment',
- type: 'GET',
- success: function(resp)
- {
- var respObj = JSON.parse(resp);
- var names = [];
- $.each(respObj.fields.attachment, function(index, value)
- {
- if(value.mimeType == 'application/drawio')
- names.push({filename : value.filename, id : value.id});
- });
- success(names);
- },
- error: fail
- });
- });
-};
-
-AC.hasDiagram = function(issueId, diagramName, success)
-{
- AC.listDiagrams(issueId, function(diagrams)
- {
- var hasDiagram = false;
- for(var i = 0; i < diagrams.length; i++)
- {
- if(diagrams[i].filename == diagramName)
- {
- hasDiagram = true;
- break;
- }
- }
-
- success(hasDiagram);
- },
- function()
- {
- console.log(arguments);
- });
-};
-
-AC.getClientKey = function()
-{
- jwt = AC.getUrlParam('jwt');
- jwtParts = jwt.split('.');
- claims = JSON.parse(atob(jwtParts[1]));
- return claims.iss;
-}; \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/connect-dev.json b/src/main/webapp/connect/jira/connect-dev.json
deleted file mode 100644
index fc0710d4..00000000
--- a/src/main/webapp/connect/jira/connect-dev.json
+++ /dev/null
@@ -1,232 +0,0 @@
-{
- "name": "draw.io gaudenz",
- "description": "draw.io add-on for Jira",
- "key": "com.mxgraph.jira.plugins.drawio",
- "baseUrl": "https://test.draw.io",
- "vendor": {
- "name": "JGraph Ltd.",
- "url": "https://www.jgraph.com"
- },
- "authentication":
- {
- "type": "none"
- },
- "version": "1.3.12",
- "scopes":
- [
- "READ",
- "WRITE",
- "DELETE"
- ],
- "modules":
- {
- "generalPages":
- [
- {
- "url":"/connect/jira/editor-1-3-3.html?issueId=${issue.id}",
- "key":"drawioEditor",
- "name":
- {
- "value":"draw.io Editor"
- },
- "location":"hidden"
- },
- {
- "url":"/connect/jira/fullScreenViewer-1-3-3.html?issueId=${issue.id}",
- "key":"drawioFullScreenViewer",
- "name":
- {
- "value":"draw.io Full Screen Viewer"
- },
- "location":"hidden"
- },
- {
- "url": "/connect/jira/embed.html?issueId=${issue.id}",
- "key": "embedDiagram",
- "name": {
- "value": "Embed draw.io diagram"
- },
- "location":"hidden"
- }
- ],
- "webItems": [
- {
- "location": "operations-attachments",
- "weight": 50,
- "key": "drawioEditorBlank",
- "url": "/connect/jira/editor-1-3-3.html?issueId=${issue.id}",
- "name": {
- "value": "Add draw.io diagram"
- },
- "target":
- {
- "type":"dialog",
- "options":
- {
- "width":"100%",
- "height":"100%",
- "chrome":false
- }
- }
- },
- {
- "location": "operations-attachments",
- "weight": 50,
- "key": "linkDiagram",
- "url": "/connect/jira/embed.html?issueId=${issue.id}",
- "name": {
- "value": "Embed draw.io diagram"
- },
- "target":
- {
- "type":"dialog",
- "options":
- {
- "width":"70%",
- "height":"70%",
- "chrome":true
- }
- }
- },
- {
- "key": "drawioEditorDialog",
- "name":
- {
- "value": "draw.io Editor"
- },
- "url": "/connect/jira/editor-1-3-3.html?issueId=${issue.id}",
- "location": "none",
- "context": "addon"
- },
- {
- "key": "drawioSearch",
- "location": "system.top.navigation.bar",
- "name": {
- "value": "draw.io Diagrams"
- },
- "url": "/connect/jira/search.html",
- "target":
- {
- "type":"dialog",
- "options":
- {
- "width":"100%",
- "height":"100%",
- "chrome":true
- }
- },
- "icon":
- {
- "width": 16,
- "height": 16,
- "url": "/images/drawlogo48.png"
- }
- }
- ],
- "webPanels":
- [
- {
- "url": "/connect/jira/viewerPanel-1-3-12.html?issueId=${issue.id}",
- "location": "atl.jira.view.issue.left.context",
- "layout":
- {
- "width": "300px"
- },
- "weight": 200,
- "key": "drawioViewerPanel",
- "name":
- {
- "value": "draw.io Diagrams"
- }
- }
- ],
- "jiraEntityProperties": [
- {
- "keyConfigurations": [
- {
- "extractions": [
- {
- "objectName": "name",
- "type": "text",
- "alias": "diagramName"
- },
- {
- "objectName": "txtContent",
- "type": "text",
- "alias": "diagramTextContent"
- },
- {
- "objectName": "updated",
- "type": "date",
- "alias": "diagramUpdatedDate"
- },
- {
- "objectName": "hasDiagram",
- "type": "number",
- "alias": "hasDiagram"
- }
- ],
- "propertyKey": "drawio-metadata"
- }
- ],
- "entityType": "issue",
- "name": {
- "value": "draw.io Diagrams Index"
- },
- "key": "drawio-entity-property"
- }
- ],
- "jiraIssueContents": [
- {
- "icon": {
- "width": 24,
- "height": 24,
- "url": "/images/drawlogo48.png"
- },
- "target": {
- "type": "web_panel",
- "url": "/connect/jira/viewerPanel-1-3-12.html?issueId=${issue.id}"
- },
- "tooltip": {
- "value": "Show draw.io Diagrams Panel"
- },
- "name": {
- "value": "draw.io Diagrams"
- },
- "key": "drawioViewerPanelNew"
- }
- ],
- "jiraIssueGlances": [
- {
- "icon": {
- "width": 24,
- "height": 24,
- "url": "/images/drawlogo48.png"
- },
- "content": {
- "type": "label",
- "label": {
- "value": "draw.io Diagrams"
- }
- },
- "target": {
- "type": "web_panel",
- "url": "/connect/jira/viewerPanel-1-3-12.html?issueId=${issue.id}&glance=1"
- },
- "name": {
- "value": "draw.io Diagrams"
- },
- "key": "drawioViewerGlance",
- "conditions": [
- {
- "condition": "entity_property_exists",
- "params": {
- "entity": "issue",
- "propertyKey": "drawio-metadata"
- }
- }
- ]
- }
- ]
- }
- } \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/connect.json b/src/main/webapp/connect/jira/connect.json
deleted file mode 100644
index 3ecafe59..00000000
--- a/src/main/webapp/connect/jira/connect.json
+++ /dev/null
@@ -1,236 +0,0 @@
-{
- "name": "draw.io",
- "description": "draw.io add-on for Jira",
- "key": "com.mxgraph.jira.plugins.drawio",
- "baseUrl": "https://jira.draw.io",
- "enableLicensing": true,
- "apiMigrations": {
- "gdpr": true
- },
- "vendor": {
- "name": "JGraph Ltd.",
- "url": "https://www.jgraph.com"
- },
- "authentication":
- {
- "type": "none"
- },
- "version": "1.3.12",
- "scopes":
- [
- "READ",
- "WRITE",
- "DELETE"
- ],
- "modules":
- {
- "generalPages":
- [
- {
- "url":"/connect/jira/editor-1-3-3.html?issueId=${issue.id}",
- "key":"drawioEditor",
- "name":
- {
- "value":"draw.io Editor"
- },
- "location":"hidden"
- },
- {
- "url":"/connect/jira/fullScreenViewer-1-3-3.html?issueId=${issue.id}",
- "key":"drawioFullScreenViewer",
- "name":
- {
- "value":"draw.io Full Screen Viewer"
- },
- "location":"hidden"
- },
- {
- "url": "/connect/jira/embed.html?issueId=${issue.id}",
- "key": "embedDiagram",
- "name": {
- "value": "Embed draw.io diagram"
- },
- "location":"hidden"
- }
- ],
- "webItems": [
- {
- "location": "operations-attachments",
- "weight": 50,
- "key": "drawioEditorBlank",
- "url": "/connect/jira/editor-1-3-3.html?issueId=${issue.id}",
- "name": {
- "value": "Add draw.io diagram"
- },
- "target":
- {
- "type":"dialog",
- "options":
- {
- "width":"100%",
- "height":"100%",
- "chrome":false
- }
- }
- },
- {
- "location": "operations-attachments",
- "weight": 50,
- "key": "linkDiagram",
- "url": "/connect/jira/embed.html?issueId=${issue.id}",
- "name": {
- "value": "Embed draw.io diagram"
- },
- "target":
- {
- "type":"dialog",
- "options":
- {
- "width":"70%",
- "height":"70%",
- "chrome":true
- }
- }
- },
- {
- "key": "drawioEditorDialog",
- "name":
- {
- "value": "draw.io Editor"
- },
- "url": "/connect/jira/editor-1-3-3.html?issueId=${issue.id}",
- "location": "none",
- "context": "addon"
- },
- {
- "key": "drawioSearch",
- "location": "system.top.navigation.bar",
- "name": {
- "value": "draw.io Diagrams"
- },
- "url": "/connect/jira/search.html",
- "target":
- {
- "type":"dialog",
- "options":
- {
- "width":"100%",
- "height":"100%",
- "chrome":true
- }
- },
- "icon":
- {
- "width": 16,
- "height": 16,
- "url": "/images/drawlogo48.png"
- }
- }
- ],
- "webPanels":
- [
- {
- "url": "/connect/jira/viewerPanel-1-3-12.html?issueId=${issue.id}",
- "location": "atl.jira.view.issue.left.context",
- "layout":
- {
- "width": "300px"
- },
- "weight": 200,
- "key": "drawioViewerPanel",
- "name":
- {
- "value": "draw.io Diagrams"
- }
- }
- ],
- "jiraEntityProperties": [
- {
- "keyConfigurations": [
- {
- "extractions": [
- {
- "objectName": "name",
- "type": "text",
- "alias": "diagramName"
- },
- {
- "objectName": "txtContent",
- "type": "text",
- "alias": "diagramTextContent"
- },
- {
- "objectName": "updated",
- "type": "date",
- "alias": "diagramUpdatedDate"
- },
- {
- "objectName": "hasDiagram",
- "type": "number",
- "alias": "hasDiagram"
- }
- ],
- "propertyKey": "drawio-metadata"
- }
- ],
- "entityType": "issue",
- "name": {
- "value": "draw.io Diagrams Index"
- },
- "key": "drawio-entity-property"
- }
- ],
- "jiraIssueContents": [
- {
- "icon": {
- "width": 24,
- "height": 24,
- "url": "/images/drawlogo48.png"
- },
- "target": {
- "type": "web_panel",
- "url": "/connect/jira/viewerPanel-1-3-12.html?issueId=${issue.id}"
- },
- "tooltip": {
- "value": "Show draw.io Diagrams Panel"
- },
- "name": {
- "value": "draw.io Diagrams"
- },
- "key": "drawioViewerPanelNew"
- }
- ],
- "jiraIssueGlances": [
- {
- "icon": {
- "width": 24,
- "height": 24,
- "url": "/images/drawlogo48.png"
- },
- "content": {
- "type": "label",
- "label": {
- "value": "draw.io Diagrams"
- }
- },
- "target": {
- "type": "web_panel",
- "url": "/connect/jira/viewerPanel-1-3-12.html?issueId=${issue.id}&glance=1"
- },
- "name": {
- "value": "draw.io Diagrams"
- },
- "key": "drawioViewerGlance",
- "conditions": [
- {
- "condition": "entity_property_exists",
- "params": {
- "entity": "issue",
- "propertyKey": "drawio-metadata"
- }
- }
- ]
- }
- ]
- }
- } \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/connectUtils-1-3-3.js b/src/main/webapp/connect/jira/connectUtils-1-3-3.js
deleted file mode 100644
index 98ea4e50..00000000
--- a/src/main/webapp/connect/jira/connectUtils-1-3-3.js
+++ /dev/null
@@ -1,363 +0,0 @@
-// Sets base path for mxgraph library
-if (typeof window.mxBasePath === 'undefined')
-{
- window.mxBasePath = '/mxgraph';
-}
-
-// Sets absolute path for proxy
-window.PROXY_URL = window.PROXY_URL || '/proxy';
-
-var AC = {};
-
-AC.getUrlParam = function(param, escape, url){
- try{
- var url = url || window.location.search;
- var regex = new RegExp(param + '=([^&]+)'),
- data = regex.exec(url)[1];
- // decode URI with plus sign fix.
- return (escape) ? window.decodeURIComponent(data.replace(/\+/g, '%20')) : data;
- } catch (e){
- return '';
- }
-};
-
-AC.getMetaTag = function(name) {
- return document.getElementsByTagName('meta')[name].getAttribute('content');
-};
-
-AC.openEditor = function(baseUrl, issueId, diagramName)
-{
- var diagramXml = null;
- var link = document.createElement('a');
- link.href = location.href;
- link.href = link.href; //to have 'host' populated under IE
- var hostUrl = link.protocol + '//' + link.hostname;
-
- var lang = AC.getUrlParam['loc'];
-
- if (lang != null)
- {
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- lang = lang.substring(0, dash);
- }
- }
-
- var editor = $('<iframe id="editorFrame" frameborder="0" style="overflow:hidden;height:99.5%;width:100%" height="99%" width="100%">');
- editorUrl = hostUrl + '/?ui=atlas&p=acj&embed=1&modified=unsavedChanges&spin=1&proto=json' + ((lang != null) ? '&lang=' + lang : '');
- editorUrl += (hostUrl == "http://test.draw.io") ? '&https=0&dev=1' : '';
- editorUrl += '&issueId=' + issueId;
- editor.attr('src', editorUrl);
- editor.appendTo('body');
- editor = editor[0];
-
- var messageListener = function(evt)
- {
- if (typeof window.AC !== 'undefined' && evt.origin == hostUrl)
- {
- var drawMsg = JSON.parse(evt.data);
-
- if(drawMsg.event == 'init')
- {
- if(diagramName == null)
- editor.contentWindow.postMessage(JSON.stringify({action: 'load', xml: ''}), '*');
- else
- {
- AC.loadDiagram(issueId, diagramName,
- function(resp)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'load', xml: resp}), '*');
- },
- function(resp)
- {
- if(resp.status == 404)
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', messageKey: 'fileNotFound', modified : false}), '*');
- }
- else
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', messageKey: 'errorLoadingFile', modified : false}), '*');
- }
- });
- }
- }
- else if (drawMsg.event == 'exit')
- {
- AP.dialog.close();
- }
- else if (drawMsg.event == 'save')
- {
- // Maintains modified state while editor is open
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', modified: true}), '*');
- diagramXml = drawMsg.xml;
-
- var onSave = function()
- {
- AP.jira.refreshIssuePage();
- AP.dialog.close();
- };
-
- var onError = function(resp)
- {
- // Post to save servlet to log the diagram XML
- var payload = {issueId : issueId, filename : diagramName, xml : diagramXml};
-
- $.ajax({
- url : "/connect/jira/save",
- type : "POST",
- contentType : "application/json; charset=UTF-8",
- data : JSON.stringify(payload)
- });
-
- var msgKey = null;
-
- if (resp.status != null && resp.status == 403)
- {
- msgKey = 'errorSavingFileForbidden';
- alert('Please see this article - https://support.draw.io/pages/viewpage.action?pageId=12877897');
- }
- else
- {
- msgKey = 'errorSavingFile';
- }
-
- editor.contentWindow.postMessage(JSON.stringify({action: 'status', messageKey: msgKey, modified : true}), '*');
- };
-
- var onErrorNew = function(resp)
- {
- diagramName = null;
- onError(resp);
- }
-
- var askName = function(fileExists)
- {
- diagramName = prompt((fileExists) ? 'File exists! Please enter another name' : 'Please name your diagram', diagramName || '');
-
- if (diagramName != null)
- {
- if (diagramName.length < 3)
- {
- diagramName = null;
- alert('Invalid filename, filename too short');
- }
- else if (/[&\*+=\\;/{}|\":<>\?]/g.test(diagramName))
- {
- diagramName = null;
- alert('Invalid filename, remove special characters \\ / | : { } < > & + ? = ; * "');
- }
- else
- {
- AC.hasDiagram(issueId, diagramName, function(fileExists)
- {
- if (fileExists)
- {
- askName(true);
- }
- else
- {
- AC.saveDiagram(issueId, diagramName, diagramXml, onSave, onErrorNew);
- }
- });
- }
- }
- };
-
- if (diagramName == null)
- {
- askName(false);
- }
- else
- {
- AC.deleteDiagram(issueId, diagramName, function()
- {
- AC.saveDiagram(issueId, diagramName, diagramXml, onSave, onError);
- }, onError);
- }
- }
- /*else if (drawMsg.event == 'save')
- {
- editor.contentWindow.postMessage(JSON.stringify({action: 'export', format: 'xmlpng', spinKey: 'saving'}), '*');
- }*/
- }
- };
-
- window.addEventListener('message', messageListener);
-};
-
-AC.loadDiagram = function (issueId, diagramName, success, error)
-{
- function load(diagramId)
- {
- AP.request({
- url: '/secure/attachment/' + diagramId + '/',
- success: success,
- error : error
- });
- };
-
- AC.getDiagramId(issueId, diagramName, load, error);
-
-};
-
-AC.getDiagramId = function(issueId, diagramName, success, error)
-{
- AC.listDiagrams(issueId, function(diagrams)
- {
- var diagramId = null;
- for(var i=0; i< diagrams.length; i++)
- {
- if(diagrams[i].filename == diagramName)
- {
- diagramId = diagrams[i].id;
- break;
- }
- }
- success(diagramId);
-
- }, error);
-
-};
-
-AC.saveDiagram = function(issueId, diagramName, xml, success, error)
-{
- var blob = new Blob([xml], {type : 'application/drawio'});
- var file = new File([blob], diagramName, {type : 'application/drawio'});
-
- var headers = new Object();
- headers["X-Atlassian-Token"] = "nocheck";
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/attachments",
- type: "POST",
- data: {file : file},
- contentType: "multipart/form-data",
- headers: headers,
- success: success,
- error : error
- });
-};
-
-AC.deleteDiagram = function(issueId, diagramName, success, error)
-{
- //files creates via server are owned by the "addon_com.mxgraph.jira.plugins.drawio" user, so they can only be deleted by it
- deleteViaServer = function()
- {
- var payload = {clientKey : AC.getClientKey(), issueId : issueId, filename : diagramName};
- $.ajax({
- url : "/connect/jira/delete",
- type : "POST",
- contentType : "application/json; charset=UTF-8",
- data : JSON.stringify(payload),
- success : success,
- error : error
- });
- };
-
- deleteViaClient = function(attachmentId)
- {
- AP.request({
- url: "/rest/api/2/attachment/" + attachmentId,
- type: "DELETE",
- success: success,
- error : error
- });
- };
-
- doDelete = function(attachmentId)
- {
- getMetaSuccess = function(resp)
- {
- resp = JSON.parse(resp);
-
- if (resp.author.key == "addon_com.mxgraph.jira.plugins.drawio")
- {
- deleteViaServer();
- }
- else
- {
- deleteViaClient(attachmentId);
-
- }
- };
-
- AC.getAttachmentMetaData(attachmentId, getMetaSuccess, error);
- }
-
- AC.getDiagramId(issueId, diagramName, doDelete, error);
-};
-
-AC.getAttachmentMetaData = function(attachmentId, success, error)
-{
- AP.request({
- url: "/rest/api/2/attachment/" + attachmentId,
- type: "GET",
- success: success,
- error : error
- });
-};
-
-AC.getUser = function(success, fail)
-{
- AP.request({
- url: '/rest/api/2/myself/',
- type: 'GET',
- success: success,
- error: fail
- });
-}
-
-/*
- * Lists attachments for a given issue
- */
-AC.listDiagrams = function(issueId, success, fail)
-{
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '?fields=attachment',
- type: 'GET',
- success: function(resp)
- {
- var respObj = JSON.parse(resp);
- var names = [];
- $.each(respObj.fields.attachment, function(index, value)
- {
- if(value.mimeType == 'application/drawio')
- names.push({filename : value.filename, id : value.id});
- });
- success(names);
- },
- error: fail
- });
-};
-
-AC.hasDiagram = function(issueId, diagramName, success)
-{
- AC.listDiagrams(issueId, function(diagrams)
- {
- var hasDiagram = false;
- for(var i = 0; i < diagrams.length; i++)
- {
- if(diagrams[i].filename == diagramName)
- {
- hasDiagram = true;
- break;
- }
- }
-
- success(hasDiagram);
- },
- function()
- {
- console.log(arguments);
- });
-};
-
-AC.getClientKey = function()
-{
- jwt = AC.getUrlParam('jwt');
- jwtParts = jwt.split('.');
- claims = JSON.parse(atob(jwtParts[1]));
- return claims.iss;
-}; \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/editor-1-3-3.html b/src/main/webapp/connect/jira/editor-1-3-3.html
deleted file mode 100644
index cfd8f782..00000000
--- a/src/main/webapp/connect/jira/editor-1-3-3.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Editor</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/logo-flat.png);
- background-repeat:no-repeat;
- background-position:center;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-iframe {
- border:0;
- position:fixed;
- top:0;
- left:0;
- right:0;
- bottom:0;
- width:100%;
- height:100%;
-}
-</style>
-</head>
-<body>
-<script src="editor.js" type="text/javascript"></script>
-</body>
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/editor.js b/src/main/webapp/connect/jira/editor.js
deleted file mode 100644
index 036a09f0..00000000
--- a/src/main/webapp/connect/jira/editor.js
+++ /dev/null
@@ -1,618 +0,0 @@
-(function()
-{
- // Parses URL parameters
- function getUrlParam(param)
- {
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
- };
-
- function getBaseUrl()
- {
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
- };
-
- // Overrides browser language with Confluence user language
- var lang = getUrlParam('loc');
-
- // Language is in the Connect URL
- if (lang != null)
- {
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- lang = lang.substring(0, dash);
- }
- }
-
- var AC = {};
-
- // Specifies connection mode for touch devices (at least one should be true)
- var connectUrl = getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName("head")[0];
-
- var script = document.createElement('script');
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- script.onload = main;
- head.appendChild(script);
-
- var link = document.createElement('link');
- link.type = 'text/css';
- link.rel = 'stylesheet';
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- // Gets current domain and protocol
- var link2 = document.createElement('a');
- link2.href = location.href;
- link2.href = link2.href; //to have 'host' populated under IE
- var editorHost = link2.protocol + '//' + link2.hostname;
- var editorUrl = editorHost + '/?embed=1&p=acj&modified=unsavedChanges&keepmodified=1&spin=1&ui=atlas&proto=json&libraries=1&lang=' + lang;
-
- // Injects iframe into page
- var iframe = document.createElement('iframe');
- iframe.setAttribute('frameborder', '0');
-
- var initReceived = false;
- var startCalled = false;
- var xmlReceived = null;
- var filename = null;
- var diagInfo = null;
- var timeout = 25000;
-
- function startEditor()
- {
- // InitReceived is usually last (iframe loads slower than data)
- if (initReceived && xmlReceived != null && !startCalled)
- {
- startCalled = true;
-
- // Shows template dialog if diagram is empty
- if (xmlReceived == '')
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'template'}), '*');
- }
- else
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'load',
- xml: xmlReceived, title: filename, diagInfo: diagInfo}), '*');
- }
- }
- };
-
- window.addEventListener('message', function(evt)
- {
- if (evt.origin == editorHost)
- {
- var msg = JSON.parse(evt.data);
-
- if (msg.event == 'init')
- {
- document.body.style.backgroundImage = 'none';
- initReceived = true;
- startEditor();
- }
- }
- });
-
- iframe.setAttribute('src', editorUrl);
- document.body.appendChild(iframe);
-
- function main()
- {
- var issueId = getUrlParam('issueId');
-
- AP.resize('100%', '100%');
-
- //keeping the block of AP.require to minimize the number of changes!
- function doMain(customData)
- {
- var serverName = getBaseUrl();
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- // LATER: Add fallback diagramName lookup via attachment list if name is unique
- var diagramId = (customData != null) ? customData.diagramId : null;
- var diagramName = (customData != null) ? customData.diagramName : null;
- diagInfo = (customData != null) ? customData.diagInfo : {};
-
- if (!issueId && customData != null)
- {
- issueId = customData.issueId;
- }
-
- function error(err, modified)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
- var obj = err.responseText? JSON.parse(err.responseText) : null;
- iframe.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: obj? obj.errorMessages[0] : ("Unknown Error " + err.status),
- modified: modified, buttonKey: 'close'}), '*');
- };
-
- function done(newDiagramId)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'textContent', diagramId: newDiagramId}), '*');
- };
-
- function saveDiagram(xml, insert)
- {
- try
- {
- var blob = new Blob([xml], {type: 'application/drawio'});
- blob.name = diagramName;
-
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- messageKey: (insert) ? 'inserting' : 'saving'}), '*');
-
- // LATER: Update existing attachment if rest call available
- AP.request(
- {
- url: '/rest/api/2/issue/' + issueId + '/attachments',
- type: 'POST',
- //data: formData,
- data: {file: blob},
- contentType: 'multipart/form-data',
- headers: {'X-Atlassian-Token': 'no-check'},
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var newId = resp[0].id;
- if (insert)
- {
- done(newId);
- }
- else
- {
- // Deletes previous diagram
- AP.request({
- url: '/rest/api/2/attachment/' + diagramId,
- type: 'DELETE',
- success: function ()
- {
- done(newId);
- },
- error: function(err)
- {
- // Error deleting last version means concurrent save
- // in which case a copy of the attachment is created
- // or server-side flow was used, in which case a
- // manual delete of the attachment is required.
- done(newId);
- }
- });
- }
- },
- error: function(err)
- {
- error(err, true);
- }
- });
- }
- catch (e)
- {
- error({responseText: JSON.stringify({errorMessages: [e.message]})}, true);
- }
- };
-
- var closeDialog = function()
- {
- AP.jira.refreshIssuePage();
- AP.dialog.close();
- };
-
- var saveContentSearchBody = function(issueId, diagramName, diagramId, textContent, success, error)
- {
- var emptyInfo = {name: [], txtContent: [], updated: [], id: [], other: []};
- var diagramsInfo = emptyInfo;
-
- if (diagInfo == null)
- {
- diagInfo = {};
- }
-
- diagInfo.aspect = AC.aspect;
-
- var updateInfo = function(resp)
- {
- if (!resp.status) //no error
- {
- resp = JSON.parse(resp);
- diagramsInfo = resp.value;
-
- if (diagramsInfo.other == null)
- {
- diagramsInfo.other = [];
- }
- }
-
- var updated = false;
- try
- {
- for (var i = 0; i < diagramsInfo.name.length; i++)
- {
- if (diagramName == diagramsInfo.name[i])
- {
- diagramsInfo.txtContent[i] = textContent;
- diagramsInfo.updated[i] = new Date();
- diagramsInfo.id[i] = diagramId;
- diagramsInfo.other[i] = diagInfo;
- updated = true;
- break;
- }
- }
- }
- catch(e)
- {
- //Error in the format, so reset
- diagramsInfo = emptyInfo;
- }
-
- if (!updated)
- {
- diagramsInfo.name.push(diagramName);
- diagramsInfo.txtContent.push(textContent);
- diagramsInfo.updated.push(new Date());
- diagramsInfo.id.push(diagramId);
- diagramsInfo.other.push(diagInfo);
- }
-
- diagramsInfo.hasDiagram = 1;
-
- //Glance counter properties
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/com.atlassian.jira.issue:com.mxgraph.jira.plugins.drawio:drawioViewerGlance:status",
- type: "PUT",
- data: JSON.stringify({ type: 'badge', value: { label: String(diagramsInfo.id.length +
- (diagramsInfo.embeddedDiagrams != null? diagramsInfo.embeddedDiagrams.length : 0)) } }),
- contentType: "application/json"
- });
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "PUT",
- data: JSON.stringify(diagramsInfo),
- contentType: "application/json",
- success: success,
- error : error
- });
- };
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "GET",
- success: updateInfo,
- error : updateInfo
- });
- };
-
- function sendRemoteInvReady()
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'remoteInvokeReady'}), '*');
- AC.remoteWin = iframe.contentWindow;
- };
-
- AC.setAspect = function(aspect, success, error)
- {
- AC.aspect = aspect;
- };
-
- //White-listed functions and some info about it
- AC.remoteInvokableFns = {
- setAspect: {isAsync: false}
- };
-
- //TODO This should be abstracted and handled in one place (currently it is copied from Conf Cloud)
- function handleRemoteInvoke(msg)
- {
- function sendResponse(resp, error)
- {
- var respMsg = {action: 'remoteInvokeResponse', msgMarkers: msg.msgMarkers};
-
- if (error != null)
- {
- respMsg.error = {errResp: error};
- }
- else if (resp != null)
- {
- respMsg.resp = resp;
- }
-
- AC.remoteWin.postMessage(JSON.stringify(respMsg), '*');
- }
-
- try
- {
- //Remote invoke are allowed to call functions in AC
- var funtionName = msg.funtionName;
- var functionInfo = AC.remoteInvokableFns[funtionName];
-
- if (functionInfo != null && typeof AC[funtionName] === 'function')
- {
- var functionArgs = msg.functionArgs;
-
- //Confirm functionArgs are not null and is array, otherwise, discard it
- if (!Array.isArray(functionArgs))
- {
- functionArgs = [];
- }
-
- //for functions with callbacks (async) we assume last two arguments are success, error
- if (functionInfo.isAsync)
- {
- //success
- functionArgs.push(function()
- {
- sendResponse(Array.prototype.slice.apply(arguments));
- });
-
- //error
- functionArgs.push(function(err)
- {
- sendResponse(null, err || mxResources.get('unknownError'));
- });
-
- AC[funtionName].apply(this, functionArgs);
- }
- else
- {
- var resp = AC[funtionName].apply(this, functionArgs);
-
- sendResponse([resp]);
- }
- }
- else
- {
- sendResponse(null, mxResources.get('invalidCallFnNotFound', [funtionName]));
- }
- }
- catch(e)
- {
- sendResponse(null, mxResources.get('invalidCallErrOccured', [e.message]));
- }
- };
-
- // Creates a new diagram
- if (diagramName == null)
- {
- xmlReceived = '';
- startEditor();
- filename = null;
-
- function promptName(name, err, errKey)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'prompt',
- titleKey: 'filename', okKey: 'save', defaultValue: name || '' }), '*');
-
- if (err != null || errKey != null)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: err, messageKey: errKey,
- buttonKey: 'ok'}), '*');
- }
- };
-
- function checkName(name, fn, err)
- {
- if (name == null || name.length < 3)
- {
- err(name, 'Filename too short');
- }
- else if (/[&\*+=\\;/{}|\":<>\?~]/g.test(name))
- {
- err(name, 'Invalid characters \\ / | : { } < > & + ? = ; * " ~');
- }
- else
- {
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '?fields=attachment',
- type: 'GET',
- success: function(resp)
- {
- var respObj = JSON.parse(resp);
-
- for (var i = 0; i < respObj.fields.attachment.length; i++)
- {
- var attachment = respObj.fields.attachment[i];
-
- if (attachment.filename == name)
- {
- err(name, null, 'fileExists');
-
- return;
- }
- }
-
- fn(name);
- },
- error: function(res)
- {
- var msg = (res.responseText != null && res.responseText) ?
- res.responseText : res.statusText;
-
- try
- {
- var tmp = JSON.parse(msg);
-
- if (tmp != null && tmp.errorMessages != null &&
- tmp.errorMessages.length > 0)
- {
- msg = tmp.errorMessages[0];
- }
- }
- catch (e)
- {
- // ignore
- }
-
- err(name, msg);
- }
- });
- }
- };
-
- var currentXml = null;
-
- window.addEventListener('message', function(evt)
- {
- if (evt.origin == editorHost)
- {
- var msg = JSON.parse(evt.data);
-
- if (msg.event == 'save')
- {
- currentXml = msg.xml;
-
- if (diagramName != null)
- {
- saveDiagram(msg.xml, true);
- }
- else
- {
- promptName('');
- }
- }
- else if (msg.event == 'prompt')
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: true, messageKey: 'inserting'}), '*');
-
- checkName(msg.value, function(name)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- diagramName = name;
- saveDiagram(currentXml, true);
- },
- function(name, err, errKey)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- promptName(name, err, errKey);
- });
- }
- else if (msg.event == 'exit')
- {
- AP.dialog.close();
- }
- else if (msg.event == 'textContent')
- {
- saveContentSearchBody(issueId, diagramName, msg.message.diagramId, msg.data,
- closeDialog, closeDialog); //ignore error and just exit
- }
- else if (msg.event == 'remoteInvoke')
- {
- handleRemoteInvoke(msg);
- }
- }
- });
-
- sendRemoteInvReady();
- }
- else
- {
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
-
- var flag = AP.flag.create({
- title: 'The connection has timed out',
- body: 'The server at ' +
- serverName + ' is taking too long to respond.',
- type: 'error',
- close: 'manual'
- });
-
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
- //messages.onClose(message, function()
- //{
- AP.dialog.close();
- //});
- }, timeout);
-
- AP.request({
- url: '/secure/attachment/' + diagramId + '/',
- success: function(xml)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- filename = diagramName;
- xmlReceived = xml;
- startEditor();
-
- window.addEventListener('message', function(evt)
- {
- if (evt.origin == editorHost)
- {
- var msg = JSON.parse(evt.data);
-
- if (msg.event == 'save')
- {
- saveDiagram(msg.xml, false);
- }
- else if (msg.event == 'exit')
- {
- AP.dialog.close();
- }
- //TODO Merge message event listener into one only!
- else if (msg.event == 'textContent')
- {
- saveContentSearchBody(issueId, diagramName, msg.message.diagramId, msg.data,
- closeDialog, closeDialog); //ignore error and just exit
- }
- else if (msg.event == 'remoteInvoke')
- {
- handleRemoteInvoke(msg);
- }
- }
- });
-
- sendRemoteInvReady();
- }
- },
- error: function()
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- closeDialog();
- }
- }
- });
- }
- };
- AP.dialog.getCustomData(doMain);
- };
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/editor2.html b/src/main/webapp/connect/jira/editor2.html
deleted file mode 100644
index b346d11f..00000000
--- a/src/main/webapp/connect/jira/editor2.html
+++ /dev/null
@@ -1,427 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Draw.io Editor</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/logo-flat.png);
- background-repeat:no-repeat;
- background-position:center;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-iframe {
- border:0;
- position:fixed;
- top:0;
- left:0;
- right:0;
- bottom:0;
- width:100%;
- height:100%;
-}
-</style>
-</head>
-<body>
-<script type="text/javascript">
-(function()
-{
- // Parses URL parameters
- function getUrlParam(param)
- {
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
- };
-
- function getBaseUrl()
- {
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
- };
-
- // Overrides browser language with Confluence user language
- var lang = getUrlParam('loc');
-
- // Language is in the Connect URL
- if (lang != null)
- {
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- lang = lang.substring(0, dash);
- }
- }
-
- // Specifies connection mode for touch devices (at least one should be true)
- var connectUrl = getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName("head")[0];
-
- var script = document.createElement('script');
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- script.onload = main;
- head.appendChild(script);
-
- var link = document.createElement('link');
- link.type = 'text/css';
- link.rel = 'stylesheet';
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- // Gets current domain and protocol
- var link2 = document.createElement('a');
- link2.href = location.href;
- link2.href = link2.href; //to have 'host' populated under IE
- var editorHost = link2.protocol + '//' + link2.hostname;
- var editorUrl = editorHost + '/?embed=1&p=acj&modified=unsavedChanges&keepmodified=1&spin=1&ui=atlas&proto=json&libraries=1&lang=' + lang;
-
- // Injects iframe into page
- var iframe = document.createElement('iframe');
- iframe.setAttribute('frameborder', '0');
-
- var initReceived = false;
- var xmlReceived = null;
- var filename = null;
- var timeout = 25000;
-
- function startEditor()
- {
- // InitReceived is usually last (iframe loads slower than data)
- if (initReceived && xmlReceived != null)
- {
- // Shows template dialog if diagram is empty
- if (xmlReceived == '')
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'template'}), '*');
- }
- else
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'load',
- xml: xmlReceived, title: filename}), '*');
- }
- }
- };
-
- window.addEventListener('message', function(evt)
- {
- if (evt.origin == editorHost)
- {
- var msg = JSON.parse(evt.data);
-
- if (msg.event == 'init')
- {
- document.body.style.backgroundImage = 'none';
- initReceived = true;
- startEditor();
- }
- }
- });
-
- iframe.setAttribute('src', editorUrl);
- document.body.appendChild(iframe);
-
- function main()
- {
- var issueId = getUrlParam('issueId');
-
- AP.sizeToParent(true);
- AP.require(['dialog', 'request', 'jira', 'messages'], function(dialog, request, jira, messages)
- {
- var serverName = document.referrer;
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- // LATER: Add fallback diagramName lookup via attachment list if name is unique
- var diagramId = (dialog.customData != null) ? dialog.customData.diagramId : null;
- var diagramName = (dialog.customData != null) ? dialog.customData.diagramName : null;
-
- function error(err, modified)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
- var obj = JSON.parse(err.responseText);
- iframe.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: obj.errorMessages[0],
- modified: modified, buttonKey: 'close'}), '*');
- };
-
- function done(arg)
- {
- jira.refreshIssuePage();
- dialog.close();
- };
-
- function saveDiagram(xml, insert)
- {
- try
- {
- var blob = new Blob([xml], {type: 'application/drawio'});
- blob.name = diagramName;
-
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- messageKey: (insert) ? 'inserting' : 'saving'}), '*');
-
- // LATER: Update existing attachment if rest call available
- request(
- {
- url: '/rest/api/2/issue/' + issueId + '/attachments',
- type: 'POST',
- //data: formData,
- data: {file: blob},
- contentType: 'multipart/form-data',
- headers: {'X-Atlassian-Token': 'no-check'},
- success: function()
- {
- if (insert)
- {
- done();
- }
- else
- {
- // Deletes previous diagram
- request({
- url: '/rest/api/2/attachment/' + diagramId,
- type: 'DELETE',
- success: done,
- error: function(err)
- {
- // Error deleting last version means concurrent save
- // in which case a copy of the attachment is created
- // or server-side flow was used, in which case a
- // manual delete of the attachment is required.
- done();
- }
- });
- }
- },
- error: function(err)
- {
- error(err, true);
- }
- });
- }
- catch (e)
- {
- error({responseText: JSON.stringify({errorMessages: [e.message]})}, true);
- }
- };
-
- // Creates a new diagram
- if (diagramName == null)
- {
- xmlReceived = '';
- filename = null;
-
- function promptName(name, err, errKey)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'prompt',
- titleKey: 'filename', okKey: 'save', defaultValue: name || '' }), '*');
-
- if (err != null || errKey != null)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'dialog',
- titleKey: 'error', message: err, messageKey: errKey,
- buttonKey: 'ok'}), '*');
- }
- };
-
- function checkName(name, fn, err)
- {
- if (name == null || name.length < 3)
- {
- err(name, 'Filename too short');
- }
- else if (/[&\*+=\\;/{}|\":<>\?~]/g.test(name))
- {
- err(name, 'Invalid characters \\ / | : { } < > & + ? = ; * " ~');
- }
- else
- {
- request({
- url: '/rest/api/2/issue/' + issueId + '?fields=attachment',
- type: 'GET',
- success: function(resp)
- {
- var respObj = JSON.parse(resp);
-
- for (var i = 0; i < respObj.fields.attachment.length; i++)
- {
- var attachment = respObj.fields.attachment[i];
-
- if (attachment.filename == name)
- {
- err(name, null, 'fileExists');
-
- return;
- }
- }
-
- fn(name);
- },
- error: function(res)
- {
- var msg = (res.responseText != null && res.responseText) ?
- res.responseText : res.statusText;
-
- try
- {
- var tmp = JSON.parse(msg);
-
- if (tmp != null && tmp.errorMessages != null &&
- tmp.errorMessages.length > 0)
- {
- msg = tmp.errorMessages[0];
- }
- }
- catch (e)
- {
- // ignore
- }
-
- err(name, msg);
- }
- });
- }
- };
-
- var currentXml = null;
-
- window.addEventListener('message', function(evt)
- {
- if (evt.origin == editorHost)
- {
- var msg = JSON.parse(evt.data);
-
- if (msg.event == 'save')
- {
- currentXml = msg.xml;
-
- if (diagramName != null)
- {
- saveDiagram(msg.xml, true);
- }
- else
- {
- promptName('');
- }
- }
- else if (msg.event == 'prompt')
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: true, messageKey: 'inserting'}), '*');
-
- checkName(msg.value, function(name)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- diagramName = name;
- saveDiagram(currentXml, true);
- },
- function(name, err, errKey)
- {
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner',
- show: false}), '*');
- promptName(name, err, errKey);
- });
- }
- else if (msg.event == 'exit')
- {
- dialog.close();
- }
- }
- });
- }
- else
- {
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
- var message = messages.error('The connection has timed out', 'The server at ' +
- serverName + ' is taking too long to respond.');
-
- messages.onClose(message, function()
- {
- dialog.close();
- });
-
- iframe.contentWindow.postMessage(JSON.stringify({action: 'spinner', show: false}), '*');
- }, timeout);
-
- request({
- url: '/secure/attachment/' + diagramId + '/'),
- success: function(xml)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- filename = diagramName;
- xmlReceived = xml;
- startEditor();
-
- window.addEventListener('message', function(evt)
- {
- if (evt.origin == editorHost)
- {
- var msg = JSON.parse(evt.data);
-
- if (msg.event == 'save')
- {
- saveDiagram(msg.xml, false);
- }
- else if (msg.event == 'exit')
- {
- dialog.close();
- }
- }
- });
- }
- },
- error: function()
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- done();
- }
- }
- });
- }
- });
- };
-})();
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/embed.html b/src/main/webapp/connect/jira/embed.html
deleted file mode 100644
index 589bdfd7..00000000
--- a/src/main/webapp/connect/jira/embed.html
+++ /dev/null
@@ -1,264 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Embed draw.io Diagram</title>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script type="text/javascript" src="/js/viewer-static.min.js"></script>
-<script src="../onedrive_common/editor.js" type="text/javascript"></script>
-<script src="../gdrive_common/editor.js" type="text/javascript"></script>
-<script src="../att_common/att-editor.js" type="text/javascript"></script>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.9.12/css/aui.min.css" media="all">
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
-}
-
-/* Style the tab */
-.tab {
- overflow: hidden;
- border: 1px solid #ccc;
- background-color: #f1f1f1;
-}
-
-/* Style the buttons that are used to open the tab content */
-.tab button {
- background-color: inherit;
- float: left;
- border: none;
- outline: none;
- cursor: pointer;
- padding: 14px 16px;
- transition: 0.3s;
-}
-
-/* Change background color of buttons on hover */
-.tab button:hover {
- background-color: #ddd;
-}
-
-/* Create an active/current tablink class */
-.tab button.active {
- background-color: #ccc;
-}
-
-/* Style the tab content */
-.tabcontent {
- position:absolute;
- width: 100%;
- top:45px;
- bottom:0px;
- box-sizing: border-box;
- display: none;
- padding: 6px 12px;
- border: 1px solid #ccc;
- border-top: none;
- animation: fadeEffect 1s; /* Fading effect takes 1 second */
-}
-
-/* Go from zero to full opacity */
-@keyframes fadeEffect {
- from {opacity: 0;}
- to {opacity: 1;}
-}
-
-.diagram {
- border:1px solid #ddd;
- display:inline-block;
- vertical-align:top;
- border-radius:3px;
- overflow:hidden;
- font-size:14pt;
- cursor:pointer;
- margin:5px;
-}
-
-#errorMsg {
- position:absolute;
- bottom:10px;
- left:0px;
- right:0px;
- text-align:center;
- overflow:hidden;
- color:red;
- opacity: 0;
- transition: opacity 1s;
-}
-
-#errorMsg.fade {
- opacity: 1;
-}
-</style>
-</head>
-<body>
- <!-- Tab links -->
- <div class="tab">
- <button id="uploadTab" class="tablinks" data-tabContetn="upload">Upload</button>
- <button id="gDriveTab" class="tablinks" data-tabContetn="gDrive">Google Drive</button>
- <button id="oneDriveTab" class="tablinks" data-tabContetn="oneDrive">OneDrive</button>
- <button id="extUrlTab" class="tablinks" data-tabContetn="extUrl">From URL</button>
- </div>
-
- <!-- Tab content -->
- <div id="gDrive" class="tabcontent" style="padding: 0;">
- <div style="bottom:0;width:350px;border-right:1px solid #cccccc;position:absolute;top:0px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filename">File name</label>
- <input class="text macro-param-input" type="text" id="filenameGD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerGD" disabled>Choose</button>
- <div id="spinner-containerGD"></div>
- <div class="description">Google Drive file name</div>
- <div class="error" id="filenameErrorGD"></div>
- </div>
- <div style="display: none">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthGD">Width</label> <input class="text medium-field" id="widthGD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorGD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightGD">Height</label> <input class="text medium-field" id="heightGD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorGD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeGD" type="checkbox" >
- <label for="autoSizeGD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- <div class="field-group" style="padding-left:15px">
- <label for="thumbImg">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImgGD">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawioGD">
- <label for="useDrawio" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </div>
- <a id="signoutGD" style="position: absolute;bottom: 2px;right: 5px;font-size: 11px;cursor: pointer;" onclick="javascript:void(0);">Sign Out</a>
- </form>
- </div>
- <div id="previewGD" style="bottom:0;left:351px;position:absolute;top:0px;right:0px;display:inline-block;">
- <a id="gdAnchor" style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer">Choose a file...</a>
- </div>
- </div>
-
- <div id="oneDrive" class="tabcontent" style="padding: 0;">
- <div style="bottom:0;width:350px;border-right:1px solid #cccccc;position:absolute;top:0px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filenameOD">File name</label>
- <input class="text macro-param-input" type="text" id="filenameOD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerOD" disabled>Choose</button>
- <div id="spinner-containerOD"></div>
- <div class="description">OneDrive file name</div>
- <div class="error" id="filenameErrorOD"></div>
- </div>
- <div style="display: none">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthOD">Width</label> <input class="text medium-field" id="widthOD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorOD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightOD">Height</label> <input class="text medium-field" id="heightOD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorOD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeOD" type="checkbox" >
- <label for="autoSizeOD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- <div class="field-group" style="padding-left:15px">
- <label for="thumbImgOD">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImgOD">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawioOD">
- <label for="useDrawioOD" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </div>
- <a id="signoutOD" style="position: absolute;bottom: 2px;right: 5px;font-size: 11px;cursor: pointer;">Sign Out</a>
- </form>
- </div>
- <div id="previewOD" style="bottom:0;left:351px;position:absolute;top:0px;right:0px;display:inline-block;">
- <a id="odAnchor" style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer">Choose a file...</a>
- </div>
- </div>
-
- <div id="upload" class="tabcontent" style="padding: 0;">
- <div style="bottom:0;width:350px;border-right:1px solid #cccccc;position:absolute;top:0px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filenameUD">File name</label>
- <input type="file" id="fileuploadUD" style="display: none">
- <input class="text macro-param-input" type="text" id="filenameUD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerUD">Choose</button>
- <div id="spinner-containerUD"></div>
- <div class="description">Diagram file name</div>
- <div class="error" id="filenameErrorUD"></div>
- </div>
- <div style="display: none">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthUD">Width</label> <input class="text medium-field" id="widthUD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorUD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightUD">Height</label> <input class="text medium-field" id="heightUD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorUD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeUD" type="checkbox" >
- <label for="autoSizeUD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- </div>
- <div class="error" id="errorMsgUD">
- </div>
- </form>
- </div>
- <div id="previewUD" style="bottom:0;left:351px;position:absolute;top:0px;right:0px;display:inline-block;text-align: center;">
- <a id="fileUploadAnchor" style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer">Choose a file...</a>
- </div>
- </div>
-
- <div id="extUrl" class="tabcontent" style="padding: 0;">
- <div style="bottom:0;width:350px;border-right:1px solid #cccccc;position:absolute;top:0px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="diagramName">Diagram Name</label>
- <input class="text macro-param-input" id="diagramName" value="" placeholder="Diagram Name">
- <div class="description">Choose a diagram name</div>
- <div class="error" id="diagramNameError"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="diagramUrl">Diagram URL</label>
- <input class="text medium-field" id="diagramUrl" value="" placeholder="Diagram URL" style="max-width: 325px;">
- <div class="description">Diagram URL on the web</div>
- <div class="error" id="diagramUrlError"></div>
- <button class="aui-button aui-button-primary ap-dialog-submit" id="showDiagBtn" style="float: right; margin-right: 10px;">Show Diagram</button>
- </div>
- </form>
- </div>
- <div id="previewEU" style="bottom:0;left:351px;position:absolute;top:0px;right:0px;display:inline-block;">
- <a id="extUrlAnchor" style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer">Enter Diagram URL</a>
- </div>
- </div>
-
- <div id="errorMsg">
- Please select a diagram to insert it.
- </div>
-
- <script src="embedDiagram-1-3-12.js" type="text/javascript"></script>
-</html>
diff --git a/src/main/webapp/connect/jira/embedDiagram-1-3-12.js b/src/main/webapp/connect/jira/embedDiagram-1-3-12.js
deleted file mode 100644
index e101e398..00000000
--- a/src/main/webapp/connect/jira/embedDiagram-1-3-12.js
+++ /dev/null
@@ -1,516 +0,0 @@
-function embedDiagramMain()
-{
- var selectedDiagramInfo = null;
- var selectedElt = null;
- var activeTab = 'upload';
- var issueId = getUrlParam('issueId');
- var attEditor, odEditor = null, gdEditor = null;
- var curViewer = null;
- var lastDiagramUrl = null;
-
- var opts =
- {
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
-
- function htmlEntities(s, newline)
- {
- s = String(s || '');
-
- s = s.replace(/&/g,'&amp;'); // 38 26
- s = s.replace(/"/g,'&quot;'); // 34 22
- s = s.replace(/\'/g,'&#39;'); // 39 27
- s = s.replace(/</g,'&lt;'); // 60 3C
- s = s.replace(/>/g,'&gt;'); // 62 3E
-
- if (newline == null || newline)
- {
- s = s.replace(/\n/g, '&#xa;');
- }
-
- return s;
- };
-
- function showError(msg)
- {
- var errorMsg = document.getElementById("errorMsg");
- errorMsg.innerHTML = AC.htmlEntities(msg);
- errorMsg.className = "fade";
- setTimeout(function()
- {
- errorMsg.className = "";
- }, 5000);
- };
-
- function doSubmit(newDiag, fileContent, fileModifiedTS)
- {
- var updateInfo = function(resp)
- {
- var diagramsInfo = {name: [], txtContent: [], updated: [], id: []};
-
- if (!resp.status) //no error
- {
- resp = JSON.parse(resp);
- diagramsInfo = resp.value;
- }
-
- if (diagramsInfo.embeddedDiagrams != null)
- {
- diagramsInfo.embeddedDiagrams.push(newDiag);
- }
- else
- {
- diagramsInfo.embeddedDiagrams = [newDiag];
- }
-
- diagramsInfo.hasDiagram = 1;
-
- //Glance counter properties
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/com.atlassian.jira.issue:com.mxgraph.jira.plugins.drawio:drawioViewerGlance:status",
- type: "PUT",
- data: JSON.stringify({ type: 'badge', value: { label: String((diagramsInfo.id? diagramsInfo.id.length : 0) + diagramsInfo.embeddedDiagrams.length) } }),
- contentType: "application/json"
- });
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "PUT",
- data: JSON.stringify(diagramsInfo),
- contentType: "application/json",
- success: function()
- {
- AP.jira.refreshIssuePage();
- AP.dialog.close();
- },
- error : function()
- {
- showError('Error occured during saving, please try again later.');
- }
- });
- };
-
- function startUpdateInfo(resp)
- {
- if (resp != null)
- {
- try
- {
- resp = JSON.parse(resp);
- newDiag.cacheAttId = resp[0].id;
- }
- catch(e){} // Ignore
- }
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "GET",
- success: updateInfo,
- error : updateInfo
- });
- };
-
- //We don't cache extUrl files
- if (newDiag.service == 'extUrl')
- {
- startUpdateInfo();
- }
- else
- {
- var postfix = newDiag.displayName, prefix = '';
-
- if (newDiag.service != 'AttFile')
- {
- prefix = fileModifiedTS + '_';
- postfix = (newDiag.service == 'OneDrive'? 'W' : 'G') + newDiag.sFileId;
- };
-
- AC.getJiraAttList(issueId, function(attList)
- {
- var fileExists = false;
- newDiag.diagramName = prefix + postfix;
- var lc = newDiag.diagramName.toLowerCase();
-
- // Checks if any file will be overwritten
- for (var i = 0; i < attList.length && !fileExists; i++)
- {
- var an = attList[i].filename.toLowerCase();
-
- if (an == lc)
- {
- fileExists = true;
- }
- }
-
- if (fileExists)
- {
- //Make filename unique
- newDiag.nameDiff = Date.now();
- newDiag.diagramName = prefix + newDiag.nameDiff + '-' + postfix;
- }
-
- AC.uploadToJira(fileContent, issueId, newDiag.diagramName,
- 'application/vnd.jgraph.mxfile', startUpdateInfo, startUpdateInfo); //On error save also as caching is not blocking
- }, startUpdateInfo);
- }
- };
-
- function onSubmit()
- {
- if (activeTab == 'extUrl')
- {
- showDiagFromUrl(null, function(diagramUrl, diagramName)
- {
- var aspect = null;
-
- if (curViewer != null)
- {
- var layerIds = [];
-
- var model = curViewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- aspect = curViewer.diagrams[curViewer.currentPage].getAttribute('id') + ' ' + layerIds.join(' ');
- }
-
- doSubmit({
- diagramUrl: diagramUrl,
- diagramName: diagramName,
- aspect: aspect,
- service: 'extUrl'
- });
- });
- }
- else if (activeTab == 'gDrive')
- {
- gdEditor.doSubmit();
- }
- else if (activeTab == 'oneDrive')
- {
- odEditor.doSubmit();
- }
- else if (activeTab == 'upload')
- {
- attEditor.doSubmit();
- }
- };
-
- function activateTab()
- {
- switch (activeTab)
- {
- case 'gDrive':
- if (gdEditor == null)
- {
- gdEditor = new GDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- doSubmit({
- displayName: selectedFile.title,
- service: 'GDrive',
- sFileId: selectedFile.id,
- aspect: selectedFile.aspect,
- mime: selectedFile.mimeType,
- createdBy: selectedFile.owners && selectedFile.owners[0]? selectedFile.owners[0].displayName : null,
- lastModifiedBy: selectedFile.lastModifyingUser? selectedFile.lastModifyingUser.displayName : null,
- modifiedDate: selectedFile.modifiedDate,
- size: selectedFile.fileSize
- }, selFileContent, new Date(selectedFile.modifiedDate).getTime());
- }, null, 'GD', true, true);
- }
- else
- {
- gdEditor.spinner.stop();
- }
- break;
- case 'oneDrive':
- if (odEditor == null)
- {
- odEditor = new OneDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- doSubmit({
- displayName: selectedFile.name,
- service: 'OneDrive',
- sFileId: selectedFile.id,
- odriveId: selectedFile.parentReference.driveId,
- aspect: selectedFile.aspect,
- mime: selectedFile.file.mimeType
- }, selFileContent, new Date(selectedFile.lastModifiedDateTime).getTime());
- }, null, 'OD', true, true);
- }
- else
- {
- odEditor.spinner.stop();
- }
- break;
- case 'upload':
- attEditor.spinner.stop();
- break;
- }
- }
-
- function openTab(evt)
- {
- var tabName = this.getAttribute("data-tabContetn");
- // Declare all variables
- var i, tabcontent, tablinks;
-
- // Get all elements with class="tabcontent" and hide them
- tabcontent = document.getElementsByClassName("tabcontent");
- for (i = 0; i < tabcontent.length; i++) {
- tabcontent[i].style.display = "none";
- }
-
- // Get all elements with class="tablinks" and remove the class "active"
- tablinks = document.getElementsByClassName("tablinks");
- for (i = 0; i < tablinks.length; i++) {
- tablinks[i].className = tablinks[i].className.replace(" active", "");
- }
-
- // Show the current tab, and add an "active" class to the button that opened the tab
- document.getElementById(tabName).style.display = "block";
- evt.currentTarget.className += " active";
-
- activeTab = tabName;
- activateTab();
- }
-
- function showElemError(id, errMsg)
- {
- AC.$('#' + id).style.border = '1px solid red';
- AC.$('#' + id + 'Error').innerHTML = AC.htmlEntities(errMsg);
- };
-
- function showDiagFromUrl(evt, callback)
- {
- if (evt)
- {
- evt.preventDefault();
- }
-
- var hasErr = false;
- var diagramName = AC.$('#diagramName').value;
-
- if (!diagramName)
- {
- showElemError('diagramName', 'Please enter Diagram Name');
- hasErr = true;
- }
-
- var diagramUrl = AC.$('#diagramUrl').value;
-
- if (!diagramUrl)
- {
- showElemError('diagramUrl', 'Please enter Diagram URL');
- hasErr = true;
- }
-
- if (hasErr)
- {
- return;
- }
- else if (lastDiagramUrl == diagramUrl) //No need to render diagram again since URL didn't change
- {
- if (callback)
- {
- callback(diagramUrl, diagramName);
- }
- return;
- }
-
- lastDiagramUrl = diagramUrl;
-
- var prevDiv = AC.$('#previewEU');
- spinner.spin(prevDiv);
-
- var xhr = new XMLHttpRequest();
- xhr.open('GET', diagramUrl);
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == 4)
- {
- spinner.stop();
- prevDiv.innerHTML = '';
- curViewer = null;
-
- if (xhr.status >= 200 && xhr.status <= 299)
- {
- //TODO Png support?
- var doc = mxUtils.parseXml(xhr.responseText);
-
- if (new Editor().extractGraphModel(doc.documentElement) != null)
- {
- if (callback)
- {
- callback(diagramUrl, diagramName);
- }
- else
- {
- var container = document.createElement('div');
- container.style.cssText = 'position:absolute;width:100%;height:auto;bottom:0px;top:0px;border:1px solid transparent;';
- prevDiv.appendChild(container);
-
- curViewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', border: 8, 'auto-fit': true,
- resize: false, nav: true, lightbox: false, title: diagramName,
- 'toolbar-nohide': true, 'toolbar-position': 'top', toolbar: 'pages layers'});
- }
- }
- else
- {
- showElemError('diagramUrl', 'Not a draw.io diagram');
- }
- }
- else
- {
- showElemError('diagramUrl', 'Invalid Diagram URL: ' + (xhr.status == 404? 'File Not Found' : 'Error Code ' + xhr.status));
- }
- }
- };
-
- xhr.send();
- };
-
- //=======Upload==========
- attEditor = new AttViewerEditor(function(selectedFile, selFileContent, editedFile, width, height, autoSize, isDrawio, aspect, onError)
- {
- //We only have add in Jira
- if (selectedFile != null)
- {
- doSubmit({
- diagramName: selectedFile.name,
- displayName: selectedFile.name,
- service: 'AttFile',
- aspect: aspect,
- mime: selectedFile.type,
- size: selectedFile.size,
- modifiedDate: selectedFile.lastModified
- }, selFileContent);
- }
- }, null, 'UD', true, true);
-
- //Staring the editor
- //Setting events listeners
- document.getElementById("showDiagBtn").addEventListener('click', showDiagFromUrl);
-
- function resetBorder()
- {
- if (this.value)
- this.style.border = '';
-
- AC.$('#' + this.id + 'Error').innerHTML = '';
- };
-
- var diagramUrl = document.getElementById('diagramUrl');
- var diagramName = document.getElementById('diagramName');
-
- diagramUrl.addEventListener('keypress', resetBorder);
- diagramName.addEventListener('keypress', resetBorder);
- diagramUrl.addEventListener('change', resetBorder);
- diagramName.addEventListener('change', resetBorder);
-
- var tabs = document.getElementsByClassName("tablinks");
-
- for (var i = 0; i < tabs.length; i++)
- {
- tabs[i].addEventListener('click', openTab);
- }
-
- AP.sizeToParent(true);
-
- document.getElementById('uploadTab').click();
-
- AP.dialog.disableCloseOnSubmit();
- AP.events.on('dialog.submit', onSubmit);
-};
-
-// Adds event listeners
-document.getElementById('gdAnchor').onclick = function()
-{
- document.getElementById('filePickerGD').click();
-};
-
-document.getElementById('odAnchor').onclick = function()
-{
- document.getElementById('filePickerOD').click();
-};
-
-document.getElementById('fileUploadAnchor').onclick = function()
-{
- document.getElementById('fileuploadUD').click();
-};
-
-document.getElementById('extUrlAnchor').onclick = function()
-{
- document.getElementById('diagramUrl').focus();
-};
-
-//Parses URL parameters
-function getUrlParam(param)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-(function()
-{
- // Specifies connection mode for touch devices (at least one should be true)
- var baseUrl = getBaseUrl();
- var connectUrl = baseUrl + '/atlassian-connect';
- var head = document.getElementsByTagName("head")[0];
-
- var script = document.createElement("script");
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- head.appendChild(script);
-
- var link = document.createElement("link");
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
- script.onload = embedDiagramMain;
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
-})();
diff --git a/src/main/webapp/connect/jira/embedDiagram.js b/src/main/webapp/connect/jira/embedDiagram.js
deleted file mode 100644
index 6b0bc218..00000000
--- a/src/main/webapp/connect/jira/embedDiagram.js
+++ /dev/null
@@ -1,449 +0,0 @@
-function embedDiagramMain()
-{
- var selectedDiagramInfo = null;
- var selectedElt = null;
- var activeTab = 'upload';
- var issueId = getUrlParam('issueId');
- var attEditor, odEditor = null, gdEditor = null;
- var curViewer = null;
- var lastDiagramUrl = null;
-
- var opts =
- {
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
-
- function htmlEntities(s, newline)
- {
- s = String(s || '');
-
- s = s.replace(/&/g,'&amp;'); // 38 26
- s = s.replace(/"/g,'&quot;'); // 34 22
- s = s.replace(/\'/g,'&#39;'); // 39 27
- s = s.replace(/</g,'&lt;'); // 60 3C
- s = s.replace(/>/g,'&gt;'); // 62 3E
-
- if (newline == null || newline)
- {
- s = s.replace(/\n/g, '&#xa;');
- }
-
- return s;
- };
-
- function showError(msg)
- {
- var errorMsg = document.getElementById("errorMsg");
- errorMsg.innerHTML = AC.htmlEntities(msg);
- errorMsg.className = "fade";
- setTimeout(function()
- {
- errorMsg.className = "";
- }, 5000);
- };
-
- function doSubmit(newDiag, fileContent, fileModifiedTS)
- {
- var updateInfo = function(resp)
- {
- var diagramsInfo = {name: [], txtContent: [], updated: [], id: []};
-
- if (!resp.status) //no error
- {
- resp = JSON.parse(resp);
- diagramsInfo = resp.value;
- }
-
- if (diagramsInfo.embeddedDiagrams != null)
- {
- diagramsInfo.embeddedDiagrams.push(newDiag);
- }
- else
- {
- diagramsInfo.embeddedDiagrams = [newDiag];
- }
-
- diagramsInfo.hasDiagram = 1;
-
- //Glance counter properties
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/com.atlassian.jira.issue:com.mxgraph.jira.plugins.drawio:drawioViewerGlance:status",
- type: "PUT",
- data: JSON.stringify({ type: 'badge', value: { label: String((diagramsInfo.id? diagramsInfo.id.length : 0) + diagramsInfo.embeddedDiagrams.length) } }),
- contentType: "application/json"
- });
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "PUT",
- data: JSON.stringify(diagramsInfo),
- contentType: "application/json",
- success: function()
- {
- AP.jira.refreshIssuePage();
- AP.dialog.close();
- },
- error : function()
- {
- showError('Error occured during saving, please try again later.');
- }
- });
- };
-
- function startUpdateInfo(resp)
- {
- if (resp != null)
- {
- try
- {
- resp = JSON.parse(resp);
- newDiag.cacheAttId = resp[0].id;
- }
- catch(e){} // Ignore
- }
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "GET",
- success: updateInfo,
- error : updateInfo
- });
- };
-
- //We don't cache extUrl files
- if (newDiag.service == 'extUrl')
- {
- startUpdateInfo();
- }
- else
- {
- var postfix = newDiag.displayName, prefix = '';
-
- if (newDiag.service != 'AttFile')
- {
- prefix = fileModifiedTS + '_';
- postfix = (newDiag.service == 'OneDrive'? 'W' : 'G') + newDiag.sFileId;
- };
-
- AC.getJiraAttList(issueId, function(attList)
- {
- var fileExists = false;
- newDiag.diagramName = prefix + postfix;
- var lc = newDiag.diagramName.toLowerCase();
-
- // Checks if any file will be overwritten
- for (var i = 0; i < attList.length && !fileExists; i++)
- {
- var an = attList[i].filename.toLowerCase();
-
- if (an == lc)
- {
- fileExists = true;
- }
- }
-
- if (fileExists)
- {
- //Make filename unique
- newDiag.nameDiff = Date.now();
- newDiag.diagramName = prefix + newDiag.nameDiff + '-' + postfix;
- }
-
- AC.uploadToJira(fileContent, issueId, newDiag.diagramName,
- 'application/vnd.jgraph.mxfile', startUpdateInfo, startUpdateInfo); //On error save also as caching is not blocking
- }, startUpdateInfo);
- }
- };
-
- function onSubmit()
- {
- if (activeTab == 'extUrl')
- {
- showDiagFromUrl(null, function(diagramUrl, diagramName)
- {
- var aspect = null;
-
- if (curViewer != null)
- {
- var layerIds = [];
-
- var model = curViewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- aspect = curViewer.diagrams[curViewer.currentPage].getAttribute('id') + ' ' + layerIds.join(' ');
- }
-
- doSubmit({
- diagramUrl: diagramUrl,
- diagramName: diagramName,
- aspect: aspect,
- service: 'extUrl'
- });
- });
- }
- else if (activeTab == 'gDrive')
- {
- gdEditor.doSubmit();
- }
- else if (activeTab == 'oneDrive')
- {
- odEditor.doSubmit();
- }
- else if (activeTab == 'upload')
- {
- attEditor.doSubmit();
- }
- };
-
- function activateTab()
- {
- switch (activeTab)
- {
- case 'gDrive':
- if (gdEditor == null)
- {
- gdEditor = new GDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- doSubmit({
- displayName: selectedFile.title,
- service: 'GDrive',
- sFileId: selectedFile.id,
- aspect: selectedFile.aspect,
- mime: selectedFile.mimeType,
- createdBy: selectedFile.owners && selectedFile.owners[0]? selectedFile.owners[0].displayName : null,
- lastModifiedBy: selectedFile.lastModifyingUser? selectedFile.lastModifyingUser.displayName : null,
- modifiedDate: selectedFile.modifiedDate,
- size: selectedFile.fileSize
- }, selFileContent, new Date(selectedFile.modifiedDate).getTime());
- }, null, 'GD', true, true);
- }
- else
- {
- gdEditor.spinner.stop();
- }
- break;
- case 'oneDrive':
- if (odEditor == null)
- {
- odEditor = new OneDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- doSubmit({
- displayName: selectedFile.name,
- service: 'OneDrive',
- sFileId: selectedFile.id,
- odriveId: selectedFile.parentReference.driveId,
- aspect: selectedFile.aspect,
- mime: selectedFile.file.mimeType
- }, selFileContent, new Date(selectedFile.lastModifiedDateTime).getTime());
- }, null, 'OD', true, true);
- }
- else
- {
- odEditor.spinner.stop();
- }
- break;
- case 'upload':
- attEditor.spinner.stop();
- break;
- }
- }
-
- function openTab(evt)
- {
- var tabName = this.getAttribute("data-tabContetn");
- // Declare all variables
- var i, tabcontent, tablinks;
-
- // Get all elements with class="tabcontent" and hide them
- tabcontent = document.getElementsByClassName("tabcontent");
- for (i = 0; i < tabcontent.length; i++) {
- tabcontent[i].style.display = "none";
- }
-
- // Get all elements with class="tablinks" and remove the class "active"
- tablinks = document.getElementsByClassName("tablinks");
- for (i = 0; i < tablinks.length; i++) {
- tablinks[i].className = tablinks[i].className.replace(" active", "");
- }
-
- // Show the current tab, and add an "active" class to the button that opened the tab
- document.getElementById(tabName).style.display = "block";
- evt.currentTarget.className += " active";
-
- activeTab = tabName;
- activateTab();
- }
-
- function showElemError(id, errMsg)
- {
- AC.$('#' + id).style.border = '1px solid red';
- AC.$('#' + id + 'Error').innerHTML = AC.htmlEntities(errMsg);
- };
-
- function showDiagFromUrl(evt, callback)
- {
- if (evt)
- {
- evt.preventDefault();
- }
-
- var hasErr = false;
- var diagramName = AC.$('#diagramName').value;
-
- if (!diagramName)
- {
- showElemError('diagramName', 'Please enter Diagram Name');
- hasErr = true;
- }
-
- var diagramUrl = AC.$('#diagramUrl').value;
-
- if (!diagramUrl)
- {
- showElemError('diagramUrl', 'Please enter Diagram URL');
- hasErr = true;
- }
-
- if (hasErr)
- {
- return;
- }
- else if (lastDiagramUrl == diagramUrl) //No need to render diagram again since URL didn't change
- {
- if (callback)
- {
- callback(diagramUrl, diagramName);
- }
- return;
- }
-
- lastDiagramUrl = diagramUrl;
-
- var prevDiv = AC.$('#previewEU');
- spinner.spin(prevDiv);
-
- var xhr = new XMLHttpRequest();
- xhr.open('GET', diagramUrl);
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == 4)
- {
- spinner.stop();
- prevDiv.innerHTML = '';
- curViewer = null;
-
- if (xhr.status >= 200 && xhr.status <= 299)
- {
- //TODO Png support?
- var doc = mxUtils.parseXml(xhr.responseText);
-
- if (new Editor().extractGraphModel(doc.documentElement) != null)
- {
- if (callback)
- {
- callback(diagramUrl, diagramName);
- }
- else
- {
- var container = document.createElement('div');
- container.style.cssText = 'position:absolute;width:100%;height:auto;bottom:0px;top:0px;border:1px solid transparent;';
- prevDiv.appendChild(container);
-
- curViewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', border: 8, 'auto-fit': true,
- resize: false, nav: true, lightbox: false, title: diagramName,
- 'toolbar-nohide': true, 'toolbar-position': 'top', toolbar: 'pages layers'});
- }
- }
- else
- {
- showElemError('diagramUrl', 'Not a draw.io diagram');
- }
- }
- else
- {
- showElemError('diagramUrl', 'Invalid Diagram URL: ' + (xhr.status == 404? 'File Not Found' : 'Error Code ' + xhr.status));
- }
- }
- };
-
- xhr.send();
- };
-
- //=======Upload==========
- attEditor = new AttViewerEditor(function(selectedFile, selFileContent, editedFile, width, height, autoSize, isDrawio, aspect, onError)
- {
- //We only have add in Jira
- if (selectedFile != null)
- {
- doSubmit({
- diagramName: selectedFile.name,
- displayName: selectedFile.name,
- service: 'AttFile',
- aspect: aspect,
- mime: selectedFile.type,
- size: selectedFile.size,
- modifiedDate: selectedFile.lastModified
- }, selFileContent);
- }
- }, null, 'UD', true, true);
-
- //Staring the editor
- //Setting events listeners
- document.getElementById("showDiagBtn").addEventListener('click', showDiagFromUrl);
-
- function resetBorder()
- {
- if (this.value)
- this.style.border = '';
-
- AC.$('#' + this.id + 'Error').innerHTML = '';
- };
-
- var diagramUrl = document.getElementById('diagramUrl');
- var diagramName = document.getElementById('diagramName');
-
- diagramUrl.addEventListener('keypress', resetBorder);
- diagramName.addEventListener('keypress', resetBorder);
- diagramUrl.addEventListener('change', resetBorder);
- diagramName.addEventListener('change', resetBorder);
-
- var tabs = document.getElementsByClassName("tablinks");
-
- for (var i = 0; i < tabs.length; i++)
- {
- tabs[i].addEventListener('click', openTab);
- }
-
- AP.sizeToParent(true);
-
- document.getElementById('uploadTab').click();
-
- AP.dialog.disableCloseOnSubmit();
- AP.events.on('dialog.submit', onSubmit);
-}; \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/fullScreenViewer-1-3-3.html b/src/main/webapp/connect/jira/fullScreenViewer-1-3-3.html
deleted file mode 100644
index 8c2c3265..00000000
--- a/src/main/webapp/connect/jira/fullScreenViewer-1-3-3.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-text-bottom.svg);
- background-position:center 30%;
- background-repeat:no-repeat;
- background-size: 128px;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-<script type="text/javascript" src="fullscreen-viewer-init.js"></script>
-<script type="text/javascript" src="/js/viewer-static.min.js"></script>
-</head>
-<body>
-<script type="text/javascript" src="fullscreen-viewer.js"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/jira/fullScreenViewer2.html b/src/main/webapp/connect/jira/fullScreenViewer2.html
deleted file mode 100644
index bc9f3f39..00000000
--- a/src/main/webapp/connect/jira/fullScreenViewer2.html
+++ /dev/null
@@ -1,205 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Draw.io Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-text-bottom.svg);
- background-position:center 30%;
- background-repeat:no-repeat;
- background-size: 128px;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-<script type="text/javascript">
-// Parses URL parameters
-function getUrlParam(param)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Overrides browser language with Confluence user language
-var lang = getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-</head>
-<body>
-<script type="text/javascript">
- // Enables dynamic loading of shapes and stencils (same domain)
- mxStencilRegistry.dynamicLoading = true;
-
- // Specifies connection mode for touch devices (at least one should be true)
- var connectUrl = getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName('head')[0];
-
- var script = document.createElement('script');
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- head.appendChild(script);
-
- var link = document.createElement('link');
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- function main()
- {
- AP.resize('100%', '100%');
-
- AP.require(['request', 'dialog', 'jira', 'messages'], function(request, dialog, jira, messages)
- {
- var diagramId = (dialog.customData != null) ? dialog.customData.diagramId : null;
- var diagramName = (dialog.customData != null) ? dialog.customData.diagramName : null;
- var serverName = document.referrer;
- var timeout = 25000;
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
- var message = messages.error('The connection has timed out', 'The server at ' +
- serverName + ' is taking too long to respond.');
-
- messages.onClose(message, function()
- {
- dialog.close();
- });
- }, timeout);
-
- // LATER: Add fallback using diagramName lookup via attachment list
- request({
- url: '/secure/attachment/' + diagramId + '/',
- success: function(xml)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- document.body.style.backgroundImage = 'none';
- var viewer = new GraphViewer(null, null, {highlight: '#3572b0', nav: true, lightbox: false});
- viewer.currentPage = parseInt(((dialog.customData != null) ? dialog.customData.page : null) || 0);
- viewer.lightboxChrome = false;
- viewer.xml = xml;
-
- // Enables layers via flag to avoid toolbar
- viewer.layersEnabled = true;
-
- var ui = viewer.showLocalLightbox();
-
- // Destroy lightbox with ui instance
- var destroy = ui.destroy;
- ui.destroy = function()
- {
- dialog.close();
- destroy.apply(this, arguments);
- };
- }
- },
- error : mxUtils.bind(this, function()
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- jira.refreshIssuePage();
- dialog.close();
- }
- })
- });
- });
- }
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
- // Prefetches asynchronous requests so that below code runs synchronous
- // Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
- // is compiled into JS in the build process and is only needed for local development.
- var bundleLoaded = false;
- var scriptLoaded = false;
-
- function mainBarrier()
- {
- if (bundleLoaded && scriptLoaded)
- {
- main();
- }
- };
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
- });
-
- script.onload = function()
- {
- scriptLoaded = true;
- mainBarrier();
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
-</script>
-
-</body>
-</html>
diff --git a/src/main/webapp/connect/jira/fullscreen-viewer-init.js b/src/main/webapp/connect/jira/fullscreen-viewer-init.js
deleted file mode 100644
index e73e8cdd..00000000
--- a/src/main/webapp/connect/jira/fullscreen-viewer-init.js
+++ /dev/null
@@ -1,43 +0,0 @@
-function getUrlParam(param)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Overrides browser language with Confluence user language
-var lang = getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
diff --git a/src/main/webapp/connect/jira/fullscreen-viewer.js b/src/main/webapp/connect/jira/fullscreen-viewer.js
deleted file mode 100644
index 8a9aa91b..00000000
--- a/src/main/webapp/connect/jira/fullscreen-viewer.js
+++ /dev/null
@@ -1,180 +0,0 @@
-// Logs uncaught errors
-EditorUi.enableLogging = true;
-
-window.onerror = function(message, url, linenumber, colno, err)
-{
- message = 'Jira Cloud: ' + ((message != null) ? message : '');
-
- EditorUi.logError(message, url, linenumber, colno, err);
-};
-
-// Enables dynamic loading of shapes and stencils (same domain)
-mxStencilRegistry.dynamicLoading = true;
-
-// Specifies connection mode for touch devices (at least one should be true)
-var connectUrl = getBaseUrl() + '/atlassian-connect';
-var head = document.getElementsByTagName('head')[0];
-
-var script = document.createElement('script');
-script.setAttribute('data-options', 'resize:false;margin:false');
-
-head.appendChild(script);
-
-var link = document.createElement('link');
-link.type = "text/css";
-link.rel = "stylesheet";
-link.href = connectUrl + '/all.css';
-head.appendChild(link);
-
-function main()
-{
- AP.resize('100%', '100%');
-
- //keeping the block of AP.require to minimize the number of changes!
- function doMain(customData)
- {
- var diagramId = (customData != null) ? customData.diagramId : null;
- var diagramName = (customData != null) ? customData.diagramName : null;
- var diagramUrl = (customData != null) ? customData.diagramUrl : null;
- var pageId = (customData != null) ? customData.pageId : null;
- var layerIds = (customData != null) ? customData.layerIds : null;
- var serverName = getBaseUrl();
- var timeout = 25000;
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
-
- var flag = AP.flag.create({
- title: 'The connection has timed out',
- body: 'The server at ' +
- serverName + ' is taking too long to respond.',
- type: 'error',
- close: 'manual'
- });
-
- //TODO find how to listen to flag close event, currently just close the editor immediately
- //messages.onClose(message, function()
- //{
- AP.dialog.close();
- //});
- }, timeout);
-
- var renderDiagram = function(xml)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- document.body.style.backgroundImage = 'none';
- var viewer = new GraphViewer(null, null, {highlight: '#3572b0', nav: true, lightbox: false, pageId: pageId, layerIds: layerIds});
- viewer.lightboxChrome = false;
- viewer.xml = xml;
-
- // Enables layers via flag to avoid toolbar
- viewer.layersEnabled = true;
-
- var ui = viewer.showLocalLightbox();
-
- // Destroy lightbox with ui instance
- var destroy = ui.destroy;
- ui.destroy = function()
- {
- AP.dialog.close();
- destroy.apply(this, arguments);
- };
- }
- };
-
- var renderDiagramError = function()
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- AP.jira.refreshIssuePage();
- AP.dialog.close();
- }
- };
-
- if (diagramUrl != null)
- {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', diagramUrl);
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == 4)
- {
- if (xhr.status >= 200 && xhr.status <= 299)
- {
- renderDiagram(xhr.responseText);
- }
- else
- {
- renderDiagramError();
- }
- }
- };
-
- xhr.send();
- }
- else
- {
- // LATER: Add fallback using diagramName lookup via attachment list
- AP.request({
- url: '/secure/attachment/' + diagramId + '/',
- success: renderDiagram,
- error : renderDiagramError
- });
- }
- };
- AP.dialog.getCustomData(doMain);
-}
-
-mxResources.loadDefaultBundle = false;
-var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
-// Prefetches asynchronous requests so that below code runs synchronous
-// Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
-// is compiled into JS in the build process and is only needed for local development.
-var bundleLoaded = false;
-var scriptLoaded = false;
-
-function mainBarrier()
-{
- if (bundleLoaded && scriptLoaded)
- {
- main();
- }
-};
-
-mxUtils.getAll([bundle], function(xhr)
-{
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
-});
-
-script.onload = function()
-{
- scriptLoaded = true;
- mainBarrier();
-};
-
-script.src = 'https://connect-cdn.atl-paas.net/all.js';
diff --git a/src/main/webapp/connect/jira/search.html b/src/main/webapp/connect/jira/search.html
deleted file mode 100644
index da4f99bf..00000000
--- a/src/main/webapp/connect/jira/search.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Search</title>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.7.1/css/aui.css" media="all">
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- font-family:Arial,sans-serif;
- width:100%;
- margin: 0;
- padding: 10px !important;
- background-color: #fff;
-}
-.btn {
- float: right;
- margin: 2px;
-}
-.diagramName {
- padding-right: 3px;
-}
-.gridHeader, .gridRow {
- border: 1px solid #e9e9e9;
- height: 40px;
-}
-
-.gridHeader>.gridHeaderCell {
- border-top: 0;
- border-bottom: 0;
- padding-left: 4px;
- text-align: left;
-}
-
-.gridHeader>.gridHeaderCell:first-child {
- border-left: none;
-}
-
-.gridHeader>.gridHeaderCell:last-child {
- border-right: none;
-}
-
-.gridHeader {
- background: #e5e5e5;
- color: black;
-}
-
-.gridRowCell {
- border-left: 1px solid #f3f3f3;
- padding-left: 4px;
-}
-
-.gridRow>.gridRowCell {
- background: #fff;
-}
-
-.gridRowAlt>.gridRowCell {
- background: #f5f5f5;
-}
-
-#searchTxt {
- width: 350px;
- height: 30px;
-}
-.content {
- max-width: 900px;
- margin: auto;
-}
-</style>
-</head>
-<body>
-<div class="content">
- <h1>draw.io Diagrams</h1>
- <div style="padding: 10px 0 10px">
- <input id="searchTxt" type="search" placeholder="Search draw.io diagrams content"> <button id="searchBtn" class="aui-button">Search</button>
- </div>
- <div id="resultsPanel"></div>
-</div>
-<script src="search.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/jira/search.js b/src/main/webapp/connect/jira/search.js
deleted file mode 100644
index ad8bccc2..00000000
--- a/src/main/webapp/connect/jira/search.js
+++ /dev/null
@@ -1,240 +0,0 @@
-//Parses URL parameters
-function getUrlParam(param)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-(function()
-{
- // Specifies connection mode for touch devices (at least one should be true)
- var baseUrl = getBaseUrl();
- var connectUrl = baseUrl + '/atlassian-connect';
- var head = document.getElementsByTagName("head")[0];
-
- var script = document.createElement("script");
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- head.appendChild(script);
-
- var link = document.createElement("link");
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
- script.onload = main;
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
-
- function htmlEntities(s, newline)
- {
- s = String(s || '');
-
- s = s.replace(/&/g,'&amp;'); // 38 26
- s = s.replace(/"/g,'&quot;'); // 34 22
- s = s.replace(/\'/g,'&#39;'); // 39 27
- s = s.replace(/</g,'&lt;'); // 60 3C
- s = s.replace(/>/g,'&gt;'); // 62 3E
-
- if (newline == null || newline)
- {
- s = s.replace(/\n/g, '&#xa;');
- }
-
- return s;
- };
-
- function attachButtonEvents(issueId, diagramName, diagramId, diagramDate, openBtn, editBtn, searchTxt)
- {
- openBtn.addEventListener('click', function()
- {
- AP.dialog.create(
- {
- header: diagramName + ' (' + diagramDate + ')',
- key: 'drawioFullScreenViewer',
- size: 'fullscreen',
- chrome: true,
- customData: {diagramName: diagramName, diagramId: diagramId}
- });
- });
-
- editBtn.addEventListener('click', function()
- {
- AP.dialog.create(
- {
- key: 'drawioEditor',
- width: '100%',
- height: '100%',
- chrome: false,
- customData : {issueId: issueId, diagramName: diagramName, diagramId: diagramId}
- }).on("close", function()
- {
- doSearch(searchTxt);
- });
- });
- };
-
- function createIssueDiagramsRows(issue, grid, isAlt, searchTxt)
- {
- var props = issue.properties["drawio-metadata"];
- var isFirst = true;
-
- for (var i = 0; i < props.name.length; i++)
- {
- if (searchTxt != null && searchTxt.length > 0)
- {
- var searchTest = new RegExp(searchTxt, "i");
- //do per diagram filtering
- if (!searchTest.test(props.name[i]) && !searchTest.test(props.txtContent[i]))
- continue;
- }
- var row = document.createElement('tr');
- row.className = isAlt? "gridRowAlt" : "gridRow";
- var td = document.createElement('td');
- td.className = "gridRowCell";
- td.innerHTML = isFirst? ("<a href='" + baseUrl + "/browse/" + issue.key + "' target='_blank'>"+ htmlEntities(issue.key) + "</a>"): "";
- row.appendChild(td);
- td = document.createElement('td');
- td.className = "gridRowCell";
- var div = document.createElement('div');
- var span = document.createElement('span');
- var modDate = new Date(props.updated[i]).toLocaleString();
- span.innerHTML = htmlEntities(props.name[i]) + " (" + modDate + ")";
- span.className = "diagramName";
- div.appendChild(span);
- var editBtn = document.createElement('button');
- editBtn.innerHTML = "Edit Diagram";
- editBtn.className = "aui-button btn";
- div.appendChild(editBtn);
- var openBtn = document.createElement('button');
- openBtn.innerHTML = "Open Diagram";
- openBtn.className = "aui-button btn";
- div.appendChild(openBtn);
- attachButtonEvents(issue.id, props.name[i], props.id[i], modDate, openBtn, editBtn, searchTxt);
- td.appendChild(div);
- row.appendChild(td);
- grid.appendChild(row);
- isFirst = false;
- };
- };
-
- function fillResults(issues, searchTxt)
- {
- var resultsPanel = document.getElementById("resultsPanel");
- resultsPanel.innerHTML = "";
-
- var grid = document.createElement('table');
- grid.style.whiteSpace = 'nowrap';
- grid.style.width = '100%';
- //create header row
- var hrow = document.createElement('tr');
- hrow.className = "gridHeader";
- var th = document.createElement('th');
- th.className = "gridHeaderCell";
- th.innerHTML = "Issue";
- hrow.appendChild(th);
- th = document.createElement('th');
- th.className = "gridHeaderCell";
- th.innerHTML = "Diagrams";
- hrow.appendChild(th);
- grid.appendChild(hrow)
- resultsPanel.appendChild(grid);
-
- var isAlt = false;
-
- if (issues.length == 0)
- {
- var emptyNote = document.createElement('div');
- emptyNote.innerHTML = "No diagrams found!";
- resultsPanel.appendChild(emptyNote);
- }
- else
- {
- for (var i = 0; i < issues.length; i++)
- {
- createIssueDiagramsRows(issues[i], grid, isAlt, searchTxt);
- isAlt = !isAlt;
- }
- }
- };
-
- var searchTxtInput = document.getElementById("searchTxt");
-
- document.getElementById("searchBtn").addEventListener('click', function()
- {
- doSearch();
- });
-
- searchTxtInput.addEventListener('keypress', function(e)
- {
- if (e.keyCode == 13)
- {
- doSearch();
- }
- });
-
- function doSearch(searchTxt)
- {
- searchTxt = searchTxt != null? searchTxt : searchTxtInput.value;
-
- var jql = "";
-
- if (searchTxt.length > 0)
- {
- jql = encodeURIComponent('diagramTextContent ~ "' + searchTxt.replace('"', '\"') + '*" OR diagramName ~ "' + searchTxt.replace('"', '\"') + '*"');
- }
- else
- {
- jql = "hasDiagram%3D1";
- }
-
- AP.request({
- url: '/rest/api/2/search?jql=' + jql + '&properties=drawio-metadata',
- type: 'GET',
- success: function(resp)
- {
- resp = JSON.parse(resp);
- fillResults(resp.issues, searchTxt);
- },
- error: function()
- {
- //TODO handle errors
- }
- });
- };
-
- function main()
- {
- AP.request({
- url: '/rest/api/2/search?jql=hasDiagram%3D1&properties=drawio-metadata',
- type: 'GET',
- success: function(resp)
- {
- resp = JSON.parse(resp);
- fillResults(resp.issues);
- },
- error: function()
- {
- //TODO handle errors
- }
- });
- };
-
-})();
diff --git a/src/main/webapp/connect/jira/spinner.gif b/src/main/webapp/connect/jira/spinner.gif
deleted file mode 100644
index 054973c9..00000000
--- a/src/main/webapp/connect/jira/spinner.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/jira/viewerPanel-1-3-12.html b/src/main/webapp/connect/jira/viewerPanel-1-3-12.html
deleted file mode 100644
index 2ca85833..00000000
--- a/src/main/webapp/connect/jira/viewerPanel-1-3-12.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Viewer</title>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.7.1/css/aui.css" media="all">
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
- background-color: #fff;
- background-image:url(/connect/jira/spinner.gif);
- background-repeat:no-repeat;
- background-position:center;
-}
-.drawio-add-diagram {
- float: right;
- margin-right: 5px;
-}
-.loading {
- background-color: #fff;
- background-image:url(/connect/jira/spinner.gif);
- background-repeat:no-repeat;
- background-position:center;
-}
-</style>
-</head>
-<body>
-<script src="/js/viewer-static.min.js" type="text/javascript"></script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script src="viewerPanel.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/jira/viewerPanel-1-3-3.html b/src/main/webapp/connect/jira/viewerPanel-1-3-3.html
deleted file mode 100644
index ea18a925..00000000
--- a/src/main/webapp/connect/jira/viewerPanel-1-3-3.html
+++ /dev/null
@@ -1,108 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Viewer</title>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.7.1/css/aui.css" media="all">
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
- background-color: #fff;
- background-image:url(/connect/jira/spinner.gif);
- background-repeat:no-repeat;
- background-position:center;
-}
-.drawio-add-diagram {
- float: right;
- margin-right: 5px;
-}
-.loading {
- background-color: #fff;
- background-image:url(/connect/jira/spinner.gif);
- background-repeat:no-repeat;
- background-position:center;
-}
-</style>
-</head>
-<body>
-<script type="text/javascript">
-//Parses URL parameters
-function getUrlParam(param)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-function getDocDim()
-{
- var body = document.body,
- html = document.documentElement;
-
- var height = Math.max(body.offsetHeight, html.clientHeight, html.offsetHeight);
-
- var width = Math.max(body.offsetWidth, html.clientWidth, html.offsetWidth);
-
- return {w: width, h: height};
-};
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Overrides browser language with JIRA user language
-var lang = getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script src="/js/viewer.min.js" type="text/javascript"></script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script src="viewerPanel.js" type="text/javascript"></script>
-<script type="text/javascript">
-// Logs uncaught errors
-EditorUi.enableLogging = true;
-
-window.onerror = function(message, url, linenumber, colno, err)
-{
- message = 'Jira Cloud: ' + ((message != null) ? message : '');
-
- EditorUi.logError(message, url, linenumber, colno, err);
-};
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/jira/viewerPanel.js b/src/main/webapp/connect/jira/viewerPanel.js
deleted file mode 100644
index 016dbde0..00000000
--- a/src/main/webapp/connect/jira/viewerPanel.js
+++ /dev/null
@@ -1,974 +0,0 @@
-(function()
-{
- // Logs uncaught errors
- EditorUi.enableLogging = true;
-
- window.onerror = function(message, url, linenumber, colno, err)
- {
- message = 'Jira Cloud: ' + ((message != null) ? message : '');
-
- EditorUi.logError(message, url, linenumber, colno, err);
- };
-
- //Parses URL parameters
- function getUrlParam(param)
- {
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
- };
-
- function getBaseUrl()
- {
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
- };
-
- function getDocDim()
- {
- var body = document.body,
- html = document.documentElement;
-
- var height = Math.max(body.offsetHeight, html.clientHeight, html.offsetHeight);
-
- var width = Math.max(body.offsetWidth, html.clientWidth, html.offsetWidth);
-
- return {w: width, h: height};
- };
- // Sets global environment variables
- RESOURCE_BASE = '/resources/dia';
- STENCIL_PATH = '/stencils';
- SHAPES_PATH = '/shapes';
- IMAGE_PATH = '/images';
- OPEN_URL = '/import';
- PROXY_URL = '/proxy';
- SAVE_URL = '/save';
-
- // Overrides browser language with JIRA user language
- var lang = getUrlParam('loc');
-
- // Language is in the Connect URL
- if (lang != null)
- {
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
- }
-
- // Enables dynamic loading of shapes and stencils (same domain)
- mxStencilRegistry.dynamicLoading = true;
-
- // Specifies connection mode for touch devices (at least one should be true)
- var connectUrl = getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName("head")[0];
-
- var script = document.createElement("script");
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- head.appendChild(script);
-
- var link = document.createElement("link");
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
- // Prefetches asynchronous requests so that below code runs synchronous
- // Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
- // is compiled into JS in the build process and is only needed for local development.
- var bundleLoaded = false;
- var scriptLoaded = false;
-
- function mainBarrier()
- {
- if (bundleLoaded && scriptLoaded)
- {
- main();
- }
- };
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
- });
-
- script.onload = function()
- {
- scriptLoaded = true;
- mainBarrier();
- };
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
-
- function main()
- {
- var glanceMode = getUrlParam('glance') == '1';
-
- //Create draw.io panel toolbar (currently, we only have "Add Diagram" button)
- var toolbar = document.createElement('div');
- toolbar.style.cssText = "width:100%;height:35px";
- var addDiagramBtn = document.createElement('button');
- addDiagramBtn.className = "aui-button drawio-add-diagram";
- mxUtils.write(addDiagramBtn, mxResources.get('addDiagram', null, 'Add Diagram'));
-
- addDiagramBtn.addEventListener('click', function()
- {
- AP.dialog.create(
- {
- key: 'drawioEditor',
- width: '100%',
- height: '100%',
- chrome: false
- });
- });
-
- toolbar.appendChild(addDiagramBtn);
-
- //FIXME Jira open the dialog with incorrect body size (body size is 100% while viewport is the correct size!
-// var embedDiagramBtn = document.createElement('button');
-// embedDiagramBtn.className = "aui-button drawio-add-diagram";
-// mxUtils.write(embedDiagramBtn, mxResources.get('embedDiagram', null, 'Embed Diagram'));
-//
-// embedDiagramBtn.addEventListener('click', function()
-// {
-// AP.dialog.create(
-// {
-// key: 'embedDiagram',
-// width: '70%',
-// height: '70%',
-// chrome: true
-// });
-// });
-//
-// toolbar.appendChild(embedDiagramBtn);
- document.body.appendChild(toolbar);
-
- var editImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAD1BMVEUAAAAAAAAQEBBycnIgICBqwj3hAAAAAXRSTlMAQObYZgAAADlJREFUCNdjoBwoChrAmCyGggJwYWVBBSiTSVDICKFa0AEuLCiEJKyAX5gBSZgBSZgBKGwMBKQ7HAAWzQSfKKAyBgAAAABJRU5ErkJggg==';
- var removeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVAQMAAACT2TfVAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABlJREFUCNdjQAF/GBj4/x8AYxBg/k80RgYApAUPr950a4AAAAAASUVORK5CYII=';
- var issueId = getUrlParam('issueId');
- var serverName = getBaseUrl();
- var timeout = 25000;
- var index1 = serverName.indexOf('//');
- var updateTiles, updateHeight;
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- // Delayed invocation see below
- function init()
- {
- // Workaround to ignore scrollbars when applying fit to available width in all but FF
- if (!mxClient.IS_FF)
- {
- document.body.style.width = document.documentElement.offsetWidth + 'px';
- }
-
- AP.resize('100%', '200px');
-
- var embeddedDiagrams = null;
- var attDiagrams = null;
- var allAttachments = null;
- var diagInfoMap = {};
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "GET",
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var diagramsInfo = resp.value;
- embeddedDiagrams = [];
-
- if (diagramsInfo.embeddedDiagrams != null)
- {
- embeddedDiagrams = diagramsInfo.embeddedDiagrams;
- }
-
- if (diagramsInfo.other != null)
- {
- for (var i = 0; i < diagramsInfo.name.length; i++)
- {
- diagInfoMap[diagramsInfo.name[i]] = diagramsInfo.other[i];
- }
- }
-
- checkDone();
- },
- error : function()
- {
- embeddedDiagrams = [];
- checkDone();
- }
- });
-
- //keeping the block of AP.require to minimize the number of changes!
- {
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '?fields=attachment',
- type: 'GET',
- success: function(resp)
- {
- var respObj = JSON.parse(resp);
- attDiagrams = [];
- allAttachments = [];
-
- for (var i = 0; i < respObj.fields.attachment.length; i++)
- {
- var attachment = respObj.fields.attachment[i];
- allAttachments.push(attachment);
-
- if (attachment.mimeType == 'application/drawio')
- {
- attachment.createDate = new Date(attachment.created.replace("+0000", "+00:00")); //The replace is needed for IE11
- attDiagrams.push(attachment);
- }
- }
-
- //sort diagrams by date
- attDiagrams.sort(function(a,b)
- {
- return b.createDate - a.createDate;
- });
-
- checkDone();
- },
- error: function()
- {
- attDiagrams = [];
- allAttachments = [];
- checkDone();
- }
- });
-
- function checkDone()
- {
- if (embeddedDiagrams != null && attDiagrams != null)
- {
- var tbHeight = GraphViewer.prototype.toolbarHeight;
- var tiles = [];
- var count = 0;
- var tilesPerRow, tileWidth, tileWidthCss, tileHeightCss, lastWidth;
-
- function showError(container, errMsg)
- {
- container.style.cssText = '';
- container.className = '';
- container.style.textAlign = 'center';
- container.style.color = 'red';
- container.style.marginTop = tbHeight + 'px';
- container.innerHTML = '<img src="/mxgraph/images/error.gif" border="0" align="absmiddle"/> ' +
- AC.htmlEntities(errMsg);
- };
-
- function updateTileSize()
- {
- var dim = getDocDim();
-
- if (glanceMode)
- {
- tilesPerRow = 1; //one per row is good as size is predefined and we have all the area
- tileWidth = dim.w - 20; //potential scrollbar width (usually 17px)
- }
- else
- {
- tilesPerRow = Math.max(Math.round(dim.w / 250), 1);
- //floor and -1 to avoid IE issues of moving last tile to next row
- tileWidth = Math.floor(dim.w / tilesPerRow) - 1;
- }
-
- tileWidthCss = tileWidth + "px";
- tileHeightCss = (tileWidth + tbHeight) + "px";
- };
-
- updateTileSize();
- AP.resize('100%', tileWidth + tbHeight + 35);
-
- updateHeight = function ()
- {
- var dim = getDocDim();
-
- lastWidth = dim.w;
- var rows = Math.ceil(tiles.length / tilesPerRow);
-
- // +5 is needed to include margin, 35 is the panel toolbar height
- var h = rows == 0? 30 : rows * (tiles[0].tile.offsetHeight + 5) + 50;
-
- // Restricts the max sidebar panel height
- var maxH = screen.height * 1.5;
-
- //In right panel, no need to set max as the size is automatically controlled by Jira. This avoids double scrollbars
- if (!glanceMode)
- {
- h = Math.min(maxH, h);
- }
- else
- {
- h += 150; //To have the last viewer visible especially in the issue viewer
- }
-
- AP.resize('100%', h);
-
- // Workaround for iframe scrollbars
- document.body.style.height = h + 'px';
-
- if (glanceMode)
- {
- document.body.style.width = (tileWidth * tilesPerRow) + 'px';
- }
-
- document.body.style.overflowY = (!glanceMode && maxH == h)? "auto" : "hidden";
- };
-
- updateTiles = function()
- {
- var dim = getDocDim();
-
- if (lastWidth != dim.w)
- {
- updateTileSize();
-
- for (var i = 0; i < tiles.length; i++)
- {
- tiles[i].title.style.width = tileWidthCss;
-
- tiles[i].container.style.width = tileWidthCss;
- tiles[i].container.style.height = tileWidthCss;
-
- tiles[i].tile.style.width = tileWidthCss;
- tiles[i].tile.style.height = tileHeightCss;
- }
-
- updateHeight();
-
- return true;
- }
-
- return false;
- };
-
- //TODO FIXME Jira resize is not stable now, the panel is not resized in issues viewer unless it is closed, then open
- //In glance mode, resize handler cause many issues and it is not actually needed!
- if (!glanceMode)
- {
- window.addEventListener('resize', updateTiles);
- }
-
- function finish()
- {
- count--;
-
- if (count == 0)
- {
- document.body.style.backgroundImage = 'none';
- document.body.style.width = '';
- updateHeight();
- }
- };
-
- function loadDiagram(value)
- {
- var attId = null;
- count++;
- var tile = document.createElement('div');
- tile.style.cssText = 'width:' + tileWidthCss + ';height:' + tileHeightCss + ';display:inline-block;overflow: hidden;';
- document.body.appendChild(tile);
-
- var container = document.createElement('div');
- container.style.cssText = 'position:relative;box-sizing:border-box;margin-bottom:2px;' +
- 'width:' + tileWidthCss + ';height:' + tileWidthCss + ';border:1px solid transparent;overflow: hidden;';
- container.className = 'loading';
-
- //Find displayName
- value.displayName = value.filename || value.displayName || value.diagramName;
-
- // Adds filename and ID to side panel
- var title = document.createElement('div'), createDate = null;
-
- function setTitle()
- {
- title.innerHTML = '';
-
- if (value.createDate != null)
- {
- createDate = value.createDate.toLocaleString();
- mxUtils.write(title, value.filename + ' (' + createDate + ')');
- var displayName = value.author != null ? value.author.displayName : '';
- title.setAttribute('title', value.filename + ' (' + createDate + ') - ' + displayName +
- ' [ID: ' + value.id + ']');
- }
- else
- {
- var t = value.displayName || value.diagramName;
- mxUtils.write(title, t);
- var modifiedDate = value.modifiedDate? ' (' + new Date(value.modifiedDate).toLocaleString() + ')' : '';
- title.setAttribute('title', t + modifiedDate + (value.createdBy? ' - ' + value.createdBy : '') +
- (value.lastModifiedBy? ' [Last Modified By: ' + value.lastModifiedBy + ']' : ''));
- }
- };
-
- setTitle();
- title.style.cssText = 'position:relative;box-sizing:border-box;width:' + tileWidthCss + ';padding: 6px 0 0 3px;height:' + tbHeight +
- 'px;margin-bottom:-' + tbHeight + 'px;text-align:left;white-space:nowrap;cursor:pointer;overflow:hidden;';
- tile.appendChild(title);
- tile.appendChild(container);
- tiles.push({tile: tile, container: container, title: title});
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
-
- showError(container, 'The connection has timed out: The server at ' +
- serverName + ' is taking too long to respond.');
- finish();
- }, timeout);
-
- function renderDiagram(xml)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- var pageId, layerIds;
-
- var aspect = value.aspect || (diagInfoMap[value.filename] != null? diagInfoMap[value.filename].aspect : null);
-
- if (aspect != null)
- {
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- container.innerHTML = '';
-
- var doc = typeof xml === 'string'? mxUtils.parseXml(xml) : xml;
-
- var btnDefs = {
- 'edit': {title: mxResources.get('edit'), enabled: typeof window.Blob !== 'undefined',
- image: editImage, handler: function()
- {
- AP.dialog.create(
- {
- key: 'drawioEditor',
- width: '100%',
- height: '100%',
- chrome: false,
- customData : {diagramName: value.filename, diagramId: value.id, page: viewer.currentPage, diagInfo: diagInfoMap[value.filename]}
- });
-
- //TODO Edit for service based files??
- }},
- 'remove': {title: mxResources.get('delete'), image: removeImage, handler: function()
- {
- if (confirm(mxResources.get('removeIt', [value.displayName]) + '?'))
- {
- if (value.diagramUrl != null || value.service != null)
- {
- var doDelete = function(resp)
- {
- resp = JSON.parse(resp);
- var diagramsInfo = resp.value;
-
- if (diagramsInfo.embeddedDiagrams != null)
- {
- var list = diagramsInfo.embeddedDiagrams;
- var found = false;
-
- for (var i = 0; i < list.length; i++)
- {
- if (list[i].diagramUrl == value.diagramUrl && list[i].diagramName == value.diagramName)
- {
- list.splice(i, 1);
- found = true;
- break;
- }
- }
-
- if (found)
- {
- if (diagramsInfo.id == null)
- {
- diagramsInfo.id = [];
- }
-
- //Glance counter properties
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/com.atlassian.jira.issue:com.mxgraph.jira.plugins.drawio:drawioViewerGlance:status",
- type: "PUT",
- data: JSON.stringify({ type: 'badge', value: { label: String(diagramsInfo.id.length + diagramsInfo.embeddedDiagrams.length) } }),
- contentType: "application/json"
- });
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "PUT",
- data: JSON.stringify(diagramsInfo),
- contentType: "application/json",
- success: function()
- {
- AP.jira.refreshIssuePage();
- },
- error : function()
- {
- alert('Remove failed, please try again later.');
- }
- });
- }
- else
- {
- alert('Diagram not found.');
-
- AP.jira.refreshIssuePage();
- }
- }
- else
- {
- alert('Unexpected Error.');
- }
- };
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "GET",
- success: doDelete,
- error : function()
- {
- alert('Unexpected Error, please try again later.')
- }
- });
-
- if (attId != null)
- {
- AP.request({
- url: '/rest/api/2/attachment/' + attId,
- type: 'DELETE',
- success: AC.noop,
- error: AC.noop
- });
- }
- }
- else
- {
- AP.request({
- url: '/rest/api/2/attachment/' + value.id,
- type: 'DELETE',
- success: function()
- {
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "GET",
- success: function(resp)
- {
- resp = JSON.parse(resp);
- var diagramsInfo = resp.value;
-
- if (diagramsInfo.id != null)
- {
- var list = diagramsInfo.id;
- var found = false;
-
- for (var i = 0; i < list.length; i++)
- {
- if (list[i] == value.id)
- {
- list.splice(i, 1);
- diagramsInfo.name.splice(i, 1);
- diagramsInfo.txtContent.splice(i, 1);
- diagramsInfo.updated.splice(i, 1);
- found = true;
- break;
- }
- }
-
- if (diagramsInfo.id.length == 0)
- {
- diagramsInfo.hasDiagram = 0;
- }
-
- if (found)
- {
- if (diagramsInfo.embeddedDiagrams == null)
- {
- diagramsInfo.embeddedDiagrams = [];
- }
-
- //Glance counter properties
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/com.atlassian.jira.issue:com.mxgraph.jira.plugins.drawio:drawioViewerGlance:status",
- type: "PUT",
- data: JSON.stringify({ type: 'badge', value: { label: String(diagramsInfo.id.length + diagramsInfo.embeddedDiagrams.length) } }),
- contentType: "application/json"
- });
-
- AP.request({
- url: "/rest/api/2/issue/" + issueId + "/properties/drawio-metadata",
- type: "PUT",
- data: JSON.stringify(diagramsInfo),
- contentType: "application/json",
- success: function()
- {
- AP.jira.refreshIssuePage();
- },
- error : function()
- {
- AP.jira.refreshIssuePage();
- }
- });
- }
- else
- {
- AP.jira.refreshIssuePage();
- }
- }
- },
- error : function()
- {
- AP.jira.refreshIssuePage();
- }
- });
- },
- error : function()
- {
- AP.jira.refreshIssuePage();
- }
- });
- }
- }
- }}
- };
-
- var viewer = new GraphViewer(container, doc.documentElement, {highlight: '#3572b0',
- 'toolbar-position': 'top', toolbar: (value.diagramUrl != null || value.service != null? '' : 'edit ') +
- 'pages layers lightbox remove', border: 8, 'auto-fit': true, resize: false,
- pageId: pageId, layerIds: layerIds,
- nav: true, title: value.displayName, 'toolbar-buttons': btnDefs});
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight();
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight();
- };
-
- viewer.showLightbox = function()
- {
- //Create an aspect reflecting current view
- var layerIds = [], pageId = viewer.diagrams[viewer.currentPage].getAttribute('id');
-
- var model = viewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- AP.dialog.create(
- {
- header: value.displayName + (createDate? ' (' + createDate + ')' : ''),
- key: 'drawioFullScreenViewer',
- size: 'fullscreen',
- chrome: true,
- customData: {diagramUrl: value.diagramUrl, diagramName: value.displayName,
- diagramId: value.id || attId, pageId: pageId, layerIds: layerIds, diagInfo: value}
- });
- };
-
- finish();
- }
- };
-
- // Loads attachment content
- if (value.diagramUrl != null)
- {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', value.diagramUrl);
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == 4)
- {
- if (xhr.status >= 200 && xhr.status <= 299)
- {
- renderDiagram(xhr.responseText);
- }
- else
- {
- showError(container, 'Error: Cannot fetch diagram "' + value.diagramName + '"');
- finish();
- }
- }
- };
-
- xhr.send();
- }
- else if (value.service != null)
- {
- var tryCachedFile = function(prefix, postfix, nameDiff, onError)
- {
- var notFound = true;
-
- for (var i = 0; i < allAttachments.length; i++)
- {
- var attInfo = allAttachments[i].filename.match(/(\d+_)(\d+-)?(.*)/);
-
- if (attInfo != null && attInfo[3] == postfix && (nameDiff == null || (attInfo[2] == nameDiff + '-')))
- {
- if (attInfo[1] != prefix)
- {
- AP.request({
- url: '/rest/api/2/attachment/' + allAttachments[i].id,
- type: 'DELETE',
- success: AC.noop,
- error: AC.noop
- });
- }
- else
- {
- notFound = false;
- attId = allAttachments[i].id;
-
- AP.request({
- url: '/secure/attachment/' + attId + '/',
- success: renderDiagram,
- error: onError
- });
- }
- }
- }
-
- if (notFound)
- {
- onError();
- }
- };
-
- function cacheAndRender(fileContent, fileDoc, cachedFilename)
- {
- renderDiagram(fileDoc);
-
- AC.uploadToJira(fileContent, issueId, cachedFilename,
- 'application/vnd.jgraph.mxfile', function(resp)
- {
- resp = JSON.parse(resp);
- attId = resp[0].id;
- }, GAC.noop);
- };
-
- var getFileErr = function(err)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- showError(container, 'Error: ' + ((err? err.message : '') || 'Unknown'));
- finish();
- }
- };
-
- var getFileInfoErr = function(err)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- if (err && (err.status == 403 || err.status == 400)) //400 is returned when a business account file is accessed via a personal account
- {
- showError(container, 'Error: Access Denied. You do not have permission to access this file.');
- }
- else
- {
- showError(container, 'Error: ' + ((err? err.message : '') || 'Unknown'));
- }
-
- finish();
- }
- };
-
- if (value.service == 'GDrive')
- {
- GAC.getFileInfo(value.sFileId, function(fileInfo)
- {
- var prefix = new Date(fileInfo.modifiedDate).getTime() + '_';
- var postfix = 'G' + fileInfo.id;
- value.displayName = fileInfo.title;
- setTitle();
-
- tryCachedFile(prefix, postfix, value.nameDiff, function()
- {
- GAC.getDrawioFileDoc(fileInfo, function(doc, cnt)
- {
- cacheAndRender(cnt, doc, prefix + (value.nameDiff? value.nameDiff + '-' : '') + postfix);
- }, getFileErr);
- });
- }, getFileInfoErr);
- }
- else if (value.service == 'AttFile')
- {
- attId = value.cacheAttId;
-
- AP.request({
- url: '/secure/attachment/' + attId + '/',
- success: function(resp)
- {
- var isPng = value.mime == 'image/png';
-
- try
- {
- if (isPng)
- {
- resp = AC.extractGraphModelFromPng(resp);
- }
-
- renderDiagram(resp);
- }
- catch(e)
- {
- getFileErr();
- }
- },
- error: getFileErr
- });
- }
- else if (value.service == 'OneDrive')
- {
- AC.getFileInfo(value.sFileId, value.odriveId, function(fileInfo)
- {
- var prefix = new Date(fileInfo.lastModifiedDateTime).getTime() + '_';
- var postfix = 'W' + fileInfo.id;
- value.displayName = fileInfo.name;
- setTitle();
-
- tryCachedFile(prefix, postfix, value.nameDiff, function()
- {
- AC.getDrawioFileDoc(fileInfo, function(doc, cnt)
- {
- cacheAndRender(cnt, doc, prefix + (value.nameDiff? value.nameDiff + '-' : '') + postfix);
- }, getFileErr);
- });
- }, getFileInfoErr);
- }
- }
- else
- {
- AP.request({
- url: '/secure/attachment/' + value.id + '/',
- success: renderDiagram,
- error: mxUtils.bind(this, function(err, statusText, exc)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- showError(container, 'Error: ' + err.status);
- finish();
- }
- })
- });
- }
- };
-
- for (var i = 0; i < attDiagrams.length; i++)
- {
- loadDiagram(attDiagrams[i]);
- }
-
- for (var i = 0; i < embeddedDiagrams.length; i++)
- {
- loadDiagram(embeddedDiagrams[i]);
- }
-
- // Shows message if no files are found
- if (count == 0)
- {
- mxUtils.write(document.body, mxResources.get('noFiles'));
- document.body.style.backgroundImage = 'none';
- AP.resize('100%', '60px');
- }
- }
- };
- };
- }; // end of init
-
- // Workaround for collapsed side panel is to delay init until size is not 0
- // NOTE: Since container.offsetWidth is 2 in this case the delayed rendering
- // in the viewer does not triggger. We disable is here to make sure this does
- // not change in case the container width is zero in the future.
- GraphViewer.prototype.checkVisibleState = false;
-
- if (document.documentElement.offsetWidth == 0)
- {
- var listener = function()
- {
- if (document.documentElement.offsetWidth > 0)
- {
- window.removeEventListener('resize', listener);
- init();
- }
- };
-
- window.addEventListener('resize', listener);
- }
- else
- {
- init();
- }
-
- AP.events.on('ISSUE_GLANCE_OPENED', function()
- {
- AP.resize('100%', '0px');
-
- setTimeout(function()
- {
- if (updateTiles && !updateTiles())
- updateHeight();
- }, 1000); //Size take about half a second to stabilize (finish the animation)
- });
- }
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/jira/viewerPanel2.html b/src/main/webapp/connect/jira/viewerPanel2.html
deleted file mode 100644
index 20ece583..00000000
--- a/src/main/webapp/connect/jira/viewerPanel2.html
+++ /dev/null
@@ -1,393 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Draw.io Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-</head>
-<body>
-<script type="text/javascript">
-//Parses URL parameters
-function getUrlParam(param)
-{
- var result = (new RegExp(param + '=([^&]*)')).exec(window.location.search);
-
- if (result != null && result.length > 0)
- {
- return decodeURIComponent(result[1].replace(/\+/g, '%20'))
- }
-
- return null;
-};
-
-function getBaseUrl()
-{
- var baseUrl = getUrlParam('xdm_e', true) + getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-
-// Overrides browser language with JIRA user language
-var lang = getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script src="/js/viewer.min.js" type="text/javascript"></script>
-<script type="text/javascript">
-(function()
-{
- // Enables dynamic loading of shapes and stencils (same domain)
- mxStencilRegistry.dynamicLoading = true;
-
- // Specifies connection mode for touch devices (at least one should be true)
- var connectUrl = getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName("head")[0];
-
- var script = document.createElement("script");
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- head.appendChild(script);
-
- var link = document.createElement("link");
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
- // Prefetches asynchronous requests so that below code runs synchronous
- // Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
- // is compiled into JS in the build process and is only needed for local development.
- var bundleLoaded = false;
- var scriptLoaded = false;
-
- function mainBarrier()
- {
- if (bundleLoaded && scriptLoaded)
- {
- main();
- }
- };
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
- });
-
- script.onload = function()
- {
- scriptLoaded = true;
- mainBarrier();
- };
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
-
- function main()
- {
- var editImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAD1BMVEUAAAAAAAAQEBBycnIgICBqwj3hAAAAAXRSTlMAQObYZgAAADlJREFUCNdjoBwoChrAmCyGggJwYWVBBSiTSVDICKFa0AEuLCiEJKyAX5gBSZgBSZgBKGwMBKQ7HAAWzQSfKKAyBgAAAABJRU5ErkJggg==';
- var removeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVAQMAAACT2TfVAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABlJREFUCNdjQAF/GBj4/x8AYxBg/k80RgYApAUPr950a4AAAAAASUVORK5CYII=';
- var issueId = getUrlParam('issueId');
- var serverName = document.referrer;
- var timeout = 25000;
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- // Delayed invocation see below
- function init()
- {
- // Workaround to ignore scrollbars when applying fit to available width in all but FF
- if (!mxClient.IS_FF)
- {
- document.body.style.width = document.documentElement.offsetWidth + 'px';
- }
-
- AP.resize('100%', '0px');
- AP.require(['request', 'dialog', 'jira'], function(request, dialog, jira)
- {
- request({
- url: '/rest/api/2/issue/' + issueId + '?fields=attachment',
- type: 'GET',
- success: function(resp)
- {
- var tbHeight = GraphViewer.prototype.toolbarHeight;
- var containers = [];
- var count = 0;
-
- function updateHeight()
- {
- var h = 0;
-
- // +2 is needed to include margin
- for (var i = 0; i < containers.length; i++)
- {
- h += containers[i].offsetHeight + tbHeight + 2;
- }
-
- // Restricts the max sidebar panel height
- h = Math.min(screen.height * 1.5, h);
- AP.resize('100%', h);
-
- // Workaround for iframe scrollbars
- document.body.style.height = h + 'px';
- }
-
- function finish()
- {
- count--;
-
- if (count == 0)
- {
- document.body.style.width = '';
- updateHeight();
- }
- }
-
- function loadDiagram(value)
- {
- count++;
- var container = document.createElement('div');
- container.style.cssText = 'position:relative;box-sizing:border-box;margin-bottom:2px;' +
- 'max-width:100%;min-width:100%;border:1px solid transparent;';
-
- // Adds filename and ID to side panel
- var title = document.createElement('div');
- title.innerHTML = '&ndash; ';
- mxUtils.write(title, value.filename + ' [' + value.id + ']');
- var displayName = value.author != null ? value.author.displayName : '';
- title.setAttribute('title', value.filename + ' [' + value.id + '] - ' + displayName +
- ' ' + new Date(value.created).toLocaleString());
- title.style.cssText = 'position:relative;box-sizing:border-box;width:100%;padding-top:6px;height:' + tbHeight +
- 'px;margin-bottom:-' + tbHeight + 'px;text-align:left;white-space:nowrap;cursor:pointer;';
- document.body.appendChild(title);
-
- // Simple collapse-expand for diagrams
- title.addEventListener('click', function()
- {
- if (container.style.display != 'none')
- {
- title.innerHTML = '+ ';
- mxUtils.write(title, value.filename + ' [' + value.id + ']');
- container.style.display = 'none';
- title.style.marginBottom = '0px';
- }
- else
- {
- title.innerHTML = '&ndash; ';
- mxUtils.write(title, value.filename + ' [' + value.id + ']');
- container.style.display = '';
- title.style.marginBottom = -tbHeight + 'px';
- }
-
- updateHeight();
- });
-
- document.body.appendChild(container);
- containers.push(container);
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
-
- container.style.height = '24px';
- container.style.textAlign = 'center';
- container.style.marginTop = tbHeight + 'px';
- mxUtils.write(container, 'The connection has timed out: The server at ' +
- serverName + ' is taking too long to respond.');
- finish();
- }, timeout);
-
- // Loads attachment content
- request({
- url: '/secure/attachment/' + value.id + '/',
- success: function(xml)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- var doc = mxUtils.parseXml(xml);
-
- var btnDefs = {
- 'edit': {title: mxResources.get('edit'), enabled: typeof window.Blob !== 'undefined',
- image: editImage, handler: function()
- {
- dialog.create(
- {
- key: 'drawioEditor',
- width: '100%',
- height: '100%',
- chrome: false,
- customData : {diagramName: value.filename, diagramId: value.id, page: viewer.currentPage}
- });
- }},
- 'remove': {title: mxResources.get('delete'), image: removeImage, handler: function()
- {
- if (confirm(mxResources.get('removeIt', [value.filename]) + '?'))
- {
- request({
- url: '/rest/api/2/attachment/' + value.id,
- type: 'DELETE',
- success: function()
- {
- jira.refreshIssuePage();
- },
- error : function()
- {
- jira.refreshIssuePage();
- }
- });
- }
- }}
- };
-
- var viewer = new GraphViewer(container, doc.documentElement, {highlight: '#3572b0',
- 'toolbar-position': 'top', toolbar: 'pages layers lightbox remove', 'max-height':
- Math.max(280, document.documentElement.offsetWidth / 1.5), border: 8,
- /* disables automatic zoom with no buttons */'auto-fit': false,
- nav: true, title: value.filename + ' [' + value.id + ']', 'toolbar-buttons': btnDefs});
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight();
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight();
- };
-
- viewer.showLightbox = function()
- {
- dialog.create(
- {
- header: value.filename + ' [' + value.id + ']',
- key: 'drawioFullScreenViewer',
- size: 'fullscreen',
- chrome: true,
- customData: {diagramName: value.filename, diagramId: value.id, page: viewer.currentPage}
- });
- };
-
- finish();
- }
- },
- error: mxUtils.bind(this, function(err, statusText, exc)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- container.style.height = '24px';
- container.style.textAlign = 'center';
- container.style.marginTop = tbHeight + 'px';
- mxUtils.write(container, 'Error: ' + err.status);
- finish();
- }
- })
- });
- };
-
- var respObj = JSON.parse(resp);
-
- for (var i = 0; i < respObj.fields.attachment.length; i++)
- {
- var attachment = respObj.fields.attachment[i];
-
- if (attachment.mimeType == 'application/drawio')
- {
- loadDiagram(attachment);
- }
- }
-
- // Shows message if no files are found
- if (count == 0)
- {
- mxUtils.write(document.body, mxResources.get('noFiles'));
- AP.resize('100%', '20px');
- }
- },
- error: function()
- {
- AP.resize('100%', '0px');
- }
- });
- });
- }; // end of init
-
- // Workaround for collapsed side panel is to delay init until size is not 0
- // NOTE: Since container.offsetWidth is 2 in this case the delayed rendering
- // in the viewer does not triggger. We disable is here to make sure this does
- // not change in case the container width is zero in the future.
- GraphViewer.prototype.checkVisibleState = false;
-
- if (document.documentElement.offsetWidth == 0)
- {
- var listener = function()
- {
- if (document.documentElement.offsetWidth > 0)
- {
- window.removeEventListener('resize', listener);
- init();
- }
- };
-
- window.addEventListener('resize', listener);
- }
- else
- {
- init();
- }
- }
-})();
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/new_common/cac.js b/src/main/webapp/connect/new_common/cac.js
deleted file mode 100644
index 7278427a..00000000
--- a/src/main/webapp/connect/new_common/cac.js
+++ /dev/null
@@ -1,263 +0,0 @@
-var CAC = {};
-
-//Extend object with all CAC functions
-CAC.applyCAC = function(obj)
-{
- for (var fn in CAC)
- {
- obj[fn] = CAC[fn];
- }
-};
-
-CAC.$ = function(selector, elem)
-{
- elem = elem || document;
- return elem.querySelector(selector);
-};
-
-CAC.$$ = function(selector, elem)
-{
- elem = elem || document;
- return elem.querySelectorAll(selector);
-};
-
-CAC.getUrlParam = function(param, escape, url)
-{
- try
- {
- var url = url || window.location.search;
-
- var result = (new RegExp(param + '=([^&]*)')).exec(url);
-
- if (result != null && result.length > 0)
- {
- // decode URI with plus sign fix.
- return (escape) ? decodeURIComponent(result[1].replace(/\+/g, '%20')) : result[1];
- }
-
- return null;
- }
- catch (e)
- {
- return undefined;
- }
-};
-
-CAC.getMetaTag = function(name)
-{
- return document.getElementsByTagName('meta')[name].getAttribute('content');
-};
-
-CAC.getBaseUrl = function()
-{
- var baseUrl = CAC.getUrlParam('xdm_e', true) + CAC.getUrlParam('cp', true);
- //Ensure baseUrl belongs to attlasian (*.jira.com and *.atlassian.net)
- //Since we add cp to xdm_e, we had to ensure that there is a slash after the domain. Since if xdm_e is ok, cp can corrupt is such as cp = '.fakedomain.com' such that baseUrl is atlassian.net.fakedomain.com
- if (/^https:\/\/([^\.])+\.jira\.com\//.test(baseUrl + '/') || /^https:\/\/([^\.])+\.atlassian\.net\//.test(baseUrl + '/'))
- {
- return baseUrl;
- }
- throw 'Invalid baseUrl!';
-};
-
-CAC.getDocDim = function()
-{
- var body = document.body,
- html = document.documentElement;
-
- var height = Math.max(body.scrollHeight, body.offsetHeight,
- html.clientHeight, html.scrollHeight, html.offsetHeight);
-
- var width = Math.max(body.scrollWidth, body.offsetWidth,
- html.clientWidth, html.scrollWidth, html.offsetWidth);
-
- return {w: width, h: height};
-};
-
-CAC.htmlEntities = function(s, newline)
-{
- s = String(s || '');
-
- s = s.replace(/&/g,'&amp;'); // 38 26
- s = s.replace(/"/g,'&quot;'); // 34 22
- s = s.replace(/\'/g,'&#39;'); // 39 27
- s = s.replace(/</g,'&lt;'); // 60 3C
- s = s.replace(/>/g,'&gt;'); // 62 3E
-
- if (newline == null || newline)
- {
- s = s.replace(/\n/g, '&#xa;');
- }
-
- return s;
-};
-
-CAC.getCurPageId = function(callback)
-{
- AP.navigator.getLocation(function (data)
- {
- if (data != null && data.context != null)
- {
- var draftPage = (data.target == 'contentcreate');
- var pageId = data.context.contentId;
-
- callback(pageId, draftPage);
- }
- else
- {
- alert('Unexpected Error: Cannot get content id or type.');
- }
- });
-};
-
-CAC.uploadCachedMxFile = function(fileContent, filename, success, error)
-{
- CAC.uploadAttachment(fileContent, filename, 'application/vnd.jgraph.mxfile.cached', 'Diagram Viewer Cached file', success, error)
-};
-
-CAC.delOldCachedFiles = function(pageId, filename, timestamp)
-{
- CAC.collectAllAttachments(pageId, function(atts)
- {
- for (var i = 0; i < atts.length; i++)
- {
- var cacheFilename = atts[i].title.match(/(\d+)_(.*)/);
-
- if (cacheFilename != null && cacheFilename[2] == filename && cacheFilename[1] != timestamp)
- {
- CAC.deleteAttachment(atts[i].id, CAC.noop, CAC.noop); //ignore deletion errors
- }
- }
- }, CAC.noop);//ignore deletion errors
-};
-
-CAC.uploadAttachment = function(fileContent, filename, fileType, comment, success, error)
-{
- CAC.getCurPageId(function(pageId, draftPage)
- {
- var attFile = new Blob([fileContent], {type: fileType});
- attFile.name = filename;
-
- var reqData = {file: attFile, minorEdit: true, comment: comment};
- var draft = draftPage ? '?status=draft' : '';
-
- AP.request({
- type: 'PUT',
- data: reqData,
- url: '/rest/api/content/'+ pageId + '/child/attachment' + draft,
- contentType: 'multipart/form-data',
- success: success,
- error: error
- });
- });
-};
-
-CAC.collectAllAttachments = function(pageId, callback, error)
-{
- var start = 0, limit = 200;
- var attachments = [];
-
- function getChunck()
- {
- AP.request({
- type: 'GET',
- url: '/rest/api/content/' + pageId + '/child/attachment?start=' + start + '&limit=' + limit,
- contentType: 'application/json;charset=UTF-8',
- success: function(resp) {
- var resp = JSON.parse(resp);
-
- for (var i = 0; i < resp.results.length; i++)
- {
- attachments.push({
- id: resp.results[i].id,
- title: resp.results[i].title
- });
- }
-
- //Support pageing
- if (resp._links && resp._links.next)
- {
- start += resp.limit; //Sometimes the limit is changed by the server
- getChunck();
- }
- else
- {
- callback(attachments);
- }
- },
- error: error
- });
- };
-
- getChunck();
-};
-
-CAC.deleteAttachment = function(attId, success, error)
-{
- AP.request({
- type: 'DELETE',
- url: '/rest/api/content/' + attId,
- contentType: 'application/json;charset=UTF-8',
- success: success,
- error: error
- });
-};
-
-CAC.uploadToJira = function(fileContent, issueId, filename, fileType, success, error)
-{
- var attFile = new Blob([fileContent], {type: fileType});
- attFile.name = filename;
-
- var reqData = {file: attFile};
-
- AP.request(
- {
- url: '/rest/api/2/issue/' + issueId + '/attachments',
- type: 'POST',
- data: reqData,
- contentType: 'multipart/form-data',
- headers: {'X-Atlassian-Token': 'no-check'},
- success: success,
- error: error
- });
-};
-
-CAC.getJiraAttList = function(issueId, success, error)
-{
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '?fields=attachment',
- type: 'GET',
- success: function(resp)
- {
- var respObj = JSON.parse(resp);
- attDiagrams = [];
-
- for (var i = 0; i < respObj.fields.attachment.length; i++)
- {
- attDiagrams.push(respObj.fields.attachment[i]);
- }
-
- success(attDiagrams);
- },
- error: error
- });
-};
-
-CAC.noop = function(){};
-
-CAC.importCsv = function(csv, callback, error)
-{
- //Adjust some functions such that it can be instanciated without UI
- EditorUi.prototype.createUi = function(){};
- EditorUi.prototype.addTrees = function(){};
- EditorUi.prototype.updateActionStates = function(){};
- EditorUi.prototype.onBeforeUnload = function(){}; //Prevent unload message
- var editorUi = new EditorUi();
- editorUi.handleError = error;
-
- editorUi.importCsv(csv, function()
- {
- var csvModel = editorUi.editor.getGraphXml();
- callback(csvModel, mxUtils.getXml(csvModel));
- });
-}; \ No newline at end of file
diff --git a/src/main/webapp/connect/new_common/cviewer.js b/src/main/webapp/connect/new_common/cviewer.js
deleted file mode 100644
index 0913bfb4..00000000
--- a/src/main/webapp/connect/new_common/cviewer.js
+++ /dev/null
@@ -1,157 +0,0 @@
-function mxAddSpinner(container, absolute)
-{
- var div = document.createElement('div');
- div.style.cssText = ((absolute) ? 'position:absolute;top:50%;left:50%;margin-left:-20px;margin-top:-20px;' :
- 'position:relative;') + 'width:40px;height:40px;';
- container.appendChild(div);
-
- new Spinner({
- lines: 12, // The number of lines to draw
- length: 7, // The length of each line
- width: 3, // The line thickness
- radius: 6, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 2, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 999 // The z-index (defaults to 2000000000)
- }).spin(div);
-
- return div;
-};
-
-var tbHeight = 0;
-var mxSpinner = mxAddSpinner(document.body);
-
-function updateHeight(height)
-{
- parent.postMessage(JSON.stringify({action: 'updateHeight', height: Math.ceil(height) + tbHeight + 2}), '*');
-};
-
-function showError(msg)
-{
- mxSpinner.parentNode.removeChild(mxSpinner);
- document.body.style.padding = '4px';
- mxUtils.write(document.body, msg);
- updateHeight(24);
-};
-
-function renderDiagram(xml, fileTitle, readerOpts)
-{
- GraphViewer.initCss();
- // Disables delayed rendering since the container is created on the fly
- GraphViewer.prototype.checkVisibleState = false;
-
- try
- {
- //Code is adopted from mxViewer of Conf Server
- mxStencilRegistry.dynamicLoading = true;
-
- if (readerOpts.simpleViewer)
- {
- //We don't have an image, so, hide the toolbar
- readerOpts.tbstyle = 'hidden';
- }
-
- var graphContainer = document.createElement('div');
- graphContainer.style.cssText = 'position:absolute;' +
- 'max-width:100%;border:1px solid transparent;height:auto;overflow:hidden;';
-
- if (readerOpts.width != null)
- {
- graphContainer.style.width = readerOpts.width + 'px';
- }
-
- document.body.appendChild(graphContainer);
- var doc = mxUtils.parseXml(xml);
-
- if (readerOpts.border)
- {
- graphContainer.style.border = '1px solid #d0d0d0';
- }
-
- var config = {'toolbar-position': readerOpts.tbstyle,
- nav: true, highlight: '#3b73af', border: 8};
-
- if (readerOpts.links != 'auto')
- {
- config.target = readerOpts.links;
- }
-
- if (readerOpts.tbstyle == 'top')
- {
- config.title = readerOpts.diagramDisplayName != null && readerOpts.diagramDisplayName.length > 0 ? readerOpts.diagramDisplayName : fileTitle;
- tbHeight = GraphViewer.prototype.toolbarHeight;
- }
-
- if (!readerOpts.lightbox)
- {
- config.lightbox = false;
- }
-
- // Image fallback used if toolbar disabled and image specified
- if (readerOpts.tbstyle == 'hidden')
- {
- config.resize = true;
- }
- else
- {
- config.toolbar = 'pages zoom layers';
-
- if (readerOpts.lightbox)
- {
- config.toolbar += ' lightbox';
- }
- }
-
- // Forces fit to container and allows scales > 1
- if (readerOpts.width != null)
- {
- config['allow-zoom-in'] = true;
- }
-
- config.zoom = 1;//stops from zooming too much on smaller diagrams
-
- if(readerOpts.aspect != null && readerOpts.aspect.length > 0)
- {
- pageAndLayers = readerOpts.aspect.split(' ');
- //we put the layerIds array in the config object due to a timing issue in FF
- config.layerIds = pageAndLayers.length > 1 ? pageAndLayers.slice(1) : null;
- config.pageId = pageAndLayers[0];
- }
-
- mxSpinner.parentNode.removeChild(mxSpinner);
- mxGlobalViewer = new GraphViewer(graphContainer, doc.documentElement, config);
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = mxGlobalViewer.graph.doResizeContainer;
-
- mxGlobalViewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight(height);
- };
-
- // Updates the size of the iframe in responsive cases
- mxGlobalViewer.updateContainerHeight = function(container, height)
- {
- updateHeight(height);
- };
-
- updateHeight(graphContainer.offsetHeight);
-
- var orignShowLightbox = mxGlobalViewer.showLightbox;
-
- mxGlobalViewer.showLightbox = function()
- {
- orignShowLightbox.call(this, false); //Open in new tab without edit option
- }
- }
- catch(e)
- {
- showError(e.message);
- }
-};
diff --git a/src/main/webapp/connect/office365/app.css b/src/main/webapp/connect/office365/app.css
deleted file mode 100644
index 3c536993..00000000
--- a/src/main/webapp/connect/office365/app.css
+++ /dev/null
@@ -1,458 +0,0 @@
-body {
- background-color: white;
- font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif;
-}
-
-.padding {
- padding: 15px;
-}
-
-/* Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE in the project root for license information. */
-
-#notification-message {
- background-color: #818285;
- color: #fff;
- position: absolute;
- width: 100%;
- min-height: 80px;
- transition: all .5s ease-in-out;
- transform-origin: left top;
- transform: scaleY(0);
- right: 0;
- z-index: 100;
- bottom: 0;
- display: none; /* Hidden until invoked */
-}
-
-#notification-message #notification-message-header {
- font-size: medium;
- margin-bottom: 10px;
-}
-
-#notification-message #notification-message-close {
- background-image: url("/images/close.png");
- background-repeat: no-repeat;
- background-size: 12px;
- width: 12px;
- height: 12px;
- position: absolute;
- right: 10px;
- top: 7px;
- cursor: pointer;
-}
-
-.footer {
- position: fixed;
- bottom: 0;
- width: 100%;
- height: 160px;
- display: block;
- box-sizing: border-box;
- font-family: 'Segoe UI';
-}
-
-.footer .brand-text {
- padding-right: 15px;
- padding-left: 15px;
- margin: 10px;
- margin-left: 5px;
- margin-bottom: 20px;
-}
-
-.header {
- position: fixed;
- top: 0;
- width: 100%;
- height: 40px;
- display: block;
- box-sizing: border-box;
- font-family: 'Segoe UI';
- z-index: 5;
-}
-
-.cancelDefaultBrowserIndentation {
- margin:0;
- margin-top:-14px
-}
-
-.indentFromPaneEdge {
- padding:20px
-}
-
-.centeredText {
- text-align:center;
-}
-
-.headerText {
- padding-top: 10px;
- padding-bottom: 10px;
-
-}
-
-.headerGap {
- padding-top:70px;
-}
-
-.pointerCursor {
- cursor:pointer
-}
-
-/* Overriding Fabric styles to format the Welcome page and workbook list page. */
-ul.ordered-list {
- list-style-type: none;
-}
-
-/* Overriding Fabric styles to format the Welcome page and workbook list page. */
-.ordered-list.ms-List .ms-ListItem {
- padding: 0;
- margin: 0;
- margin-bottom: 20px;
-
-}
-
-/* Overriding Fabric styles to format the Welcome page and workbook list page. */
-.ordered-list .ms-ListItem-primaryText {
- color: rgba(0, 119, 214, 1);
- background-color: rgba(198, 223, 243, 1);
- border-radius: 100%;
- font-size: 12pt;
- width: 30px;
- height: 30px;
- line-height: 30px;
- padding: 0;
- text-align: center;
-
- position: absolute; /* override fabric positioning */
-}
-
-/* Overriding Fabric styles to format the Welcome page and workbook list page. */
-.ordered-list .ms-ListItem-secondaryText {
- color: rgba(51, 51, 51, 1);
- margin-bottom: 10px;
- position: inherit;
- top: 0; /* override fabric positioning */
- padding-left: 40px; /* offset by 30px + 10px so that large bullet sits in that place */
- white-space: normal;
- overflow: auto;
- line-height: normal;
-}
-
-/* Similar to ms-ListItem-secondaryText, but does inherit parent style from Fabric.
- This prevents unnecessary scrollbars appearing next to each file name.
-*/
-.ordered-list .ms-ListItem-fileName {
- color: rgba(51, 51, 51, 1);
- margin-bottom: 10px;
-
- position: inherit;
- top: 0; /* override fabric positioning */
- padding-left: 0px;
- white-space: normal;
- overflow: auto;
-}
-
-.clearfix {
- display: block;
- height: 0;
- clear: both;
-}
-
-.welcome{
- padding: 15px;
-}
-
-.welcome-body{
-}
-
-.welcome-intro {
- padding-top: 6px;
- padding-bottom: 6px;
-}
-
-.file-item-intro {
- margin-bottom: 20px;
-}
-
-.back-icon {
- float:left;
- padding-left:15px;
-}
-
-
-.file-item-status{
- padding-bottom: 20px;
-}
-
-.allAreaContainer {
- position:absolute;
- top:0px;
- bottom:0px;
- left:6px;
- right:6px;
- cursor:default;
-}
-
-.ms-Button {
- cursor:default;
-}
-
-#filePickerTitle {
- position:absolute;
- display:none;
- top:0px;
- height:32px;
- width:100%;
-}
-
-#filePickerWithPreview {
- position:absolute;
- top:15px;
- bottom:48px;
- width:100%;
-}
-
-.bottomBtns {
- padding-top:4px;
- position:absolute;
- bottom:0px;
- height:48px;
- width:100%;
- text-align: center;
-}
-
-.odCatsList {
- box-sizing: border-box;
- position:absolute;
- top:0px;
- bottom:50%;
- width:30%;
- border: 1px solid #CCCCCC;
- border-bottom:none;
- background-color: #FFFFFF;
- display: inline-block;
- overflow-x: hidden;
- overflow-y: auto;
-}
-.odCatsListLbl {
- height: 17px;
- color: #6D6D6D;
- font-size: 14px;
- font-weight: bold;
- line-height: 17px;
- margin: 10px 0 3px 5px;
-}
-.odFilesSec {
- box-sizing: border-box;
- position:absolute;
- left:30%;
- top:0px;
- bottom:50%;
- width: 70%;
- border: 1px solid #CCCCCC;
- border-left:none;
- border-bottom:none;
- background-color: #FFFFFF;
- display: inline-block;
- overflow: hidden;
-}
-#preview {
- position:absolute;
- overflow:hidden;
- border: 1px solid #CCCCCC;
- bottom:0px;
- top: 50%;
- left:0px;
- right:0px;
-}
-.previewStatus {
- position:absolute;
- text-align:center;
- width:100%;
- top:50%;
- transform: translateY(-50%);
- font-size:13px;
- opacity:0.5;
-}
-.odFilesBreadcrumb {
- box-sizing: border-box;
- position:absolute;
- min-height: 32px;
- left:0px;
- right:20px;
- text-overflow:ellipsis;
- overflow:hidden;
- font-size: 13px;
- color: #6D6D6D;
- padding: 5px;
-}
-.odRefreshButton {
- box-sizing: border-box;
- position:absolute;
- right:0px;
- top:0px;
- padding: 4px;
- margin: 1px;
- height:24px;
- cursor:default;
-}
-.odRefreshButton>img {
- opacity:0.5;
-}
-.odRefreshButton:hover {
- background-color:#ddd;
- border-radius:50%;
-}
-.odRefreshButton:active {
- opacity:0.7;
-}
-.odFilesList {
- box-sizing: border-box;
- position:absolute;
- top:32px;
- bottom:0px;
- width: 100%;
- overflow-x: hidden;
- overflow-y: auto;
-}
-.odFileImg {
- padding-left: 5px;
- padding-right: 5px;
-}
-.odFileTitle {
- font-weight: normal;
- color: #666666 !important;
-}
-.odFileListGrid {
- width: 100%;
- white-space: nowrap;
- font-size: 13px;
- box-sizing: border-box;
- border-spacing: 0;
-}
-.odOddRow {
- background-color: #eeeeee;
-}
-.odEvenRow {
- background-color: #FFFFFF;
-}
-.odRowSelected {
- background-color: #cadfff;
-}
-.odCatListTitle {
- box-sizing: border-box;
- height: 17px;
- color: #666666;
- font-size: 14px;
- line-height: 17px;
- margin: 5px 0 5px 0px;
- padding-left: 10px;
-}
-.odCatSelected {
- font-weight: bold;
- background-color: #cadfff;
-}
-.odEmptyFolder {
- height: 17px;
- color: #6D6D6D;
- font-size: 14px;
- font-weight: bold;
- line-height: 17px;
- margin: 10px 0 3px 5px;
- width: 100%;
- text-align: center;
-}
-.odBCFolder {
- cursor: pointer;
- color: #0432ff;
-}
-
-#odSearchBox {
- color:#888888;
- background:url("/images/icon-search.svg") no-repeat;
- background-color: #FFFFFF;
- background-position: 15px;
- height: 30px;
- width: 100%;
- max-width: 400px;
- border: 1px solid #CCCCCC;
- border-radius: 3px;
- font-size:13px;
- line-height:36px;
- outline:medium none;
- padding:0 0 0 36px;
- text-shadow:1px 1px 0 white;
-}
-.smallBtn {
- padding: 4px 15px 6px;
- min-width: unset;
-}
-
-.menuBar {
- width: 20px;
- height: 2px;
- background-color: #999;
- margin: 5px 0;
- cursor: pointer;
-}
-.menuBtn {
- position: absolute;
- left: 0px;
- width: 30px;
-}
-
-#inserErrMsg {
- max-height: 50%;
- overflow-y: auto;
-}
-
-#imgContainer {
- width: 100%;
- position:absolute;
- top: 50%;
- bottom:50px;
- text-align: center;
-}
-
-#manualCopyImg {
- padding-top: 5px;
- max-width: 95%;
- max-height: 95%;
-}
-
-#insertErrorBtns {
- position: absolute;
- bottom: 5px;
-}
-
-#editableDiv {
- width: 100%;
- height: 100px;
- border: 1px solid #cccccc;
-}
-
-a.ms-Button {
- font-weight: bold;
- text-decoration: none;
-}
-
-.serviceBtn {
- width: 185px;
-}
-
-#backLnk {
- top: -4px;
- position: absolute;
-}
-
-.backLnk {
- font-size: 12px;
- cursor: pointer;
- color: #6D6D6D;
-}
-
-.signOutLnk {
- font-size: 12px;
- cursor: pointer;
- color: #6D6D6D;
- float: right;
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/dev/manifest-dev.xml b/src/main/webapp/connect/office365/dev/manifest-dev.xml
deleted file mode 100644
index 8a08a6d8..00000000
--- a/src/main/webapp/connect/office365/dev/manifest-dev.xml
+++ /dev/null
@@ -1,374 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<OfficeApp
- xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
- xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides"
- xsi:type="TaskPaneApp">
-
- <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. -->
-
- <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. -->
- <Id>e849ddb8-6bbd-4833-bd4b-59030099d63e</Id>
-
- <!--Version. Updates from the store only get triggered if there is a version change. -->
- <Version>1.0.0.0</Version>
- <ProviderName>JGraph Ltd</ProviderName>
- <DefaultLocale>en-US</DefaultLocale>
- <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. -->
- <DisplayName DefaultValue="draw.io" />
- <Description DefaultValue="Adds draw.io diagrams from OneDrive">
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <Override Locale="de-de" Value="draw.io Diagramme von OneDrive einfügen"/>
- </Description>
-
- <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. -->
- <IconUrl DefaultValue="https://test.draw.io/images/favicon-32x32.png" />
- <HighResolutionIconUrl DefaultValue="https://test.draw.io/images/drawlogo80.png"/>
-
- <SupportUrl DefaultValue="https://desk.draw.io/" />
-
- <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. -->
- <AppDomains>
- <AppDomain>https://login.microsoftonline.com</AppDomain>
- <AppDomain>https://exp.draw.io</AppDomain>
- <AppDomain>https://graph.microsoft.com</AppDomain>
- <AppDomain>https://test.draw.io</AppDomain>
- </AppDomains>
- <!--End Basic Settings. -->
-
- <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. -->
- <Hosts>
- <Host Name="Document" />
- <Host Name="Presentation" />
- <Host Name="Workbook" />
- </Hosts>
- <DefaultSettings>
- <SourceLocation DefaultValue="https://test.draw.io/connect/office365/index.html" />
- </DefaultSettings>
- <!-- End TaskPane Mode integration. -->
-
- <Permissions>ReadWriteDocument</Permissions>
-
- <!-- Begin Add-in Commands Mode integration. -->
- <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0">
-
- <!-- The Hosts node is required. -->
- <Hosts>
- <!-- Each host can have a different set of commands. -->
- <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. -->
- <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. -->
- <Host xsi:type="Document">
- <!-- Form factor. Currently only DesktopFormFactor is supported. -->
- <DesktopFormFactor>
- <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."-->
- <GetStarted>
- <!-- Title of the Getting Started callout. resid points to a ShortString resource -->
- <Title resid="drawio.GetStarted.Title"/>
-
- <!-- Description of the Getting Started callout. resid points to a LongString resource -->
- <Description resid="drawio.GetStarted.Description"/>
-
- <!-- Point to a url resource which details how the add-in should be used. -->
- <LearnMoreUrl resid="drawio.GetStarted.LearnMoreUrl"/>
- </GetStarted>
- <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called.
- Think of the FunctionFile as the code behind ExecuteFunction. -->
- <FunctionFile resid="drawio.FunctionFile.Url" />
-
- <!-- PrimaryCommandSurface is the main Office Ribbon. -->
- <ExtensionPoint xsi:type="PrimaryCommandSurface">
- <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. -->
- <OfficeTab id="TabInsert">
- <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. -->
- <Group id="drawio.Group1">
- <!-- Label for your group. resid must point to a ShortString resource. -->
- <Label resid="drawio.Group1Label" />
- <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. -->
- <!-- Use PNG icons. All URLs on the resources section must use HTTPS. -->
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- Control. It can be of type "Button" or "Menu". -->
- <Control xsi:type="Button" id="drawio.TaskpaneButton">
- <Label resid="drawio.TaskpaneButton.Label" />
- <Supertip>
- <!-- ToolTip title. resid must point to a ShortString resource. -->
- <Title resid="drawio.TaskpaneButton.Label" />
- <!-- ToolTip description. resid must point to a LongString resource. -->
- <Description resid="drawio.TaskpaneButton.Tooltip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. -->
- <Action xsi:type="ShowTaskpane">
- <TaskpaneId>drawioBtn</TaskpaneId>
- <!-- Provide a url resource id for the location that will be displayed on the task pane. -->
- <SourceLocation resid="drawio.Taskpane.Url" />
- </Action>
- </Control>
- <Control xsi:type="Button" id="drawio.refreshButton">
- <Label resid="drawio.refreshButton.label" />
- <Supertip>
- <Title resid="drawio.refreshButton.toolTipLbl" />
- <Description resid="drawio.refreshButton.toolTip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.refreshIcon_16x16" />
- <bt:Image size="32" resid="drawio.refreshIcon_32x32" />
- <bt:Image size="80" resid="drawio.refreshIcon_80x80" />
- </Icon>
- <Action xsi:type="ExecuteFunction">
- <FunctionName>refreshSelImages</FunctionName>
- </Action>
- </Control>
- <Control xsi:type="Button" id="drawio.refreshAllBtn">
- <Label resid="drawio.refreshAllBtn.label" />
- <Supertip>
- <Title resid="drawio.refreshAllBtn.toolTipLbl" />
- <Description resid="drawio.refreshAllBtn.toolTip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.refreshIcon_16x16" />
- <bt:Image size="32" resid="drawio.refreshIcon_32x32" />
- <bt:Image size="80" resid="drawio.refreshIcon_80x80" />
- </Icon>
- <Action xsi:type="ExecuteFunction">
- <FunctionName>refreshAllImages</FunctionName>
- </Action>
- </Control>
- <Control xsi:type="Button" id="drawio.editButton">
- <Label resid="drawio.editButton.label" />
- <Supertip>
- <Title resid="drawio.editButton.toolTipLbl" />
- <Description resid="drawio.editButton.toolTip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.editIcon_16x16" />
- <bt:Image size="32" resid="drawio.editIcon_32x32" />
- <bt:Image size="80" resid="drawio.editIcon_80x80" />
- </Icon>
- <Action xsi:type="ExecuteFunction">
- <FunctionName>editSelImage</FunctionName>
- </Action>
- </Control>
- </Group>
- </OfficeTab>
- </ExtensionPoint>
- </DesktopFormFactor>
- </Host>
- <Host xsi:type="Presentation">
- <!-- Form factor. Currently only DesktopFormFactor is supported. -->
- <DesktopFormFactor>
- <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."-->
- <GetStarted>
- <!-- Title of the Getting Started callout. resid points to a ShortString resource -->
- <Title resid="drawio.GetStarted.Title"/>
-
- <!-- Description of the Getting Started callout. resid points to a LongString resource -->
- <Description resid="drawio.GetStarted.Description"/>
-
- <!-- Point to a url resource which details how the add-in should be used. -->
- <LearnMoreUrl resid="drawio.GetStarted.LearnMoreUrl"/>
- </GetStarted>
- <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called.
- Think of the FunctionFile as the code behind ExecuteFunction. -->
- <FunctionFile resid="drawio.FunctionFile.Url" />
-
- <!-- PrimaryCommandSurface is the main Office Ribbon. -->
- <ExtensionPoint xsi:type="PrimaryCommandSurface">
- <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. -->
- <OfficeTab id="TabInsert">
- <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. -->
- <Group id="drawio.Group1">
- <!-- Label for your group. resid must point to a ShortString resource. -->
- <Label resid="drawio.Group1Label" />
- <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. -->
- <!-- Use PNG icons. All URLs on the resources section must use HTTPS. -->
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- Control. It can be of type "Button" or "Menu". -->
- <Control xsi:type="Button" id="drawio.TaskpaneButton">
- <Label resid="drawio.TaskpaneButton.Label" />
- <Supertip>
- <!-- ToolTip title. resid must point to a ShortString resource. -->
- <Title resid="drawio.TaskpaneButton.Label" />
- <!-- ToolTip description. resid must point to a LongString resource. -->
- <Description resid="drawio.TaskpaneButton.Tooltip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. -->
- <Action xsi:type="ShowTaskpane">
- <TaskpaneId>drawioBtn</TaskpaneId>
- <!-- Provide a url resource id for the location that will be displayed on the task pane. -->
- <SourceLocation resid="drawio.Taskpane.Url" />
- </Action>
- </Control>
- </Group>
- </OfficeTab>
- </ExtensionPoint>
- </DesktopFormFactor>
- </Host>
- <Host xsi:type="Workbook">
- <!-- Form factor. Currently only DesktopFormFactor is supported. -->
- <DesktopFormFactor>
- <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."-->
- <GetStarted>
- <!-- Title of the Getting Started callout. resid points to a ShortString resource -->
- <Title resid="drawio.GetStarted.Title"/>
-
- <!-- Description of the Getting Started callout. resid points to a LongString resource -->
- <Description resid="drawio.GetStarted.Description"/>
-
- <!-- Point to a url resource which details how the add-in should be used. -->
- <LearnMoreUrl resid="drawio.GetStarted.LearnMoreUrl"/>
- </GetStarted>
- <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called.
- Think of the FunctionFile as the code behind ExecuteFunction. -->
- <FunctionFile resid="drawio.FunctionFile.Url" />
-
- <!-- PrimaryCommandSurface is the main Office Ribbon. -->
- <ExtensionPoint xsi:type="PrimaryCommandSurface">
- <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. -->
- <OfficeTab id="TabInsert">
- <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. -->
- <Group id="drawio.Group1">
- <!-- Label for your group. resid must point to a ShortString resource. -->
- <Label resid="drawio.Group1Label" />
- <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. -->
- <!-- Use PNG icons. All URLs on the resources section must use HTTPS. -->
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- Control. It can be of type "Button" or "Menu". -->
- <Control xsi:type="Button" id="drawio.TaskpaneButton">
- <Label resid="drawio.TaskpaneButton.Label" />
- <Supertip>
- <!-- ToolTip title. resid must point to a ShortString resource. -->
- <Title resid="drawio.TaskpaneButton.Label" />
- <!-- ToolTip description. resid must point to a LongString resource. -->
- <Description resid="drawio.TaskpaneButton.Tooltip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. -->
- <Action xsi:type="ShowTaskpane">
- <TaskpaneId>drawioBtn</TaskpaneId>
- <!-- Provide a url resource id for the location that will be displayed on the task pane. -->
- <SourceLocation resid="drawio.Taskpane.Url" />
- </Action>
- </Control>
- </Group>
- </OfficeTab>
- </ExtensionPoint>
- </DesktopFormFactor>
- </Host>
- </Hosts>
-
- <!-- You can use resources across hosts and form factors. -->
- <Resources>
- <bt:Images>
- <bt:Image id="drawio.tpicon_16x16" DefaultValue="https://test.draw.io/images/favicon-16x16.png" />
- <bt:Image id="drawio.tpicon_32x32" DefaultValue="https://test.draw.io/images/favicon-32x32.png" />
- <bt:Image id="drawio.tpicon_80x80" DefaultValue="https://test.draw.io/images/drawlogo80.png" />
-
- <bt:Image id="drawio.refreshIcon_16x16" DefaultValue="https://test.draw.io/images/update16.png" />
- <bt:Image id="drawio.refreshIcon_32x32" DefaultValue="https://test.draw.io/images/update32.png" />
- <bt:Image id="drawio.refreshIcon_80x80" DefaultValue="https://test.draw.io/images/update80.png" />
-
- <bt:Image id="drawio.editIcon_16x16" DefaultValue="https://test.draw.io/images/edit16.png" />
- <bt:Image id="drawio.editIcon_32x32" DefaultValue="https://test.draw.io/images/edit32.png" />
- <bt:Image id="drawio.editIcon_80x80" DefaultValue="https://test.draw.io/images/edit80.png" />
- </bt:Images>
- <bt:Urls>
- <bt:Url id="drawio.Taskpane.Url" DefaultValue="https://test.draw.io/connect/office365/index.html" />
- <bt:Url id="drawio.GetStarted.LearnMoreUrl" DefaultValue="https://about.draw.io/" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="https://about.draw.io/"/>
- </bt:Url>
- <bt:Url id="drawio.FunctionFile.Url" DefaultValue="https://test.draw.io/connect/office365/function-file/function-file.html" />
- </bt:Urls>
- <!-- ShortStrings max characters==125. -->
- <bt:ShortStrings>
- <bt:String id="drawio.TaskpaneButton.Label" DefaultValue="draw.io" />
- <bt:String id="drawio.Group1Label" DefaultValue="draw.io" />
- <bt:String id="drawio.GetStarted.Title" DefaultValue="Get started with draw.io" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Erste Schritte mit draw.io"/>
- </bt:String>
- <bt:String id="drawio.refreshButton.label" DefaultValue="Update Selected" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markierung aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.refreshButton.toolTipLbl" DefaultValue="Update selected diagram" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markiertes Diagramm aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.refreshAllBtn.label" DefaultValue="Update All" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Alle aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.refreshAllBtn.toolTipLbl" DefaultValue="Update all draw.io diagrams" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Alle draw.io Diagramme aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.editButton.label" DefaultValue="Edit Selected" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markierung bearbeiten"/>
- </bt:String>
- <bt:String id="drawio.editButton.toolTipLbl" DefaultValue="Edit selected draw.io diagram" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markiertes draw.io Diagramm bearbeiten"/>
- </bt:String>
- </bt:ShortStrings>
- <!-- LongStrings max characters==250. -->
- <bt:LongStrings>
- <bt:String id="drawio.TaskpaneButton.Tooltip" DefaultValue="Click to manage draw.io diagrams">
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Hier klicken, um draw.io Diagramme zu verwalten"/>
- </bt:String>
- <bt:String id="drawio.GetStarted.Description" DefaultValue="draw.io add-in loaded succesfully. Go to the INSERT tab and click the 'draw.io' button to get started." >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Das draw.io Add-in wurde erfolgreich geladen. Gehen Sie jetzt zum Reiter 'Einfügen' und klicken Sie auf draw.io."/>
- </bt:String>
- <bt:String id="drawio.refreshButton.toolTip" DefaultValue="Update selected draw.io diagram using its associated file" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markiertes draw.io Diagramm von verknüpfter Datei aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.refreshAllBtn.toolTip" DefaultValue="Update all draw.io diagrams using their associated files" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Alle draw.io Diagramme von verknüpfter Datei aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.editButton.toolTip" DefaultValue="Edit selected draw.io diagram from its associated file" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Verknüpfte Datei bearbeiten"/>
- </bt:String>
- </bt:LongStrings>
- </Resources>
- </VersionOverrides>
- <!-- End Add-in Commands Mode integration. -->
-
-</OfficeApp>
diff --git a/src/main/webapp/connect/office365/drive.html b/src/main/webapp/connect/office365/drive.html
deleted file mode 100644
index c6921b20..00000000
--- a/src/main/webapp/connect/office365/drive.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
- <title>Google Picker</title>
-
- <script src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.js" type="text/javascript"></script>
- <script src="../new_common/cac.js" type="text/javascript"></script>
- <script type="text/javascript" src="../onedrive_common/ac.js"></script>
- <script type="text/javascript" src="js/drive.js"></script>
- </head>
- <body>
- <script type="text/javascript">
- Office.initialize = function ()
- {
- window.officeInitialized = true;
- }
- </script>
- <!-- The Google API Loader script. -->
- <script type="text/javascript" src="https://apis.google.com/js/api.js?onload=onApiLoad"></script>
- </body>
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/function-file/function-file.html b/src/main/webapp/connect/office365/function-file/function-file.html
deleted file mode 100644
index a872bbb3..00000000
--- a/src/main/webapp/connect/office365/function-file/function-file.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=5,IE=9" ><![endif]-->
-<!DOCTYPE html>
-<html>
-
-<head>
- <meta charset="UTF-8" />
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
- <!-- Office JavaScript API -->
- <script type="text/javascript" src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.js"></script>
-
- <script type="text/javascript" src="/js/viewer.min.js"></script>
- <script src="../../new_common/cac.js" type="text/javascript"></script>
- <script type="text/javascript" src="../../onedrive_common/ac.js"></script>
- <script type="text/javascript" src="../js/app.js"></script>
- <script type="text/javascript" src="../js/drive.js"></script>
- <script type="text/javascript" src="function-file.js"></script>
- <script type="text/javascript">
- // The initialize function must be run each time a new page is loaded
- Office.initialize = function (reason) {
-
- };
- </script>
-</head>
-
-<body>
- <!-- NOTE: The body is empty on purpose. Since function in function-file.js are
- invoked via a button, there is no UI to render. -->
-</body>
-
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/function-file/function-file.js b/src/main/webapp/connect/office365/function-file/function-file.js
deleted file mode 100644
index 8ea639c5..00000000
--- a/src/main/webapp/connect/office365/function-file/function-file.js
+++ /dev/null
@@ -1,286 +0,0 @@
-AC.headless = true;
-AC.msgDlg = null;
-
-AC.authOneDrive = function(success, error)
-{
- AC.showError(mxResources.get('officeNotLoggedOD'));
-};
-
-AC.showError = function(errMsg)
-{
- AC.showMsg(errMsg, true);
-};
-
-AC.hideMsg = function(callback)
-{
- if (AC.msgDlg != null)
- {
- dialogCloseAsync(AC.msgDlg, function()
- {
- AC.msgDlg = null;
-
- if (callback != null)
- {
- callback();
- }
- });
- }
- else if (callback != null)
- {
- callback();
- }
-};
-
-AC.showMsg = function(msg, isError, isInfo, isSuccess, showBusy, openLinkId)
-{
- function closeDialog(openLater)
- {
- dialogCloseAsync(AC.msgDlg, function()
- {
- AC.msgDlg = null;
-
- if (openLater == true)
- {
- AC.showMsg(msg, isError, isInfo, isSuccess, showBusy);
- }
- });
- };
-
- if (AC.msgDlg == null)
- {
- Office.context.ui.displayDialogAsync('https://' + window.location.hostname + '/connect/office365/function-file/msg.html?msg=' +
- encodeURIComponent(msg) + '&error=' + (isError? '1' : '0') + '&info=' + (isInfo? '1' : '0') + '&success=' + (isSuccess? '1' : '0') +
- '&busy=' + (showBusy? '1' : '0') + (openLinkId != null? '&openLinkId=' + encodeURIComponent(openLinkId) : ''),
- {height: 20, width: 20, displayInIframe: true, promptBeforeOpen: false}, function (result)
- {
- if (result.value)
- {
- AC.msgDlg = result.value;
- AC.msgDlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogMessageReceived, closeDialog);
- AC.msgDlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogEventReceived, closeDialog);
- }
- });
- }
- else
- {
- closeDialog(true);
- }
-};
-
-function getDiagramsFilesInfo(selectionOnly, callback, onerror)
-{
- if (Office.context.requirements.isSetSupported('WordApi', 1.2))
- {
- Word.run(function (context)
- {
- var docPart = selectionOnly? context.document.getSelection() : context.document.body;
- var pics = docPart.inlinePictures;
-
- pics.load('altTextDescription');
- var diagramsFound = [];
-
- return context.sync().then(function ()
- {
- for (var i = 0; i < pics.items.length; i++)
- {
- var altTextDescription = pics.items[i].altTextDescription;
- var fileInfo = null;
-
- try
- {
- fileInfo = JSON.parse(AC.getUrlParam('local-data', true, altTextDescription));
- }
- catch(e) {}
-
- if (fileInfo != null)
- {
- diagramsFound.push({index: i, fileInfo: fileInfo});
- }
- }
-
- if (diagramsFound.length > 0)
- {
- callback(diagramsFound, selectionOnly);
- }
- else
- {
- onerror(selectionOnly? mxResources.get('officeNoDiagramsSelected', null, 'No diagrams found in the selection') : mxResources.get('officeNoDiagramsInDoc', null, 'No diagrams found in the document'));
- }
- });
- })
- .catch(function (error)
- {
- var errMsg = error.message;
- console.log('Error: ' + JSON.stringify(error));
-
- if (error instanceof OfficeExtension.Error)
- {
- errMsg = error.debugInfo? error.debugInfo.message : errMsg;
- }
-
- errMsg = errMsg || 'Unknown Error';
- onerror(errMsg);
- });
- }
- else
- {
- onerror(mxResources.get('officeNotSupported', null, 'This feature is not supported in this host application'));
- }
-};
-
-function updateImage(fileInfo, index, selectionOnly, processedCallback)
-{
- function doUpdate(file)
- {
- AC.getDrawioFileDoc(file, function(fileDoc, content)
- {
- var container = document.createElement('div');
- container.style.display = 'none';
- document.body.appendChild(container);
- var viewer = new GraphViewer(container, fileDoc.documentElement,
- {'check-visible-state': false, pageId: fileInfo.pageId, layers: fileInfo.layers != null && fileInfo.layers.join != null? fileInfo.layers.join(' ') : null});
-
- app.addToRecent(file);
-
- app.insertImageInDoc(viewer, fileDoc, fileInfo,
- processedCallback, function(errorMsg)
- {
- processedCallback(errorMsg);
- }, index, selectionOnly, true);
- }, function()
- {
- processedCallback(mxResources.get('errorLoadingFile'));
- });
- };
-
- function updateErr(err)
- {
- if (err && err.status == 404)
- {
- processedCallback(mxResources.get('fileNotFound'));
- }
- else
- {
- processedCallback(mxResources.get('errorLoadingFile'));
- }
- };
-
- if (fileInfo.type == 'OneDrive')
- {
- //fetch file from OneDrive
- AC.getFileInfo(fileInfo.id, fileInfo.driveId, doUpdate, updateErr);
- }
- else if (fileInfo.type == 'Drive')
- {
- getGDriveFileInfo(fileInfo.id, function(driveFile)
- {
- doUpdate(toODriveObj(driveFile));
- }, updateErr);
- }
-};
-
-function refreshImages(event, selectionOnly)
-{
- app.initI18n(function()
- {
- AC.showMsg(mxResources.get('updatingDocument'), false, true, false, true);
-
- var updatedImages = 0, errNo = 0, errMsgs = [];
-
- getDiagramsFilesInfo(selectionOnly, function(diagramsFound, selectionOnly)
- {
- for (var i = 0; i < diagramsFound.length; i++)
- {
- updateImage(diagramsFound[i].fileInfo, diagramsFound[i].index, selectionOnly, function(errMsg)
- {
- if (errMsg == null)
- {
- updatedImages++;
- }
- else
- {
- errNo++;
- errMsgs.push(errMsg);
- }
-
- if (updatedImages + errNo == diagramsFound.length) //All Done
- {
- if (errNo > 0)
- AC.showError(mxResources.get('someImagesFailed', [errNo, diagramsFound.length], '{0} out of {1} failed due to the following errors') + ': ' + errMsgs.join(', '));
- else
- AC.hideMsg();
-
- event.completed();
- }
- });
- }
- },
- function(errMsg)
- {
- if (errMsg != null)
- {
- AC.showError(errMsg);
- }
-
- event.completed();
- });
- });
-};
-
-function refreshAllImages(event)
-{
- refreshImages(event, false);
-};
-
-function refreshSelImages(event)
-{
- refreshImages(event, true);
-};
-
-function editSelImage(event)
-{
- app.initI18n(function()
- {
- getDiagramsFilesInfo(true, function(diagramsFound, selectionOnly)
- {
- if (diagramsFound.length > 1)
- {
- AC.showError(mxResources.get('officeSelectSingleDiag'));
- }
- else
- {
- var fileInfo = diagramsFound[0].fileInfo;
- var index = diagramsFound[0].index;
-
- app.editDiagram(fileInfo, function()
- {
- AC.showMsg(mxResources.get('updatingDocument'), false, true, false, true);
-
- updateImage(fileInfo, index, selectionOnly, function(errMsg)
- {
- if (errMsg != null)
- {
- AC.showError(errMsg);
- }
- else
- {
- AC.hideMsg();
- }
- });
- }, true, fileInfo.pageId);
- }
-
- //Notify office that even is completed since editing can take a long time and something wrong can occur
- event.completed();
- },
- function(errMsg)
- {
- if (errMsg != null)
- {
- AC.showError(errMsg);
- }
-
- event.completed();
- });
- });
-}; \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/function-file/msg.html b/src/main/webapp/connect/office365/function-file/msg.html
deleted file mode 100644
index 015ef8c6..00000000
--- a/src/main/webapp/connect/office365/function-file/msg.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
- <meta charset="UTF-8" />
-
- <!-- This office.js library holds the JavaScript API for Office. -->
- <script src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.js" type="text/javascript"></script>
-
- <!-- The following two files hold the Office UI Fabric styles and components. -->
- <link rel="stylesheet" href="https://static2.sharepointonline.com/files/fabric/office-ui-fabric-js/1.4.0/css/fabric.min.css" />
- <link rel="stylesheet" href="https://static2.sharepointonline.com/files/fabric/office-ui-fabric-js/1.4.0/css/fabric.components.min.css" />
- <script src="https://static2.sharepointonline.com/files/fabric/office-ui-fabric-js/1.4.0/js/fabric.min.js"></script>
-
- <script src="../../new_common/cac.js" type="text/javascript"></script>
- <script type="text/javascript" src="../../onedrive_common/ac.js"></script>
-</head>
-
-<body>
- <div id="infoMsg" class="ms-MessageBar" style="display: none">
- <div class="ms-MessageBar-content">
- <div class="ms-MessageBar-icon">
- <img class="busyImg" src="/images/spin.gif" style="display: none">
- <i class="ms-Icon ms-Icon--Info"></i>
- </div>
- <div class="ms-MessageBar-text" style="font-size: 14px">
- </div>
- </div>
- </div>
- <div id="errorMsg" class="ms-MessageBar ms-MessageBar--error" style="display: none">
- <div class="ms-MessageBar-content">
- <div class="ms-MessageBar-icon">
- <img class="busyImg" src="/images/spin.gif" style="display: none">
- <i class="ms-Icon ms-Icon--ErrorBadge"></i>
- </div>
- <div class="ms-MessageBar-text" style="font-size: 14px">
- </div>
- </div>
- </div>
- <div id="successMsg" class="ms-MessageBar ms-MessageBar--success" style="display: none">
- <div class="ms-MessageBar-content">
- <div class="ms-MessageBar-icon">
- <img class="busyImg" src="/images/spin.gif" style="display: none">
- <i class="ms-Icon ms-Icon--Completed"></i>
- </div>
- <div class="ms-MessageBar-text" style="font-size: 14px">
- </div>
- </div>
- </div>
- <div id="openLink" style="display: none;width: 100%;text-align: center;"></div>
- <div style="width:100%;text-align: center;position: fixed;bottom: 0px;height: 50px;margin-left: -8px;" id="okBtn">
- <button class="ms-Button ms-Button--primary">
- <span class="ms-Button-label">OK</span>
- </button>
- </div>
-
- <script type="text/javascript">
- var msgTypeId = '#infoMsg';
-
- function updateUI(msg, openLinkId, isError, isInfo, isSuccess, showBusy)
- {
- var msgs = AC.$$('.ms-MessageBar-text');
-
- for (var i = 0; i < msgs.length; i++)
- {
- msgs[i].innerHTML = AC.htmlEntities(msg);
- }
-
- AC.$(msgTypeId).style.display = 'none';
- msgTypeId = '#infoMsg';
-
- if (isError) msgTypeId = '#errorMsg';
- else if (isSuccess) msgTypeId = '#successMsg';
-
- AC.$(msgTypeId).style.display = 'block';
- AC.$('#okBtn').style.display = isInfo? 'none' : 'block';
-
- var busyImgs = AC.$$('.busyImg');
-
- for (var i = 0; i < busyImgs.length; i++)
- {
- busyImgs[i].style.display = showBusy? '' : 'none';
- }
-
- if (openLinkId != null)
- {
- var openLink = AC.$('#openLink');
- openLink.style.display = 'block';
- openLink.innerHTML = '<a href="https://' + window.location.hostname + '/?open=' + openLinkId + '" target="_blank"><img src=/images/edit32.png></a>';
- }
- };
-
- var msg = AC.getUrlParam('msg', true);
- var isError = AC.getUrlParam('error') == '1';
- var isInfo = AC.getUrlParam('info') == '1';
- var isSuccess = AC.getUrlParam('success') == '1';
- var showBusy = AC.getUrlParam('busy') == '1';
- var openLinkId = AC.getUrlParam('openLinkId');
-
- updateUI(msg, openLinkId, isError, isInfo, isSuccess, showBusy);
-
- Office.initialize = function ()
- {
- new fabric['Button'](AC.$('#okBtn'), function()
- {
- Office.context.ui.messageParent('closeMe');
- });
- };
- </script>
-</body>
-
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/img-viewer.html b/src/main/webapp/connect/office365/img-viewer.html
deleted file mode 100644
index df33350b..00000000
--- a/src/main/webapp/connect/office365/img-viewer.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
- <meta charset="UTF-8" />
-
- <!-- The following two files hold the Office UI Fabric styles. -->
- <link rel="stylesheet" href="https://static2.sharepointonline.com/files/fabric/office-ui-fabric-js/1.4.0/css/fabric.min.css" />
- <link rel="stylesheet" href="https://static2.sharepointonline.com/files/fabric/office-ui-fabric-js/1.4.0/css/fabric.components.min.css" />
-
- <link href="app.css" rel="stylesheet" type="text/css" />
-
- <script src="../new_common/cac.js" type="text/javascript"></script>
- <script type="text/javascript" src="../onedrive_common/ac.js"></script>
-</head>
-
-<body>
- <div id="insertErrorContainer" class="allAreaContainer">
- <div id="inserErrMsg">
- <div class="ms-MessageBar ms-MessageBar--error" style="width: 100%; box-sizing: border-box;">
- <div class="ms-MessageBar-content">
- <div class="ms-MessageBar-icon">
- <i class="ms-Icon ms-Icon--ErrorBadge"></i>
- </div>
- <div class="ms-MessageBar-text" style="font-size: 15px">
- An error prevented draw.io from adding the image directly to the document. This is due to some limitations in the host application.
- Please manually copy the image then paste it to the document.
- </div>
- </div>
- </div>
- <p id="instMsg">
- Instructions: Right-click the image below. Select "Copy image" from the context menu. Then, in the document, right-click and select "Paste" from the context menu.
- </p>
- </div>
- <div id="imgContainer" style="bottom: 5px;">
- <img id="manualCopyImg">
- </div>
- </div>
- <script type="text/javascript">
- var errMsg = AC.getUrlParam('errMsg', true);
- var instMsg = AC.getUrlParam('instMsg', true);
- var imgData = window.location.hash.substr(1);
-
- document.querySelector('.ms-MessageBar-text').innerHTML = AC.htmlEntities(errMsg, false).replace(/\n/g, '<br>');
- document.querySelector('#instMsg').innerHTML = AC.htmlEntities(instMsg, false).replace(/\n/g, '<br>');
- document.querySelector('#manualCopyImg').src = 'data:image/png;base64,' + imgData;
- </script>
-</body>
-
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/index.html b/src/main/webapp/connect/office365/index.html
deleted file mode 100644
index b801e267..00000000
--- a/src/main/webapp/connect/office365/index.html
+++ /dev/null
@@ -1,184 +0,0 @@
-<!-- Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -->
-<!-- See LICENSE in the project root for license information -->
-
-<!DOCTYPE html>
-<html>
-
-<head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>draw.io</title>
- <!-- This office.js library holds the JavaScript API for Office. -->
- <script src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.js" type="text/javascript"></script>
-
- <!-- The following two files hold the Office UI Fabric styles and components. -->
- <link rel="stylesheet" href="https://static2.sharepointonline.com/files/fabric/office-ui-fabric-js/1.4.0/css/fabric.min.css" />
- <link rel="stylesheet" href="https://static2.sharepointonline.com/files/fabric/office-ui-fabric-js/1.4.0/css/fabric.components.min.css" />
- <script src="https://static2.sharepointonline.com/files/fabric/office-ui-fabric-js/1.4.0/js/fabric.min.js"></script>
-
- <link href="app.css" rel="stylesheet" type="text/css" />
-
- <script type="text/javascript" src="/js/viewer.min.js"></script>
- <script src="../new_common/cac.js" type="text/javascript"></script>
- <script type="text/javascript" src="../onedrive_common/ac.js"></script>
- <script type="text/javascript" src="function-file/function-file.js"></script>
- <script type="text/javascript" src="js/drive.js"></script>
- <script type="text/javascript" src="js/app.js"></script>
-</head>
-
-<body>
-
- <div id="connectContainer">
-
- <div id="loading" style="width:100%;height: 0px"></div>
-
- <div class="welcome-body" style="display:none">
- <div class="ms-bgColor-neutralLight welcome">
- <div><img src="/images/draw.io-logo.svg" height="32px"></div>
- <div class="ms-font-l" data-i18n="officeMainHeader">Adds draw.io diagrams to your document.</div>
- </div>
-
- <p class="ms-font-xs welcome-intro" data-i18n="officeStepsHeader">This add-in performs the following steps:</p>
-
- <ul class="ms-List ordered-list">
- <li class="ms-ListItem">
- <span class="ms-ListItem-primaryText">1</span>
- <span class="ms-ListItem-secondaryText" data-i18n="officeStep1">Connects to Microsoft OneDrive, Google Drive, or your device.</span>
- <div class="clearfix"></div>
- </li>
- <li class="ms-ListItem">
- <span class="ms-ListItem-primaryText">2</span>
- <span class="ms-ListItem-secondaryText" data-i18n="officeStep2">Select a draw.io diagram.</span>
- <div class="clearfix"></div>
- </li>
- <li class="ms-ListItem">
- <span class="ms-ListItem-primaryText">3</span>
- <span class="ms-ListItem-secondaryText" data-i18n="officeStep3">Insert the diagram into the document.</span>
- <div class="clearfix"></div>
- </li>
- </ul>
- <div style="height:160px"></div>
- </div>
- </div>
-
- <div id="waitContainer" style="display:none">
- <div class="ms-Spinner"></div>
- <p class="ms-font-l ms-fontColor-themePrimary indentFromPaneEdge centeredText" data-i18n="officePopupInfo">
- Please complete the process in the pop-up window.
- </p>
- </div>
-
- <div id="selectFileContainer" style="display:none" class="allAreaContainer">
- <div id="backLnk"><span class="backLnk">&lt; <span data-i18n="back">Back</span></span></div>
- <div id="signOutLnk" class="signOutLnk" data-i18n="signout">Sign Out</div>
- <div class="ms-ContextualMenuExample" style="display: none">
- <div class="menuBtn" >
- <div class="menuBar"></div>
- <div class="menuBar"></div>
- <div class="menuBar"></div>
- </div>
- <ul class="ms-ContextualMenu is-hidden">
- <li class="ms-ContextualMenu-item">
- <a class="ms-ContextualMenu-link" id="updateSel" tabindex="1">Update Selected</a>
- </li>
- <li class="ms-ContextualMenu-item">
- <a class="ms-ContextualMenu-link" id="editSel" tabindex="1">Edit Selected</a>
- </li>
- <li class="ms-ContextualMenu-item">
- <a class="ms-ContextualMenu-link" id="manualUpdate" tabindex="1">Manual Update</a>
- </li>
- </ul>
- </div>
- <div id="filePickerTitle" class="ms-font-l ms-fontColor-themePrimary centeredText" style="padding-top:0px;">
- <div data-i18n="officeSelDiag" style="display: inline-block;">Select draw.io Diagram:</div>
- </div>
- <div id="filePickerWithPreview">
- <div class="odCatsList">
- <div class="odCatsListLbl">OneDrive</div>
- <div id="odFiles" class="odCatListTitle odCatSelected" data-i18n="files">Files</div>
- <div id="odRecent" class="odCatListTitle" data-i18n="recent">Recent</div>
- <div id="odShared" class="odCatListTitle" data-i18n="shared">Shared</div>
- <div id="odSharepoint" class="odCatListTitle" data-i18n="sharepoint">Sharepoint</div>
- </div>
- <div class="odFilesSec">
- <div class="searchBar" style="display:none">
- <input type="search" id="odSearchBox" placeholder="Search">
- </div>
- <div class="odFilesBreadcrumb">
- </div>
- <div id="refreshOD" class="odRefreshButton">
- <img src="https://www.draw.io/images/update32.png" width="16" height="16" title="Refresh" border="0" data-i18n-title="refresh"/>
- </div>
- <div class="odFilesList">
- </div>
- </div>
- <div style="text-align: center;" id="preview">
- </div>
- </div>
- <div class="bottomBtns">
- <button id="addODFile" class="ms-Button ms-Button--primary" style="margin-top: 5px"><span class="ms-Button-label" data-i18n="insert">Insert</span></button>
- <button style="display: none" id="editODFile" class="ms-Button ms-Button smallBtn"><span class="ms-Button-label" data-i18n="edit">Edit</span></button>
- <button style="display: none" id="newFile" class="ms-Button ms-Button smallBtn"><span class="ms-Button-label" data-i18n="new">New</span></button>
- <a class="ms-Button smallBtn" id="editODFile2" href="https://www.draw.io/?mode=onedrive" target="_blank"><span class="ms-Button-label" data-i18n="edit">Edit</span></a>
- <a class="ms-Button smallBtn" id="newFile2" href="https://www.draw.io/?mode=onedrive" target="_blank"><span class="ms-Button-label" data-i18n="new">New</span></a>
- </div>
- </div>
-
- <div id="insertErrorContainer" style="display:none" class="allAreaContainer">
- <div id="inserErrMsg">
- <div class="ms-MessageBar ms-MessageBar--error">
- <div class="ms-MessageBar-content">
- <div class="ms-MessageBar-icon">
- <i class="ms-Icon ms-Icon--ErrorBadge"></i>
- </div>
- <div class="ms-MessageBar-text" style="font-size: 15px" data-i18n="officeCopyImgErrMsg">
- An error prevented draw.io from adding the image directly to the document. This is due to some limitations in the host application.
- Please manually copy the image then paste it to the document.
- </div>
- </div>
- </div>
- <p data-i18n="officeCopyImgInst">
- Instructions: Right-click the image below. Select "Copy image" from the context menu. Then, in the document, right-click and select "Paste" from the context menu.
- </p>
- </div>
- <div id="imgContainer">
- <img id="manualCopyImg">
- </div>
- <div id="insertErrorBtns" class="bottomBtns">
- <button id="backBtn" class="ms-Button ms-Button--primary" style="margin-top: 5px"><span class="ms-Button-label" data-i18n="cancel">Cancel</span></button>
- </div>
- </div>
-
- <div id="manualUpdateContainer" style="display:none" class="allAreaContainer">
- <p data-i18n="officeManualUpdateInst">
- Instructions: Copy draw.io diagram from the document. Then, in the box below, right-click and select "Paste" from the context menu.
- </p>
- <div id="editableDiv" contenteditable="true" data-i18n="pasteDiagram">Paste draw.io diagram here</div>
- <div id="manualUpdateBtns" class="bottomBtns">
- <button id="backBtn2" class="ms-Button ms-Button--primary" style="margin-top: 5px"><span class="ms-Button-label" data-i18n="cancel">Cancel</span></button>
- </div>
- </div>
-
- <footer id="footerButton" class="footer ms-bgColor-neutralLight" style="display:none">
- <div class="container">
- <p align="center">
- <button id="loginO365PopupButton" class="serviceBtn ms-Button ms-Button--primary"><span class="ms-Button-label" data-i18n="pickODFile">Pick OneDrive File</span></button>
- </p>
- <p align="center">
- <button id="driveBtn" class="serviceBtn ms-Button ms-Button--primary"><span class="ms-Button-label" data-i18n="pickGDriveFile">Pick Google Drive File</span></button>
- </p>
- <p align="center">
- <button id="deviceBtn" class="serviceBtn ms-Button ms-Button--primary"><span class="ms-Button-label" data-i18n="pickDeviceFile">Pick Device File</span></button>
- </p>
- </div>
- </footer>
- <div id="notification-message">
- <div class="padding">
- <div id="notification-message-close"></div>
- <div id="notification-message-header"></div>
- <div id="notification-message-body"></div>
- </div>
- </div>
- <script type="text/javascript" src="js/index.js"></script>
-</body>
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/js/app.js b/src/main/webapp/connect/office365/js/app.js
deleted file mode 100644
index 71f82ad6..00000000
--- a/src/main/webapp/connect/office365/js/app.js
+++ /dev/null
@@ -1,612 +0,0 @@
-/* Common app functionality */
-
-(function ()
-{
- RESOURCE_BASE = '/resources/dia';
- PROXY_URL = '/proxy';
-
- var EXPORT_URL = 'https://exp.draw.io/ImageExport4/export';
- var PIXELS_TO_POINTS = 72 / 96;
-
- if (!window.AC)
- {
- alert('Error: this application requires ac.js to be loaded first');
- return;
- }
-
- var app = {};
- var _dlg;
-
- // Common initialization function (to be called from each page)
- app.initialize = function (spinner)
- {
- app.hideNotification = function()
- {
- AC.$('#notification-message').style.transform = 'scaleY(0)';
- //Older browsers
- setTimeout(function()
- {
- AC.$('#notification-message').style.display = 'none';
- }, 500);
- };
-
- AC.$('#notification-message-close').addEventListener('click', app.hideNotification);
-
- // After initialization, expose a common notification function
- app.showNotification = function (header, text)
- {
- AC.$('#notification-message-header').innerHTML = AC.htmlEntities(header);
- AC.$('#notification-message-body').innerHTML = AC.htmlEntities(text);
- AC.$('#notification-message').style.display = 'block';
- //Older browsers
- setTimeout(function()
- {
- AC.$('#notification-message').style.transform = 'scaleY(1)';
- }, 50);
- };
-
- app.spinner = spinner;
- };
-
- app.initI18n = function(callback)
- {
- var lang = window.Office != null? Office.context.displayLanguage : null;
-
- if (lang != null)
- {
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- lang = lang.substring(0, dash);
- }
-
- lang = lang.toLowerCase();
- }
-
- app.lang = lang;
- window.mxLanguage = lang;
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, lang) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, lang);
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- callback();
- });
- };
-
- // This handler responds to the success or failure message that the pop-up dialog receives from the identity provider
- // and access token provider.
- function processODMessage(arg)
- {
- var authInfo = null;
-
- try
- {
- authInfo = JSON.parse(arg.message);
- }
- catch(e){}
-
- if (authInfo != null && authInfo.access_token != null)
- {
- if (app.resume)
- {
- app.spinner.spin();
- app.resume = false;
- }
-
- // We now have a valid access token.
- _dlg.close();
- //save the tokens
- AC.token = authInfo.access_token;
- authInfo.expiresOn = Date.now() + authInfo.expires_in * 1000;
- authInfo.remember = true;
- AC.setPersistentAuth(authInfo);
-
- for (var i = 0; i < AC.reqQueue.length; i++)
- {
- AC.reqQueue[i].success();
- }
-
- AC.reqQueue = [];
- }
- else
- {
- // Something went wrong with authentication or the authorization of the web application.
- _dlg.close();
- app.showNotification(mxResources.get('authFailed'), mxResources.get('officeFailedAuthMsg'));
- }
- };
-
- // This handler responds to the success of Google Drive picker
- function processDriveMessage(arg, callback)
- {
- var fileInfo = null;
-
- try
- {
- fileInfo = JSON.parse(arg.message);
- }
- catch(e){}
-
- if (fileInfo != null)
- {
- if (fileInfo.error)
- {
- AC.showError(fileInfo.error);
- app.showStartPage();
- }
- else
- {
- app.spinner.spin();
- app.resume = false;
-
- callback(fileInfo);
- }
- _dlg.close();
- }
- else
- {
- // Something went wrong
- _dlg.close();
- app.showStartPage();
- }
- };
-
- app.showStartPage = function()
- {
- AC.$('#connectContainer').style.display = 'block';
- AC.$('.welcome-body').style.display = 'block';
- AC.$('#footerButton').style.display = 'block';
- AC.$('#waitContainer').style.display = 'none';
- AC.$('#selectFileContainer').style.display = 'none';
- };
-
- // Use the Office dialog API to open a pop-up and display the sign-in page for the identity provider.
- function showODLoginPopup()
- {
- var req = new XMLHttpRequest();
- req.open('GET', AC.redirectUri + '?getState=1');
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- showODLoginPopupStep2(req.responseText);
- }
- else
- {
- AC.showError('Unexpected Error. Please try again later.');
- }
- }
- };
-
- req.send();
- };
-
- function showODLoginPopupStep2(state)
- {
- AC.$('#connectContainer').style.display = 'none';
- AC.$('#footerButton').style.display = 'none';
- AC.$('#waitContainer').style.display = 'block';
- var url = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize' +
- '?client_id=' + AC.clientId + '&response_type=code' +
- '&redirect_uri=' + encodeURIComponent(AC.redirectUri) +
- '&scope=' + encodeURIComponent(AC.scopes) +
- '&state=' + encodeURIComponent('cId=' + AC.clientId + '&domain=' + window.location.hostname + '&ver=2&token=' + state); //To identify which app/domain is used
-
- // height and width are percentages of the size of the parent Office application, e.g., PowerPoint, Excel, Word, etc.
- Office.context.ui.displayDialogAsync(url,
- {height: 50, width: 50, promptBeforeOpen: false}, function (result)
- {
- _dlg = result.value;
- _dlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogMessageReceived, processODMessage);
- _dlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogEventReceived, app.showStartPage);
- });
- };
-
- app.showDrivePopup = function(callback)
- {
- AC.$('#connectContainer').style.display = 'none';
- AC.$('#footerButton').style.display = 'none';
- AC.$('#waitContainer').style.display = 'block';
- var url = 'https://' + window.location.hostname + '/connect/office365/drive.html';
-
- //height and width are percentages of the size of the parent Office application, e.g., PowerPoint, Excel, Word, etc.
- Office.context.ui.displayDialogAsync(url,
- {height: 65, width: 65, promptBeforeOpen: false}, function (result)
- {
- _dlg = result.value;
-
- _dlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogMessageReceived, function(arg)
- {
- processDriveMessage(arg, callback);
- });
-
- _dlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogEventReceived, app.showStartPage);
- });
- };
-
- function fetchImage(fileDoc, fileInfo, callback)
- {
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
- callback(null);
- }, 25000);
-
- var req = new mxXmlRequest(EXPORT_URL, 'format=png&base64=1&scale=auto' +
- (fileInfo.layers != null? '&extras=' + encodeURIComponent(JSON.stringify({layers: fileInfo.layers})) : '') +
- (fileInfo.pageId != null? '&pageId=' + fileInfo.pageId : '') + '&xml=' + encodeURIComponent(mxUtils.getXml(fileDoc)));
-
- req.send(function(req)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- callback(req.getStatus() >= 200 && req.getStatus() <= 299? req.getText() : null);
- }
- },
- function()
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- callback(null);
- }
- });
- };
-
- app.getRecentList = function()
- {
- return JSON.parse(Office.context.document.settings.get('drawioRecentList'));
- };
-
- app.addToRecent = function(file)
- {
- var recentList = app.getRecentList() || {};
-
- //@microsoft.graph.downloadUrl is valid for a short time only, so remove it
- delete file['@microsoft.graph.downloadUrl'];
- recentList[file.id] = file;
- Office.context.document.settings.set('drawioRecentList', JSON.stringify(recentList));
-
- Office.context.document.settings.saveAsync(function (asyncResult)
- {
- //Currently we ignore saving errors and just log it to console
- if (asyncResult.status == Office.AsyncResultStatus.Failed)
- {
- console.log('Settings save failed. Error: ' + asyncResult.error.message);
- }
- });
- };
-
- app.insertImageInDoc = function(diagViewer, fileDoc, fileInfo, callback, error, picIndex, selectionOnly, forceServer)
- {
- // TODO: How to get pageWidth in Word/PPT
- var pageWidth = 800;
- var scale = diagViewer.graph.currentScale;
- var b = diagViewer.graph.getGraphBounds();
-
- var page = diagViewer.currentPage;
- var imgW = b.width / scale * PIXELS_TO_POINTS, imgH = b.height / scale * PIXELS_TO_POINTS;
- var layers = [];
-
- var model = diagViewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- if (model.isVisible(model.getChildAt(model.root, i)))
- layers.push(i);
- }
-
- fileInfo['pageId'] = diagViewer.diagrams[diagViewer.currentPage].getAttribute('id');
- fileInfo['layers'] = layers;
-
- function doInsertImage(base64Img)
- {
- if (base64Img == null)
- {
- error(mxResources.get('convertingDiagramFailed'))
- return;
- }
-
- var config = {
- coercionType: Office.CoercionType.Image,
- imageWidth: imgW,
- imageHeight: imgH
- };
-
- function onErrorFallback(errMsg)
- {
- if (AC.headless)
- {
- var copyImgErrMsg = mxResources.get('officeCopyImgErrMsg', null,
- 'An error prevented draw.io from adding the image directly to the document. This is due to some limitations in the host application. \n' +
- 'Please manually copy the image then paste it to the document. \n\n' +
- mxResources.get('officeInsertImgFailed', null, 'Inserting image failed') + ': ' + errMsg);
-
- var copyImgInstMsg = mxResources.get('officeCopyImgInst');
-
- AC.hideMsg(function()
- {
- Office.context.ui.displayDialogAsync('https://' + window.location.hostname + '/connect/office365/img-viewer.html?errMsg=' +
- encodeURIComponent(copyImgErrMsg) +
- '&instMsg=' + encodeURIComponent(copyImgInstMsg) +
- '#' + base64Img,
- {height: 50, width: 50});
- });
-
- error();
- }
- else
- {
- error(mxResources.get('insertingImageFailed') + ': ' + errMsg);
-
- AC.$('#selectFileContainer').style.display = 'none';
- AC.$('#insertErrorContainer').style.display = 'block';
- AC.$('#manualCopyImg').src = 'data:image/png;base64,' + base64Img;
- }
- };
-
- if (Office.context.requirements.isSetSupported('WordApi', 1.2))
- {
- Word.run(function (context)
- {
- function doReplace(replaceItem)
- {
- var picture = replaceItem.insertInlinePictureFromBase64(base64Img, Word.InsertLocation.replace);
- picture.load('width, height');
-
-
- return context.sync().then(function ()
- {
- var props = {};
-
- //Exclude device files as it cannot be refreshed
- if (fileInfo.type != null)
- {
- props.altTextDescription = 'https://' + window.location.hostname + '/?open=' +
- encodeURIComponent(fileInfo.type == 'OneDrive'? ('W' + fileInfo.driveId + '/' + fileInfo.id)
- : ('G' + fileInfo.id)) +
- '&local-data=' + encodeURIComponent(JSON.stringify(fileInfo))
- }
-
- //Word will resize the image to fit the page and if we set the actual size, then it will go beyond the page boundaries
- if (picture.width > imgW && picture.height > imgH)
- {
- props.width = imgW;
- props.height = imgH;
- }
-
- picture.set(props);
-
- context.sync().then(function ()
- {
- callback();
- });
- });
- }
-
- if (picIndex != null)
- {
- var docPart = selectionOnly? context.document.getSelection() : context.document.body;
- var pics = docPart.inlinePictures;
- pics.load('items');
-
- return context.sync().then(function ()
- {
- doReplace(pics.items[picIndex]);
- });
- }
- else
- {
- return doReplace(context.document.getSelection());
- }
- })
- .catch(function (error)
- {
- var errMsg = error.message;
- console.log('Error: ' + JSON.stringify(error));
-
- if (error instanceof OfficeExtension.Error)
- {
- errMsg = error.debugInfo? error.debugInfo.message : errMsg;
- }
-
- errMsg = errMsg || 'Unknown Error';
- onErrorFallback(errMsg);
- });
- }
- else
- {
- Office.context.document.setSelectedDataAsync(base64Img, config, function (asyncResult)
- {
- if (asyncResult.status === Office.AsyncResultStatus.Failed)
- {
- onErrorFallback(asyncResult.error.message);
- }
- else
- {
- callback();
- }
- });
- }
- };
-
- function serverFallback()
- {
- fetchImage(fileDoc, fileInfo, doInsertImage);
- };
-
- try
- {
- if (!forceServer && diagViewer.editor.isExportToCanvas())
- {
- var s = 1; //default scale
-
- //automatic scaling
- if (b.width < pageWidth & b.height < 1.5 * pageWidth)
- {
- s = 4;
- }
- else if (b.width < 2 * pageWidth & b.height < 3 * pageWidth)
- {
- s = 3;
- }
- else if (b.width < 4 * pageWidth && b.height < 6 * pageWidth)
- {
- s = 2;
- }
-
- diagViewer.editor.exportToCanvas(function(canvas)
- {
- var data = canvas.toDataURL('image/png');
- doInsertImage(data.substring(data.lastIndexOf(',') + 1));
- }
- , null, null, null, serverFallback /* on error go to server*/, null,
- null, s);
- }
- else
- {
- serverFallback();
- }
- }
- catch(e)
- {
- serverFallback();
- }
- };
-
- app.editDiagram = function(fileInfo, closeCallback, showPrompt, pageId)
- {
- var id;
-
- if (fileInfo.fromDrive || fileInfo.type == 'Drive')
- {
- id = 'G' + fileInfo.id;
- }
- else
- {
- id = 'W' + (fileInfo.driveId || fileInfo.parentReference.driveId) + '/' + fileInfo.id;
- }
-
- if (Office.context.platform == Office.PlatformType.PC) // PC has caching issues with draw.io
- {
- AC.showMsg(mxResources.get('officeClickToEdit'), false, true, false, false, id);
- }
- else
- {
- var params = [];
-
- if (app.lang != null)
- {
- params.push('lang=' + app.lang);
- }
-
- if (pageId != null)
- {
- params.push('page-id=' + encodeURIComponent(pageId));
- }
-
- Office.context.ui.displayDialogAsync('https://' + window.location.hostname + '/' +
- (params.length > 0 ? '?' + params.join('&') : '') +
- '#' + encodeURIComponent(id),
- {height: 90, width: 90, promptBeforeOpen: showPrompt? true : false}, function (result)
- {
- if (result.value != null && closeCallback != null)
- {
- result.value.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogEventReceived, function()
- {
- dialogCloseAsync(result.value, closeCallback);
- });
- }
- });
- }
- };
-
- //Override AC functionalities to match office 365
- AC.authOneDrive = function(success, error)
- {
- if (app.spinner)
- {
- app.spinner.stop();
- app.resume = true;
- }
-
- AC.reqQueue.push({success: success, error: error});
-
- showODLoginPopup();
- };
-
- AC.showError = function(err)
- {
- app.showNotification(mxResources.get('error'), err);
- };
-
- //TODO add support for openLinkId if menu is re-enabled
- AC.showMsg = function(msg, isError, isInfo, isSuccess, showBusy)
- {
- app.showNotification('', msg);
- var header = ''
-
- if (showBusy)
- {
- header = '<img src="/images/spin.gif">';
- }
-
- AC.$('#notification-message-header').innerHTML = header;
- };
-
- AC.hideMsg = function()
- {
- app.hideNotification();
- };
-
- window.app = app;
-}());
-
-//Source: https://theofficecontext.com/2017/07/27/officejs-second-dialog-does-not-display/
-/**
- * Closes the currently open dialog asynchronously.
- * This has an ugly workaround which is to try to set a new
- * event handler on the dialog until it fails. When it failed
- * we know the original dialog object was destroyed and we
- * can then proceed. The issue we are working around is that
- * if you call two dialogs back to back, the second one will
- * likely not open at all.
- * @param {Office.context.ui.dialog} dialog The dialog to be closed
- * @param {function()} asyncResult The callback when close is complete
- */
- function dialogCloseAsync(dialog, asyncResult)
- {
- // issue the close
- dialog.close();
- // and then try to add a handler
- // when that fails it is closed
- setTimeout(function()
- {
- try
- {
- dialog.addEventHandler(Office.EventType.DialogMessageReceived, function() {});
- dialogCloseAsync(dialog, asyncResult);
- }
- catch(e)
- {
- asyncResult(); // done - closed
- }
- }, 0);
-}
- \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/js/drive.js b/src/main/webapp/connect/office365/js/drive.js
deleted file mode 100644
index 228f045e..00000000
--- a/src/main/webapp/connect/office365/js/drive.js
+++ /dev/null
@@ -1,267 +0,0 @@
- var oauthToken, officeInitialized = false, refreshToken;
- var LS_KEY = 'oDrawGDrive';
-
- // See https://console.cloud.google.com/apis/credentials/oauthclient/850530949725.apps.googleusercontent.com?project=drawio-viewer
- // must match contents in WEB-INF/google_client_secret and WEB-INF/google_client_id
- var driveClientId = '850530949725.apps.googleusercontent.com';
-
- function onGDriveCallback(authInfo, callback)
- {
- oauthToken = authInfo.access_token;
- var expiresIn = authInfo.expires_in;
- refreshToken = authInfo.refresh_token || refreshToken;
-
- localStorage.setItem(LS_KEY, JSON.stringify({token: oauthToken, expires: Date.now() + parseInt(expiresIn) * 1000, refreshToken: refreshToken}));
-
- if (callback != null)
- {
- callback();
- }
- else
- {
- window.location = 'https://' + window.location.hostname + '/connect/office365/drive.html';
- }
- };
-
- function gotoAuthPage()
- {
- var req = new XMLHttpRequest();
- req.open('GET', 'https://' + window.location.hostname + '/google?getState=1');
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- gotoAuthPageStep2(req.responseText);
- }
- else
- {
- AC.showError('Unexpected Error. Please try again later.');
- }
- }
- };
-
- req.send();
- };
-
- function gotoAuthPageStep2(state)
- {
- window.location = 'https://accounts.google.com/o/oauth2/v2/auth?client_id=' + driveClientId +
- '&redirect_uri=' + encodeURIComponent('https://' + window.location.hostname + '/google') +
- '&response_type=code&access_type=offline&prompt=consent%20select_account&include_granted_scopes=true' +
- '&scope=' + encodeURIComponent('https://www.googleapis.com/auth/drive.readonly') +
- '&state=' + encodeURIComponent('cId=' + driveClientId + '&domain=' + window.location.hostname + '&ver=2&token=' + state);
- };
-
- function getAccessToken(onSuccess, onError)
- {
- var authInfo = localStorage.getItem(LS_KEY);
-
- if (authInfo != null)
- {
- try
- {
- authInfo = JSON.parse(authInfo);
-
- refreshToken = authInfo.refreshToken;
-
- //Almost expired, so new login is needed
- if (Date.now() - authInfo.expires > -300000)
- {
- if (refreshToken != null)
- {
- function doRefreshToken(state)
- {
- //Get another refresh token
- var req = new XMLHttpRequest();
- req.open('GET', 'https://' + window.location.hostname + '/google?state=' +
- encodeURIComponent('cId=' + driveClientId + '&domain=' + window.location.hostname + '&ver=2&token=' + state) +
- '&refresh_token=' + refreshToken);
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- onGDriveCallback(JSON.parse(req.responseText), onSuccess);
- }
- else // (Unauthorized) [e.g, invalid refresh token] (sometimes, the server returns errors other than 401 (e.g. 500))
- {
- onError();
- }
- }
- }
-
- req.send();
- };
-
- var req = new XMLHttpRequest();
- req.open('GET', 'https://' + window.location.hostname + '/google?getState=1');
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- doRefreshToken(req.responseText);
- }
- else
- {
- onError();
- }
- }
- };
-
- req.send();
- }
- else
- {
- authInfo = null; //No refresh token, then auth again (sometimes google doesn't return the refresh token!)
- }
- }
- }
- catch(e)
- {
- authInfo = null;
- }
- }
-
- if (authInfo == null)
- {
- onError();
- }
- else
- {
- oauthToken = authInfo.token;
- onSuccess();
- }
- };
-
- // Use the API Loader script to load google.picker and gapi.auth.
- function onApiLoad()
- {
- getAccessToken(function()
- {
- gapi.load('picker', onPickerApiLoad);
- }, gotoAuthPage);
- };
-
- // Create and render a Picker object for picking user files.
- function onPickerApiLoad()
- {
- var view1 = new google.picker.DocsView(google.picker.ViewId.FOLDERS)
- .setParent('root')
- .setIncludeFolders(true)
- .setMimeTypes('*/*');
-
- var view2 = new google.picker.DocsView()
- .setIncludeFolders(true)
-
- var view3 = new google.picker.DocsView()
- .setEnableDrives(true)
- .setIncludeFolders(true)
-
- var view4 = new google.picker.DocsUploadView()
- .setIncludeFolders(true);
-
- var dim = AC.getDocDim();
-
- var builder = new google.picker.PickerBuilder()
- .addView(view1)
- .addView(view2)
- .addView(view3)
- .addView(view4)
- .addView(google.picker.ViewId.RECENTLY_PICKED)
- .enableFeature(google.picker.Feature.SUPPORT_DRIVES)
- .setOAuthToken(oauthToken)
- .setCallback(pickerCallback)
- .setSize(dim.w - 10, dim.h - 10);
-
- picker = builder.build();
- picker.setVisible(true);
- };
-
- function toODriveObj(driveFile)
- {
- //Map Drive file to OneDrive expected fields
- driveFile.file = {mimeType: driveFile.mimeType};
- driveFile['@microsoft.graph.downloadUrl'] = driveFile.downloadUrl;
- driveFile.name = driveFile.title;
- driveFile.fromDrive = true;
-
- return driveFile;
- };
-
- function fetchFileInfo(id, callback, error)
- {
- var xhr = new XMLHttpRequest();
- xhr.open('GET',
- 'https://www.googleapis.com/drive/v2/files/' + id +
- '?fields=id,title,mimeType,modifiedDate,downloadUrl' +
- '&supportsAllDrives=true');
- xhr.setRequestHeader('Authorization', 'Bearer ' + oauthToken);
- xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
-
- xhr.onreadystatechange = function (e) {
- if (xhr.readyState === 4 && xhr.status === 200) {
- var obj = JSON.parse(xhr.response);
- obj.accessToken = oauthToken;
-
- callback(obj);
- } else if (xhr.readyState === 4) {
- error(xhr);
- }
- };
- xhr.send(null);
- };
-
- function pickerCallback(data)
- {
- if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED)
- {
- var doc = data[google.picker.Response.DOCUMENTS][0];
-
- if (officeInitialized)
- {
- fetchFileInfo(doc.id, function(doc)
- {
- Office.context.ui.messageParent(JSON.stringify(doc));
- }, function(xhr)
- {
- //Since the picker worked, it is unexpected to face an error while fetching more info about the file
- Office.context.ui.messageParent(JSON.stringify({'error': 'Unexpected Error! ' + xhr.response.replace()}));
- });
- }
- else
- {
- Office.context.ui.messageParent('{error: "Unexpected Error!"}'); //Very unlikely
- }
- }
-
- if (data[google.picker.Response.ACTION] == google.picker.Action.CANCEL)
- {
- window.close();
- }
- };
-
- function getGDriveFileInfo(id, callback, error)
- {
- getAccessToken(function()
- {
- fetchFileInfo(id, callback, error);
- }, function()
- {
- AC.showError(mxResources.get('officeNotLoggedGD'));
- });
- };
-
- function logoutGDrive()
- {
- oauthToken = null;
- refreshToken = null;
- localStorage.removeItem(LS_KEY);
- }; \ No newline at end of file
diff --git a/src/main/webapp/connect/office365/js/index.js b/src/main/webapp/connect/office365/js/index.js
deleted file mode 100644
index 4083e329..00000000
--- a/src/main/webapp/connect/office365/js/index.js
+++ /dev/null
@@ -1,1048 +0,0 @@
-(function ()
-{
- AC.headless = false;
-
- document.body.onselectstart = function()
- {
- return false;
- };
-
- var opts =
- {
- left: '50%',
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
- var selectedFile = null;
- var selectedDriveId = null;
- var selectedFileDoc = null;
- var selectedSiteId = null;
- var diagViewer = null;
- var requestInProgress = false;
- var breadcrumb = [];
- var tbHeight = GraphViewer.prototype.toolbarHeight;
- var prevDiv = AC.$('#preview');
- var prevW, prevH;
- var lastFolderArgs = null;
- var lastRenderedFile = null;
- var mode = null;
- var openFileInputElt = null;
-
- mxCellRenderer.prototype.minSvgStrokeWidth = 0.01;
-
- function renderBreadcrumb()
- {
- var bcDiv = AC.$('.odFilesBreadcrumb');
- bcDiv.innerHTML = '';
-
- for (var i = 0; i < breadcrumb.length - 1; i++)
- {
- var folder = document.createElement('span');
- folder.className = 'odBCFolder';
- folder.innerHTML = AC.htmlEntities(breadcrumb[i].name || mxResources.get('home'));
- bcDiv.appendChild(folder);
-
- (function(bcItem, index)
- {
- folder.addEventListener('click', function()
- {
- renderODFile(null);
- breadcrumb = breadcrumb.slice(0, index);
- fillFolderFiles(bcItem.driveId, bcItem.folderId, bcItem.siteId, bcItem.name);
- });
- })(breadcrumb[i], i);
-
- var sep = document.createElement('span');
- sep.innerHTML = ' &gt; ';
- bcDiv.appendChild(sep);
- }
-
- if (breadcrumb[breadcrumb.length - 1] != null)
- {
- var curr = document.createElement('span');
- curr.innerHTML = AC.htmlEntities((breadcrumb.length == 1) ?
- mxResources.get('officeSelDiag') : (breadcrumb[breadcrumb.length - 1].name || mxResources.get('home')));
- bcDiv.appendChild(curr);
- }
- }
-
- function openFile()
- {
- if (selectedFile == null || requestInProgress) return;
-
- if (selectedDriveId == 'sharepoint')
- {
- fillFolderFiles('site', null, selectedFile.id, selectedFile.displayName);
- }
- else if (selectedDriveId == 'site')
- {
- fillFolderFiles('subsite', null, selectedFile.id, selectedFile.name);
- }
- else
- {
- var isFolder = selectedFile.folder;
- selectedFile = selectedFile.remoteItem? selectedFile.remoteItem : selectedFile; //handle remote items which is accessed indirectly
- var folderDI = (selectedFile.parentReference? selectedFile.parentReference.driveId : null) || selectedDriveId;
- var id = selectedFile.id;
-
- if (isFolder)
- {
- fillFolderFiles(folderDI, id, null, selectedFile.name);
- }
- else
- {
- insertImage();
- }
- }
- };
-
- function fillFolderFiles(driveId, folderId, siteId, folderName, searchTxt)
- {
- if (requestInProgress) return;
-
- AC.$('.odCatsList').style.display = 'block';
- AC.$('.odFilesSec').style.display = 'block';
- AC.$('#signOutLnk').style.display = '';
- prevDiv.innerHTML = '';
- prevDiv.style.top = '50%';
-
- requestInProgress = true;
- var acceptRequest = true;
- var isSharepointSites = 0;
- lastFolderArgs = arguments;
-
- function renderList(potintialDrawioFiles)
- {
- spinner.stop();
-
- if (potintialDrawioFiles.length == 0)
- {
- var emptyMsg = document.createElement('div');
- emptyMsg.className = 'odEmptyFolder';
- emptyMsg.innerHTML = AC.htmlEntities(mxResources.get('folderEmpty', null, 'Folder is empty!'));
- filesList.appendChild(emptyMsg);
- requestInProgress = false;
- renderBreadcrumb();
- return;
- }
-
- var grid = document.createElement('table');
- grid.className = 'odFileListGrid';
- filesList.appendChild(grid);
- var currentItem = null;
- var count = 0;
-
- //TODO support paging
- for (var i = 0; i < potintialDrawioFiles.length; i++)
- {
- var item = potintialDrawioFiles[i];
-
- if (isSharepointSites == 1 && item.webUrl && !(item.webUrl.indexOf('sharepoint.com/sites/') > 0 || item.webUrl.indexOf('sharepoint.com/') < 0))
- {
- continue;
- }
-
- var title = item.displayName || item.name;
- var tooltip = AC.htmlEntities(item.description || title);
- var titleLimit = 25;
-
- if (title != null && title.length > titleLimit)
- {
- title = AC.htmlEntities(title.substring(0, titleLimit)) + '&hellip;';
- }
- else
- {
- title = AC.htmlEntities(title);
- }
-
- if (isSharepointSites)
- {
- item.folder = true;
- }
-
- var isFolder = item.folder != null;
- var row = document.createElement('tr');
- row.className = (count++) % 2? 'odOddRow' : 'odEvenRow';
- var td = document.createElement('td');
- td.style.width = "24px";
- var typeImg = document.createElement('img');
- typeImg.src = '/images/' + (isFolder? 'folder.png' : 'file.png');
- typeImg.className = 'odFileImg';
- typeImg.width = 24;
- td.appendChild(typeImg);
-
- row.appendChild(td);
- td = document.createElement('td');
- var titleSpan = document.createElement('span');
- titleSpan.className = "odFileTitle";
- titleSpan.innerHTML = AC.htmlEntities(title);
- titleSpan.setAttribute('title', tooltip);
- td.appendChild(titleSpan);
- row.appendChild(td);
- grid.appendChild(row);
-
- if (currentItem == null)
- {
- currentItem = row;
- currentItem.className += ' odRowSelected';
- selectedFile = item;
- selectedDriveId = driveId;
- renderODFile(selectedFile);
- }
-
- (function(item2, row2)
- {
- row.addEventListener('dblclick', openFile);
-
- row.addEventListener('click', function()
- {
- if (currentItem != row2)
- {
- currentItem.className = currentItem.className.replace('odRowSelected', '');
- currentItem = row2;
- currentItem.className += ' odRowSelected';
- selectedFile = item2;
- selectedDriveId = driveId;
-
- renderODFile(selectedFile);
- }
- });
- })(item, row);
- }
- renderBreadcrumb();
- requestInProgress = false;
- };
-
- var timeoutThread = setTimeout(function()
- {
- acceptRequest = false;
- requestInProgress = false;
- spinner.stop();
- AC.showError(mxResources.get('timeout'));
- }, 20000); //20 sec timeout
-
- var filesList = AC.$('.odFilesList');
- filesList.innerHTML = '';
- spinner.spin(filesList);
-
- var url;
-
- switch(driveId)
- {
- case 'recent':
- breadcrumb = [{name: mxResources.get('recent', null, 'Recent'), driveId: driveId}];
- var recentList = app.getRecentList() || {};
- var list = [];
-
- for (var id in recentList)
- {
- list.push(recentList[id]);
- }
-
- clearTimeout(timeoutThread);
- renderList(list);
- return;
- case 'shared':
- url = '/me/drive/sharedWithMe';
- breadcrumb = [{name: mxResources.get('sharedWithMe', null, 'Shared With Me'), driveId: driveId}];
- break;
- case 'sharepoint':
- url = '/sites?search=';
- breadcrumb = [{name: mxResources.get('sharepointSites', null, 'Sharepoint Sites'), driveId: driveId}];
- isSharepointSites = 1;
- break;
- case 'site':
- breadcrumb.push({name: folderName, driveId: driveId, folderId: folderId, siteId: siteId});
- url = '/sites/' + siteId + '/drives';
- isSharepointSites = 2;
- break;
- case 'subsite':
- breadcrumb.push({name: folderName, driveId: driveId, folderId: folderId, siteId: siteId});
- url = '/drives/' + siteId + (folderId? '/items/' + folderId : '/root') + '/children';
- break;
- case 'search': //TODO search doesn't return any results, find out why then remove display: none from the searchBox
- driveId = selectedDriveId;
- breadcrumb = [{driveId: driveId, name: mxResources.get('back', null, 'Back')}];
- searchTxt = encodeURIComponent(searchTxt.replace(/\'/g, '\\\''));
- url = selectedSiteId? '/sites/' + selectedSiteId + '/drive/root/search(q=\'' + searchTxt + '\')' : (driveId? '/drives/' + driveId + '/root/search(q=\'' + searchTxt + '\')' : '/me/drive/root/search(q=\'' + searchTxt + '\')');
- break;
- default:
- if (folderId == null)
- {
- breadcrumb = [{driveId: driveId}];
- }
- else
- {
- breadcrumb.push({name: folderName, driveId: driveId, folderId: folderId});
- }
-
- url = (driveId? '/drives/' + driveId : '/me/drive') + (folderId? '/items/' + folderId : '/root') + '/children';
- }
-
- if (!isSharepointSites)
- {
- url += (url.indexOf('?') > 0 ? '&' : '?') + 'select=id,name,description,parentReference,file,createdBy,lastModifiedBy,lastModifiedDateTime,size,folder,remoteItem,@microsoft.graph.downloadUrl';
- }
-
- AC.doAuthRequest(url, 'GET', null, function(resp)
- {
- if (!acceptRequest) return;
- clearTimeout(timeoutThread);
-
- var list = resp.value;
-
- var potintialDrawioFiles = isSharepointSites? list : [];
-
- for (var i = 0; !isSharepointSites && i < list.length; i++)
- {
- var file = list[i];
- var mimeType = file.file? file.file.mimeType : null;
-
- if (file.folder || mimeType == 'text/html' || mimeType == 'text/xml' || mimeType == 'application/xml' || mimeType == 'image/png'
- || /\.svg$/.test(file.name) || /\.html$/.test(file.name) || /\.xml$/.test(file.name) || /\.png$/.test(file.name)
- || /\.drawio$/.test(file.name))
- {
- potintialDrawioFiles.push(file);
- }
- }
-
- renderList(potintialDrawioFiles);
- },
- function(err)
- {
- if (!acceptRequest) return;
- clearTimeout(timeoutThread);
-
- var errMsg = null;
-
- try
- {
- errMsg = JSON.parse(err.responseText).error.message;
- }
- catch(e){} //ignore errors
-
- AC.showError(mxResources.get('errorFetchingFolder', null, 'Error fetching folder items') +
- (errMsg != null? ' (' + errMsg + ')' : ''));
- requestInProgress = false;
- spinner.stop();
- });
- };
-
- var selectedCat = AC.$('#odFiles');
-
- var cats = AC.$$('.odCatListTitle');
-
- for (var i = 0; i < cats.length; i++)
- {
- cats[i].addEventListener('click', function()
- {
- if (requestInProgress) return;
-
- selectedCat.className = selectedCat.className.replace('odCatSelected', '');
- selectedCat = this;
- selectedCat.className += ' odCatSelected';
-
- switch(this.id)
- {
- case 'odFiles':
- fillFolderFiles();
- break;
- case 'odRecent':
- fillFolderFiles('recent');
- break;
- case 'odShared':
- fillFolderFiles('shared');
- break;
- case 'odSharepoint':
- fillFolderFiles('sharepoint');
- break;
- }
- });
- }
-
- var insertingImage = false;
- var loadingPreviewFile = null;
-
- function renderDeviceFile(deviceFile)
- {
- AC.$('#footerButton').style.display = 'none';
- AC.$('#waitContainer').style.display = 'none';
- AC.$('#selectFileContainer').style.display = 'block';
- AC.$(".welcome-body").style.display = 'none';
- AC.$("#connectContainer").style.display = 'block';
-
- AC.$('.odCatsList').style.display = 'none';
- AC.$('.odFilesSec').style.display = 'none';
- prevDiv.style.top = '0px';
-
- AC.$('#signOutLnk').style.display = 'none';
-
- AC.$('#addODFile').setAttribute('disabled', 'disabled');
- AC.$('#editODFile2').setAttribute('href', 'javascript:void(0);');
- AC.$('#editODFile2').style.opacity = 0.5;
- AC.$('#newFile2').setAttribute('href', 'https://' + window.location.hostname + '/?mode=device');
- prevDiv.innerHTML = '';
-
- mode = 'D';
- selectedFile = deviceFile;
- spinner.spin(prevDiv);
- var reader = new FileReader();
-
- reader.onload = function(e)
- {
- try
- {
- var isPng = (deviceFile.type == 'image/png');
-
- var cnt = e.target.result;
-
- if (isPng)
- {
- cnt = 'data:image/png;base64,' + Editor.base64Encode (cnt);
- cnt = AC.extractGraphModelFromPng(cnt);
- }
-
- var doc = mxUtils.parseXml(cnt);
-
- if (new Editor().extractGraphModel(doc.documentElement) != null)
- {
- renderDoc(doc, cnt, deviceFile.name, true);
- lastRenderedFile = deviceFile;
- AC.$('#addODFile').removeAttribute('disabled');
- }
- else
- {
- reportRenderError(true);
- }
- }
- catch (e)
- {
- reportRenderError(false, e);
- }
-
- spinner.stop();
- };
-
- reader.readAsText(deviceFile);
- };
-
- function renderDriveFile(driveFile, callback)
- {
- toODriveObj(driveFile);
- mode = 'G';
- selectedFile = driveFile;
-
- AC.$('#footerButton').style.display = 'none';
- AC.$('#waitContainer').style.display = 'none';
- AC.$('#selectFileContainer').style.display = 'block';
- AC.$(".welcome-body").style.display = 'none';
- AC.$("#connectContainer").style.display = 'block';
-
- AC.$('.odCatsList').style.display = 'none';
- AC.$('.odFilesSec').style.display = 'none';
- prevDiv.style.top = '0px';
-
- AC.$('#signOutLnk').style.display = '';
-
- renderFile(driveFile, callback, true);
- };
-
- function renderODFile(file, callback)
- {
- if (file != null)
- {
- file.fromOD = true;
- }
-
- mode = 'W';
- renderFile(file, callback);
- };
-
- function renderDoc(doc, xml, filename, fullHeight, refreshFn)
- {
- selectedFileDoc = doc;
- var temp = AC.getDocDim();
- prevW = temp.w - 14;
- prevH = (fullHeight? temp.h - 67 : temp.h / 2 - 50) - tbHeight;
-
- var container = document.createElement('div');
- container.style.cssText = 'position:absolute;box-sizing:border-box;' +
- 'width:' + (prevW - 2) + 'px;height:' + prevH + 'px;margin-bottom:2px;border:1px solid transparent;';
-
- prevDiv.innerHTML = '';
- prevDiv.appendChild(container);
-
- var refreshImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAhFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8qm6wAAAAK3RSTlMABr4XDQoC07pc+/Yq5dzYtaiSjXlkMx4U8u/NwrKZf1gl8eDKb2lOR0Q6/VKNjQAAAKlJREFUGNOtjlcOwjAQBd1jOwnpvdNh738/kuA4iE/EfI1Gu9JD/4RTyr+bNxDHCS8FKp62CXWAlSYj0n6MNZziLOt90EC2OgXQ5osoF/aagr/GgsBeRUpSsUgeSikHbG4xFpssamCU0lIYZVuMDkFw9oxeTaUOgE74e0T1+Ki1wvOl8iHituojVDJJiAuNhwxlG9+Jhhm3sxGJiaFy7MMuvjFksavRD7wAhtIMKUShI2QAAAAASUVORK5CYII=';
-
- var btnDefs = refreshFn != null? {
- 'refresh': {title: mxResources.get('refresh'),
- image: refreshImg, handler: refreshFn
- }
- } : null;
-
- // Layers are enabled to allow selecting the visible layers in the image
- // LATER: Add visible layers to image data and support server-side flow.
- diagViewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', 'toolbar-buttons': btnDefs,
- border: 8, 'auto-fit': true, resize: false,
- nav: false, lightbox: false, 'toolbar-nohide': true,
- 'toolbar-position': 'top', toolbar: 'pages refresh layers', title: filename});
- };
-
- function reportRenderError(notDiag, error)
- {
- function addWarning(status)
- {
- var warnImg = document.createElement('img');
- warnImg.src = '/mxgraph/images/warning.png';
- warnImg.width = 16;
- warnImg.height = 16;
- status.appendChild(warnImg);
- mxUtils.br(status);
- };
-
- spinner.stop();
-
- var status = document.createElement('div');
- status.className = 'previewStatus';
-
- if (notDiag)
- {
- addWarning(status);
- mxUtils.write(status, mxResources.get('notADiagramFile'));
- }
- else
- {
- mxUtils.write(status, mxResources.get('error') + ':');
- mxUtils.br(status);
- mxUtils.write(status, error.message);
- }
-
- prevDiv.appendChild(status);
- };
-
- function renderFile(file, callback, fullHeight)
- {
- if (insertingImage) return;
-
- lastRenderedFile = null;
- prevDiv.innerHTML = '';
-
- AC.$('#addODFile').setAttribute('disabled', 'disabled');
- AC.$('#editODFile2').setAttribute('href', 'javascript:void(0);');
- AC.$('#editODFile2').style.opacity = 0.5;
-
- if (file == null || file.folder)
- {
- var status = document.createElement('div');
- status.className = 'previewStatus';
- mxUtils.write(status, mxResources.get('noPreview'));
- prevDiv.appendChild(status);
-
- return;
- }
-
- spinner.spin(prevDiv);
-
- try
- {
- // Workaround for parentReference access
- if (file.remoteItem != null)
- {
- file = file.remoteItem;
- }
-
- loadingPreviewFile = file;
-
- AC.checkDrawioFile(file, function(doc, xml, isDrawio)
- {
- file.isDrawio = isDrawio;
-
- if (loadingPreviewFile != file)
- {
- return;
- }
-
- lastRenderedFile = file;
-
- renderDoc(doc, xml, file.name, fullHeight, function()
- {
- renderFile(file, null, fullHeight);
- });
-
- AC.$('#addODFile').removeAttribute('disabled');
-
- // Open URL parameter is workaround for broken hash property in Word for Windows
- if (mode == 'G')
- {
- AC.$('#editODFile2').setAttribute('href', 'https://' + window.location.hostname + '/?open=' +
- encodeURIComponent('G' + file.id));
- AC.$('#newFile2').setAttribute('href', 'https://' + window.location.hostname + '/?mode=google');
- }
- else
- {
- AC.$('#editODFile2').setAttribute('href', 'https://' + window.location.hostname + '/?open=' +
- encodeURIComponent('W' + file.parentReference.driveId + '/' + file.id));
- AC.$('#newFile2').setAttribute('href', 'https://' + window.location.hostname + '/?mode=onedrive');
- }
-
- AC.$('#editODFile2').style.opacity = 1;
-
- spinner.stop();
-
- if (callback)
- {
- callback();
- }
- },
- function() //If the file is not a draw.io diagram
- {
- reportRenderError(true);
- });
- }
- catch (e)
- {
- reportRenderError(false, e);
- }
- };
-
- function insertImage()
- {
- if (insertingImage || (selectedFile != null && selectedFile.folder)) return;
-
- if (lastRenderedFile != selectedFile)
- {
- renderODFile(selectedFile, insertImage);
- return;
- }
-
- insertingImage = true;
- spinner.spin(AC.$('#loading'));
-
- var fileInfo = {};
-
- if (mode == 'W')
- {
- fileInfo = {
- type: 'OneDrive',
- id: selectedFile.id,
- driveId: selectedFile.parentReference.driveId,
- lastModifiedDate: selectedFile.lastModifiedDateTime
- };
-
- app.addToRecent(selectedFile);
- }
- else if (mode == 'G')
- {
- fileInfo = {
- type: 'Drive',
- id: selectedFile.id,
- lastModifiedDate: selectedFile.modifiedDate
- };
- }
-
- app.insertImageInDoc(diagViewer, selectedFileDoc, fileInfo,
- function()
- {
- spinner.stop();
- insertingImage = false;
- }, function(errorMsg)
- {
- AC.showError(errorMsg);
- spinner.stop();
- insertingImage = false;
- });
- };
-
- // The initialize function must be run each time a new page is loaded
- Office.initialize = function ()
- {
- var winDim = AC.getDocDim();
-// spinner.spin(AC.$('#loading'));
- app.initialize(spinner);
-
- app.initI18n(function()
- {
- prevW = winDim.w - 14;
- prevH = winDim.h / 2 - 50 - tbHeight;
-
- app.showStartPage();
-
- AC.$('#loginO365PopupButton').addEventListener('click', function()
- {
- var tmpAuth = localStorage.getItem('tmpODAuth');
-
- if (tmpAuth != null)
- {
- try
- {
- var authInfo = JSON.parse(tmpAuth);
-
- if (authInfo != null && authInfo.access_token != null)
- {
- //save the tokens
- AC.token = authInfo.access_token;
- authInfo.expiresOn = Date.now() + authInfo.expires_in * 1000;
- authInfo.remember = true;
- AC.setPersistentAuth(authInfo);
- }
- }
- catch(e){}
-
- localStorage.removeItem('tmpODAuth');
- }
-
- //OneDrive Auth before proceeding
- AC.confirmODAuth(function()
- {
- AC.$('#footerButton').style.display = 'none';
- AC.$('#waitContainer').style.display = 'none';
- AC.$('#selectFileContainer').style.display = 'block';
- AC.$(".welcome-body").style.display = 'none';
- AC.$("#connectContainer").style.display = 'block';
- fillFolderFiles();
-
- AC.$('#odSharepoint').style.display = AC.isPersonal ? 'none' : '';
- },
- function()
- {
- AC.showError(mxResources.get('errorAuthOD', null, 'Error authenticating to OneDrive!'));
- });
- });
-
- AC.$('#driveBtn').addEventListener('click', function()
- {
- app.showDrivePopup(renderDriveFile);
- });
-
- AC.$('#deviceBtn').addEventListener('click', function()
- {
- if (openFileInputElt == null)
- {
- var input = document.createElement('input');
- input.setAttribute('type', 'file');
-
- input.addEventListener('change', function()
- {
- if (input.files != null)
- {
- renderDeviceFile(input.files[0]);
-
- // Resets input to force change event for same file (type reset required for IE)
- input.type = '';
- input.type = 'file';
- input.value = '';
- }
- });
-
- input.style.display = 'none';
- document.body.appendChild(input);
- openFileInputElt = input;
- }
-
- openFileInputElt.click();
- });
-
- AC.$('#backLnk').addEventListener('click', app.showStartPage);
- AC.$('#signOutLnk').addEventListener('click', function()
- {
- if (mode == 'G')
- {
- logoutGDrive();
- }
- else
- {
- AC.setPersistentAuth(null); //Logout from OneDrive
- Office.context.ui.displayDialogAsync('https://login.microsoftonline.com/common/oauth2/v2.0/logout',
- {height: 50, width: 50, promptBeforeOpen: false});
- }
-
- app.showStartPage();
- });
-
- var delayTimer = null;
-
- function doSearch(searchStr)
- {
- if (requestInProgress) return;
- delayTimer = null;
- fillFolderFiles('search', null, null, null, searchStr)
- };
-
- //Use keyup to detect delete and backspace
- AC.$('#odSearchBox').addEventListener('keyup', function(evt)
- {
- var searchInput = this;
-
- if (delayTimer != null)
- {
- clearTimeout(delayTimer);
- }
-
- if (evt.keyCode == 13)
- {
- doSearch(searchInput.value);
- }
- else
- {
- delayTimer = setTimeout(function()
- {
- doSearch(searchInput.value);
- }, 500);
- }
- });
-
- function refreshFolder()
- {
- if (lastFolderArgs != null)
- {
- renderODFile(null);
- fillFolderFiles.apply(this, lastFolderArgs);
- }
- };
-
- //HTML elements localization
- var i18nElems = AC.$$('*[data-i18n]'); //get all elements having data-i18n attribute, should be fine given a small html file
-
- for (var i = 0; i < i18nElems.length; i++)
- {
- var i18nKey = i18nElems[i].getAttribute('data-i18n');
- i18nElems[i].innerHTML = AC.htmlEntities(mxResources.get(i18nKey, null, i18nElems[i].innerHTML));
- }
-
- var i18nTitleElems = AC.$$('*[data-i18n-title]'); //get all elements having data-i18n attribute, should be fine given a small html file
-
- for (var i = 0; i < i18nTitleElems.length; i++)
- {
- var i18nKey = i18nTitleElems[i].getAttribute('data-i18n-title');
- i18nTitleElems[i].setAttribute('title', AC.htmlEntities(mxResources.get(i18nKey, null, i18nTitleElems[i].getAttribute('title'))));
- }
-
- AC.$('#newFile').addEventListener('click', function()
- {
- Office.context.ui.displayDialogAsync('https://' + window.location.hostname + '/?mode=' + (mode == 'G'? 'google' : 'onedrive') + '&dt=' + Date.now() + (app.lang != null? '&lang=' + app.lang : ''),
- {height: 90, width: 90, promptBeforeOpen: false}, function (result)
- {
- //TODO open the new file's folder in the file manager
- _dlg = result.value;
-
- if (mode == 'W')
- {
- _dlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogEventReceived, refreshFolder);
- }
- });
- });
-
- // Workaround for caching issues in Windows inside popup is to use a link with target blank instead
- AC.$('#editODFile').addEventListener('click', function()
- {
- if (selectedFile == null || selectedFile.folder) return;
-
- app.editDiagram(selectedFile);
- });
-
- AC.$('#refreshOD').addEventListener('click', refreshFolder);
-
- AC.$('#addODFile').addEventListener('click', insertImage);
-
- AC.$('#backBtn').addEventListener('click', function()
- {
- AC.$('#selectFileContainer').style.display = 'block';
- AC.$('#insertErrorContainer').style.display = 'none';
- });
-
- AC.$('#backBtn2').addEventListener('click', function()
- {
- AC.$('#selectFileContainer').style.display = 'block';
- AC.$('#manualUpdateContainer').style.display = 'none';
- });
-
- var ContextualMenuElements = document.querySelectorAll(".ms-ContextualMenuExample");
-
- for (var i = 0; i < ContextualMenuElements.length; i++)
- {
- var ButtonElement = ContextualMenuElements[i].querySelector(".menuBtn");
- var ContextualMenuElement = ContextualMenuElements[i].querySelector(".ms-ContextualMenu");
- new fabric['ContextualMenu'](ContextualMenuElement, ButtonElement);
- }
-
- AC.$('#updateSel').addEventListener('click', function()
- {
- this.className = this.className.replace('is-selected', '');
- refreshSelImage({completed: function(){}});
- });
-
- AC.$('#editSel').addEventListener('click', function()
- {
- this.className = this.className.replace('is-selected', '');
- editSelImage({completed: function(){}});
- });
-
- AC.$('#manualUpdate').addEventListener('click', function()
- {
- this.className = this.className.replace('is-selected', '');
- AC.$('#manualUpdateContainer').style.display = 'block';
- AC.$('#selectFileContainer').style.display = 'none';
- AC.$('#insertErrorContainer').style.display = 'none';
- });
-
-// //Add selection change handler
-// Office.context.document.addHandlerAsync("documentSelectionChanged", selectionHandler, function(result){console.log(result)}
-// );
-//
-// // Event handler function.
-// function selectionHandler(eventArgs){
-// console.log(eventArgs)
-// }
-
- var editableDiv = AC.$('#editableDiv');
-
- function handlepaste (e)
- {
- var types, pastedData, savedContent;
-
- // Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
- if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData)
- {
- // Check for 'text/html' in types list. See abligh's answer below for deatils on
- // why the DOMStringList bit is needed
- types = e.clipboardData.types;
-
- if (((types instanceof DOMStringList) && types.contains("text/html")) ||
- (types.indexOf && types.indexOf('text/html') !== -1))
- {
-
- // Extract data and pass it to callback
- pastedData = e.clipboardData.getData('text/html');
- processPaste(pastedData);
-
- // Stop the data from actually being pasted
- e.stopPropagation();
- e.preventDefault();
- return false;
- }
- else
- {
- var imageFound = false;
- var items = e.clipboardData.items;
-
- for (index in items)
- {
- var item = items[index];
-
- if (item.kind === 'file')
- {
- var file = item.getAsFile();
-
- if (file && file.type == 'image/png')
- {
- imageFound = true;
- var reader = new FileReader();
-
- reader.onload = function(e)
- {
- handlePastedImage(e.target.result);
- };
-
- reader.readAsDataURL(file);
- break;
- }
- }
- }
-
- if (imageFound)
- {
- // Stop the data from actually being pasted
- e.stopPropagation();
- e.preventDefault();
- return false;
- }
- }
- }
-
- // Everything else: Move existing element contents to a DocumentFragment for safekeeping
- savedContent = document.createDocumentFragment();
-
- while(editableDiv.childNodes.length > 0)
- {
- savedContent.appendChild(editableDiv.childNodes[0]);
- }
-
- // Then wait for browser to paste content into it and cleanup
- waitForPastedData(editableDiv, savedContent);
- return true;
- }
-
- function waitForPastedData (elem, savedContent)
- {
- // If data has been processes by browser, process it
- if (elem.childNodes && elem.childNodes.length > 0)
- {
- // Retrieve pasted content via innerHTML
- // (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
- var pastedData = elem.innerHTML;
-
- // Restore saved content
- elem.innerHTML = "";
- elem.appendChild(savedContent);
-
- // Call callback
- processPaste(pastedData);
- }
- // Else wait 20ms and try again
- else
- {
- setTimeout(function ()
- {
- waitForPastedData(elem, savedContent)
- }, 20);
- }
- };
-
- function handlePastedImage(base64Img)
- {
- fileInfo = null;
-
- try
- {
- fileInfo = JSON.parse(AC.extractDataFromPng(base64Img, 'drawioFileInfo'));
- }
- catch(e){}
-
- if (fileInfo == null)
- {
- AC.showError(mxResources.get('noDiagrams'));
- }
- else
- {
- updateSelected(fileInfo, {completed: function(){}});
- }
- };
-
- function processPaste (pastedData)
- {
- var imgElems = mxUtils.parseXml(pastedData).getElementsByTagName('img');
-
- for (var i = 0; i < imgElems.length; i++)
- {
- handlePastedImage(imgElems[i].getAttribute('src'));
- break;
- }
- };
-
- editableDiv.addEventListener('paste', handlepaste, false);
- });
- };
-}());
diff --git a/src/main/webapp/connect/office365/manifest.xml b/src/main/webapp/connect/office365/manifest.xml
deleted file mode 100644
index b6c34f26..00000000
--- a/src/main/webapp/connect/office365/manifest.xml
+++ /dev/null
@@ -1,374 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<OfficeApp
- xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
- xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides"
- xsi:type="TaskPaneApp">
-
- <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. -->
-
- <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. -->
- <Id>e849ddb8-6bbd-4833-bd4b-59030099d63e</Id>
-
- <!--Version. Updates from the store only get triggered if there is a version change. -->
- <Version>1.0.0.0</Version>
- <ProviderName>JGraph Ltd</ProviderName>
- <DefaultLocale>en-US</DefaultLocale>
- <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. -->
- <DisplayName DefaultValue="draw.io" />
- <Description DefaultValue="Adds draw.io diagrams from OneDrive">
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <Override Locale="de-de" Value="draw.io Diagramme von OneDrive einfügen"/>
- </Description>
-
- <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. -->
- <IconUrl DefaultValue="https://www.draw.io/images/favicon-32x32.png" />
- <HighResolutionIconUrl DefaultValue="https://www.draw.io/images/drawlogo80.png"/>
-
- <SupportUrl DefaultValue="https://desk.draw.io/" />
-
- <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. -->
- <AppDomains>
- <AppDomain>https://login.microsoftonline.com</AppDomain>
- <AppDomain>https://exp.draw.io</AppDomain>
- <AppDomain>https://graph.microsoft.com</AppDomain>
- <AppDomain>https://www.draw.io</AppDomain>
- </AppDomains>
- <!--End Basic Settings. -->
-
- <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. -->
- <Hosts>
- <Host Name="Document" />
- <Host Name="Presentation" />
- <Host Name="Workbook" />
- </Hosts>
- <DefaultSettings>
- <SourceLocation DefaultValue="https://www.draw.io/connect/office365/index.html" />
- </DefaultSettings>
- <!-- End TaskPane Mode integration. -->
-
- <Permissions>ReadWriteDocument</Permissions>
-
- <!-- Begin Add-in Commands Mode integration. -->
- <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0">
-
- <!-- The Hosts node is required. -->
- <Hosts>
- <!-- Each host can have a different set of commands. -->
- <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. -->
- <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. -->
- <Host xsi:type="Document">
- <!-- Form factor. Currently only DesktopFormFactor is supported. -->
- <DesktopFormFactor>
- <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."-->
- <GetStarted>
- <!-- Title of the Getting Started callout. resid points to a ShortString resource -->
- <Title resid="drawio.GetStarted.Title"/>
-
- <!-- Description of the Getting Started callout. resid points to a LongString resource -->
- <Description resid="drawio.GetStarted.Description"/>
-
- <!-- Point to a url resource which details how the add-in should be used. -->
- <LearnMoreUrl resid="drawio.GetStarted.LearnMoreUrl"/>
- </GetStarted>
- <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called.
- Think of the FunctionFile as the code behind ExecuteFunction. -->
- <FunctionFile resid="drawio.FunctionFile.Url" />
-
- <!-- PrimaryCommandSurface is the main Office Ribbon. -->
- <ExtensionPoint xsi:type="PrimaryCommandSurface">
- <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. -->
- <OfficeTab id="TabInsert">
- <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. -->
- <Group id="drawio.Group1">
- <!-- Label for your group. resid must point to a ShortString resource. -->
- <Label resid="drawio.Group1Label" />
- <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. -->
- <!-- Use PNG icons. All URLs on the resources section must use HTTPS. -->
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- Control. It can be of type "Button" or "Menu". -->
- <Control xsi:type="Button" id="drawio.TaskpaneButton">
- <Label resid="drawio.TaskpaneButton.Label" />
- <Supertip>
- <!-- ToolTip title. resid must point to a ShortString resource. -->
- <Title resid="drawio.TaskpaneButton.Label" />
- <!-- ToolTip description. resid must point to a LongString resource. -->
- <Description resid="drawio.TaskpaneButton.Tooltip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. -->
- <Action xsi:type="ShowTaskpane">
- <TaskpaneId>drawioBtn</TaskpaneId>
- <!-- Provide a url resource id for the location that will be displayed on the task pane. -->
- <SourceLocation resid="drawio.Taskpane.Url" />
- </Action>
- </Control>
- <Control xsi:type="Button" id="drawio.refreshButton">
- <Label resid="drawio.refreshButton.label" />
- <Supertip>
- <Title resid="drawio.refreshButton.toolTipLbl" />
- <Description resid="drawio.refreshButton.toolTip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.refreshIcon_16x16" />
- <bt:Image size="32" resid="drawio.refreshIcon_32x32" />
- <bt:Image size="80" resid="drawio.refreshIcon_80x80" />
- </Icon>
- <Action xsi:type="ExecuteFunction">
- <FunctionName>refreshSelImages</FunctionName>
- </Action>
- </Control>
- <Control xsi:type="Button" id="drawio.refreshAllBtn">
- <Label resid="drawio.refreshAllBtn.label" />
- <Supertip>
- <Title resid="drawio.refreshAllBtn.toolTipLbl" />
- <Description resid="drawio.refreshAllBtn.toolTip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.refreshIcon_16x16" />
- <bt:Image size="32" resid="drawio.refreshIcon_32x32" />
- <bt:Image size="80" resid="drawio.refreshIcon_80x80" />
- </Icon>
- <Action xsi:type="ExecuteFunction">
- <FunctionName>refreshAllImages</FunctionName>
- </Action>
- </Control>
- <Control xsi:type="Button" id="drawio.editButton">
- <Label resid="drawio.editButton.label" />
- <Supertip>
- <Title resid="drawio.editButton.toolTipLbl" />
- <Description resid="drawio.editButton.toolTip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.editIcon_16x16" />
- <bt:Image size="32" resid="drawio.editIcon_32x32" />
- <bt:Image size="80" resid="drawio.editIcon_80x80" />
- </Icon>
- <Action xsi:type="ExecuteFunction">
- <FunctionName>editSelImage</FunctionName>
- </Action>
- </Control>
- </Group>
- </OfficeTab>
- </ExtensionPoint>
- </DesktopFormFactor>
- </Host>
- <Host xsi:type="Presentation">
- <!-- Form factor. Currently only DesktopFormFactor is supported. -->
- <DesktopFormFactor>
- <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."-->
- <GetStarted>
- <!-- Title of the Getting Started callout. resid points to a ShortString resource -->
- <Title resid="drawio.GetStarted.Title"/>
-
- <!-- Description of the Getting Started callout. resid points to a LongString resource -->
- <Description resid="drawio.GetStarted.Description"/>
-
- <!-- Point to a url resource which details how the add-in should be used. -->
- <LearnMoreUrl resid="drawio.GetStarted.LearnMoreUrl"/>
- </GetStarted>
- <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called.
- Think of the FunctionFile as the code behind ExecuteFunction. -->
- <FunctionFile resid="drawio.FunctionFile.Url" />
-
- <!-- PrimaryCommandSurface is the main Office Ribbon. -->
- <ExtensionPoint xsi:type="PrimaryCommandSurface">
- <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. -->
- <OfficeTab id="TabInsert">
- <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. -->
- <Group id="drawio.Group1">
- <!-- Label for your group. resid must point to a ShortString resource. -->
- <Label resid="drawio.Group1Label" />
- <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. -->
- <!-- Use PNG icons. All URLs on the resources section must use HTTPS. -->
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- Control. It can be of type "Button" or "Menu". -->
- <Control xsi:type="Button" id="drawio.TaskpaneButton">
- <Label resid="drawio.TaskpaneButton.Label" />
- <Supertip>
- <!-- ToolTip title. resid must point to a ShortString resource. -->
- <Title resid="drawio.TaskpaneButton.Label" />
- <!-- ToolTip description. resid must point to a LongString resource. -->
- <Description resid="drawio.TaskpaneButton.Tooltip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. -->
- <Action xsi:type="ShowTaskpane">
- <TaskpaneId>drawioBtn</TaskpaneId>
- <!-- Provide a url resource id for the location that will be displayed on the task pane. -->
- <SourceLocation resid="drawio.Taskpane.Url" />
- </Action>
- </Control>
- </Group>
- </OfficeTab>
- </ExtensionPoint>
- </DesktopFormFactor>
- </Host>
- <Host xsi:type="Workbook">
- <!-- Form factor. Currently only DesktopFormFactor is supported. -->
- <DesktopFormFactor>
- <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."-->
- <GetStarted>
- <!-- Title of the Getting Started callout. resid points to a ShortString resource -->
- <Title resid="drawio.GetStarted.Title"/>
-
- <!-- Description of the Getting Started callout. resid points to a LongString resource -->
- <Description resid="drawio.GetStarted.Description"/>
-
- <!-- Point to a url resource which details how the add-in should be used. -->
- <LearnMoreUrl resid="drawio.GetStarted.LearnMoreUrl"/>
- </GetStarted>
- <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called.
- Think of the FunctionFile as the code behind ExecuteFunction. -->
- <FunctionFile resid="drawio.FunctionFile.Url" />
-
- <!-- PrimaryCommandSurface is the main Office Ribbon. -->
- <ExtensionPoint xsi:type="PrimaryCommandSurface">
- <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. -->
- <OfficeTab id="TabInsert">
- <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. -->
- <Group id="drawio.Group1">
- <!-- Label for your group. resid must point to a ShortString resource. -->
- <Label resid="drawio.Group1Label" />
- <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. -->
- <!-- Use PNG icons. All URLs on the resources section must use HTTPS. -->
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- Control. It can be of type "Button" or "Menu". -->
- <Control xsi:type="Button" id="drawio.TaskpaneButton">
- <Label resid="drawio.TaskpaneButton.Label" />
- <Supertip>
- <!-- ToolTip title. resid must point to a ShortString resource. -->
- <Title resid="drawio.TaskpaneButton.Label" />
- <!-- ToolTip description. resid must point to a LongString resource. -->
- <Description resid="drawio.TaskpaneButton.Tooltip" />
- </Supertip>
- <Icon>
- <bt:Image size="16" resid="drawio.tpicon_16x16" />
- <bt:Image size="32" resid="drawio.tpicon_32x32" />
- <bt:Image size="80" resid="drawio.tpicon_80x80" />
- </Icon>
-
- <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. -->
- <Action xsi:type="ShowTaskpane">
- <TaskpaneId>drawioBtn</TaskpaneId>
- <!-- Provide a url resource id for the location that will be displayed on the task pane. -->
- <SourceLocation resid="drawio.Taskpane.Url" />
- </Action>
- </Control>
- </Group>
- </OfficeTab>
- </ExtensionPoint>
- </DesktopFormFactor>
- </Host>
- </Hosts>
-
- <!-- You can use resources across hosts and form factors. -->
- <Resources>
- <bt:Images>
- <bt:Image id="drawio.tpicon_16x16" DefaultValue="https://www.draw.io/images/favicon-16x16.png" />
- <bt:Image id="drawio.tpicon_32x32" DefaultValue="https://www.draw.io/images/favicon-32x32.png" />
- <bt:Image id="drawio.tpicon_80x80" DefaultValue="https://www.draw.io/images/drawlogo80.png" />
-
- <bt:Image id="drawio.refreshIcon_16x16" DefaultValue="https://www.draw.io/images/update16.png" />
- <bt:Image id="drawio.refreshIcon_32x32" DefaultValue="https://www.draw.io/images/update32.png" />
- <bt:Image id="drawio.refreshIcon_80x80" DefaultValue="https://www.draw.io/images/update80.png" />
-
- <bt:Image id="drawio.editIcon_16x16" DefaultValue="https://www.draw.io/images/edit16.png" />
- <bt:Image id="drawio.editIcon_32x32" DefaultValue="https://www.draw.io/images/edit32.png" />
- <bt:Image id="drawio.editIcon_80x80" DefaultValue="https://www.draw.io/images/edit80.png" />
- </bt:Images>
- <bt:Urls>
- <bt:Url id="drawio.Taskpane.Url" DefaultValue="https://www.draw.io/connect/office365/index.html" />
- <bt:Url id="drawio.GetStarted.LearnMoreUrl" DefaultValue="https://about.draw.io/" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="https://about.draw.io/"/>
- </bt:Url>
- <bt:Url id="drawio.FunctionFile.Url" DefaultValue="https://www.draw.io/connect/office365/function-file/function-file.html" />
- </bt:Urls>
- <!-- ShortStrings max characters==125. -->
- <bt:ShortStrings>
- <bt:String id="drawio.TaskpaneButton.Label" DefaultValue="draw.io" />
- <bt:String id="drawio.Group1Label" DefaultValue="draw.io" />
- <bt:String id="drawio.GetStarted.Title" DefaultValue="Get started with draw.io" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Erste Schritte mit draw.io"/>
- </bt:String>
- <bt:String id="drawio.refreshButton.label" DefaultValue="Update Selected" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markierung aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.refreshButton.toolTipLbl" DefaultValue="Update selected diagram" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markiertes Diagramm aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.refreshAllBtn.label" DefaultValue="Update All" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Alle aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.refreshAllBtn.toolTipLbl" DefaultValue="Update all draw.io diagrams" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Alle draw.io Diagramme aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.editButton.label" DefaultValue="Edit Selected" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markierung bearbeiten"/>
- </bt:String>
- <bt:String id="drawio.editButton.toolTipLbl" DefaultValue="Edit selected draw.io diagram" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markiertes draw.io Diagramm bearbeiten"/>
- </bt:String>
- </bt:ShortStrings>
- <!-- LongStrings max characters==250. -->
- <bt:LongStrings>
- <bt:String id="drawio.TaskpaneButton.Tooltip" DefaultValue="Click to manage draw.io diagrams">
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Hier klicken, um draw.io Diagramme zu verwalten"/>
- </bt:String>
- <bt:String id="drawio.GetStarted.Description" DefaultValue="draw.io add-in loaded successfully. Go to the INSERT tab and click the 'draw.io' button to get started." >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Das draw.io Add-in wurde erfolgreich geladen. Gehen Sie jetzt zum Reiter 'Einfügen' und klicken Sie auf draw.io."/>
- </bt:String>
- <bt:String id="drawio.refreshButton.toolTip" DefaultValue="Update selected draw.io diagram using its associated file" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Markiertes draw.io Diagramm von verknüpfter Datei aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.refreshAllBtn.toolTip" DefaultValue="Update all draw.io diagrams using their associated files" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Alle draw.io Diagramme von verknüpfter Datei aktualisieren"/>
- </bt:String>
- <bt:String id="drawio.editButton.toolTip" DefaultValue="Edit selected draw.io diagram from its associated file" >
- <!-- For a list of office supported languages, see https://docs.microsoft.com/en-us/previous-versions/office/office-2013-resource-kit/cc179219(v=office.15) -->
- <bt:Override Locale="de-de" Value="Verknüpfte Datei bearbeiten"/>
- </bt:String>
- </bt:LongStrings>
- </Resources>
- </VersionOverrides>
- <!-- End Add-in Commands Mode integration. -->
-
-</OfficeApp>
diff --git a/src/main/webapp/connect/onedrive_common/ac.js b/src/main/webapp/connect/onedrive_common/ac.js
deleted file mode 100644
index c5c47ea9..00000000
--- a/src/main/webapp/connect/onedrive_common/ac.js
+++ /dev/null
@@ -1,817 +0,0 @@
-//Add compatibility with existing AC of confluence
-if (typeof AC === 'undefined')
-{
- AC = {};
-}
-
-AC.host = window.location.host;
-
-switch(AC.host)
-{
- case 'test.draw.io':
- AC.clientId = '2e598409-107f-4b59-89ca-d7723c8e00a4';
- break;
- case 'confluence.draw.io':
- AC.clientId = 'aae1c620-4caf-41b3-9633-f6d0b6347dd9';
- break;
- case 'jira.draw.io':
- AC.clientId = '1afa9b7e-2533-4d86-83c0-c4d4678eca0e';
- break;
- default:
- AC.clientId = '45c10911-200f-4e27-a666-9e9fca147395';
-}
-
-AC.redirectUri = window.location.protocol + '//' + AC.host + '/microsoft';
-AC.pickerRedirectUri = window.location.protocol + '//' + AC.host + '/onedrive3.html';
-AC.defEndpoint = 'api.onedrive.com'; //This is the default endpoint for personal accounts
-AC.scopes = 'user.read files.read.all offline_access files.readwrite.all sites.read.all'; //Files.ReadWrite.All is needed for personal accounts createLink (embedded) and also for editing diagrams on draw.io
-AC.isLocalStorage = typeof(Storage) != 'undefined';
-AC.authLSKeyName = 'oneDriveAuthInfo'; //The same name as in draw.io
-AC.OneDriveBaseUrl = 'https://graph.microsoft.com/v1.0';
-AC.reqQueue = [];
-AC.authOnProgress = false;
-
-if (typeof CAC === 'undefined')
-{
- throw 'CAC object not found, please include file new_common/cac.js';
-}
-else
-{
- CAC.applyCAC(AC);
-}
-
-AC.authOneDrive = function(success, error, direct)
-{
- AC.reqQueue.push({success: success, error: error});
-
- if (AC.authOnProgress)
- {
- return;
- }
-
- AC.authOnProgress = true;
-
- if (window.onOneDriveCallback == null)
- {
- var authStep2 = function(state)
- {
- var acceptAuthResponse = true;
-
- var url = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize' +
- '?client_id=' + AC.clientId + '&response_type=code' +
- '&redirect_uri=' + encodeURIComponent(AC.redirectUri) +
- '&scope=' + encodeURIComponent(AC.scopes) +
- '&state=' + encodeURIComponent('cId=' + AC.clientId + '&domain=' + AC.host + '&ver=2&token=' + state); //To identify which app/domain is used
-
- var width = 525,
- height = 525,
- screenX = window.screenX,
- screenY = window.screenY,
- outerWidth = window.outerWidth,
- outerHeight = window.outerHeight;
-
- var left = screenX + Math.max(outerWidth - width, 0) / 2;
- var top = screenY + Math.max(outerHeight - height, 0) / 2;
-
- var features = ['width=' + width, 'height=' + height,
- 'top=' + top, 'left=' + left,
- 'status=no', 'resizable=yes',
- 'toolbar=no', 'menubar=no',
- 'scrollbars=yes'];
- var popup = window.open(url, 'odauth', features.join(','));
-
- if (popup != null)
- {
- window.onOneDriveCallback = function(authInfo, authWindow)
- {
- try
- {
- if (acceptAuthResponse)
- {
- window.onOneDriveCallback = null;
- acceptAuthResponse = false;
-
- try
- {
- if (authInfo == null)
- {
- error({message: 'Access Denied', retry: auth});
- }
- else
- {
- AC.token = authInfo.access_token;
- authInfo.expiresOn = Date.now() + authInfo.expires_in * 1000;
- authInfo.remember = true;
- AC.setPersistentAuth(authInfo);
-
- for (var i = 0; i < AC.reqQueue.length; i++)
- {
- AC.reqQueue[i].success();
- }
-
- AC.reqQueue = [];
- AC.authOnProgress = false;
- }
- }
- catch (e)
- {
- error(e);
- }
- finally
- {
- if (authWindow != null)
- {
- authWindow.close();
- }
- }
- }
- else if (authWindow != null)
- {
- authWindow.close();
- }
- }
- finally
- {
- authDialog.parentNode.removeChild(authDialog);
- }
- };
-
- popup.focus();
- }
- };
-
- var auth = function()
- {
- var req = new XMLHttpRequest();
- req.open('GET', AC.redirectUri + '?getState=1');
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- authStep2(req.responseText);
- }
- else
- {
- error(this);
- }
- }
- };
-
- req.send();
- };
-
- if (direct)
- {
- auth();
- }
- else
- {
- var authDialog = document.createElement('div');
- var btn = document.createElement('button');
- btn.innerHTML = 'Authorize draw.io to access OneDrive';
- btn.className = 'aui-button aui-button-primary';
- authDialog.appendChild(btn);
-
- function adjustAuthBtn()
- {
- var w = window.innerWidth, h = window.innerHeight;
- authDialog.style.cssText = 'position: absolute; top: 0px; left: 0px; width: '+ w +'px; height: '+ h +'px; background: #fff;opacity: 0.85;z-index: 9999;';
- btn.style.cssText = 'position: absolute; width: 320px; height: 50px; top: '+ (h/2 - 25) +'px; left: '+ (w/2 - 160) +'px;opacity: 1;';
- }
-
- btn.addEventListener('click', function(evt)
- {
- auth();
- //Remove the event handler since the user already used the button
- window.removeEventListener("resize", adjustAuthBtn);
- });
-
- window.addEventListener('resize', adjustAuthBtn);
- adjustAuthBtn();
- document.body.appendChild(authDialog);
- }
- }
- else
- {
- error({message: 'Busy'});
- }
-};
-
-//JSON request with auth
-AC.doAuthRequest = function(url, method, params, success, error, failIfNotAuth)
-{
- if (AC.token == null)
- {
- var token = AC.getPersistentToken();
-
- if (token == null)
- {
- if (failIfNotAuth)
- {
- error({authNeeded: true});
- }
- else
- {
- AC.authOneDrive(function()
- {
- //Retry request after authentication
- AC.doAuthRequest(url, method, params, success, error);
- }, error);
- }
- return;
- }
- else
- {
- AC.token = token;
- }
- }
-
- var req = new XMLHttpRequest();
- req.open(method, AC.OneDriveBaseUrl + url);
- req.setRequestHeader('Authorization', 'Bearer ' + AC.token);
- req.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- success(JSON.parse(req.responseText));
- }
- else if (this.status == 401) // (Unauthorized) [e.g, invalid token]
- {
- //Try refresh token before asking for new authentication
- var authInfo = AC.getPersistentAuth();
-
- if (authInfo != null)
- {
- function doRefreshToken(state)
- {
- var req2 = new XMLHttpRequest();
- req2.open('GET', AC.redirectUri + '?refresh_token=' + authInfo.refresh_token +
- '&state=' + encodeURIComponent('cId=' + AC.clientId + '&domain=' + AC.host + '&ver=2&token=' + state)); //To identify which app/domain is used
-
- req2.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- var newAuthInfo = JSON.parse(req2.responseText);
- AC.token = newAuthInfo.access_token;
- //Update existing authInfo and save it
- authInfo.access_token = newAuthInfo.access_token;
- authInfo.refresh_token = newAuthInfo.refresh_token;
- authInfo.expiresOn = Date.now() + newAuthInfo.expires_in * 1000;
- AC.setPersistentAuth(authInfo);
- //Retry request with refreshed token
- AC.doAuthRequest(url, method, params, success, error);
- }
- else // (Unauthorized) [e.g, invalid refresh token] (sometimes, the server returns errors other than 401 (e.g. 500))
- {
- if (failIfNotAuth)
- {
- error({authNeeded: true});
- }
- else
- {
- AC.authOneDrive(function()
- {
- //Retry request after authentication
- AC.doAuthRequest(url, method, params, success, error);
- }, error);
- }
- }
- }
- }
-
- req2.send();
- };
-
- var req2 = new XMLHttpRequest();
- req2.open('GET', AC.redirectUri + '?getState=1');
-
- req2.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- doRefreshToken(req2.responseText);
- }
- else
- {
- error(this);
- }
- }
- };
-
- req2.send();
- }
- else
- {
- if (failIfNotAuth)
- {
- error({authNeeded: true});
- }
- else
- {
- AC.authOneDrive(function()
- {
- //Retry request after authentication
- AC.doAuthRequest(url, method, params, success, error);
- }, error);
- }
- }
- }
- else
- {
- error(this);
- }
- }
- };
-
- req.send(params != null? JSON.stringify(params) : null);
-};
-
-AC.showError = function(err)
-{
- alert('Error: ' + e.message);
-};
-
-AC.pickFile = function(fn)
-{
- OneDrive.open(
- {
- clientId: AC.clientId,
- action: 'query',
- multiSelect: false,
- advanced:
- {
- 'endpointHint': AC.endpointHint,
- 'redirectUri': AC.pickerRedirectUri,
- 'accessToken': AC.getPersistentToken(),
- 'queryParameters': 'select=id,name,parentReference,file,createdBy,lastModifiedBy,lastModifiedDateTime,size,@microsoft.graph.downloadUrl',
- isConsumerAccount: false
- },
- success: function(files)
- {
- if (files != null && files.value != null && files.value.length > 0)
- {
- fn(files.value[0]);
- }
- },
- cancel: function()
- {
- // do nothing
- },
- error: function(e)
- {
- showError('Error: ' + e.message);
- }
- });
-};
-
-AC.getFilePreviewUrl = function(file, success, error)
-{
- AC.getPreviewUrl(file.id, file.parentReference.driveId, success, error);
-};
-
-AC.getPreviewUrl = function(id, driveId, success, error)
-{
- if (AC.isPersonal)
- {
-// AC.doAuthRequest('/drives/' + driveId +
-// '/items/' + id + '/createLink',
-// 'POST', {type: 'embed'}, function(resp)
-// {
-// success(resp.link.webUrl, true);
-// }, error);
- error('Personal accounts are not supported.');
- }
- else
- {
- AC.doAuthRequest('/drives/' + driveId +
- '/items/' + id + '/preview',
- 'POST', null, function(resp)
- {
- success(resp.getUrl);
- }, error);
- }
-};
-
-AC.getFileThumbnailUrl = function(file, success, error)
-{
- AC.getThumbnailUrl(file.id, file.parentReference.driveId, success, error);
-};
-
-AC.getThumbnailUrl = function(id, driveId, success, error)
-{
- AC.doAuthRequest('/drives/' + driveId +
- '/items/' + id + '/thumbnails',
- 'GET', null, function(resp)
- {
- if (resp.value && resp.value[0] && resp.value[0].small)
- {
- success(resp.value[0].small.url, resp.value[0]);
- }
- else
- {
- success(null);
- }
- }, error);
-};
-
-AC.getFileInfo = function(id, driveId, success, error)
-{
- AC.doAuthRequest('/drives/' + driveId + '/items/' + id,
- 'GET', null, success, error);
-};
-
-AC.confirmODAuth = function(success, error, failIfNotAuth)
-{
- AC.doAuthRequest('/me/drive/root',
- 'GET', null, function(resp)
- {
- if (resp.webUrl.indexOf('.sharepoint.com') > 0)
- {
- AC.endpointHint = resp.webUrl.replace('/Documents', '/_layouts/15/onedrive.aspx');
- AC.isPersonal = false;
- }
- else
- {
- AC.endpointHint = AC.defEndpoint;
- AC.isPersonal = true;
- }
-
- //Update authInfo with endpointHint
- var authInfo = AC.getPersistentAuth();
- authInfo.endpointHint = AC.endpointHint;
- AC.setPersistentAuth(authInfo);
-
- success(resp);
- }, error, failIfNotAuth);
-};
-
-//This function depends on having GraphViewer loaded
-AC.extractGraphModelFromPng = function(pngData)
-{
- return Editor.extractGraphModelFromPng(pngData);
-};
-
-AC.getBinaryFile = function(file, success, error)
-{
- if (file['@microsoft.graph.downloadUrl'] == null)
- {
- if (file.parentReference == null)
- {
- throw new Error(mxResources.get('notADiagramFile'));
- }
- else
- {
- AC.getFileInfo(file.id, file.parentReference.driveId, function(completeFile)
- {
- AC.getBinaryFile(completeFile, success, error);
- }, error);
-
- return;
- }
- }
-
- var req = new XMLHttpRequest();
- req.open('GET', file['@microsoft.graph.downloadUrl']);
- req.responseType = 'blob';
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- success(req.response);
- }
- else
- {
- error();
- }
- }
- };
-
- req.send();
-};
-
-//This function depends on having GraphViewer loaded
-AC.getDrawioFileDoc = function(file, success, error, doCheck)
-{
- if (file['@microsoft.graph.downloadUrl'] == null)
- {
- if (file.parentReference == null)
- {
- throw new Error(mxResources.get('notADiagramFile'));
- }
- else
- {
- AC.getFileInfo(file.id, file.parentReference.driveId, function(completeFile)
- {
- AC.getDrawioFileDoc(completeFile, success, error, doCheck);
- }, error);
-
- return;
- }
- }
-
- var req = new XMLHttpRequest();
- //TODO find another way to disable caching (adding a parameter breaks the url)
- req.open('GET', file['@microsoft.graph.downloadUrl']);
- var isPng = file.file.mimeType == 'image/png';
-
- //Workaround for office and google drive file that are treated as OneDrive
- if (file.fromDrive && file.accessToken)
- {
- req.setRequestHeader('Authorization', 'Bearer ' + file.accessToken);
- }
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- try
- {
- var cnt = req.responseText;
-
- if (isPng)
- {
- cnt = 'data:image/png;base64,' + Editor.base64Encode (cnt);
- cnt = AC.extractGraphModelFromPng(cnt);
- }
-
- var doc = mxUtils.parseXml(cnt);
-
- if (!doCheck || new Editor().extractGraphModel(doc.documentElement) != null)
- {
- file.isDrawio = true;
- success(doc, cnt, true);
- return;
- }
- }
- catch(e) {} //on error and if the doc is null, the following line will call the error
- }
-
- error();
- }
- };
-
- if (isPng && req.overrideMimeType)
- {
- req.overrideMimeType('text/plain; charset=x-user-defined');
- }
-
- req.send();
-};
-
-//This function depends on having GraphViewer loaded
-AC.checkDrawioFile = function(file, success, error)
-{
- AC.getDrawioFileDoc(file, success, error, true);
-};
-
-AC.removeLink = function(issueId, fileId, callback, error)
-{
- var updateInfo = function(resp)
- {
- resp = JSON.parse(resp);
- var linksInfo = resp.value;
-
- if (linksInfo[fileId] == null)
- {
- error({message: mxResources.get('fileNotFound')});
- return;
- }
-
- delete linksInfo[fileId];
-
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '/properties/onedrive-conn-data',
- type: 'PUT',
- data: JSON.stringify(linksInfo),
- contentType: 'application/json',
- success: function()
- {
- callback();
- },
- error : error
- });
- };
-
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '/properties/onedrive-conn-data',
- type: 'GET',
- success: updateInfo,
- error : error
- });
-};
-
-AC.saveLink = function(issueId, file, callback, error)
-{
- var updateInfo = function(resp)
- {
- var linksInfo = {};
-
- if (!resp.status) //no error
- {
- resp = JSON.parse(resp);
- linksInfo = resp.value;
- }
-
- var order = null, max = -1;
-
- for (var key in linksInfo)
- {
- if (key == file.id)
- {
- order = linksInfo[key].order;
- break;
- }
-
- max = Math.max(linksInfo[key].order, max);
- }
-
- if (order == null)
- {
- order = max + 1;
- }
-
- linksInfo[file.id] = {
- service: file.service,
- isDrawio: file.isDrawio,
- aspect: file.aspect,
- order: order
- };
-
- var fileObj = linksInfo[file.id];
-
- switch (file.service)
- {
- case 'OneDrive':
- fileObj.driveId = file.parentReference.driveId;
- fileObj.createdBy = file.createdBy && file.createdBy.user? file.createdBy.user.displayName : null;
- fileObj.lastModifiedBy = file.lastModifiedBy && file.lastModifiedBy.user? file.lastModifiedBy.user.displayName : null;
- fileObj.modifiedDate = file.lastModifiedDateTime;
- fileObj.embeddedUrl = file.embeddedUrl;
- fileObj.mime = file.file.mimeType;
- fileObj.name = file.name;
- fileObj.size = file.size;
- break;
- case 'AttFile':
- fileObj.mime = file.type;
- fileObj.name = file.name;
- fileObj.size = file.size;
- fileObj.modifiedDate = file.lastModified;
- break;
- case 'GDrive':
- fileObj.createdBy = file.owners && file.owners[0]? file.owners[0].displayName : null;
- fileObj.lastModifiedBy = file.lastModifyingUser? file.lastModifyingUser.displayName : null;
- fileObj.modifiedDate = file.modifiedDate;
- fileObj.mime = file.mimeType;
- fileObj.name = file.title;
- fileObj.size = file.fileSize;
- break;
- }
-
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '/properties/onedrive-conn-data',
- type: 'PUT',
- data: JSON.stringify(linksInfo),
- contentType: 'application/json',
- success: function()
- {
- callback();
- },
- error : error
- });
- };
-
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '/properties/onedrive-conn-data',
- type: 'GET',
- success: updateInfo,
- error : updateInfo
- });
-};
-
-AC.setPersistentAuth = function(authInfo)
-{
- if (AC.isLocalStorage)
- {
- if (authInfo != null)
- {
- localStorage.setItem('.' + AC.authLSKeyName, JSON.stringify(authInfo));
- }
- else
- {
- AC.token = null;
- localStorage.removeItem('.' + AC.authLSKeyName);
- }
- }
-};
-
-AC.getPersistentToken = function()
-{
- var authInfo = AC.getPersistentAuth();
- var token = null;
-
- if (authInfo != null)
- {
- token = authInfo.access_token;
- }
-
- return token;
-};
-
-AC.getPersistentAuth = function()
-{
- var authInfo = null;
-
- if (AC.isLocalStorage)
- {
- authInfo = JSON.parse(localStorage.getItem('.' + AC.authLSKeyName));
- }
-
- return authInfo;
-};
-
-//GraphViewer should be loaded before using this function
-AC.extractDataFromPng = function(pngData, dataHeader)
-{
- var result = null;
-
- try
- {
- var base64 = pngData.substring(pngData.indexOf(',') + 1);
-
- // Workaround for invalid character error in Safari & IE11
- var binary = (window.atob && !mxClient.IS_SF && !mxClient.IS_IE11) ? atob(base64) : Base64.decode(base64, true);
-
- EditorUi.parsePng(binary, function(pos, type, length)
- {
- var value = binary.substring(pos + 8, pos + 8 + length);
-
- if (type == 'zTXt')
- {
- var idx = value.indexOf(String.fromCharCode(0));
-
- if (value.substring(0, idx) == dataHeader)
- {
- // Workaround for Java URL Encoder using + for spaces, which isn't compatible with JS
- var data = Graph.bytesToString(pako.inflateRaw(
- value.substring(idx + 2))).replace(/\+/g,' ');
-
- if (data != null && data.length > 0)
- {
- result = data;
- }
- }
- }
- // Uncompressed section is normally not used
- else if (type == 'tEXt')
- {
- var vals = value.split(String.fromCharCode(0));
-
- if (vals.length > 1 && vals[0] == dataHeader)
- {
- result = vals[1];
- }
- }
-
- if (result != null || type == 'IDAT')
- {
- // Stops processing the file as our text chunks
- // are always placed before the data section
- return true;
- }
- });
- }
- catch (e)
- {
- // ignores decoding errors
- }
-
- if (result != null && result.charAt(0) == '%')
- {
- result = decodeURIComponent(result);
- }
-
- // Workaround for double encoded content
- if (result != null && result.charAt(0) == '%')
- {
- result = decodeURIComponent(result);
- }
-
- return result;
-};
diff --git a/src/main/webapp/connect/onedrive_common/editor.js b/src/main/webapp/connect/onedrive_common/editor.js
deleted file mode 100644
index baa8ce80..00000000
--- a/src/main/webapp/connect/onedrive_common/editor.js
+++ /dev/null
@@ -1,532 +0,0 @@
-function OneDriveEditor(onSubmit, getFileInfoFn, idSuffix, notStandalone, drawioOnly, genImage, oneDriveJS)
-{
- idSuffix = idSuffix || '';
- var noThumbImg = '/images/onedrive-logo.svg';
-
- var opts =
- {
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
- this.spinner = spinner;
- spinner.spin(AC.$('#spinner-container' + idSuffix));
-
- var head = document.getElementsByTagName('head')[0];
-
- // Handles timeouts
- var acceptResponse = true;
-
- var timeoutHandler = function()
- {
- acceptResponse = false;
- spinner.stop();
- alert('The connection has timed out');
- };
-
- var timeoutThread = window.setTimeout(timeoutHandler, 25000);
-
- var selectedFile = null, selFileContent = null;
- var curViewer = null;
-
- function showError(elem, errMsg)
- {
- elem.innerHTML = '<img src="data:image/gif;base64,R0lGODlhEAAQAPcAAADGAIQAAISEhP8AAP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAAALAAAAAAQABAAAAhoAAEIFBigYMGBCAkGGMCQ4cGECxtKHBAAYUQCEzFSHLiQgMeGHjEGEAAg4oCQJz86LCkxpEqHAkwyRClxpEyXGmGaREmTIsmOL1GO/DkzI0yOE2sKIMlRJsWhCQHENDiUaVSpS5cmDAgAOw==" border="0" align="absmiddle"/> ' +
- AC.htmlEntities(errMsg);
- };
-
- function setPreview(file)
- {
- if (typeof AP != 'undefined')
- {
- AP.dialog.getButton('submit').enable();
- var altSubmitBtn = AP.dialog.getButton('altSubmitBtn');
-
- if (altSubmitBtn) altSubmitBtn.enable();
- }
-
- var thumbImg = AC.$('#thumbImg' + idSuffix);
-
- thumbImg.onerror = function()
- {
- this.onerror = null;
- this.src = noThumbImg;
- };
-
- AC.getFileThumbnailUrl(file, function(thumbUrl)
- {
- thumbImg.src = thumbUrl? thumbUrl : noThumbImg;
- }, function()
- {
- thumbImg.src = noThumbImg;
- });
-
- var prevDiv = AC.$('#preview' + idSuffix);
-
- AC.getFilePreviewUrl(file, function(prevUrl, isPersonal)
- {
- if (prevUrl)
- {
- if (isPersonal)
- {
- file.embeddedUrl = prevUrl;
- }
-
- prevDiv.innerHTML = '';
- var iframe = document.createElement('iframe');
- iframe.src = prevUrl;
- iframe.setAttribute('frameborder', '0');
- iframe.width = '100%';
- iframe.height = '100%';
- prevDiv.appendChild(iframe);
- }
- else
- {
- prevDiv.innerHTML = 'No preview is available';
- }
- }, function(errMsg)
- {
- prevDiv.innerHTML = 'No preview is available. ' + AC.htmlEntities(errMsg? errMsg : '');
- });
-
- var autoSizeCheck = AC.$('#autoSize' + idSuffix);
- autoSizeCheck.checked = false;
- autoSizeCheck.setAttribute('disabled', 'disabled');
- autoSizeChanged(false);
- curViewer = null;
- };
-
- function prevDrawioFile(doc, prevDiv, filename, aspect)
- {
- spinner.stop();
-
- var thumbImg = AC.$('#thumbImg' + idSuffix);
- thumbImg.src = noThumbImg;
-
- var container = document.createElement('div');
- // NOTE: Height must be specified with default value "auto" to force automatic fit in viewer
- container.style.cssText = 'position:absolute;width:auto;left:0px;right:0px;height:auto;bottom:0px;top:0px;border:1px solid transparent;';
- prevDiv.appendChild(container);
-
- var pageId, layerIds;
-
- if (aspect != null)
- {
- var aspectArray = aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- Graph.prototype.shadowId = 'oneDriveDropShadow';
- var viewer = new GraphViewer(container, doc.documentElement,
- {highlight: '#3572b0', border: 8, 'auto-fit': true,
- resize: false, nav: true, lightbox: false, title: filename,
- 'toolbar-nohide': true, 'toolbar-position': 'top', toolbar: 'pages layers',
- pageId: pageId, layerIds: layerIds});
-
- viewer.graph.addListener('size', function()
- {
- var root = this.view.getDrawPane().ownerSVGElement;
-
- if (root != null)
- {
- root.style.minHeight = '';
- }
- });
-
- curViewer = viewer;
-
- if (typeof AP != 'undefined')
- {
- AP.dialog.getButton('submit').enable();
- var altSubmitBtn = AP.dialog.getButton('altSubmitBtn');
-
- if (altSubmitBtn) altSubmitBtn.enable();
- }
- };
-
- // Waits for both APIs to load in parallel
- function main()
- {
- if (notStandalone || (typeof window.AP !== 'undefined' && typeof window.OneDrive != 'undefined'))
- {
- window.clearTimeout(timeoutThread);
-
- //OneDrive Auth before proceeding
- AC.confirmODAuth(mainAuth, function()
- {
- alert('Error authenticating to OneDrive!'); //TODO better error handling
- });
- }
- };
-
- function genericOnSubmit()
- {
- var hasError = false;
- //this cannot happen as the submit button is disabled until a file is selected
- if (selectedFile == null)
- {
- AC.$('#filenameError' + idSuffix).innerHTML = "Please select a file";
- hasError = true;
- }
-
- var width = parseInt(AC.$('#width' + idSuffix).value);
- var height = parseInt(AC.$('#height' + idSuffix).value);
- var autoSize = AC.$('#autoSize' + idSuffix).checked;
-
- if (!autoSize && (isNaN(width) || width <= 0))
- {
- AC.$('#widthError' + idSuffix).innerHTML = "Width must be greater than zero";
- hasError = true;
- }
-
- if (!autoSize && (isNaN(height) || height <= 0))
- {
- AC.$('#heightError' + idSuffix).innerHTML = "Height must be greater than zero";
- hasError = true;
- }
-
- if (hasError)
- {
- return;
- }
-
- if (curViewer != null)
- {
- var layerIds = [];
-
- var model = curViewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- selectedFile.aspect = curViewer.diagrams[curViewer.currentPage].getAttribute('id') + ' ' + layerIds.join(' ');
-
- if (autoSize)
- {
- var bounds = curViewer.graph.view.graphBounds;
- width = Math.round(bounds.width) || null;
- height = Math.round(bounds.height) || null;
- }
- }
-
- spinner.spin(AC.$('#preview' + idSuffix));
-
- var image = null;
-
- function finalize()
- {
- onSubmit(selectedFile, width, height, autoSize, selFileContent, image);
- };
-
- if (genImage && curViewer.editor.isExportToCanvas())
- {
- curViewer.editor.exportToCanvas(function(canvas)
- {
- var data = canvas.toDataURL('image/png');
- image = data.substring(data.lastIndexOf(',') + 1);
- finalize();
- }
- , null, null, null, finalize);
- }
- else
- {
- finalize()
- }
- }
-
- this.doSubmit = genericOnSubmit;
-
- function mainAuth()
- {
- spinner.stop();
-
- if (acceptResponse)
- {
- AC.$('#filePicker' + idSuffix).removeAttribute('disabled');
-
- AC.$('#filePicker' + idSuffix).addEventListener('click', function(evt)
- {
- AC.pickFile(function(file)
- {
- function handleNonDrawFile() //If the file is not a draw.io diagram
- {
- if (drawioOnly)
- {
- selectedFile = null;
- spinner.stop();
- AC.$('#filenameError' + idSuffix).innerHTML = 'Not a draw.io diagram file';
- }
- else
- {
- setPreview(file);
- }
-
- drawioCheck.checked = false;
- };
-
- function setAutosize()
- {
- var autoSizeCheck = AC.$('#autoSize' + idSuffix);
- autoSizeCheck.checked = true;
- autoSizeCheck.removeAttribute('disabled');
- autoSizeChanged(true);
- };
-
- selectedFile = file;
- AC.$('#filenameError' + idSuffix).innerHTML = "";
- AC.$('#filename' + idSuffix).value = file.name;
- var mimeType = file.file.mimeType;
- drawioCheck = AC.$('#useDrawio' + idSuffix);
- var useDrawio = drawioOnly? false : drawioCheck.checked;
- var prevDiv = AC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- if (useDrawio && typeof convertVSDXtoMX != 'undefined' && /\.v(dx|sdx?)$/i.test(file.name))
- {
- AC.getBinaryFile(file, function(blobFile)
- {
- convertVSDXtoMX(blobFile, file.name, function(xml)
- {
- selectedFile.isDrawio = true;
- selFileContent = xml;
- prevDrawioFile(mxUtils.parseXml(xml), prevDiv, file.name);
- setAutosize();
- }, handleNonDrawFile);
- }, handleNonDrawFile);
- }
- else
- {
- AC.checkDrawioFile(file, function(doc, cnt)
- {
- selFileContent = cnt;
- prevDrawioFile(doc, prevDiv, file.name);
- drawioCheck.checked = true;
- setAutosize();
- }, handleNonDrawFile);
- }
- });
-
- evt.preventDefault();
- });
-
- function removeErrMsg()
- {
- AC.$('#' + this.id + 'Error' + idSuffix).innerHTML = "";
- };
-
- AC.$('#width' + idSuffix).addEventListener('change', removeErrMsg);
- AC.$('#height' + idSuffix).addEventListener('change', removeErrMsg);
-
- if (getFileInfoFn)
- {
- getFileInfoFn(function(fileInfo)
- {
- var altSubmitBtn = AP.dialog.createButton({
- text: fileInfo? 'Save' : 'Insert',
- identifier: 'altSubmitBtn'
- });
- altSubmitBtn.bind(genericOnSubmit);
- altSubmitBtn.disable();
-
- if (fileInfo && fileInfo.fileId)
- {
- var autoSize = fileInfo.autoSize == '1';
- AC.$('#width' + idSuffix).value = fileInfo.width;
- AC.$('#height' + idSuffix).value = fileInfo.height;
- AC.$('#filename' + idSuffix).value = fileInfo.filename;
- fileInfo.isDrawio = fileInfo.isDrawio == 'true';
- AC.$('#useDrawio' + idSuffix).checked = fileInfo.isDrawio;
- AC.$('#autoSize' + idSuffix).checked = autoSize;
- autoSizeChanged(autoSize);
-
- fileInfo.id = fileInfo.fileId;
- fileInfo['parentReference'] = {
- driveId: fileInfo.driveId
- };
- fileInfo['file'] = {
- mimeType: fileInfo.mimeType
- };
- fileInfo.name = fileInfo.filename;
- selectedFile = fileInfo;
-
- if (fileInfo.isDrawio)
- {
- var prevDiv = AC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- AC.getFileInfo(fileInfo.fileId, fileInfo.driveId, function(file)
- {
- function filePrevErr(err)
- {
- showError(prevDiv, 'Cannot load file preview.');
- };
-
- if (typeof convertVSDXtoMX != 'undefined' && /\.v(dx|sdx?)$/i.test(fileInfo.filename))
- {
- AC.getBinaryFile(file, function(blobFile)
- {
- convertVSDXtoMX(blobFile, fileInfo.filename, function(xml)
- {
- selFileContent = xml;
- prevDrawioFile(mxUtils.parseXml(xml), prevDiv, file.name, fileInfo.aspect);
- }, filePrevErr);
- }, filePrevErr);
- }
- else
- {
- AC.getDrawioFileDoc(file, function(doc, cnt)
- {
- selFileContent = cnt;
- prevDrawioFile(doc, prevDiv, file.name, fileInfo.aspect);
- }, filePrevErr);
- }
- },
- function(err)
- {
- if (err && (err.status == 403 || err.status == 400)) //400 is returned when a business account file is accessed via a personal account
- {
- showError(prevDiv, 'Error: Access Denied. You do not have permission to access this file "'+ fileInfo.filename +'".');
- }
- else
- {
- showError(prevDiv, 'Cannot load file preview.');
- }
- });
- }
- else
- {
- setPreview(fileInfo);
- }
- }
- });
- }
- }
- };
-
- this.loadDrawioFile = function(fileInfo)
- {
- AC.$('#filename' + idSuffix).value = fileInfo.diagramDisplayName;
- AC.$('#autoSize' + idSuffix).checked = true;
- var prevDiv = AC.$('#preview' + idSuffix);
- prevDiv.innerHTML = '';
- spinner.spin(prevDiv);
-
- AC.getFileInfo(fileInfo.sFileId, fileInfo.odriveId, function(file)
- {
- selectedFile = file;
- AC.$('#filename' + idSuffix).value = file.name;
-
- AC.getDrawioFileDoc(file, function(doc, cnt)
- {
- selFileContent = cnt;
- prevDrawioFile(doc, prevDiv, file.name, fileInfo.aspect);
- }, function()
- {
- showError(prevDiv, 'Cannot read "' + file.name + '" file from OneDrive.');
- });
- }, function()
- {
- showError(prevDiv, 'Fetching file info from OneDrive failed.');
- });
- };
-
- function autoSizeChanged(isChecked)
- {
- if(isChecked)
- {
- AC.$('#width' + idSuffix).setAttribute('disabled', 'disabled');
- AC.$('#height' + idSuffix).setAttribute('disabled', 'disabled');
- }
- else
- {
- AC.$('#width' + idSuffix).removeAttribute('disabled');
- AC.$('#height' + idSuffix).removeAttribute('disabled');
- }
- };
-
- AC.$('#autoSize' + idSuffix).addEventListener('change', function(evt)
- {
- autoSizeChanged(this.checked);
- });
-
- var signOut = AC.$('#signout' + idSuffix);
-
- if (signOut)
- {
- signOut.addEventListener('click', function(evt)
- {
- evt.preventDefault();
- AC.setPersistentAuth(null);
- window.open('https://login.microsoftonline.com/common/oauth2/v2.0/logout', 'logout', 'width=525,height=525,status=no,resizable=yes,toolbar=no,menubar=no,scrollbars=yes');
- main(); //To show auth button again
- });
- }
-
- function loadAtlassianApi()
- {
- var script = document.createElement("script");
-
- script.onload = function()
- {
- AP.dialog.disableCloseOnSubmit();
-
- //TODO when conf bug of submit is fixed, re-enable this and remove the button above
- if (getFileInfoFn)
- {
- AP.dialog.getButton('submit').hide();
- }
-
- AP.events.on('dialog.submit', genericOnSubmit);
- AP.dialog.getButton('submit').disable();
- main();
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
- head.appendChild(script);
- };
-
- function loadOneDriveApi()
- {
- var script = document.createElement("script");
- script.onload = main;
- script.src = oneDriveJS || "/js/onedrive/OneDrive.js";
- head.appendChild(script);
- };
-
- // Loads APIs in parallel and waits in main
- if (!notStandalone)
- {
- loadAtlassianApi();
- }
-
- loadOneDriveApi();
-};
-
diff --git a/src/main/webapp/connect/onedrivejira/connect-dev.json b/src/main/webapp/connect/onedrivejira/connect-dev.json
deleted file mode 100644
index e4b8e7be..00000000
--- a/src/main/webapp/connect/onedrivejira/connect-dev.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "name": "Diagram Viewer for Jira",
- "description": "Diagram Viewer for Jira",
- "key": "com.mxgraph.jira.plugins.onedrive",
- "baseUrl": "https://test.draw.io",
- "vendor":
- {
- "name": "draw.io AG",
- "url": "https://about.draw.io"
- },
- "version": "1.0.0",
- "authentication":
- {
- "type": "none"
- },
- "scopes":
- [
- "READ",
- "WRITE",
- "DELETE"
- ],
- "modules":
- {
- "generalPages":
- [
- {
- "url":"/connect/onedrivejira/editor.html?issueId=${issue.id}",
- "key":"oneDriveEditor",
- "name":
- {
- "value":"Diagram Viewer"
- },
- "location":"hidden"
- },
- {
- "url":"/connect/onedrivejira/fullScreenViewer.html?issueId=${issue.id}",
- "key":"drawioFullScreenViewer",
- "name":
- {
- "value":"Diagram Full Screen Viewer"
- },
- "location":"hidden"
- },
- {
- "url":"/connect/onedrivejira/oneDriveFSViewer.html?issueId=${issue.id}",
- "key":"oneDriveFullScreenViewer",
- "name":
- {
- "value":"Diagram Full Screen Viewer"
- },
- "location":"hidden"
- }
- ],
- "webItems": [
- {
- "location": "operations-attachments",
- "weight": 50,
- "key": "oneDriveEditorBlank",
- "url": "/connect/onedrivejira/editor.html?issueId=${issue.id}",
- "name": {
- "value": "Add Diagram File"
- },
- "target":
- {
- "type":"dialog",
- "options":
- {
- "width":"80%",
- "height":"60%",
- "chrome":true
- }
- }
- },
- {
- "key": "oneDriveEditorDialog",
- "name":
- {
- "value": "Diagram Viewer Editor"
- },
- "url": "/connect/onedrivejira/editor.html?issueId=${issue.id}",
- "location": "none",
- "context": "addon"
- }
- ],
- "webPanels":
- [
- {
- "url": "/connect/onedrivejira/viewerPanel.html?issueId=${issue.id}",
- "location": "atl.jira.view.issue.left.context",
- "layout":
- {
- "width": "300px"
- },
- "weight": 200,
- "key": "oneDriveViewerPanel",
- "name":
- {
- "value": "Diagram Viewer"
- }
- }
- ]
- }
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/onedrivejira/connect.json b/src/main/webapp/connect/onedrivejira/connect.json
deleted file mode 100644
index 502b75c5..00000000
--- a/src/main/webapp/connect/onedrivejira/connect.json
+++ /dev/null
@@ -1,106 +0,0 @@
-{
- "name": "Diagram Viewer for Jira",
- "description": "Diagram Viewer for Jira",
- "key": "com.mxgraph.jira.plugins.onedrive",
- "baseUrl": "https://www.draw.io",
- "apiMigrations": {
- "gdpr": true
- },
- "vendor":
- {
- "name": "draw.io AG",
- "url": "https://about.draw.io"
- },
- "version": "1.0.0",
- "authentication":
- {
- "type": "none"
- },
- "scopes":
- [
- "READ",
- "WRITE",
- "DELETE"
- ],
- "modules":
- {
- "generalPages":
- [
- {
- "url":"/connect/onedrivejira/editor.html?issueId=${issue.id}",
- "key":"oneDriveEditor",
- "name":
- {
- "value":"Diagram Viewer"
- },
- "location":"hidden"
- },
- {
- "url":"/connect/onedrivejira/fullScreenViewer.html?issueId=${issue.id}",
- "key":"drawioFullScreenViewer",
- "name":
- {
- "value":"Diagram Full Screen Viewer"
- },
- "location":"hidden"
- },
- {
- "url":"/connect/onedrivejira/oneDriveFSViewer.html?issueId=${issue.id}",
- "key":"oneDriveFullScreenViewer",
- "name":
- {
- "value":"Diagram Full Screen Viewer"
- },
- "location":"hidden"
- }
- ],
- "webItems": [
- {
- "location": "operations-attachments",
- "weight": 50,
- "key": "oneDriveEditorBlank",
- "url": "/connect/onedrivejira/editor.html?issueId=${issue.id}",
- "name": {
- "value": "Add Diagram File"
- },
- "target":
- {
- "type":"dialog",
- "options":
- {
- "width":"80%",
- "height":"60%",
- "chrome":true
- }
- }
- },
- {
- "key": "oneDriveEditorDialog",
- "name":
- {
- "value": "Diagram Viewer Editor"
- },
- "url": "/connect/onedrivejira/editor.html?issueId=${issue.id}",
- "location": "none",
- "context": "addon"
- }
- ],
- "webPanels":
- [
- {
- "url": "/connect/onedrivejira/viewerPanel.html?issueId=${issue.id}",
- "location": "atl.jira.view.issue.left.context",
- "layout":
- {
- "width": "300px"
- },
- "weight": 200,
- "key": "oneDriveViewerPanel",
- "name":
- {
- "value": "Diagram Viewer"
- }
- }
- ]
- }
-} \ No newline at end of file
diff --git a/src/main/webapp/connect/onedrivejira/editor.html b/src/main/webapp/connect/onedrivejira/editor.html
deleted file mode 100644
index dde9a5fb..00000000
--- a/src/main/webapp/connect/onedrivejira/editor.html
+++ /dev/null
@@ -1,365 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Diagram Viewer Editor</title>
-<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
-<script src="//aui-cdn.atlassian.com/aui-adg/6.0.4/js/aui.min.js"></script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script src="../../js/spin/spin.min.js" type="text/javascript"></script>
-<script type="text/javascript">
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-
-// Overrides browser language with Confluence user language
-var lang = AC.getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript" src="../vsdx/importer.js"></script>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.9.12/css/aui.min.css" media="all">
-<link rel="stylesheet" type="text/css" href="//aui-cdn.atlassian.com/aui-adg/6.0.4/css/aui.css">
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
-}
-.thumbnail {
- box-sizing: border-box;
- height: 100px;
- width: 100px;
- border: 1px solid #CCCCCC;
- border-radius: 3px;
- line-height: 94px;
- text-align:center;
-}
-.thumbImg {
- vertical-align:middle;
- max-width: 96px;
- max-height: 96px;
-}
-</style>
-</head>
-<body class="aui-layout aui-theme-default" style="height:100%;">
- <div id="tab-navigation" class="aui-tabs horizontal-tabs">
- <ul class="tabs-menu">
- <li class="menu-item active-tab">
- <a href="#uploadTab"><strong>Upload Diagram</strong></a>
- </li>
- <li class="menu-item">
- <a href="#oneDriveTab"><strong>OneDrive Diagram</strong></a>
- </li>
- <li class="menu-item">
- <a href="#gDriveTab"><strong>Google Drive Diagram</strong></a>
- </li>
- </ul>
- <div class="tabs-pane active-pane" id="uploadTab">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:40px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filenameUD">File name</label>
- <input type="file" id="fileuploadUD" style="display: none">
- <input class="text macro-param-input" type="text" id="filenameUD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerUD">Choose</button>
- <div id="spinner-containerUD"></div>
- <div class="description">Diagram file name</div>
- <div class="error" id="filenameErrorUD"></div>
- </div>
- <div id="notUsedDU">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthUD">Width</label> <input class="text medium-field" id="widthUD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorUD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightUD">Height</label> <input class="text medium-field" id="heightUD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorUD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeUD" type="checkbox" >
- <label for="autoSizeUD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- </div>
- <div class="error" id="errorMsgUD">
- </div>
- </form>
- </div>
- <div id="previewUD" style="bottom:0px;left:351px;position:absolute;top:40px;right:0px;display:inline-block;text-align: center;">
- <a style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer"
- onclick="document.getElementById('fileuploadUD').click();">Choose a file...</a>
- </div>
- </div>
- <div class="tabs-pane" id="oneDriveTab">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:40px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filenameOD">File name</label>
- <input class="text macro-param-input" type="text" id="filenameOD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerOD" disabled>Choose</button>
- <div id="spinner-containerOD"></div>
- <div class="description">OneDrive file name</div>
- <div class="error" id="filenameErrorOD"></div>
- </div>
- <div id="notUsedOD">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthOD">Width</label> <input class="text medium-field" id="widthOD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorOD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightOD">Height</label> <input class="text medium-field" id="heightOD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorOD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeOD" type="checkbox" >
- <label for="autoSizeOD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="thumbImgOD">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImgOD">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawioOD">
- <label for="useDrawioOD" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </form>
- </div>
- <div id="previewOD" style="bottom:0px;left:351px;position:absolute;top:40px;right:0px;display:inline-block;">
- <a style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer"
- onclick="document.getElementById('filePickerOD').click();">Choose a file...</a>
- </div>
- </div>
- <div class="tabs-pane" id="gDriveTab">
- <div style="bottom:0px;width:350px;border-right:1px solid #cccccc;position:absolute;top:40px;display:inline-block;">
- <form class="aui top-label" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filename">File name</label>
- <input class="text macro-param-input" type="text" id="filenameGD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerGD" disabled>Choose</button>
- <div id="spinner-containerGD"></div>
- <div class="description">Google Drive file name</div>
- <div class="error" id="filenameErrorGD"></div>
- <div id="notUsedGD">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthGD">Width</label> <input class="text medium-field" id="widthGD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorGD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightGD">Height</label> <input class="text medium-field" id="heightGD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorGD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeGD" type="checkbox" >
- <label for="autoSizeGD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- </div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="thumbImg">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImgGD">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawioGD">
- <label for="useDrawio" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </form>
- </div>
- <div id="previewGD" style="bottom:0px;left:351px;position:absolute;top:40px;right:0px;display:inline-block;">
- <a style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer"
- onclick="document.getElementById('filePickerGD').click();">Choose a file...</a>
- </div>
- </div>
- </div>
-<script src="../onedrive_common/editor.js" type="text/javascript"></script>
-<script src="../gdrive_common/editor.js" type="text/javascript"></script>
-<script src="../att_common/att-editor.js" type="text/javascript"></script>
-<script type="text/javascript">
- AC.$('#notUsedOD').style.display = 'none';
- AC.$('#notUsedDU').style.display = 'none';
- AC.$('#notUsedGD').style.display = 'none';
- var head = document.getElementsByTagName('head')[0];
-
- var script = document.createElement("script");
- var attEditor, odEditor = null, gdEditor = null, currTab = 1;
-
- script.onload = function()
- {
- AP.dialog.disableCloseOnSubmit();
-
- AP.events.on('dialog.submit', function()
- {
- var editor = currTab == 1? attEditor : (currTab == 2? odEditor : gdEditor);
- editor.doSubmit();
- });
-
- AP.dialog.getButton('submit').disable();
- };
-
- var connectUrl = AC.getBaseUrl() + '/atlassian-connect';
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
- script.setAttribute('data-options', 'resize:false;margin:false');
- head.appendChild(script);
-
- var issueId = AC.getUrlParam('issueId');
-
- attEditor = new AttViewerEditor(function(selectedFile, selFileContent, editedFile, width, height, autoSize, isDrawio, aspect, onError)
- {
- //We only have add in Jira
- if (selectedFile != null)
- {
- //AP.request doesn't support loading binary data, so we store binary data as Base64 strings (which is loaded using DataURL)
- AC.uploadToJira(selFileContent, issueId, selectedFile.name, selectedFile.type, function(resp)
- {
- resp = JSON.parse(resp);
- selectedFile.id = resp[0].id;
- selectedFile.service = 'AttFile';
- selectedFile.isDrawio = isDrawio;
- selectedFile.aspect = aspect;
-
- AC.saveLink(issueId, selectedFile, function()
- {
- AP.jira.refreshIssuePage();
- AP.dialog.close();
- }, function(err)
- {
- //TODO Better error handling
- alert('Saving failed: ' + ((err? err.message : '') || 'Unknow Error'));
- });
- }, onError);
- }
- }, null, 'UD', true);
-
- AJS.tabs.setup();
-
- var tabSubmitStatus = {};
-
- $('#tab-navigation').on('tabSelect', '.menu-item a', function(e, tabsMenu)
- {
- var prevTab = currTab;
-
- switch ($(this).attr('href'))
- {
- case '#uploadTab':
- currTab = 1;
- break;
- case '#oneDriveTab':
- if (odEditor == null)
- {
- odEditor = new OneDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- var useDrawio = selectedFile.isDrawio || AC.$('#useDrawioOD').checked;
-
- function doSaveLink()
- {
- selectedFile.isDrawio = useDrawio
- selectedFile.service = 'OneDrive';
-
- AC.saveLink(issueId, selectedFile, function()
- {
- AP.jira.refreshIssuePage();
- AP.dialog.close();
- }, function(err)
- {
- //TODO Better error handling
- alert('Saving failed: ' + ((err? err.message : '') || 'Unknow Error'));
- });
- };
-
- if (useDrawio && selFileContent != null)
- {
- var modifiedTS = new Date(selectedFile.lastModifiedDateTime).getTime();
- AC.uploadToJira(selFileContent, issueId, modifiedTS + '_' + selectedFile.name,
- 'application/vnd.jgraph.mxfile', doSaveLink, doSaveLink); //On error save also as caching is not blocking
- }
- else
- {
- doSaveLink();
- }
- }, null, 'OD', true);
- }
-
- currTab = 2;
- break;
- case '#gDriveTab':
- if (gdEditor == null)
- {
- gdEditor = new GDriveEditor(function(selectedFile, width, height, autoSize, selFileContent)
- {
- var useDrawio = selectedFile.isDrawio || AC.$('#useDrawioOD').checked;
-
- function doSaveLink()
- {
- selectedFile.isDrawio = useDrawio
- selectedFile.service = 'GDrive';
-
- AC.saveLink(issueId, selectedFile, function()
- {
- AP.jira.refreshIssuePage();
- AP.dialog.close();
- }, function(err)
- {
- //TODO Better error handling
- alert('Saving failed: ' + ((err? err.message : '') || 'Unknow Error'));
- });
- };
-
- if (useDrawio && selFileContent != null)
- {
- var modifiedTS = new Date(selectedFile.modifiedDate).getTime();
- AC.uploadToJira(selFileContent, issueId, modifiedTS + '_' + selectedFile.title,
- 'application/vnd.jgraph.mxfile', doSaveLink, doSaveLink); //On error save also as caching is not blocking
- }
- else
- {
- doSaveLink();
- }
- }, null, 'GD', true);
- }
-
- currTab = 3;
- break;
- }
-
- AP.dialog.getButton('submit').isEnabled(function(enabled)
- {
- tabSubmitStatus[prevTab] = enabled;
-
- if (tabSubmitStatus[currTab])
- {
- AP.dialog.getButton('submit').enable();
- }
- else
- {
- AP.dialog.getButton('submit').disable();
- }
- });
- });
-</script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/onedrivejira/fullScreenViewer.html b/src/main/webapp/connect/onedrivejira/fullScreenViewer.html
deleted file mode 100644
index 6bf3efb3..00000000
--- a/src/main/webapp/connect/onedrivejira/fullScreenViewer.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>draw.io Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(/images/drawlogo-text-bottom.svg);
- background-position:center 30%;
- background-repeat:no-repeat;
- background-size: 128px;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script type="text/javascript">
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Overrides browser language with Confluence user language
-var lang = AC.getUrlParam('loc');
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script type="text/javascript" src="/js/viewer.min.js"></script>
-<script type="text/javascript" src="../vsdx/importer.js"></script>
-</head>
-<body>
-<script src="fullScreenViewer.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/onedrivejira/fullScreenViewer.js b/src/main/webapp/connect/onedrivejira/fullScreenViewer.js
deleted file mode 100644
index d4739050..00000000
--- a/src/main/webapp/connect/onedrivejira/fullScreenViewer.js
+++ /dev/null
@@ -1,266 +0,0 @@
-(function()
-{
- // Enables dynamic loading of shapes and stencils (same domain)
- mxStencilRegistry.dynamicLoading = true;
-
- // Specifies connection mode for touch devices (at least one should be true)
- var connectUrl = AC.getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName('head')[0];
-
- var script = document.createElement('script');
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- head.appendChild(script);
-
- var link = document.createElement('link');
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- function main()
- {
- AP.resize('100%', '100%');
-
- function doMain(customData)
- {
- var fileInfo = customData.fileInfo;
- var issueId = customData.issueId;
- var cachedFileId = customData.cachedFileId;
- var serverName = document.referrer;
- var timeout = 25000;
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
-
- var flag = AP.flag.create({
- title: 'The connection has timed out',
- body: 'The server at ' +
- serverName + ' is taking too long to respond.',
- type: 'error',
- close: 'manual'
- });
-
- AP.dialog.close();
- }, timeout);
-
- function viewDrawioDoc(doc)
- {
- try
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- document.body.style.backgroundImage = 'none';
- var viewer = new GraphViewer(null, doc.documentElement, {highlight: '#3572b0', nav: true, lightbox: false,
- pageId: customData.pageId, layerIds: customData.layerIds});
- viewer.lightboxChrome = false;
-
- // Enables layers via flag to avoid toolbar
- viewer.layersEnabled = true;
-
- var ui = viewer.showLocalLightbox();
-
- // Destroy lightbox with ui instance
- var destroy = ui.destroy;
- ui.destroy = function()
- {
- AP.dialog.close();
- destroy.apply(this, arguments);
- };
- }
- }
- catch(e)
- {
- var flag = AP.flag.create({
- title: 'Unexpected Error',
- body: 'The driagram is corrupted.',
- type: 'error',
- close: 'manual'
- });
-
- AP.dialog.close();
- }
- };
-
- function fetchDocErr(err)
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- var flag = AP.flag.create({
- title: 'Unexpected Error',
- body: 'Cannot fetch diagram content.',
- type: 'error',
- close: 'manual'
- });
-
- AP.dialog.close();
- }
- };
-
- var tryCachedFile = function(cachedFileId, onError)
- {
- if (cachedFileId == null)
- {
- onError();
- }
- else
- {
- AP.request({
- url: '/secure/attachment/' + cachedFileId + '/',
- success: function(resp)
- {
- viewDrawioDoc(mxUtils.parseXml(resp));
- },
- error: onError
- });
- }
- };
-
- function cacheAndRender(fileContent, fileDoc, cachedFilename)
- {
- viewDrawioDoc(fileDoc);
-
- AC.uploadToJira(fileContent, issueId, cachedFilename,
- 'application/vnd.jgraph.mxfile', GAC.noop, GAC.noop);
- };
-
- if (fileInfo.service == 'GDrive')
- {
- GAC.getFileInfo(fileInfo.id, function(fileInfo)
- {
- var timestamp = String(new Date(fileInfo.modifiedDate).getTime());
- var cachedFilename = timestamp + '_' + fileInfo.title;
-
- tryCachedFile(cachedFileId, function()
- {
- if (/\.v(dx|sdx?)$/i.test(fileInfo.title))
- {
- GAC.getBinaryFile(fileInfo, function(blobFile)
- {
- convertVSDXtoMX(blobFile, fileInfo.title, function(xml)
- {
- cacheAndRender(xml, mxUtils.parseXml(xml), cachedFilename);
- }, fetchDocErr);
- }, fetchDocErr);
- }
- else
- {
- GAC.getDrawioFileDoc(fileInfo, function(doc, cnt)
- {
- cacheAndRender(cnt, doc, cachedFilename);
- }, fetchDocErr);
- }
- });
- }, fetchDocErr);
- }
- else if (fileInfo.service == 'AttFile')
- {
- AP.request({
- url: '/secure/attachment/' + fileInfo.id + '/',
- success: function(resp)
- {
- var isPng = fileInfo.mime == 'image/png';
-
- try
- {
- if (isPng)
- {
- resp = AC.extractGraphModelFromPng(resp);
- }
-
- var doc = mxUtils.parseXml(resp);
- viewDrawioDoc(doc);
- }
- catch(e)
- {
- fetchDocErr();
- }
- },
- error: fetchDocErr
- });
- }
- else //OneDrive
- {
- AC.getFileInfo(fileInfo.id, fileInfo.driveId, function(fileInfo)
- {
- var timestamp = String(new Date(fileInfo.lastModifiedDateTime).getTime());
- var cachedFilename = timestamp + '_' + fileInfo.name;
-
- tryCachedFile(cachedFileId, function()
- {
- if (/\.v(dx|sdx?)$/i.test(fileInfo.name))
- {
- AC.getBinaryFile(fileInfo, function(blobFile)
- {
- convertVSDXtoMX(blobFile, fileInfo.name, function(xml)
- {
- cacheAndRender(xml, mxUtils.parseXml(xml), cachedFilename);
- }, fetchDocErr);
- }, fetchDocErr);
- }
- else
- {
- AC.getDrawioFileDoc(fileInfo, function(doc, cnt)
- {
- cacheAndRender(cnt, doc, cachedFilename);
- }, fetchDocErr);
- }
- });
- }, fetchDocErr);
- }
- };
- AP.dialog.getCustomData(doMain);
- }
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
- // Prefetches asynchronous requests so that below code runs synchronous
- // Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
- // is compiled into JS in the build process and is only needed for local development.
- var bundleLoaded = false;
- var scriptLoaded = false;
-
- function mainBarrier()
- {
- if (bundleLoaded && scriptLoaded)
- {
- main();
- }
- };
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
- });
-
- script.onload = function()
- {
- scriptLoaded = true;
- mainBarrier();
- };
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/onedrivejira/oneDriveFSViewer.html b/src/main/webapp/connect/onedrivejira/oneDriveFSViewer.html
deleted file mode 100644
index b92e934c..00000000
--- a/src/main/webapp/connect/onedrivejira/oneDriveFSViewer.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>OneDrive Viewer</title>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- background-color:#ffffff;
- background-image:url(./spinner.gif);
- background-position:center 49%;
- background-repeat:no-repeat;
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
-}
-</style>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-</head>
-<body>
-<script src="oneDriveFSViewer.js" type="text/javascript"></script>
-
-</body>
-</html>
diff --git a/src/main/webapp/connect/onedrivejira/oneDriveFSViewer.js b/src/main/webapp/connect/onedrivejira/oneDriveFSViewer.js
deleted file mode 100644
index 0602ce95..00000000
--- a/src/main/webapp/connect/onedrivejira/oneDriveFSViewer.js
+++ /dev/null
@@ -1,128 +0,0 @@
-(function()
-{
- // Specifies connection mode for touch devices (at least one should be true)
- var connectUrl = AC.getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName('head')[0];
-
- var script = document.createElement('script');
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- head.appendChild(script);
-
- var link = document.createElement('link');
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- function main()
- {
- AP.resize('100%', '100%');
-
- //keeping the block of AP.require to minimize the number of changes!
- function doMain(customData)
- {
- var fileInfo = (customData != null) ? customData.fileInfo : null;
- var id = fileInfo.id;
- var serverName = document.referrer;
- var timeout = 25000;
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
-
- var flag = AP.flag.create({
- title: 'The connection has timed out',
- body: 'The server at ' +
- serverName + ' is taking too long to respond.',
- type: 'error',
- close: 'manual'
- });
-
- AP.dialog.close();
- }, timeout);
-
- function createPrevIframe(url)
- {
- window.clearTimeout(timeoutThread);
- var iframe = document.createElement('iframe');
- iframe.src = url;
- iframe.setAttribute('frameborder', '0');
- iframe.width = '100%';
- iframe.height = '100%';
- document.body.appendChild(iframe);
- };
-
- function noPrevErr()
- {
- window.clearTimeout(timeoutThread);
- document.body.innerHTML = 'No preview is available';
- };
-
- if (fileInfo.service == 'GDrive')
- {
- GAC.getFileInfo(id, function(fileInfo)
- {
- createPrevIframe(fileInfo.embedLink);
- }, noPrevErr);
- }
- else if (fileInfo.service == 'AttFile')
- {
- AP.request({
- url: '/secure/attachment/' + id + '/',
- success: function(resp)
- {
- createPrevIframe(resp);
- },
- error: noPrevErr
- });
- }
- else //OneDrive
- {
- var driveId = fileInfo.driveId;
- var embeddedUrl = fileInfo.embeddedUrl;
-
- if (embeddedUrl)
- {
- createPrevIframe(embeddedUrl);
- }
- else
- {
- AC.getPreviewUrl(id, driveId, function(prevUrl)
- {
- if (acceptResponse)
- {
- if (prevUrl)
- {
- createPrevIframe(prevUrl);
- }
- else
- {
- noPrevErr();
- }
- }
- }, noPrevErr);
- }
- }
- };
-
- AP.dialog.getCustomData(doMain);
- }
-
- script.onload = main;
-
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/onedrivejira/spinner.gif b/src/main/webapp/connect/onedrivejira/spinner.gif
deleted file mode 100644
index 054973c9..00000000
--- a/src/main/webapp/connect/onedrivejira/spinner.gif
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/onedrivejira/viewerPanel.html b/src/main/webapp/connect/onedrivejira/viewerPanel.html
deleted file mode 100644
index 8c54e3e7..00000000
--- a/src/main/webapp/connect/onedrivejira/viewerPanel.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Diagram Viewer</title>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.7.1/css/aui.css" media="all">
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<style type="text/css">
-html, body {
- height:100%;
- overflow:hidden;
-}
-body {
- font-family:Arial,sans-serif;
- width:100%;
- margin:0;
- background-color: #fff;
- background-image:url(/connect/onedrivejira/spinner.gif);
- background-repeat:no-repeat;
- background-position:center;
-}
-.connector-add-file {
- float: right;
-}
-</style>
-</head>
-<body>
-<script type="text/javascript">
-// Sets global environment variables
-RESOURCE_BASE = '/resources/dia';
-STENCIL_PATH = '/stencils';
-SHAPES_PATH = '/shapes';
-IMAGE_PATH = '/images';
-
-// Overrides browser language with JIRA user language
-var lang = AC.getUrlParam('loc', true);
-
-// Language is in the Connect URL
-if (lang != null)
-{
- var dash = lang.indexOf('-');
-
- if (dash >= 0)
- {
- mxLanguage = lang.substring(0, dash);
- }
-}
-</script>
-<script src="/js/viewer.min.js" type="text/javascript"></script>
-<script type="text/javascript" src="../vsdx/importer.js"></script>
-<script src="viewerPanel.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/onedrivejira/viewerPanel.js b/src/main/webapp/connect/onedrivejira/viewerPanel.js
deleted file mode 100644
index 562559f8..00000000
--- a/src/main/webapp/connect/onedrivejira/viewerPanel.js
+++ /dev/null
@@ -1,807 +0,0 @@
-(function()
-{
- var opts =
- {
- lines: 12, // The number of lines to draw
- length: 8, // The length of each line
- width: 3, // The line thickness
- radius: 5, // The radius of the inner circle
- rotate: 0, // The rotation offset
- color: '#000', // #rgb or #rrggbb
- speed: 1, // Rounds per second
- trail: 60, // Afterglow percentage
- shadow: false, // Whether to render a shadow
- hwaccel: false, // Whether to use hardware acceleration
- className: 'spinner', // The CSS class to assign to the spinner
- zIndex: 2e9 // The z-index (defaults to 2000000000)
- };
-
- var spinner = new Spinner(opts);
-
- var odNoThumbImg = '/images/onedrive-logo.svg';
- var gdNoThumbImg = '/images/google-drive-logo.svg';
- var attNoThumbImg = '/images/drawlogo-text-bottom.svg';
-
- // Enables dynamic loading of shapes and stencils (same domain)
- mxStencilRegistry.dynamicLoading = true;
-
- // Specifies connection mode for touch devices (at least one should be true)
- var connectUrl = AC.getBaseUrl() + '/atlassian-connect';
- var head = document.getElementsByTagName('head')[0];
-
- var script = document.createElement('script');
- script.setAttribute('data-options', 'resize:false;margin:false');
-
- head.appendChild(script);
-
- var link = document.createElement('link');
- link.type = 'text/css';
- link.rel = 'stylesheet';
- link.href = connectUrl + '/all.css';
- head.appendChild(link);
-
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) ||
- mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
-
- // Prefetches asynchronous requests so that below code runs synchronous
- // Loading the correct bundle (one file) via the fallback system in mxResources. The stylesheet
- // is compiled into JS in the build process and is only needed for local development.
- var bundleLoaded = false;
- var scriptLoaded = false;
-
- function mainBarrier()
- {
- if (bundleLoaded && scriptLoaded)
- {
- main();
- }
- };
-
- mxUtils.getAll([bundle], function(xhr)
- {
- // Adds bundle text to resources
- mxResources.parse(xhr[0].getText());
- bundleLoaded = true;
- mainBarrier();
- });
-
- script.onload = function()
- {
- scriptLoaded = true;
- mainBarrier();
- };
- script.src = 'https://connect-cdn.atl-paas.net/all.js';
-
- function main()
- {
- //Create draw.io panel toolbar (currently, we only have "Add Diagram" button)
- var toolbar = document.createElement('div');
- toolbar.style.cssText = "width:99%;height:35px";
- var addFileBtn = document.createElement('button');
- addFileBtn.className = "aui-button connector-add-file";
- mxUtils.write(addFileBtn, mxResources.get('addFile', null, 'Add File'));
-
- addFileBtn.addEventListener('click', function()
- {
- AP.dialog.create(
- {
- header: 'Add Diagram File',
- key: 'oneDriveEditorBlank',
- width: '80%',
- height: '60%',
- chrome: true
- });
- });
-
- toolbar.appendChild(addFileBtn);
- document.body.appendChild(toolbar);
-
- var removeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVAQMAAACT2TfVAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABlJREFUCNdjQAF/GBj4/x8AYxBg/k80RgYApAUPr950a4AAAAAASUVORK5CYII=';
- var editImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAD1BMVEUAAAAAAAAQEBBycnIgICBqwj3hAAAAAXRSTlMAQObYZgAAADlJREFUCNdjoBwoChrAmCyGggJwYWVBBSiTSVDICKFa0AEuLCiEJKyAX5gBSZgBSZgBKGwMBKQ7HAAWzQSfKKAyBgAAAABJRU5ErkJggg==';
- var issueId = AC.getUrlParam('issueId');
- var serverName = document.referrer;
- var timeout = 25000;
- var index1 = serverName.indexOf('//');
-
- if (index1 > 0)
- {
- var index2 = serverName.indexOf('/', index1 + 2);
-
- if (index2 > index1)
- {
- serverName = serverName.substring(index1 + 2, index2);
- }
- }
-
- // Delayed invocation see below
- function init()
- {
- // Workaround to ignore scrollbars when applying fit to available width in all but FF
- if (!mxClient.IS_FF)
- {
- document.body.style.width = document.documentElement.offsetWidth + 'px';
- }
-
- //TODO is 0px really needed?
- AP.resize('100%', '200px');
-
- AP.request({
- url: '/rest/api/2/issue/' + issueId + '/properties/onedrive-conn-data',
- type: 'GET',
- success: function(resp)
- {
- var tbHeight = GraphViewer.prototype.toolbarHeight;
- var tiles = [];
- var count = 0;
- var tilesPerRow, tileWidth, tileWidthCss, tileHeightCss, lastWidth;
-
- function showError(container, errMsg)
- {
- container.style.cssText = '';
- container.style.textAlign = 'center';
- container.style.marginTop = tbHeight + 'px';
- container.innerHTML = '<img src="/mxgraph/images/error.gif" border="0" align="absmiddle"/> ' +
- AC.htmlEntities(errMsg);
- };
-
- function updateTileSize()
- {
- tilesPerRow = Math.max(Math.round(document.documentElement.offsetWidth / 250), 1);
- //floor and -1 to avoid IE issues of moving last tile to next row
- tileWidth = Math.floor(document.documentElement.offsetWidth / tilesPerRow) - 1;
- tileWidthCss = tileWidth + "px";
- tileHeightCss = (tileWidth + tbHeight) + "px";
- };
-
- updateTileSize();
- AP.resize('100%', tileWidth + tbHeight + 35);
-
- function updateHeight()
- {
- lastWidth = document.documentElement.offsetWidth;
- var rows = Math.ceil(tiles.length / tilesPerRow);
-
- // +5 is needed to include margin, 35 is the panel toolbar height
- var h = tiles.length > 0? rows * (tiles[0].tile.offsetHeight + 5) + 35 : 50;
-
- // Restricts the max sidebar panel height
- var maxH = screen.height * 1.5;
- h = Math.min(maxH, h);
- AP.resize('100%', h);
-
- // Workaround for iframe scrollbars
- document.body.style.height = h + 'px';
-
- document.body.style.overflowY = maxH == h? "auto" : "hidden";
- };
-
- window.addEventListener('resize', function()
- {
- if (lastWidth != document.documentElement.offsetWidth)
- {
- updateTileSize();
-
- for (var i = 0; i < tiles.length; i++)
- {
- tiles[i].title.style.width = tileWidthCss;
-
- tiles[i].container.style.width = tileWidthCss;
- tiles[i].container.style.height = tileWidthCss;
-
- tiles[i].tile.style.width = tileWidthCss;
- tiles[i].tile.style.height = tileHeightCss;
- }
-
- updateHeight();
- }
- });
-
- function finish()
- {
- count--;
-
- if (count == 0)
- {
- document.body.style.backgroundImage = 'none';
- document.body.style.width = '';
- updateHeight();
- }
- };
-
- function addFileTile(file, attFiles)
- {
- count++;
- var tile = document.createElement('div');
- tile.style.cssText = 'width:' + tileWidthCss + ';height:' + tileHeightCss + ';display:inline-block;overflow: hidden;';
- document.body.appendChild(tile);
- var container = document.createElement('div');
- container.style.cssText = 'position:relative;box-sizing:border-box;margin-bottom:2px;' +
- 'width:' + tileWidthCss + ';height:' + tileWidthCss + ';border:1px solid transparent;display:inline:block;overflow: hidden;';
-
- // Adds filename and tooltip to title
- var title = document.createElement('div');
- var modifiedDate = new Date(file.modifiedDate).toLocaleString();
- mxUtils.write(title, file.name);
- title.setAttribute('title', file.name + ' (' + modifiedDate + ')' + (file.createdBy? ' - ' + file.createdBy : '') +
- (file.lastModifiedBy? ' [Last Modified By: ' + file.lastModifiedBy + ']' : ''));
- title.style.cssText = 'position:relative;box-sizing:border-box;width:' + tileWidthCss + ';padding: 6px 0 0 3px;height:' + tbHeight +
- 'px;margin-bottom:-' + tbHeight + 'px;text-align:left;white-space:nowrap;cursor:pointer;overflow:hidden;';
- tile.appendChild(title);
- tile.appendChild(container);
- tiles.push({tile: tile, container: container, title: title});
- var attId = null;
-
- var refreshImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAhFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8qm6wAAAAK3RSTlMABr4XDQoC07pc+/Yq5dzYtaiSjXlkMx4U8u/NwrKZf1gl8eDKb2lOR0Q6/VKNjQAAAKlJREFUGNOtjlcOwjAQBd1jOwnpvdNh738/kuA4iE/EfI1Gu9JD/4RTyr+bNxDHCS8FKp62CXWAlSYj0n6MNZziLOt90EC2OgXQ5osoF/aagr/GgsBeRUpSsUgeSikHbG4xFpssamCU0lIYZVuMDkFw9oxeTaUOgE74e0T1+Ki1wvOl8iHituojVDJJiAuNhwxlG9+Jhhm3sxGJiaFy7MMuvjFksavRD7wAhtIMKUShI2QAAAAASUVORK5CYII=';
-
- var btnDefs = {
- 'refresh': {title: mxResources.get('refresh'),
- image: refreshImg, handler: function()
- {
- renderDrawioFile();
- }
- },
- 'edit': {title: mxResources.get('edit'), enabled: typeof window.Blob !== 'undefined',
- image: editImage, handler: function()
- {
- //Use the same URL such that no authentication is needed when editing or viewing PNG files
- window.open('https://' + window.location.hostname +
- (file.service == 'GDrive'? '/#G' + encodeURIComponent(file.id) : '/#W' + encodeURIComponent(file.driveId + '/' + file.id)));
- }},
- 'remove': {title: mxResources.get('delete'), image: removeImage, handler: function()
- {
- if (confirm(mxResources.get('removeIt', [file.name]) + '?'))
- {
- AC.removeLink(issueId, file.id, function()
- {
- AP.jira.refreshIssuePage();
- }, function(err)
- {
- alert('Error: ' + (err? err.message : 'Unknown'));
- });
-
- if (attId != null)
- {
- AP.request({
- url: '/rest/api/2/attachment/' + attId,
- type: 'DELETE',
- success: AC.noop,
- error: AC.noop
- });
- }
- }
- }}
- };
-
- if (file.isDrawio)
- {
- function renderDrawioFile()
- {
- spinner.spin(container);
-
- var acceptResponse = true;
-
- var timeoutThread = window.setTimeout(function()
- {
- acceptResponse = false;
- showError(container, 'The connection has timed out: The server at ' +
- serverName + ' is taking too long to respond.');
- finish();
- }, timeout);
-
- var viewDrawioDoc = function(doc, noEdit)
- {
- try
- {
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- var pageId, layerIds;
-
- if (file.aspect != null)
- {
- var aspectArray = file.aspect.split(' ');
-
- if (aspectArray.length > 1)
- {
- pageId = aspectArray[0];
- layerIds = aspectArray.slice(1);
- }
- }
-
- spinner.stop();
- container.innerHTML = '';
-
- var viewer = new GraphViewer(container, doc.documentElement, {highlight: '#3572b0',
- 'toolbar-position': 'top', toolbar: (noEdit == true? '' : 'edit ') + 'pages refresh layers lightbox remove',
- border: 8, 'auto-fit': true, resize: false,
- nav: true, 'toolbar-buttons': btnDefs,
- pageId: pageId, layerIds: layerIds});
-
- // Handles resize of iframe after zoom
- var graphDoResizeContainer = viewer.graph.doResizeContainer;
-
- viewer.graph.doResizeContainer = function(width, height)
- {
- graphDoResizeContainer.apply(this, arguments);
- updateHeight();
- };
-
- // Updates the size of the iframe in responsive cases
- viewer.updateContainerHeight = function(container, height)
- {
- updateHeight();
- };
-
- viewer.showLightbox = function()
- {
- //Create an aspect reflecting current view
- var layerIds = [], pageId = viewer.diagrams[viewer.currentPage].getAttribute('id');
-
- var model = viewer.graph.getModel();
- var childCount = model.getChildCount(model.root);
-
- // Get visible layers
- for (var i = 0; i < childCount; i++)
- {
- var layer = model.getChildAt(model.root, i);
-
- if (model.isVisible(layer))
- {
- layerIds.push(layer.id);
- }
- }
-
- AP.dialog.create(
- {
- header: file.name,
- key: 'drawioFullScreenViewer',
- size: 'fullscreen',
- chrome: true,
- customData: {fileInfo: file, pageId: pageId, layerIds: layerIds, issueId: issueId, cachedFileId: attId}
- });
- };
-
- finish();
- }
- }
- catch(e)
- {
- showError(container, 'Error: ' + ((e? e.message : '') || 'Unknown'));
- finish();
- }
- };
-
- var getFileErr = function(err)
- {
- //TODO handle errors better
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- showError(container, 'Error: ' + ((err? err.message : '') || 'Unknown'));
- finish();
- }
- };
-
- var getFileInfoErr = function(err)
- {
- //TODO handle errors better
- window.clearTimeout(timeoutThread);
-
- if (acceptResponse)
- {
- if (err && (err.status == 403 || err.status == 400)) //400 is returned when a business account file is accessed via a personal account
- {
- showError(container, 'Error: Access Denied. You do not have permission to access this file "'+ file.name +'".');
- }
- else
- {
- showError(container, 'Error: ' + ((err? err.message : '') || 'Unknown'));
- }
-
- finish();
- }
- };
-
- var tryCachedFile = function(cachedFilename, filename, timestamp, onError)
- {
- var notFound = true;
-
- for (var i = 0; i < attFiles.length; i++)
- {
- if (attFiles[i].filename == cachedFilename)
- {
- notFound = false;
- attId = attFiles[i].id;
-
- AP.request({
- url: '/secure/attachment/' + attFiles[i].id + '/',
- success: function(resp)
- {
- viewDrawioDoc(mxUtils.parseXml(resp));
- },
- error: onError
- });
- }
- else
- {
- var attInfo = attFiles[i].filename.match(/(\d+)_(.*)/);
-
- if (attInfo != null && attInfo[2] == filename && attInfo[1] != timestamp)
- {
- AP.request({
- url: '/rest/api/2/attachment/' + attFiles[i].id,
- type: 'DELETE',
- success: AC.noop,
- error: AC.noop
- });
- }
- }
- }
-
- if (notFound)
- {
- onError();
- }
- };
-
- function cacheAndRender(fileContent, fileDoc, cachedFilename)
- {
- viewDrawioDoc(fileDoc);
-
- AC.uploadToJira(fileContent, issueId, cachedFilename,
- 'application/vnd.jgraph.mxfile', function(resp)
- {
- resp = JSON.parse(resp);
- attId = resp[0].id;
- }, GAC.noop);
- };
-
- if (file.service == 'GDrive')
- {
- GAC.getFileInfo(file.id, function(fileInfo)
- {
- var timestamp = String(new Date(fileInfo.modifiedDate).getTime());
- var cachedFilename = timestamp + '_' + fileInfo.title;
-
- tryCachedFile(cachedFilename, fileInfo.title, timestamp, function()
- {
- if (/\.v(dx|sdx?)$/i.test(fileInfo.title))
- {
- GAC.getBinaryFile(fileInfo, function(blobFile)
- {
- convertVSDXtoMX(blobFile, fileInfo.title, function(xml)
- {
- cacheAndRender(xml, mxUtils.parseXml(xml), cachedFilename);
- }, getFileErr);
- }, getFileErr);
- }
- else
- {
- GAC.getDrawioFileDoc(fileInfo, function(doc, cnt)
- {
- cacheAndRender(cnt, doc, cachedFilename);
- }, getFileErr);
- }
- });
- }, getFileInfoErr);
- }
- else if (file.service == 'AttFile')
- {
- attId = file.id;
-
- AP.request({
- url: '/secure/attachment/' + file.id + '/',
- success: function(resp)
- {
- var isPng = file.mime == 'image/png';
-
- try
- {
- if (isPng)
- {
- resp = AC.extractGraphModelFromPng(resp);
- }
-
- var doc = mxUtils.parseXml(resp);
- viewDrawioDoc(doc, true);
- }
- catch(e)
- {
- getFileErr();
- }
- },
- error: getFileErr
- });
- }
- else //OneDrive or old format that doesn't have service
- {
- AC.getFileInfo(file.id, file.driveId, function(fileInfo)
- {
- var timestamp = String(new Date(fileInfo.lastModifiedDateTime).getTime());
- var cachedFilename = timestamp + '_' + fileInfo.name;
-
- tryCachedFile(cachedFilename, fileInfo.name, timestamp, function()
- {
- if (/\.v(dx|sdx?)$/i.test(fileInfo.name))
- {
- AC.getBinaryFile(fileInfo, function(blobFile)
- {
- convertVSDXtoMX(blobFile, fileInfo.name, function(xml)
- {
- cacheAndRender(xml, mxUtils.parseXml(xml), cachedFilename);
- }, getFileErr);
- }, getFileErr);
- }
- else
- {
- AC.getDrawioFileDoc(fileInfo, function(doc, cnt)
- {
- cacheAndRender(cnt, doc, cachedFilename);
- }, getFileErr);
- }
- });
- }, getFileInfoErr);
- }
- };
-
- renderDrawioFile();
- }
- else
- {
- function viewOtherFiles(getPrevUrl, noThumbImg)
- {
- //This is a hacky way to have the same GraphViewer toolbar with OneDrive thumbnails. Simply by displaying an empty diagram and hiding it.
- var viewer = new GraphViewer(container,
- mxUtils.parseXml('<mxGraphModel><root><mxCell id="0"/><mxCell id="1" parent="0"/></root></mxGraphModel>').documentElement,
- {highlight: '#3572b0', 'toolbar-position': 'top', toolbar: 'pages layers lightbox remove',
- border: 8, 'auto-fit': true, resize: false,
- nav: true, title: file.name, 'toolbar-buttons': btnDefs});
-
- var svg = AC.$('svg', container);
- svg.style.display = 'none';
-
- viewer.showLightbox = function()
- {
- AP.dialog.create(
- {
- header: file.name,
- key: 'oneDriveFullScreenViewer',
- size: 'fullscreen',
- chrome: true,
- customData: {fileInfo: file, issueId: issueId}
- });
- };
-
- container.addEventListener('click', viewer.showLightbox);
-
- var imgSrc = noThumbImg;
- var img = document.createElement('img');
- var maxDim = tileWidth - 4;
- img.style.cssText = 'vertical-align: middle;max-width: '+ maxDim +'px;max-height: '+ maxDim +'px;';
- container.style.cssText = container.style.cssText + 'line-height: '+ maxDim +'px;text-align: center; margin-top: 30px;'
-
- function defThumbErr()
- {
- this.onerror = null;
- this.style.width = "46px";
- this.style.height = "46px";
- this.src = noThumbImg;
- };
-
- img.onerror = defThumbErr;
-
- getPrevUrl(function(thumbUrls)
- {
- if (thumbUrls != null)
- {
- if (Array.isArray(thumbUrls) && thumbUrls.length > 0)
- {
- imgSrc = thumbUrls[0];
-
- img.onerror = function()
- {
-
- var pos = thumbUrls.indexOf(imgSrc) + 1;
-
- if (pos < thumbUrls.length)
- {
- this.src = thumbUrls[pos];
- }
- else
- {
- defThumbErr.call(this);
- }
- };
- }
- else
- {
- imgSrc = thumbUrls;
- }
- }
-
- img.src = imgSrc;
- container.appendChild(img);
-
- finish();
- }, function(err)
- {
- if (err && (err.status == 403 || err.status == 400)) //400 is returned when a business account file is accessed via a personal account
- {
- showError(container, 'Error: Access Denied. You do not have permission to access this file "'+ file.name +'".');
- }
- else
- {
- showError(container, 'Error: ' + ((err? err.message : '') || 'Cannot get thumbnail.'));
- }
- finish();
- });
- };
-
- if (file.service == 'GDrive')
- {
- viewOtherFiles(function(success, error)
- {
- GAC.getFileInfo(file.id, function(fileInfo)
- {
- success(fileInfo.thumbnailLink);
- }, error);
- }, gdNoThumbImg);
- }
- else if (file.service == 'AttFile')
- {
- viewOtherFiles(function(success, error)
- {
- AP.request({
- url: '/secure/attachment/' + file.id + '/',
- success: function(resp)
- {
- success(resp);
- },
- error: error
- });
- }, attNoThumbImg);
- }
- else //OneDrive or old format that doesn't have service
- {
- viewOtherFiles(function(success, error)
- {
- AC.getThumbnailUrl(file.id, file.driveId, function(small, allThumbs)
- {
- if (small != null)
- {
- var thumbUrls = [];
-
- if (allThumbs.large)
- {
- thumbUrls.push(allThumbs.large.url);
- }
-
- if (allThumbs.medium)
- {
- thumbUrls.push(allThumbs.medium.url);
- }
-
- if (allThumbs.small)
- {
- thumbUrls.push(allThumbs.small.url);
- }
-
- success(thumbUrls);
- }
- else
- {
- success(null);
- }
- }, error);
- }, odNoThumbImg);
- }
- }
- };
-
- resp = JSON.parse(resp);
- var linksInfo = resp.value;
- var files = [];
- var authOneDrive = false, authGDrive = false;
-
- for (var key in linksInfo)
- {
- var obj = linksInfo[key];
- obj.id = key;
- files[obj.order] = obj;
-
- authGDrive |= obj.service == 'GDrive';
- authOneDrive |= (obj.service == 'OneDrive' || obj.service == null);
- }
-
- function viewFiles(attFiles)
- {
- if (authGDrive || authOneDrive) return;
-
- for (var i = 0; i < files.length; i++)
- {
- if (files[i] != null) addFileTile(files[i], attFiles);
- }
- };
-
- // Shows message if no files are found
- if (files.length == 0)
- {
- mxUtils.write(document.body, mxResources.get('noFiles'));
- document.body.style.backgroundImage = 'none';
- AP.resize('100%', '60px');
- }
- else
- {
- function doViewFiles(attList)
- {
- if (authOneDrive)
- {
- AC.confirmODAuth(function()
- {
- authOneDrive = false;
- viewFiles(attList);
- }, function()
- {
- alert('Error authenticating to OneDrive!'); //TODO better error handling
- });
- }
-
- if (authGDrive)
- {
- GAC.confirmGDAuth(function()
- {
- authGDrive = false;
- viewFiles(attList);
- },
- function()
- {
- alert('Error authenticating to Google Drive!'); //TODO better error handling
- });
- }
-
- viewFiles(attList);
- };
-
- AC.getJiraAttList(issueId, doViewFiles, function()
- {
- doViewFiles([]); //One error continue without cached files
- });
- }
- },
- error: function()
- {
- mxUtils.write(document.body, mxResources.get('noFiles'));
- document.body.style.backgroundImage = 'none';
- AP.resize('100%', '60px');
- }
- });
- }; // end of init
-
- // Workaround for collapsed side panel is to delay init until size is not 0
- // NOTE: Since container.offsetWidth is 2 in this case the delayed rendering
- // in the viewer does not triggger. We disable is here to make sure this does
- // not change in case the container width is zero in the future.
- GraphViewer.prototype.checkVisibleState = false;
-
- if (document.documentElement.offsetWidth == 0)
- {
- var listener = function()
- {
- if (document.documentElement.offsetWidth > 0)
- {
- window.removeEventListener('resize', listener);
- init();
- }
- };
-
- window.addEventListener('resize', listener);
- }
- else
- {
- init();
- }
- }
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/remote_gdrive/editor.html b/src/main/webapp/connect/remote_gdrive/editor.html
deleted file mode 100644
index d15980ae..00000000
--- a/src/main/webapp/connect/remote_gdrive/editor.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Embed draw.io Diagram</title>
-<script type="text/javascript">
- // To Avoid NPE in connectUtils
- urlParams = {};
-</script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script src="/js/viewer.min.js" type="text/javascript"></script>
-<script src="../gdrive_common/editor.js" type="text/javascript"></script>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.9.12/css/aui.min.css" media="all">
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
- background-color: white;
-}
-
-#errorMsg {
- position:absolute;
- bottom:10px;
- left:0px;
- right:0px;
- text-align:center;
- overflow:hidden;
- color:red;
- opacity: 0;
- transition: opacity 1s;
-}
-
-#errorMsg.fade {
- opacity: 1;
-}
-</style>
-</head>
-<body>
- <div style="position:absolute;bottom:0;right:0;top:0;left:0;display:inline-block;">
- <table style="height:100%;width:100%">
- <tr>
- <td style="height:100%;width:350px;">
- <div style="height:100%;width:350px;border-right:1px solid #cccccc;">
- <form class="aui top-label" action="#" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filename">File name</label>
- <input class="text macro-param-input" type="text" id="filenameGD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerGD" disabled>Choose</button>
- <div id="spinner-containerGD"></div>
- <div class="description">Google Drive file name</div>
- <div class="error" id="filenameErrorGD"></div>
- </div>
- <div style="display: none">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthGD">Width</label> <input class="text medium-field" id="widthGD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorGD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightGD">Height</label> <input class="text medium-field" id="heightGD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorGD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeGD" type="checkbox" >
- <label for="autoSizeGD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- <div class="field-group" style="padding-left:15px">
- <label for="thumbImg">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImgGD">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawioGD">
- <label for="useDrawio" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </div>
- <a id="signoutGD" style="position: absolute;bottom: 2px;right: 5px;font-size: 11px;cursor: pointer;" onclick="javascript:void(0);">Sign Out</a>
- </form>
- </div>
- </td>
- <td style="text-align: center; height:100%;width:calc(100% - 365px)">
- <div id="previewGD" style="text-align: center; height:100%;width:100%;position:relative;">
- <a style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer"
- onclick="document.getElementById('filePickerGD').click();">Choose a file...</a>
- </div>
- </td>
- </tr>
- </table>
- </div>
- <div id="errorMsg">
- </div>
- <script src="editor.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/remote_gdrive/editor.js b/src/main/webapp/connect/remote_gdrive/editor.js
deleted file mode 100644
index 87fe4072..00000000
--- a/src/main/webapp/connect/remote_gdrive/editor.js
+++ /dev/null
@@ -1,43 +0,0 @@
-(function(){
- var editedFile = null;
-
- var editor = new GDriveEditor(function(selectedFile, width, height)
- {
- var data = {
- diagramName: selectedFile.title,
- service: 'GDrive',
- sFileId: selectedFile.id,
- aspect: selectedFile.aspect,
- width: width,
- height: height,
- modifiedTS: new Date(selectedFile.modifiedDate).getTime()
- };
-
- parent.postMessage(JSON.stringify({action: 'fileData', data: data, isEdited: editedFile == selectedFile.id}), '*');
- }, null, 'GD', true, true);
-
- var messageListener = function(evt)
- {
- if (evt.source == parent)
- {
- var msg = JSON.parse(evt.data);
-
- switch (msg.action)
- {
- case 'spinner.stop':
- editor.spinner.stop();
- break;
- case 'getSelFile':
- editor.doSubmit();
- break;
- case 'loadFile':
- editedFile = msg.fileInfo.sFileId;
- editor.loadDrawioFile(msg.fileInfo);
- break;
- }
- }
- };
-
- window.addEventListener('message', messageListener);
- parent.postMessage(JSON.stringify({action: 'editorReady'}), '*');
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/remote_gdrive/viewer.html b/src/main/webapp/connect/remote_gdrive/viewer.html
deleted file mode 100644
index 6db30d2c..00000000
--- a/src/main/webapp/connect/remote_gdrive/viewer.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Embed draw.io Diagram</title>
-<script type="text/javascript">
- // To Avoid NPE in connectUtils
- urlParams = {};
-</script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../gdrive_common/gac.js" type="text/javascript"></script>
-<script src="/js/viewer.min.js" type="text/javascript"></script>
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
- padding: 0;
- background-color: none;
-}
-</style>
-</head>
-<body>
- <script src="../new_common/cviewer.js" type="text/javascript"></script>
- <script src="viewer.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/remote_gdrive/viewer.js b/src/main/webapp/connect/remote_gdrive/viewer.js
deleted file mode 100644
index 1f6cf66f..00000000
--- a/src/main/webapp/connect/remote_gdrive/viewer.js
+++ /dev/null
@@ -1,44 +0,0 @@
-(function(){
- var messageListener = function(evt)
- {
- if (evt.source == parent)
- {
- var msg = JSON.parse(evt.data);
-
- switch (msg.action)
- {
- case 'viewFile':
- GAC.getFileInfo(msg.data.sFileId, function(fileInfo)
- {
- var isPng = fileInfo.mimeType == 'image/png';
- var fileTitle = fileInfo.title;
-
- GAC.doAuthRequestPlain(fileInfo['downloadUrl'], 'GET', null, function(req)
- {
- var xml = req.responseText;
-
- if (isPng)
- {
- xml = 'data:image/png;base64,' + Editor.base64Encode (xml);
- xml = GAC.extractGraphModelFromPng(xml);
- }
-
- renderDiagram(xml, fileTitle, msg.data);
- parent.postMessage(JSON.stringify({action: 'diagramRendered', fileTS: new Date(fileInfo.modifiedDate).getTime()}), '*');
- }, function()
- {
- //Translations are not loaded but it is only used in errors
- showError(mxResources.get('confReadFileErr', [fileTitle, 'Google Drive'], 'Cannot read "{1}" file from {2}.'));
- }, null, isPng);
- }, function()
- {
- showError(mxResources.get('confGetInfoFailed', ['Google Drive'], 'Fetching file info from {1} failed.'));
- });
- break;
- }
- }
- };
-
- window.addEventListener('message', messageListener);
- parent.postMessage(JSON.stringify({action: 'viewerReady'}), '*');
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/remote_onedrive/editor.html b/src/main/webapp/connect/remote_onedrive/editor.html
deleted file mode 100644
index 6d93adc2..00000000
--- a/src/main/webapp/connect/remote_onedrive/editor.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Embed draw.io Diagram</title>
-<script type="text/javascript">
- // To Avoid NPE in connectUtils
- urlParams = {};
-</script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="/js/viewer.min.js" type="text/javascript"></script>
-<script src="../onedrive_common/editor.js" type="text/javascript"></script>
-<link rel="stylesheet" href="//aui-cdn.atlassian.com/aui-adg/5.9.12/css/aui.min.css" media="all">
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
- background-color: white;
-}
-
-#errorMsg {
- position:absolute;
- bottom:10px;
- left:0px;
- right:0px;
- text-align:center;
- overflow:hidden;
- color:red;
- opacity: 0;
- transition: opacity 1s;
-}
-
-#errorMsg.fade {
- opacity: 1;
-}
-</style>
-</head>
-<body>
- <div style="position:absolute;bottom:0;right:0;top:0;left:0;display:inline-block;">
- <table style="height:100%;width:100%">
- <tr>
- <td style="height:100%;width:350px;">
- <div style="height:100%;width:350px;border-right:1px solid #cccccc;">
- <form class="aui top-label" action="#" style="height:100%;top:0px;">
- <div class="field-group" style="padding-left:15px;">
- <label for="filenameOD">File name</label>
- <input class="text macro-param-input" type="text" id="filenameOD" name="filename" disabled placeholder="Choose a file...">
- <button class="aui-button aui-button-primary ap-dialog-submit" id="filePickerOD" disabled>Choose</button>
- <div id="spinner-containerOD"></div>
- <div class="description">OneDrive file name</div>
- <div class="error" id="filenameErrorOD"></div>
- </div>
- <div style="display: none">
- <div class="field-group" style="padding-left:15px;">
- <label for="widthOD">Width</label> <input class="text medium-field" id="widthOD" value="800">
- <div class="description">Width of the viewer (px)</div>
- <div class="error" id="widthErrorOD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <label for="heightOD">Height</label> <input class="text medium-field" id="heightOD" value="600">
- <div class="description">Height of the viewer (px)</div>
- <div class="error" id="heightErrorOD"></div>
- </div>
- <div class="field-group" style="padding-left:15px;">
- <input class="checkbox small-field" id="autoSizeOD" type="checkbox" >
- <label for="autoSizeOD" style="display:inline-block;font-size:12px">Automatically set the size of the viewer</label>
- </div>
- <div class="field-group" style="padding-left:15px">
- <label for="thumbImgOD">Thumbnail</label>
- <div class="thumbnail">
- <img class="thumbImg" id="thumbImgOD">
- </div>
- </div>
- <div class="field-group" style="padding-left:15px">
- <input type="checkbox" class="checkbox small-fiel" id="useDrawioOD">
- <label for="useDrawioOD" style="display:inline-block;">Preview in draw.io</label>
- </div>
- </div>
- <a id="signoutOD" style="position: absolute;bottom: 2px;right: 5px;font-size: 11px;cursor: pointer;" onclick="javascript:void(0);">Sign Out</a>
- </form>
- </div>
- </td>
- <td style="text-align: center; height:100%;width:calc(100% - 365px)">
- <div id="previewOD" style="text-align: center; height:100%;width:100%;position:relative;">
- <a style="display:block;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:pointer"
- onclick="document.getElementById('filePickerOD').click();">Choose a file...</a>
- </div>
- </td>
- </tr>
- </table>
- </div>
- <div id="errorMsg">
- </div>
- <script src="editor.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/remote_onedrive/editor.js b/src/main/webapp/connect/remote_onedrive/editor.js
deleted file mode 100644
index 16b438a8..00000000
--- a/src/main/webapp/connect/remote_onedrive/editor.js
+++ /dev/null
@@ -1,44 +0,0 @@
-(function(){
- var editedFile = null;
-
- var editor = new OneDriveEditor(function(selectedFile, width, height)
- {
- var data = {
- diagramName: selectedFile.name,
- service: 'OneDrive',
- sFileId: selectedFile.id,
- odriveId: selectedFile.parentReference.driveId,
- aspect: selectedFile.aspect,
- width: width,
- height: height,
- modifiedTS: new Date(selectedFile.lastModifiedDateTime).getTime()
- };
-
- parent.postMessage(JSON.stringify({action: 'fileData', data: data, isEdited: editedFile == selectedFile.id}), '*');
- }, null, 'OD', true, true);
-
- var messageListener = function(evt)
- {
- if (evt.source == parent)
- {
- var msg = JSON.parse(evt.data);
-
- switch (msg.action)
- {
- case 'spinner.stop':
- editor.spinner.stop();
- break;
- case 'getSelFile':
- editor.doSubmit();
- break;
- case 'loadFile':
- editedFile = msg.fileInfo.sFileId;
- editor.loadDrawioFile(msg.fileInfo);
- break;
- }
- }
- };
-
- window.addEventListener('message', messageListener);
- parent.postMessage(JSON.stringify({action: 'editorReady'}), '*');
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/remote_onedrive/viewer.html b/src/main/webapp/connect/remote_onedrive/viewer.html
deleted file mode 100644
index b8fcc454..00000000
--- a/src/main/webapp/connect/remote_onedrive/viewer.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Embed draw.io Diagram</title>
-<script type="text/javascript">
- // To Avoid NPE in connectUtils
- urlParams = {};
-</script>
-<script src="../new_common/cac.js" type="text/javascript"></script>
-<script src="../onedrive_common/ac.js" type="text/javascript"></script>
-<script src="/js/viewer.min.js" type="text/javascript"></script>
-<style type="text/css">
-body {
- font-family:Arial, sans-serif;
- overflow:hidden;
- height:100%;
- width:100%;
- margin:0;
- padding: 0;
- background-color: none;
-}
-</style>
-</head>
-<body>
- <script src="../new_common/cviewer.js" type="text/javascript"></script>
- <script src="viewer.js" type="text/javascript"></script>
-</body>
-</html>
diff --git a/src/main/webapp/connect/remote_onedrive/viewer.js b/src/main/webapp/connect/remote_onedrive/viewer.js
deleted file mode 100644
index 582dfdf7..00000000
--- a/src/main/webapp/connect/remote_onedrive/viewer.js
+++ /dev/null
@@ -1,60 +0,0 @@
-(function(){
- var messageListener = function(evt)
- {
- if (evt.source == parent)
- {
- var msg = JSON.parse(evt.data);
-
- switch (msg.action)
- {
- case 'viewFile':
- AC.getFileInfo(msg.data.sFileId, msg.data.odriveId, function(fileInfo)
- {
- var isPng = fileInfo.file.mimeType == 'image/png';
- var fileTitle = fileInfo.name;
-
- var req = new XMLHttpRequest();
- req.open('GET', fileInfo['@microsoft.graph.downloadUrl']);
-
- req.onreadystatechange = function()
- {
- if (this.readyState == 4)
- {
- if (this.status >= 200 && this.status <= 299)
- {
- var xml = req.responseText;
-
- if (isPng)
- {
- xml = 'data:image/png;base64,' + Editor.base64Encode (xml);
- xml = AC.extractGraphModelFromPng(xml);
- }
-
- renderDiagram(xml, fileTitle, msg.data);
- parent.postMessage(JSON.stringify({action: 'diagramRendered', fileTS: new Date(fileInfo.lastModifiedDateTime).getTime()}), '*');
- }
- else
- {
- showError(mxResources.get('confReadFileErr', [fileTitle, 'OneDrive'], 'Cannot read "{1}" file from {2}.'));
- }
- }
- };
-
- if (isPng && req.overrideMimeType)
- {
- req.overrideMimeType('text/plain; charset=x-user-defined');
- }
-
- req.send();
- }, function()
- {
- showError(mxResources.get('confGetInfoFailed', ['OneDrive'], 'Fetching file info from {1} failed.'));
- });
- break;
- }
- }
- };
-
- window.addEventListener('message', messageListener);
- parent.postMessage(JSON.stringify({action: 'viewerReady'}), '*');
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/trello/attSection.html b/src/main/webapp/connect/trello/attSection.html
deleted file mode 100644
index 883d0fb8..00000000
--- a/src/main/webapp/connect/trello/attSection.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<html>
- <head>
- <link rel="stylesheet" href="https://trello.com/power-ups/power-up.css">
- <!-- Is this OK? -->
- <link rel="stylesheet" href="https://a.trellocdn.com/css/d8375bf2ae4b875ccc5216dd4fcc705a/core.css">
- <script src="https://trello.com/power-ups/power-up.min.js"></script>
- <script src="/js/viewer.min.js"></script>
- <script src="js/common.js"></script>
- </head>
- <body>
- <div id="content"></div>
- <script src="js/attSection.js"></script>
- </body>
-</html>
diff --git a/src/main/webapp/connect/trello/editor.html b/src/main/webapp/connect/trello/editor.html
deleted file mode 100644
index 65cfd1ba..00000000
--- a/src/main/webapp/connect/trello/editor.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<html>
- <head>
- <link rel="stylesheet" href="https://trello.com/power-ups/power-up.css">
- <script src="https://trello.com/power-ups/power-up.min.js"></script>
- </head>
- <body>
- <div id="content" style="width:100%;height:100%">
- <iframe id="editorFrame" frameborder="0" src="about:blank" style="width:100%;height:100%">
- </iframe>
- </div>
- <script src="js/editor.js"></script>
- </body>
-</html> \ No newline at end of file
diff --git a/src/main/webapp/connect/trello/images/drawio-trello-ss.png b/src/main/webapp/connect/trello/images/drawio-trello-ss.png
deleted file mode 100644
index 3a8e18b3..00000000
--- a/src/main/webapp/connect/trello/images/drawio-trello-ss.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/connect/trello/index.html b/src/main/webapp/connect/trello/index.html
deleted file mode 100644
index 20c96119..00000000
--- a/src/main/webapp/connect/trello/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="utf-8">
- </head>
- <body>
- <script src="https://trello.com/power-ups/power-up.js"></script>
- <script src="js/common.js"></script>
- <script src="js/client.js"></script>
- <h1>
- draw.io Trello Power-Up
- </h1>
- </body>
-</html>
diff --git a/src/main/webapp/connect/trello/js/attSection.js b/src/main/webapp/connect/trello/js/attSection.js
deleted file mode 100644
index a8466d81..00000000
--- a/src/main/webapp/connect/trello/js/attSection.js
+++ /dev/null
@@ -1,201 +0,0 @@
-// Resize sensor not needed
-GraphViewer.useResizeSensor = false;
-
-var t = window.TrelloPowerUp.iframe();
-
-t.render(function()
-{
- var idSep = encodeURIComponent('|$|');
- var ident = 'attachment-thumbnail-details-options-item dark-hover';
- var data = null;
-
- // NOTE: Autosave is enabled to avoid possible data loss due
- // to no event fired before the modal dialog closes
- var getEditFunction = function(att, name)
- {
- return function()
- {
- var id = t.getContext().card + idSep + att.id;
-
- t.modal({
- url: './editor.html',
- fullscreen: true,
- title: 'draw.io: ' + name,
- args: {url: mxTrelloCommon.editorURL +
- ((location.hostname != 'www.draw.io') ?
- '?dev=1&test=1&embed=1&libraries=1&tr=1&gapi=1&od=1&gh=1&db=1&gl=1&p=tr' :
- '?embed=1&libraries=1&tr=1&gapi=1&od=1&gh=1&db=1&gl=1&p=tr') +
- '#T' + id}
- });
- }
- };
-
- var getPrevFunction = function(prevURL, name)
- {
- return function(evt)
- {
- var source = mxEvent.getSource(evt);
-
- while (source != null)
- {
- if (source.className != null && source.className.
- toString().substring(0, ident.length) == ident)
- {
- return;
- }
-
- source = source.parentNode;
- }
-
- // Redirect via editor.html to avoid Trello injecting crap
- // after the hash in the URL
- t.modal({
- url: './editor.html',
- fullscreen: true,
- title: 'draw.io: ' + name,
- args: {url: prevURL}
- });
- }
- };
-
- t.card('attachments')
- .get('attachments')
- .filter(mxTrelloCommon.attFilterFn)
- .then(function(drawioAtts)
- {
- var content = document.getElementById('content');
- content.innerHTML = "";
-
- for (var i = 0; i < drawioAtts.length; i++)
- {
- (function(atts)
- {
- var div = document.createElement('div');
- div.className = "attachment-thumbnail";
-
- var attName = atts.name;
-
- //TODO add preview modal on click
- //For PNG and SVG (on supported browsers) show them as images, otherwise, load them inside a lightbox editor [size 300px max for images]
- //Click shows a preview
- var previews = atts.previews;
-
- var prevURL = mxTrelloCommon.editorURL + '?lightbox=1&nav=1&layers=1&highlight=3572b0';
- var fileId = '#T' + t.getContext().card + idSep + atts.id;
-
- if (previews.length > 0)
- {
- //find the best size (max dim is 300px)
- var maxPrev = previews[0];
-
- for (var j = 1; j < previews.length; j++)
- {
- if (previews[j].width <= 350 && previews[j].height <= 260 && maxPrev.width < previews[j].width)
- {
- maxPrev = previews[j];
- }
- }
-
- var imgLink = document.createElement('a');
- imgLink.className = "attachment-thumbnail-preview";
- imgLink.setAttribute('href', 'javascript:void(0);');
- imgLink.setAttribute('title', attName);
- imgLink.style.cssText = "background-image: url('" + maxPrev.url + "');background-color: #fcfcfc;";
-
- div.appendChild(imgLink);
- }
- else
- {
- var id = t.getContext().card + encodeURIComponent('|$|') + atts.id;
-
- var container = document.createElement('div');
- container.style.cssText = 'position:absolute;top:0px;left:0px;width:110px;' +
- 'height:80px;border:1px solid transparent;cursor:pointer;' +
- 'background-position:center;background-repeat:no-repeat;background-image:url(/images/spin.gif);';
- div.appendChild(container);
-
- // Does not use iframe for quicker loading and avoiding authorize dialog
- mxUtils.get('/proxy?url=' + encodeURIComponent(atts.url), function(req)
- {
- container.style.backgroundImage = 'none';
-
- if (req.getStatus() >= 200 && req.getStatus() < 300)
- {
- var viewer = new GraphViewer(container, req.getDocumentElement(),
- {highlight: '#3572b0', border: 4, lightbox: false,
- nav: true, 'max-height': 72});
- container.style.width = '110px';
- container.style.height = '80px';
-
- if (viewer.graph != null)
- {
- // Adds transparent background
- viewer.graph.view.canvas.ownerSVGElement.style.backgroundColor = 'transparent';
-
- // Undo container resize and center
- var bounds = viewer.graph.getGraphBounds();
- var dx = (110 - bounds.width) / 2 - bounds.x;
- var dy = (80 - bounds.height) / 2 - bounds.y;
- viewer.graph.view.canvas.ownerSVGElement.setAttribute('transform',
- 'translate(' + dx + ' ' + dy + ')');
- }
- }
- });
- }
-
- var prevFn = getPrevFunction(prevURL + fileId, attName);
- mxEvent.addListener(div, 'click', prevFn);
-
- var detailsP = document.createElement('p');
- detailsP.className = "attachment-thumbnail-details";
-
- var nameSpan = document.createElement('span');
- nameSpan.className = "attachment-thumbnail-name";
- mxUtils.write(nameSpan, attName);
- detailsP.appendChild(nameSpan);
-
- var detailOpt = document.createElement('span');
- detailOpt.className = "u-block quiet attachment-thumbnail-details-title-options";
-
- var addedSpan = document.createElement('span');
- addedSpan.innerHTML = "&nbsp;"; //Add more details about the file here
- detailOpt.appendChild(addedSpan);
- // <span>
- // Added <span class="date" dt="2017-09-09T13:28:14.099Z" title="September 9, 2017 3:28 PM">an hour ago</span>
- // </span>
- // <span><a class="attachment-thumbnail-details-title-options-item dark-hover js-confirm-delete" href="#">
- // <span class="attachment-thumbnail-details-options-item-text">Delete</span></a>
- // </span>
- detailsP.appendChild(detailOpt);
-
- var actionsSpan = document.createElement('span');
- actionsSpan.className = "quiet attachment-thumbnail-details-options";
- detailsP.appendChild(actionsSpan);
-
- var downloadLink = document.createElement('a');
- downloadLink.className = "attachment-thumbnail-details-options-item dark-hover";
- downloadLink.setAttribute('href', atts.url);
- downloadLink.setAttribute('target', '_blank');
- downloadLink.setAttribute('download', attName);
- downloadLink.innerHTML = '<span class="icon-sm icon-download"></span> <span class="attachment-thumbnail-details-options-item-text">Download</span>';
- actionsSpan.appendChild(downloadLink);
-
- var editLink = document.createElement('a');
- editLink.className = "attachment-thumbnail-details-options-item dark-hover";
- editLink.setAttribute('href', 'javascript:void(0);');
- editLink.innerHTML = '<span class="icon-sm icon-edit"></span> <span class="attachment-thumbnail-details-options-item-text">Edit</span>';
- editLink.addEventListener("click", getEditFunction(atts, attName));
- actionsSpan.appendChild(editLink);
-
- detailsP.appendChild(actionsSpan);
- div.appendChild(detailsP);
-
- content.appendChild(div);
- })(drawioAtts[i]);
- }
- })
- .then(function()
- {
- return t.sizeTo('#content');
- });
-});
diff --git a/src/main/webapp/connect/trello/js/client.js b/src/main/webapp/connect/trello/js/client.js
deleted file mode 100644
index c299f03b..00000000
--- a/src/main/webapp/connect/trello/js/client.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/* global TrelloPowerUp */
-
-var Promise = TrelloPowerUp.Promise;
-
-TrelloPowerUp
- .initialize({
- 'card-buttons' : function(t, options)
- {
- return [ {
- icon : 'https://www.draw.io/images/drawlogo48-gray.png',
- text : 'draw.io',
- callback : function(t)
- {
- return t.popup({
- title : 'Create a New Diagram...',
- url : './new.html',
- height : 190
- });
- }
- } ];
- },
- 'attachment-sections' : function(t, options)
- {
- // Claim all png attachment that is created by draw.io
- var claimed = options.entries.filter(mxTrelloCommon.attFilterFn);
-
- if (claimed && claimed.length > 0)
- {
- return [ {
- claimed : claimed,
- icon : 'https://www.draw.io/images/drawlogo48-gray.png',
- title : 'draw.io Diagrams',
- content :
- {
- type : 'iframe',
- url : t.signUrl('./attSection.html', {
- arg: ""
- }),
- height : 230
- }
- } ];
- }
- else
- {
- return [];
- }
- },
- 'card-badges' : function(t, options)
- {
- return t.card('attachments')
- .get('attachments')
- .filter(mxTrelloCommon.attFilterFn)
- .then(function(claimed)
- {
- if (claimed && claimed.length > 0)
- {
- return [{
- text: claimed.length,
- icon: 'https://www.draw.io/images/drawlogo48-gray.png',
- color: 'white'
- }];
- }
- else
- {
- return [];
- }
- });
- }
- });
diff --git a/src/main/webapp/connect/trello/js/common.js b/src/main/webapp/connect/trello/js/common.js
deleted file mode 100644
index 81c9174b..00000000
--- a/src/main/webapp/connect/trello/js/common.js
+++ /dev/null
@@ -1,8 +0,0 @@
-mxTrelloCommon = {
- editorURL: location.protocol + '//' + location.hostname + '/',
- attFilterFn: function(attachment)
- {
- // Returns true for files ending with .drawio and an optional extension
- return /.*\.drawio(\.[A-Za-z]*)?$/.test(attachment.name);
- }
-};
diff --git a/src/main/webapp/connect/trello/js/editor.js b/src/main/webapp/connect/trello/js/editor.js
deleted file mode 100644
index 2a295666..00000000
--- a/src/main/webapp/connect/trello/js/editor.js
+++ /dev/null
@@ -1,29 +0,0 @@
-(function () {
- var t = window.TrelloPowerUp.iframe();
- var url = t.arg('url');
-
- var iframe = document.getElementById("editorFrame");
- iframe.setAttribute('src', url);
-
- // Only needed to invoke closeModal via embed button in toolbar
- // and to receive messages from iframe (cannot recv from t.modal)
- window.addEventListener('message', function(evt)
- {
- if (evt.data.length > 0)
- {
- try
- {
- var msg = JSON.parse(evt.data);
-
- if (msg != null && msg.event == 'exit')
- {
- t.closeModal();
- }
- }
- catch (e)
- {
- // ignore
- }
- }
- });
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/trello/js/new.js b/src/main/webapp/connect/trello/js/new.js
deleted file mode 100644
index 21590cff..00000000
--- a/src/main/webapp/connect/trello/js/new.js
+++ /dev/null
@@ -1,104 +0,0 @@
-(function()
-{
- var t = window.TrelloPowerUp.iframe();
- var diagName = document.getElementById("diagName");
- var errorMsg = document.getElementById("errorMsg");
-
- diagName.focus();
-
- function create(fileName, type, templateId)
- {
- t.closePopup();
-
- t.modal({
- url: './editor.html',
- fullscreen: true,
- title: 'draw.io: ' + fileName,
- args: {url: mxTrelloCommon.editorURL +
- ((location.hostname != 'www.draw.io') ?
- '?dev=1&drawdev=1&embed=1&tr=1&gapi=1&od=1&gh=1&db=1&p=tr' :
- '?embed=1&tr=1&gapi=1&od=1&gh=1&db=1&p=tr') +
- '&filename=' + encodeURIComponent(fileName + '.drawio' + (type == 'xml' ? '' : '.' + type)) +
- '&filetype=' + encodeURIComponent(type) +
- '&card=' + encodeURIComponent(t.getContext().card) +
- ((templateId != null) ? '&template=' + encodeURIComponent(templateId) : '')}
- });
- };
-
- //Fill the dialog with other attachments
- var select = document.getElementById("otherAtt");
- var importBtn = document.getElementById("importBtn");
-
- t.card('attachments')
- .get('attachments')
- .then(function(atts)
- {
- var count = 0;
- for (var i = 0; i < atts.length; i++)
- {
- if (!mxTrelloCommon.attFilterFn(atts[i]))
- {
- var opt = document.createElement("option");
- opt.setAttribute('value', atts[i].id);
- mxUtils.write(opt, atts[i].name);
- select.appendChild(opt);
- count++;
- }
- }
-
- if (count == 0)
- {
- document.getElementById("importLbl").style.display = "none";
- select.style.display = "none";
- importBtn.style.display = "none";
- }
-
- var newDiagFn = function()
- {
- var name = diagName.value;
- var type = document.getElementById("format").value;
-
- if (name == null || name.length == 0)
- {
- errorMsg.style.display = "";
- errorMsg.innerHTML = 'Diagram name cannot be empty';
- return;
- }
- else
- {
- for (var i = 0; i < atts.length; i++)
- {
- if (atts[i].name == name + '.drawio' + (type == 'xml' ? '' : '.' + type))
- {
- errorMsg.style.display = "";
- errorMsg.innerHTML = 'Diagram already exists';
- return;
- }
- }
- }
-
- create(name, type);
- };
-
- diagName.addEventListener("keypress", function(e)
- {
- if (e.keyCode == 13)
- newDiagFn();
- else
- errorMsg.style.display = "none";
- });
-
- document.getElementById("createBtn").addEventListener("click", newDiagFn);
- document.getElementById("createBtn").removeAttribute('disabled');
- })
- .then(function()
- {
- return t.sizeTo('#content');
- });
-
- importBtn.addEventListener("click", function()
- {
- create(select.options[select.selectedIndex].text, 'xml', select.value);
- });
-
-})(); \ No newline at end of file
diff --git a/src/main/webapp/connect/trello/manifest.json b/src/main/webapp/connect/trello/manifest.json
deleted file mode 100644
index 9bf9113d..00000000
--- a/src/main/webapp/connect/trello/manifest.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "draw.io",
- "details":"[draw.io](https://www.draw.io) is a free diagramming Power-up that enables you to draw a wide range of diagrams including flowcharts, BPMN, network diagrams, UML and ER diagrams, and much more. draw.io offers these advantages:\n\n* Fully open source platform.\n* All data stored inside Trello, nothing externally.\n* Import diagrams from other diagramming tools.\n\n### Screenshot\n\n![Screenshot of a draw.io diagram insertion in Trello card.](https://www.draw.io/connect/trello/images/drawio-trello-ss.png)",
- "icon": {
- "url": "https://www.draw.io/images/drawlogo128.png"
- },
- "author": "draw.io",
- "capabilities": [
- "callback",
- "card-buttons",
- "card-badges",
- "attachment-sections"
- ],
- "connectors": {
- "iframe": {
- "url": "./index.html"
- }
- }
-}
diff --git a/src/main/webapp/connect/trello/new.html b/src/main/webapp/connect/trello/new.html
deleted file mode 100644
index a0a1355a..00000000
--- a/src/main/webapp/connect/trello/new.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<html>
- <head>
- <link rel="stylesheet" href="https://trello.com/power-ups/power-up.css">
- <script src="https://trello.com/power-ups/power-up.min.js"></script>
- <script src="/js/viewer.min.js"></script>
- <script src="js/common.js"></script>
- </head>
- <body>
- <div id="content" style="width:100%;height:100%">
- <label for="diagName">Diagram Name</label>
- <input type="text" id="diagName" placeholder="New Diagram Name">
- <div id="errorMsg" style="display: none; color: red"></div>
- <label for="format">File Type</label>
- <select id="format">
- <option value="xml">XML</option>
- <option value="png">PNG</option>
- <option value="svg">SVG</option>
- <option value="html">HTML</option>
- </select>
- <button disabled="disabled" id="createBtn">
- Create
- </button>
- <br>
- <label id="importLbl" for="otherAtt">Or import an existing attachment</label>
- <select id="otherAtt"></select>
- <button id="importBtn">
- Import
- </button>
- </div>
- <script src="js/new.js"></script>
- </body>
-</html>
diff --git a/src/main/webapp/connect/vsdx/importer.js b/src/main/webapp/connect/vsdx/importer.js
deleted file mode 100644
index 34c83866..00000000
--- a/src/main/webapp/connect/vsdx/importer.js
+++ /dev/null
@@ -1,79 +0,0 @@
-function convertVSDXtoMX(file, filename, success, error)
-{
- function doImport(vsdxFile)
- {
- try
- {
- new com.mxgraph.io.mxVsdxCodec({
- addRemoteServiceSecurityCheck: function() {}
- }).decodeVsdx(vsdxFile, success, null, error);
- }
- catch (e)
- {
- error();
- }
- };
-
- var delayed = function()
- {
- if (typeof mxVsdxCodec === 'undefined')
- {
- if (/(\.v(sd|dx))($|\?)/i.test(filename))
- {
- if (VSD_CONVERT_URL != null)
- {
- var formData = new FormData();
- formData.append('file1', file, filename);
-
- var xhr = new XMLHttpRequest();
- xhr.open('POST', VSD_CONVERT_URL);
- xhr.responseType = 'blob';
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == 4)
- {
- if (xhr.status >= 200 && xhr.status <= 299)
- {
- doImport(xhr.response);
- }
- else
- {
- error();
- }
- }
- };
-
- xhr.send(formData);
- }
- else
- {
- error();
- }
- }
- else
- {
- doImport(file);
- }
- }
- else
- {
- error();
- }
- };
-
- //Load extensions.min.js lazily
- if (typeof mxVsdxCodec === 'undefined')
- {
- var script = document.createElement('script');
- script.onload = delayed;
- script.src = '/js/extensions.min.js';
- script.setAttribute('type', 'text/javascript');
- var head = document.getElementsByTagName('head')[0];
- head.appendChild(script);
- }
- else
- {
- delayed();
- }
-}; \ No newline at end of file
diff --git a/src/main/webapp/export2.html b/src/main/webapp/export2.html
deleted file mode 100644
index 0d4c3932..00000000
--- a/src/main/webapp/export2.html
+++ /dev/null
@@ -1,415 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <script>
- var isLocalStorage = false;
- var mxLoadStylesheets = false;
- </script>
- <!-- CSS for print output is needed for using current window -->
- <style type="text/css">
- @media print {
- table.mxPageSelector { display: none; }
- hr.mxPageBreak { display: none; }
- }
- @media screen {
- table.mxPageSelector { position: fixed; right: 10px; top: 10px;font-family: Arial; font-size:10pt; border: solid 1px darkgray;background: white; border-collapse:collapse; }
- table.mxPageSelector td { border: solid 1px gray; padding:4px; }
- body.mxPage { background: gray; }
- }
- </style>
- <link rel="stylesheet" href="mxgraph/css/common.css" charset="UTF-8" type="text/css">
- <script src="js/app.min.js"></script>
- <script>
- // NOTE: SVG Output fixes missing symbols in AsciiMath
- // but produces larger output with clipping problems
- Editor.initMath();
-
- // Workaround for varphi vs. phi export in MathJax on Phantom
- // see https://github.com/mathjax/MathJax/issues/353
- (function()
- {
- var authInit = MathJax.AuthorInit;
-
- MathJax.AuthorInit = function()
- {
- authInit();
-
- MathJax.Hub.Register.StartupHook('AsciiMath Jax Config', function()
- {
- var symbols = MathJax.InputJax.AsciiMath.AM.symbols;
-
- for (var i = 0, m = symbols.length; i < m; i++)
- {
- if (symbols[i].input === 'phi')
- {
- symbols[i].output = '\u03C6'
- }
- else if (symbols[i].input === 'varphi')
- {
- symbols[i].output = '\u03D5'; i = m
- }
- }
- });
- };
- })();
-
- function render(data)
- {
- var graph = new Graph(document.getElementById('graph'));
- data.border = parseInt(data.border) || 0;
- data.w = parseFloat(data.w) || 0;
- data.h = parseFloat(data.h) || 0;
- data.scale = parseFloat(data.scale) || 1;
-
- // Parses XML
- var xmlDoc = mxUtils.parseXml(data.xml);
- var diagrams = null;
- var from = 0;
-
- // Handles mxfile
- if (xmlDoc.documentElement.nodeName == 'mxfile')
- {
- diagrams = xmlDoc.documentElement.getElementsByTagName('diagram');
-
- if (diagrams.length > 0)
- {
- from = Math.max(0, Math.min(parseInt(data.from) || from, diagrams.length - 1));
- var diagramNode = diagrams[from];
-
- if (diagramNode != null)
- {
- xmlDoc = mxUtils.parseXml(Graph.decompress(mxUtils.getTextContent(diagramNode)));
- }
- }
- }
-
- /**
- * Implements %page% and %pagenumber% placeholders
- */
- var graphGetGlobalVariable = graph.getGlobalVariable;
-
- graph.getGlobalVariable = function(name)
- {
- if (name == 'page')
- {
- return (diagrams == null) ? 'Page-1' :
- (diagrams[from].getAttribute('name') || ('Page-' + (from + 1)));
- }
- else if (name == 'pagenumber')
- {
- return from + 1;
- }
-
- return graphGetGlobalVariable.apply(this, arguments);
- };
-
- // Enables math typesetting
- var math = xmlDoc.documentElement.getAttribute('math') == '1';
-
- if (math)
- {
- mxClient.NO_FO = true;
- }
-
- // Createa graph instance
- graph.foldingEnabled = false;
- graph.setEnabled(false);
-
- // Sets background image
- var bgImg = xmlDoc.documentElement.getAttribute('backgroundImage');
-
- if (bgImg != null)
- {
- bgImg = JSON.parse(bgImg);
- graph.setBackgroundImage(new mxImage(bgImg.src, bgImg.width, bgImg.height));
- }
-
- // Parses XML into graph
- var codec = new mxCodec(xmlDoc);
- codec.decode(xmlDoc.documentElement, graph.getModel());
-
- // Loads background color
- var bg = (data.bg != null && data.bg.length > 0) ? data.bg : xmlDoc.documentElement.getAttribute('background');
-
- // Normalizes values for transparent backgrounds
- if (bg == 'none' || bg == '')
- {
- bg = null;
- }
-
- // Checks if export format supports transparent backgrounds
- if (bg == null && data.format != 'gif' && data.format != 'png')
- {
- bg = '#ffffff';
- }
-
- // Sets background color on page
- if (bg != null)
- {
- document.body.style.backgroundColor = bg;
- }
-
- // Sets initial value for PDF page background
- graph.pdfPageVisible = false;
-
- // Handles PDF output where the output should match the page format if the page is visible
- if (data.format == 'pdf' && xmlDoc.documentElement.getAttribute('page') == '1' && data.w == 0 && data.h == 0)
- {
- var pw = xmlDoc.documentElement.getAttribute('pageWidth');
- var ph = xmlDoc.documentElement.getAttribute('pageHeight');
- graph.pdfPageVisible = true;
-
- if (pw != null && ph != null)
- {
- graph.pageFormat = new mxRectangle(0, 0, parseFloat(pw), parseFloat(ph));
- }
-
- var ps = xmlDoc.documentElement.getAttribute('pageScale');
-
- if (ps != null)
- {
- graph.pageScale = ps;
- }
-
- graph.getPageSize = function()
- {
- return new mxRectangle(0, 0, this.pageFormat.width * this.pageScale,
- this.pageFormat.height * this.pageScale);
- };
-
- graph.getPageLayout = function()
- {
- var size = this.getPageSize();
- var bounds = this.getGraphBounds();
-
- if (bounds.width == 0 || bounds.height == 0)
- {
- return new mxRectangle(0, 0, 1, 1);
- }
- else
- {
- // Computes untransformed graph bounds
- var x = Math.ceil(bounds.x / this.view.scale - this.view.translate.x);
- var y = Math.ceil(bounds.y / this.view.scale - this.view.translate.y);
- var w = Math.floor(bounds.width / this.view.scale);
- var h = Math.floor(bounds.height / this.view.scale);
-
- var x0 = Math.floor(x / size.width);
- var y0 = Math.floor(y / size.height);
- var w0 = Math.ceil((x + w) / size.width) - x0;
- var h0 = Math.ceil((y + h) / size.height) - y0;
-
- return new mxRectangle(x0, y0, w0, h0);
- }
- };
-
- // Fits the number of background pages to the graph
- graph.view.getBackgroundPageBounds = function()
- {
- var layout = this.graph.getPageLayout();
- var page = this.graph.getPageSize();
-
- return new mxRectangle(this.scale * (this.translate.x + layout.x * page.width),
- this.scale * (this.translate.y + layout.y * page.height),
- this.scale * layout.width * page.width,
- this.scale * layout.height * page.height);
- };
- }
-
- if (!graph.pdfPageVisible)
- {
- var b = graph.getGraphBounds();
-
- // Floor is needed to keep rendering crisp
- if (data.w > 0 && data.h > 0)
- {
- var s = Math.min(data.w / b.width, data.h / b.height);
- graph.view.scaleAndTranslate(s,
- Math.floor(data.border / s - b.x),
- Math.floor(data.border / s - b.y));
- }
- else
- {
- graph.view.scaleAndTranslate(data.scale, Math.floor(data.border - b.x),
- Math.floor(data.border - b.y));
- }
- }
- else
- {
- // Disables border for PDF page export
- data.border = 0;
-
- // Moves to first page in page layout
- var layout = graph.getPageLayout();
- var page = graph.getPageSize();
- var dx = layout.x * page.width;
- var dy = layout.y * page.height;
-
- if (dx != 0 || dy != 0)
- {
- graph.view.setTranslate(Math.floor(-dx), Math.floor(-dy));
- }
- }
-
- // Gets the diagram bounds and sets the document size
- var bounds = (graph.pdfPageVisible) ? graph.view.getBackgroundPageBounds() : graph.getGraphBounds();
- bounds.width = Math.ceil(bounds.width + data.border);
- bounds.height = Math.ceil(bounds.height + data.border);
-
- // Waits for all images to finish loading
- var cache = new Object();
- var waitCounter = 1;
-
- // Decrements waitCounter and invokes callback when finished
- function decrementWaitCounter()
- {
- if (--waitCounter < 1)
- {
- if (typeof window.callPhantom === 'function')
- {
- window.callPhantom(bounds);
- }
- else if (window.console != null)
- {
- console.log('loading complete');
- }
- }
- };
-
- function waitForImages(tagName, attributeName)
- {
- var imgs = document.body.getElementsByTagName(tagName);
- waitCounter += imgs.length;
-
- for (var i = 0; i < imgs.length; i++)
- {
- // No load events for image elements in Phantom using indirection instead
- var src = imgs[i].getAttribute(attributeName);
-
- if (typeof window.callPhantom !== 'function' && window.console != null)
- {
- console.log((cache[src] == null) ? 'loading' : 'cached', src);
- }
-
- if (src != null && src.length > 0 && cache[src] == null)
- {
- cache[src] = new Image();
- cache[src].onload = decrementWaitCounter;
- cache[src].onerror = decrementWaitCounter;
- cache[src].src = src;
- }
- else
- {
- decrementWaitCounter();
- }
- }
- };
-
- // Includes images in SVG and HTML labels
- waitForImages('image', 'xlink:href');
- waitForImages('img', 'src');
-
- // Waits for MathJax to finish rendering
- function renderMath(elt)
- {
- if (math && window.MathJax != null && window.MathJax.Hub != null)
- {
- waitCounter++;
- Editor.MathJaxRender(elt);
-
- // Asynchronous callback when MathJax has finished
- window.MathJax.Hub.Queue(function ()
- {
- decrementWaitCounter();
- });
- }
- }
-
- // Converts the graph to a vertical sequence of pages for PDF export
- if (graph.pdfPageVisible)
- {
- // Workaround to match available paper size
- var printScale = 0.72
- var pf = graph.pageFormat || mxConstants.PAGE_FORMAT_A4_PORTRAIT;
- var scale = 1 / graph.pageScale;
- var autoOrigin = false;
- var border = 0;
-
- // Negative coordinates are cropped or shifted if page visible
- var gb = graph.getGraphBounds();
- var x0 = 0;
- var y0 = 0;
-
- // Applies print scale
- pf = mxRectangle.fromRectangle(pf);
- pf.width = Math.ceil(pf.width * printScale);
- pf.height = Math.ceil(pf.height * printScale);
- scale *= printScale;
-
- // Starts at first visible page
- var layout = graph.getPageLayout();
- x0 -= layout.x * pf.width;
- y0 -= layout.y * pf.height;
-
- var preview = new mxPrintPreview(graph, scale, pf, border, x0, y0);
- preview.printBackgroundImage = true;
- preview.autoOrigin = autoOrigin;
- preview.backgroundColor = bg;
-
- // Renders print output into this document and removes the graph container
- preview.open(null, window);
- graph.container.parentNode.removeChild(graph.container);
-
- // Adds shadow
- // NOTE: Shadow rasterizes output
- /*if (mxClient.IS_SVG && xmlDoc.documentElement.getAttribute('shadow') == '1')
- {
- var svgs = document.getElementsByTagName('svg');
-
- for (var i = 0; i < svgs.length; i++)
- {
- var svg = svgs[i];
-
- var filter = graph.addSvgShadow(svg, null, true);
- filter.setAttribute('id', 'shadow-' + i);
- svg.appendChild(filter);
- svg.setAttribute('filter', 'url(#' + 'shadow-' + i + ')');
- }
-
- border = 7;
- }*/
-
- bounds = new mxRectangle(0, 0, pf.width, pf.height);
- renderMath(graph.container.parentNode);
- }
- else
- {
- // Adds shadow
- // NOTE: PDF shadow rasterizes output so it's disabled
- if (data.format != 'pdf' && mxClient.IS_SVG && xmlDoc.documentElement.getAttribute('shadow') == '1')
- {
- graph.addSvgShadow(graph.view.canvas.ownerSVGElement, null, true);
- graph.setShadowVisible(true);
- bounds.width += 7;
- bounds.height += 7;
- }
-
- renderMath(graph.container);
-
- if (data.format != 'pdf')
- {
- document.body.style.width = Math.ceil(bounds.x + bounds.width) + 'px';
- document.body.style.height = (Math.ceil(bounds.y + bounds.height) + 1) + 'px';
- }
- }
-
- // Immediate return if not waiting for any content
- decrementWaitCounter();
- };
- </script>
-</head>
-<body style="margin:0px;">
- <div id="graph" style="width:100%;height:100%;"></div>
-</body>
-</html>
diff --git a/src/main/webapp/js/diagramly/Devel.js b/src/main/webapp/js/diagramly/Devel.js
index b00a3929..88155906 100644
--- a/src/main/webapp/js/diagramly/Devel.js
+++ b/src/main/webapp/js/diagramly/Devel.js
@@ -21,7 +21,7 @@ if (!mxIsElectron && location.protocol !== 'http:')
//----------------------------------------------------------//
// Version 14.0.1
'\'sha256-ZMnCMK9Jg5ijd0Viqw4KAFn39HeC1LrVwervb9uC7Mo=\' ' +
- // Version 13.11.1
+ // Version 14.0.0
'\'sha256-KgVey3Yy0LCtaUZnD77KXAark2kZ3wS5HGa+tyAkR28=\' ' +
// Version 13.8.2
'\'sha256-1k6pyjDIKgd1KTCRcmDfV6Yc9vgQexHRTiO4zUBoKg8=\' ' +
@@ -70,7 +70,6 @@ if (!mxIsElectron && location.protocol !== 'http:')
if (urlParams['print-csp'] == '1')
{
console.log('Content-Security-Policy')
- console.log('Development:', devCsp)
console.log('app.diagrams.net:',
csp.replace(/%script-src%/g, 'https://www.dropbox.com https://api.trello.com').
replace(/%connect-src%/g, 'https://*.dropboxapi.com https://api.trello.com').
@@ -91,6 +90,7 @@ if (!mxIsElectron && location.protocol !== 'http:')
replace(/ /g, ' '));
console.log('import.diagrams.net:', 'default-src \'self\'; worker-src blob:; img-src \'self\' blob: data: https://www.lucidchart.com ' +
'https://app.lucidchart.com; style-src \'self\' \'unsafe-inline\'; frame-src https://www.lucidchart.com https://app.lucidchart.com;');
+ console.log('Development:', devCsp)
}
})();
}
diff --git a/src/main/webapp/js/diagramly/mxTableLayout.js b/src/main/webapp/js/diagramly/mxTableLayout.js
deleted file mode 100644
index f0dc8870..00000000
--- a/src/main/webapp/js/diagramly/mxTableLayout.js
+++ /dev/null
@@ -1,900 +0,0 @@
-/**
- * Copyright (c) 2006-2018, JGraph Ltd
- */
-/**
- * Class: mxTableLayout
- *
- * Extends <mxGraphLayout> to create a table of the
- * child vertices. The children do not need to be connected for this layout
- * to work.
- *
- * Example:
- *
- * (code)
- * var layout = new mxTableLayout(graph, 2, 2); //2x2 table layout
- * layout.execute(graph.getDefaultParent());
- * (end)
- *
- * Constructor: mxTableLayout
- *
- * Constructs a new table layout for the specified graph
- */
-function mxTableLayout(graph, rows, columns, border)
-{
- mxGraphLayout.call(this, graph);
- this.rows = (rows != null && rows > 0) ? rows : 2;
- this.columns = (columns != null && columns > 0) ? columns : 2;
- this.border = (border != null) ? border : 0;
-};
-
-/**
- * Extends mxStackLayout.
- */
-mxTableLayout.prototype = new mxStackLayout();
-mxTableLayout.prototype.constructor = mxTableLayout;
-
-/**
- * Variable: rows
- *
- * Specifies the number of rows of the layout. Default is 2.
- */
-mxTableLayout.prototype.rows = 2;
-
-/**
- * Variable: columns
- *
- * Specifies the number of columns of the layout. Default is 2.
- */
-mxTableLayout.prototype.columns = 2;
-
-/**
- * Variable: border
- *
- * Border between cells and around the table. Default is 0.
- */
-mxTableLayout.prototype.border = 0;
-
-/**
- * Variable: marginTop
- *
- * Top margin for the child area. Default is 0.
- */
-mxTableLayout.prototype.marginTop = 0;
-
-/**
- * Variable: marginLeft
- *
- * Top margin for the child area. Default is 0.
- */
-mxTableLayout.prototype.marginLeft = 0;
-
-/**
- * Variable: marginRight
- *
- * Top margin for the child area. Default is 0.
- */
-mxTableLayout.prototype.marginRight = 0;
-
-/**
- * Variable: marginBottom
- *
- * Top margin for the child area. Default is 0.
- */
-mxTableLayout.prototype.marginBottom = 0;
-
-/**
- * Variable: equalColumns
- *
- * Boolean indicating if columns are distributed equally. Default is true
- */
-mxTableLayout.prototype.equalColumns = true;
-
-/**
- * Variable: colWidths
- *
- * Required only if resizeParent is true and autoAddCol is true. It should be one value if equalColumns is true. Default is 100
- */
-mxTableLayout.prototype.colWidths = "100";
-
-/**
- * Variable: equalRows
- *
- * Boolean indicating if rows are distributed equally. Default is true
- */
-mxTableLayout.prototype.equalRows = true;
-
-/**
- * Variable: rowHeights
- *
- * Required only if resizeParent is true and autoAddRow is true. It should be one value if equalRows is true. Default is 50
- */
-mxTableLayout.prototype.rowHeights = "50";
-
-/**
- * Variable: colPercentages
- *
- * The percentages of each column from the parent width. This value is ignored if equalColumns is true. Default is null.
- */
-mxTableLayout.prototype.colPercentages = null;
-
-/**
- * Variable: rowPercentages
- *
- * The percentages of each row from the parent width. This value is ignored if equalRows is true. Default is null.
- */
-mxTableLayout.prototype.rowPercentages = null;
-
-/**
- * Variable: resizeParent
- *
- * If the parent should be resized when adding new rows/columns. Default is false.
- */
-mxTableLayout.prototype.resizeParent = false;
-
-/**
- * Variable: autoAddRow
- *
- * Weather a new row should be created. Default is true.
- */
-mxTableLayout.prototype.autoAddRow = true;
-
-/**
- * Variable: autoAddCol
- *
- * Weather a new column should be created. This value is ignored if autoAddRow is true. Default is false.
- */
-mxTableLayout.prototype.autoAddCol = false;
-
-/**
- * Variable: fill
- *
- * Boolean indicating if dimension should be changed to fill out the parent
- * cell. Default is true.
- */
-mxTableLayout.prototype.fill = true;
-
-/**
- * Function: moveCell
- *
- * Implements <mxGraphLayout.moveCell>.
- */
-mxTableLayout.prototype.moveCell = function(cell, x, y)
-{
- var model = this.graph.getModel();
- var parent = model.getParent(cell);
- var pstate = this.graph.getView().getState(parent);
-
- if (pstate != null)
- {
- x -= pstate.x;
- y -= pstate.y;
- }
-
- if (cell != null && parent != null)
- {
- var i = 0;
- var childCount = model.getChildCount(parent);
-
- for (i = 0; i < childCount; i++)
- {
- var child = model.getChildAt(parent, i);
-
- if (child != cell)
- {
- var bounds = model.getGeometry(child);
-
- if (bounds != null)
- {
- if (x >= bounds.x && x <= bounds.x + bounds.width
- && y >= bounds.y && y <= bounds.y + bounds.height)
- {
- break;
- }
- }
- }
- }
-
- model.add(parent, cell, i);
- }
-};
-
-/**
- * Function: calcDims
- *
- * Calculate cells positions and dimensions
- *
- */
-mxTableLayout.prototype.calcDims = function(parent)
-{
- if (parent != null)
- {
- var pgeo = this.getParentSize(parent);
- var model = this.graph.getModel();
- var fillWidth = null, fillHeight = null;
- var x = this.marginLeft + this.border;
- var y = this.marginTop + this.border;
-
- if (pgeo == null)
- {
- return null; //We cannot do anything without knowing the parent geometry
- }
-
- fillHeight = pgeo.height - this.marginTop - this.marginBottom - 2 * this.border;
- fillWidth = pgeo.width - this.marginLeft - this.marginRight - 2 * this.border;
-
- // Handles swimlane start size
- if (this.graph.isSwimlane(parent))
- {
- // Uses computed style to get latest
- var style = this.graph.getCellStyle(parent);
- var start = mxUtils.getNumber(style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE);
- var horz = mxUtils.getValue(style, mxConstants.STYLE_HORIZONTAL, true) == 1;
-
- if (pgeo != null)
- {
- if (horz)
- {
- start = Math.min(start, pgeo.height);
- }
- else
- {
- start = Math.min(start, pgeo.width);
- }
- }
-
- if (horz)
- {
- fillHeight -= start;
- y += start;
- }
- else
- {
- fillWidth -= start;
- x += start;
- }
- }
-
- var childCount = model.getChildCount(parent);
- var rows = this.rows;
- var cols = this.columns;
- var cellCount = rows * cols;
-
- //if auto-add without parent-resize, then each cell size in the table depends on how many columns/rows
- if (!this.resizeParent && (this.autoAddCol || this.autoAddRow) && childCount > cellCount)
- {
- var actualChildCount = 0;
- //get actual child count (movable and not ignored)
- for (var i = 0; i < childCount; i++)
- {
- var child = model.getChildAt(parent, i);
-
- if (!this.isVertexIgnored(child) && this.isVertexMovable(child))
- {
- actualChildCount++;
- }
- }
-
- if (actualChildCount > cellCount)
- {
- if (this.autoAddRow)
- {
- rows = Math.ceil(actualChildCount / cols);
- }
- else
- {
- cols = Math.ceil(actualChildCount / rows);
- }
- }
- }
-
- var cellWidth = [], cellHeight = [];
- fillWidth -= this.border * (cols - 1);
- fillHeight -= this.border * (rows - 1);
-
- //Calc each cell width/height in the table
- if (this.resizeParent && this.autoAddCol && !this.autoAddRow)
- {
- cellWidth = this.colWidths && this.colWidths.split? this.colWidths.split(',') : [(this.colWidths || 100)];
-
- var w = parseFloat(cellWidth[0]) || 100;
-
- for (var i = 0; i < cols; i++)
- {
- cellWidth[i] = this.equalColumns? w : (parseFloat(cellWidth[i]) || w);
- }
- }
- else
- {
- if (this.equalColumns || this.colPercentages == null)
- {
- var w = fillWidth / cols;
-
- for (var i = 0; i < cols; i++)
- {
- cellWidth.push(w);
- }
- }
- else
- {
- //TODO handle incorrect configurations
- var ratios = this.colPercentages.split(',');
-
- for (var i = 0; i < cols; i++)
- {
- cellWidth.push((fillWidth * parseInt(ratios[i]) / 100) || 100);
- }
- }
- }
-
- if (this.resizeParent && (this.autoAddRow || !this.autoAddCol))
- {
- cellHeight = this.rowHeights && this.rowHeights.split? this.rowHeights.split(',') : [(this.rowHeights || 50)];
-
- var h = parseFloat(cellHeight[0]) || 50;
-
- for (var i = 0; i < rows; i++)
- {
- cellHeight[i] = this.equalRows? h : (parseFloat(cellHeight[i]) || h);
- }
- }
- else
- {
- if (this.equalRows || this.rowPercentages == null)
- {
- var h = fillHeight / rows;
-
- for (var i = 0; i < rows; i++)
- {
- cellHeight.push(h);
- }
- }
- else
- {
- //TODO handle incorrect configurations
- var ratios = this.rowPercentages.split(',');
-
- for (var i = 0; i < rows; i++)
- {
- cellHeight.push((fillHeight * parseInt(ratios[i]) / 100) || 50);
- }
- }
- }
-
- return {cellHeight: cellHeight, cellWidth: cellWidth,
- cols: cols, rows: rows, x: x, y: y,
- fillHeight: fillHeight, fillWidth: fillWidth};
- }
-
- return null;
-};
-
-/**
- * Function: execute
- *
- * Implements <mxGraphLayout.execute>.
- *
- * Only children where <isVertexIgnored> returns false are taken into
- * account.
- */
-mxTableLayout.prototype.execute = function(parent)
-{
- var dims = this.calcDims(parent);
-
- if (parent != null && dims != null)
- {
- var pgeo = this.getParentSize(parent);
- var model = this.graph.getModel();
- var childCount = model.getChildCount(parent);
- var x = dims.x, y = dims.y;
-
- model.beginUpdate();
- try
- {
- var rowIndex = 0, colIndex = 0;
- var tableWidth = 0, tableHeight = 0;
- //save the initial value of x
- var x0 = x, y0 = y;
-
- //children are filled row by row
- for (var i = 0; i < childCount; i++)
- {
- var child = model.getChildAt(parent, i);
-
- if (!this.isVertexIgnored(child) && this.isVertexMovable(child))
- {
- var geo = model.getGeometry(child);
-
- if (geo != null)
- {
- geo = geo.clone();
-
- geo.x = x;
- geo.y = y;
-
- if (this.fill)
- {
- geo.height = dims.cellHeight[rowIndex];
- geo.width = dims.cellWidth[colIndex];
- }
-
- this.setChildGeometry(child, geo);
-
- if (this.autoAddRow || !this.autoAddCol)
- {
- if (colIndex + 1 == dims.cols)
- {
- tableWidth = x + dims.cellWidth[colIndex];
- x = x0;
- y += dims.cellHeight[rowIndex] + this.border;
- colIndex = 0;
- rowIndex = (rowIndex + 1) % dims.rows;
- }
- else
- {
- x += dims.cellWidth[colIndex] + this.border;
- colIndex++;
- }
- }
- else
- {
- if (rowIndex + 1 == dims.rows)
- {
- tableHeight = y + dims.cellHeight[rowIndex];
- y = y0;
- x += dims.cellWidth[colIndex] + this.border;
- rowIndex = 0;
- colIndex = (colIndex + 1) % dims.cols;
- }
- else
- {
- y += dims.cellHeight[rowIndex] + this.border;
- rowIndex++;
- }
- }
- }
- }
- }
-
- if (this.resizeParent && !this.graph.isCellCollapsed(parent))
- {
- var pgeo2 = pgeo.clone();
-
- pgeo2.width = (tableWidth? tableWidth + this.border : (rowIndex > 0? x + dims.cellWidth[colIndex] + this.border : x)) + this.marginRight;
- pgeo2.height = (tableHeight? tableHeight + this.border: (colIndex > 0? y + dims.cellHeight[rowIndex] + this.border : y)) + this.marginBottom;
-
- if (pgeo.x != pgeo2.x || pgeo.y != pgeo2.y ||
- pgeo.width != pgeo2.width || pgeo.height != pgeo2.height)
- {
- model.setGeometry(parent, pgeo2);
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
- }
-};
-
-function mxTableLayoutHandle(index, isCol, state, layoutDims)
-{
- this.index = index;
- this.isCol = isCol;
- this.bounds = new mxRectangle(0, 0, isCol? 2 : state.width, isCol? state.height : 2);
- this.dims = layoutDims;
- var cursor = isCol? 'col-resize' : 'row-resize';
-
- mxHandle.call(this, state, cursor);
-};
-
-mxUtils.extend(mxTableLayoutHandle, mxHandle);
-
-mxTableLayoutHandle.prototype.color = '#00FF00';
-mxTableLayoutHandle.prototype.MIN_COL_W = 10;
-mxTableLayoutHandle.prototype.MIN_ROW_H = 10;
-
-mxTableLayoutHandle.prototype.createShape = function(html)
-{
- return new mxRectangleShape(this.bounds, this.color, this.color);
-};
-
-/**
- * Function: redraw
- *
- * Renders the shape for this handle.
- */
-mxTableLayoutHandle.prototype.redraw = function()
-{
- if (this.shape != null && this.state.shape != null)
- {
- var pt = this.getPosition(this.state.getPaintBounds());
-
- if (pt != null)
- {
- var alpha = mxUtils.toRadians(this.getTotalRotation());
- pt = this.rotatePoint(this.flipPoint(pt), alpha);
-
- var scale = this.graph.view.scale;
- var tr = this.graph.view.translate;
- this.shape.bounds.x = Math.floor((pt.x + tr.x) * scale - this.shape.bounds.width / 2);
- this.shape.bounds.y = Math.floor((pt.y + tr.y) * scale - this.shape.bounds.height / 2);
- this.shape.bounds.width = this.isCol? 2 : this.state.width;
- this.shape.bounds.height = this.isCol? this.state.height : 2;
- this.shape.rotation = this.getTotalRotation();
-
- // Needed to force update of text bounds
- this.shape.redraw();
- }
- }
-};
-
-mxTableLayoutHandle.prototype.getPosition = function(bounds)
-{
- var sizes = this.isCol? this.dims.cellWidth : this.dims.cellHeight;
- var pos = this.isCol? this.dims.x : this.dims.y;
-
- for (var i = 0; i <= this.index; i++)
- {
- pos += sizes[i];
- }
-
- this.x = this.isCol? bounds.x + pos : bounds.getCenterX();
- this.y = this.isCol? bounds.getCenterY() : bounds.y + pos;
-
- return new mxPoint(this.x, this.y);
-};
-
-mxTableLayoutHandle.prototype.setPosition = function(bounds, pt)
-{
- this.state.style['resizeParent'] = '0';
- var anotherRedraw = [];
-
- if (this.isCol)
- {
- if (this.origCellWidth == null)
- {
- this.origCellWidth = this.dims.cellWidth.slice();
- }
-
- this.state.style['equalColumns'] = '0';
- var oldColW = this.dims.cellWidth[this.index];
- var newColW = oldColW + pt.x - this.x;
-
- if (newColW < this.MIN_COL_W)
- {
- this.dims.cellWidth[this.index] = this.MIN_COL_W;
- var addedW = oldColW - this.MIN_COL_W;
- newColW = Math.abs(newColW - this.MIN_COL_W);
- var i = this.index - 1;
-
- while (i >= 0 && newColW > 0)
- {
- if (newColW < this.dims.cellWidth[i] - this.MIN_COL_W)
- {
- this.dims.cellWidth[i] -= newColW;
- addedW += newColW;
- newColW = 0;
- }
- else
- {
- var diff = this.dims.cellWidth[i] - this.MIN_COL_W;
- newColW -= diff;
- addedW += diff;
- this.dims.cellWidth[i] = this.MIN_COL_W;
- }
-
- anotherRedraw.push(i);
- i--;
- }
-
- this.dims.cellWidth[this.index + 1] += addedW;
- }
- else if (this.dims.cellWidth[this.index + 1] < (newColW - oldColW + this.MIN_COL_W))
- {
- var addedW = this.dims.cellWidth[this.index + 1] - this.MIN_COL_W;
- this.dims.cellWidth[this.index + 1] = this.MIN_COL_W;
- var neededW = newColW - oldColW;
- var i = this.index + 2;
-
- while (i < this.dims.cols && neededW > 0)
- {
- if (neededW < this.dims.cellWidth[i] - this.MIN_COL_W)
- {
- this.dims.cellWidth[i] -= neededW;
- addedW += neededW;
- neededW = 0;
- }
- else
- {
- var diff = this.dims.cellWidth[i] - this.MIN_COL_W;
- neededW -= diff;
- addedW += diff;
- this.dims.cellWidth[i] = this.MIN_COL_W;
- }
-
- anotherRedraw.push(i - 1);
- i++;
- }
-
- this.dims.cellWidth[this.index] += addedW;
- }
- else
- {
- if (newColW > oldColW)
- {
- var diff = newColW - oldColW;
- var addAll = false;
- var i;
-
- //check other cols if we already resized them
- for (i = 0; i < this.index && diff > 0; i++)
- {
- var cDiff = this.origCellWidth[i] - this.dims.cellWidth[i];
-
- if (cDiff != 0)
- {
- cDiff = Math.min(diff, cDiff);
- diff -= cDiff;
- this.dims.cellWidth[i] += cDiff;
- anotherRedraw.push(i);
- addAll = true;
- }
- }
-
- for (; i < this.index && addAll; i++)
- {
- anotherRedraw.push(i);
- }
-
- this.dims.cellWidth[this.index] += diff;
- this.dims.cellWidth[this.index + 1] -= (newColW - oldColW);
- }
- else
- {
- var diff = oldColW - newColW;
- var addAll = false;
- var i;
-
- //check other cols if we already resized them
- for (i = this.dims.cols - 2; i >= this.index && diff > 0; i--)
- {
- var cDiff = this.origCellWidth[i + 1] - this.dims.cellWidth[i + 1];
-
- if (cDiff != 0)
- {
- cDiff = Math.min(diff, cDiff);
- diff -= cDiff;
- this.dims.cellWidth[i + 1] += cDiff;
- anotherRedraw.push(i); // FIXME this.index can be redrawn twice
- addAll = true;
- }
- }
-
- for (; i > this.index && addAll; i--)
- {
- anotherRedraw.push(i);
- }
-
- this.dims.cellWidth[this.index] = newColW;
- this.dims.cellWidth[this.index + 1] += diff;
- }
- }
- console.log(this.dims.cellWidth)
- var perc = [];
-
- for (var i = 0; i < this.dims.cols; i++)
- {
- perc.push((this.dims.cellWidth[i] / this.dims.fillWidth) * 100);
- }
-
- this.state.style['colPercentages'] = perc.join(',');
- }
- else
- {
- if (this.origCellHeight == null)
- {
- this.origCellHeight = this.dims.cellHeight.slice();
- }
-
- this.state.style['equalRows'] = '0';
- var oldRowH = this.dims.cellHeight[this.index];
- var newRowH = oldRowH + pt.y - this.y;
-
- if (newRowH < this.MIN_ROW_H)
- {
- this.dims.cellHeight[this.index] = this.MIN_ROW_H;
- var addedH = oldRowH - this.MIN_ROW_H;
- newRowH = Math.abs(newRowH - this.MIN_ROW_H);
- var i = this.index - 1;
-
- while (i >= 0 && newRowH > 0)
- {
- if (newRowH < this.dims.cellHeight[i] - this.MIN_ROW_H)
- {
- this.dims.cellHeight[i] -= newRowH;
- addedH += newRowH;
- newRowH = 0;
- }
- else
- {
- var diff = this.dims.cellHeight[i] - this.MIN_ROW_H;
- newRowH -= diff;
- addedH += diff;
- this.dims.cellHeight[i] = this.MIN_ROW_H;
- }
-
- anotherRedraw.push(i);
- i--;
- }
-
- this.dims.cellHeight[this.index + 1] += addedH;
- }
- else if (this.dims.cellHeight[this.index + 1] < (newRowH - oldRowH + this.MIN_ROW_H))
- {
- var addedH = this.dims.cellHeight[this.index + 1] - this.MIN_ROW_H;
- this.dims.cellHeight[this.index + 1] = this.MIN_ROW_H;
- var neededH = newRowH - oldRowH;
- var i = this.index + 2;
-
- while (i < this.dims.rows && neededH > 0)
- {
- if (neededH < this.dims.cellHeight[i] - this.MIN_ROW_H)
- {
- this.dims.cellHeight[i] -= neededH;
- addedH += neededH;
- neededH = 0;
- }
- else
- {
- var diff = this.dims.cellHeight[i] - this.MIN_ROW_H;
- neededH -= diff;
- addedH += diff;
- this.dims.cellHeight[i] = this.MIN_ROW_H;
- }
-
- anotherRedraw.push(i - 1);
- i++;
- }
-
- this.dims.cellHeight[this.index] += addedH;
- }
- else
- {
- if (newRowH > oldRowH)
- {
- var diff = newRowH - oldRowH;
- var addAll = false;
- var i;
-
- //check other cols if we already resized them
- for (i = 0; i < this.index && diff > 0; i++)
- {
- var cDiff = this.origCellHeight[i] - this.dims.cellHeight[i];
-
- if (cDiff != 0)
- {
- cDiff = Math.min(diff, cDiff);
- diff -= cDiff;
- this.dims.cellHeight[i] += cDiff;
- anotherRedraw.push(i);
- addAll = true;
- }
- }
-
- for (; i < this.index && addAll; i++)
- {
- anotherRedraw.push(i);
- }
-
- this.dims.cellHeight[this.index] += diff;
- this.dims.cellHeight[this.index + 1] -= (newRowH - oldRowH);
- }
- else
- {
- var diff = oldRowH - newRowH;
- var addAll = false;
- var i;
-
- //check other cols if we already resized them
- for (i = this.dims.rows - 2; i >= this.index && diff > 0; i--)
- {
- var cDiff = this.origCellHeight[i + 1] - this.dims.cellHeight[i + 1];
-
- if (cDiff != 0)
- {
- cDiff = Math.min(diff, cDiff);
- diff -= cDiff;
- this.dims.cellHeight[i + 1] += cDiff;
- anotherRedraw.push(i); // FIXME this.index can be redrawn twice
- addAll = true;
- }
- }
-
- for (; i > this.index && addAll; i--)
- {
- anotherRedraw.push(i);
- }
-
- this.dims.cellHeight[this.index] = newRowH;
- this.dims.cellHeight[this.index + 1] += diff;
- }
- }
-
- var perc = [];
-
- for (var i = 0; i < this.dims.rows; i++)
- {
- perc.push((this.dims.cellHeight[i] / this.dims.fillHeight) * 100);
- }
-
- this.state.style['rowPercentages'] = perc.join(',');
- }
-
- var handlers = this.isCol? this.dims.colHandlers : this.dims.rowHandlers;
-
- for (var i = 0; i < anotherRedraw.length; i++)
- {
- handlers[anotherRedraw[i]].redraw();
- }
-};
-
-mxTableLayoutHandle.prototype.execute = function()
-{
- this.copyStyle('resizeParent');
-
- if (this.isCol)
- {
- this.origCellWidth = null;
- this.copyStyle('equalColumns');
- this.copyStyle('colPercentages');
- }
- else
- {
- this.origCellHeight = null;
- this.copyStyle('equalRows');
- this.copyStyle('rowPercentages');
- }
-}
-
-mxTableLayoutHandle.prototype.ignoreGrid = true;
-
-//Based on its index, create two handlers per col/row which resize it and set the layout parameters
-
-mxTableLayout.prototype.origCreateCustomHandles = mxVertexHandler.prototype.createCustomHandles;
-
-mxVertexHandler.prototype.createCustomHandles = function()
-{
- var rowHandlers = [], colHandlers = [];
- var origHandlers = mxTableLayout.prototype.origCreateCustomHandles.apply(this, arguments);
-
- var cell = this.state.cell;
- var layout = this.graph.layoutManager.getLayout(cell);
-
- if (layout instanceof mxTableLayout)
- {
- if (origHandlers == null)
- {
- origHandlers = [];
- }
-
- var dims = layout.calcDims(this.state.cell);
- dims.rowHandlers = rowHandlers;
- dims.colHandlers = colHandlers;
-
- for (var i = 0; i < dims.rows - 1; i++)
- {
- var rowH = new mxTableLayoutHandle(i, false, this.state, dims);
- origHandlers.push(rowH);
- rowHandlers.push(rowH);
- }
-
- for (var i = 0; i < dims.cols - 1; i++)
- {
- var colH = new mxTableLayoutHandle(i, true, this.state, dims);
- origHandlers.push(colH);
- colHandlers.push(colH);
- }
- }
-
- return origHandlers;
-}; \ No newline at end of file
diff --git a/src/main/webapp/js/diagramly/ruler/mxRuler.js b/src/main/webapp/js/diagramly/ruler/mxRuler.js
deleted file mode 100644
index 26959bdd..00000000
--- a/src/main/webapp/js/diagramly/ruler/mxRuler.js
+++ /dev/null
@@ -1,359 +0,0 @@
-/**
- * Copyright (c) 2017, CTI LOGIC
- * Copyright (c) 2006-2017, JGraph Ltd
- * Copyright (c) 2006-2017, Gaudenz Alder
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-var mxRuler = function(graph, container, isVertical)
-{
- var ruler = this;
- var canvas = document.createElement("canvas");
- //initial sizing which is corrected by the graph size event
- canvas.width = container.offsetWidth;
- canvas.height = container.offsetHeight;
- container.style.overflow = 'hidden';
- canvas.style.position = "relative";
- container.appendChild(canvas);
- //Disable alpha to improve performance as we don't need it
- var ctx = canvas.getContext("2d"/*, {alpha: false}*/);
- this.graph = graph;
- this.container = container;
- this.canvas = canvas;
-
- var drawLine = function (x1, y1, x2, y2, text)
- {
- //remove all fractions
- x1 = Math.round(x1); y1 = Math.round(y1); x2 = Math.round(x2); y2 = Math.round(y2);
- //adding the 0.5 is necessary to prevent anti-aliasing from making lines thicker!
- ctx.moveTo(x1 + 0.5, y1 + 0.5);
- ctx.lineTo(x2 + 0.5, y2 + 0.5);
- ctx.stroke();
-
- if (text)
- {
- if (isVertical)
- {
- var x = x1;
- var y = y1 - 3;
- var metric = ctx.measureText(text);
-
- ctx.save();
-
- // We want to find the center of the text (or whatever point you want) and rotate about it
- var tx = x + (metric.width / 2) + 8;
- var ty = y + 5;
-
- // Translate to near the center to rotate about the center
- ctx.translate(tx, ty);
- // Then rotate...
- ctx.rotate(-Math.PI / 2);
- // Then translate back to draw in the right place!
- ctx.translate(-tx, -ty);
- ctx.fillText(text, x, y);
- ctx.restore();
- }
- else
- {
- ctx.fillText(text, isVertical? x1 : x1 + 3, isVertical? y1 - 3 : y1 + 9);
- }
- }
- };
-
- var drawRuler = function(forceErase)
- {
- //The area is automatically cleared when the canvas size is changed
- if (forceErase) ctx.clearRect(0, 0, canvas.width, canvas.height);
-
- ctx.beginPath();
- ctx.lineWidth = 0.1;
- ctx.strokeStyle = "#BBBBBB";
- ctx.font = "9px Arial";
- ctx.fillStyle = '#BBBBBB';
-
- var scale = graph.view.scale;
- var bgPages = graph.view.getBackgroundPageBounds();
- var t = graph.view.translate;
- var bounds = graph.view.getGraphBounds();
-
- var rStart = (isVertical? bgPages.y : bgPages.x);
-
- //handle negative pages
- if (isVertical)
- {
- var y = ((bounds.y) / scale - t.y);
-
- if (y <= -1)
- {
- rStart += Math.ceil(Math.abs(y) / graph.pageFormat.height) * graph.pageFormat.height * scale;
- }
- }
- else
- {
- var x = ((bounds.x) / scale - t.x);
-
- if (x <= -1)
- {
- rStart += Math.ceil(Math.abs(x) / graph.pageFormat.width) * graph.pageFormat.width * scale;
- }
- }
-
- rStart += isVertical? (graph.container.offsetTop - ruler.container.offsetTop) : (graph.container.offsetLeft - ruler.container.offsetLeft);
-
- var tickStep, tickSize, len;
-
- switch(ruler.unit)
- {
- case ruler.PIXELS:
- len = 10;
- tickStep = 10;
- tickSize = [25,5,5,5,5,10,5,5,5,5];
- break;
- case ruler.CENTIMETER:
- len = 10;
- tickStep = ruler.pPerCM/len;
- tickSize = [25,5,5,5,5,10,5,5,5,5];
- break;
- case ruler.INCHES:
- if (scale <=0.5 || scale >=4)
- len = 8;
- else
- len = 16;
-
- tickStep = ruler.pPerInch/len;
- tickSize = [25,5,8,5,12,5,8,5,15,5,8,5,12,5,8,5];
- break;
- }
-
- var step = tickStep;
-
- if (ruler.unit != ruler.INCHES || (scale > 2 || scale < 0.25))
- step = scale>= 1 ? (tickStep / Math.floor(scale)) : Math.floor(10 / scale / 10) * 10;
-
- for (var i = rStart % (step * scale); i <= (isVertical? canvas.height : canvas.width); i += step * scale)
- {
- var current = Math.round((i - rStart) / scale / step);
- var text = null;
-
- if (current % len == 0)
- {
- text = ruler.formatText(Math.round(current * step)) + "";
- }
-
- if (isVertical)
- {
- drawLine(30 - tickSize[Math.abs(current) % len], i, 30, i, text);
- }
- else
- {
- drawLine(i, 30 - tickSize[Math.abs(current) % len], i, 30, text);
- }
- }
- };
-
- var sizeListener = function()
- {
- var div = graph.container;
- var newW = isVertical? container.offsetWidth : div.scrollWidth;
- var newH = isVertical? div.scrollHeight : container.offsetHeight;
-
- if (newW != canvas.width || newH != canvas.height)
- {
- canvas.width = newW;
- canvas.height = newH;
- drawRuler();
- }
- };
-
- this.drawRuler = drawRuler;
-
- var efficientSizeListener = debounce(sizeListener, 10);
- this.sizeListener = efficientSizeListener;
-
- //Size event is called upon scaling so we may not need it
- //graph.view.addListener(mxEvent.SCALE, efficientSizeListener);
- graph.addListener(mxEvent.SIZE, efficientSizeListener);
- graph.container.addEventListener("scroll", function() {
- if (isVertical)
- {
- canvas.style.top = -graph.container.scrollTop + "px";
- }
- else
- {
- canvas.style.left = -graph.container.scrollLeft + "px";
- }
- });
-
- function debounce(func, wait, immediate)
- {
- var timeout;
- return function() {
- var context = this, args = arguments;
- var later = function() {
- timeout = null;
- if (!immediate) func.apply(context, args);
- };
- var callNow = immediate && !timeout;
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- if (callNow) func.apply(context, args);
- };
- };
-
- function createHint()
- {
- var hint = document.createElement('div');
- hint.className = 'geHint';
- hint.style.whiteSpace = 'nowrap';
- hint.style.position = 'absolute';
-
- return hint;
- };
-
- graph.graphHandler.updateHint = function(me)
- {
- if (this.shape != null)
- {
- if (this.hint == null)
- {
- this.hint = createHint();
- this.graph.container.appendChild(this.hint);
- }
-
- var t = this.graph.view.translate;
- var s = this.graph.view.scale;
- var x = this.roundLength((this.bounds.x + this.currentDx) / s - t.x);
- var y = this.roundLength((this.bounds.y + this.currentDy) / s - t.y);
-
- this.hint.innerHTML = ruler.formatText(x) + ', ' + ruler.formatText(y); //Math.round(current * step)
-
- this.hint.style.left = (this.shape.bounds.x + Math.round((this.shape.bounds.width - this.hint.clientWidth) / 2)) + 'px';
- this.hint.style.top = (this.shape.bounds.y + this.shape.bounds.height + 12) + 'px';
- }
- };
-
- mxVertexHandler.prototype.updateHint = function(me)
- {
- if (this.index != mxEvent.LABEL_HANDLE)
- {
- if (this.hint == null)
- {
- this.hint = createHint();
- this.state.view.graph.container.appendChild(this.hint);
- }
-
- if (this.index == mxEvent.ROTATION_HANDLE)
- {
- this.hint.innerHTML = this.currentAlpha + '&deg;';
- }
- else
- {
- var s = this.state.view.scale;
- this.hint.innerHTML = ruler.formatText(this.roundLength(this.bounds.width / s)) + ' x ' + ruler.formatText(this.roundLength(this.bounds.height / s));
- }
-
- var rot = (this.currentAlpha != null) ? this.currentAlpha : this.state.style[mxConstants.STYLE_ROTATION] || '0';
- var bb = mxUtils.getBoundingBox(this.bounds, rot);
-
- if (bb == null)
- {
- bb = this.bounds;
- }
-
- this.hint.style.left = bb.x + Math.round((bb.width - this.hint.clientWidth) / 2) + 'px';
- this.hint.style.top = (bb.y + bb.height + 12) + 'px';
- }
- };
-
- mxEdgeHandler.prototype.updateHint = function(me, point)
- {
- if (this.hint == null)
- {
- this.hint = createHint();
- this.state.view.graph.container.appendChild(this.hint);
- }
-
- var t = this.graph.view.translate;
- var s = this.graph.view.scale;
- var x = this.roundLength(point.x / s - t.x);
- var y = this.roundLength(point.y / s - t.y);
-
- this.hint.innerHTML = ruler.formatText(x) + ', ' + ruler.formatText(y);
- this.hint.style.visibility = 'visible';
-
- if (this.isSource || this.isTarget)
- {
- if (this.constraintHandler.currentConstraint != null &&
- this.constraintHandler.currentFocus != null)
- {
- var pt = this.constraintHandler.currentConstraint.point;
- this.hint.innerHTML = '[' + Math.round(pt.x * 100) + '%, '+ Math.round(pt.y * 100) + '%]';
- }
- else if (this.marker.hasValidState())
- {
- this.hint.style.visibility = 'hidden';
- }
- }
-
- this.hint.style.left = Math.round(me.getGraphX() - this.hint.clientWidth / 2) + 'px';
- this.hint.style.top = (Math.max(me.getGraphY(), point.y) + this.state.view.graph.gridSize) + 'px';
-
- if (this.hideEdgeHintThread != null)
- {
- window.clearTimeout(this.hideEdgeHintThread);
- }
-
- this.hideEdgeHintThread = window.setTimeout(mxUtils.bind(this, function()
- {
- if (this.hint != null)
- {
- this.hint.style.visibility = 'hidden';
- }
- }), 500);
- };
-};
-
-mxRuler.prototype.PIXELS = 1;
-mxRuler.prototype.CENTIMETER = 2;
-mxRuler.prototype.INCHES = 3;
-
-mxRuler.prototype.pPerCM = 39.37;
-mxRuler.prototype.pPerInch = 100;
-
-mxRuler.prototype.unit = mxRuler.prototype.PIXELS;
-
-mxRuler.prototype.setUnit = function(unit) {
- this.unit = unit;
-};
-
-mxRuler.prototype.formatText = function(pixels) {
- switch(this.unit) {
- case this.PIXELS:
- return pixels;
- case this.CENTIMETER:
- return (pixels / this.pPerCM).toFixed(2);
- case this.INCHES:
- return (pixels / this.pPerInch).toFixed(2);
- }
-};
-
-//TODO fix this (put correct listeners)
-mxRuler.prototype.destroy = function() {
- this.graph.view.removeListener(this.drawRuler);
- this.graph.removeListener(this.sizeListener);
- this.graph.container.removeEventListener("scroll", this.drawRuler);
- this.graph.view.removeListener(mxEvent.SCALE, this.drawRuler);
- if (this.container != null && this.canvas != null) this.container.removeChild(this.canvas);
-}; \ No newline at end of file
diff --git a/src/main/webapp/js/mxgraph/Actions.js b/src/main/webapp/js/mxgraph/Actions.js
deleted file mode 100644
index 9edfdb3f..00000000
--- a/src/main/webapp/js/mxgraph/Actions.js
+++ /dev/null
@@ -1,1597 +0,0 @@
-/**
- * Copyright (c) 2006-2020, JGraph Ltd
- * Copyright (c) 2006-2020, draw.io AG
- *
- * Constructs the actions object for the given UI.
- */
-function Actions(editorUi)
-{
- this.editorUi = editorUi;
- this.actions = new Object();
- this.init();
-};
-
-/**
- * Adds the default actions.
- */
-Actions.prototype.init = function()
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- var isGraphEnabled = function()
- {
- return Action.prototype.isEnabled.apply(this, arguments) && graph.isEnabled();
- };
-
- // File actions
- this.addAction('new...', function() { graph.openLink(ui.getUrl()); });
- this.addAction('open...', function()
- {
- window.openNew = true;
- window.openKey = 'open';
-
- ui.openFile();
- });
- this.addAction('import...', function()
- {
- window.openNew = false;
- window.openKey = 'import';
-
- // Closes dialog after open
- window.openFile = new OpenFile(mxUtils.bind(this, function()
- {
- ui.hideDialog();
- }));
-
- window.openFile.setConsumer(mxUtils.bind(this, function(xml, filename)
- {
- try
- {
- var doc = mxUtils.parseXml(xml);
- editor.graph.setSelectionCells(editor.graph.importGraphModel(doc.documentElement));
- }
- catch (e)
- {
- mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
- }
- }));
-
- // Removes openFile if dialog is closed
- ui.showDialog(new OpenDialog(this).container, 320, 220, true, true, function()
- {
- window.openFile = null;
- });
- }).isEnabled = isGraphEnabled;
- this.addAction('save', function() { ui.saveFile(false); }, null, null, Editor.ctrlKey + '+S').isEnabled = isGraphEnabled;
- this.addAction('saveAs...', function() { ui.saveFile(true); }, null, null, Editor.ctrlKey + '+Shift+S').isEnabled = isGraphEnabled;
- this.addAction('export...', function() { ui.showDialog(new ExportDialog(ui).container, 300, 296, true, true); });
- this.addAction('editDiagram...', function()
- {
- var dlg = new EditDiagramDialog(ui);
- ui.showDialog(dlg.container, 620, 420, true, false);
- dlg.init();
- });
- this.addAction('pageSetup...', function() { ui.showDialog(new PageSetupDialog(ui).container, 320, 220, true, true); }).isEnabled = isGraphEnabled;
- this.addAction('print...', function() { ui.showDialog(new PrintDialog(ui).container, 300, 180, true, true); }, null, 'sprite-print', Editor.ctrlKey + '+P');
- this.addAction('preview', function() { mxUtils.show(graph, null, 10, 10); });
-
- // Edit actions
- this.addAction('undo', function() { ui.undo(); }, null, 'sprite-undo', Editor.ctrlKey + '+Z');
- this.addAction('redo', function() { ui.redo(); }, null, 'sprite-redo', (!mxClient.IS_WIN) ? Editor.ctrlKey + '+Shift+Z' : Editor.ctrlKey + '+Y');
- this.addAction('cut', function() { mxClipboard.cut(graph); }, null, 'sprite-cut', Editor.ctrlKey + '+X');
- this.addAction('copy', function()
- {
- try
- {
- mxClipboard.copy(graph);
- }
- catch (e)
- {
- ui.handleError(e);
- }
- }, null, 'sprite-copy', Editor.ctrlKey + '+C');
- this.addAction('paste', function()
- {
- if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()))
- {
- mxClipboard.paste(graph);
- }
- }, false, 'sprite-paste', Editor.ctrlKey + '+V');
- this.addAction('pasteHere', function(evt)
- {
- if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()))
- {
- graph.getModel().beginUpdate();
- try
- {
- var cells = mxClipboard.paste(graph);
-
- if (cells != null)
- {
- var includeEdges = true;
-
- for (var i = 0; i < cells.length && includeEdges; i++)
- {
- includeEdges = includeEdges && graph.model.isEdge(cells[i]);
- }
-
- var t = graph.view.translate;
- var s = graph.view.scale;
- var dx = t.x;
- var dy = t.y;
- var bb = null;
-
- if (cells.length == 1 && includeEdges)
- {
- var geo = graph.getCellGeometry(cells[0]);
-
- if (geo != null)
- {
- bb = geo.getTerminalPoint(true);
- }
- }
-
- bb = (bb != null) ? bb : graph.getBoundingBoxFromGeometry(cells, includeEdges);
-
- if (bb != null)
- {
- var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx));
- var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy));
-
- graph.cellsMoved(cells, x - bb.x, y - bb.y);
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- });
-
- this.addAction('copySize', function(evt)
- {
- var cell = graph.getSelectionCell();
-
- if (graph.isEnabled() && cell != null && graph.getModel().isVertex(cell))
- {
- var geo = graph.getCellGeometry(cell);
-
- if (geo != null)
- {
- ui.copiedSize = new mxRectangle(geo.x, geo.y, geo.width, geo.height);
- }
- }
- }, null, null, 'Alt+Shift+X');
-
- this.addAction('pasteSize', function(evt)
- {
- if (graph.isEnabled() && !graph.isSelectionEmpty() && ui.copiedSize != null)
- {
- graph.getModel().beginUpdate();
-
- try
- {
- var cells = graph.getSelectionCells();
-
- for (var i = 0; i < cells.length; i++)
- {
- if (graph.getModel().isVertex(cells[i]))
- {
- var geo = graph.getCellGeometry(cells[i]);
-
- if (geo != null)
- {
- geo = geo.clone();
- geo.width = ui.copiedSize.width;
- geo.height = ui.copiedSize.height;
-
- graph.getModel().setGeometry(cells[i], geo);
- }
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- }, null, null, 'Alt+Shift+V');
-
- function deleteCells(includeEdges)
- {
- // Cancels interactive operations
- graph.escape();
- var select = graph.deleteCells(graph.getDeletableCells(graph.getSelectionCells()), includeEdges);
-
- if (select != null)
- {
- graph.setSelectionCells(select);
- }
- };
-
- this.addAction('delete', function(evt)
- {
- deleteCells(evt != null && mxEvent.isControlDown(evt));
- }, null, null, 'Delete');
- this.addAction('deleteAll', function()
- {
- if (!graph.isSelectionEmpty())
- {
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
-
- for (var i = 0; i < cells.length; i++)
- {
- graph.cellLabelChanged(cells[i], '');
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- });
- this.addAction('deleteLabels', function()
- {
- if (!graph.isSelectionEmpty())
- {
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
-
- for (var i = 0; i < cells.length; i++)
- {
- graph.cellLabelChanged(cells[i], '');
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- }, null, null, Editor.ctrlKey + '+Delete');
- this.addAction('duplicate', function()
- {
- try
- {
- graph.setSelectionCells(graph.duplicateCells());
- graph.scrollCellToVisible(graph.getSelectionCell());
- }
- catch (e)
- {
- ui.handleError(e);
- }
- }, null, null, Editor.ctrlKey + '+D');
- this.put('turn', new Action(mxResources.get('turn') + ' / ' + mxResources.get('reverse'), function(evt)
- {
- graph.turnShapes(graph.getSelectionCells(), (evt != null) ? mxEvent.isShiftDown(evt) : false);
- }, null, null, Editor.ctrlKey + '+R'));
- this.addAction('selectVertices', function() { graph.selectVertices(null, true); }, null, null, Editor.ctrlKey + '+Shift+I');
- this.addAction('selectEdges', function() { graph.selectEdges(); }, null, null, Editor.ctrlKey + '+Shift+E');
- this.addAction('selectAll', function() { graph.selectAll(null, true); }, null, null, Editor.ctrlKey + '+A');
- this.addAction('selectNone', function() { graph.clearSelection(); }, null, null, Editor.ctrlKey + '+Shift+A');
- this.addAction('lockUnlock', function()
- {
- if (!graph.isSelectionEmpty())
- {
- graph.getModel().beginUpdate();
- try
- {
- var defaultValue = graph.isCellMovable(graph.getSelectionCell()) ? 1 : 0;
- graph.toggleCellStyles(mxConstants.STYLE_MOVABLE, defaultValue);
- graph.toggleCellStyles(mxConstants.STYLE_RESIZABLE, defaultValue);
- graph.toggleCellStyles(mxConstants.STYLE_ROTATABLE, defaultValue);
- graph.toggleCellStyles(mxConstants.STYLE_DELETABLE, defaultValue);
- graph.toggleCellStyles(mxConstants.STYLE_EDITABLE, defaultValue);
- graph.toggleCellStyles('connectable', defaultValue);
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- }, null, null, Editor.ctrlKey + '+L');
-
- // Navigation actions
- this.addAction('home', function() { graph.home(); }, null, null, 'Shift+Home');
- this.addAction('exitGroup', function() { graph.exitGroup(); }, null, null, Editor.ctrlKey + '+Shift+Home');
- this.addAction('enterGroup', function() { graph.enterGroup(); }, null, null, Editor.ctrlKey + '+Shift+End');
- this.addAction('collapse', function() { graph.foldCells(true); }, null, null, Editor.ctrlKey + '+Home');
- this.addAction('expand', function() { graph.foldCells(false); }, null, null, Editor.ctrlKey + '+End');
-
- // Arrange actions
- this.addAction('toFront', function() { graph.orderCells(false); }, null, null, Editor.ctrlKey + '+Shift+F');
- this.addAction('toBack', function() { graph.orderCells(true); }, null, null, Editor.ctrlKey + '+Shift+B');
- this.addAction('group', function()
- {
- if (graph.isEnabled())
- {
- var cells = mxUtils.sortCells(graph.getSelectionCells(), true);
-
- if (cells.length == 1 && !graph.isTable(cells[0]) && !graph.isTableRow(cells[0]))
- {
- graph.setCellStyles('container', '1');
- }
- else
- {
- cells = graph.getCellsForGroup(cells);
-
- if (cells.length > 1)
- {
- graph.setSelectionCell(graph.groupCells(null, 0, cells));
- }
- }
- }
- }, null, null, Editor.ctrlKey + '+G');
- this.addAction('ungroup', function()
- {
- if (graph.isEnabled())
- {
- var cells = graph.getSelectionCells();
-
- graph.model.beginUpdate();
- try
- {
- var temp = graph.ungroupCells();
-
- // Clears container flag for remaining cells
- if (cells != null)
- {
- for (var i = 0; i < cells.length; i++)
- {
- if (graph.model.contains(cells[i]))
- {
- if (graph.model.getChildCount(cells[i]) == 0 &&
- graph.model.isVertex(cells[i]))
- {
- graph.setCellStyles('container', '0', [cells[i]]);
- }
-
- temp.push(cells[i]);
- }
- }
- }
- }
- finally
- {
- graph.model.endUpdate();
- }
-
- graph.setSelectionCells(temp);
- }
- }, null, null, Editor.ctrlKey + '+Shift+U');
- this.addAction('removeFromGroup', function()
- {
- if (graph.isEnabled())
- {
- var cells = graph.getSelectionCells();
-
- // Removes table rows and cells
- if (cells != null)
- {
- var temp = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- if (!graph.isTableRow(cells[i]) &&
- !graph.isTableCell(cells[i]))
- {
- temp.push(cells[i]);
- }
- }
-
- graph.removeCellsFromParent(temp);
- }
- }
- });
- // Adds action
- this.addAction('edit', function()
- {
- if (graph.isEnabled())
- {
- graph.startEditingAtCell();
- }
- }, null, null, 'F2/Enter');
- this.addAction('editData...', function()
- {
- var cell = graph.getSelectionCell() || graph.getModel().getRoot();
- ui.showDataDialog(cell);
- }, null, null, Editor.ctrlKey + '+M');
- this.addAction('editTooltip...', function()
- {
- if (graph.isEnabled() && !graph.isSelectionEmpty())
- {
- var cell = graph.getSelectionCell();
- var tooltip = '';
-
- if (mxUtils.isNode(cell.value))
- {
- var tmp = null;
-
- if (Graph.translateDiagram && Graph.diagramLanguage != null &&
- cell.value.hasAttribute('tooltip_' + Graph.diagramLanguage))
- {
- tmp = cell.value.getAttribute('tooltip_' + Graph.diagramLanguage);
- }
-
- if (tmp == null)
- {
- tmp = cell.value.getAttribute('tooltip');
- }
-
- if (tmp != null)
- {
- tooltip = tmp;
- }
- }
-
- var dlg = new TextareaDialog(ui, mxResources.get('editTooltip') + ':', tooltip, function(newValue)
- {
- graph.setTooltipForCell(cell, newValue);
- });
- ui.showDialog(dlg.container, 320, 200, true, true);
- dlg.init();
- }
- }, null, null, 'Alt+Shift+T');
- this.addAction('openLink', function()
- {
- var link = graph.getLinkForCell(graph.getSelectionCell());
-
- if (link != null)
- {
- graph.openLink(link);
- }
- });
- this.addAction('editLink...', function()
- {
- if (graph.isEnabled() && !graph.isSelectionEmpty())
- {
- var cell = graph.getSelectionCell();
- var value = graph.getLinkForCell(cell) || '';
-
- ui.showLinkDialog(value, mxResources.get('apply'), function(link)
- {
- link = mxUtils.trim(link);
- graph.setLinkForCell(cell, (link.length > 0) ? link : null);
- });
- }
- }, null, null, 'Alt+Shift+L');
- this.put('insertImage', new Action(mxResources.get('image') + '...', function()
- {
- if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()))
- {
- graph.clearSelection();
- ui.actions.get('image').funct();
- }
- })).isEnabled = isGraphEnabled;
- this.put('insertLink', new Action(mxResources.get('link') + '...', function()
- {
- if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()))
- {
- ui.showLinkDialog('', mxResources.get('insert'), function(link, docs)
- {
- link = mxUtils.trim(link);
-
- if (link.length > 0)
- {
- var icon = null;
- var title = graph.getLinkTitle(link);
-
- if (docs != null && docs.length > 0)
- {
- icon = docs[0].iconUrl;
- title = docs[0].name || docs[0].type;
- title = title.charAt(0).toUpperCase() + title.substring(1);
-
- if (title.length > 30)
- {
- title = title.substring(0, 30) + '...';
- }
- }
-
- var linkCell = new mxCell(title, new mxGeometry(0, 0, 100, 40),
- 'fontColor=#0000EE;fontStyle=4;rounded=1;overflow=hidden;' + ((icon != null) ?
- 'shape=label;imageWidth=16;imageHeight=16;spacingLeft=26;align=left;image=' + icon :
- 'spacing=10;'));
- linkCell.vertex = true;
-
- var pt = graph.getCenterInsertPoint(graph.getBoundingBoxFromGeometry([linkCell], true));
- linkCell.geometry.x = pt.x;
- linkCell.geometry.y = pt.y;
-
- graph.setLinkForCell(linkCell, link);
- graph.cellSizeUpdated(linkCell, true);
-
- graph.getModel().beginUpdate();
- try
- {
- linkCell = graph.addCell(linkCell);
- graph.fireEvent(new mxEventObject('cellsInserted', 'cells', [linkCell]));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- graph.setSelectionCell(linkCell);
- graph.scrollCellToVisible(graph.getSelectionCell());
- }
- });
- }
- })).isEnabled = isGraphEnabled;
- this.addAction('link...', mxUtils.bind(this, function()
- {
- if (graph.isEnabled())
- {
- if (graph.cellEditor.isContentEditing())
- {
- var elt = graph.getSelectedElement();
- var link = graph.getParentByName(elt, 'A', graph.cellEditor.textarea);
- var oldValue = '';
-
- // Workaround for FF returning the outermost selected element after double
- // click on a DOM hierarchy with a link inside (but not as topmost element)
- if (link == null && elt != null && elt.getElementsByTagName != null)
- {
- // Finds all links in the selected DOM and uses the link
- // where the selection text matches its text content
- var links = elt.getElementsByTagName('a');
-
- for (var i = 0; i < links.length && link == null; i++)
- {
- if (links[i].textContent == elt.textContent)
- {
- link = links[i];
- }
- }
- }
-
- if (link != null && link.nodeName == 'A')
- {
- oldValue = link.getAttribute('href') || '';
- graph.selectNode(link);
- }
-
- var selState = graph.cellEditor.saveSelection();
-
- ui.showLinkDialog(oldValue, mxResources.get('apply'), mxUtils.bind(this, function(value)
- {
- graph.cellEditor.restoreSelection(selState);
-
- if (value != null)
- {
- graph.insertLink(value);
- }
- }));
- }
- else if (graph.isSelectionEmpty())
- {
- this.get('insertLink').funct();
- }
- else
- {
- this.get('editLink').funct();
- }
- }
- })).isEnabled = isGraphEnabled;
- this.addAction('autosize', function()
- {
- var cells = graph.getSelectionCells();
-
- if (cells != null)
- {
- graph.getModel().beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- var cell = cells[i];
-
- if (graph.getModel().getChildCount(cell))
- {
- graph.updateGroupBounds([cell], 20);
- }
- else
- {
- var state = graph.view.getState(cell);
- var geo = graph.getCellGeometry(cell);
-
- if (graph.getModel().isVertex(cell) && state != null && state.text != null &&
- geo != null && graph.isWrapping(cell))
- {
- geo = geo.clone();
- geo.height = state.text.boundingBox.height / graph.view.scale;
- graph.getModel().setGeometry(cell, geo);
- }
- else
- {
- graph.updateCellSize(cell);
- }
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- }, null, null, Editor.ctrlKey + '+Shift+Y');
- this.addAction('formattedText', function()
- {
- var refState = graph.getView().getState(graph.getSelectionCell());
-
- if (refState != null)
- {
- graph.stopEditing();
- var value = (refState.style['html'] == '1') ? null : '1';
-
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
-
- for (var i = 0; i < cells.length; i++)
- {
- state = graph.getView().getState(cells[i]);
-
- if (state != null)
- {
- var html = mxUtils.getValue(state.style, 'html', '0');
-
- if (html == '1' && value == null)
- {
- var label = graph.convertValueToString(state.cell);
-
- if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0')
- {
- // Removes newlines from HTML and converts breaks to newlines
- // to match the HTML output in plain text
- label = label.replace(/\n/g, '').replace(/<br\s*.?>/g, '\n');
- }
-
- // Removes HTML tags
- var temp = document.createElement('div');
- temp.innerHTML = graph.sanitizeHtml(label);
- label = mxUtils.extractTextWithWhitespace(temp.childNodes);
-
- graph.cellLabelChanged(state.cell, label);
- graph.setCellStyles('html', value, [cells[i]]);
- }
- else if (html == '0' && value == '1')
- {
- // Converts HTML tags to text
- var label = mxUtils.htmlEntities(graph.convertValueToString(state.cell), false);
-
- if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0')
- {
- // Converts newlines in plain text to breaks in HTML
- // to match the plain text output
- label = label.replace(/\n/g, '<br/>');
- }
-
- graph.cellLabelChanged(state.cell, graph.sanitizeHtml(label));
- graph.setCellStyles('html', value, [cells[i]]);
- }
- }
- }
-
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['html'],
- 'values', [(value != null) ? value : '0'], 'cells', cells));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- });
- this.addAction('wordWrap', function()
- {
- var state = graph.getView().getState(graph.getSelectionCell());
- var value = 'wrap';
-
- graph.stopEditing();
-
- if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap')
- {
- value = null;
- }
-
- graph.setCellStyles(mxConstants.STYLE_WHITE_SPACE, value);
- });
- this.addAction('rotation', function()
- {
- var value = '0';
- var state = graph.getView().getState(graph.getSelectionCell());
-
- if (state != null)
- {
- value = state.style[mxConstants.STYLE_ROTATION] || value;
- }
-
- var dlg = new FilenameDialog(ui, value, mxResources.get('apply'), function(newValue)
- {
- if (newValue != null && newValue.length > 0)
- {
- graph.setCellStyles(mxConstants.STYLE_ROTATION, newValue);
- }
- }, mxResources.get('enterValue') + ' (' + mxResources.get('rotation') + ' 0-360)');
-
- ui.showDialog(dlg.container, 375, 80, true, true);
- dlg.init();
- });
- // View actions
- this.addAction('resetView', function()
- {
- graph.zoomTo(1);
- ui.resetScrollbars();
- }, null, null, 'Home');
- this.addAction('zoomIn', function(evt)
- {
- if (graph.isFastZoomEnabled())
- {
- graph.lazyZoom(true, true, ui.buttonZoomDelay);
- }
- else
- {
- graph.zoomIn();
- }
- }, null, null, Editor.ctrlKey + ' + (Numpad) / Alt+Mousewheel');
- this.addAction('zoomOut', function(evt)
- {
- if (graph.isFastZoomEnabled())
- {
- graph.lazyZoom(false, true, ui.buttonZoomDelay);
- }
- else
- {
- graph.zoomOut();
- }
- }, null, null, Editor.ctrlKey + ' - (Numpad) / Alt+Mousewheel');
- this.addAction('fitWindow', function()
- {
- var bounds = (graph.isSelectionEmpty()) ? graph.getGraphBounds() :
- graph.getBoundingBox(graph.getSelectionCells())
- var t = graph.view.translate;
- var s = graph.view.scale;
-
- bounds.x = bounds.x / s - t.x;
- bounds.y = bounds.y / s - t.y;
- bounds.width /= s;
- bounds.height /= s;
-
- if (graph.backgroundImage != null)
- {
- bounds.add(new mxRectangle(0, 0, graph.backgroundImage.width, graph.backgroundImage.height));
- }
-
- if (bounds.width == 0 || bounds.height == 0)
- {
- graph.zoomTo(1);
- ui.resetScrollbars();
- }
- else
- {
- graph.fitWindow(bounds);
- }
- }, null, null, Editor.ctrlKey + '+Shift+H');
- this.addAction('fitPage', mxUtils.bind(this, function()
- {
- if (!graph.pageVisible)
- {
- this.get('pageView').funct();
- }
-
- var fmt = graph.pageFormat;
- var ps = graph.pageScale;
- var cw = graph.container.clientWidth - 10;
- var ch = graph.container.clientHeight - 10;
- var scale = Math.floor(20 * Math.min(cw / fmt.width / ps, ch / fmt.height / ps)) / 20;
- graph.zoomTo(scale);
-
- if (mxUtils.hasScrollbars(graph.container))
- {
- var pad = graph.getPagePadding();
- graph.container.scrollTop = pad.y * graph.view.scale - 1;
- graph.container.scrollLeft = Math.min(pad.x * graph.view.scale, (graph.container.scrollWidth - graph.container.clientWidth) / 2) - 1;
- }
- }), null, null, Editor.ctrlKey + '+J');
- this.addAction('fitTwoPages', mxUtils.bind(this, function()
- {
- if (!graph.pageVisible)
- {
- this.get('pageView').funct();
- }
-
- var fmt = graph.pageFormat;
- var ps = graph.pageScale;
- var cw = graph.container.clientWidth - 10;
- var ch = graph.container.clientHeight - 10;
-
- var scale = Math.floor(20 * Math.min(cw / (2 * fmt.width) / ps, ch / fmt.height / ps)) / 20;
- graph.zoomTo(scale);
-
- if (mxUtils.hasScrollbars(graph.container))
- {
- var pad = graph.getPagePadding();
- graph.container.scrollTop = Math.min(pad.y, (graph.container.scrollHeight - graph.container.clientHeight) / 2);
- graph.container.scrollLeft = Math.min(pad.x, (graph.container.scrollWidth - graph.container.clientWidth) / 2);
- }
- }), null, null, Editor.ctrlKey + '+Shift+J');
- this.addAction('fitPageWidth', mxUtils.bind(this, function()
- {
- if (!graph.pageVisible)
- {
- this.get('pageView').funct();
- }
-
- var fmt = graph.pageFormat;
- var ps = graph.pageScale;
- var cw = graph.container.clientWidth - 10;
-
- var scale = Math.floor(20 * cw / fmt.width / ps) / 20;
- graph.zoomTo(scale);
-
- if (mxUtils.hasScrollbars(graph.container))
- {
- var pad = graph.getPagePadding();
- graph.container.scrollLeft = Math.min(pad.x * graph.view.scale,
- (graph.container.scrollWidth - graph.container.clientWidth) / 2);
- }
- }));
- this.put('customZoom', new Action(mxResources.get('custom') + '...', mxUtils.bind(this, function()
- {
- var dlg = new FilenameDialog(this.editorUi, parseInt(graph.getView().getScale() * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue)
- {
- var val = parseInt(newValue);
-
- if (!isNaN(val) && val > 0)
- {
- graph.zoomTo(val / 100);
- }
- }), mxResources.get('zoom') + ' (%)');
- this.editorUi.showDialog(dlg.container, 300, 80, true, true);
- dlg.init();
- }), null, null, Editor.ctrlKey + '+0'));
- this.addAction('pageScale...', mxUtils.bind(this, function()
- {
- var dlg = new FilenameDialog(this.editorUi, parseInt(graph.pageScale * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue)
- {
- var val = parseInt(newValue);
-
- if (!isNaN(val) && val > 0)
- {
- var change = new ChangePageSetup(ui, null, null, null, val / 100);
- change.ignoreColor = true;
- change.ignoreImage = true;
-
- graph.model.execute(change);
- }
- }), mxResources.get('pageScale') + ' (%)');
- this.editorUi.showDialog(dlg.container, 300, 80, true, true);
- dlg.init();
- }));
-
- // Option actions
- var action = null;
- action = this.addAction('grid', function()
- {
- graph.setGridEnabled(!graph.isGridEnabled());
- ui.fireEvent(new mxEventObject('gridEnabledChanged'));
- }, null, null, Editor.ctrlKey + '+Shift+G');
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.isGridEnabled(); });
- action.setEnabled(false);
-
- action = this.addAction('guides', function()
- {
- graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled;
- ui.fireEvent(new mxEventObject('guidesEnabledChanged'));
- });
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.graphHandler.guidesEnabled; });
- action.setEnabled(false);
-
- action = this.addAction('tooltips', function()
- {
- graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled());
- ui.fireEvent(new mxEventObject('tooltipsEnabledChanged'));
- });
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.tooltipHandler.isEnabled(); });
-
- action = this.addAction('collapseExpand', function()
- {
- var change = new ChangePageSetup(ui);
- change.ignoreColor = true;
- change.ignoreImage = true;
- change.foldingEnabled = !graph.foldingEnabled;
-
- graph.model.execute(change);
- });
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.foldingEnabled; });
- action.isEnabled = isGraphEnabled;
- action = this.addAction('scrollbars', function()
- {
- ui.setScrollbars(!ui.hasScrollbars());
- });
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.scrollbars; });
- action = this.addAction('pageView', mxUtils.bind(this, function()
- {
- ui.setPageVisible(!graph.pageVisible);
- }));
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.pageVisible; });
- action = this.addAction('connectionArrows', function()
- {
- graph.connectionArrowsEnabled = !graph.connectionArrowsEnabled;
- ui.fireEvent(new mxEventObject('connectionArrowsChanged'));
- }, null, null, 'Alt+Shift+A');
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.connectionArrowsEnabled; });
- action = this.addAction('connectionPoints', function()
- {
- graph.setConnectable(!graph.connectionHandler.isEnabled());
- ui.fireEvent(new mxEventObject('connectionPointsChanged'));
- }, null, null, 'Alt+Shift+P');
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.connectionHandler.isEnabled(); });
- action = this.addAction('copyConnect', function()
- {
- graph.connectionHandler.setCreateTarget(!graph.connectionHandler.isCreateTarget());
- ui.fireEvent(new mxEventObject('copyConnectChanged'));
- });
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return graph.connectionHandler.isCreateTarget(); });
- action.isEnabled = isGraphEnabled;
- action = this.addAction('autosave', function()
- {
- ui.editor.setAutosave(!ui.editor.autosave);
- });
- action.setToggleAction(true);
- action.setSelectedCallback(function() { return ui.editor.autosave; });
- action.isEnabled = isGraphEnabled;
- action.visible = false;
-
- // Help actions
- this.addAction('help', function()
- {
- var ext = '';
-
- if (mxResources.isLanguageSupported(mxClient.language))
- {
- ext = '_' + mxClient.language;
- }
-
- graph.openLink(RESOURCES_PATH + '/help' + ext + '.html');
- });
-
- var showingAbout = false;
-
- this.put('about', new Action(mxResources.get('about') + ' Graph Editor...', function()
- {
- if (!showingAbout)
- {
- ui.showDialog(new AboutDialog(ui).container, 320, 280, true, true, function()
- {
- showingAbout = false;
- });
-
- showingAbout = true;
- }
- }));
-
- // Font style actions
- var toggleFontStyle = mxUtils.bind(this, function(key, style, fn, shortcut)
- {
- return this.addAction(key, function()
- {
- if (fn != null && graph.cellEditor.isContentEditing())
- {
- fn();
- }
- else
- {
- graph.stopEditing(false);
-
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
- graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style, cells);
-
- // Removes bold and italic tags and CSS styles inside labels
- if ((style & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD)
- {
- graph.updateLabelElements(graph.getSelectionCells(), function(elt)
- {
- elt.style.fontWeight = null;
-
- if (elt.nodeName == 'B')
- {
- graph.replaceElement(elt);
- }
- });
- }
- else if ((style & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC)
- {
- graph.updateLabelElements(graph.getSelectionCells(), function(elt)
- {
- elt.style.fontStyle = null;
-
- if (elt.nodeName == 'I')
- {
- graph.replaceElement(elt);
- }
- });
- }
- else if ((style & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE)
- {
- graph.updateLabelElements(graph.getSelectionCells(), function(elt)
- {
- elt.style.textDecoration = null;
-
- if (elt.nodeName == 'U')
- {
- graph.replaceElement(elt);
- }
- });
- }
-
- for (var i = 0; i < cells.length; i++)
- {
- if (graph.model.getChildCount(cells[i]) == 0)
- {
- graph.autoSizeCell(cells[i], false);
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- }, null, null, shortcut);
- });
-
- toggleFontStyle('bold', mxConstants.FONT_BOLD, function() { document.execCommand('bold', false, null); }, Editor.ctrlKey + '+B');
- toggleFontStyle('italic', mxConstants.FONT_ITALIC, function() { document.execCommand('italic', false, null); }, Editor.ctrlKey + '+I');
- toggleFontStyle('underline', mxConstants.FONT_UNDERLINE, function() { document.execCommand('underline', false, null); }, Editor.ctrlKey + '+U');
-
- // Color actions
- this.addAction('fontColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FONTCOLOR, 'forecolor', '000000'); });
- this.addAction('strokeColor...', function() { ui.menus.pickColor(mxConstants.STYLE_STROKECOLOR); });
- this.addAction('fillColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FILLCOLOR); });
- this.addAction('gradientColor...', function() { ui.menus.pickColor(mxConstants.STYLE_GRADIENTCOLOR); });
- this.addAction('backgroundColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, 'backcolor'); });
- this.addAction('borderColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BORDERCOLOR); });
-
- // Format actions
- this.addAction('vertical', function() { ui.menus.toggleStyle(mxConstants.STYLE_HORIZONTAL, true); });
- this.addAction('shadow', function() { ui.menus.toggleStyle(mxConstants.STYLE_SHADOW); });
- this.addAction('solid', function()
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles(mxConstants.STYLE_DASHED, null);
- graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, null);
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN],
- 'values', [null, null], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- });
- this.addAction('dashed', function()
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles(mxConstants.STYLE_DASHED, '1');
- graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, null);
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN],
- 'values', ['1', null], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- });
- this.addAction('dotted', function()
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles(mxConstants.STYLE_DASHED, '1');
- graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, '1 4');
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN],
- 'values', ['1', '1 4'], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- });
- this.addAction('sharp', function()
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles(mxConstants.STYLE_ROUNDED, '0');
- graph.setCellStyles(mxConstants.STYLE_CURVED, '0');
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED],
- 'values', ['0', '0'], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- });
- this.addAction('rounded', function()
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles(mxConstants.STYLE_ROUNDED, '1');
- graph.setCellStyles(mxConstants.STYLE_CURVED, '0');
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED],
- 'values', ['1', '0'], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- });
- this.addAction('toggleRounded', function()
- {
- if (!graph.isSelectionEmpty() && graph.isEnabled())
- {
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
- var style = graph.getCurrentCellStyle(cells[0]);
- var value = (mxUtils.getValue(style, mxConstants.STYLE_ROUNDED, '0') == '1') ? '0' : '1';
-
- graph.setCellStyles(mxConstants.STYLE_ROUNDED, value);
- graph.setCellStyles(mxConstants.STYLE_CURVED, null);
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED],
- 'values', [value, '0'], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- });
- this.addAction('curved', function()
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles(mxConstants.STYLE_ROUNDED, '0');
- graph.setCellStyles(mxConstants.STYLE_CURVED, '1');
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED],
- 'values', ['0', '1'], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- });
- this.addAction('collapsible', function()
- {
- var state = graph.view.getState(graph.getSelectionCell());
- var value = '1';
-
- if (state != null && graph.getFoldingImage(state) != null)
- {
- value = '0';
- }
-
- graph.setCellStyles('collapsible', value);
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['collapsible'],
- 'values', [value], 'cells', graph.getSelectionCells()));
- });
- this.addAction('editStyle...', mxUtils.bind(this, function()
- {
- var cells = graph.getSelectionCells();
-
- if (cells != null && cells.length > 0)
- {
- var model = graph.getModel();
-
- var dlg = new TextareaDialog(this.editorUi, mxResources.get('editStyle') + ':',
- model.getStyle(cells[0]) || '', function(newValue)
- {
- if (newValue != null)
- {
- graph.setCellStyle(mxUtils.trim(newValue), cells);
- }
- }, null, null, 400, 220);
- this.editorUi.showDialog(dlg.container, 420, 300, true, true);
- dlg.init();
- }
- }), null, null, Editor.ctrlKey + '+E');
- this.addAction('setAsDefaultStyle', function()
- {
- if (graph.isEnabled() && !graph.isSelectionEmpty())
- {
- ui.setDefaultStyle(graph.getSelectionCell());
- }
- }, null, null, Editor.ctrlKey + '+Shift+D');
- this.addAction('clearDefaultStyle', function()
- {
- if (graph.isEnabled())
- {
- ui.clearDefaultStyle();
- }
- }, null, null, Editor.ctrlKey + '+Shift+R');
- this.addAction('addWaypoint', function()
- {
- var cell = graph.getSelectionCell();
-
- if (cell != null && graph.getModel().isEdge(cell))
- {
- var handler = editor.graph.selectionCellsHandler.getHandler(cell);
-
- if (handler instanceof mxEdgeHandler)
- {
- var t = graph.view.translate;
- var s = graph.view.scale;
- var dx = t.x;
- var dy = t.y;
-
- var parent = graph.getModel().getParent(cell);
- var pgeo = graph.getCellGeometry(parent);
-
- while (graph.getModel().isVertex(parent) && pgeo != null)
- {
- dx += pgeo.x;
- dy += pgeo.y;
-
- parent = graph.getModel().getParent(parent);
- pgeo = graph.getCellGeometry(parent);
- }
-
- var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx));
- var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy));
-
- handler.addPointAt(handler.state, x, y);
- }
- }
- });
- this.addAction('removeWaypoint', function()
- {
- // TODO: Action should run with "this" set to action
- var rmWaypointAction = ui.actions.get('removeWaypoint');
-
- if (rmWaypointAction.handler != null)
- {
- // NOTE: Popupevent handled and action updated in Menus.createPopupMenu
- rmWaypointAction.handler.removePoint(rmWaypointAction.handler.state, rmWaypointAction.index);
- }
- });
- this.addAction('clearWaypoints', function()
- {
- var cells = graph.getSelectionCells();
-
- if (cells != null)
- {
- cells = graph.addAllEdges(cells);
-
- graph.getModel().beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- var cell = cells[i];
-
- if (graph.getModel().isEdge(cell))
- {
- var geo = graph.getCellGeometry(cell);
-
- if (geo != null)
- {
- geo = geo.clone();
- geo.points = null;
- graph.getModel().setGeometry(cell, geo);
- }
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- }, null, null, 'Alt+Shift+C');
- action = this.addAction('subscript', mxUtils.bind(this, function()
- {
- if (graph.cellEditor.isContentEditing())
- {
- document.execCommand('subscript', false, null);
- }
- }), null, null, Editor.ctrlKey + '+,');
- action = this.addAction('superscript', mxUtils.bind(this, function()
- {
- if (graph.cellEditor.isContentEditing())
- {
- document.execCommand('superscript', false, null);
- }
- }), null, null, Editor.ctrlKey + '+.');
- action = this.addAction('indent', mxUtils.bind(this, function()
- {
- // NOTE: Alt+Tab for outdent implemented via special code in
- // keyHandler.getFunction in EditorUi.js. Ctrl+Tab is reserved.
- if (graph.cellEditor.isContentEditing())
- {
- document.execCommand('indent', false, null);
- }
- }), null, null, 'Shift+Tab');
- this.addAction('image...', function()
- {
- if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()))
- {
- var title = mxResources.get('image') + ' (' + mxResources.get('url') + '):';
- var state = graph.getView().getState(graph.getSelectionCell());
- var value = '';
-
- if (state != null)
- {
- value = state.style[mxConstants.STYLE_IMAGE] || value;
- }
-
- var selectionState = graph.cellEditor.saveSelection();
-
- ui.showImageDialog(title, value, function(newValue, w, h)
- {
- // Inserts image into HTML text
- if (graph.cellEditor.isContentEditing())
- {
- graph.cellEditor.restoreSelection(selectionState);
- graph.insertImage(newValue, w, h);
- }
- else
- {
- var cells = graph.getSelectionCells();
-
- if (newValue != null && (newValue.length > 0 || cells.length > 0))
- {
- var select = null;
-
- graph.getModel().beginUpdate();
- try
- {
- // Inserts new cell if no cell is selected
- if (cells.length == 0)
- {
- cells = [graph.insertVertex(graph.getDefaultParent(), null, '', 0, 0, w, h,
- 'shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;')];
- var pt = graph.getCenterInsertPoint(graph.getBoundingBoxFromGeometry(cells, true));
- cells[0].geometry.x = pt.x;
- cells[0].geometry.y = pt.y;
-
- select = cells;
- graph.fireEvent(new mxEventObject('cellsInserted', 'cells', select));
- }
-
- graph.setCellStyles(mxConstants.STYLE_IMAGE, (newValue.length > 0) ? newValue : null, cells);
-
- // Sets shape only if not already shape with image (label or image)
- var style = graph.getCurrentCellStyle(cells[0]);
-
- if (style[mxConstants.STYLE_SHAPE] != 'image' && style[mxConstants.STYLE_SHAPE] != 'label')
- {
- graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells);
- }
- else if (newValue.length == 0)
- {
- graph.setCellStyles(mxConstants.STYLE_SHAPE, null, cells);
- }
-
- if (graph.getSelectionCount() == 1)
- {
- if (w != null && h != null)
- {
- var cell = cells[0];
- var geo = graph.getModel().getGeometry(cell);
-
- if (geo != null)
- {
- geo = geo.clone();
- geo.width = w;
- geo.height = h;
- graph.getModel().setGeometry(cell, geo);
- }
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- if (select != null)
- {
- graph.setSelectionCells(select);
- graph.scrollCellToVisible(select[0]);
- }
- }
- }
- }, graph.cellEditor.isContentEditing(), !graph.cellEditor.isContentEditing());
- }
- }).isEnabled = isGraphEnabled;
- action = this.addAction('layers', mxUtils.bind(this, function()
- {
- if (this.layersWindow == null)
- {
- // LATER: Check outline window for initial placement
- this.layersWindow = new LayersWindow(ui, document.body.offsetWidth - 280, 120, 220, 196);
- this.layersWindow.window.addListener('show', function()
- {
- ui.fireEvent(new mxEventObject('layers'));
- });
- this.layersWindow.window.addListener('hide', function()
- {
- ui.fireEvent(new mxEventObject('layers'));
- });
- this.layersWindow.window.setVisible(true);
- ui.fireEvent(new mxEventObject('layers'));
-
- this.layersWindow.init();
- }
- else
- {
- this.layersWindow.window.setVisible(!this.layersWindow.window.isVisible());
- }
- }), null, null, Editor.ctrlKey + '+Shift+L');
- action.setToggleAction(true);
- action.setSelectedCallback(mxUtils.bind(this, function() { return this.layersWindow != null && this.layersWindow.window.isVisible(); }));
- action = this.addAction('formatPanel', mxUtils.bind(this, function()
- {
- ui.toggleFormatPanel();
- }), null, null, Editor.ctrlKey + '+Shift+P');
- action.setToggleAction(true);
- action.setSelectedCallback(mxUtils.bind(this, function() { return ui.formatWidth > 0; }));
- action = this.addAction('outline', mxUtils.bind(this, function()
- {
- if (this.outlineWindow == null)
- {
- // LATER: Check layers window for initial placement
- this.outlineWindow = new OutlineWindow(ui, document.body.offsetWidth - 260, 100, 180, 180);
- this.outlineWindow.window.addListener('show', function()
- {
- ui.fireEvent(new mxEventObject('outline'));
- });
- this.outlineWindow.window.addListener('hide', function()
- {
- ui.fireEvent(new mxEventObject('outline'));
- });
- this.outlineWindow.window.setVisible(true);
- ui.fireEvent(new mxEventObject('outline'));
- }
- else
- {
- this.outlineWindow.window.setVisible(!this.outlineWindow.window.isVisible());
- }
- }), null, null, Editor.ctrlKey + '+Shift+O');
-
- action.setToggleAction(true);
- action.setSelectedCallback(mxUtils.bind(this, function() { return this.outlineWindow != null && this.outlineWindow.window.isVisible(); }));
-};
-
-/**
- * Registers the given action under the given name.
- */
-Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut)
-{
- var title;
-
- if (key.substring(key.length - 3) == '...')
- {
- key = key.substring(0, key.length - 3);
- title = mxResources.get(key) + '...';
- }
- else
- {
- title = mxResources.get(key);
- }
-
- return this.put(key, new Action(title, funct, enabled, iconCls, shortcut));
-};
-
-/**
- * Registers the given action under the given name.
- */
-Actions.prototype.put = function(name, action)
-{
- this.actions[name] = action;
-
- return action;
-};
-
-/**
- * Returns the action for the given name or null if no such action exists.
- */
-Actions.prototype.get = function(name)
-{
- return this.actions[name];
-};
-
-/**
- * Constructs a new action for the given parameters.
- */
-function Action(label, funct, enabled, iconCls, shortcut)
-{
- mxEventSource.call(this);
- this.label = label;
- this.funct = this.createFunction(funct);
- this.enabled = (enabled != null) ? enabled : true;
- this.iconCls = iconCls;
- this.shortcut = shortcut;
- this.visible = true;
-};
-
-// Action inherits from mxEventSource
-mxUtils.extend(Action, mxEventSource);
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.createFunction = function(funct)
-{
- return funct;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setEnabled = function(value)
-{
- if (this.enabled != value)
- {
- this.enabled = value;
- this.fireEvent(new mxEventObject('stateChanged'));
- }
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.isEnabled = function()
-{
- return this.enabled;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setToggleAction = function(value)
-{
- this.toggleAction = value;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setSelectedCallback = function(funct)
-{
- this.selectedCallback = funct;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.isSelected = function()
-{
- return this.selectedCallback();
-};
diff --git a/src/main/webapp/js/mxgraph/Dialogs.js b/src/main/webapp/js/mxgraph/Dialogs.js
deleted file mode 100644
index 86a75542..00000000
--- a/src/main/webapp/js/mxgraph/Dialogs.js
+++ /dev/null
@@ -1,2558 +0,0 @@
-/**
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new open dialog.
- */
-var OpenDialog = function()
-{
- var iframe = document.createElement('iframe');
- iframe.style.backgroundColor = 'transparent';
- iframe.allowTransparency = 'true';
- iframe.style.borderStyle = 'none';
- iframe.style.borderWidth = '0px';
- iframe.style.overflow = 'hidden';
- iframe.frameBorder = '0';
-
- // Adds padding as a workaround for box model in older IE versions
- var dx = (mxClient.IS_VML && (document.documentMode == null || document.documentMode < 8)) ? 20 : 0;
-
- iframe.setAttribute('width', (((Editor.useLocalStorage) ? 640 : 320) + dx) + 'px');
- iframe.setAttribute('height', (((Editor.useLocalStorage) ? 480 : 220) + dx) + 'px');
- iframe.setAttribute('src', OPEN_FORM);
-
- this.container = iframe;
-};
-
-/**
- * Constructs a new color dialog.
- */
-var ColorDialog = function(editorUi, color, apply, cancelFn)
-{
- this.editorUi = editorUi;
-
- var input = document.createElement('input');
- input.style.marginBottom = '10px';
- input.style.width = '216px';
-
- // Required for picker to render in IE
- if (mxClient.IS_IE)
- {
- input.style.marginTop = '10px';
- document.body.appendChild(input);
- }
-
- var applyFunction = (apply != null) ? apply : this.createApplyFunction();
-
- function doApply()
- {
- var color = input.value;
-
- // Blocks any non-alphabetic chars in colors
- if (/(^#?[a-zA-Z0-9]*$)/.test(color))
- {
- if (color != 'none' && color.charAt(0) != '#')
- {
- color = '#' + color;
- }
-
- ColorDialog.addRecentColor((color != 'none') ? color.substring(1) : color, 12);
- applyFunction(color);
- editorUi.hideDialog();
- }
- else
- {
- editorUi.handleError({message: mxResources.get('invalidInput')});
- }
- };
-
- this.init = function()
- {
- if (!mxClient.IS_TOUCH)
- {
- input.focus();
- }
- };
-
- var picker = new mxJSColor.color(input);
- picker.pickerOnfocus = false;
- picker.showPicker();
-
- var div = document.createElement('div');
- mxJSColor.picker.box.style.position = 'relative';
- mxJSColor.picker.box.style.width = '230px';
- mxJSColor.picker.box.style.height = '100px';
- mxJSColor.picker.box.style.paddingBottom = '10px';
- div.appendChild(mxJSColor.picker.box);
-
- var center = document.createElement('center');
-
- function createRecentColorTable()
- {
- var table = addPresets((ColorDialog.recentColors.length == 0) ? ['FFFFFF'] :
- ColorDialog.recentColors, 11, 'FFFFFF', true);
- table.style.marginBottom = '8px';
-
- return table;
- };
-
- function addPresets(presets, rowLength, defaultColor, addResetOption)
- {
- rowLength = (rowLength != null) ? rowLength : 12;
- var table = document.createElement('table');
- table.style.borderCollapse = 'collapse';
- table.setAttribute('cellspacing', '0');
- table.style.marginBottom = '20px';
- table.style.cellSpacing = '0px';
- var tbody = document.createElement('tbody');
- table.appendChild(tbody);
-
- var rows = presets.length / rowLength;
-
- for (var row = 0; row < rows; row++)
- {
- var tr = document.createElement('tr');
-
- for (var i = 0; i < rowLength; i++)
- {
- (function(clr)
- {
- var td = document.createElement('td');
- td.style.border = '1px solid black';
- td.style.padding = '0px';
- td.style.width = '16px';
- td.style.height = '16px';
-
- if (clr == null)
- {
- clr = defaultColor;
- }
-
- if (clr == 'none')
- {
- td.style.background = 'url(\'' + Dialog.prototype.noColorImage + '\')';
- }
- else
- {
- td.style.backgroundColor = '#' + clr;
- }
-
- tr.appendChild(td);
-
- if (clr != null)
- {
- td.style.cursor = 'pointer';
-
- mxEvent.addListener(td, 'click', function()
- {
- if (clr == 'none')
- {
- picker.fromString('ffffff');
- input.value = 'none';
- }
- else
- {
- picker.fromString(clr);
- }
- });
-
- mxEvent.addListener(td, 'dblclick', doApply);
- }
- })(presets[row * rowLength + i]);
- }
-
- tbody.appendChild(tr);
- }
-
- if (addResetOption)
- {
- var td = document.createElement('td');
- td.setAttribute('title', mxResources.get('reset'));
- td.style.border = '1px solid black';
- td.style.padding = '0px';
- td.style.width = '16px';
- td.style.height = '16px';
- td.style.backgroundImage = 'url(\'' + Dialog.prototype.closeImage + '\')';
- td.style.backgroundPosition = 'center center';
- td.style.backgroundRepeat = 'no-repeat';
- td.style.cursor = 'pointer';
-
- tr.appendChild(td);
-
- mxEvent.addListener(td, 'click', function()
- {
- ColorDialog.resetRecentColors();
- table.parentNode.replaceChild(createRecentColorTable(), table);
- });
- }
-
- center.appendChild(table);
-
- return table;
- };
-
- div.appendChild(input);
- mxUtils.br(div);
-
- // Adds recent colors
- createRecentColorTable();
-
- // Adds presets
- var table = addPresets(this.presetColors);
- table.style.marginBottom = '8px';
- table = addPresets(this.defaultColors);
- table.style.marginBottom = '16px';
-
- div.appendChild(center);
-
- var buttons = document.createElement('div');
- buttons.style.textAlign = 'right';
- buttons.style.whiteSpace = 'nowrap';
-
- var cancelBtn = mxUtils.button(mxResources.get('cancel'), function()
- {
- editorUi.hideDialog();
-
- if (cancelFn != null)
- {
- cancelFn();
- }
- });
- cancelBtn.className = 'geBtn';
-
- if (editorUi.editor.cancelFirst)
- {
- buttons.appendChild(cancelBtn);
- }
-
- var applyBtn = mxUtils.button(mxResources.get('apply'), doApply);
- applyBtn.className = 'geBtn gePrimaryBtn';
- buttons.appendChild(applyBtn);
-
- if (!editorUi.editor.cancelFirst)
- {
- buttons.appendChild(cancelBtn);
- }
-
- if (color != null)
- {
- if (color == 'none')
- {
- picker.fromString('ffffff');
- input.value = 'none';
- }
- else
- {
- picker.fromString(color);
- }
- }
-
- div.appendChild(buttons);
- this.picker = picker;
- this.colorInput = input;
-
- // LATER: Only fires if input if focused, should always
- // fire if this dialog is showing.
- mxEvent.addListener(div, 'keydown', function(e)
- {
- if (e.keyCode == 27)
- {
- editorUi.hideDialog();
-
- if (cancelFn != null)
- {
- cancelFn();
- }
-
- mxEvent.consume(e);
- }
- });
-
- this.container = div;
-};
-
-/**
- * Creates function to apply value
- */
-ColorDialog.prototype.presetColors = ['E6D0DE', 'CDA2BE', 'B5739D', 'E1D5E7', 'C3ABD0', 'A680B8', 'D4E1F5', 'A9C4EB', '7EA6E0', 'D5E8D4', '9AC7BF', '67AB9F', 'D5E8D4', 'B9E0A5', '97D077', 'FFF2CC', 'FFE599', 'FFD966', 'FFF4C3', 'FFCE9F', 'FFB570', 'F8CECC', 'F19C99', 'EA6B66'];
-
-/**
- * Creates function to apply value
- */
-ColorDialog.prototype.defaultColors = ['none', 'FFFFFF', 'E6E6E6', 'CCCCCC', 'B3B3B3', '999999', '808080', '666666', '4D4D4D', '333333', '1A1A1A', '000000', 'FFCCCC', 'FFE6CC', 'FFFFCC', 'E6FFCC', 'CCFFCC', 'CCFFE6', 'CCFFFF', 'CCE5FF', 'CCCCFF', 'E5CCFF', 'FFCCFF', 'FFCCE6',
- 'FF9999', 'FFCC99', 'FFFF99', 'CCFF99', '99FF99', '99FFCC', '99FFFF', '99CCFF', '9999FF', 'CC99FF', 'FF99FF', 'FF99CC', 'FF6666', 'FFB366', 'FFFF66', 'B3FF66', '66FF66', '66FFB3', '66FFFF', '66B2FF', '6666FF', 'B266FF', 'FF66FF', 'FF66B3', 'FF3333', 'FF9933', 'FFFF33',
- '99FF33', '33FF33', '33FF99', '33FFFF', '3399FF', '3333FF', '9933FF', 'FF33FF', 'FF3399', 'FF0000', 'FF8000', 'FFFF00', '80FF00', '00FF00', '00FF80', '00FFFF', '007FFF', '0000FF', '7F00FF', 'FF00FF', 'FF0080', 'CC0000', 'CC6600', 'CCCC00', '66CC00', '00CC00', '00CC66',
- '00CCCC', '0066CC', '0000CC', '6600CC', 'CC00CC', 'CC0066', '990000', '994C00', '999900', '4D9900', '009900', '00994D', '009999', '004C99', '000099', '4C0099', '990099', '99004D', '660000', '663300', '666600', '336600', '006600', '006633', '006666', '003366', '000066',
- '330066', '660066', '660033', '330000', '331A00', '333300', '1A3300', '003300', '00331A', '003333', '001933', '000033', '190033', '330033', '33001A'];
-
-/**
- * Creates function to apply value
- */
-ColorDialog.prototype.createApplyFunction = function()
-{
- return mxUtils.bind(this, function(color)
- {
- var graph = this.editorUi.editor.graph;
-
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles(this.currentColorKey, color);
- this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [this.currentColorKey],
- 'values', [color], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- });
-};
-
-/**
- *
- */
-ColorDialog.recentColors = [];
-
-/**
- * Adds recent color for later use.
- */
-ColorDialog.addRecentColor = function(color, max)
-{
- if (color != null)
- {
- mxUtils.remove(color, ColorDialog.recentColors);
- ColorDialog.recentColors.splice(0, 0, color);
-
- if (ColorDialog.recentColors.length >= max)
- {
- ColorDialog.recentColors.pop();
- }
- }
-};
-
-/**
- * Adds recent color for later use.
- */
-ColorDialog.resetRecentColors = function()
-{
- ColorDialog.recentColors = [];
-};
-
-/**
- * Constructs a new about dialog.
- */
-var AboutDialog = function(editorUi)
-{
- var div = document.createElement('div');
- div.setAttribute('align', 'center');
- var h3 = document.createElement('h3');
- mxUtils.write(h3, mxResources.get('about') + ' GraphEditor');
- div.appendChild(h3);
- var img = document.createElement('img');
- img.style.border = '0px';
- img.setAttribute('width', '176');
- img.setAttribute('width', '151');
- img.setAttribute('src', IMAGE_PATH + '/logo.png');
- div.appendChild(img);
- mxUtils.br(div);
- mxUtils.write(div, 'Powered by mxGraph ' + mxClient.VERSION);
- mxUtils.br(div);
- var link = document.createElement('a');
- link.setAttribute('href', 'http://www.jgraph.com/');
- link.setAttribute('target', '_blank');
- mxUtils.write(link, 'www.jgraph.com');
- div.appendChild(link);
- mxUtils.br(div);
- mxUtils.br(div);
- var closeBtn = mxUtils.button(mxResources.get('close'), function()
- {
- editorUi.hideDialog();
- });
- closeBtn.className = 'geBtn gePrimaryBtn';
- div.appendChild(closeBtn);
-
- this.container = div;
-};
-
-/**
- * Constructs a new textarea dialog.
- */
-var TextareaDialog = function(editorUi, title, url, fn, cancelFn, cancelTitle, w, h,
- addButtons, noHide, noWrap, applyTitle, helpLink, customButtons)
-{
- w = (w != null) ? w : 300;
- h = (h != null) ? h : 120;
- noHide = (noHide != null) ? noHide : false;
- var row, td;
-
- var table = document.createElement('table');
- var tbody = document.createElement('tbody');
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- td.style.width = '100px';
- mxUtils.write(td, title);
-
- row.appendChild(td);
- tbody.appendChild(row);
-
- row = document.createElement('tr');
- td = document.createElement('td');
-
- var nameInput = document.createElement('textarea');
-
- if (noWrap)
- {
- nameInput.setAttribute('wrap', 'off');
- }
-
- nameInput.setAttribute('spellcheck', 'false');
- nameInput.setAttribute('autocorrect', 'off');
- nameInput.setAttribute('autocomplete', 'off');
- nameInput.setAttribute('autocapitalize', 'off');
-
- mxUtils.write(nameInput, url || '');
- nameInput.style.resize = 'none';
- nameInput.style.width = w + 'px';
- nameInput.style.height = h + 'px';
-
- this.textarea = nameInput;
-
- this.init = function()
- {
- nameInput.focus();
- nameInput.scrollTop = 0;
- };
-
- td.appendChild(nameInput);
- row.appendChild(td);
-
- tbody.appendChild(row);
-
- row = document.createElement('tr');
- td = document.createElement('td');
- td.style.paddingTop = '14px';
- td.style.whiteSpace = 'nowrap';
- td.setAttribute('align', 'right');
-
- if (helpLink != null)
- {
- var helpBtn = mxUtils.button(mxResources.get('help'), function()
- {
- editorUi.editor.graph.openLink(helpLink);
- });
- helpBtn.className = 'geBtn';
-
- td.appendChild(helpBtn);
- }
-
- if (customButtons != null)
- {
- for (var i = 0; i < customButtons.length; i++)
- {
- (function(label, fn)
- {
- var customBtn = mxUtils.button(label, function(e)
- {
- fn(e, nameInput);
- });
- customBtn.className = 'geBtn';
-
- td.appendChild(customBtn);
- })(customButtons[i][0], customButtons[i][1]);
- }
- }
-
- var cancelBtn = mxUtils.button(cancelTitle || mxResources.get('cancel'), function()
- {
- editorUi.hideDialog();
-
- if (cancelFn != null)
- {
- cancelFn();
- }
- });
- cancelBtn.className = 'geBtn';
-
- if (editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- }
-
- if (addButtons != null)
- {
- addButtons(td, nameInput);
- }
-
- if (fn != null)
- {
- var genericBtn = mxUtils.button(applyTitle || mxResources.get('apply'), function()
- {
- if (!noHide)
- {
- editorUi.hideDialog();
- }
-
- fn(nameInput.value);
- });
-
- genericBtn.className = 'geBtn gePrimaryBtn';
- td.appendChild(genericBtn);
- }
-
- if (!editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- }
-
- row.appendChild(td);
- tbody.appendChild(row);
- table.appendChild(tbody);
- this.container = table;
-};
-
-/**
- * Constructs a new edit file dialog.
- */
-var EditDiagramDialog = function(editorUi)
-{
- var div = document.createElement('div');
- div.style.textAlign = 'right';
- var textarea = document.createElement('textarea');
- textarea.setAttribute('wrap', 'off');
- textarea.setAttribute('spellcheck', 'false');
- textarea.setAttribute('autocorrect', 'off');
- textarea.setAttribute('autocomplete', 'off');
- textarea.setAttribute('autocapitalize', 'off');
- textarea.style.overflow = 'auto';
- textarea.style.resize = 'none';
- textarea.style.width = '600px';
- textarea.style.height = '360px';
- textarea.style.marginBottom = '16px';
-
- textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
- div.appendChild(textarea);
-
- this.init = function()
- {
- textarea.focus();
- };
-
- // Enables dropping files
- if (Graph.fileSupport)
- {
- function handleDrop(evt)
- {
- evt.stopPropagation();
- evt.preventDefault();
-
- if (evt.dataTransfer.files.length > 0)
- {
- var file = evt.dataTransfer.files[0];
- var reader = new FileReader();
-
- reader.onload = function(e)
- {
- textarea.value = e.target.result;
- };
-
- reader.readAsText(file);
- }
- else
- {
- textarea.value = editorUi.extractGraphModelFromEvent(evt);
- }
- };
-
- function handleDragOver(evt)
- {
- evt.stopPropagation();
- evt.preventDefault();
- };
-
- // Setup the dnd listeners.
- textarea.addEventListener('dragover', handleDragOver, false);
- textarea.addEventListener('drop', handleDrop, false);
- }
-
- var cancelBtn = mxUtils.button(mxResources.get('cancel'), function()
- {
- editorUi.hideDialog();
- });
- cancelBtn.className = 'geBtn';
-
- if (editorUi.editor.cancelFirst)
- {
- div.appendChild(cancelBtn);
- }
-
- var select = document.createElement('select');
- select.style.width = '180px';
- select.className = 'geBtn';
-
- if (editorUi.editor.graph.isEnabled())
- {
- var replaceOption = document.createElement('option');
- replaceOption.setAttribute('value', 'replace');
- mxUtils.write(replaceOption, mxResources.get('replaceExistingDrawing'));
- select.appendChild(replaceOption);
- }
-
- var newOption = document.createElement('option');
- newOption.setAttribute('value', 'new');
- mxUtils.write(newOption, mxResources.get('openInNewWindow'));
-
- if (EditDiagramDialog.showNewWindowOption)
- {
- select.appendChild(newOption);
- }
-
- if (editorUi.editor.graph.isEnabled())
- {
- var importOption = document.createElement('option');
- importOption.setAttribute('value', 'import');
- mxUtils.write(importOption, mxResources.get('addToExistingDrawing'));
- select.appendChild(importOption);
- }
-
- div.appendChild(select);
-
- var okBtn = mxUtils.button(mxResources.get('ok'), function()
- {
- // Removes all illegal control characters before parsing
- var data = Graph.zapGremlins(mxUtils.trim(textarea.value));
- var error = null;
-
- if (select.value == 'new')
- {
- editorUi.hideDialog();
- editorUi.editor.editAsNew(data);
- }
- else if (select.value == 'replace')
- {
- editorUi.editor.graph.model.beginUpdate();
- try
- {
- editorUi.editor.setGraphXml(mxUtils.parseXml(data).documentElement);
- // LATER: Why is hideDialog between begin-/endUpdate faster?
- editorUi.hideDialog();
- }
- catch (e)
- {
- error = e;
- }
- finally
- {
- editorUi.editor.graph.model.endUpdate();
- }
- }
- else if (select.value == 'import')
- {
- editorUi.editor.graph.model.beginUpdate();
- try
- {
- var doc = mxUtils.parseXml(data);
- var model = new mxGraphModel();
- var codec = new mxCodec(doc);
- codec.decode(doc.documentElement, model);
-
- var children = model.getChildren(model.getChildAt(model.getRoot(), 0));
- editorUi.editor.graph.setSelectionCells(editorUi.editor.graph.importCells(children));
-
- // LATER: Why is hideDialog between begin-/endUpdate faster?
- editorUi.hideDialog();
- }
- catch (e)
- {
- error = e;
- }
- finally
- {
- editorUi.editor.graph.model.endUpdate();
- }
- }
-
- if (error != null)
- {
- mxUtils.alert(error.message);
- }
- });
- okBtn.className = 'geBtn gePrimaryBtn';
- div.appendChild(okBtn);
-
- if (!editorUi.editor.cancelFirst)
- {
- div.appendChild(cancelBtn);
- }
-
- this.container = div;
-};
-
-/**
- *
- */
-EditDiagramDialog.showNewWindowOption = true;
-
-/**
- * Constructs a new export dialog.
- */
-var ExportDialog = function(editorUi)
-{
- var graph = editorUi.editor.graph;
- var bounds = graph.getGraphBounds();
- var scale = graph.view.scale;
-
- var width = Math.ceil(bounds.width / scale);
- var height = Math.ceil(bounds.height / scale);
-
- var row, td;
-
- var table = document.createElement('table');
- var tbody = document.createElement('tbody');
- table.setAttribute('cellpadding', (mxClient.IS_SF) ? '0' : '2');
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- td.style.width = '100px';
- mxUtils.write(td, mxResources.get('filename') + ':');
-
- row.appendChild(td);
-
- var nameInput = document.createElement('input');
- nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
- nameInput.style.width = '180px';
-
- td = document.createElement('td');
- td.appendChild(nameInput);
- row.appendChild(td);
-
- tbody.appendChild(row);
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- mxUtils.write(td, mxResources.get('format') + ':');
-
- row.appendChild(td);
-
- var imageFormatSelect = document.createElement('select');
- imageFormatSelect.style.width = '180px';
-
- var pngOption = document.createElement('option');
- pngOption.setAttribute('value', 'png');
- mxUtils.write(pngOption, mxResources.get('formatPng'));
- imageFormatSelect.appendChild(pngOption);
-
- var gifOption = document.createElement('option');
-
- if (ExportDialog.showGifOption)
- {
- gifOption.setAttribute('value', 'gif');
- mxUtils.write(gifOption, mxResources.get('formatGif'));
- imageFormatSelect.appendChild(gifOption);
- }
-
- var jpgOption = document.createElement('option');
- jpgOption.setAttribute('value', 'jpg');
- mxUtils.write(jpgOption, mxResources.get('formatJpg'));
- imageFormatSelect.appendChild(jpgOption);
-
- var pdfOption = document.createElement('option');
- pdfOption.setAttribute('value', 'pdf');
- mxUtils.write(pdfOption, mxResources.get('formatPdf'));
- imageFormatSelect.appendChild(pdfOption);
-
- var svgOption = document.createElement('option');
- svgOption.setAttribute('value', 'svg');
- mxUtils.write(svgOption, mxResources.get('formatSvg'));
- imageFormatSelect.appendChild(svgOption);
-
- if (ExportDialog.showXmlOption)
- {
- var xmlOption = document.createElement('option');
- xmlOption.setAttribute('value', 'xml');
- mxUtils.write(xmlOption, mxResources.get('formatXml'));
- imageFormatSelect.appendChild(xmlOption);
- }
-
- td = document.createElement('td');
- td.appendChild(imageFormatSelect);
- row.appendChild(td);
-
- tbody.appendChild(row);
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- mxUtils.write(td, mxResources.get('zoom') + ' (%):');
-
- row.appendChild(td);
-
- var zoomInput = document.createElement('input');
- zoomInput.setAttribute('type', 'number');
- zoomInput.setAttribute('value', '100');
- zoomInput.style.width = '180px';
-
- td = document.createElement('td');
- td.appendChild(zoomInput);
- row.appendChild(td);
-
- tbody.appendChild(row);
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- mxUtils.write(td, mxResources.get('width') + ':');
-
- row.appendChild(td);
-
- var widthInput = document.createElement('input');
- widthInput.setAttribute('value', width);
- widthInput.style.width = '180px';
-
- td = document.createElement('td');
- td.appendChild(widthInput);
- row.appendChild(td);
-
- tbody.appendChild(row);
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- mxUtils.write(td, mxResources.get('height') + ':');
-
- row.appendChild(td);
-
- var heightInput = document.createElement('input');
- heightInput.setAttribute('value', height);
- heightInput.style.width = '180px';
-
- td = document.createElement('td');
- td.appendChild(heightInput);
- row.appendChild(td);
-
- tbody.appendChild(row);
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- mxUtils.write(td, mxResources.get('dpi') + ':');
-
- row.appendChild(td);
-
- var dpiSelect = document.createElement('select');
- dpiSelect.style.width = '180px';
-
- var dpi100Option = document.createElement('option');
- dpi100Option.setAttribute('value', '100');
- mxUtils.write(dpi100Option, '100dpi');
- dpiSelect.appendChild(dpi100Option);
-
- var dpi200Option = document.createElement('option');
- dpi200Option.setAttribute('value', '200');
- mxUtils.write(dpi200Option, '200dpi');
- dpiSelect.appendChild(dpi200Option);
-
- var dpi300Option = document.createElement('option');
- dpi300Option.setAttribute('value', '300');
- mxUtils.write(dpi300Option, '300dpi');
- dpiSelect.appendChild(dpi300Option);
-
- var dpi400Option = document.createElement('option');
- dpi400Option.setAttribute('value', '400');
- mxUtils.write(dpi400Option, '400dpi');
- dpiSelect.appendChild(dpi400Option);
-
- var dpiCustOption = document.createElement('option');
- dpiCustOption.setAttribute('value', 'custom');
- mxUtils.write(dpiCustOption, mxResources.get('custom'));
- dpiSelect.appendChild(dpiCustOption);
-
- var customDpi = document.createElement('input');
- customDpi.style.width = '180px';
- customDpi.style.display = 'none';
- customDpi.setAttribute('value', '100');
- customDpi.setAttribute('type', 'number');
- customDpi.setAttribute('min', '50');
- customDpi.setAttribute('step', '50');
-
- var zoomUserChanged = false;
-
- mxEvent.addListener(dpiSelect, 'change', function()
- {
- if (this.value == 'custom')
- {
- this.style.display = 'none';
- customDpi.style.display = '';
- customDpi.focus();
- }
- else
- {
- customDpi.value = this.value;
-
- if (!zoomUserChanged)
- {
- zoomInput.value = this.value;
- }
- }
- });
-
- mxEvent.addListener(customDpi, 'change', function()
- {
- var dpi = parseInt(customDpi.value);
-
- if (isNaN(dpi) || dpi <= 0)
- {
- customDpi.style.backgroundColor = 'red';
- }
- else
- {
- customDpi.style.backgroundColor = '';
-
- if (!zoomUserChanged)
- {
- zoomInput.value = dpi;
- }
- }
- });
-
- td = document.createElement('td');
- td.appendChild(dpiSelect);
- td.appendChild(customDpi);
- row.appendChild(td);
-
- tbody.appendChild(row);
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- mxUtils.write(td, mxResources.get('background') + ':');
-
- row.appendChild(td);
-
- var transparentCheckbox = document.createElement('input');
- transparentCheckbox.setAttribute('type', 'checkbox');
- transparentCheckbox.checked = graph.background == null || graph.background == mxConstants.NONE;
-
- td = document.createElement('td');
- td.appendChild(transparentCheckbox);
- mxUtils.write(td, mxResources.get('transparent'));
-
- row.appendChild(td);
-
- tbody.appendChild(row);
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- mxUtils.write(td, mxResources.get('borderWidth') + ':');
-
- row.appendChild(td);
-
- var borderInput = document.createElement('input');
- borderInput.setAttribute('type', 'number');
- borderInput.setAttribute('value', ExportDialog.lastBorderValue);
- borderInput.style.width = '180px';
-
- td = document.createElement('td');
- td.appendChild(borderInput);
- row.appendChild(td);
-
- tbody.appendChild(row);
- table.appendChild(tbody);
-
- // Handles changes in the export format
- function formatChanged()
- {
- var name = nameInput.value;
- var dot = name.lastIndexOf('.');
-
- if (dot > 0)
- {
- nameInput.value = name.substring(0, dot + 1) + imageFormatSelect.value;
- }
- else
- {
- nameInput.value = name + '.' + imageFormatSelect.value;
- }
-
- if (imageFormatSelect.value === 'xml')
- {
- zoomInput.setAttribute('disabled', 'true');
- widthInput.setAttribute('disabled', 'true');
- heightInput.setAttribute('disabled', 'true');
- borderInput.setAttribute('disabled', 'true');
- }
- else
- {
- zoomInput.removeAttribute('disabled');
- widthInput.removeAttribute('disabled');
- heightInput.removeAttribute('disabled');
- borderInput.removeAttribute('disabled');
- }
-
- if (imageFormatSelect.value === 'png' || imageFormatSelect.value === 'svg' || imageFormatSelect.value === 'pdf')
- {
- transparentCheckbox.removeAttribute('disabled');
- }
- else
- {
- transparentCheckbox.setAttribute('disabled', 'disabled');
- }
-
- if (imageFormatSelect.value === 'png')
- {
- dpiSelect.removeAttribute('disabled');
- customDpi.removeAttribute('disabled');
- }
- else
- {
- dpiSelect.setAttribute('disabled', 'disabled');
- customDpi.setAttribute('disabled', 'disabled');
- }
- };
-
- mxEvent.addListener(imageFormatSelect, 'change', formatChanged);
- formatChanged();
-
- function checkValues()
- {
- if (widthInput.value * heightInput.value > MAX_AREA || widthInput.value <= 0)
- {
- widthInput.style.backgroundColor = 'red';
- }
- else
- {
- widthInput.style.backgroundColor = '';
- }
-
- if (widthInput.value * heightInput.value > MAX_AREA || heightInput.value <= 0)
- {
- heightInput.style.backgroundColor = 'red';
- }
- else
- {
- heightInput.style.backgroundColor = '';
- }
- };
-
- mxEvent.addListener(zoomInput, 'change', function()
- {
- zoomUserChanged = true;
- var s = Math.max(0, parseFloat(zoomInput.value) || 100) / 100;
- zoomInput.value = parseFloat((s * 100).toFixed(2));
-
- if (width > 0)
- {
- widthInput.value = Math.floor(width * s);
- heightInput.value = Math.floor(height * s);
- }
- else
- {
- zoomInput.value = '100';
- widthInput.value = width;
- heightInput.value = height;
- }
-
- checkValues();
- });
-
- mxEvent.addListener(widthInput, 'change', function()
- {
- var s = parseInt(widthInput.value) / width;
-
- if (s > 0)
- {
- zoomInput.value = parseFloat((s * 100).toFixed(2));
- heightInput.value = Math.floor(height * s);
- }
- else
- {
- zoomInput.value = '100';
- widthInput.value = width;
- heightInput.value = height;
- }
-
- checkValues();
- });
-
- mxEvent.addListener(heightInput, 'change', function()
- {
- var s = parseInt(heightInput.value) / height;
-
- if (s > 0)
- {
- zoomInput.value = parseFloat((s * 100).toFixed(2));
- widthInput.value = Math.floor(width * s);
- }
- else
- {
- zoomInput.value = '100';
- widthInput.value = width;
- heightInput.value = height;
- }
-
- checkValues();
- });
-
- row = document.createElement('tr');
- td = document.createElement('td');
- td.setAttribute('align', 'right');
- td.style.paddingTop = '22px';
- td.colSpan = 2;
-
- var saveBtn = mxUtils.button(mxResources.get('export'), mxUtils.bind(this, function()
- {
- if (parseInt(zoomInput.value) <= 0)
- {
- mxUtils.alert(mxResources.get('drawingEmpty'));
- }
- else
- {
- var name = nameInput.value;
- var format = imageFormatSelect.value;
- var s = Math.max(0, parseFloat(zoomInput.value) || 100) / 100;
- var b = Math.max(0, parseInt(borderInput.value));
- var bg = graph.background;
- var dpi = Math.max(1, parseInt(customDpi.value));
-
- if ((format == 'svg' || format == 'png' || format == 'pdf') && transparentCheckbox.checked)
- {
- bg = null;
- }
- else if (bg == null || bg == mxConstants.NONE)
- {
- bg = '#ffffff';
- }
-
- ExportDialog.lastBorderValue = b;
- ExportDialog.exportFile(editorUi, name, format, bg, s, b, dpi);
- }
- }));
- saveBtn.className = 'geBtn gePrimaryBtn';
-
- var cancelBtn = mxUtils.button(mxResources.get('cancel'), function()
- {
- editorUi.hideDialog();
- });
- cancelBtn.className = 'geBtn';
-
- if (editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- td.appendChild(saveBtn);
- }
- else
- {
- td.appendChild(saveBtn);
- td.appendChild(cancelBtn);
- }
-
- row.appendChild(td);
- tbody.appendChild(row);
- table.appendChild(tbody);
- this.container = table;
-};
-
-/**
- * Remembers last value for border.
- */
-ExportDialog.lastBorderValue = 0;
-
-/**
- * Global switches for the export dialog.
- */
-ExportDialog.showGifOption = true;
-
-/**
- * Global switches for the export dialog.
- */
-ExportDialog.showXmlOption = true;
-
-/**
- * Hook for getting the export format. Returns null for the default
- * intermediate XML export format or a function that returns the
- * parameter and value to be used in the request in the form
- * key=value, where value should be URL encoded.
- */
-ExportDialog.exportFile = function(editorUi, name, format, bg, s, b, dpi)
-{
- var graph = editorUi.editor.graph;
-
- if (format == 'xml')
- {
- ExportDialog.saveLocalFile(editorUi, mxUtils.getXml(editorUi.editor.getGraphXml()), name, format);
- }
- else if (format == 'svg')
- {
- ExportDialog.saveLocalFile(editorUi, mxUtils.getXml(graph.getSvg(bg, s, b)), name, format);
- }
- else
- {
- var bounds = graph.getGraphBounds();
-
- // New image export
- var xmlDoc = mxUtils.createXmlDocument();
- var root = xmlDoc.createElement('output');
- xmlDoc.appendChild(root);
-
- // Renders graph. Offset will be multiplied with state's scale when painting state.
- var xmlCanvas = new mxXmlCanvas2D(root);
- xmlCanvas.translate(Math.floor((b / s - bounds.x) / graph.view.scale),
- Math.floor((b / s - bounds.y) / graph.view.scale));
- xmlCanvas.scale(s / graph.view.scale);
-
- var imgExport = new mxImageExport()
- imgExport.drawState(graph.getView().getState(graph.model.root), xmlCanvas);
-
- // Puts request data together
- var param = 'xml=' + encodeURIComponent(mxUtils.getXml(root));
- var w = Math.ceil(bounds.width * s / graph.view.scale + 2 * b);
- var h = Math.ceil(bounds.height * s / graph.view.scale + 2 * b);
-
- // Requests image if request is valid
- if (param.length <= MAX_REQUEST_SIZE && w * h < MAX_AREA)
- {
- editorUi.hideDialog();
- var req = new mxXmlRequest(EXPORT_URL, 'format=' + format +
- '&filename=' + encodeURIComponent(name) +
- '&bg=' + ((bg != null) ? bg : 'none') +
- '&w=' + w + '&h=' + h + '&' + param +
- '&dpi=' + dpi);
- req.simulate(document, '_blank');
- }
- else
- {
- mxUtils.alert(mxResources.get('drawingTooLarge'));
- }
- }
-};
-
-/**
- * Hook for getting the export format. Returns null for the default
- * intermediate XML export format or a function that returns the
- * parameter and value to be used in the request in the form
- * key=value, where value should be URL encoded.
- */
-ExportDialog.saveLocalFile = function(editorUi, data, filename, format)
-{
- if (data.length < MAX_REQUEST_SIZE)
- {
- editorUi.hideDialog();
- var req = new mxXmlRequest(SAVE_URL, 'xml=' + encodeURIComponent(data) + '&filename=' +
- encodeURIComponent(filename) + '&format=' + format);
- req.simulate(document, '_blank');
- }
- else
- {
- mxUtils.alert(mxResources.get('drawingTooLarge'));
- mxUtils.popup(xml);
- }
-};
-
-/**
- * Constructs a new metadata dialog.
- */
-var EditDataDialog = function(ui, cell)
-{
- var div = document.createElement('div');
- var graph = ui.editor.graph;
-
- var value = graph.getModel().getValue(cell);
-
- // Converts the value to an XML node
- if (!mxUtils.isNode(value))
- {
- var doc = mxUtils.createXmlDocument();
- var obj = doc.createElement('object');
- obj.setAttribute('label', value || '');
- value = obj;
- }
-
- var meta = {};
-
- try
- {
- var temp = mxUtils.getValue(ui.editor.graph.getCurrentCellStyle(cell), 'metaData', null);
-
- if (temp != null)
- {
- meta = JSON.parse(temp);
- }
- }
- catch (e)
- {
- // ignore
- }
-
- // Creates the dialog contents
- var form = new mxForm('properties');
- form.table.style.width = '100%';
-
- var attrs = value.attributes;
- var names = [];
- var texts = [];
- var count = 0;
-
- var id = (EditDataDialog.getDisplayIdForCell != null) ?
- EditDataDialog.getDisplayIdForCell(ui, cell) : null;
-
- var addRemoveButton = function(text, name)
- {
- var wrapper = document.createElement('div');
- wrapper.style.position = 'relative';
- wrapper.style.paddingRight = '20px';
- wrapper.style.boxSizing = 'border-box';
- wrapper.style.width = '100%';
-
- var removeAttr = document.createElement('a');
- var img = mxUtils.createImage(Dialog.prototype.closeImage);
- img.style.height = '9px';
- img.style.fontSize = '9px';
- img.style.marginBottom = (mxClient.IS_IE11) ? '-1px' : '5px';
-
- removeAttr.className = 'geButton';
- removeAttr.setAttribute('title', mxResources.get('delete'));
- removeAttr.style.position = 'absolute';
- removeAttr.style.top = '4px';
- removeAttr.style.right = '0px';
- removeAttr.style.margin = '0px';
- removeAttr.style.width = '9px';
- removeAttr.style.height = '9px';
- removeAttr.style.cursor = 'pointer';
- removeAttr.appendChild(img);
-
- var removeAttrFn = (function(name)
- {
- return function()
- {
- var count = 0;
-
- for (var j = 0; j < names.length; j++)
- {
- if (names[j] == name)
- {
- texts[j] = null;
- form.table.deleteRow(count + ((id != null) ? 1 : 0));
-
- break;
- }
-
- if (texts[j] != null)
- {
- count++;
- }
- }
- };
- })(name);
-
- mxEvent.addListener(removeAttr, 'click', removeAttrFn);
-
- var parent = text.parentNode;
- wrapper.appendChild(text);
- wrapper.appendChild(removeAttr);
- parent.appendChild(wrapper);
- };
-
- var addTextArea = function(index, name, value)
- {
- names[index] = name;
- texts[index] = form.addTextarea(names[count] + ':', value, 2);
- texts[index].style.width = '100%';
-
- if (value.indexOf('\n') > 0)
- {
- texts[index].setAttribute('rows', '2');
- }
-
- addRemoveButton(texts[index], name);
-
- if (meta[name] != null && meta[name].editable == false)
- {
- texts[index].setAttribute('disabled', 'disabled');
- }
- };
-
- var temp = [];
- var isLayer = graph.getModel().getParent(cell) == graph.getModel().getRoot();
-
- for (var i = 0; i < attrs.length; i++)
- {
- if ((isLayer || attrs[i].nodeName != 'label') && attrs[i].nodeName != 'placeholders')
- {
- temp.push({name: attrs[i].nodeName, value: attrs[i].nodeValue});
- }
- }
-
- // Sorts by name
- temp.sort(function(a, b)
- {
- if (a.name < b.name)
- {
- return -1;
- }
- else if (a.name > b.name)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- });
-
- if (id != null)
- {
- var text = document.createElement('div');
- text.style.width = '100%';
- text.style.fontSize = '11px';
- text.style.textAlign = 'center';
- mxUtils.write(text, id);
-
- form.addField(mxResources.get('id') + ':', text);
- }
-
- for (var i = 0; i < temp.length; i++)
- {
- addTextArea(count, temp[i].name, temp[i].value);
- count++;
- }
-
- var top = document.createElement('div');
- top.style.cssText = 'position:absolute;left:30px;right:30px;overflow-y:auto;top:30px;bottom:80px;';
- top.appendChild(form.table);
-
- var newProp = document.createElement('div');
- newProp.style.boxSizing = 'border-box';
- newProp.style.paddingRight = '160px';
- newProp.style.whiteSpace = 'nowrap';
- newProp.style.marginTop = '6px';
- newProp.style.width = '100%';
-
- var nameInput = document.createElement('input');
- nameInput.setAttribute('placeholder', mxResources.get('enterPropertyName'));
- nameInput.setAttribute('type', 'text');
- nameInput.setAttribute('size', (mxClient.IS_IE || mxClient.IS_IE11) ? '36' : '40');
- nameInput.style.boxSizing = 'border-box';
- nameInput.style.marginLeft = '2px';
- nameInput.style.width = '100%';
-
- newProp.appendChild(nameInput);
- top.appendChild(newProp);
- div.appendChild(top);
-
- var addBtn = mxUtils.button(mxResources.get('addProperty'), function()
- {
- var name = nameInput.value;
-
- // Avoid ':' in attribute names which seems to be valid in Chrome
- if (name.length > 0 && name != 'label' && name != 'placeholders' && name.indexOf(':') < 0)
- {
- try
- {
- var idx = mxUtils.indexOf(names, name);
-
- if (idx >= 0 && texts[idx] != null)
- {
- texts[idx].focus();
- }
- else
- {
- // Checks if the name is valid
- var clone = value.cloneNode(false);
- clone.setAttribute(name, '');
-
- if (idx >= 0)
- {
- names.splice(idx, 1);
- texts.splice(idx, 1);
- }
-
- names.push(name);
- var text = form.addTextarea(name + ':', '', 2);
- text.style.width = '100%';
- texts.push(text);
- addRemoveButton(text, name);
-
- text.focus();
- }
-
- addBtn.setAttribute('disabled', 'disabled');
- nameInput.value = '';
- }
- catch (e)
- {
- mxUtils.alert(e);
- }
- }
- else
- {
- mxUtils.alert(mxResources.get('invalidName'));
- }
- });
-
- this.init = function()
- {
- if (texts.length > 0)
- {
- texts[0].focus();
- }
- else
- {
- nameInput.focus();
- }
- };
-
- addBtn.setAttribute('title', mxResources.get('addProperty'));
- addBtn.setAttribute('disabled', 'disabled');
- addBtn.style.textOverflow = 'ellipsis';
- addBtn.style.position = 'absolute';
- addBtn.style.overflow = 'hidden';
- addBtn.style.width = '144px';
- addBtn.style.right = '0px';
- addBtn.className = 'geBtn';
- newProp.appendChild(addBtn);
-
- var cancelBtn = mxUtils.button(mxResources.get('cancel'), function()
- {
- ui.hideDialog.apply(ui, arguments);
- });
-
- cancelBtn.className = 'geBtn';
-
- var applyBtn = mxUtils.button(mxResources.get('apply'), function()
- {
- try
- {
- ui.hideDialog.apply(ui, arguments);
-
- // Clones and updates the value
- value = value.cloneNode(true);
- var removeLabel = false;
-
- for (var i = 0; i < names.length; i++)
- {
- if (texts[i] == null)
- {
- value.removeAttribute(names[i]);
- }
- else
- {
- value.setAttribute(names[i], texts[i].value);
- removeLabel = removeLabel || (names[i] == 'placeholder' &&
- value.getAttribute('placeholders') == '1');
- }
- }
-
- // Removes label if placeholder is assigned
- if (removeLabel)
- {
- value.removeAttribute('label');
- }
-
- // Updates the value of the cell (undoable)
- graph.getModel().setValue(cell, value);
- }
- catch (e)
- {
- mxUtils.alert(e);
- }
- });
- applyBtn.className = 'geBtn gePrimaryBtn';
-
- function updateAddBtn()
- {
- if (nameInput.value.length > 0)
- {
- addBtn.removeAttribute('disabled');
- }
- else
- {
- addBtn.setAttribute('disabled', 'disabled');
- }
- };
-
- mxEvent.addListener(nameInput, 'keyup', updateAddBtn);
-
- // Catches all changes that don't fire a keyup (such as paste via mouse)
- mxEvent.addListener(nameInput, 'change', updateAddBtn);
-
- var buttons = document.createElement('div');
- buttons.style.cssText = 'position:absolute;left:30px;right:30px;text-align:right;bottom:30px;height:40px;'
-
- if (ui.editor.graph.getModel().isVertex(cell) || ui.editor.graph.getModel().isEdge(cell))
- {
- var replace = document.createElement('span');
- replace.style.marginRight = '10px';
- var input = document.createElement('input');
- input.setAttribute('type', 'checkbox');
- input.style.marginRight = '6px';
-
- if (value.getAttribute('placeholders') == '1')
- {
- input.setAttribute('checked', 'checked');
- input.defaultChecked = true;
- }
-
- mxEvent.addListener(input, 'click', function()
- {
- if (value.getAttribute('placeholders') == '1')
- {
- value.removeAttribute('placeholders');
- }
- else
- {
- value.setAttribute('placeholders', '1');
- }
- });
-
- replace.appendChild(input);
- mxUtils.write(replace, mxResources.get('placeholders'));
-
- if (EditDataDialog.placeholderHelpLink != null)
- {
- var link = document.createElement('a');
- link.setAttribute('href', EditDataDialog.placeholderHelpLink);
- link.setAttribute('title', mxResources.get('help'));
- link.setAttribute('target', '_blank');
- link.style.marginLeft = '8px';
- link.style.cursor = 'help';
-
- var icon = document.createElement('img');
- mxUtils.setOpacity(icon, 50);
- icon.style.height = '16px';
- icon.style.width = '16px';
- icon.setAttribute('border', '0');
- icon.setAttribute('valign', 'middle');
- icon.style.marginTop = (mxClient.IS_IE11) ? '0px' : '-4px';
- icon.setAttribute('src', Editor.helpImage);
- link.appendChild(icon);
-
- replace.appendChild(link);
- }
-
- buttons.appendChild(replace);
- }
-
- if (ui.editor.cancelFirst)
- {
- buttons.appendChild(cancelBtn);
- buttons.appendChild(applyBtn);
- }
- else
- {
- buttons.appendChild(applyBtn);
- buttons.appendChild(cancelBtn);
- }
-
- div.appendChild(buttons);
- this.container = div;
-};
-
-/**
- * Optional help link.
- */
-EditDataDialog.getDisplayIdForCell = function(ui, cell)
-{
- var id = null;
-
- if (ui.editor.graph.getModel().getParent(cell) != null)
- {
- id = cell.getId();
- }
-
- return id;
-};
-
-/**
- * Optional help link.
- */
-EditDataDialog.placeholderHelpLink = null;
-
-/**
- * Constructs a new link dialog.
- */
-var LinkDialog = function(editorUi, initialValue, btnLabel, fn)
-{
- var div = document.createElement('div');
- mxUtils.write(div, mxResources.get('editLink') + ':');
-
- var inner = document.createElement('div');
- inner.className = 'geTitle';
- inner.style.backgroundColor = 'transparent';
- inner.style.borderColor = 'transparent';
- inner.style.whiteSpace = 'nowrap';
- inner.style.textOverflow = 'clip';
- inner.style.cursor = 'default';
-
- if (!mxClient.IS_VML)
- {
- inner.style.paddingRight = '20px';
- }
-
- var linkInput = document.createElement('input');
- linkInput.setAttribute('value', initialValue);
- linkInput.setAttribute('placeholder', 'http://www.example.com/');
- linkInput.setAttribute('type', 'text');
- linkInput.style.marginTop = '6px';
- linkInput.style.width = '400px';
- linkInput.style.backgroundImage = 'url(\'' + Dialog.prototype.clearImage + '\')';
- linkInput.style.backgroundRepeat = 'no-repeat';
- linkInput.style.backgroundPosition = '100% 50%';
- linkInput.style.paddingRight = '14px';
-
- var cross = document.createElement('div');
- cross.setAttribute('title', mxResources.get('reset'));
- cross.style.position = 'relative';
- cross.style.left = '-16px';
- cross.style.width = '12px';
- cross.style.height = '14px';
- cross.style.cursor = 'pointer';
-
- // Workaround for inline-block not supported in IE
- cross.style.display = (mxClient.IS_VML) ? 'inline' : 'inline-block';
- cross.style.top = ((mxClient.IS_VML) ? 0 : 3) + 'px';
-
- // Needed to block event transparency in IE
- cross.style.background = 'url(' + IMAGE_PATH + '/transparent.gif)';
-
- mxEvent.addListener(cross, 'click', function()
- {
- linkInput.value = '';
- linkInput.focus();
- });
-
- inner.appendChild(linkInput);
- inner.appendChild(cross);
- div.appendChild(inner);
-
- this.init = function()
- {
- linkInput.focus();
-
- if (mxClient.IS_GC || mxClient.IS_FF || document.documentMode >= 5 || mxClient.IS_QUIRKS)
- {
- linkInput.select();
- }
- else
- {
- document.execCommand('selectAll', false, null);
- }
- };
-
- var btns = document.createElement('div');
- btns.style.marginTop = '18px';
- btns.style.textAlign = 'right';
-
- mxEvent.addListener(linkInput, 'keypress', function(e)
- {
- if (e.keyCode == 13)
- {
- editorUi.hideDialog();
- fn(linkInput.value);
- }
- });
-
- var cancelBtn = mxUtils.button(mxResources.get('cancel'), function()
- {
- editorUi.hideDialog();
- });
- cancelBtn.className = 'geBtn';
-
- if (editorUi.editor.cancelFirst)
- {
- btns.appendChild(cancelBtn);
- }
-
- var mainBtn = mxUtils.button(btnLabel, function()
- {
- editorUi.hideDialog();
- fn(linkInput.value);
- });
- mainBtn.className = 'geBtn gePrimaryBtn';
- btns.appendChild(mainBtn);
-
- if (!editorUi.editor.cancelFirst)
- {
- btns.appendChild(cancelBtn);
- }
-
- div.appendChild(btns);
-
- this.container = div;
-};
-
-/**
- *
- */
-var OutlineWindow = function(editorUi, x, y, w, h)
-{
- var graph = editorUi.editor.graph;
-
- var div = document.createElement('div');
- div.style.position = 'absolute';
- div.style.width = '100%';
- div.style.height = '100%';
- div.style.border = '1px solid whiteSmoke';
- div.style.overflow = 'hidden';
-
- this.window = new mxWindow(mxResources.get('outline'), div, x, y, w, h, true, true);
- this.window.minimumSize = new mxRectangle(0, 0, 80, 80);
- this.window.destroyOnClose = false;
- this.window.setMaximizable(false);
- this.window.setResizable(true);
- this.window.setClosable(true);
- this.window.setVisible(true);
-
- this.window.setLocation = function(x, y)
- {
- var iw = window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth;
- var ih = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight;
-
- x = Math.max(0, Math.min(x, iw - this.table.clientWidth));
- y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48));
-
- if (this.getX() != x || this.getY() != y)
- {
- mxWindow.prototype.setLocation.apply(this, arguments);
- }
- };
-
- var resizeListener = mxUtils.bind(this, function()
- {
- var x = this.window.getX();
- var y = this.window.getY();
-
- this.window.setLocation(x, y);
- });
-
- mxEvent.addListener(window, 'resize', resizeListener);
-
- var outline = editorUi.createOutline(this.window);
-
- this.destroy = function()
- {
- mxEvent.removeListener(window, 'resize', resizeListener);
- this.window.destroy();
- outline.destroy();
- }
-
- this.window.addListener(mxEvent.RESIZE, mxUtils.bind(this, function()
- {
- outline.update(false);
- outline.outline.sizeDidChange();
- }));
-
- this.window.addListener(mxEvent.SHOW, mxUtils.bind(this, function()
- {
- this.window.fit();
- outline.suspended = false;
- outline.outline.refresh();
- outline.update();
- }));
-
- this.window.addListener(mxEvent.HIDE, mxUtils.bind(this, function()
- {
- outline.suspended = true;
- }));
-
- this.window.addListener(mxEvent.NORMALIZE, mxUtils.bind(this, function()
- {
- outline.suspended = false;
- outline.update();
- }));
-
- this.window.addListener(mxEvent.MINIMIZE, mxUtils.bind(this, function()
- {
- outline.suspended = true;
- }));
-
- var outlineCreateGraph = outline.createGraph;
- outline.createGraph = function(container)
- {
- var g = outlineCreateGraph.apply(this, arguments);
- g.gridEnabled = false;
- g.pageScale = graph.pageScale;
- g.pageFormat = graph.pageFormat;
- g.background = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background;
- g.pageVisible = graph.pageVisible;
-
- var current = mxUtils.getCurrentStyle(graph.container);
- div.style.backgroundColor = current.backgroundColor;
-
- return g;
- };
-
- function update()
- {
- outline.outline.pageScale = graph.pageScale;
- outline.outline.pageFormat = graph.pageFormat;
- outline.outline.pageVisible = graph.pageVisible;
- outline.outline.background = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background;;
-
- var current = mxUtils.getCurrentStyle(graph.container);
- div.style.backgroundColor = current.backgroundColor;
-
- if (graph.view.backgroundPageShape != null && outline.outline.view.backgroundPageShape != null)
- {
- outline.outline.view.backgroundPageShape.fill = graph.view.backgroundPageShape.fill;
- }
-
- outline.outline.refresh();
- };
-
- outline.init(div);
-
- editorUi.editor.addListener('resetGraphView', update);
- editorUi.addListener('pageFormatChanged', update);
- editorUi.addListener('backgroundColorChanged', update);
- editorUi.addListener('backgroundImageChanged', update);
- editorUi.addListener('pageViewChanged', function()
- {
- update();
- outline.update(true);
- });
-
- if (outline.outline.dialect == mxConstants.DIALECT_SVG)
- {
- var zoomInAction = editorUi.actions.get('zoomIn');
- var zoomOutAction = editorUi.actions.get('zoomOut');
-
- mxEvent.addMouseWheelListener(function(evt, up)
- {
- var outlineWheel = false;
- var source = mxEvent.getSource(evt);
-
- while (source != null)
- {
- if (source == outline.outline.view.canvas.ownerSVGElement)
- {
- outlineWheel = true;
- break;
- }
-
- source = source.parentNode;
- }
-
- if (outlineWheel)
- {
- if (up)
- {
- zoomInAction.funct();
- }
- else
- {
- zoomOutAction.funct();
- }
- }
- });
- }
-};
-
-/**
- *
- */
-var LayersWindow = function(editorUi, x, y, w, h)
-{
- var graph = editorUi.editor.graph;
-
- var div = document.createElement('div');
- div.style.userSelect = 'none';
- div.style.background = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor;
- div.style.border = '1px solid whiteSmoke';
- div.style.height = '100%';
- div.style.marginBottom = '10px';
- div.style.overflow = 'auto';
-
- var tbarHeight = (!EditorUi.compactUi) ? '30px' : '26px';
-
- var listDiv = document.createElement('div')
- listDiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? '#dcdcdc' : Dialog.backdropColor;
- listDiv.style.position = 'absolute';
- listDiv.style.overflow = 'auto';
- listDiv.style.left = '0px';
- listDiv.style.right = '0px';
- listDiv.style.top = '0px';
- listDiv.style.bottom = (parseInt(tbarHeight) + 7) + 'px';
- div.appendChild(listDiv);
-
- var dragSource = null;
- var dropIndex = null;
-
- mxEvent.addListener(div, 'dragover', function(evt)
- {
- evt.dataTransfer.dropEffect = 'move';
- dropIndex = 0;
- evt.stopPropagation();
- evt.preventDefault();
- });
-
- // Workaround for "no element found" error in FF
- mxEvent.addListener(div, 'drop', function(evt)
- {
- evt.stopPropagation();
- evt.preventDefault();
- });
-
- var layerCount = null;
- var selectionLayer = null;
- var ldiv = document.createElement('div');
-
- ldiv.className = 'geToolbarContainer';
- ldiv.style.position = 'absolute';
- ldiv.style.bottom = '0px';
- ldiv.style.left = '0px';
- ldiv.style.right = '0px';
- ldiv.style.height = tbarHeight;
- ldiv.style.overflow = 'hidden';
- ldiv.style.padding = (!EditorUi.compactUi) ? '1px' : '4px 0px 3px 0px';
- ldiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor;
- ldiv.style.borderWidth = '1px 0px 0px 0px';
- ldiv.style.borderColor = '#c3c3c3';
- ldiv.style.borderStyle = 'solid';
- ldiv.style.display = 'block';
- ldiv.style.whiteSpace = 'nowrap';
-
- if (mxClient.IS_QUIRKS)
- {
- ldiv.style.filter = 'none';
- }
-
- var link = document.createElement('a');
- link.className = 'geButton';
-
- if (mxClient.IS_QUIRKS)
- {
- link.style.filter = 'none';
- }
-
- var removeLink = link.cloneNode();
- removeLink.innerHTML = '<div class="geSprite geSprite-delete" style="display:inline-block;"></div>';
-
- mxEvent.addListener(removeLink, 'click', function(evt)
- {
- if (graph.isEnabled())
- {
- graph.model.beginUpdate();
- try
- {
- var index = graph.model.root.getIndex(selectionLayer);
- graph.removeCells([selectionLayer], false);
-
- // Creates default layer if no layer exists
- if (graph.model.getChildCount(graph.model.root) == 0)
- {
- graph.model.add(graph.model.root, new mxCell());
- graph.setDefaultParent(null);
- }
- else if (index > 0 && index <= graph.model.getChildCount(graph.model.root))
- {
- graph.setDefaultParent(graph.model.getChildAt(graph.model.root, index - 1));
- }
- else
- {
- graph.setDefaultParent(null);
- }
- }
- finally
- {
- graph.model.endUpdate();
- }
- }
-
- mxEvent.consume(evt);
- });
-
- if (!graph.isEnabled())
- {
- removeLink.className = 'geButton mxDisabled';
- }
-
- ldiv.appendChild(removeLink);
-
- var insertLink = link.cloneNode();
- insertLink.setAttribute('title', mxUtils.trim(mxResources.get('moveSelectionTo', ['...'])));
- insertLink.innerHTML = '<div class="geSprite geSprite-insert" style="display:inline-block;"></div>';
-
- mxEvent.addListener(insertLink, 'click', function(evt)
- {
- if (graph.isEnabled() && !graph.isSelectionEmpty())
- {
- var offset = mxUtils.getOffset(insertLink);
-
- editorUi.showPopupMenu(mxUtils.bind(this, function(menu, parent)
- {
- for (var i = layerCount - 1; i >= 0; i--)
- {
- (mxUtils.bind(this, function(child)
- {
- var item = menu.addItem(graph.convertValueToString(child) ||
- mxResources.get('background'), null, mxUtils.bind(this, function()
- {
- graph.moveCells(graph.getSelectionCells(), 0, 0, false, child);
- }), parent);
-
- if (graph.getSelectionCount() == 1 && graph.model.isAncestor(child, graph.getSelectionCell()))
- {
- menu.addCheckmark(item, Editor.checkmarkImage);
- }
-
- }))(graph.model.getChildAt(graph.model.root, i));
- }
- }), offset.x, offset.y + insertLink.offsetHeight, evt);
- }
- });
-
- ldiv.appendChild(insertLink);
-
- var dataLink = link.cloneNode();
- dataLink.innerHTML = '<div class="geSprite geSprite-dots" style="display:inline-block;"></div>';
- dataLink.setAttribute('title', mxResources.get('rename'));
-
- mxEvent.addListener(dataLink, 'click', function(evt)
- {
- if (graph.isEnabled())
- {
- editorUi.showDataDialog(selectionLayer);
- }
-
- mxEvent.consume(evt);
- });
-
- if (!graph.isEnabled())
- {
- dataLink.className = 'geButton mxDisabled';
- }
-
- ldiv.appendChild(dataLink);
-
- function renameLayer(layer)
- {
- if (graph.isEnabled() && layer != null)
- {
- var label = graph.convertValueToString(layer);
- var dlg = new FilenameDialog(editorUi, label || mxResources.get('background'), mxResources.get('rename'), mxUtils.bind(this, function(newValue)
- {
- if (newValue != null)
- {
- graph.cellLabelChanged(layer, newValue);
- }
- }), mxResources.get('enterName'));
- editorUi.showDialog(dlg.container, 300, 100, true, true);
- dlg.init();
- }
- };
-
- var duplicateLink = link.cloneNode();
- duplicateLink.innerHTML = '<div class="geSprite geSprite-duplicate" style="display:inline-block;"></div>';
-
- mxEvent.addListener(duplicateLink, 'click', function(evt)
- {
- if (graph.isEnabled())
- {
- var newCell = null;
- graph.model.beginUpdate();
- try
- {
- newCell = graph.cloneCell(selectionLayer);
- graph.cellLabelChanged(newCell, mxResources.get('untitledLayer'));
- newCell.setVisible(true);
- newCell = graph.addCell(newCell, graph.model.root);
- graph.setDefaultParent(newCell);
- }
- finally
- {
- graph.model.endUpdate();
- }
-
- if (newCell != null && !graph.isCellLocked(newCell))
- {
- graph.selectAll(newCell);
- }
- }
- });
-
- if (!graph.isEnabled())
- {
- duplicateLink.className = 'geButton mxDisabled';
- }
-
- ldiv.appendChild(duplicateLink);
-
- var addLink = link.cloneNode();
- addLink.innerHTML = '<div class="geSprite geSprite-plus" style="display:inline-block;"></div>';
- addLink.setAttribute('title', mxResources.get('addLayer'));
-
- mxEvent.addListener(addLink, 'click', function(evt)
- {
- if (graph.isEnabled())
- {
- graph.model.beginUpdate();
-
- try
- {
- var cell = graph.addCell(new mxCell(mxResources.get('untitledLayer')), graph.model.root);
- graph.setDefaultParent(cell);
- }
- finally
- {
- graph.model.endUpdate();
- }
- }
-
- mxEvent.consume(evt);
- });
-
- if (!graph.isEnabled())
- {
- addLink.className = 'geButton mxDisabled';
- }
-
- ldiv.appendChild(addLink);
- div.appendChild(ldiv);
-
- function refresh()
- {
- layerCount = graph.model.getChildCount(graph.model.root)
- listDiv.innerHTML = '';
-
- function addLayer(index, label, child, defaultParent)
- {
- var ldiv = document.createElement('div');
- ldiv.className = 'geToolbarContainer';
-
- ldiv.style.overflow = 'hidden';
- ldiv.style.position = 'relative';
- ldiv.style.padding = '4px';
- ldiv.style.height = '22px';
- ldiv.style.display = 'block';
- ldiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor;
- ldiv.style.borderWidth = '0px 0px 1px 0px';
- ldiv.style.borderColor = '#c3c3c3';
- ldiv.style.borderStyle = 'solid';
- ldiv.style.whiteSpace = 'nowrap';
- ldiv.setAttribute('title', label);
-
- var left = document.createElement('div');
- left.style.display = 'inline-block';
- left.style.width = '100%';
- left.style.textOverflow = 'ellipsis';
- left.style.overflow = 'hidden';
-
- mxEvent.addListener(ldiv, 'dragover', function(evt)
- {
- evt.dataTransfer.dropEffect = 'move';
- dropIndex = index;
- evt.stopPropagation();
- evt.preventDefault();
- });
-
- mxEvent.addListener(ldiv, 'dragstart', function(evt)
- {
- dragSource = ldiv;
-
- // Workaround for no DnD on DIV in FF
- if (mxClient.IS_FF)
- {
- // LATER: Check what triggers a parse as XML on this in FF after drop
- evt.dataTransfer.setData('Text', '<layer/>');
- }
- });
-
- mxEvent.addListener(ldiv, 'dragend', function(evt)
- {
- if (dragSource != null && dropIndex != null)
- {
- graph.addCell(child, graph.model.root, dropIndex);
- }
-
- dragSource = null;
- dropIndex = null;
- evt.stopPropagation();
- evt.preventDefault();
- });
-
- var btn = document.createElement('img');
- btn.setAttribute('draggable', 'false');
- btn.setAttribute('align', 'top');
- btn.setAttribute('border', '0');
- btn.style.padding = '4px';
- btn.setAttribute('title', mxResources.get('lockUnlock'));
-
- var style = graph.getCurrentCellStyle(child);
-
- if (mxUtils.getValue(style, 'locked', '0') == '1')
- {
- btn.setAttribute('src', Dialog.prototype.lockedImage);
- }
- else
- {
- btn.setAttribute('src', Dialog.prototype.unlockedImage);
- }
-
- if (graph.isEnabled())
- {
- btn.style.cursor = 'pointer';
- }
-
- mxEvent.addListener(btn, 'click', function(evt)
- {
- if (graph.isEnabled())
- {
- var value = null;
-
- graph.getModel().beginUpdate();
- try
- {
- value = (mxUtils.getValue(style, 'locked', '0') == '1') ? null : '1';
- graph.setCellStyles('locked', value, [child]);
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- if (value == '1')
- {
- graph.removeSelectionCells(graph.getModel().getDescendants(child));
- }
-
- mxEvent.consume(evt);
- }
- });
-
- left.appendChild(btn);
-
- var inp = document.createElement('input');
- inp.setAttribute('type', 'checkbox');
- inp.setAttribute('title', mxResources.get('hideIt', [child.value || mxResources.get('background')]));
- inp.style.marginLeft = '4px';
- inp.style.marginRight = '6px';
- inp.style.marginTop = '4px';
- left.appendChild(inp);
-
- if (graph.model.isVisible(child))
- {
- inp.setAttribute('checked', 'checked');
- inp.defaultChecked = true;
- }
-
- mxEvent.addListener(inp, 'click', function(evt)
- {
- graph.model.setVisible(child, !graph.model.isVisible(child));
- mxEvent.consume(evt);
- });
-
- mxUtils.write(left, label);
- ldiv.appendChild(left);
-
- if (graph.isEnabled())
- {
- // Fallback if no drag and drop is available
- if (mxClient.IS_TOUCH || mxClient.IS_POINTER || mxClient.IS_VML ||
- (mxClient.IS_IE && document.documentMode < 10))
- {
- var right = document.createElement('div');
- right.style.display = 'block';
- right.style.textAlign = 'right';
- right.style.whiteSpace = 'nowrap';
- right.style.position = 'absolute';
- right.style.right = '6px';
- right.style.top = '6px';
-
- // Poor man's change layer order
- if (index > 0)
- {
- var img2 = document.createElement('a');
-
- img2.setAttribute('title', mxResources.get('toBack'));
-
- img2.className = 'geButton';
- img2.style.cssFloat = 'none';
- img2.innerHTML = '&#9660;';
- img2.style.width = '14px';
- img2.style.height = '14px';
- img2.style.fontSize = '14px';
- img2.style.margin = '0px';
- img2.style.marginTop = '-1px';
- right.appendChild(img2);
-
- mxEvent.addListener(img2, 'click', function(evt)
- {
- if (graph.isEnabled())
- {
- graph.addCell(child, graph.model.root, index - 1);
- }
-
- mxEvent.consume(evt);
- });
- }
-
- if (index >= 0 && index < layerCount - 1)
- {
- var img1 = document.createElement('a');
-
- img1.setAttribute('title', mxResources.get('toFront'));
-
- img1.className = 'geButton';
- img1.style.cssFloat = 'none';
- img1.innerHTML = '&#9650;';
- img1.style.width = '14px';
- img1.style.height = '14px';
- img1.style.fontSize = '14px';
- img1.style.margin = '0px';
- img1.style.marginTop = '-1px';
- right.appendChild(img1);
-
- mxEvent.addListener(img1, 'click', function(evt)
- {
- if (graph.isEnabled())
- {
- graph.addCell(child, graph.model.root, index + 1);
- }
-
- mxEvent.consume(evt);
- });
- }
-
- ldiv.appendChild(right);
- }
-
- if (mxClient.IS_SVG && (!mxClient.IS_IE || document.documentMode >= 10))
- {
- ldiv.setAttribute('draggable', 'true');
- ldiv.style.cursor = 'move';
- }
- }
-
- mxEvent.addListener(ldiv, 'dblclick', function(evt)
- {
- var nodeName = mxEvent.getSource(evt).nodeName;
-
- if (nodeName != 'INPUT' && nodeName != 'IMG')
- {
- renameLayer(child);
- mxEvent.consume(evt);
- }
- });
-
- if (graph.getDefaultParent() == child)
- {
- ldiv.style.background = (Dialog.backdropColor == 'white') ? '#e6eff8' : '#505759';
- ldiv.style.fontWeight = (graph.isEnabled()) ? 'bold' : '';
- selectionLayer = child;
- }
- else
- {
- mxEvent.addListener(ldiv, 'click', function(evt)
- {
- if (graph.isEnabled())
- {
- graph.setDefaultParent(defaultParent);
- graph.view.setCurrentRoot(null);
- }
- });
- }
-
- listDiv.appendChild(ldiv);
- };
-
- // Cannot be moved or deleted
- for (var i = layerCount - 1; i >= 0; i--)
- {
- (mxUtils.bind(this, function(child)
- {
- addLayer(i, graph.convertValueToString(child) ||
- mxResources.get('background'), child, child);
- }))(graph.model.getChildAt(graph.model.root, i));
- }
-
- var label = graph.convertValueToString(selectionLayer) || mxResources.get('background');
- removeLink.setAttribute('title', mxResources.get('removeIt', [label]));
- duplicateLink.setAttribute('title', mxResources.get('duplicateIt', [label]));
- dataLink.setAttribute('title', mxResources.get('editData'));
-
- if (graph.isSelectionEmpty())
- {
- insertLink.className = 'geButton mxDisabled';
- }
- };
-
- refresh();
- graph.model.addListener(mxEvent.CHANGE, refresh);
- graph.addListener('defaultParentChanged', refresh);
-
- graph.selectionModel.addListener(mxEvent.CHANGE, function()
- {
- if (graph.isSelectionEmpty())
- {
- insertLink.className = 'geButton mxDisabled';
- }
- else
- {
- insertLink.className = 'geButton';
- }
- });
-
- this.window = new mxWindow(mxResources.get('layers'), div, x, y, w, h, true, true);
- this.window.minimumSize = new mxRectangle(0, 0, 120, 120);
- this.window.destroyOnClose = false;
- this.window.setMaximizable(false);
- this.window.setResizable(true);
- this.window.setClosable(true);
- this.window.setVisible(true);
-
- this.init = function()
- {
- listDiv.scrollTop = listDiv.scrollHeight - listDiv.clientHeight;
- };
-
- this.window.addListener(mxEvent.SHOW, mxUtils.bind(this, function()
- {
- this.window.fit();
- }));
-
- // Make refresh available via instance
- this.refreshLayers = refresh;
-
- this.window.setLocation = function(x, y)
- {
- var iw = window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth;
- var ih = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight;
-
- x = Math.max(0, Math.min(x, iw - this.table.clientWidth));
- y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48));
-
- if (this.getX() != x || this.getY() != y)
- {
- mxWindow.prototype.setLocation.apply(this, arguments);
- }
- };
-
- var resizeListener = mxUtils.bind(this, function()
- {
- var x = this.window.getX();
- var y = this.window.getY();
-
- this.window.setLocation(x, y);
- });
-
- mxEvent.addListener(window, 'resize', resizeListener);
-
- this.destroy = function()
- {
- mxEvent.removeListener(window, 'resize', resizeListener);
- this.window.destroy();
- }
-};
diff --git a/src/main/webapp/js/mxgraph/Editor.js b/src/main/webapp/js/mxgraph/Editor.js
deleted file mode 100644
index 4ac80f32..00000000
--- a/src/main/webapp/js/mxgraph/Editor.js
+++ /dev/null
@@ -1,2778 +0,0 @@
-/**
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Editor constructor executed on page load.
- */
-Editor = function(chromeless, themes, model, graph, editable)
-{
- mxEventSource.call(this);
- this.chromeless = (chromeless != null) ? chromeless : this.chromeless;
- this.initStencilRegistry();
- this.graph = graph || this.createGraph(themes, model);
- this.editable = (editable != null) ? editable : !chromeless;
- this.undoManager = this.createUndoManager();
- this.status = '';
-
- this.getOrCreateFilename = function()
- {
- return this.filename || mxResources.get('drawing', [Editor.pageCounter]) + '.xml';
- };
-
- this.getFilename = function()
- {
- return this.filename;
- };
-
- // Sets the status and fires a statusChanged event
- this.setStatus = function(value)
- {
- this.status = value;
- this.fireEvent(new mxEventObject('statusChanged'));
- };
-
- // Returns the current status
- this.getStatus = function()
- {
- return this.status;
- };
-
- // Updates modified state if graph changes
- this.graphChangeListener = function(sender, eventObject)
- {
- var edit = (eventObject != null) ? eventObject.getProperty('edit') : null;
-
- if (edit == null || !edit.ignoreEdit)
- {
- this.setModified(true);
- }
- };
-
- this.graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function()
- {
- this.graphChangeListener.apply(this, arguments);
- }));
-
- // Sets persistent graph state defaults
- this.graph.resetViewOnRootChange = false;
- this.init();
-};
-
-/**
- * Counts open editor tabs (must be global for cross-window access)
- */
-Editor.pageCounter = 0;
-
-// Cross-domain window access is not allowed in FF, so if we
-// were opened from another domain then this will fail.
-(function()
-{
- try
- {
- var op = window;
-
- while (op.opener != null && typeof op.opener.Editor !== 'undefined' &&
- !isNaN(op.opener.Editor.pageCounter) &&
- // Workaround for possible infinite loop in FF https://drawio.atlassian.net/browse/DS-795
- op.opener != op)
- {
- op = op.opener;
- }
-
- // Increments the counter in the first opener in the chain
- if (op != null)
- {
- op.Editor.pageCounter++;
- Editor.pageCounter = op.Editor.pageCounter;
- }
- }
- catch (e)
- {
- // ignore
- }
-})();
-
-/**
- * Specifies if local storage should be used (eg. on the iPad which has no filesystem)
- */
-Editor.useLocalStorage = typeof(Storage) != 'undefined' && mxClient.IS_IOS;
-
-/**
- *
- */
-Editor.moveImage = (mxClient.IS_SVG) ? 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI4cHgiIGhlaWdodD0iMjhweCI+PGc+PC9nPjxnPjxnPjxnPjxwYXRoIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuNCwyLjQpc2NhbGUoMC44KXJvdGF0ZSg0NSwxMiwxMikiIHN0cm9rZT0iIzI5YjZmMiIgZmlsbD0iIzI5YjZmMiIgZD0iTTE1LDNsMi4zLDIuM2wtMi44OSwyLjg3bDEuNDIsMS40MkwxOC43LDYuN0wyMSw5VjNIMTV6IE0zLDlsMi4zLTIuM2wyLjg3LDIuODlsMS40Mi0xLjQyTDYuNyw1LjNMOSwzSDNWOXogTTksMjEgbC0yLjMtMi4zbDIuODktMi44N2wtMS40Mi0xLjQyTDUuMywxNy4zTDMsMTV2Nkg5eiBNMjEsMTVsLTIuMywyLjNsLTIuODctMi44OWwtMS40MiwxLjQybDIuODksMi44N0wxNSwyMWg2VjE1eiIvPjwvZz48L2c+PC9nPjwvc3ZnPgo=' :
- IMAGE_PATH + '/move.png';
-
-/**
- *
- */
-Editor.rowMoveImage = (mxClient.IS_SVG) ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAEBAMAAACw6DhOAAAAGFBMVEUzMzP///9tbW1QUFCKiopBQUF8fHxfX1/IXlmXAAAAFElEQVQImWNgNVdzYBAUFBRggLMAEzYBy29kEPgAAAAASUVORK5CYII=' :
- IMAGE_PATH + '/thumb_horz.png';
-
-/**
- * Images below are for lightbox and embedding toolbars.
- */
-Editor.helpImage = (mxClient.IS_SVG) ? 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSJub25lIiBkPSJNMCAwaDI0djI0SDB6Ii8+PHBhdGggZD0iTTExIDE4aDJ2LTJoLTJ2MnptMS0xNkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6bTAtMTRjLTIuMjEgMC00IDEuNzktNCA0aDJjMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIDItMyAxLjc1LTMgNWgyYzAtMi4yNSAzLTIuNSAzLTUgMC0yLjIxLTEuNzktNC00LTR6Ii8+PC9zdmc+' :
- IMAGE_PATH + '/help.png';
-
-/**
- * Sets the default font size.
- */
-Editor.checkmarkImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhFQAVAMQfAGxsbHx8fIqKioaGhvb29nJycvr6+sDAwJqamltbW5OTk+np6YGBgeTk5Ly8vJiYmP39/fLy8qWlpa6ursjIyOLi4vj4+N/f3+3t7fT09LCwsHZ2dubm5r6+vmZmZv///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEY4NTZERTQ5QUFBMTFFMUE5MTVDOTM5MUZGMTE3M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEY4NTZERTU5QUFBMTFFMUE5MTVDOTM5MUZGMTE3M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Rjg1NkRFMjlBQUExMUUxQTkxNUM5MzkxRkYxMTczRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Rjg1NkRFMzlBQUExMUUxQTkxNUM5MzkxRkYxMTczRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAB8ALAAAAAAVABUAAAVI4CeOZGmeaKqubKtylktSgCOLRyLd3+QJEJnh4VHcMoOfYQXQLBcBD4PA6ngGlIInEHEhPOANRkaIFhq8SuHCE1Hb8Lh8LgsBADs=' :
- IMAGE_PATH + '/checkmark.gif';
-
-/**
- * Images below are for lightbox and embedding toolbars.
- */
-Editor.maximizeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAAAAAAAAAAAAAAAADgKxmiAAAABXRSTlMA758vX1Pw3BoAAABJSURBVAjXY8AJQkODGBhUQ0MhbAUGBiYY24CBgRnGFmZgMISwgwwDGRhEhVVBbAVmEQYGRwMmBjIAQi/CTIRd6G5AuA3dzYQBAHj0EFdHkvV4AAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.zoomOutImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAsLCxxcXEhISFgYGChjTUxAAAAAXRSTlMAQObYZgAAAEdJREFUCNdjIAMwCQrB2YKCggJQJqMwA7MglK1owMBgqABVApITgLJZXFxgbIQ4Qj3CHIT5ggoIe5kgNkM1KSDYKBKqxPkDAPo5BAZBE54hAAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.zoomInImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAsLCwhISFxcXFgYGBavKaoAAAAAXRSTlMAQObYZgAAAElJREFUCNdjIAMwCQrB2YKCggJQJqMIA4sglK3owMzgqABVwsDMwCgAZTMbG8PYCHGEeoQ5CPMFFRD2MkFshmpSQLBRJFSJ8wcAEqcEM2uhl2MAAAAASUVORK5CYII=';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.zoomFitImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAD1BMVEUAAAAAAAAwMDBwcHBgYGC1xl09AAAAAXRSTlMAQObYZgAAAEFJREFUCNdjIAMwCQrB2YKCggJQJqMwA7MglK1owMBgqABVApITwMdGqEeYgzBfUAFhLxPEZqgmBQQbRUKFOH8AAK5OA3lA+FFOAAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.layersImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAaVBMVEUAAAAgICAICAgdHR0PDw8WFhYICAgLCwsXFxcvLy8ODg4uLi4iIiIqKiokJCQYGBgKCgonJycFBQUCAgIqKiocHBwcHBwODg4eHh4cHBwnJycJCQkUFBQqKiojIyMuLi4ZGRkgICAEBATOWYXAAAAAGnRSTlMAD7+fnz8/H7/ff18/77+vr5+fn39/b28fH2xSoKsAAACQSURBVBjTrYxJEsMgDARZZMAY73sgCcn/HxnhKtnk7j6oRq0psfuoyndZ/SuODkHPLzfVT6KeyPePnJ7KrnkRjWMXTn4SMnN8mXe2SSM3ts8L/ZUxxrbAULSYJJULE0Iw9pjpenoICcgcX61mGgTgtCv9Be99pzCoDhNQWQnchD1mup5++CYGcoQexajZbfwAj/0MD8ZOaUgAAAAASUVORK5CYII=';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.previousImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAAh0lEQVQ4je3UsQnCUBCA4U8hpa1NsoEjpHQJS0dxADdwEMuMIJkgA1hYChbGQgMi+JC8q4L/AB/vDu7x74cWWEZhJU44RmA1zujR5GIbXF9YNrjD/Q0bDRY4fEBZ4P4LlgTnCbAf84pUM8/9hY08tMUtEoQ1LpEgrNBFglChFXR6Q6GfwwR6AGKJMF74Vtt3AAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.nextImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAAi0lEQVQ4jeXUIQ7CUAwA0MeGxWI2yylwnALJUdBcgYvM7QYLmjOQIAkIPmJZghiIvypoUtX0tfnJL38X5ZfaEgUeUcManFBHgS0SLlhHggk3bCPBhCf2keCQR8wjwYTDp6YiZxJmOU1jGw7vGALescuBxsArNlOwd/CM1VSM/ut1qCIw+uOwiMJ+OF4CQzBCXm3hyAAAAABJRU5ErkJggg==';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.editImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhCwALAIABAFdXV////yH5BAEAAAEALAAAAAALAAsAAAIZjB8AiKuc4jvLOGqzrjX6zmkWyChXaUJBAQA7' : IMAGE_PATH + '/edit.gif';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.zoomOutLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABJklEQVQ4y4WT2XaDMAxEvWD2nSSUNEnTJN3r//+9Sj7ILAY6L0ijC4ONYVZRpo6cByrz2YKSUGorGTpz71lPVHvT+avoB5wIkU/mxk8veceSuNoLg44IzziXjvpih72wKQnm8yc2UoiP/LAd8jQfe2Xf4Pq+2EyYIvv9wbzHHCgwxDdlBtWZOdqDfTCVgqpygQpsZaojVAVc9UjQxnAJDIBhiQv84tq3gMQCAVTxVoSibXJf8tMuc7e1TB/DCmejBNg/w1Y3c+AM5vv4w7xM59/oXamrHaLVqPQ+OTCnmMZxgz0SdL5zji0/ld6j88qGa5KIiBB6WeJGKfUKwSMKLuXgvl1TW0tm5R9UQL/efSDYsnzxD8CinhBsTTdugJatKpJwf8v+ADb8QmvW7AeAAAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.zoomInLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABKElEQVQ4y4WT6WKCMBCENwkBwn2oFKvWqr3L+79es4EkQIDOH2d3Pxk2ABiJlB8JCXjqw4LikHVGLHTm3nM3UeVN5690GBBN0GwyV/3kkrUQR+WeKnREeKpzaXWd77CmJiXGfPIEI4V4yQ9TIW/ntlcMBe731Vts9w5TWG8F5j3mQI4hvrKpdGeYA7CX9qAcl650gVJartxRuhyHVghF8idQAIbFLvCLu28BsQEC6aKtCK6Pyb3JT7PmbmtNH8Ny56CotD/2qOs5cJbuffxgXmCib+xddVU5RNOhkvvkhTlFehzVWCOh3++MYElOhfdovaImnRYVmqDdsuhNp1QrBBE6uGC2+3ZNjGdg5B94oD+9uyVgWT79BwAxEBTWdOu3bWBVgsn/N/AHUD9IC01Oe40AAAAASUVORK5CYII=';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.actualSizeLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABIUlEQVQ4y4WT2XqDIBCFBxDc9yTWNEnTJN3r+79eGT4BEbXnaubMr8dBBaM450dCQp4LWFAascGIRd48eB4cNYE7f6XjgGiCFs5c+dml6CFN6j1V6IQIlHPpdV/usKcmJcV88gQTRXjLD9Mhb+fWq8YG9/uCmTCFjeeDeY85UGKIUGUuqzN42kv7oCouq9oHamlzVR1lVfpAIu1QVRiW+sAv7r4FpAYIZZVsRXB9TP5Dfpo1d1trCgzz1iiptH/sUbdz4CzN9+mLeXHn3+hdddd4RDegsrvzwZwSs2GLPRJidAqCLTlVwaMPqpYMWjTWBB2WRW86pVkhSKyDK2bdt2tmagZG4sBD/evdLQHLEvQfAOKRoLCmG1FAB6uKmby+gz+REDn7O5+EwQAAAABJRU5ErkJggg==';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.printLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAXVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9RKvvlAAAAHnRSTlMAydnl77qbMLT093H7K4Nd4Ktn082+lYt5bkklEgP44nQSAAAApUlEQVQ4y73P2Q6DIBRF0cOgbRHHzhP//5m9mBAQKjG1cT0Yc7ITAMu1LNQgUZiQ2DYoNQ0sCQb6qgHAfRx48opq3J9AZ6xuF7uOew8Ik1OsCZRS2UAC9V+D9a+QZYxNA45YFQftPtSkATOhw7dAc0vPBwKWiIOjP0JZ0yMuQJ27g36DipOUsqRAM0dR8KD1/ILHaHSE/w8DIx09E3g/BTce6rHUB5sAPKvfF+JdAAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.layersLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAmVBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v7///+bnZkkAAAAMnRSTlMABPr8ByiD88KsTi/rvJb272mjeUA1CuPe1M/KjVxYHxMP6KZ0S9nYzGRGGRaznpGIbzaGUf0AAAHESURBVDjLbZLZYoIwEEVDgLCjbKIgAlqXqt3m/z+uNwu1rcyDhjl3ktnYL7OY254C0VX3yWFZfzDrOClbbgKxi0YDHjwl4jbnRkXxJS/C1YP3DbBhD1n7Ex4uaAqdVDb3yJ/4J/3nJD2to/ngQz/DfUvzMp4JJ5sSCaF5oXmemgQDfDxzbi+Kq4sU+vNcuAmx94JtyOP2DD4Epz2asWSCz4Z/4fECxyNj9zC9xNLHcdPEO+awDKeSaUu0W4twZQiO2hYVisTR3RCtK/c1X6t4xMEpiGqXqVntEBLolkZZsKY4QtwH6jzq67dEHlJysB1aNOD3XT7n1UkasQN59L4yC2RELMDSeCRtz3yV22Ub3ozIUTknYx8JWqDdQxbUes98cR2kZtUSveF/bAhcedwEWmlxIkpZUy4XOCb6VBjjxHvbwo/1lBAHHi2JCr0NI570QhyHq/DhJoE2lLgyA4RVe6KmZ47O/3b86MCP0HWa73A8/C3SUc5Qc1ajt6fgpXJ+RGpMvDSchepZDOOQRcZVIKcK90x2D7etqtI+56+u6n3sPriO6nfphitR4+O2m3EbM7lh3me1FM1o+LMI887rN+s3/wZdTFlpNVJiOAAAAABJRU5ErkJggg==';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.closeLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAUVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////8IN+deAAAAGnRSTlMAuvAIg/dDM/QlOeuFhj0S5s4vKgzjxJRQNiLSey0AAADNSURBVDjLfZLbEoMgDEQjRRRs1XqX///QNmOHJSnjPkHOGR7IEmeoGtJZstnwjqbRfIsmgEdtPCqe9Ynz7ZSc07rE2QiSc+qv8TvjRXA2PDUm3dpe82iJhOEUfxJJo3aCv+jKmRmH4lcCjCjeh9GWOdL/GZZkXH3PYYDrHBnfc4D/RVZf5sjoC1was+Y6HQxwaUxFvq/a0Pv343VCTxfBSRiB+ab3M3eiQZXmMNBJ3Y8pGRZtYQ7DgHMXJEdPLTaN/qBjzJOBc3nmNcbsA16bMR0oLqf+AAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.editLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAgVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9d3yJTAAAAKnRSTlMA+hzi3nRQWyXzkm0h2j3u54gzEgSXjlYoTBgJxL2loGpAOS3Jt7Wxm35Ga7gRAAAA6UlEQVQ4y63Q2XaCMBSF4Q0JBasoQ5DJqbXjfv8HbCK2BZNwo/8FXHx7rcMC7lQu0iX8qU/qtvAWCpoqH8dYzS0SwaV5eK/UAf8X9pd2CWKzuF5Jrftp1owXwnIGLUaL3PYndOHf4kNNXWrXK/m7CHunk7K8LE6YtBpcknwG9GKxnroY+ylBXcx4xKyx/u/EuXi509cP9V7OO1oyHnzrdFTcqLG/4ibBA5pIMr/4xvKzuQDkVy9wW8SgBFD6HDvuzMvrZcC9QlkfMzI7w64m+b4PqBMNHB05lH21PVxJo2/fBXxV4hB38PcD+5AkI4FuETsAAAAASUVORK5CYII=';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.previousLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAAD////////////////////////////////////////////////////////////////////////////YSWgTAAAAE3RSTlMA7fci493c0MW8uJ6CZks4MxQHEZL6ewAAAFZJREFUOMvdkskRgDAMA4lDwg2B7b9XOlge/KKvdsa25KFb5XlRvxXC/DNBEv8IFNjBgGdDgXtFgTyhwDXiQAUHCvwa4Uv6mR6UR+1led2mVonvl+tML45qCQNQLIx7AAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.nextLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAAD////////////////////////////////////////////////////////////////////////////YSWgTAAAAE3RSTlMA7fci493c0MW8uJ6CZks4MxQHEZL6ewAAAFRJREFUOMvd0skRgCAQBVEFwQ0V7fxzNQP6wI05v6pZ/kyj1b7FNgik2gQzzLcAwiUAigHOTwDHK4A1CmB5BJANJG1hQ9qafYcqFlZP3IFc9eVGrR+iIgkDQRUXIAAAAABJRU5ErkJggg==';
-
-/**
- * Specifies the image to be used for the refresh button.
- */
-Editor.refreshLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAolBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8ELnaCAAAANXRSTlMABfyE2QKU+dfNyyDyoVYKwnTv7N+6rntsYlFNQjEqEw316uSzf2c1JB3GvqebiVw6GAjQB4DQr10AAAE7SURBVDjLvZLXcoMwEABPIgRCx3TT3A3udqL//7UgAdGRcR4yk8k+idsdmgS/QyWEqD/axS2JDV33zlnzLHIzQ2MDq9OeJ3m8l76KKENYlxrmM/b65Ys1+8YxnTEZFIEY0vVhszFWfUGZDJpQTDznTgAe5k4XhQxILB7ruzBQn+kkyDXuHfRtjoYDEvH7J9Lz98dBZXXL94X0Ofco2PFlChKbjVzEdakoSlKjoNoqPYkJ/wUZAYwc+PpLj1Ei7+jdoBWlwQZoJv2H1w3CWgRvo7dd9DP5btgwCWz0M02+oVoxCcIWeY9PNmR6B++m9prMxYEISpCBYBlfy9bc745is7UUULAem1Ww7FfalsiA2uaJsgmWP3pQI9q9/yMLkaaHAp2fxhHff/cNq7dBdHXhGW7l+Mo2zU0Cf8knJ2xA0oJ8enwAAAAASUVORK5CYII=';
-
-/**
- * Specifies the image to be used for the back button.
- */
-Editor.backLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAclBMVEUAAAD////////////////+/v7////////////////////////////////////////////+/v7///////////////////////////////////////////////////////////////////////////////8vKLfTAAAAJXRSTlMACh7h9gby3NLIwzwZ55uVJgH57b+8tbCljYV1RRMQ46FrTzQw+vtxOQAAAJ5JREFUOMuF00cWgzAQA1DRDQFCbwFSdf8rZpdVrNH2z3tuMv7mldZQ2WN2yi8x+TT8JvyTkqvwpiKvwsOIrA1fWr+XGTklfj8dOQR+D3KyUF6QufBkJN0hfCazEv6sZBRCJDUcPasGKpu1RLtYE8lkHAPBQLoTsK/SfAyRw5FjAuhCzC2MSj0gJ+66lHatgXdKboD9tfREB5m9/+3iC9jHDYvsGNcUAAAAAElFTkSuQmCC';
-
-/**
- * Specifies the image to be used for the back button.
- */
-Editor.fullscreenLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAllBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AJcWoAAAAMXRSTlMA+wIFxPWPCIb446tnUxmsoIykgxTe29jQnpKBe2MNsZhVTR/KyLuWbFhEPjUq7L9z+bQj+gAAAWxJREFUOMttk4l2gkAMRTODCO4FtQgIbnWpS9v8/881iZFh8R51NO8GJ+gAjMN8zuTRFSw04cIOHQcqFHH6oaQFGxf0jeBjEgB8Y52TpW9Ag4zB5QICWOtHrgwGuFZBcw+gPP0MFS7+iiD5inOmDIQS9sZgTwUzwEzyxhxHVEEU7NdDUXsqUPtqjIgR2IZSCT4upzSeIeOdcMHnfDsx3giPoezfU6MrQGB5//SckLEG2xYscK4GfnUFqaix39zrwooaOD/cXoYuvHKQIc7pzd3HVPusp6t2FAW/RmjMonbl8vwHDeZo/GkleJC7e+p5XA/rAq1X/V10wKag04rBpa2/d0LL4OYYceOEtsG5jyMntI1wS+N1BGcQBl/CoLoPOl9ABrW/BP53e1bwSJHHlkIVchJwmHwyyfJ4kIvEnKtwkxNSEct83KSChT7WiWgDZ3ccZ0BM4tloJow2YUAtifNT3njnyD+y/pMsnP4DN3Y4yl1Gyk0AAAAASUVORK5CYII=';
-
-/**
- * All fill styles supported by rough.js.
- */
-Editor.roughFillStyles = [{val: 'auto', dispName: 'Auto'}, {val: 'hachure', dispName: 'Hachure'}, {val: 'solid', dispName: 'Solid'},
- {val: 'zigzag', dispName: 'ZigZag'}, {val: 'cross-hatch', dispName: 'Cross Hatch'}, {val: 'dots', dispName: 'Dots'},
- {val: 'dashed', dispName: 'Dashed'}, {val: 'zigzag-line', dispName: 'ZigZag Line'}];
-
-/**
- * Graph themes for the format panel.
- */
-Editor.themes = null;
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.ctrlKey = (mxClient.IS_MAC) ? 'Cmd' : 'Ctrl';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.hintOffset = 20;
-
-/**
- * Specifies if the diagram should be saved automatically if possible. Default
- * is true.
- */
-Editor.popupsAllowed = true;
-
-/**
- * Editor inherits from mxEventSource
- */
-mxUtils.extend(Editor, mxEventSource);
-
-/**
- * Stores initial state of mxClient.NO_FO.
- */
-Editor.prototype.originalNoForeignObject = mxClient.NO_FO;
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.prototype.transparentImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhMAAwAIAAAP///wAAACH5BAEAAAAALAAAAAAwADAAAAIxhI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8egpAAA7' :
- IMAGE_PATH + '/transparent.gif';
-
-/**
- * Specifies if the canvas should be extended in all directions. Default is true.
- */
-Editor.prototype.extendCanvas = true;
-
-/**
- * Specifies if the app should run in chromeless mode. Default is false.
- * This default is only used if the contructor argument is null.
- */
-Editor.prototype.chromeless = false;
-
-/**
- * Specifies the order of OK/Cancel buttons in dialogs. Default is true.
- * Cancel first is used on Macs, Windows/Confluence uses cancel last.
- */
-Editor.prototype.cancelFirst = true;
-
-/**
- * Specifies if the editor is enabled. Default is true.
- */
-Editor.prototype.enabled = true;
-
-/**
- * Contains the name which was used for the last save. Default value is null.
- */
-Editor.prototype.filename = null;
-
-/**
- * Contains the current modified state of the diagram. This is false for
- * new diagrams and after the diagram was saved.
- */
-Editor.prototype.modified = false;
-
-/**
- * Specifies if the diagram should be saved automatically if possible. Default
- * is true.
- */
-Editor.prototype.autosave = true;
-
-/**
- * Specifies the top spacing for the initial page view. Default is 0.
- */
-Editor.prototype.initialTopSpacing = 0;
-
-/**
- * Specifies the app name. Default is document.title.
- */
-Editor.prototype.appName = document.title;
-
-/**
- *
- */
-Editor.prototype.editBlankUrl = window.location.protocol + '//' + window.location.host + '/';
-
-/**
- * Default value for the graph container overflow style.
- */
-Editor.prototype.defaultGraphOverflow = 'hidden';
-
-/**
- * Initializes the environment.
- */
-Editor.prototype.init = function() { };
-
-/**
- * Sets the XML node for the current diagram.
- */
-Editor.prototype.isChromelessView = function()
-{
- return this.chromeless;
-};
-
-/**
- * Sets the XML node for the current diagram.
- */
-Editor.prototype.setAutosave = function(value)
-{
- this.autosave = value;
- this.fireEvent(new mxEventObject('autosaveChanged'));
-};
-
-/**
- *
- */
-Editor.prototype.getEditBlankUrl = function(params)
-{
- return this.editBlankUrl + params;
-}
-
-/**
- *
- */
-Editor.prototype.editAsNew = function(xml, title)
-{
- var p = (title != null) ? '?title=' + encodeURIComponent(title) : '';
-
- if (urlParams['ui'] != null)
- {
- p += ((p.length > 0) ? '&' : '?') + 'ui=' + urlParams['ui'];
- }
-
- if (typeof window.postMessage !== 'undefined' &&
- (document.documentMode == null ||
- document.documentMode >= 10))
- {
- var wnd = null;
-
- var l = mxUtils.bind(this, function(evt)
- {
- if (evt.data == 'ready' && evt.source == wnd)
- {
- mxEvent.removeListener(window, 'message', l);
- wnd.postMessage(xml, '*');
- }
- });
-
- mxEvent.addListener(window, 'message', l);
- wnd = this.graph.openLink(this.getEditBlankUrl(
- p + ((p.length > 0) ? '&' : '?') +
- 'client=1'), null, true);
- }
- else
- {
- this.graph.openLink(this.getEditBlankUrl(p) +
- '#R' + encodeURIComponent(xml));
- }
-};
-
-/**
- * Sets the XML node for the current diagram.
- */
-Editor.prototype.createGraph = function(themes, model)
-{
- var graph = new Graph(null, model, null, null, themes);
- graph.transparentBackground = false;
-
- // Opens all links in a new window while editing
- if (!this.chromeless)
- {
- graph.isBlankLink = function(href)
- {
- return !this.isExternalProtocol(href);
- };
- }
-
- return graph;
-};
-
-/**
- * Sets the XML node for the current diagram.
- */
-Editor.prototype.resetGraph = function()
-{
- this.graph.gridEnabled = !this.isChromelessView() || urlParams['grid'] == '1';
- this.graph.graphHandler.guidesEnabled = true;
- this.graph.setTooltips(true);
- this.graph.setConnectable(true);
- this.graph.foldingEnabled = true;
- this.graph.scrollbars = this.graph.defaultScrollbars;
- this.graph.pageVisible = this.graph.defaultPageVisible;
- this.graph.pageBreaksVisible = this.graph.pageVisible;
- this.graph.preferPageSize = this.graph.pageBreaksVisible;
- this.graph.background = null;
- this.graph.pageScale = mxGraph.prototype.pageScale;
- this.graph.pageFormat = mxGraph.prototype.pageFormat;
- this.graph.currentScale = 1;
- this.graph.currentTranslate.x = 0;
- this.graph.currentTranslate.y = 0;
- this.updateGraphComponents();
- this.graph.view.setScale(1);
-};
-
-/**
- * Sets the XML node for the current diagram.
- */
-Editor.prototype.readGraphState = function(node)
-{
- this.graph.gridEnabled = node.getAttribute('grid') != '0' && (!this.isChromelessView() || urlParams['grid'] == '1');
- this.graph.gridSize = parseFloat(node.getAttribute('gridSize')) || mxGraph.prototype.gridSize;
- this.graph.graphHandler.guidesEnabled = node.getAttribute('guides') != '0';
- this.graph.setTooltips(node.getAttribute('tooltips') != '0');
- this.graph.setConnectable(node.getAttribute('connect') != '0');
- this.graph.connectionArrowsEnabled = node.getAttribute('arrows') != '0';
- this.graph.foldingEnabled = node.getAttribute('fold') != '0';
-
- if (this.isChromelessView() && this.graph.foldingEnabled)
- {
- this.graph.foldingEnabled = urlParams['nav'] == '1';
- this.graph.cellRenderer.forceControlClickHandler = this.graph.foldingEnabled;
- }
-
- var ps = parseFloat(node.getAttribute('pageScale'));
-
- if (!isNaN(ps) && ps > 0)
- {
- this.graph.pageScale = ps;
- }
- else
- {
- this.graph.pageScale = mxGraph.prototype.pageScale;
- }
-
- if (!this.graph.isLightboxView() && !this.graph.isViewer())
- {
- var pv = node.getAttribute('page');
-
- if (pv != null)
- {
- this.graph.pageVisible = (pv != '0');
- }
- else
- {
- this.graph.pageVisible = this.graph.defaultPageVisible;
- }
- }
- else
- {
- this.graph.pageVisible = false;
- }
-
- this.graph.pageBreaksVisible = this.graph.pageVisible;
- this.graph.preferPageSize = this.graph.pageBreaksVisible;
-
- var pw = parseFloat(node.getAttribute('pageWidth'));
- var ph = parseFloat(node.getAttribute('pageHeight'));
-
- if (!isNaN(pw) && !isNaN(ph))
- {
- this.graph.pageFormat = new mxRectangle(0, 0, pw, ph);
- }
-
- // Loads the persistent state settings
- var bg = node.getAttribute('background');
-
- if (bg != null && bg.length > 0)
- {
- this.graph.background = bg;
- }
- else
- {
- this.graph.background = null;
- }
-};
-
-/**
- * Sets the XML node for the current diagram.
- */
-Editor.prototype.setGraphXml = function(node)
-{
- if (node != null)
- {
- var dec = new mxCodec(node.ownerDocument);
-
- if (node.nodeName == 'mxGraphModel')
- {
- this.graph.model.beginUpdate();
-
- try
- {
- this.graph.model.clear();
- this.graph.view.scale = 1;
- this.readGraphState(node);
- this.updateGraphComponents();
- dec.decode(node, this.graph.getModel());
- }
- finally
- {
- this.graph.model.endUpdate();
- }
-
- this.fireEvent(new mxEventObject('resetGraphView'));
- }
- else if (node.nodeName == 'root')
- {
- this.resetGraph();
-
- // Workaround for invalid XML output in Firefox 20 due to bug in mxUtils.getXml
- var wrapper = dec.document.createElement('mxGraphModel');
- wrapper.appendChild(node);
-
- dec.decode(wrapper, this.graph.getModel());
- this.updateGraphComponents();
- this.fireEvent(new mxEventObject('resetGraphView'));
- }
- else
- {
- throw {
- message: mxResources.get('cannotOpenFile'),
- node: node,
- toString: function() { return this.message; }
- };
- }
- }
- else
- {
- this.resetGraph();
- this.graph.model.clear();
- this.fireEvent(new mxEventObject('resetGraphView'));
- }
-};
-
-/**
- * Returns the XML node that represents the current diagram.
- */
-Editor.prototype.getGraphXml = function(ignoreSelection)
-{
- ignoreSelection = (ignoreSelection != null) ? ignoreSelection : true;
- var node = null;
-
- if (ignoreSelection)
- {
- var enc = new mxCodec(mxUtils.createXmlDocument());
- node = enc.encode(this.graph.getModel());
- }
- else
- {
- node = this.graph.encodeCells(mxUtils.sortCells(this.graph.model.getTopmostCells(
- this.graph.getSelectionCells())));
- }
-
- if (this.graph.view.translate.x != 0 || this.graph.view.translate.y != 0)
- {
- node.setAttribute('dx', Math.round(this.graph.view.translate.x * 100) / 100);
- node.setAttribute('dy', Math.round(this.graph.view.translate.y * 100) / 100);
- }
-
- node.setAttribute('grid', (this.graph.isGridEnabled()) ? '1' : '0');
- node.setAttribute('gridSize', this.graph.gridSize);
- node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
- node.setAttribute('tooltips', (this.graph.tooltipHandler.isEnabled()) ? '1' : '0');
- node.setAttribute('connect', (this.graph.connectionHandler.isEnabled()) ? '1' : '0');
- node.setAttribute('arrows', (this.graph.connectionArrowsEnabled) ? '1' : '0');
- node.setAttribute('fold', (this.graph.foldingEnabled) ? '1' : '0');
- node.setAttribute('page', (this.graph.pageVisible) ? '1' : '0');
- node.setAttribute('pageScale', this.graph.pageScale);
- node.setAttribute('pageWidth', this.graph.pageFormat.width);
- node.setAttribute('pageHeight', this.graph.pageFormat.height);
-
- if (this.graph.background != null)
- {
- node.setAttribute('background', this.graph.background);
- }
-
- return node;
-};
-
-/**
- * Keeps the graph container in sync with the persistent graph state
- */
-Editor.prototype.updateGraphComponents = function()
-{
- var graph = this.graph;
-
- if (graph.container != null)
- {
- graph.view.validateBackground();
- graph.container.style.overflow = (graph.scrollbars) ? 'auto' : this.defaultGraphOverflow;
-
- this.fireEvent(new mxEventObject('updateGraphComponents'));
- }
-};
-
-/**
- * Sets the modified flag.
- */
-Editor.prototype.setModified = function(value)
-{
- this.modified = value;
-};
-
-/**
- * Sets the filename.
- */
-Editor.prototype.setFilename = function(value)
-{
- this.filename = value;
-};
-
-/**
- * Creates and returns a new undo manager.
- */
-Editor.prototype.createUndoManager = function()
-{
- var graph = this.graph;
- var undoMgr = new mxUndoManager();
-
- this.undoListener = function(sender, evt)
- {
- undoMgr.undoableEditHappened(evt.getProperty('edit'));
- };
-
- // Installs the command history
- var listener = mxUtils.bind(this, function(sender, evt)
- {
- this.undoListener.apply(this, arguments);
- });
-
- graph.getModel().addListener(mxEvent.UNDO, listener);
- graph.getView().addListener(mxEvent.UNDO, listener);
-
- // Keeps the selection in sync with the history
- var undoHandler = function(sender, evt)
- {
- var cand = graph.getSelectionCellsForChanges(evt.getProperty('edit').changes, function(change)
- {
- // Only selects changes to the cell hierarchy
- return !(change instanceof mxChildChange);
- });
-
- if (cand.length > 0)
- {
- var model = graph.getModel();
- var cells = [];
-
- for (var i = 0; i < cand.length; i++)
- {
- if (graph.view.getState(cand[i]) != null)
- {
- cells.push(cand[i]);
- }
- }
-
- graph.setSelectionCells(cells);
- }
- };
-
- undoMgr.addListener(mxEvent.UNDO, undoHandler);
- undoMgr.addListener(mxEvent.REDO, undoHandler);
-
- return undoMgr;
-};
-
-/**
- * Adds basic stencil set (no namespace).
- */
-Editor.prototype.initStencilRegistry = function() { };
-
-/**
- * Creates and returns a new undo manager.
- */
-Editor.prototype.destroy = function()
-{
- if (this.graph != null)
- {
- this.graph.destroy();
- this.graph = null;
- }
-};
-
-/**
- * Class for asynchronously opening a new window and loading a file at the same
- * time. This acts as a bridge between the open dialog and the new editor.
- */
-OpenFile = function(done)
-{
- this.producer = null;
- this.consumer = null;
- this.done = done;
- this.args = null;
-};
-
-/**
- * Registers the editor from the new window.
- */
-OpenFile.prototype.setConsumer = function(value)
-{
- this.consumer = value;
- this.execute();
-};
-
-/**
- * Sets the data from the loaded file.
- */
-OpenFile.prototype.setData = function()
-{
- this.args = arguments;
- this.execute();
-};
-
-/**
- * Displays an error message.
- */
-OpenFile.prototype.error = function(msg)
-{
- this.cancel(true);
- mxUtils.alert(msg);
-};
-
-/**
- * Consumes the data.
- */
-OpenFile.prototype.execute = function()
-{
- if (this.consumer != null && this.args != null)
- {
- this.cancel(false);
- this.consumer.apply(this, this.args);
- }
-};
-
-/**
- * Cancels the operation.
- */
-OpenFile.prototype.cancel = function(cancel)
-{
- if (this.done != null)
- {
- this.done((cancel != null) ? cancel : true);
- }
-};
-
-/**
- * Basic dialogs that are available in the viewer (print dialog).
- */
-function Dialog(editorUi, elt, w, h, modal, closable, onClose, noScroll, transparent, onResize, ignoreBgClick)
-{
- var dx = 0;
-
- if (mxClient.IS_VML && (document.documentMode == null || document.documentMode < 8))
- {
- // Adds padding as a workaround for box model in older IE versions
- // This needs to match the total padding of geDialog in CSS
- dx = 80;
- }
-
- w += dx;
- h += dx;
-
- var w0 = w;
- var h0 = h;
-
- var ds = mxUtils.getDocumentSize();
-
- // Workaround for print dialog offset in viewer lightbox
- if (window.innerHeight != null)
- {
- ds.height = window.innerHeight;
- }
-
- var dh = ds.height;
- var left = Math.max(1, Math.round((ds.width - w - 64) / 2));
- var top = Math.max(1, Math.round((dh - h - editorUi.footerHeight) / 3));
-
- // Keeps window size inside available space
- if (!mxClient.IS_QUIRKS)
- {
- elt.style.maxHeight = '100%';
- }
-
- w = (document.body != null) ? Math.min(w, document.body.scrollWidth - 64) : w;
- h = Math.min(h, dh - 64);
-
- // Increments zIndex to put subdialogs and background over existing dialogs and background
- if (editorUi.dialogs.length > 0)
- {
- this.zIndex += editorUi.dialogs.length * 2;
- }
-
- if (this.bg == null)
- {
- this.bg = editorUi.createDiv('background');
- this.bg.style.position = 'absolute';
- this.bg.style.background = Dialog.backdropColor;
- this.bg.style.height = dh + 'px';
- this.bg.style.right = '0px';
- this.bg.style.zIndex = this.zIndex - 2;
-
- mxUtils.setOpacity(this.bg, this.bgOpacity);
-
- if (mxClient.IS_QUIRKS)
- {
- new mxDivResizer(this.bg);
- }
- }
-
- var origin = mxUtils.getDocumentScrollOrigin(document);
- this.bg.style.left = origin.x + 'px';
- this.bg.style.top = origin.y + 'px';
- left += origin.x;
- top += origin.y;
-
- if (modal)
- {
- document.body.appendChild(this.bg);
- }
-
- var div = editorUi.createDiv(transparent? 'geTransDialog' : 'geDialog');
- var pos = this.getPosition(left, top, w, h);
- left = pos.x;
- top = pos.y;
-
- div.style.width = w + 'px';
- div.style.height = h + 'px';
- div.style.left = left + 'px';
- div.style.top = top + 'px';
- div.style.zIndex = this.zIndex;
-
- div.appendChild(elt);
- document.body.appendChild(div);
-
- // Adds vertical scrollbars if needed
- if (!noScroll && elt.clientHeight > div.clientHeight - 64)
- {
- elt.style.overflowY = 'auto';
- }
-
- if (closable)
- {
- var img = document.createElement('img');
-
- img.setAttribute('src', Dialog.prototype.closeImage);
- img.setAttribute('title', mxResources.get('close'));
- img.className = 'geDialogClose';
- img.style.top = (top + 14) + 'px';
- img.style.left = (left + w + 38 - dx) + 'px';
- img.style.zIndex = this.zIndex;
-
- mxEvent.addListener(img, 'click', mxUtils.bind(this, function()
- {
- editorUi.hideDialog(true);
- }));
-
- document.body.appendChild(img);
- this.dialogImg = img;
-
- if (!ignoreBgClick)
- {
- var mouseDownSeen = false;
-
- mxEvent.addGestureListeners(this.bg, mxUtils.bind(this, function(evt)
- {
- mouseDownSeen = true;
- }), null, mxUtils.bind(this, function(evt)
- {
- if (mouseDownSeen)
- {
- editorUi.hideDialog(true);
- mouseDownSeen = false;
- }
- }));
- }
- }
-
- this.resizeListener = mxUtils.bind(this, function()
- {
- if (onResize != null)
- {
- var newWH = onResize();
-
- if (newWH != null)
- {
- w0 = w = newWH.w;
- h0 = h = newWH.h;
- }
- }
-
- var ds = mxUtils.getDocumentSize();
- dh = ds.height;
- this.bg.style.height = dh + 'px';
-
- left = Math.max(1, Math.round((ds.width - w - 64) / 2));
- top = Math.max(1, Math.round((dh - h - editorUi.footerHeight) / 3));
- w = (document.body != null) ? Math.min(w0, document.body.scrollWidth - 64) : w0;
- h = Math.min(h0, dh - 64);
-
- var pos = this.getPosition(left, top, w, h);
- left = pos.x;
- top = pos.y;
-
- div.style.left = left + 'px';
- div.style.top = top + 'px';
- div.style.width = w + 'px';
- div.style.height = h + 'px';
-
- // Adds vertical scrollbars if needed
- if (!noScroll && elt.clientHeight > div.clientHeight - 64)
- {
- elt.style.overflowY = 'auto';
- }
-
- if (this.dialogImg != null)
- {
- this.dialogImg.style.top = (top + 14) + 'px';
- this.dialogImg.style.left = (left + w + 38 - dx) + 'px';
- }
- });
-
- mxEvent.addListener(window, 'resize', this.resizeListener);
-
- this.onDialogClose = onClose;
- this.container = div;
-
- editorUi.editor.fireEvent(new mxEventObject('showDialog'));
-};
-
-/**
- *
- */
-Dialog.backdropColor = 'white';
-
-/**
- *
- */
-Dialog.prototype.zIndex = mxPopupMenu.prototype.zIndex - 1;
-
-/**
- *
- */
-Dialog.prototype.noColorImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/nocolor.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkEzRDlBMUUwODYxMTExRTFCMzA4RDdDMjJBMEMxRDM3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkEzRDlBMUUxODYxMTExRTFCMzA4RDdDMjJBMEMxRDM3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTNEOUExREU4NjExMTFFMUIzMDhEN0MyMkEwQzFEMzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTNEOUExREY4NjExMTFFMUIzMDhEN0MyMkEwQzFEMzciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5xh3fmAAAABlBMVEX////MzMw46qqDAAAAGElEQVR42mJggAJGKGAYIIGBth8KAAIMAEUQAIElnLuQAAAAAElFTkSuQmCC';
-
-/**
- *
- */
-Dialog.prototype.closeImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/close.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAQMAAADaX5RTAAAABlBMVEV7mr3///+wksspAAAAAnRSTlP/AOW3MEoAAAAdSURBVAgdY9jXwCDDwNDRwHCwgeExmASygSL7GgB12QiqNHZZIwAAAABJRU5ErkJggg==';
-
-/**
- *
- */
-Dialog.prototype.clearImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/clear.gif' : 'data:image/gif;base64,R0lGODlhDQAKAIABAMDAwP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUIzOEM1NzI4NjEyMTFFMUEzMkNDMUE3NjZERDE2QjIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUIzOEM1NzM4NjEyMTFFMUEzMkNDMUE3NjZERDE2QjIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QjM4QzU3MDg2MTIxMUUxQTMyQ0MxQTc2NkREMTZCMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QjM4QzU3MTg2MTIxMUUxQTMyQ0MxQTc2NkREMTZCMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAEALAAAAAANAAoAAAIXTGCJebD9jEOTqRlttXdrB32PJ2ncyRQAOw==';
-
-/**
- *
- */
-Dialog.prototype.lockedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/locked.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzdDMDZCODExNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzdDMDZCODIxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozN0MwNkI3RjE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozN0MwNkI4MDE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvqMCFYAAAAVUExURZmZmb+/v7KysqysrMzMzLGxsf///4g8N1cAAAAHdFJOU////////wAaSwNGAAAAPElEQVR42lTMQQ4AIQgEwUa0//9kTQirOweYOgDqAMbZUr10AGlAwx4/BJ2QJ4U0L5brYjovvpv32xZgAHZaATFtMbu4AAAAAElFTkSuQmCC';
-
-/**
- *
- */
-Dialog.prototype.unlockedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/unlocked.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzdDMDZCN0QxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzdDMDZCN0UxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozN0MwNkI3QjE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozN0MwNkI3QzE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkKMpVwAAAAYUExURZmZmbKysr+/v6ysrOXl5czMzLGxsf///zHN5lwAAAAIdFJOU/////////8A3oO9WQAAADxJREFUeNpUzFESACAEBNBVsfe/cZJU+8Mzs8CIABCidtfGOndnYsT40HDSiCcbPdoJo10o9aI677cpwACRoAF3dFNlswAAAABJRU5ErkJggg==';
-
-/**
- * Removes the dialog from the DOM.
- */
-Dialog.prototype.bgOpacity = 80;
-
-/**
- * Removes the dialog from the DOM.
- */
-Dialog.prototype.getPosition = function(left, top)
-{
- return new mxPoint(left, top);
-};
-
-/**
- * Removes the dialog from the DOM.
- */
-Dialog.prototype.close = function(cancel, isEsc)
-{
- if (this.onDialogClose != null)
- {
- if (this.onDialogClose(cancel, isEsc) == false)
- {
- return false;
- }
-
- this.onDialogClose = null;
- }
-
- if (this.dialogImg != null)
- {
- this.dialogImg.parentNode.removeChild(this.dialogImg);
- this.dialogImg = null;
- }
-
- if (this.bg != null && this.bg.parentNode != null)
- {
- this.bg.parentNode.removeChild(this.bg);
- }
-
- mxEvent.removeListener(window, 'resize', this.resizeListener);
- this.container.parentNode.removeChild(this.container);
-};
-
-/**
- *
- */
-var ErrorDialog = function(editorUi, title, message, buttonText, fn, retry, buttonText2, fn2, hide, buttonText3, fn3)
-{
- hide = (hide != null) ? hide : true;
-
- var div = document.createElement('div');
- div.style.textAlign = 'center';
-
- if (title != null)
- {
- var hd = document.createElement('div');
- hd.style.padding = '0px';
- hd.style.margin = '0px';
- hd.style.fontSize = '18px';
- hd.style.paddingBottom = '16px';
- hd.style.marginBottom = '10px';
- hd.style.borderBottom = '1px solid #c0c0c0';
- hd.style.color = 'gray';
- hd.style.whiteSpace = 'nowrap';
- hd.style.textOverflow = 'ellipsis';
- hd.style.overflow = 'hidden';
- mxUtils.write(hd, title);
- hd.setAttribute('title', title);
- div.appendChild(hd);
- }
-
- var p2 = document.createElement('div');
- p2.style.lineHeight = '1.2em';
- p2.style.padding = '6px';
- p2.innerHTML = message;
- div.appendChild(p2);
-
- var btns = document.createElement('div');
- btns.style.marginTop = '12px';
- btns.style.textAlign = 'center';
-
- if (retry != null)
- {
- var retryBtn = mxUtils.button(mxResources.get('tryAgain'), function()
- {
- editorUi.hideDialog();
- retry();
- });
- retryBtn.className = 'geBtn';
- btns.appendChild(retryBtn);
-
- btns.style.textAlign = 'center';
- }
-
- if (buttonText3 != null)
- {
- var btn3 = mxUtils.button(buttonText3, function()
- {
- if (fn3 != null)
- {
- fn3();
- }
- });
-
- btn3.className = 'geBtn';
- btns.appendChild(btn3);
- }
-
- var btn = mxUtils.button(buttonText, function()
- {
- if (hide)
- {
- editorUi.hideDialog();
- }
-
- if (fn != null)
- {
- fn();
- }
- });
-
- btn.className = 'geBtn';
- btns.appendChild(btn);
-
- if (buttonText2 != null)
- {
- var mainBtn = mxUtils.button(buttonText2, function()
- {
- if (hide)
- {
- editorUi.hideDialog();
- }
-
- if (fn2 != null)
- {
- fn2();
- }
- });
-
- mainBtn.className = 'geBtn gePrimaryBtn';
- btns.appendChild(mainBtn);
- }
-
- this.init = function()
- {
- btn.focus();
- };
-
- div.appendChild(btns);
-
- this.container = div;
-};
-
-/**
- * Constructs a new print dialog.
- */
-var PrintDialog = function(editorUi, title)
-{
- this.create(editorUi, title);
-};
-
-/**
- * Constructs a new print dialog.
- */
-PrintDialog.prototype.create = function(editorUi)
-{
- var graph = editorUi.editor.graph;
- var row, td;
-
- var table = document.createElement('table');
- table.style.width = '100%';
- table.style.height = '100%';
- var tbody = document.createElement('tbody');
-
- row = document.createElement('tr');
-
- var onePageCheckBox = document.createElement('input');
- onePageCheckBox.setAttribute('type', 'checkbox');
- td = document.createElement('td');
- td.setAttribute('colspan', '2');
- td.style.fontSize = '10pt';
- td.appendChild(onePageCheckBox);
-
- var span = document.createElement('span');
- mxUtils.write(span, ' ' + mxResources.get('fitPage'));
- td.appendChild(span);
-
- mxEvent.addListener(span, 'click', function(evt)
- {
- onePageCheckBox.checked = !onePageCheckBox.checked;
- pageCountCheckBox.checked = !onePageCheckBox.checked;
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(onePageCheckBox, 'change', function()
- {
- pageCountCheckBox.checked = !onePageCheckBox.checked;
- });
-
- row.appendChild(td);
- tbody.appendChild(row);
-
- row = row.cloneNode(false);
-
- var pageCountCheckBox = document.createElement('input');
- pageCountCheckBox.setAttribute('type', 'checkbox');
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- td.appendChild(pageCountCheckBox);
-
- var span = document.createElement('span');
- mxUtils.write(span, ' ' + mxResources.get('posterPrint') + ':');
- td.appendChild(span);
-
- mxEvent.addListener(span, 'click', function(evt)
- {
- pageCountCheckBox.checked = !pageCountCheckBox.checked;
- onePageCheckBox.checked = !pageCountCheckBox.checked;
- mxEvent.consume(evt);
- });
-
- row.appendChild(td);
-
- var pageCountInput = document.createElement('input');
- pageCountInput.setAttribute('value', '1');
- pageCountInput.setAttribute('type', 'number');
- pageCountInput.setAttribute('min', '1');
- pageCountInput.setAttribute('size', '4');
- pageCountInput.setAttribute('disabled', 'disabled');
- pageCountInput.style.width = '50px';
-
- td = document.createElement('td');
- td.style.fontSize = '10pt';
- td.appendChild(pageCountInput);
- mxUtils.write(td, ' ' + mxResources.get('pages') + ' (max)');
- row.appendChild(td);
- tbody.appendChild(row);
-
- mxEvent.addListener(pageCountCheckBox, 'change', function()
- {
- if (pageCountCheckBox.checked)
- {
- pageCountInput.removeAttribute('disabled');
- }
- else
- {
- pageCountInput.setAttribute('disabled', 'disabled');
- }
-
- onePageCheckBox.checked = !pageCountCheckBox.checked;
- });
-
- row = row.cloneNode(false);
-
- td = document.createElement('td');
- mxUtils.write(td, mxResources.get('pageScale') + ':');
- row.appendChild(td);
-
- td = document.createElement('td');
- var pageScaleInput = document.createElement('input');
- pageScaleInput.setAttribute('value', '100 %');
- pageScaleInput.setAttribute('size', '5');
- pageScaleInput.style.width = '50px';
-
- td.appendChild(pageScaleInput);
- row.appendChild(td);
- tbody.appendChild(row);
-
- row = document.createElement('tr');
- td = document.createElement('td');
- td.colSpan = 2;
- td.style.paddingTop = '20px';
- td.setAttribute('align', 'right');
-
- // Overall scale for print-out to account for print borders in dialogs etc
- function preview(print)
- {
- var autoOrigin = onePageCheckBox.checked || pageCountCheckBox.checked;
- var printScale = parseInt(pageScaleInput.value) / 100;
-
- if (isNaN(printScale))
- {
- printScale = 1;
- pageScaleInput.value = '100%';
- }
-
- // Workaround to match available paper size in actual print output
- printScale *= 0.75;
-
- var pf = graph.pageFormat || mxConstants.PAGE_FORMAT_A4_PORTRAIT;
- var scale = 1 / graph.pageScale;
-
- if (autoOrigin)
- {
- var pageCount = (onePageCheckBox.checked) ? 1 : parseInt(pageCountInput.value);
-
- if (!isNaN(pageCount))
- {
- scale = mxUtils.getScaleForPageCount(pageCount, graph, pf);
- }
- }
-
- // Negative coordinates are cropped or shifted if page visible
- var gb = graph.getGraphBounds();
- var border = 0;
- var x0 = 0;
- var y0 = 0;
-
- // Applies print scale
- pf = mxRectangle.fromRectangle(pf);
- pf.width = Math.ceil(pf.width * printScale);
- pf.height = Math.ceil(pf.height * printScale);
- scale *= printScale;
-
- // Starts at first visible page
- if (!autoOrigin && graph.pageVisible)
- {
- var layout = graph.getPageLayout();
- x0 -= layout.x * pf.width;
- y0 -= layout.y * pf.height;
- }
- else
- {
- autoOrigin = true;
- }
-
- var preview = PrintDialog.createPrintPreview(graph, scale, pf, border, x0, y0, autoOrigin);
- preview.open();
-
- if (print)
- {
- PrintDialog.printPreview(preview);
- }
- };
-
- var cancelBtn = mxUtils.button(mxResources.get('cancel'), function()
- {
- editorUi.hideDialog();
- });
- cancelBtn.className = 'geBtn';
-
- if (editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- }
-
- if (PrintDialog.previewEnabled)
- {
- var previewBtn = mxUtils.button(mxResources.get('preview'), function()
- {
- editorUi.hideDialog();
- preview(false);
- });
- previewBtn.className = 'geBtn';
- td.appendChild(previewBtn);
- }
-
- var printBtn = mxUtils.button(mxResources.get((!PrintDialog.previewEnabled) ? 'ok' : 'print'), function()
- {
- editorUi.hideDialog();
- preview(true);
- });
- printBtn.className = 'geBtn gePrimaryBtn';
- td.appendChild(printBtn);
-
- if (!editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- }
-
- row.appendChild(td);
- tbody.appendChild(row);
-
- table.appendChild(tbody);
- this.container = table;
-};
-
-/**
- * Constructs a new print dialog.
- */
-PrintDialog.printPreview = function(preview)
-{
- try
- {
- if (preview.wnd != null)
- {
- var printFn = function()
- {
- preview.wnd.focus();
- preview.wnd.print();
- preview.wnd.close();
- };
-
- // Workaround for Google Chrome which needs a bit of a
- // delay in order to render the SVG contents
- // Needs testing in production
- if (mxClient.IS_GC)
- {
- window.setTimeout(printFn, 500);
- }
- else
- {
- printFn();
- }
- }
- }
- catch (e)
- {
- // ignores possible Access Denied
- }
-};
-
-/**
- * Constructs a new print dialog.
- */
-PrintDialog.createPrintPreview = function(graph, scale, pf, border, x0, y0, autoOrigin)
-{
- var preview = new mxPrintPreview(graph, scale, pf, border, x0, y0);
- preview.title = mxResources.get('preview');
- preview.printBackgroundImage = true;
- preview.autoOrigin = autoOrigin;
- var bg = graph.background;
-
- if (bg == null || bg == '' || bg == mxConstants.NONE)
- {
- bg = '#ffffff';
- }
-
- preview.backgroundColor = bg;
-
- var writeHead = preview.writeHead;
-
- // Adds a border in the preview
- preview.writeHead = function(doc)
- {
- writeHead.apply(this, arguments);
-
- doc.writeln('<style type="text/css">');
- doc.writeln('@media screen {');
- doc.writeln(' body > div { padding:30px;box-sizing:content-box; }');
- doc.writeln('}');
- doc.writeln('</style>');
- };
-
- return preview;
-};
-
-/**
- * Specifies if the preview button should be enabled. Default is true.
- */
-PrintDialog.previewEnabled = true;
-
-/**
- * Constructs a new page setup dialog.
- */
-var PageSetupDialog = function(editorUi)
-{
- var graph = editorUi.editor.graph;
- var row, td;
-
- var table = document.createElement('table');
- table.style.width = '100%';
- table.style.height = '100%';
- var tbody = document.createElement('tbody');
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.verticalAlign = 'top';
- td.style.fontSize = '10pt';
- mxUtils.write(td, mxResources.get('paperSize') + ':');
-
- row.appendChild(td);
-
- td = document.createElement('td');
- td.style.verticalAlign = 'top';
- td.style.fontSize = '10pt';
-
- var accessor = PageSetupDialog.addPageFormatPanel(td, 'pagesetupdialog', graph.pageFormat);
-
- row.appendChild(td);
- tbody.appendChild(row);
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- mxUtils.write(td, mxResources.get('background') + ':');
-
- row.appendChild(td);
-
- td = document.createElement('td');
- td.style.whiteSpace = 'nowrap';
-
- var backgroundInput = document.createElement('input');
- backgroundInput.setAttribute('type', 'text');
- var backgroundButton = document.createElement('button');
-
- backgroundButton.style.width = '18px';
- backgroundButton.style.height = '18px';
- backgroundButton.style.marginRight = '20px';
- backgroundButton.style.backgroundPosition = 'center center';
- backgroundButton.style.backgroundRepeat = 'no-repeat';
-
- var newBackgroundColor = graph.background;
-
- function updateBackgroundColor()
- {
- if (newBackgroundColor == null || newBackgroundColor == mxConstants.NONE)
- {
- backgroundButton.style.backgroundColor = '';
- backgroundButton.style.backgroundImage = 'url(\'' + Dialog.prototype.noColorImage + '\')';
- }
- else
- {
- backgroundButton.style.backgroundColor = newBackgroundColor;
- backgroundButton.style.backgroundImage = '';
- }
- };
-
- updateBackgroundColor();
-
- mxEvent.addListener(backgroundButton, 'click', function(evt)
- {
- editorUi.pickColor(newBackgroundColor || 'none', function(color)
- {
- newBackgroundColor = color;
- updateBackgroundColor();
- });
- mxEvent.consume(evt);
- });
-
- td.appendChild(backgroundButton);
-
- mxUtils.write(td, mxResources.get('gridSize') + ':');
-
- var gridSizeInput = document.createElement('input');
- gridSizeInput.setAttribute('type', 'number');
- gridSizeInput.setAttribute('min', '0');
- gridSizeInput.style.width = '40px';
- gridSizeInput.style.marginLeft = '6px';
-
- gridSizeInput.value = graph.getGridSize();
- td.appendChild(gridSizeInput);
-
- mxEvent.addListener(gridSizeInput, 'change', function()
- {
- var value = parseInt(gridSizeInput.value);
- gridSizeInput.value = Math.max(1, (isNaN(value)) ? graph.getGridSize() : value);
- });
-
- row.appendChild(td);
- tbody.appendChild(row);
-
- row = document.createElement('tr');
- td = document.createElement('td');
-
- mxUtils.write(td, mxResources.get('image') + ':');
-
- row.appendChild(td);
- td = document.createElement('td');
-
- var changeImageLink = document.createElement('a');
- changeImageLink.style.textDecoration = 'underline';
- changeImageLink.style.cursor = 'pointer';
- changeImageLink.style.color = '#a0a0a0';
-
- var newBackgroundImage = graph.backgroundImage;
-
- function updateBackgroundImage()
- {
- if (newBackgroundImage == null)
- {
- changeImageLink.removeAttribute('title');
- changeImageLink.style.fontSize = '';
- changeImageLink.innerHTML = mxUtils.htmlEntities(mxResources.get('change')) + '...';
- }
- else
- {
- changeImageLink.setAttribute('title', newBackgroundImage.src);
- changeImageLink.style.fontSize = '11px';
- changeImageLink.innerHTML = mxUtils.htmlEntities(newBackgroundImage.src.substring(0, 42)) + '...';
- }
- };
-
- mxEvent.addListener(changeImageLink, 'click', function(evt)
- {
- editorUi.showBackgroundImageDialog(function(image, failed)
- {
- if (!failed)
- {
- newBackgroundImage = image;
- updateBackgroundImage();
- }
- }, newBackgroundImage);
-
- mxEvent.consume(evt);
- });
-
- updateBackgroundImage();
-
- td.appendChild(changeImageLink);
-
- row.appendChild(td);
- tbody.appendChild(row);
-
- row = document.createElement('tr');
- td = document.createElement('td');
- td.colSpan = 2;
- td.style.paddingTop = '16px';
- td.setAttribute('align', 'right');
-
- var cancelBtn = mxUtils.button(mxResources.get('cancel'), function()
- {
- editorUi.hideDialog();
- });
- cancelBtn.className = 'geBtn';
-
- if (editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- }
-
- var applyBtn = mxUtils.button(mxResources.get('apply'), function()
- {
- editorUi.hideDialog();
- var gridSize = parseInt(gridSizeInput.value);
-
- if (!isNaN(gridSize) && graph.gridSize !== gridSize)
- {
- graph.setGridSize(gridSize);
- }
-
- var change = new ChangePageSetup(editorUi, newBackgroundColor,
- newBackgroundImage, accessor.get());
- change.ignoreColor = graph.background == newBackgroundColor;
-
- var oldSrc = (graph.backgroundImage != null) ? graph.backgroundImage.src : null;
- var newSrc = (newBackgroundImage != null) ? newBackgroundImage.src : null;
-
- change.ignoreImage = oldSrc === newSrc;
-
- if (graph.pageFormat.width != change.previousFormat.width ||
- graph.pageFormat.height != change.previousFormat.height ||
- !change.ignoreColor || !change.ignoreImage)
- {
- graph.model.execute(change);
- }
- });
- applyBtn.className = 'geBtn gePrimaryBtn';
- td.appendChild(applyBtn);
-
- if (!editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- }
-
- row.appendChild(td);
- tbody.appendChild(row);
-
- table.appendChild(tbody);
- this.container = table;
-};
-
-/**
- *
- */
-PageSetupDialog.addPageFormatPanel = function(div, namePostfix, pageFormat, pageFormatListener)
-{
- var formatName = 'format-' + namePostfix;
-
- var portraitCheckBox = document.createElement('input');
- portraitCheckBox.setAttribute('name', formatName);
- portraitCheckBox.setAttribute('type', 'radio');
- portraitCheckBox.setAttribute('value', 'portrait');
-
- var landscapeCheckBox = document.createElement('input');
- landscapeCheckBox.setAttribute('name', formatName);
- landscapeCheckBox.setAttribute('type', 'radio');
- landscapeCheckBox.setAttribute('value', 'landscape');
-
- var paperSizeSelect = document.createElement('select');
- paperSizeSelect.style.marginBottom = '8px';
- paperSizeSelect.style.width = '202px';
-
- var formatDiv = document.createElement('div');
- formatDiv.style.marginLeft = '4px';
- formatDiv.style.width = '210px';
- formatDiv.style.height = '24px';
-
- portraitCheckBox.style.marginRight = '6px';
- formatDiv.appendChild(portraitCheckBox);
-
- var portraitSpan = document.createElement('span');
- portraitSpan.style.maxWidth = '100px';
- mxUtils.write(portraitSpan, mxResources.get('portrait'));
- formatDiv.appendChild(portraitSpan);
-
- landscapeCheckBox.style.marginLeft = '10px';
- landscapeCheckBox.style.marginRight = '6px';
- formatDiv.appendChild(landscapeCheckBox);
-
- var landscapeSpan = document.createElement('span');
- landscapeSpan.style.width = '100px';
- mxUtils.write(landscapeSpan, mxResources.get('landscape'));
- formatDiv.appendChild(landscapeSpan)
-
- var customDiv = document.createElement('div');
- customDiv.style.marginLeft = '4px';
- customDiv.style.width = '210px';
- customDiv.style.height = '24px';
-
- var widthInput = document.createElement('input');
- widthInput.setAttribute('size', '7');
- widthInput.style.textAlign = 'right';
- customDiv.appendChild(widthInput);
- mxUtils.write(customDiv, ' in x ');
-
- var heightInput = document.createElement('input');
- heightInput.setAttribute('size', '7');
- heightInput.style.textAlign = 'right';
- customDiv.appendChild(heightInput);
- mxUtils.write(customDiv, ' in');
-
- formatDiv.style.display = 'none';
- customDiv.style.display = 'none';
-
- var pf = new Object();
- var formats = PageSetupDialog.getFormats();
-
- for (var i = 0; i < formats.length; i++)
- {
- var f = formats[i];
- pf[f.key] = f;
-
- var paperSizeOption = document.createElement('option');
- paperSizeOption.setAttribute('value', f.key);
- mxUtils.write(paperSizeOption, f.title);
- paperSizeSelect.appendChild(paperSizeOption);
- }
-
- var customSize = false;
-
- function listener(sender, evt, force)
- {
- if (force || (widthInput != document.activeElement && heightInput != document.activeElement))
- {
- var detected = false;
-
- for (var i = 0; i < formats.length; i++)
- {
- var f = formats[i];
-
- // Special case where custom was chosen
- if (customSize)
- {
- if (f.key == 'custom')
- {
- paperSizeSelect.value = f.key;
- customSize = false;
- }
- }
- else if (f.format != null)
- {
- // Fixes wrong values for previous A4 and A5 page sizes
- if (f.key == 'a4')
- {
- if (pageFormat.width == 826)
- {
- pageFormat = mxRectangle.fromRectangle(pageFormat);
- pageFormat.width = 827;
- }
- else if (pageFormat.height == 826)
- {
- pageFormat = mxRectangle.fromRectangle(pageFormat);
- pageFormat.height = 827;
- }
- }
- else if (f.key == 'a5')
- {
- if (pageFormat.width == 584)
- {
- pageFormat = mxRectangle.fromRectangle(pageFormat);
- pageFormat.width = 583;
- }
- else if (pageFormat.height == 584)
- {
- pageFormat = mxRectangle.fromRectangle(pageFormat);
- pageFormat.height = 583;
- }
- }
-
- if (pageFormat.width == f.format.width && pageFormat.height == f.format.height)
- {
- paperSizeSelect.value = f.key;
- portraitCheckBox.setAttribute('checked', 'checked');
- portraitCheckBox.defaultChecked = true;
- portraitCheckBox.checked = true;
- landscapeCheckBox.removeAttribute('checked');
- landscapeCheckBox.defaultChecked = false;
- landscapeCheckBox.checked = false;
- detected = true;
- }
- else if (pageFormat.width == f.format.height && pageFormat.height == f.format.width)
- {
- paperSizeSelect.value = f.key;
- portraitCheckBox.removeAttribute('checked');
- portraitCheckBox.defaultChecked = false;
- portraitCheckBox.checked = false;
- landscapeCheckBox.setAttribute('checked', 'checked');
- landscapeCheckBox.defaultChecked = true;
- landscapeCheckBox.checked = true;
- detected = true;
- }
- }
- }
-
- // Selects custom format which is last in list
- if (!detected)
- {
- widthInput.value = pageFormat.width / 100;
- heightInput.value = pageFormat.height / 100;
- portraitCheckBox.setAttribute('checked', 'checked');
- paperSizeSelect.value = 'custom';
- formatDiv.style.display = 'none';
- customDiv.style.display = '';
- }
- else
- {
- formatDiv.style.display = '';
- customDiv.style.display = 'none';
- }
- }
- };
-
- listener();
-
- div.appendChild(paperSizeSelect);
- mxUtils.br(div);
-
- div.appendChild(formatDiv);
- div.appendChild(customDiv);
-
- var currentPageFormat = pageFormat;
-
- var update = function(evt, selectChanged)
- {
- var f = pf[paperSizeSelect.value];
-
- if (f.format != null)
- {
- widthInput.value = f.format.width / 100;
- heightInput.value = f.format.height / 100;
- customDiv.style.display = 'none';
- formatDiv.style.display = '';
- }
- else
- {
- formatDiv.style.display = 'none';
- customDiv.style.display = '';
- }
-
- var wi = parseFloat(widthInput.value);
-
- if (isNaN(wi) || wi <= 0)
- {
- widthInput.value = pageFormat.width / 100;
- }
-
- var hi = parseFloat(heightInput.value);
-
- if (isNaN(hi) || hi <= 0)
- {
- heightInput.value = pageFormat.height / 100;
- }
-
- var newPageFormat = new mxRectangle(0, 0,
- Math.floor(parseFloat(widthInput.value) * 100),
- Math.floor(parseFloat(heightInput.value) * 100));
-
- if (paperSizeSelect.value != 'custom' && landscapeCheckBox.checked)
- {
- newPageFormat = new mxRectangle(0, 0, newPageFormat.height, newPageFormat.width);
- }
-
- // Initial select of custom should not update page format to avoid update of combo
- if ((!selectChanged || !customSize) && (newPageFormat.width != currentPageFormat.width ||
- newPageFormat.height != currentPageFormat.height))
- {
- currentPageFormat = newPageFormat;
-
- // Updates page format and reloads format panel
- if (pageFormatListener != null)
- {
- pageFormatListener(currentPageFormat);
- }
- }
- };
-
- mxEvent.addListener(portraitSpan, 'click', function(evt)
- {
- portraitCheckBox.checked = true;
- update(evt);
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(landscapeSpan, 'click', function(evt)
- {
- landscapeCheckBox.checked = true;
- update(evt);
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(widthInput, 'blur', update);
- mxEvent.addListener(widthInput, 'click', update);
- mxEvent.addListener(heightInput, 'blur', update);
- mxEvent.addListener(heightInput, 'click', update);
- mxEvent.addListener(landscapeCheckBox, 'change', update);
- mxEvent.addListener(portraitCheckBox, 'change', update);
- mxEvent.addListener(paperSizeSelect, 'change', function(evt)
- {
- // Handles special case where custom was chosen
- customSize = paperSizeSelect.value == 'custom';
- update(evt, true);
- });
-
- update();
-
- return {set: function(value)
- {
- pageFormat = value;
- listener(null, null, true);
- },get: function()
- {
- return currentPageFormat;
- }, widthInput: widthInput,
- heightInput: heightInput};
-};
-
-/**
- *
- */
-PageSetupDialog.getFormats = function()
-{
- return [{key: 'letter', title: 'US-Letter (8,5" x 11")', format: mxConstants.PAGE_FORMAT_LETTER_PORTRAIT},
- {key: 'legal', title: 'US-Legal (8,5" x 14")', format: new mxRectangle(0, 0, 850, 1400)},
- {key: 'tabloid', title: 'US-Tabloid (11" x 17")', format: new mxRectangle(0, 0, 1100, 1700)},
- {key: 'executive', title: 'US-Executive (7" x 10")', format: new mxRectangle(0, 0, 700, 1000)},
- {key: 'a0', title: 'A0 (841 mm x 1189 mm)', format: new mxRectangle(0, 0, 3300, 4681)},
- {key: 'a1', title: 'A1 (594 mm x 841 mm)', format: new mxRectangle(0, 0, 2339, 3300)},
- {key: 'a2', title: 'A2 (420 mm x 594 mm)', format: new mxRectangle(0, 0, 1654, 2336)},
- {key: 'a3', title: 'A3 (297 mm x 420 mm)', format: new mxRectangle(0, 0, 1169, 1654)},
- {key: 'a4', title: 'A4 (210 mm x 297 mm)', format: mxConstants.PAGE_FORMAT_A4_PORTRAIT},
- {key: 'a5', title: 'A5 (148 mm x 210 mm)', format: new mxRectangle(0, 0, 583, 827)},
- {key: 'a6', title: 'A6 (105 mm x 148 mm)', format: new mxRectangle(0, 0, 413, 583)},
- {key: 'a7', title: 'A7 (74 mm x 105 mm)', format: new mxRectangle(0, 0, 291, 413)},
- {key: 'b4', title: 'B4 (250 mm x 353 mm)', format: new mxRectangle(0, 0, 980, 1390)},
- {key: 'b5', title: 'B5 (176 mm x 250 mm)', format: new mxRectangle(0, 0, 690, 980)},
- {key: '16-9', title: '16:9 (1600 x 900)', format: new mxRectangle(0, 0, 900, 1600)},
- {key: '16-10', title: '16:10 (1920 x 1200)', format: new mxRectangle(0, 0, 1200, 1920)},
- {key: '4-3', title: '4:3 (1600 x 1200)', format: new mxRectangle(0, 0, 1200, 1600)},
- {key: 'custom', title: mxResources.get('custom'), format: null}];
-};
-
-/**
- * Constructs a new filename dialog.
- */
-var FilenameDialog = function(editorUi, filename, buttonText, fn, label, validateFn, content, helpLink, closeOnBtn, cancelFn, hints, w)
-{
- closeOnBtn = (closeOnBtn != null) ? closeOnBtn : true;
- var row, td;
-
- var table = document.createElement('table');
- var tbody = document.createElement('tbody');
- table.style.marginTop = '8px';
-
- row = document.createElement('tr');
-
- td = document.createElement('td');
- td.style.whiteSpace = 'nowrap';
- td.style.fontSize = '10pt';
- td.style.width = (hints) ? '80px' : '120px';
- mxUtils.write(td, (label || mxResources.get('filename')) + ':');
-
- row.appendChild(td);
-
- var nameInput = document.createElement('input');
- nameInput.setAttribute('value', filename || '');
- nameInput.style.marginLeft = '4px';
- nameInput.style.width = (w != null) ? w + 'px' : '180px';
-
- var genericBtn = mxUtils.button(buttonText, function()
- {
- if (validateFn == null || validateFn(nameInput.value))
- {
- if (closeOnBtn)
- {
- editorUi.hideDialog();
- }
-
- fn(nameInput.value);
- }
- });
- genericBtn.className = 'geBtn gePrimaryBtn';
-
- this.init = function()
- {
- if (label == null && content != null)
- {
- return;
- }
-
- nameInput.focus();
-
- if (mxClient.IS_GC || mxClient.IS_FF || document.documentMode >= 5 || mxClient.IS_QUIRKS)
- {
- nameInput.select();
- }
- else
- {
- document.execCommand('selectAll', false, null);
- }
-
- // Installs drag and drop handler for links
- if (Graph.fileSupport)
- {
- // Setup the dnd listeners
- var dlg = table.parentNode;
-
- if (dlg != null)
- {
- var graph = editorUi.editor.graph;
- var dropElt = null;
-
- mxEvent.addListener(dlg, 'dragleave', function(evt)
- {
- if (dropElt != null)
- {
- dropElt.style.backgroundColor = '';
- dropElt = null;
- }
-
- evt.stopPropagation();
- evt.preventDefault();
- });
-
- mxEvent.addListener(dlg, 'dragover', mxUtils.bind(this, function(evt)
- {
- // IE 10 does not implement pointer-events so it can't have a drop highlight
- if (dropElt == null && (!mxClient.IS_IE || document.documentMode > 10))
- {
- dropElt = nameInput;
- dropElt.style.backgroundColor = '#ebf2f9';
- }
-
- evt.stopPropagation();
- evt.preventDefault();
- }));
-
- mxEvent.addListener(dlg, 'drop', mxUtils.bind(this, function(evt)
- {
- if (dropElt != null)
- {
- dropElt.style.backgroundColor = '';
- dropElt = null;
- }
-
- if (mxUtils.indexOf(evt.dataTransfer.types, 'text/uri-list') >= 0)
- {
- nameInput.value = decodeURIComponent(evt.dataTransfer.getData('text/uri-list'));
- genericBtn.click();
- }
-
- evt.stopPropagation();
- evt.preventDefault();
- }));
- }
- }
- };
-
- td = document.createElement('td');
- td.style.whiteSpace = 'nowrap';
- td.appendChild(nameInput);
- row.appendChild(td);
-
- if (label != null || content == null)
- {
- tbody.appendChild(row);
-
- if (hints != null)
- {
- if (editorUi.editor.diagramFileTypes != null)
- {
- var typeSelect = FilenameDialog.createFileTypes(editorUi, nameInput, editorUi.editor.diagramFileTypes);
- typeSelect.style.marginLeft = '6px';
- typeSelect.style.width = '74px';
-
- td.appendChild(typeSelect);
- nameInput.style.width = (w != null) ? (w - 40) + 'px' : '140px';
- }
-
- td.appendChild(FilenameDialog.createTypeHint(editorUi, nameInput, hints));
- }
- }
-
- if (content != null)
- {
- row = document.createElement('tr');
- td = document.createElement('td');
- td.colSpan = 2;
- td.appendChild(content);
- row.appendChild(td);
- tbody.appendChild(row);
- }
-
- row = document.createElement('tr');
- td = document.createElement('td');
- td.colSpan = 2;
- td.style.paddingTop = '20px';
- td.style.whiteSpace = 'nowrap';
- td.setAttribute('align', 'right');
-
- var cancelBtn = mxUtils.button(mxResources.get('cancel'), function()
- {
- editorUi.hideDialog();
-
- if (cancelFn != null)
- {
- cancelFn();
- }
- });
- cancelBtn.className = 'geBtn';
-
- if (editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- }
-
- if (helpLink != null)
- {
- var helpBtn = mxUtils.button(mxResources.get('help'), function()
- {
- editorUi.editor.graph.openLink(helpLink);
- });
-
- helpBtn.className = 'geBtn';
- td.appendChild(helpBtn);
- }
-
- mxEvent.addListener(nameInput, 'keypress', function(e)
- {
- if (e.keyCode == 13)
- {
- genericBtn.click();
- }
- });
-
- td.appendChild(genericBtn);
-
- if (!editorUi.editor.cancelFirst)
- {
- td.appendChild(cancelBtn);
- }
-
- row.appendChild(td);
- tbody.appendChild(row);
- table.appendChild(tbody);
-
- this.container = table;
-};
-
-/**
- *
- */
-FilenameDialog.filenameHelpLink = null;
-
-/**
- *
- */
-FilenameDialog.createTypeHint = function(ui, nameInput, hints)
-{
- var hint = document.createElement('img');
- hint.style.cssText = 'vertical-align:top;height:16px;width:16px;margin-left:4px;background-repeat:no-repeat;background-position:center bottom;cursor:pointer;';
- mxUtils.setOpacity(hint, 70);
-
- var nameChanged = function()
- {
- hint.setAttribute('src', Editor.helpImage);
- hint.setAttribute('title', mxResources.get('help'));
-
- for (var i = 0; i < hints.length; i++)
- {
- if (hints[i].ext.length > 0 && nameInput.value.toLowerCase().substring(
- nameInput.value.length - hints[i].ext.length - 1) == '.' + hints[i].ext)
- {
- hint.setAttribute('src', mxClient.imageBasePath + '/warning.png');
- hint.setAttribute('title', mxResources.get(hints[i].title));
- break;
- }
- }
- };
-
- mxEvent.addListener(nameInput, 'keyup', nameChanged);
- mxEvent.addListener(nameInput, 'change', nameChanged);
- mxEvent.addListener(hint, 'click', function(evt)
- {
- var title = hint.getAttribute('title');
-
- if (hint.getAttribute('src') == Editor.helpImage)
- {
- ui.editor.graph.openLink(FilenameDialog.filenameHelpLink);
- }
- else if (title != '')
- {
- ui.showError(null, title, mxResources.get('help'), function()
- {
- ui.editor.graph.openLink(FilenameDialog.filenameHelpLink);
- }, null, mxResources.get('ok'), null, null, null, 340, 90);
- }
-
- mxEvent.consume(evt);
- });
-
- nameChanged();
-
- return hint;
-};
-
-/**
- *
- */
-FilenameDialog.createFileTypes = function(editorUi, nameInput, types)
-{
- var typeSelect = document.createElement('select');
-
- for (var i = 0; i < types.length; i++)
- {
- var typeOption = document.createElement('option');
- typeOption.setAttribute('value', i);
- mxUtils.write(typeOption, mxResources.get(types[i].description) +
- ' (.' + types[i].extension + ')');
- typeSelect.appendChild(typeOption);
- }
-
- mxEvent.addListener(typeSelect, 'change', function(evt)
- {
- var ext = types[typeSelect.value].extension;
- var idx = nameInput.value.lastIndexOf('.');
-
- if (idx > 0)
- {
- var ext = types[typeSelect.value].extension;
- nameInput.value = nameInput.value.substring(0, idx + 1) + ext;
- }
- else
- {
- nameInput.value = nameInput.value + '.' + ext;
- }
-
- if ('createEvent' in document)
- {
- var changeEvent = document.createEvent('HTMLEvents');
- changeEvent.initEvent('change', false, true);
- nameInput.dispatchEvent(changeEvent);
- }
- else
- {
- nameInput.fireEvent('onchange');
- }
- });
-
- var nameInputChanged = function(evt)
- {
- var idx = nameInput.value.lastIndexOf('.');
- var active = 0;
-
- // Finds current extension
- if (idx > 0)
- {
- var ext = nameInput.value.toLowerCase().substring(idx + 1);
-
- for (var i = 0; i < types.length; i++)
- {
- if (ext == types[i].extension)
- {
- active = i;
- break;
- }
- }
- }
-
- typeSelect.value = active;
- };
-
- mxEvent.addListener(nameInput, 'change', nameInputChanged);
- mxEvent.addListener(nameInput, 'keyup', nameInputChanged);
- nameInputChanged();
-
- return typeSelect;
-};
-
-/**
- * Static overrides
- */
-(function()
-{
- // Uses HTML for background pages (to support grid background image)
- mxGraphView.prototype.validateBackgroundPage = function()
- {
- var graph = this.graph;
-
- if (graph.container != null && !graph.transparentBackground)
- {
- if (graph.pageVisible)
- {
- var bounds = this.getBackgroundPageBounds();
-
- if (this.backgroundPageShape == null)
- {
- // Finds first element in graph container
- var firstChild = graph.container.firstChild;
-
- while (firstChild != null && firstChild.nodeType != mxConstants.NODETYPE_ELEMENT)
- {
- firstChild = firstChild.nextSibling;
- }
-
- if (firstChild != null)
- {
- this.backgroundPageShape = this.createBackgroundPageShape(bounds);
- this.backgroundPageShape.scale = 1;
-
- // Shadow filter causes problems in outline window in quirks mode. IE8 standards
- // also has known rendering issues inside mxWindow but not using shadow is worse.
- this.backgroundPageShape.isShadow = !mxClient.IS_QUIRKS;
- this.backgroundPageShape.dialect = mxConstants.DIALECT_STRICTHTML;
- this.backgroundPageShape.init(graph.container);
-
- // Required for the browser to render the background page in correct order
- firstChild.style.position = 'absolute';
- graph.container.insertBefore(this.backgroundPageShape.node, firstChild);
- this.backgroundPageShape.redraw();
-
- this.backgroundPageShape.node.className = 'geBackgroundPage';
-
- // Adds listener for double click handling on background
- mxEvent.addListener(this.backgroundPageShape.node, 'dblclick',
- mxUtils.bind(this, function(evt)
- {
- graph.dblClick(evt);
- })
- );
-
- // Adds basic listeners for graph event dispatching outside of the
- // container and finishing the handling of a single gesture
- mxEvent.addGestureListeners(this.backgroundPageShape.node,
- mxUtils.bind(this, function(evt)
- {
- graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(evt));
- }),
- mxUtils.bind(this, function(evt)
- {
- // Hides the tooltip if mouse is outside container
- if (graph.tooltipHandler != null && graph.tooltipHandler.isHideOnHover())
- {
- graph.tooltipHandler.hide();
- }
-
- if (graph.isMouseDown && !mxEvent.isConsumed(evt))
- {
- graph.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(evt));
- }
- }),
- mxUtils.bind(this, function(evt)
- {
- graph.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(evt));
- })
- );
- }
- }
- else
- {
- this.backgroundPageShape.scale = 1;
- this.backgroundPageShape.bounds = bounds;
- this.backgroundPageShape.redraw();
- }
- }
- else if (this.backgroundPageShape != null)
- {
- this.backgroundPageShape.destroy();
- this.backgroundPageShape = null;
- }
-
- this.validateBackgroundStyles();
- }
- };
-
- // Updates the CSS of the background to draw the grid
- mxGraphView.prototype.validateBackgroundStyles = function()
- {
- var graph = this.graph;
- var color = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background;
- var gridColor = (color != null && this.gridColor != color.toLowerCase()) ? this.gridColor : '#ffffff';
- var image = 'none';
- var position = '';
-
- if (graph.isGridEnabled())
- {
- var phase = 10;
-
- if (mxClient.IS_SVG)
- {
- // Generates the SVG required for drawing the dynamic grid
- image = unescape(encodeURIComponent(this.createSvgGrid(gridColor)));
- image = (window.btoa) ? btoa(image) : Base64.encode(image, true);
- image = 'url(' + 'data:image/svg+xml;base64,' + image + ')'
- phase = graph.gridSize * this.scale * this.gridSteps;
- }
- else
- {
- // Fallback to grid wallpaper with fixed size
- image = 'url(' + this.gridImage + ')';
- }
-
- var x0 = 0;
- var y0 = 0;
-
- if (graph.view.backgroundPageShape != null)
- {
- var bds = this.getBackgroundPageBounds();
-
- x0 = 1 + bds.x;
- y0 = 1 + bds.y;
- }
-
- // Computes the offset to maintain origin for grid
- position = -Math.round(phase - mxUtils.mod(this.translate.x * this.scale - x0, phase)) + 'px ' +
- -Math.round(phase - mxUtils.mod(this.translate.y * this.scale - y0, phase)) + 'px';
- }
-
- var canvas = graph.view.canvas;
-
- if (canvas.ownerSVGElement != null)
- {
- canvas = canvas.ownerSVGElement;
- }
-
- if (graph.view.backgroundPageShape != null)
- {
- graph.view.backgroundPageShape.node.style.backgroundPosition = position;
- graph.view.backgroundPageShape.node.style.backgroundImage = image;
- graph.view.backgroundPageShape.node.style.backgroundColor = color;
- graph.container.className = 'geDiagramContainer geDiagramBackdrop';
- canvas.style.backgroundImage = 'none';
- canvas.style.backgroundColor = '';
- }
- else
- {
- graph.container.className = 'geDiagramContainer';
- canvas.style.backgroundPosition = position;
- canvas.style.backgroundColor = color;
- canvas.style.backgroundImage = image;
- }
- };
-
- // Returns the SVG required for painting the background grid.
- mxGraphView.prototype.createSvgGrid = function(color)
- {
- var tmp = this.graph.gridSize * this.scale;
-
- while (tmp < this.minGridSize)
- {
- tmp *= 2;
- }
-
- var tmp2 = this.gridSteps * tmp;
-
- // Small grid lines
- var d = [];
-
- for (var i = 1; i < this.gridSteps; i++)
- {
- var tmp3 = i * tmp;
- d.push('M 0 ' + tmp3 + ' L ' + tmp2 + ' ' + tmp3 + ' M ' + tmp3 + ' 0 L ' + tmp3 + ' ' + tmp2);
- }
-
- // KNOWN: Rounding errors for certain scales (eg. 144%, 121% in Chrome, FF and Safari). Workaround
- // in Chrome is to use 100% for the svg size, but this results in blurred grid for large diagrams.
- var size = tmp2;
- var svg = '<svg width="' + size + '" height="' + size + '" xmlns="' + mxConstants.NS_SVG + '">' +
- '<defs><pattern id="grid" width="' + tmp2 + '" height="' + tmp2 + '" patternUnits="userSpaceOnUse">' +
- '<path d="' + d.join(' ') + '" fill="none" stroke="' + color + '" opacity="0.2" stroke-width="1"/>' +
- '<path d="M ' + tmp2 + ' 0 L 0 0 0 ' + tmp2 + '" fill="none" stroke="' + color + '" stroke-width="1"/>' +
- '</pattern></defs><rect width="100%" height="100%" fill="url(#grid)"/></svg>';
-
- return svg;
- };
-
- // Adds panning for the grid with no page view and disabled scrollbars
- var mxGraphPanGraph = mxGraph.prototype.panGraph;
- mxGraph.prototype.panGraph = function(dx, dy)
- {
- mxGraphPanGraph.apply(this, arguments);
-
- if (this.shiftPreview1 != null)
- {
- var canvas = this.view.canvas;
-
- if (canvas.ownerSVGElement != null)
- {
- canvas = canvas.ownerSVGElement;
- }
-
- var phase = this.gridSize * this.view.scale * this.view.gridSteps;
- var position = -Math.round(phase - mxUtils.mod(this.view.translate.x * this.view.scale + dx, phase)) + 'px ' +
- -Math.round(phase - mxUtils.mod(this.view.translate.y * this.view.scale + dy, phase)) + 'px';
- canvas.style.backgroundPosition = position;
- }
- };
-
- // Draws page breaks only within the page
- mxGraph.prototype.updatePageBreaks = function(visible, width, height)
- {
- var scale = this.view.scale;
- var tr = this.view.translate;
- var fmt = this.pageFormat;
- var ps = scale * this.pageScale;
-
- var bounds2 = this.view.getBackgroundPageBounds();
-
- width = bounds2.width;
- height = bounds2.height;
- var bounds = new mxRectangle(scale * tr.x, scale * tr.y, fmt.width * ps, fmt.height * ps);
-
- // Does not show page breaks if the scale is too small
- visible = visible && Math.min(bounds.width, bounds.height) > this.minPageBreakDist;
-
- var horizontalCount = (visible) ? Math.ceil(height / bounds.height) - 1 : 0;
- var verticalCount = (visible) ? Math.ceil(width / bounds.width) - 1 : 0;
- var right = bounds2.x + width;
- var bottom = bounds2.y + height;
-
- if (this.horizontalPageBreaks == null && horizontalCount > 0)
- {
- this.horizontalPageBreaks = [];
- }
-
- if (this.verticalPageBreaks == null && verticalCount > 0)
- {
- this.verticalPageBreaks = [];
- }
-
- var drawPageBreaks = mxUtils.bind(this, function(breaks)
- {
- if (breaks != null)
- {
- var count = (breaks == this.horizontalPageBreaks) ? horizontalCount : verticalCount;
-
- for (var i = 0; i <= count; i++)
- {
- var pts = (breaks == this.horizontalPageBreaks) ?
- [new mxPoint(Math.round(bounds2.x), Math.round(bounds2.y + (i + 1) * bounds.height)),
- new mxPoint(Math.round(right), Math.round(bounds2.y + (i + 1) * bounds.height))] :
- [new mxPoint(Math.round(bounds2.x + (i + 1) * bounds.width), Math.round(bounds2.y)),
- new mxPoint(Math.round(bounds2.x + (i + 1) * bounds.width), Math.round(bottom))];
-
- if (breaks[i] != null)
- {
- breaks[i].points = pts;
- breaks[i].redraw();
- }
- else
- {
- var pageBreak = new mxPolyline(pts, this.pageBreakColor);
- pageBreak.dialect = this.dialect;
- pageBreak.isDashed = this.pageBreakDashed;
- pageBreak.pointerEvents = false;
- pageBreak.init(this.view.backgroundPane);
- pageBreak.redraw();
-
- breaks[i] = pageBreak;
- }
- }
-
- for (var i = count; i < breaks.length; i++)
- {
- breaks[i].destroy();
- }
-
- breaks.splice(count, breaks.length - count);
- }
- });
-
- drawPageBreaks(this.horizontalPageBreaks);
- drawPageBreaks(this.verticalPageBreaks);
- };
-
- // Disables removing relative children and table rows and cells from parents
- var mxGraphHandlerShouldRemoveCellsFromParent = mxGraphHandler.prototype.shouldRemoveCellsFromParent;
- mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(parent, cells, evt)
- {
- for (var i = 0; i < cells.length; i++)
- {
- if (this.graph.isTableCell(cells[i]) || this.graph.isTableRow(cells[i]))
- {
- return false;
- }
- else if (this.graph.getModel().isVertex(cells[i]))
- {
- var geo = this.graph.getCellGeometry(cells[i]);
-
- if (geo != null && geo.relative)
- {
- return false;
- }
- }
- }
-
- return mxGraphHandlerShouldRemoveCellsFromParent.apply(this, arguments);
- };
-
- // Overrides to ignore hotspot only for target terminal
- var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker;
- mxConnectionHandler.prototype.createMarker = function()
- {
- var marker = mxConnectionHandlerCreateMarker.apply(this, arguments);
-
- marker.intersects = mxUtils.bind(this, function(state, evt)
- {
- if (this.isConnecting())
- {
- return true;
- }
-
- return mxCellMarker.prototype.intersects.apply(marker, arguments);
- });
-
- return marker;
- };
-
- // Creates background page shape
- mxGraphView.prototype.createBackgroundPageShape = function(bounds)
- {
- return new mxRectangleShape(bounds, '#ffffff', this.graph.defaultPageBorderColor);
- };
-
- // Fits the number of background pages to the graph
- mxGraphView.prototype.getBackgroundPageBounds = function()
- {
- var gb = this.getGraphBounds();
-
- // Computes unscaled, untranslated graph bounds
- var x = (gb.width > 0) ? gb.x / this.scale - this.translate.x : 0;
- var y = (gb.height > 0) ? gb.y / this.scale - this.translate.y : 0;
- var w = gb.width / this.scale;
- var h = gb.height / this.scale;
-
- var fmt = this.graph.pageFormat;
- var ps = this.graph.pageScale;
-
- var pw = fmt.width * ps;
- var ph = fmt.height * ps;
-
- var x0 = Math.floor(Math.min(0, x) / pw);
- var y0 = Math.floor(Math.min(0, y) / ph);
- var xe = Math.ceil(Math.max(1, x + w) / pw);
- var ye = Math.ceil(Math.max(1, y + h) / ph);
-
- var rows = xe - x0;
- var cols = ye - y0;
-
- var bounds = new mxRectangle(this.scale * (this.translate.x + x0 * pw), this.scale *
- (this.translate.y + y0 * ph), this.scale * rows * pw, this.scale * cols * ph);
-
- return bounds;
- };
-
- // Add panning for background page in VML
- var graphPanGraph = mxGraph.prototype.panGraph;
- mxGraph.prototype.panGraph = function(dx, dy)
- {
- graphPanGraph.apply(this, arguments);
-
- if ((this.dialect != mxConstants.DIALECT_SVG && this.view.backgroundPageShape != null) &&
- (!this.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.container)))
- {
- this.view.backgroundPageShape.node.style.marginLeft = dx + 'px';
- this.view.backgroundPageShape.node.style.marginTop = dy + 'px';
- }
- };
-
- /**
- * Consumes click events for disabled menu items.
- */
- var mxPopupMenuAddItem = mxPopupMenu.prototype.addItem;
- mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled)
- {
- var result = mxPopupMenuAddItem.apply(this, arguments);
-
- if (enabled != null && !enabled)
- {
- mxEvent.addListener(result, 'mousedown', function(evt)
- {
- mxEvent.consume(evt);
- });
- }
-
- return result;
- };
-
- /**
- * Selects tables before cells and rows.
- */
- var mxGraphHandlerIsPropagateSelectionCell = mxGraphHandler.prototype.isPropagateSelectionCell;
- mxGraphHandler.prototype.isPropagateSelectionCell = function(cell, immediate, me)
- {
- var result = false;
- var parent = this.graph.model.getParent(cell)
-
- if (immediate)
- {
- var geo = (this.graph.model.isEdge(cell)) ? null :
- this.graph.getCellGeometry(cell);
-
- result = !this.graph.model.isEdge(parent) &&
- !this.graph.isSiblingSelected(cell) &&
- ((geo != null && geo.relative) ||
- !this.graph.isContainer(parent) ||
- this.graph.isPart(cell));
- }
- else
- {
- result = mxGraphHandlerIsPropagateSelectionCell.apply(this, arguments);
-
- if (this.graph.isTableCell(cell) || this.graph.isTableRow(cell))
- {
- var table = parent;
-
- if (!this.graph.isTable(table))
- {
- table = this.graph.model.getParent(table);
- }
-
- result = !this.graph.selectionCellsHandler.isHandled(table) ||
- (this.graph.isCellSelected(table) && this.graph.isToggleEvent(me.getEvent())) ||
- (this.graph.isCellSelected(cell) && !this.graph.isToggleEvent(me.getEvent())) ||
- (this.graph.isTableCell(cell) && this.graph.isCellSelected(parent));
- }
- }
-
- return result;
- };
-
- /**
- * Returns last selected ancestor
- */
- mxPopupMenuHandler.prototype.getCellForPopupEvent = function(me)
- {
- var cell = me.getCell();
- var model = this.graph.getModel();
- var parent = model.getParent(cell);
- var state = this.graph.view.getState(parent);
- var selected = this.graph.isCellSelected(cell);
-
- while (state != null && (model.isVertex(parent) || model.isEdge(parent)))
- {
- var temp = this.graph.isCellSelected(parent);
- selected = selected || temp;
-
- if (temp || (!selected && (this.graph.isTableCell(cell) ||
- this.graph.isTableRow(cell))))
- {
- cell = parent;
- }
-
- parent = model.getParent(parent);
- }
-
- return cell;
- };
-
-})();
diff --git a/src/main/webapp/js/mxgraph/EditorUi.js b/src/main/webapp/js/mxgraph/EditorUi.js
deleted file mode 100644
index 0135ec55..00000000
--- a/src/main/webapp/js/mxgraph/EditorUi.js
+++ /dev/null
@@ -1,5090 +0,0 @@
-/**
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new graph editor
- */
-EditorUi = function(editor, container, lightbox)
-{
- mxEventSource.call(this);
-
- this.destroyFunctions = [];
- this.editor = editor || new Editor();
- this.container = container || document.body;
-
- var graph = this.editor.graph;
- graph.lightbox = lightbox;
- this.initialDefaultVertexStyle = mxUtils.clone(graph.defaultVertexStyle);
- this.initialDefaultEdgeStyle = mxUtils.clone(graph.defaultEdgeStyle);
-
- // Faster scrollwheel zoom is possible with CSS transforms
- if (graph.useCssTransforms)
- {
- this.lazyZoomDelay = 0;
- }
-
- // Pre-fetches submenu image or replaces with embedded image if supported
- if (mxClient.IS_SVG)
- {
- mxPopupMenu.prototype.submenuImage = 'data:image/gif;base64,R0lGODlhCQAJAIAAAP///zMzMyH5BAEAAAAALAAAAAAJAAkAAAIPhI8WebHsHopSOVgb26AAADs=';
- }
- else
- {
- new Image().src = mxPopupMenu.prototype.submenuImage;
- }
-
- // Pre-fetches connect image
- if (!mxClient.IS_SVG && mxConnectionHandler.prototype.connectImage != null)
- {
- new Image().src = mxConnectionHandler.prototype.connectImage.src;
- }
-
- // Disables graph and forced panning in chromeless mode
- if (this.editor.chromeless && !this.editor.editable)
- {
- this.footerHeight = 0;
- graph.isEnabled = function() { return false; };
- graph.panningHandler.isForcePanningEvent = function(me)
- {
- return !mxEvent.isPopupTrigger(me.getEvent());
- };
- }
-
- // Creates the user interface
- this.actions = new Actions(this);
- this.menus = this.createMenus();
-
- if (!graph.standalone)
- {
- this.createDivs();
- this.createUi();
- this.refresh();
-
- // Disables HTML and text selection
- var textEditing = mxUtils.bind(this, function(evt)
- {
- if (evt == null)
- {
- evt = window.event;
- }
-
- return graph.isEditing() || (evt != null && this.isSelectionAllowed(evt));
- });
-
- // Disables text selection while not editing and no dialog visible
- if (this.container == document.body)
- {
- this.menubarContainer.onselectstart = textEditing;
- this.menubarContainer.onmousedown = textEditing;
- this.toolbarContainer.onselectstart = textEditing;
- this.toolbarContainer.onmousedown = textEditing;
- this.diagramContainer.onselectstart = textEditing;
- this.diagramContainer.onmousedown = textEditing;
- this.sidebarContainer.onselectstart = textEditing;
- this.sidebarContainer.onmousedown = textEditing;
- this.formatContainer.onselectstart = textEditing;
- this.formatContainer.onmousedown = textEditing;
- this.footerContainer.onselectstart = textEditing;
- this.footerContainer.onmousedown = textEditing;
-
- if (this.tabContainer != null)
- {
- // Mouse down is needed for drag and drop
- this.tabContainer.onselectstart = textEditing;
- }
- }
-
- // And uses built-in context menu while editing
- if (!this.editor.chromeless || this.editor.editable)
- {
- // Allows context menu for links in hints
- var linkHandler = function(evt)
- {
- if (evt != null)
- {
- var source = mxEvent.getSource(evt);
-
- if (source.nodeName == 'A')
- {
- while (source != null)
- {
- if (source.className == 'geHint')
- {
- return true;
- }
-
- source = source.parentNode;
- }
- }
- }
-
- return textEditing(evt);
- };
-
- if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9))
- {
- mxEvent.addListener(this.diagramContainer, 'contextmenu', linkHandler);
- }
- else
- {
- // Allows browser context menu outside of diagram and sidebar
- this.diagramContainer.oncontextmenu = linkHandler;
- }
- }
- else
- {
- graph.panningHandler.usePopupTrigger = false;
- }
-
- // Contains the main graph instance inside the given panel
- graph.init(this.diagramContainer);
-
- // Improves line wrapping for in-place editor
- if (mxClient.IS_SVG && graph.view.getDrawPane() != null)
- {
- var root = graph.view.getDrawPane().ownerSVGElement;
-
- if (root != null)
- {
- root.style.position = 'absolute';
- }
- }
-
- // Creates hover icons
- this.hoverIcons = this.createHoverIcons();
-
- // Hides hover icons when cells are moved
- if (graph.graphHandler != null)
- {
- var graphHandlerStart = graph.graphHandler.start;
-
- graph.graphHandler.start = function()
- {
- if (ui.hoverIcons != null)
- {
- ui.hoverIcons.reset();
- }
-
- graphHandlerStart.apply(this, arguments);
- };
- }
-
- // Adds tooltip when mouse is over scrollbars to show space-drag panning option
- mxEvent.addListener(this.diagramContainer, 'mousemove', mxUtils.bind(this, function(evt)
- {
- var off = mxUtils.getOffset(this.diagramContainer);
-
- if (mxEvent.getClientX(evt) - off.x - this.diagramContainer.clientWidth > 0 ||
- mxEvent.getClientY(evt) - off.y - this.diagramContainer.clientHeight > 0)
- {
- this.diagramContainer.setAttribute('title', mxResources.get('panTooltip'));
- }
- else
- {
- this.diagramContainer.removeAttribute('title');
- }
- }));
-
- // Escape key hides dialogs, adds space+drag panning
- var spaceKeyPressed = false;
-
- // Overrides hovericons to disable while space key is pressed
- var hoverIconsIsResetEvent = this.hoverIcons.isResetEvent;
-
- this.hoverIcons.isResetEvent = function(evt, allowShift)
- {
- return spaceKeyPressed || hoverIconsIsResetEvent.apply(this, arguments);
- };
-
- this.keydownHandler = mxUtils.bind(this, function(evt)
- {
- if (evt.which == 32 /* Space */ && !graph.isEditing())
- {
- spaceKeyPressed = true;
- this.hoverIcons.reset();
- graph.container.style.cursor = 'move';
-
- // Disables scroll after space keystroke with scrollbars
- if (!graph.isEditing() && mxEvent.getSource(evt) == graph.container)
- {
- mxEvent.consume(evt);
- }
- }
- else if (!mxEvent.isConsumed(evt) && evt.keyCode == 27 /* Escape */)
- {
- this.hideDialog(null, true);
- }
- });
-
- mxEvent.addListener(document, 'keydown', this.keydownHandler);
-
- this.keyupHandler = mxUtils.bind(this, function(evt)
- {
- graph.container.style.cursor = '';
- spaceKeyPressed = false;
- });
-
- mxEvent.addListener(document, 'keyup', this.keyupHandler);
-
- // Forces panning for middle and right mouse buttons
- var panningHandlerIsForcePanningEvent = graph.panningHandler.isForcePanningEvent;
- graph.panningHandler.isForcePanningEvent = function(me)
- {
- // Ctrl+left button is reported as right button in FF on Mac
- return panningHandlerIsForcePanningEvent.apply(this, arguments) ||
- spaceKeyPressed || (mxEvent.isMouseEvent(me.getEvent()) &&
- (this.usePopupTrigger || !mxEvent.isPopupTrigger(me.getEvent())) &&
- ((!mxEvent.isControlDown(me.getEvent()) &&
- mxEvent.isRightMouseButton(me.getEvent())) ||
- mxEvent.isMiddleMouseButton(me.getEvent())));
- };
-
- // Ctrl/Cmd+Enter applies editing value except in Safari where Ctrl+Enter creates
- // a new line (while Enter creates a new paragraph and Shift+Enter stops)
- var cellEditorIsStopEditingEvent = graph.cellEditor.isStopEditingEvent;
- graph.cellEditor.isStopEditingEvent = function(evt)
- {
- return cellEditorIsStopEditingEvent.apply(this, arguments) ||
- (evt.keyCode == 13 && ((!mxClient.IS_SF && mxEvent.isControlDown(evt)) ||
- (mxClient.IS_MAC && mxEvent.isMetaDown(evt)) ||
- (mxClient.IS_SF && mxEvent.isShiftDown(evt))));
- };
-
- // Adds space+wheel for zoom
- var graphIsZoomWheelEvent = graph.isZoomWheelEvent;
-
- graph.isZoomWheelEvent = function()
- {
- return spaceKeyPressed || graphIsZoomWheelEvent.apply(this, arguments);
- };
-
- // Switches toolbar for text editing
- var textMode = false;
- var fontMenu = null;
- var sizeMenu = null;
- var nodes = null;
-
- var updateToolbar = mxUtils.bind(this, function()
- {
- if (this.toolbar != null && textMode != graph.cellEditor.isContentEditing())
- {
- var node = this.toolbar.container.firstChild;
- var newNodes = [];
-
- while (node != null)
- {
- var tmp = node.nextSibling;
-
- if (mxUtils.indexOf(this.toolbar.staticElements, node) < 0)
- {
- node.parentNode.removeChild(node);
- newNodes.push(node);
- }
-
- node = tmp;
- }
-
- // Saves references to special items
- var tmp1 = this.toolbar.fontMenu;
- var tmp2 = this.toolbar.sizeMenu;
-
- if (nodes == null)
- {
- this.toolbar.createTextToolbar();
- }
- else
- {
- for (var i = 0; i < nodes.length; i++)
- {
- this.toolbar.container.appendChild(nodes[i]);
- }
-
- // Restores references to special items
- this.toolbar.fontMenu = fontMenu;
- this.toolbar.sizeMenu = sizeMenu;
- }
-
- textMode = graph.cellEditor.isContentEditing();
- fontMenu = tmp1;
- sizeMenu = tmp2;
- nodes = newNodes;
- }
- });
-
- var ui = this;
-
- // Overrides cell editor to update toolbar
- var cellEditorStartEditing = graph.cellEditor.startEditing;
- graph.cellEditor.startEditing = function()
- {
- cellEditorStartEditing.apply(this, arguments);
- updateToolbar();
-
- if (graph.cellEditor.isContentEditing())
- {
- var updating = false;
-
- var updateCssHandler = function()
- {
- if (!updating)
- {
- updating = true;
-
- window.setTimeout(function()
- {
- var node = graph.getSelectedEditingElement();
-
- if (node != null)
- {
- var css = mxUtils.getCurrentStyle(node);
-
- if (css != null && ui.toolbar != null)
- {
- ui.toolbar.setFontName(Graph.stripQuotes(css.fontFamily));
- ui.toolbar.setFontSize(parseInt(css.fontSize));
- }
- }
-
- updating = false;
- }, 0);
- }
- };
-
- mxEvent.addListener(graph.cellEditor.textarea, 'input', updateCssHandler)
- mxEvent.addListener(graph.cellEditor.textarea, 'touchend', updateCssHandler);
- mxEvent.addListener(graph.cellEditor.textarea, 'mouseup', updateCssHandler);
- mxEvent.addListener(graph.cellEditor.textarea, 'keyup', updateCssHandler);
- updateCssHandler();
- }
- };
-
- // Updates toolbar and handles possible errors
- var cellEditorStopEditing = graph.cellEditor.stopEditing;
- graph.cellEditor.stopEditing = function(cell, trigger)
- {
- try
- {
- cellEditorStopEditing.apply(this, arguments);
- updateToolbar();
- }
- catch (e)
- {
- ui.handleError(e);
- }
- };
-
- // Enables scrollbars and sets cursor style for the container
- graph.container.setAttribute('tabindex', '0');
- graph.container.style.cursor = 'default';
-
- // Workaround for page scroll if embedded via iframe
- if (window.self === window.top && graph.container.parentNode != null)
- {
- try
- {
- graph.container.focus();
- }
- catch (e)
- {
- // ignores error in old versions of IE
- }
- }
-
- // Keeps graph container focused on mouse down
- var graphFireMouseEvent = graph.fireMouseEvent;
- graph.fireMouseEvent = function(evtName, me, sender)
- {
- if (evtName == mxEvent.MOUSE_DOWN)
- {
- this.container.focus();
- }
-
- graphFireMouseEvent.apply(this, arguments);
- };
-
- // Configures automatic expand on mouseover
- graph.popupMenuHandler.autoExpand = true;
-
- // Installs context menu
- if (this.menus != null)
- {
- graph.popupMenuHandler.factoryMethod = mxUtils.bind(this, function(menu, cell, evt)
- {
- this.menus.createPopupMenu(menu, cell, evt);
- });
- }
-
- // Hides context menu
- mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt)
- {
- graph.popupMenuHandler.hideMenu();
- }));
-
- // Create handler for key events
- this.keyHandler = this.createKeyHandler(editor);
-
- // Getter for key handler
- this.getKeyHandler = function()
- {
- return keyHandler;
- };
-
- // Stores the current style and assigns it to new cells
- var styles = ['rounded', 'shadow', 'glass', 'dashed', 'dashPattern', 'labelBackgroundColor',
- 'comic', 'sketch', 'fillWeight', 'hachureGap', 'hachureAngle', 'jiggle',
- 'disableMultiStroke', 'disableMultiStrokeFill', 'fillStyle', 'curveFitting',
- 'simplification', 'sketchStyle'];
- var connectStyles = ['shape', 'edgeStyle', 'curved', 'rounded', 'elbow', 'jumpStyle', 'jumpSize',
- 'comic', 'sketch', 'fillWeight', 'hachureGap', 'hachureAngle', 'jiggle',
- 'disableMultiStroke', 'disableMultiStrokeFill', 'fillStyle', 'curveFitting',
- 'simplification', 'sketchStyle'];
-
- // Note: Everything that is not in styles is ignored (styles is augmented below)
- this.setDefaultStyle = function(cell)
- {
- try
- {
- var state = graph.view.getState(cell);
-
- if (state != null)
- {
- // Ignores default styles
- var clone = cell.clone();
- clone.style = ''
- var defaultStyle = graph.getCellStyle(clone);
- var values = [];
- var keys = [];
-
- for (var key in state.style)
- {
- if (defaultStyle[key] != state.style[key])
- {
- values.push(state.style[key]);
- keys.push(key);
- }
- }
-
- // Handles special case for value "none"
- var cellStyle = graph.getModel().getStyle(state.cell);
- var tokens = (cellStyle != null) ? cellStyle.split(';') : [];
-
- for (var i = 0; i < tokens.length; i++)
- {
- var tmp = tokens[i];
- var pos = tmp.indexOf('=');
-
- if (pos >= 0)
- {
- var key = tmp.substring(0, pos);
- var value = tmp.substring(pos + 1);
-
- if (defaultStyle[key] != null && value == 'none')
- {
- values.push(value);
- keys.push(key);
- }
- }
- }
-
- // Resets current style
- if (graph.getModel().isEdge(state.cell))
- {
- graph.currentEdgeStyle = {};
- }
- else
- {
- graph.currentVertexStyle = {}
- }
-
- this.fireEvent(new mxEventObject('styleChanged', 'keys', keys, 'values', values, 'cells', [state.cell]));
- }
- }
- catch (e)
- {
- this.handleError(e);
- }
- };
-
- this.clearDefaultStyle = function()
- {
- graph.currentEdgeStyle = mxUtils.clone(graph.defaultEdgeStyle);
- graph.currentVertexStyle = mxUtils.clone(graph.defaultVertexStyle);
-
- // Updates UI
- this.fireEvent(new mxEventObject('styleChanged', 'keys', [], 'values', [], 'cells', []));
- };
-
- // Keys that should be ignored if the cell has a value (known: new default for all cells is html=1 so
- // for the html key this effecticely only works for edges inserted via the connection handler)
- var valueStyles = ['fontFamily', 'fontSource', 'fontSize', 'fontColor'];
-
- // Keys that always update the current edge style regardless of selection
- var alwaysEdgeStyles = ['edgeStyle', 'startArrow', 'startFill', 'startSize', 'endArrow',
- 'endFill', 'endSize'];
-
- // Keys that are ignored together (if one appears all are ignored)
- var keyGroups = [['startArrow', 'startFill', 'startSize', 'sourcePerimeterSpacing',
- 'endArrow', 'endFill', 'endSize', 'targetPerimeterSpacing'],
- ['strokeColor', 'strokeWidth'],
- ['fillColor', 'gradientColor'],
- valueStyles,
- ['opacity'],
- ['align'],
- ['html']];
-
- // Adds all keys used above to the styles array
- for (var i = 0; i < keyGroups.length; i++)
- {
- for (var j = 0; j < keyGroups[i].length; j++)
- {
- styles.push(keyGroups[i][j]);
- }
- }
-
- for (var i = 0; i < connectStyles.length; i++)
- {
- if (mxUtils.indexOf(styles, connectStyles[i]) < 0)
- {
- styles.push(connectStyles[i]);
- }
- }
-
- // Implements a global current style for edges and vertices that is applied to new cells
- var insertHandler = function(cells, asText, model)
- {
- model = (model != null) ? model : graph.getModel();
-
- model.beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- var cell = cells[i];
-
- var appliedStyles;
-
- if (asText)
- {
- // Applies only basic text styles
- appliedStyles = ['fontSize', 'fontFamily', 'fontColor'];
- }
- else
- {
- // Removes styles defined in the cell style from the styles to be applied
- var cellStyle = model.getStyle(cell);
- var tokens = (cellStyle != null) ? cellStyle.split(';') : [];
- appliedStyles = styles.slice();
-
- for (var j = 0; j < tokens.length; j++)
- {
- var tmp = tokens[j];
- var pos = tmp.indexOf('=');
-
- if (pos >= 0)
- {
- var key = tmp.substring(0, pos);
- var index = mxUtils.indexOf(appliedStyles, key);
-
- if (index >= 0)
- {
- appliedStyles.splice(index, 1);
- }
-
- // Handles special cases where one defined style ignores other styles
- for (var k = 0; k < keyGroups.length; k++)
- {
- var group = keyGroups[k];
-
- if (mxUtils.indexOf(group, key) >= 0)
- {
- for (var l = 0; l < group.length; l++)
- {
- var index2 = mxUtils.indexOf(appliedStyles, group[l]);
-
- if (index2 >= 0)
- {
- appliedStyles.splice(index2, 1);
- }
- }
- }
- }
- }
- }
- }
-
- // Applies the current style to the cell
- var edge = model.isEdge(cell);
- var current = (edge) ? graph.currentEdgeStyle : graph.currentVertexStyle;
- var newStyle = model.getStyle(cell);
-
- for (var j = 0; j < appliedStyles.length; j++)
- {
- var key = appliedStyles[j];
- var styleValue = current[key];
-
- if (styleValue != null && (key != 'shape' || edge))
- {
- // Special case: Connect styles are not applied here but in the connection handler
- if (!edge || mxUtils.indexOf(connectStyles, key) < 0)
- {
- newStyle = mxUtils.setStyle(newStyle, key, styleValue);
- }
- }
- }
-
- model.setStyle(cell, newStyle);
- }
- }
- finally
- {
- model.endUpdate();
- }
- };
-
- graph.addListener('cellsInserted', function(sender, evt)
- {
- insertHandler(evt.getProperty('cells'));
- });
-
- graph.addListener('textInserted', function(sender, evt)
- {
- insertHandler(evt.getProperty('cells'), true);
- });
-
- this.insertHandler = insertHandler;
-
- graph.connectionHandler.addListener(mxEvent.CONNECT, function(sender, evt)
- {
- var cells = [evt.getProperty('cell')];
-
- if (evt.getProperty('terminalInserted'))
- {
- cells.push(evt.getProperty('terminal'));
- }
-
- insertHandler(cells);
- });
-
- this.addListener('styleChanged', mxUtils.bind(this, function(sender, evt)
- {
- // Checks if edges and/or vertices were modified
- var cells = evt.getProperty('cells');
- var vertex = false;
- var edge = false;
-
- if (cells.length > 0)
- {
- for (var i = 0; i < cells.length; i++)
- {
- vertex = graph.getModel().isVertex(cells[i]) || vertex;
- edge = graph.getModel().isEdge(cells[i]) || edge;
-
- if (edge && vertex)
- {
- break;
- }
- }
- }
- else
- {
- vertex = true;
- edge = true;
- }
-
- var keys = evt.getProperty('keys');
- var values = evt.getProperty('values');
-
- for (var i = 0; i < keys.length; i++)
- {
- var common = mxUtils.indexOf(valueStyles, keys[i]) >= 0;
-
- // Ignores transparent stroke colors
- if (keys[i] != 'strokeColor' || (values[i] != null && values[i] != 'none'))
- {
- // Special case: Edge style and shape
- if (mxUtils.indexOf(connectStyles, keys[i]) >= 0)
- {
- if (edge || mxUtils.indexOf(alwaysEdgeStyles, keys[i]) >= 0)
- {
- if (values[i] == null)
- {
- delete graph.currentEdgeStyle[keys[i]];
- }
- else
- {
- graph.currentEdgeStyle[keys[i]] = values[i];
- }
- }
- // Uses style for vertex if defined in styles
- else if (vertex && mxUtils.indexOf(styles, keys[i]) >= 0)
- {
- if (values[i] == null)
- {
- delete graph.currentVertexStyle[keys[i]];
- }
- else
- {
- graph.currentVertexStyle[keys[i]] = values[i];
- }
- }
- }
- else if (mxUtils.indexOf(styles, keys[i]) >= 0)
- {
- if (vertex || common)
- {
- if (values[i] == null)
- {
- delete graph.currentVertexStyle[keys[i]];
- }
- else
- {
- graph.currentVertexStyle[keys[i]] = values[i];
- }
- }
-
- if (edge || common || mxUtils.indexOf(alwaysEdgeStyles, keys[i]) >= 0)
- {
- if (values[i] == null)
- {
- delete graph.currentEdgeStyle[keys[i]];
- }
- else
- {
- graph.currentEdgeStyle[keys[i]] = values[i];
- }
- }
- }
- }
- }
-
- if (this.toolbar != null)
- {
- this.toolbar.setFontName(graph.currentVertexStyle['fontFamily'] || Menus.prototype.defaultFont);
- this.toolbar.setFontSize(graph.currentVertexStyle['fontSize'] || Menus.prototype.defaultFontSize);
-
- if (this.toolbar.edgeStyleMenu != null)
- {
- // Updates toolbar icon for edge style
- var edgeStyleDiv = this.toolbar.edgeStyleMenu.getElementsByTagName('div')[0];
-
- if (graph.currentEdgeStyle['edgeStyle'] == 'orthogonalEdgeStyle' && graph.currentEdgeStyle['curved'] == '1')
- {
- edgeStyleDiv.className = 'geSprite geSprite-curved';
- }
- else if (graph.currentEdgeStyle['edgeStyle'] == 'straight' || graph.currentEdgeStyle['edgeStyle'] == 'none' ||
- graph.currentEdgeStyle['edgeStyle'] == null)
- {
- edgeStyleDiv.className = 'geSprite geSprite-straight';
- }
- else if (graph.currentEdgeStyle['edgeStyle'] == 'entityRelationEdgeStyle')
- {
- edgeStyleDiv.className = 'geSprite geSprite-entity';
- }
- else if (graph.currentEdgeStyle['edgeStyle'] == 'elbowEdgeStyle')
- {
- edgeStyleDiv.className = 'geSprite geSprite-' + ((graph.currentEdgeStyle['elbow'] == 'vertical') ?
- 'verticalelbow' : 'horizontalelbow');
- }
- else if (graph.currentEdgeStyle['edgeStyle'] == 'isometricEdgeStyle')
- {
- edgeStyleDiv.className = 'geSprite geSprite-' + ((graph.currentEdgeStyle['elbow'] == 'vertical') ?
- 'verticalisometric' : 'horizontalisometric');
- }
- else
- {
- edgeStyleDiv.className = 'geSprite geSprite-orthogonal';
- }
- }
-
- if (this.toolbar.edgeShapeMenu != null)
- {
- // Updates icon for edge shape
- var edgeShapeDiv = this.toolbar.edgeShapeMenu.getElementsByTagName('div')[0];
-
- if (graph.currentEdgeStyle['shape'] == 'link')
- {
- edgeShapeDiv.className = 'geSprite geSprite-linkedge';
- }
- else if (graph.currentEdgeStyle['shape'] == 'flexArrow')
- {
- edgeShapeDiv.className = 'geSprite geSprite-arrow';
- }
- else if (graph.currentEdgeStyle['shape'] == 'arrow')
- {
- edgeShapeDiv.className = 'geSprite geSprite-simplearrow';
- }
- else
- {
- edgeShapeDiv.className = 'geSprite geSprite-connection';
- }
- }
-
- // Updates icon for optinal line start shape
- if (this.toolbar.lineStartMenu != null)
- {
- var lineStartDiv = this.toolbar.lineStartMenu.getElementsByTagName('div')[0];
-
- lineStartDiv.className = this.getCssClassForMarker('start',
- graph.currentEdgeStyle['shape'], graph.currentEdgeStyle[mxConstants.STYLE_STARTARROW],
- mxUtils.getValue(graph.currentEdgeStyle, 'startFill', '1'));
- }
-
- // Updates icon for optinal line end shape
- if (this.toolbar.lineEndMenu != null)
- {
- var lineEndDiv = this.toolbar.lineEndMenu.getElementsByTagName('div')[0];
-
- lineEndDiv.className = this.getCssClassForMarker('end',
- graph.currentEdgeStyle['shape'], graph.currentEdgeStyle[mxConstants.STYLE_ENDARROW],
- mxUtils.getValue(graph.currentEdgeStyle, 'endFill', '1'));
- }
- }
- }));
-
- // Update font size and font family labels
- if (this.toolbar != null)
- {
- var update = mxUtils.bind(this, function()
- {
- var ff = graph.currentVertexStyle['fontFamily'] || 'Helvetica';
- var fs = String(graph.currentVertexStyle['fontSize'] || '12');
- var state = graph.getView().getState(graph.getSelectionCell());
-
- if (state != null)
- {
- ff = state.style[mxConstants.STYLE_FONTFAMILY] || ff;
- fs = state.style[mxConstants.STYLE_FONTSIZE] || fs;
-
- if (ff.length > 10)
- {
- ff = ff.substring(0, 8) + '...';
- }
- }
-
- this.toolbar.setFontName(ff);
- this.toolbar.setFontSize(fs);
- });
-
- graph.getSelectionModel().addListener(mxEvent.CHANGE, update);
- graph.getModel().addListener(mxEvent.CHANGE, update);
- }
-
- // Makes sure the current layer is visible when cells are added
- graph.addListener(mxEvent.CELLS_ADDED, function(sender, evt)
- {
- var cells = evt.getProperty('cells');
- var parent = evt.getProperty('parent');
-
- if (graph.getModel().isLayer(parent) && !graph.isCellVisible(parent) && cells != null && cells.length > 0)
- {
- graph.getModel().setVisible(parent, true);
- }
- });
-
- // Global handler to hide the current menu
- this.gestureHandler = mxUtils.bind(this, function(evt)
- {
- if (this.currentMenu != null && mxEvent.getSource(evt) != this.currentMenu.div)
- {
- this.hideCurrentMenu();
- }
- });
-
- mxEvent.addGestureListeners(document, this.gestureHandler);
-
- // Updates the editor UI after the window has been resized or the orientation changes
- // Timeout is workaround for old IE versions which have a delay for DOM client sizes.
- // Should not use delay > 0 to avoid handle multiple repaints during window resize
- this.resizeHandler = mxUtils.bind(this, function()
- {
- window.setTimeout(mxUtils.bind(this, function()
- {
- if (this.editor.graph != null)
- {
- this.refresh();
- }
- }), 0);
- });
-
- mxEvent.addListener(window, 'resize', this.resizeHandler);
-
- this.orientationChangeHandler = mxUtils.bind(this, function()
- {
- this.refresh();
- });
-
- mxEvent.addListener(window, 'orientationchange', this.orientationChangeHandler);
-
- // Workaround for bug on iOS see
- // http://stackoverflow.com/questions/19012135/ios-7-ipad-safari-landscape-innerheight-outerheight-layout-issue
- if (mxClient.IS_IOS && !window.navigator.standalone)
- {
- this.scrollHandler = mxUtils.bind(this, function()
- {
- window.scrollTo(0, 0);
- });
-
- mxEvent.addListener(window, 'scroll', this.scrollHandler);
- }
-
- /**
- * Sets the initial scrollbar locations after a file was loaded.
- */
- this.editor.addListener('resetGraphView', mxUtils.bind(this, function()
- {
- this.resetScrollbars();
- }));
-
- /**
- * Repaints the grid.
- */
- this.addListener('gridEnabledChanged', mxUtils.bind(this, function()
- {
- graph.view.validateBackground();
- }));
-
- this.addListener('backgroundColorChanged', mxUtils.bind(this, function()
- {
- graph.view.validateBackground();
- }));
-
- /**
- * Repaints the grid.
- */
- graph.addListener('gridSizeChanged', mxUtils.bind(this, function()
- {
- if (graph.isGridEnabled())
- {
- graph.view.validateBackground();
- }
- }));
-
- // Resets UI, updates action and menu states
- this.editor.resetGraph();
- }
-
- this.init();
-
- if (!graph.standalone)
- {
- this.open();
- }
-};
-
-// Extends mxEventSource
-mxUtils.extend(EditorUi, mxEventSource);
-
-/**
- * Global config that specifies if the compact UI elements should be used.
- */
-EditorUi.compactUi = true;
-
-/**
- * Specifies the size of the split bar.
- */
-EditorUi.prototype.splitSize = (mxClient.IS_TOUCH || mxClient.IS_POINTER) ? 12 : 8;
-
-/**
- * Specifies the height of the menubar. Default is 30.
- */
-EditorUi.prototype.menubarHeight = 30;
-
-/**
- * Specifies the width of the format panel should be enabled. Default is true.
- */
-EditorUi.prototype.formatEnabled = true;
-
-/**
- * Specifies the width of the format panel. Default is 240.
- */
-EditorUi.prototype.formatWidth = 240;
-
-/**
- * Specifies the height of the toolbar. Default is 38.
- */
-EditorUi.prototype.toolbarHeight = 38;
-
-/**
- * Specifies the height of the footer. Default is 28.
- */
-EditorUi.prototype.footerHeight = 28;
-
-/**
- * Specifies the height of the optional sidebarFooterContainer. Default is 34.
- */
-EditorUi.prototype.sidebarFooterHeight = 34;
-
-/**
- * Specifies the position of the horizontal split bar. Default is 240 or 118 for
- * screen widths <= 640px.
- */
-EditorUi.prototype.hsplitPosition = (screen.width <= 640) ? 118 : ((urlParams['sidebar-entries'] != 'large') ? 212 : 240);
-
-/**
- * Specifies if animations are allowed in <executeLayout>. Default is true.
- */
-EditorUi.prototype.allowAnimation = true;
-
-/**
- * Default is 2.
- */
-EditorUi.prototype.lightboxMaxFitScale = 2;
-
-/**
- * Default is 4.
- */
-EditorUi.prototype.lightboxVerticalDivider = 4;
-
-/**
- * Specifies if single click on horizontal split should collapse sidebar. Default is false.
- */
-EditorUi.prototype.hsplitClickEnabled = false;
-
-/**
- * Installs the listeners to update the action states.
- */
-EditorUi.prototype.init = function()
-{
- var graph = this.editor.graph;
-
- if (!graph.standalone)
- {
- if (urlParams['shape-picker'] != '0')
- {
- this.installShapePicker();
- }
-
- // Hides tooltips and connection points when scrolling
- mxEvent.addListener(graph.container, 'scroll', mxUtils.bind(this, function()
- {
- graph.tooltipHandler.hide();
-
- if (graph.connectionHandler != null && graph.connectionHandler.constraintHandler != null)
- {
- graph.connectionHandler.constraintHandler.reset();
- }
- }));
-
- // Hides tooltip on escape
- graph.addListener(mxEvent.ESCAPE, mxUtils.bind(this, function()
- {
- graph.tooltipHandler.hide();
- var rb = graph.getRubberband();
-
- if (rb != null)
- {
- rb.cancel();
- }
- }));
-
- mxEvent.addListener(graph.container, 'keydown', mxUtils.bind(this, function(evt)
- {
- this.onKeyDown(evt);
- }));
-
- mxEvent.addListener(graph.container, 'keypress', mxUtils.bind(this, function(evt)
- {
- this.onKeyPress(evt);
- }));
-
- // Updates action states
- this.addUndoListener();
- this.addBeforeUnloadListener();
-
- graph.getSelectionModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function()
- {
- this.updateActionStates();
- }));
-
- graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function()
- {
- this.updateActionStates();
- }));
-
- // Changes action states after change of default parent
- var graphSetDefaultParent = graph.setDefaultParent;
- var ui = this;
-
- this.editor.graph.setDefaultParent = function()
- {
- graphSetDefaultParent.apply(this, arguments);
- ui.updateActionStates();
- };
-
- // Hack to make editLink available in vertex handler
- graph.editLink = ui.actions.get('editLink').funct;
-
- this.updateActionStates();
- this.initClipboard();
- this.initCanvas();
-
- if (this.format != null)
- {
- this.format.init();
- }
- }
-};
-
-/**
- * Returns true if the given event should start editing. This implementation returns true.
- */
-EditorUi.prototype.installShapePicker = function()
-{
- var graph = this.editor.graph;
- var ui = this;
-
- // Uses this event to process mouseDown to check the selection state before it is changed
- graph.addListener(mxEvent.FIRE_MOUSE_EVENT, mxUtils.bind(this, function(sender, evt)
- {
- if (evt.getProperty('eventName') == 'mouseDown')
- {
- ui.hideShapePicker();
- }
- }));
-
- graph.addListener(mxEvent.ESCAPE, mxUtils.bind(this, function()
- {
- ui.hideShapePicker(true);
- }));
-
- graph.getSelectionModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function()
- {
- ui.hideShapePicker(true);
- }));
-
- graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function()
- {
- ui.hideShapePicker(true);
- }));
-
- // Counts as popup menu
- var popupMenuHandlerIsMenuShowing = graph.popupMenuHandler.isMenuShowing;
-
- graph.popupMenuHandler.isMenuShowing = function()
- {
- return popupMenuHandlerIsMenuShowing.apply(this, arguments) || ui.shapePicker != null;
- };
-
- // Adds dbl click dialog for inserting shapes
- var graphDblClick = graph.dblClick;
-
- graph.dblClick = function(evt, cell)
- {
- if (this.isEnabled())
- {
- if (cell == null && ui.sidebar != null && !mxEvent.isShiftDown(evt))
- {
- mxEvent.consume(evt);
- var pt = mxUtils.convertPoint(this.container, mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-
- // Asynchronous to avoid direct insert after double tap
- window.setTimeout(mxUtils.bind(this, function()
- {
- ui.showShapePicker(pt.x, pt.y);
- }), 30);
- }
- else
- {
- graphDblClick.apply(this, arguments);
- }
- }
- };
-
- if (this.hoverIcons != null)
- {
- var hoverIconsDrag = this.hoverIcons.drag;
-
- this.hoverIcons.drag = function()
- {
- ui.hideShapePicker();
- hoverIconsDrag.apply(this, arguments);
- };
-
- var hoverIconsExecute = this.hoverIcons.execute;
-
- this.hoverIcons.execute = function(state, dir, me)
- {
- var evt = me.getEvent();
-
- if (!this.graph.isCloneEvent(evt) && !mxEvent.isShiftDown(evt))
- {
- this.graph.connectVertex(state.cell, dir, this.graph.defaultEdgeLength, evt, null, null, mxUtils.bind(this, function(x, y, execute)
- {
- var temp = graph.getCompositeParent(state.cell);
- var geo = graph.getCellGeometry(temp);
- me.consume();
-
- while (temp != null && graph.model.isVertex(temp) && geo != null && geo.relative)
- {
- cell = temp;
- temp = graph.model.getParent(cell)
- geo = graph.getCellGeometry(temp);
- }
-
- // Asynchronous to avoid direct insert after double tap
- window.setTimeout(mxUtils.bind(this, function()
- {
- ui.showShapePicker(me.getGraphX(), me.getGraphY(), temp, mxUtils.bind(this, function(cell)
- {
- execute(cell);
- }), dir);
- }), 30);
- }), mxUtils.bind(this, function(result)
- {
- this.graph.selectCellsForConnectVertex(result, evt, this);
- }));
- }
- else
- {
- hoverIconsExecute.apply(this, arguments);
- }
- };
- }
-};
-
-/**
- * Creates a temporary graph instance for rendering off-screen content.
- */
-EditorUi.prototype.showShapePicker = function(x, y, source, callback, direction)
-{
- var cells = this.getCellsForShapePicker(source);
-
- if (cells != null && cells.length > 0)
- {
- var ui = this;
- var graph = this.editor.graph;
- var div = document.createElement('div');
- var sourceState = graph.view.getState(source);
- var style = (source != null && (sourceState == null ||
- !graph.isTransparentState(sourceState))) ?
- graph.copyStyle(source) : null;
-
- // Do not place entry under pointer for touch devices
- div.className = 'geToolbarContainer geSidebarContainer geSidebar';
- div.style.cssText = 'position:absolute;left:' + x + 'px;top:' + y +
- 'px;width:140px;border-radius:10px;padding:4px;text-align:center;' +
- 'box-shadow:0px 0px 3px 1px #d1d1d1;padding: 6px 0 8px 0;';
- mxUtils.setPrefixedStyle(div.style, 'transform', 'translate(-22px,-22px)');
-
- if (graph.background != null && graph.background != mxConstants.NONE)
- {
- div.style.backgroundColor = graph.background;
- }
-
- graph.container.appendChild(div);
-
- var addCell = mxUtils.bind(this, function(cell)
- {
- // Wrapper needed to catch events
- var node = document.createElement('a');
- node.className = 'geItem';
- node.style.cssText = 'position:relative;display:inline-block;position:relative;' +
- 'width:30px;height:30px;cursor:pointer;overflow:hidden;padding:3px 0 0 3px;';
- div.appendChild(node);
-
- if (style != null)
- {
- this.sidebar.graph.pasteStyle(style, [cell]);
- }
- else
- {
- ui.insertHandler([cell], cell.value != '', this.sidebar.graph.model);
- }
-
- this.sidebar.createThumb([cell], 25, 25, node, null, true, false, cell.geometry.width, cell.geometry.height);
-
- mxEvent.addListener(node, 'click', function()
- {
- var clone = graph.cloneCell(cell);
-
- if (callback != null)
- {
- callback(clone);
- }
- else
- {
- clone.geometry.x = graph.snap(Math.round(x / graph.view.scale) -
- graph.view.translate.x - cell.geometry.width / 2);
- clone.geometry.y = graph.snap(Math.round(y / graph.view.scale) -
- graph.view.translate.y - cell.geometry.height / 2);
-
- graph.model.beginUpdate();
- try
- {
- graph.addCell(clone);
- }
- finally
- {
- graph.model.endUpdate();
- }
-
- graph.setSelectionCell(clone);
- graph.scrollCellToVisible(clone);
- graph.startEditingAtCell(clone);
-
- if (ui.hoverIcons != null)
- {
- ui.hoverIcons.update(graph.view.getState(clone));
- }
- }
-
- ui.hideShapePicker();
- });
- });
-
- for (var i = 0; i < cells.length; i++)
- {
- addCell(cells[i]);
- }
-
- if (ui.hoverIcons != null)
- {
- ui.hoverIcons.reset();
- }
-
- graph.popupMenuHandler.hideMenu();
- graph.tooltipHandler.hideTooltip();
- this.hideCurrentMenu();
- this.hideShapePicker();
-
- this.shapePickerCallback = callback;
- this.shapePicker = div;
- }
-};
-
-/**
- * Creates a temporary graph instance for rendering off-screen content.
- */
-EditorUi.prototype.getCellsForShapePicker = function(cell)
-{
- var createVertex = mxUtils.bind(this, function(style, w, h, value)
- {
- return this.editor.graph.createVertex(null, null, value || '', 0, 0, w || 120, h || 60, style, false);
- });
-
- return [(cell != null) ? this.editor.graph.cloneCell(cell) :
- createVertex('text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;', 40, 20, 'Text'),
- createVertex('whiteSpace=wrap;html=1;'),
- createVertex('ellipse;whiteSpace=wrap;html=1;', 120, 80),
- createVertex('rhombus;whiteSpace=wrap;html=1;', 80, 80),
- createVertex('shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;'),
- createVertex('shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;', 120, 60),
- createVertex('shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;', 120, 80),
- createVertex('shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;', 120, 80),
- createVertex('shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;'),
- createVertex('shape=cube;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;darkOpacity=0.05;darkOpacity2=0.1;', 120, 80),
- createVertex('shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;', 80, 100),
- createVertex('triangle;whiteSpace=wrap;html=1;', 60, 80),
- createVertex('shape=document;whiteSpace=wrap;html=1;boundedLbl=1;', 120, 80),
- createVertex('shape=tape;whiteSpace=wrap;html=1;', 120, 100),
- createVertex('ellipse;shape=cloud;whiteSpace=wrap;html=1;', 120, 80),
- createVertex('shape=cylinder;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;', 60, 80)];
-};
-
-/**
- * Creates a temporary graph instance for rendering off-screen content.
- */
-EditorUi.prototype.hideShapePicker = function(cancel)
-{
- if (this.shapePicker != null)
- {
- this.shapePicker.parentNode.removeChild(this.shapePicker);
- this.shapePicker = null;
-
- if (!cancel && this.shapePickerCallback != null)
- {
- this.shapePickerCallback();
- }
-
- this.shapePickerCallback = null;
- }
-};
-
-/**
- * Returns true if the given event should start editing. This implementation returns true.
- */
-EditorUi.prototype.onKeyDown = function(evt)
-{
- var graph = this.editor.graph;
-
- // Tab selects next cell
- if (evt.which == 9 && graph.isEnabled() && !mxEvent.isAltDown(evt) &&
- (!graph.isEditing() || !mxEvent.isShiftDown(evt)))
- {
- if (graph.isEditing())
- {
- graph.stopEditing(false);
- }
- else
- {
- graph.selectCell(!mxEvent.isShiftDown(evt));
- }
-
- mxEvent.consume(evt);
- }
-};
-
-/**
- * Returns true if the given event should start editing. This implementation returns true.
- */
-EditorUi.prototype.onKeyPress = function(evt)
-{
- var graph = this.editor.graph;
-
- // KNOWN: Focus does not work if label is empty in quirks mode
- if (this.isImmediateEditingEvent(evt) && !graph.isEditing() && !graph.isSelectionEmpty() && evt.which !== 0 &&
- evt.which !== 27 && !mxEvent.isAltDown(evt) && !mxEvent.isControlDown(evt) && !mxEvent.isMetaDown(evt))
- {
- graph.escape();
- graph.startEditing();
-
- // Workaround for FF where char is lost if cursor is placed before char
- if (mxClient.IS_FF)
- {
- var ce = graph.cellEditor;
-
- if (ce.textarea != null)
- {
- ce.textarea.innerHTML = String.fromCharCode(evt.which);
-
- // Moves cursor to end of textarea
- var range = document.createRange();
- range.selectNodeContents(ce.textarea);
- range.collapse(false);
- var sel = window.getSelection();
- sel.removeAllRanges();
- sel.addRange(range);
- }
- }
- }
-};
-
-/**
- * Returns true if the given event should start editing. This implementation returns true.
- */
-EditorUi.prototype.isImmediateEditingEvent = function(evt)
-{
- return true;
-};
-
-/**
- * Private helper method.
- */
-EditorUi.prototype.getCssClassForMarker = function(prefix, shape, marker, fill)
-{
- var result = '';
-
- if (shape == 'flexArrow')
- {
- result = (marker != null && marker != mxConstants.NONE) ?
- 'geSprite geSprite-' + prefix + 'blocktrans' : 'geSprite geSprite-noarrow';
- }
- else
- {
- // SVG marker sprites
- if (marker == 'box' || marker == 'halfCircle')
- {
- result = 'geSprite geSvgSprite geSprite-' + marker + ((prefix == 'end') ? ' geFlipSprite' : '');
- }
- else if (marker == mxConstants.ARROW_CLASSIC)
- {
- result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'classic' : 'geSprite geSprite-' + prefix + 'classictrans';
- }
- else if (marker == mxConstants.ARROW_CLASSIC_THIN)
- {
- result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'classicthin' : 'geSprite geSprite-' + prefix + 'classicthintrans';
- }
- else if (marker == mxConstants.ARROW_OPEN)
- {
- result = 'geSprite geSprite-' + prefix + 'open';
- }
- else if (marker == mxConstants.ARROW_OPEN_THIN)
- {
- result = 'geSprite geSprite-' + prefix + 'openthin';
- }
- else if (marker == mxConstants.ARROW_BLOCK)
- {
- result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'block' : 'geSprite geSprite-' + prefix + 'blocktrans';
- }
- else if (marker == mxConstants.ARROW_BLOCK_THIN)
- {
- result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'blockthin' : 'geSprite geSprite-' + prefix + 'blockthintrans';
- }
- else if (marker == mxConstants.ARROW_OVAL)
- {
- result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'oval' : 'geSprite geSprite-' + prefix + 'ovaltrans';
- }
- else if (marker == mxConstants.ARROW_DIAMOND)
- {
- result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'diamond' : 'geSprite geSprite-' + prefix + 'diamondtrans';
- }
- else if (marker == mxConstants.ARROW_DIAMOND_THIN)
- {
- result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'thindiamond' : 'geSprite geSprite-' + prefix + 'thindiamondtrans';
- }
- else if (marker == 'openAsync')
- {
- result = 'geSprite geSprite-' + prefix + 'openasync';
- }
- else if (marker == 'dash')
- {
- result = 'geSprite geSprite-' + prefix + 'dash';
- }
- else if (marker == 'cross')
- {
- result = 'geSprite geSprite-' + prefix + 'cross';
- }
- else if (marker == 'async')
- {
- result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'async' : 'geSprite geSprite-' + prefix + 'asynctrans';
- }
- else if (marker == 'circle' || marker == 'circlePlus')
- {
- result = (fill == '1' || marker == 'circle') ? 'geSprite geSprite-' + prefix + 'circle' : 'geSprite geSprite-' + prefix + 'circleplus';
- }
- else if (marker == 'ERone')
- {
- result = 'geSprite geSprite-' + prefix + 'erone';
- }
- else if (marker == 'ERmandOne')
- {
- result = 'geSprite geSprite-' + prefix + 'eronetoone';
- }
- else if (marker == 'ERmany')
- {
- result = 'geSprite geSprite-' + prefix + 'ermany';
- }
- else if (marker == 'ERoneToMany')
- {
- result = 'geSprite geSprite-' + prefix + 'eronetomany';
- }
- else if (marker == 'ERzeroToOne')
- {
- result = 'geSprite geSprite-' + prefix + 'eroneopt';
- }
- else if (marker == 'ERzeroToMany')
- {
- result = 'geSprite geSprite-' + prefix + 'ermanyopt';
- }
- else
- {
- result = 'geSprite geSprite-noarrow';
- }
- }
-
- return result;
-};
-
-/**
- * Overridden in Menus.js
- */
-EditorUi.prototype.createMenus = function()
-{
- return null;
-};
-
-/**
- * Hook for allowing selection and context menu for certain events.
- */
-EditorUi.prototype.updatePasteActionStates = function()
-{
- var graph = this.editor.graph;
- var paste = this.actions.get('paste');
- var pasteHere = this.actions.get('pasteHere');
-
- paste.setEnabled(this.editor.graph.cellEditor.isContentEditing() || (!mxClipboard.isEmpty() &&
- graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())));
- pasteHere.setEnabled(paste.isEnabled());
-};
-
-/**
- * Hook for allowing selection and context menu for certain events.
- */
-EditorUi.prototype.initClipboard = function()
-{
- var ui = this;
-
- var mxClipboardCut = mxClipboard.cut;
- mxClipboard.cut = function(graph)
- {
- if (graph.cellEditor.isContentEditing())
- {
- document.execCommand('cut', false, null);
- }
- else
- {
- mxClipboardCut.apply(this, arguments);
- }
-
- ui.updatePasteActionStates();
- };
-
- var mxClipboardCopy = mxClipboard.copy;
- mxClipboard.copy = function(graph)
- {
- var result = null;
-
- if (graph.cellEditor.isContentEditing())
- {
- document.execCommand('copy', false, null);
- }
- else
- {
- result = result || graph.getSelectionCells();
- result = graph.getExportableCells(graph.model.getTopmostCells(result));
-
- var cloneMap = new Object();
- var lookup = graph.createCellLookup(result);
- var clones = graph.cloneCells(result, null, cloneMap);
-
- // Uses temporary model to force new IDs to be assigned
- // to avoid having to carry over the mapping from object
- // ID to cell ID to the paste operation
- var model = new mxGraphModel();
- var parent = model.getChildAt(model.getRoot(), 0);
-
- for (var i = 0; i < clones.length; i++)
- {
- model.add(parent, clones[i]);
-
- // Checks for orphaned relative children and makes absolute
- var state = graph.view.getState(result[i]);
-
- if (state != null)
- {
- var geo = graph.getCellGeometry(clones[i]);
-
- if (geo != null && geo.relative && !model.isEdge(result[i]) &&
- lookup[mxObjectIdentity.get(model.getParent(result[i]))] == null)
- {
- geo.offset = null;
- geo.relative = false;
- geo.x = state.x / state.view.scale - state.view.translate.x;
- geo.y = state.y / state.view.scale - state.view.translate.y;
- }
- }
- }
-
- graph.updateCustomLinks(graph.createCellMapping(cloneMap, lookup), clones);
-
- mxClipboard.insertCount = 1;
- mxClipboard.setCells(clones);
- }
-
- ui.updatePasteActionStates();
-
- return result;
- };
-
- var mxClipboardPaste = mxClipboard.paste;
- mxClipboard.paste = function(graph)
- {
- var result = null;
-
- if (graph.cellEditor.isContentEditing())
- {
- document.execCommand('paste', false, null);
- }
- else
- {
- result = mxClipboardPaste.apply(this, arguments);
- }
-
- ui.updatePasteActionStates();
-
- return result;
- };
-
- // Overrides cell editor to update paste action state
- var cellEditorStartEditing = this.editor.graph.cellEditor.startEditing;
-
- this.editor.graph.cellEditor.startEditing = function()
- {
- cellEditorStartEditing.apply(this, arguments);
- ui.updatePasteActionStates();
- };
-
- var cellEditorStopEditing = this.editor.graph.cellEditor.stopEditing;
-
- this.editor.graph.cellEditor.stopEditing = function(cell, trigger)
- {
- cellEditorStopEditing.apply(this, arguments);
- ui.updatePasteActionStates();
- };
-
- this.updatePasteActionStates();
-};
-
-/**
- * Delay between zoom steps when not using preview.
- */
-EditorUi.prototype.lazyZoomDelay = 20;
-
-/**
- * Delay before update of DOM when using preview.
- */
-EditorUi.prototype.wheelZoomDelay = 400;
-
-/**
- * Delay before update of DOM when using preview.
- */
-EditorUi.prototype.buttonZoomDelay = 600;
-
-/**
- * Initializes the infinite canvas.
- */
-EditorUi.prototype.initCanvas = function()
-{
- // Initial page layout view, scrollBuffer and timer-based scrolling
- var graph = this.editor.graph;
- graph.timerAutoScroll = true;
-
- /**
- * Returns the padding for pages in page view with scrollbars.
- */
- graph.getPagePadding = function()
- {
- return new mxPoint(Math.max(0, Math.round((graph.container.offsetWidth - 34) / graph.view.scale)),
- Math.max(0, Math.round((graph.container.offsetHeight - 34) / graph.view.scale)));
- };
-
- // Fits the number of background pages to the graph
- graph.view.getBackgroundPageBounds = function()
- {
- var layout = this.graph.getPageLayout();
- var page = this.graph.getPageSize();
-
- return new mxRectangle(this.scale * (this.translate.x + layout.x * page.width),
- this.scale * (this.translate.y + layout.y * page.height),
- this.scale * layout.width * page.width,
- this.scale * layout.height * page.height);
- };
-
- graph.getPreferredPageSize = function(bounds, width, height)
- {
- var pages = this.getPageLayout();
- var size = this.getPageSize();
-
- return new mxRectangle(0, 0, pages.width * size.width, pages.height * size.height);
- };
-
- // Scales pages/graph to fit available size
- var resize = null;
- var ui = this;
-
- if (this.editor.isChromelessView())
- {
- resize = mxUtils.bind(this, function(autoscale, maxScale, cx, cy)
- {
- if (graph.container != null && !graph.isViewer())
- {
- cx = (cx != null) ? cx : 0;
- cy = (cy != null) ? cy : 0;
-
- var bds = (graph.pageVisible) ? graph.view.getBackgroundPageBounds() : graph.getGraphBounds();
- var scroll = mxUtils.hasScrollbars(graph.container);
- var tr = graph.view.translate;
- var s = graph.view.scale;
-
- // Normalizes the bounds
- var b = mxRectangle.fromRectangle(bds);
- b.x = b.x / s - tr.x;
- b.y = b.y / s - tr.y;
- b.width /= s;
- b.height /= s;
-
- var st = graph.container.scrollTop;
- var sl = graph.container.scrollLeft;
- var sb = (mxClient.IS_QUIRKS || document.documentMode >= 8) ? 20 : 14;
-
- if (document.documentMode == 8 || document.documentMode == 9)
- {
- sb += 3;
- }
-
- var cw = graph.container.offsetWidth - sb;
- var ch = graph.container.offsetHeight - sb;
-
- var ns = (autoscale) ? Math.max(0.3, Math.min(maxScale || 1, cw / b.width)) : s;
- var dx = ((cw - ns * b.width) / 2) / ns;
- var dy = (this.lightboxVerticalDivider == 0) ? 0 : ((ch - ns * b.height) / this.lightboxVerticalDivider) / ns;
-
- if (scroll)
- {
- dx = Math.max(dx, 0);
- dy = Math.max(dy, 0);
- }
-
- if (scroll || bds.width < cw || bds.height < ch)
- {
- graph.view.scaleAndTranslate(ns, Math.floor(dx - b.x), Math.floor(dy - b.y));
- graph.container.scrollTop = st * ns / s;
- graph.container.scrollLeft = sl * ns / s;
- }
- else if (cx != 0 || cy != 0)
- {
- var t = graph.view.translate;
- graph.view.setTranslate(Math.floor(t.x + cx / s), Math.floor(t.y + cy / s));
- }
- }
- });
-
- // Hack to make function available to subclassers
- this.chromelessResize = resize;
-
- // Hook for subclassers for override
- this.chromelessWindowResize = mxUtils.bind(this, function()
- {
- this.chromelessResize(false);
- });
-
- // Removable resize listener
- var autoscaleResize = mxUtils.bind(this, function()
- {
- this.chromelessWindowResize(false);
- });
-
- mxEvent.addListener(window, 'resize', autoscaleResize);
-
- this.destroyFunctions.push(function()
- {
- mxEvent.removeListener(window, 'resize', autoscaleResize);
- });
-
- this.editor.addListener('resetGraphView', mxUtils.bind(this, function()
- {
- this.chromelessResize(true);
- }));
-
- this.actions.get('zoomIn').funct = mxUtils.bind(this, function(evt)
- {
- graph.zoomIn();
- this.chromelessResize(false);
- });
- this.actions.get('zoomOut').funct = mxUtils.bind(this, function(evt)
- {
- graph.zoomOut();
- this.chromelessResize(false);
- });
-
- // Creates toolbar for viewer - do not use CSS here
- // as this may be used in a viewer that has no CSS
- if (urlParams['toolbar'] != '0')
- {
- var toolbarConfig = JSON.parse(decodeURIComponent(urlParams['toolbar-config'] || '{}'));
-
- this.chromelessToolbar = document.createElement('div');
- this.chromelessToolbar.style.position = 'fixed';
- this.chromelessToolbar.style.overflow = 'hidden';
- this.chromelessToolbar.style.boxSizing = 'border-box';
- this.chromelessToolbar.style.whiteSpace = 'nowrap';
- this.chromelessToolbar.style.backgroundColor = '#000000';
- this.chromelessToolbar.style.padding = '10px 10px 8px 10px';
- this.chromelessToolbar.style.left = (graph.isViewer()) ? '0' : '50%';
-
- if (!mxClient.IS_VML)
- {
- mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'borderRadius', '20px');
- mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'transition', 'opacity 600ms ease-in-out');
- }
-
- var updateChromelessToolbarPosition = mxUtils.bind(this, function()
- {
- var css = mxUtils.getCurrentStyle(graph.container);
-
- if (graph.isViewer())
- {
- this.chromelessToolbar.style.top = '0';
- }
- else
- {
- this.chromelessToolbar.style.bottom = ((css != null) ? parseInt(css['margin-bottom'] || 0) : 0) +
- ((this.tabContainer != null) ? (20 + parseInt(this.tabContainer.style.height)) : 20) + 'px';
- }
- });
-
- this.editor.addListener('resetGraphView', updateChromelessToolbarPosition);
- updateChromelessToolbarPosition();
-
- var btnCount = 0;
-
- var addButton = mxUtils.bind(this, function(fn, imgSrc, tip)
- {
- btnCount++;
-
- var a = document.createElement('span');
- a.style.paddingLeft = '8px';
- a.style.paddingRight = '8px';
- a.style.cursor = 'pointer';
- mxEvent.addListener(a, 'click', fn);
-
- if (tip != null)
- {
- a.setAttribute('title', tip);
- }
-
- var img = document.createElement('img');
- img.setAttribute('border', '0');
- img.setAttribute('src', imgSrc);
-
- a.appendChild(img);
- this.chromelessToolbar.appendChild(a);
-
- return a;
- });
-
- if (toolbarConfig.backBtn != null)
- {
- addButton(mxUtils.bind(this, function(evt)
- {
- window.location.href = toolbarConfig.backBtn.url;
- mxEvent.consume(evt);
- }), Editor.backLargeImage, mxResources.get('back', null, 'Back'));
- }
-
- if (this.isPagesEnabled())
- {
- var prevButton = addButton(mxUtils.bind(this, function(evt)
- {
- this.actions.get('previousPage').funct();
- mxEvent.consume(evt);
- }), Editor.previousLargeImage, mxResources.get('previousPage'));
-
- var pageInfo = document.createElement('div');
- pageInfo.style.display = 'inline-block';
- pageInfo.style.verticalAlign = 'top';
- pageInfo.style.fontFamily = 'Helvetica,Arial';
- pageInfo.style.marginTop = '8px';
- pageInfo.style.fontSize = '14px';
- pageInfo.style.color = '#ffffff';
- this.chromelessToolbar.appendChild(pageInfo);
-
- var nextButton = addButton(mxUtils.bind(this, function(evt)
- {
- this.actions.get('nextPage').funct();
- mxEvent.consume(evt);
- }), Editor.nextLargeImage, mxResources.get('nextPage'));
-
- var updatePageInfo = mxUtils.bind(this, function()
- {
- if (this.pages != null && this.pages.length > 1 && this.currentPage != null)
- {
- pageInfo.innerHTML = '';
- mxUtils.write(pageInfo, (mxUtils.indexOf(this.pages, this.currentPage) + 1) + ' / ' + this.pages.length);
- }
- });
-
- prevButton.style.paddingLeft = '0px';
- prevButton.style.paddingRight = '4px';
- nextButton.style.paddingLeft = '4px';
- nextButton.style.paddingRight = '0px';
-
- var updatePageButtons = mxUtils.bind(this, function()
- {
- if (this.pages != null && this.pages.length > 1 && this.currentPage != null)
- {
- nextButton.style.display = '';
- prevButton.style.display = '';
- pageInfo.style.display = 'inline-block';
- }
- else
- {
- nextButton.style.display = 'none';
- prevButton.style.display = 'none';
- pageInfo.style.display = 'none';
- }
-
- updatePageInfo();
- });
-
- this.editor.addListener('resetGraphView', updatePageButtons);
- this.editor.addListener('pageSelected', updatePageInfo);
- }
-
- addButton(mxUtils.bind(this, function(evt)
- {
- this.actions.get('zoomOut').funct();
- mxEvent.consume(evt);
- }), Editor.zoomOutLargeImage, mxResources.get('zoomOut') + ' (Alt+Mousewheel)');
-
- addButton(mxUtils.bind(this, function(evt)
- {
- this.actions.get('zoomIn').funct();
- mxEvent.consume(evt);
- }), Editor.zoomInLargeImage, mxResources.get('zoomIn') + ' (Alt+Mousewheel)');
-
- addButton(mxUtils.bind(this, function(evt)
- {
- if (graph.isLightboxView())
- {
- if (graph.view.scale == 1)
- {
- this.lightboxFit();
- }
- else
- {
- graph.zoomTo(1);
- }
-
- this.chromelessResize(false);
- }
- else
- {
- this.chromelessResize(true);
- }
-
- mxEvent.consume(evt);
- }), Editor.actualSizeLargeImage, mxResources.get('fit'));
-
- // Changes toolbar opacity on hover
- var fadeThread = null;
- var fadeThread2 = null;
-
- var fadeOut = mxUtils.bind(this, function(delay)
- {
- if (fadeThread != null)
- {
- window.clearTimeout(fadeThread);
- fadeThread = null;
- }
-
- if (fadeThread2 != null)
- {
- window.clearTimeout(fadeThread2);
- fadeThread2 = null;
- }
-
- fadeThread = window.setTimeout(mxUtils.bind(this, function()
- {
- mxUtils.setOpacity(this.chromelessToolbar, 0);
- fadeThread = null;
-
- fadeThread2 = window.setTimeout(mxUtils.bind(this, function()
- {
- this.chromelessToolbar.style.display = 'none';
- fadeThread2 = null;
- }), 600);
- }), delay || 200);
- });
-
- var fadeIn = mxUtils.bind(this, function(opacity)
- {
- if (fadeThread != null)
- {
- window.clearTimeout(fadeThread);
- fadeThread = null;
- }
-
- if (fadeThread2 != null)
- {
- window.clearTimeout(fadeThread2);
- fadeThread2 = null;
- }
-
- this.chromelessToolbar.style.display = '';
- mxUtils.setOpacity(this.chromelessToolbar, opacity || 30);
- });
-
- if (urlParams['layers'] == '1')
- {
- this.layersDialog = null;
-
- var layersButton = addButton(mxUtils.bind(this, function(evt)
- {
- if (this.layersDialog != null)
- {
- this.layersDialog.parentNode.removeChild(this.layersDialog);
- this.layersDialog = null;
- }
- else
- {
- this.layersDialog = graph.createLayersDialog();
-
- mxEvent.addListener(this.layersDialog, 'mouseleave', mxUtils.bind(this, function()
- {
- this.layersDialog.parentNode.removeChild(this.layersDialog);
- this.layersDialog = null;
- }));
-
- var r = layersButton.getBoundingClientRect();
-
- mxUtils.setPrefixedStyle(this.layersDialog.style, 'borderRadius', '5px');
- this.layersDialog.style.position = 'fixed';
- this.layersDialog.style.fontFamily = 'Helvetica,Arial';
- this.layersDialog.style.backgroundColor = '#000000';
- this.layersDialog.style.width = '160px';
- this.layersDialog.style.padding = '4px 2px 4px 2px';
- this.layersDialog.style.color = '#ffffff';
- mxUtils.setOpacity(this.layersDialog, 70);
- this.layersDialog.style.left = r.left + 'px';
- this.layersDialog.style.bottom = parseInt(this.chromelessToolbar.style.bottom) +
- this.chromelessToolbar.offsetHeight + 4 + 'px';
-
- // Puts the dialog on top of the container z-index
- var style = mxUtils.getCurrentStyle(this.editor.graph.container);
- this.layersDialog.style.zIndex = style.zIndex;
-
- document.body.appendChild(this.layersDialog);
- }
-
- mxEvent.consume(evt);
- }), Editor.layersLargeImage, mxResources.get('layers'));
-
- // Shows/hides layers button depending on content
- var model = graph.getModel();
-
- model.addListener(mxEvent.CHANGE, function()
- {
- layersButton.style.display = (model.getChildCount(model.root) > 1) ? '' : 'none';
- });
- }
-
- if (urlParams['openInSameWin'] != '1')
- {
- this.addChromelessToolbarItems(addButton);
- }
-
- if (this.editor.editButtonLink != null || this.editor.editButtonFunc != null)
- {
- addButton(mxUtils.bind(this, function(evt)
- {
- if (this.editor.editButtonFunc != null)
- {
- this.editor.editButtonFunc();
- }
- else if (this.editor.editButtonLink == '_blank')
- {
- this.editor.editAsNew(this.getEditBlankXml());
- }
- else
- {
- graph.openLink(this.editor.editButtonLink, 'editWindow');
- }
-
- mxEvent.consume(evt);
- }), Editor.editLargeImage, mxResources.get('edit'));
- }
-
- if (this.lightboxToolbarActions != null)
- {
- for (var i = 0; i < this.lightboxToolbarActions.length; i++)
- {
- var lbAction = this.lightboxToolbarActions[i];
- addButton(lbAction.fn, lbAction.icon, lbAction.tooltip);
- }
- }
-
- if (toolbarConfig.refreshBtn != null)
- {
- addButton(mxUtils.bind(this, function(evt)
- {
- if (toolbarConfig.refreshBtn.url)
- {
- window.location.href = toolbarConfig.refreshBtn.url;
- }
- else
- {
- window.location.reload();
- }
-
- mxEvent.consume(evt);
- }), Editor.refreshLargeImage, mxResources.get('refresh', null, 'Refresh'));
- }
-
- if (toolbarConfig.fullscreenBtn != null && window.self !== window.top)
- {
- addButton(mxUtils.bind(this, function(evt)
- {
- if (toolbarConfig.fullscreenBtn.url)
- {
- graph.openLink(toolbarConfig.fullscreenBtn.url);
- }
- else
- {
- graph.openLink(window.location.href);
- }
-
- mxEvent.consume(evt);
- }), Editor.fullscreenLargeImage, mxResources.get('openInNewWindow', null, 'Open in New Window'));
- }
-
- if ((toolbarConfig.closeBtn && window.self === window.top) ||
- (graph.lightbox && (urlParams['close'] == '1' || this.container != document.body)))
-
- {
- addButton(mxUtils.bind(this, function(evt)
- {
- if (urlParams['close'] == '1' || toolbarConfig.closeBtn)
- {
- window.close();
- }
- else
- {
- this.destroy();
- mxEvent.consume(evt);
- }
- }), Editor.closeLargeImage, mxResources.get('close') + ' (Escape)');
- }
-
- // Initial state invisible
- this.chromelessToolbar.style.display = 'none';
-
- if (!graph.isViewer())
- {
- mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'transform', 'translate(-50%,0)');
- }
-
- graph.container.appendChild(this.chromelessToolbar);
-
- mxEvent.addListener(graph.container, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', mxUtils.bind(this, function(evt)
- {
- if (!mxEvent.isTouchEvent(evt))
- {
- if (!mxEvent.isShiftDown(evt))
- {
- fadeIn(30);
- }
-
- fadeOut();
- }
- }));
-
- mxEvent.addListener(this.chromelessToolbar, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', function(evt)
- {
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(this.chromelessToolbar, 'mouseenter', mxUtils.bind(this, function(evt)
- {
- if (!mxEvent.isShiftDown(evt))
- {
- fadeIn(100);
- }
- else
- {
- fadeOut();
- }
- }));
-
- mxEvent.addListener(this.chromelessToolbar, 'mousemove', mxUtils.bind(this, function(evt)
- {
- if (!mxEvent.isShiftDown(evt))
- {
- fadeIn(100);
- }
- else
- {
- fadeOut();
- }
-
- mxEvent.consume(evt);
- }));
-
- mxEvent.addListener(this.chromelessToolbar, 'mouseleave', mxUtils.bind(this, function(evt)
- {
- if (!mxEvent.isTouchEvent(evt))
- {
- fadeIn(30);
- }
- }));
-
- // Shows/hides toolbar for touch devices
- var tol = graph.getTolerance();
-
- graph.addMouseListener(
- {
- startX: 0,
- startY: 0,
- scrollLeft: 0,
- scrollTop: 0,
- mouseDown: function(sender, me)
- {
- this.startX = me.getGraphX();
- this.startY = me.getGraphY();
- this.scrollLeft = graph.container.scrollLeft;
- this.scrollTop = graph.container.scrollTop;
- },
- mouseMove: function(sender, me) {},
- mouseUp: function(sender, me)
- {
- if (mxEvent.isTouchEvent(me.getEvent()))
- {
- if ((Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol &&
- Math.abs(this.scrollTop - graph.container.scrollTop) < tol) &&
- (Math.abs(this.startX - me.getGraphX()) < tol &&
- Math.abs(this.startY - me.getGraphY()) < tol))
- {
- if (parseFloat(ui.chromelessToolbar.style.opacity || 0) > 0)
- {
- fadeOut();
- }
- else
- {
- fadeIn(30);
- }
- }
- }
- }
- });
- } // end if toolbar
-
- // Installs handling of highlight and handling links to relative links and anchors
- if (!this.editor.editable)
- {
- this.addChromelessClickHandler();
- }
- }
- else if (this.editor.extendCanvas)
- {
- /**
- * Guesses autoTranslate to avoid another repaint (see below).
- * Works if only the scale of the graph changes or if pages
- * are visible and the visible pages do not change.
- */
- var graphViewValidate = graph.view.validate;
- graph.view.validate = function()
- {
- if (this.graph.container != null && mxUtils.hasScrollbars(this.graph.container))
- {
- var pad = this.graph.getPagePadding();
- var size = this.graph.getPageSize();
-
- // Updating scrollbars here causes flickering in quirks and is not needed
- // if zoom method is always used to set the current scale on the graph.
- var tx = this.translate.x;
- var ty = this.translate.y;
- this.translate.x = pad.x - (this.x0 || 0) * size.width;
- this.translate.y = pad.y - (this.y0 || 0) * size.height;
- }
-
- graphViewValidate.apply(this, arguments);
- };
-
- if (!graph.isViewer())
- {
- var graphSizeDidChange = graph.sizeDidChange;
-
- graph.sizeDidChange = function()
- {
- if (this.container != null && mxUtils.hasScrollbars(this.container))
- {
- var pages = this.getPageLayout();
- var pad = this.getPagePadding();
- var size = this.getPageSize();
-
- // Updates the minimum graph size
- var minw = Math.ceil(2 * pad.x + pages.width * size.width);
- var minh = Math.ceil(2 * pad.y + pages.height * size.height);
-
- var min = graph.minimumGraphSize;
-
- // LATER: Fix flicker of scrollbar size in IE quirks mode
- // after delayed call in window.resize event handler
- if (min == null || min.width != minw || min.height != minh)
- {
- graph.minimumGraphSize = new mxRectangle(0, 0, minw, minh);
- }
-
- // Updates auto-translate to include padding and graph size
- var dx = pad.x - pages.x * size.width;
- var dy = pad.y - pages.y * size.height;
-
- if (!this.autoTranslate && (this.view.translate.x != dx || this.view.translate.y != dy))
- {
- this.autoTranslate = true;
- this.view.x0 = pages.x;
- this.view.y0 = pages.y;
-
- // NOTE: THIS INVOKES THIS METHOD AGAIN. UNFORTUNATELY THERE IS NO WAY AROUND THIS SINCE THE
- // BOUNDS ARE KNOWN AFTER THE VALIDATION AND SETTING THE TRANSLATE TRIGGERS A REVALIDATION.
- // SHOULD MOVE TRANSLATE/SCALE TO VIEW.
- var tx = graph.view.translate.x;
- var ty = graph.view.translate.y;
- graph.view.setTranslate(dx, dy);
-
- // LATER: Fix rounding errors for small zoom
- graph.container.scrollLeft += Math.round((dx - tx) * graph.view.scale);
- graph.container.scrollTop += Math.round((dy - ty) * graph.view.scale);
-
- this.autoTranslate = false;
-
- return;
- }
-
- graphSizeDidChange.apply(this, arguments);
- }
- else
- {
- // Fires event but does not invoke superclass
- this.fireEvent(new mxEventObject(mxEvent.SIZE, 'bounds', this.getGraphBounds()));
- }
- };
- }
- }
-
- // Accumulates the zoom factor while the rendering is taking place
- // so that not the complete sequence of zoom steps must be painted
- var bgGroup = graph.view.getBackgroundPane();
- var mainGroup = graph.view.getDrawPane();
- graph.cumulativeZoomFactor = 1;
- var updateZoomTimeout = null;
- var cursorPosition = null;
- var scrollPosition = null;
- var forcedZoom = null;
- var filter = null;
-
- var scheduleZoom = function(delay)
- {
- if (updateZoomTimeout != null)
- {
- window.clearTimeout(updateZoomTimeout);
- }
-
- window.setTimeout(function()
- {
- if (!graph.isMouseDown || forcedZoom)
- {
- updateZoomTimeout = window.setTimeout(mxUtils.bind(this, function()
- {
- if (graph.isFastZoomEnabled())
- {
- // Transforms background page
- if (graph.view.backgroundPageShape != null && graph.view.backgroundPageShape.node != null)
- {
- mxUtils.setPrefixedStyle(graph.view.backgroundPageShape.node.style, 'transform-origin', null);
- mxUtils.setPrefixedStyle(graph.view.backgroundPageShape.node.style, 'transform', null);
- }
-
- // Transforms graph and background image
- mainGroup.style.transformOrigin = '';
- bgGroup.style.transformOrigin = '';
-
- // Workaround for no reset of transform in Safari
- if (mxClient.IS_SF)
- {
- mainGroup.style.transform = 'scale(1)';
- bgGroup.style.transform = 'scale(1)';
-
- window.setTimeout(function()
- {
- mainGroup.style.transform = '';
- bgGroup.style.transform = '';
- }, 0)
- }
- else
- {
- mainGroup.style.transform = '';
- bgGroup.style.transform = '';
- }
-
- // Shows interactive elements
- graph.view.getDecoratorPane().style.opacity = '';
- graph.view.getOverlayPane().style.opacity = '';
- }
-
- var sp = new mxPoint(graph.container.scrollLeft, graph.container.scrollTop);
- var offset = mxUtils.getOffset(graph.container);
- var prev = graph.view.scale;
- var dx = 0;
- var dy = 0;
-
- if (cursorPosition != null)
- {
- dx = graph.container.offsetWidth / 2 - cursorPosition.x + offset.x;
- dy = graph.container.offsetHeight / 2 - cursorPosition.y + offset.y;
- }
-
- graph.zoom(graph.cumulativeZoomFactor);
- var s = graph.view.scale;
-
- if (s != prev)
- {
- if (scrollPosition != null)
- {
- dx += sp.x - scrollPosition.x;
- dy += sp.y - scrollPosition.y;
- }
-
- if (resize != null)
- {
- ui.chromelessResize(false, null, dx * (graph.cumulativeZoomFactor - 1),
- dy * (graph.cumulativeZoomFactor - 1));
- }
-
- if (mxUtils.hasScrollbars(graph.container) && (dx != 0 || dy != 0))
- {
- graph.container.scrollLeft -= dx * (graph.cumulativeZoomFactor - 1);
- graph.container.scrollTop -= dy * (graph.cumulativeZoomFactor - 1);
- }
- }
-
- if (filter != null)
- {
- mainGroup.setAttribute('filter', filter);
- }
-
- graph.cumulativeZoomFactor = 1;
- updateZoomTimeout = null;
- scrollPosition = null;
- cursorPosition = null;
- forcedZoom = null;
- filter = null;
- }), (delay != null) ? delay : ((graph.isFastZoomEnabled()) ? ui.wheelZoomDelay : ui.lazyZoomDelay));
- }
- }, 0);
- };
-
- graph.lazyZoom = function(zoomIn, ignoreCursorPosition, delay)
- {
- // TODO: Fix ignored cursor position if scrollbars are disabled
- ignoreCursorPosition = ignoreCursorPosition || !graph.scrollbars;
-
- if (ignoreCursorPosition)
- {
- cursorPosition = new mxPoint(
- graph.container.offsetLeft + graph.container.clientWidth / 2,
- graph.container.offsetTop + graph.container.clientHeight / 2);
- }
-
- // Switches to 5% zoom steps below 15%
- if (zoomIn)
- {
- if (this.view.scale * this.cumulativeZoomFactor <= 0.15)
- {
- this.cumulativeZoomFactor *= (this.view.scale + 0.05) / this.view.scale;
- }
- else
- {
- // Uses to 5% zoom steps for better grid rendering in webkit
- // and to avoid rounding errors for zoom steps
- this.cumulativeZoomFactor *= this.zoomFactor;
- this.cumulativeZoomFactor = Math.round(this.view.scale * this.cumulativeZoomFactor * 20) / 20 / this.view.scale;
- }
- }
- else
- {
- if (this.view.scale * this.cumulativeZoomFactor <= 0.15)
- {
- this.cumulativeZoomFactor *= (this.view.scale - 0.05) / this.view.scale;
- }
- else
- {
- // Uses to 5% zoom steps for better grid rendering in webkit
- // and to avoid rounding errors for zoom steps
- this.cumulativeZoomFactor /= this.zoomFactor;
- this.cumulativeZoomFactor = Math.round(this.view.scale * this.cumulativeZoomFactor * 20) / 20 / this.view.scale;
- }
- }
-
- this.cumulativeZoomFactor = Math.max(0.05, Math.min(this.view.scale * this.cumulativeZoomFactor, 160)) / this.view.scale;
-
- if (graph.isFastZoomEnabled())
- {
- if (filter == null && mainGroup.getAttribute('filter') != '')
- {
- filter = mainGroup.getAttribute('filter');
- mainGroup.removeAttribute('filter');
- }
-
- scrollPosition = new mxPoint(graph.container.scrollLeft, graph.container.scrollTop);
-
- var cx = (ignoreCursorPosition) ? graph.container.scrollLeft + graph.container.clientWidth / 2 :
- cursorPosition.x + graph.container.scrollLeft - graph.container.offsetLeft;
- var cy = (ignoreCursorPosition) ? graph.container.scrollTop + graph.container.clientHeight / 2 :
- cursorPosition.y + graph.container.scrollTop - graph.container.offsetTop;
- mainGroup.style.transformOrigin = cx + 'px ' + cy + 'px';
- mainGroup.style.transform = 'scale(' + this.cumulativeZoomFactor + ')';
- bgGroup.style.transformOrigin = cx + 'px ' + cy + 'px';
- bgGroup.style.transform = 'scale(' + this.cumulativeZoomFactor + ')';
-
- if (graph.view.backgroundPageShape != null && graph.view.backgroundPageShape.node != null)
- {
- var page = graph.view.backgroundPageShape.node;
-
- mxUtils.setPrefixedStyle(page.style, 'transform-origin',
- ((ignoreCursorPosition) ? ((graph.container.clientWidth / 2 + graph.container.scrollLeft -
- page.offsetLeft) + 'px') : ((cursorPosition.x + graph.container.scrollLeft -
- page.offsetLeft - graph.container.offsetLeft) + 'px')) + ' ' +
- ((ignoreCursorPosition) ? ((graph.container.clientHeight / 2 + graph.container.scrollTop -
- page.offsetTop) + 'px') : ((cursorPosition.y + graph.container.scrollTop -
- page.offsetTop - graph.container.offsetTop) + 'px')));
- mxUtils.setPrefixedStyle(page.style, 'transform',
- 'scale(' + this.cumulativeZoomFactor + ')');
- }
-
- graph.view.getDecoratorPane().style.opacity = '0';
- graph.view.getOverlayPane().style.opacity = '0';
-
- if (ui.hoverIcons != null)
- {
- ui.hoverIcons.reset();
- }
- }
-
- scheduleZoom(delay);
- };
-
- // Holds back repaint until after mouse gestures
- mxEvent.addGestureListeners(graph.container, function(evt)
- {
- if (updateZoomTimeout != null)
- {
- window.clearTimeout(updateZoomTimeout);
- }
- }, null, function(evt)
- {
- if (graph.cumulativeZoomFactor != 1)
- {
- scheduleZoom(0);
- }
- });
-
- // Holds back repaint until scroll ends
- mxEvent.addListener(graph.container, 'scroll', function(evt)
- {
- if (updateZoomTimeout != null && !graph.isMouseDown && graph.cumulativeZoomFactor != 1)
- {
- scheduleZoom(0);
- }
- });
-
- mxEvent.addMouseWheelListener(mxUtils.bind(this, function(evt, up, force, cx, cy)
- {
- if (this.dialogs == null || this.dialogs.length == 0)
- {
- // Scrolls with scrollbars turned off
- if (!graph.scrollbars && !force && graph.isScrollWheelEvent(evt))
- {
- var t = graph.view.getTranslate();
- var step = 40 / graph.view.scale;
-
- if (!mxEvent.isShiftDown(evt))
- {
- graph.view.setTranslate(t.x, t.y + ((up) ? step : -step));
- }
- else
- {
- graph.view.setTranslate(t.x + ((up) ? -step : step), t.y);
- }
- }
- else if (force || graph.isZoomWheelEvent(evt))
- {
- var source = mxEvent.getSource(evt);
-
- while (source != null)
- {
- if (source == graph.container)
- {
- graph.tooltipHandler.hideTooltip();
- cursorPosition = (cx != null && cy!= null) ? new mxPoint(cx, cy) :
- new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
- forcedZoom = force;
- graph.lazyZoom(up);
- mxEvent.consume(evt);
-
- return false;
- }
-
- source = source.parentNode;
- }
- }
- }
- }), graph.container);
-
- // Uses fast zoom for pinch gestures on iOS
- graph.panningHandler.zoomGraph = function(evt)
- {
- graph.cumulativeZoomFactor = evt.scale;
- graph.lazyZoom(evt.scale > 0, true);
- mxEvent.consume(evt);
- };
-};
-
-/**
- * Creates a temporary graph instance for rendering off-screen content.
- */
-EditorUi.prototype.addChromelessToolbarItems = function(addButton)
-{
- addButton(mxUtils.bind(this, function(evt)
- {
- this.actions.get('print').funct();
- mxEvent.consume(evt);
- }), Editor.printLargeImage, mxResources.get('print'));
-};
-
-/**
- * Creates a temporary graph instance for rendering off-screen content.
- */
-EditorUi.prototype.isPagesEnabled = function()
-{
- return this.editor.editable || urlParams['hide-pages'] != '1';
-};
-
-/**
- * Creates a temporary graph instance for rendering off-screen content.
- */
-EditorUi.prototype.createTemporaryGraph = function(stylesheet)
-{
- var graph = new Graph(document.createElement('div'));
- graph.stylesheet.styles = mxUtils.clone(stylesheet.styles);
- graph.resetViewOnRootChange = false;
- graph.setConnectable(false);
- graph.gridEnabled = false;
- graph.autoScroll = false;
- graph.setTooltips(false);
- graph.setEnabled(false);
-
- // Container must be in the DOM for correct HTML rendering
- graph.container.style.visibility = 'hidden';
- graph.container.style.position = 'absolute';
- graph.container.style.overflow = 'hidden';
- graph.container.style.height = '1px';
- graph.container.style.width = '1px';
-
- return graph;
-};
-
-/**
- *
- */
-EditorUi.prototype.addChromelessClickHandler = function()
-{
- var hl = urlParams['highlight'];
-
- // Adds leading # for highlight color code
- if (hl != null && hl.length > 0)
- {
- hl = '#' + hl;
- }
-
- this.editor.graph.addClickHandler(hl);
-};
-
-/**
- *
- */
-EditorUi.prototype.toggleFormatPanel = function(visible)
-{
- visible = (visible != null) ? visible : this.formatWidth == 0;
-
- if (this.format != null)
- {
- this.formatWidth = (visible) ? 240 : 0;
- this.formatContainer.style.display = (visible) ? '' : 'none';
- this.refresh();
- this.format.refresh();
- this.fireEvent(new mxEventObject('formatWidthChanged'));
- }
-};
-
-/**
- * Adds support for placeholders in labels.
- */
-EditorUi.prototype.lightboxFit = function(maxHeight)
-{
- if (this.isDiagramEmpty())
- {
- this.editor.graph.view.setScale(1);
- }
- else
- {
- var p = urlParams['border'];
- var border = 60;
-
- if (p != null)
- {
- border = parseInt(p);
- }
-
- // LATER: Use initial graph bounds to avoid rounding errors
- this.editor.graph.maxFitScale = this.lightboxMaxFitScale;
- this.editor.graph.fit(border, null, null, null, null, null, maxHeight);
- this.editor.graph.maxFitScale = null;
- }
-};
-
-/**
- * Translates this point by the given vector.
- *
- * @param {number} dx X-coordinate of the translation.
- * @param {number} dy Y-coordinate of the translation.
- */
-EditorUi.prototype.isDiagramEmpty = function()
-{
- var model = this.editor.graph.getModel();
-
- return model.getChildCount(model.root) == 1 && model.getChildCount(model.getChildAt(model.root, 0)) == 0;
-};
-
-/**
- * Hook for allowing selection and context menu for certain events.
- */
-EditorUi.prototype.isSelectionAllowed = function(evt)
-{
- return mxEvent.getSource(evt).nodeName == 'SELECT' || (mxEvent.getSource(evt).nodeName == 'INPUT' &&
- mxUtils.isAncestorNode(this.formatContainer, mxEvent.getSource(evt)));
-};
-
-/**
- * Installs dialog if browser window is closed without saving
- * This must be disabled during save and image export.
- */
-EditorUi.prototype.addBeforeUnloadListener = function()
-{
- // Installs dialog if browser window is closed without saving
- // This must be disabled during save and image export
- window.onbeforeunload = mxUtils.bind(this, function()
- {
- if (!this.editor.isChromelessView())
- {
- return this.onBeforeUnload();
- }
- });
-};
-
-/**
- * Sets the onbeforeunload for the application
- */
-EditorUi.prototype.onBeforeUnload = function()
-{
- if (this.editor.modified)
- {
- return mxResources.get('allChangesLost');
- }
-};
-
-/**
- * Opens the current diagram via the window.opener if one exists.
- */
-EditorUi.prototype.open = function()
-{
- // Cross-domain window access is not allowed in FF, so if we
- // were opened from another domain then this will fail.
- try
- {
- if (window.opener != null && window.opener.openFile != null)
- {
- window.opener.openFile.setConsumer(mxUtils.bind(this, function(xml, filename)
- {
- try
- {
- var doc = mxUtils.parseXml(xml);
- this.editor.setGraphXml(doc.documentElement);
- this.editor.setModified(false);
- this.editor.undoManager.clear();
-
- if (filename != null)
- {
- this.editor.setFilename(filename);
- this.updateDocumentTitle();
- }
-
- return;
- }
- catch (e)
- {
- mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
- }
- }));
- }
- }
- catch(e)
- {
- // ignore
- }
-
- // Fires as the last step if no file was loaded
- this.editor.graph.view.validate();
-
- // Required only in special cases where an initial file is opened
- // and the minimumGraphSize changes and CSS must be updated.
- this.editor.graph.sizeDidChange();
- this.editor.fireEvent(new mxEventObject('resetGraphView'));
-};
-
-/**
- * Shows the given popup menu.
- */
-EditorUi.prototype.showPopupMenu = function(fn, x, y, evt)
-{
- this.editor.graph.popupMenuHandler.hideMenu();
-
- var menu = new mxPopupMenu(fn);
- menu.div.className += ' geMenubarMenu';
- menu.smartSeparators = true;
- menu.showDisabled = true;
- menu.autoExpand = true;
-
- // Disables autoexpand and destroys menu when hidden
- menu.hideMenu = mxUtils.bind(this, function()
- {
- mxPopupMenu.prototype.hideMenu.apply(menu, arguments);
- menu.destroy();
- });
-
- menu.popup(x, y, null, evt);
-
- // Allows hiding by clicking on document
- this.setCurrentMenu(menu);
-};
-
-/**
- * Sets the current menu and element.
- */
-EditorUi.prototype.setCurrentMenu = function(menu, elt)
-{
- this.currentMenuElt = elt;
- this.currentMenu = menu;
-};
-
-/**
- * Resets the current menu and element.
- */
-EditorUi.prototype.resetCurrentMenu = function()
-{
- this.currentMenuElt = null;
- this.currentMenu = null;
-};
-
-/**
- * Hides and destroys the current menu.
- */
-EditorUi.prototype.hideCurrentMenu = function()
-{
- if (this.currentMenu != null)
- {
- this.currentMenu.hideMenu();
- this.resetCurrentMenu();
- }
-};
-
-/**
- * Updates the document title.
- */
-EditorUi.prototype.updateDocumentTitle = function()
-{
- var title = this.editor.getOrCreateFilename();
-
- if (this.editor.appName != null)
- {
- title += ' - ' + this.editor.appName;
- }
-
- document.title = title;
-};
-
-/**
- * Updates the document title.
- */
-EditorUi.prototype.createHoverIcons = function()
-{
- return new HoverIcons(this.editor.graph);
-};
-
-/**
- * Returns the URL for a copy of this editor with no state.
- */
-EditorUi.prototype.redo = function()
-{
- try
- {
- var graph = this.editor.graph;
-
- if (graph.isEditing())
- {
- document.execCommand('redo', false, null);
- }
- else
- {
- this.editor.undoManager.redo();
- }
- }
- catch (e)
- {
- // ignore all errors
- }
-};
-
-/**
- * Returns the URL for a copy of this editor with no state.
- */
-EditorUi.prototype.undo = function()
-{
- try
- {
- var graph = this.editor.graph;
-
- if (graph.isEditing())
- {
- // Stops editing and executes undo on graph if native undo
- // does not affect current editing value
- var value = graph.cellEditor.textarea.innerHTML;
- document.execCommand('undo', false, null);
-
- if (value == graph.cellEditor.textarea.innerHTML)
- {
- graph.stopEditing(true);
- this.editor.undoManager.undo();
- }
- }
- else
- {
- this.editor.undoManager.undo();
- }
- }
- catch (e)
- {
- // ignore all errors
- }
-};
-
-/**
- * Returns the URL for a copy of this editor with no state.
- */
-EditorUi.prototype.canRedo = function()
-{
- return this.editor.graph.isEditing() || this.editor.undoManager.canRedo();
-};
-
-/**
- * Returns the URL for a copy of this editor with no state.
- */
-EditorUi.prototype.canUndo = function()
-{
- return this.editor.graph.isEditing() || this.editor.undoManager.canUndo();
-};
-
-/**
- *
- */
-EditorUi.prototype.getEditBlankXml = function()
-{
- return mxUtils.getXml(this.editor.getGraphXml());
-};
-
-/**
- * Returns the URL for a copy of this editor with no state.
- */
-EditorUi.prototype.getUrl = function(pathname)
-{
- var href = (pathname != null) ? pathname : window.location.pathname;
- var parms = (href.indexOf('?') > 0) ? 1 : 0;
-
- // Removes template URL parameter for new blank diagram
- for (var key in urlParams)
- {
- if (parms == 0)
- {
- href += '?';
- }
- else
- {
- href += '&';
- }
-
- href += key + '=' + urlParams[key];
- parms++;
- }
-
- return href;
-};
-
-/**
- * Specifies if the graph has scrollbars.
- */
-EditorUi.prototype.setScrollbars = function(value)
-{
- var graph = this.editor.graph;
- var prev = graph.container.style.overflow;
- graph.scrollbars = value;
- this.editor.updateGraphComponents();
-
- if (prev != graph.container.style.overflow)
- {
- graph.container.scrollTop = 0;
- graph.container.scrollLeft = 0;
- graph.view.scaleAndTranslate(1, 0, 0);
- this.resetScrollbars();
- }
-
- this.fireEvent(new mxEventObject('scrollbarsChanged'));
-};
-
-/**
- * Returns true if the graph has scrollbars.
- */
-EditorUi.prototype.hasScrollbars = function()
-{
- return this.editor.graph.scrollbars;
-};
-
-/**
- * Resets the state of the scrollbars.
- */
-EditorUi.prototype.resetScrollbars = function()
-{
- var graph = this.editor.graph;
-
- if (!this.editor.extendCanvas)
- {
- graph.container.scrollTop = 0;
- graph.container.scrollLeft = 0;
-
- if (!mxUtils.hasScrollbars(graph.container))
- {
- graph.view.setTranslate(0, 0);
- }
- }
- else if (!this.editor.isChromelessView())
- {
- if (mxUtils.hasScrollbars(graph.container))
- {
- if (graph.pageVisible)
- {
- var pad = graph.getPagePadding();
- graph.container.scrollTop = Math.floor(pad.y - this.editor.initialTopSpacing) - 1;
- graph.container.scrollLeft = Math.floor(Math.min(pad.x,
- (graph.container.scrollWidth - graph.container.clientWidth) / 2)) - 1;
-
- // Scrolls graph to visible area
- var bounds = graph.getGraphBounds();
-
- if (bounds.width > 0 && bounds.height > 0)
- {
- if (bounds.x > graph.container.scrollLeft + graph.container.clientWidth * 0.9)
- {
- graph.container.scrollLeft = Math.min(bounds.x + bounds.width - graph.container.clientWidth, bounds.x - 10);
- }
-
- if (bounds.y > graph.container.scrollTop + graph.container.clientHeight * 0.9)
- {
- graph.container.scrollTop = Math.min(bounds.y + bounds.height - graph.container.clientHeight, bounds.y - 10);
- }
- }
- }
- else
- {
- var bounds = graph.getGraphBounds();
- var width = Math.max(bounds.width, graph.scrollTileSize.width * graph.view.scale);
- var height = Math.max(bounds.height, graph.scrollTileSize.height * graph.view.scale);
- graph.container.scrollTop = Math.floor(Math.max(0, bounds.y - Math.max(20, (graph.container.clientHeight - height) / 4)));
- graph.container.scrollLeft = Math.floor(Math.max(0, bounds.x - Math.max(0, (graph.container.clientWidth - width) / 2)));
- }
- }
- else
- {
- var b = mxRectangle.fromRectangle((graph.pageVisible) ? graph.view.getBackgroundPageBounds() : graph.getGraphBounds())
- var tr = graph.view.translate;
- var s = graph.view.scale;
- b.x = b.x / s - tr.x;
- b.y = b.y / s - tr.y;
- b.width /= s;
- b.height /= s;
-
- var dy = (graph.pageVisible) ? 0 : Math.max(0, (graph.container.clientHeight - b.height) / 4);
-
- graph.view.setTranslate(Math.floor(Math.max(0,
- (graph.container.clientWidth - b.width) / 2) - b.x + 2),
- Math.floor(dy - b.y + 1));
- }
- }
-};
-
-/**
- * Loads the stylesheet for this graph.
- */
-EditorUi.prototype.setPageVisible = function(value)
-{
- var graph = this.editor.graph;
- var hasScrollbars = mxUtils.hasScrollbars(graph.container);
- var tx = 0;
- var ty = 0;
-
- if (hasScrollbars)
- {
- tx = graph.view.translate.x * graph.view.scale - graph.container.scrollLeft;
- ty = graph.view.translate.y * graph.view.scale - graph.container.scrollTop;
- }
-
- graph.pageVisible = value;
- graph.pageBreaksVisible = value;
- graph.preferPageSize = value;
- graph.view.validateBackground();
-
- // Workaround for possible handle offset
- if (hasScrollbars)
- {
- var cells = graph.getSelectionCells();
- graph.clearSelection();
- graph.setSelectionCells(cells);
- }
-
- // Calls updatePageBreaks
- graph.sizeDidChange();
-
- if (hasScrollbars)
- {
- graph.container.scrollLeft = graph.view.translate.x * graph.view.scale - tx;
- graph.container.scrollTop = graph.view.translate.y * graph.view.scale - ty;
- }
-
- this.fireEvent(new mxEventObject('pageViewChanged'));
-};
-
-/**
- * Class: ChangeGridColor
- *
- * Undoable change to grid color.
- */
-function ChangeGridColor(ui, color)
-{
- this.ui = ui;
- this.color = color;
-};
-
-/**
- * Executes selection of a new page.
- */
-ChangeGridColor.prototype.execute = function()
-{
- var temp = this.ui.editor.graph.view.gridColor;
- this.ui.setGridColor(this.color);
- this.color = temp;
-};
-
-// Registers codec for ChangePageSetup
-(function()
-{
- var codec = new mxObjectCodec(new ChangeGridColor(), ['ui']);
-
- mxCodecRegistry.register(codec);
-})();
-
-/**
- * Change types
- */
-function ChangePageSetup(ui, color, image, format, pageScale)
-{
- this.ui = ui;
- this.color = color;
- this.previousColor = color;
- this.image = image;
- this.previousImage = image;
- this.format = format;
- this.previousFormat = format;
- this.pageScale = pageScale;
- this.previousPageScale = pageScale;
-
- // Needed since null are valid values for color and image
- this.ignoreColor = false;
- this.ignoreImage = false;
-}
-
-/**
- * Implementation of the undoable page rename.
- */
-ChangePageSetup.prototype.execute = function()
-{
- var graph = this.ui.editor.graph;
-
- if (!this.ignoreColor)
- {
- this.color = this.previousColor;
- var tmp = graph.background;
- this.ui.setBackgroundColor(this.previousColor);
- this.previousColor = tmp;
- }
-
- if (!this.ignoreImage)
- {
- this.image = this.previousImage;
- var tmp = graph.backgroundImage;
- this.ui.setBackgroundImage(this.previousImage);
- this.previousImage = tmp;
- }
-
- if (this.previousFormat != null)
- {
- this.format = this.previousFormat;
- var tmp = graph.pageFormat;
-
- if (this.previousFormat.width != tmp.width ||
- this.previousFormat.height != tmp.height)
- {
- this.ui.setPageFormat(this.previousFormat);
- this.previousFormat = tmp;
- }
- }
-
- if (this.foldingEnabled != null && this.foldingEnabled != this.ui.editor.graph.foldingEnabled)
- {
- this.ui.setFoldingEnabled(this.foldingEnabled);
- this.foldingEnabled = !this.foldingEnabled;
- }
-
- if (this.previousPageScale != null)
- {
- var currentPageScale = this.ui.editor.graph.pageScale;
-
- if (this.previousPageScale != currentPageScale)
- {
- this.ui.setPageScale(this.previousPageScale);
- this.previousPageScale = currentPageScale;
- }
- }
-};
-
-// Registers codec for ChangePageSetup
-(function()
-{
- var codec = new mxObjectCodec(new ChangePageSetup(), ['ui', 'previousColor', 'previousImage', 'previousFormat', 'previousPageScale']);
-
- codec.afterDecode = function(dec, node, obj)
- {
- obj.previousColor = obj.color;
- obj.previousImage = obj.image;
- obj.previousFormat = obj.format;
- obj.previousPageScale = obj.pageScale;
-
- if (obj.foldingEnabled != null)
- {
- obj.foldingEnabled = !obj.foldingEnabled;
- }
-
- return obj;
- };
-
- mxCodecRegistry.register(codec);
-})();
-
-/**
- * Loads the stylesheet for this graph.
- */
-EditorUi.prototype.setBackgroundColor = function(value)
-{
- this.editor.graph.background = value;
- this.editor.graph.view.validateBackground();
-
- this.fireEvent(new mxEventObject('backgroundColorChanged'));
-};
-
-/**
- * Loads the stylesheet for this graph.
- */
-EditorUi.prototype.setFoldingEnabled = function(value)
-{
- this.editor.graph.foldingEnabled = value;
- this.editor.graph.view.revalidate();
-
- this.fireEvent(new mxEventObject('foldingEnabledChanged'));
-};
-
-/**
- * Loads the stylesheet for this graph.
- */
-EditorUi.prototype.setPageFormat = function(value)
-{
- this.editor.graph.pageFormat = value;
-
- if (!this.editor.graph.pageVisible)
- {
- this.actions.get('pageView').funct();
- }
- else
- {
- this.editor.graph.view.validateBackground();
- this.editor.graph.sizeDidChange();
- }
-
- this.fireEvent(new mxEventObject('pageFormatChanged'));
-};
-
-/**
- * Loads the stylesheet for this graph.
- */
-EditorUi.prototype.setPageScale = function(value)
-{
- this.editor.graph.pageScale = value;
-
- if (!this.editor.graph.pageVisible)
- {
- this.actions.get('pageView').funct();
- }
- else
- {
- this.editor.graph.view.validateBackground();
- this.editor.graph.sizeDidChange();
- }
-
- this.fireEvent(new mxEventObject('pageScaleChanged'));
-};
-
-/**
- * Loads the stylesheet for this graph.
- */
-EditorUi.prototype.setGridColor = function(value)
-{
- this.editor.graph.view.gridColor = value;
- this.editor.graph.view.validateBackground();
- this.fireEvent(new mxEventObject('gridColorChanged'));
-};
-
-/**
- * Updates the states of the given undo/redo items.
- */
-EditorUi.prototype.addUndoListener = function()
-{
- var undo = this.actions.get('undo');
- var redo = this.actions.get('redo');
-
- var undoMgr = this.editor.undoManager;
-
- var undoListener = mxUtils.bind(this, function()
- {
- undo.setEnabled(this.canUndo());
- redo.setEnabled(this.canRedo());
- });
-
- undoMgr.addListener(mxEvent.ADD, undoListener);
- undoMgr.addListener(mxEvent.UNDO, undoListener);
- undoMgr.addListener(mxEvent.REDO, undoListener);
- undoMgr.addListener(mxEvent.CLEAR, undoListener);
-
- // Overrides cell editor to update action states
- var cellEditorStartEditing = this.editor.graph.cellEditor.startEditing;
-
- this.editor.graph.cellEditor.startEditing = function()
- {
- cellEditorStartEditing.apply(this, arguments);
- undoListener();
- };
-
- var cellEditorStopEditing = this.editor.graph.cellEditor.stopEditing;
-
- this.editor.graph.cellEditor.stopEditing = function(cell, trigger)
- {
- cellEditorStopEditing.apply(this, arguments);
- undoListener();
- };
-
- // Updates the button states once
- undoListener();
-};
-
-/**
-* Updates the states of the given toolbar items based on the selection.
-*/
-EditorUi.prototype.updateActionStates = function()
-{
- var graph = this.editor.graph;
- var selected = !graph.isSelectionEmpty();
- var vertexSelected = false;
- var groupSelected = false;
- var edgeSelected = false;
-
- var cells = graph.getSelectionCells();
-
- if (cells != null)
- {
- for (var i = 0; i < cells.length; i++)
- {
- var cell = cells[i];
-
- if (graph.getModel().isEdge(cell))
- {
- edgeSelected = true;
- }
-
- if (graph.getModel().isVertex(cell))
- {
- vertexSelected = true;
-
- if (graph.getModel().getChildCount(cell) > 0 ||
- graph.isContainer(cell))
- {
- groupSelected = true;
- }
- }
-
- if (edgeSelected && vertexSelected)
- {
- break;
- }
- }
- }
-
- // Updates action states
- var actions = ['cut', 'copy', 'bold', 'italic', 'underline', 'delete', 'duplicate',
- 'editStyle', 'editTooltip', 'editLink', 'backgroundColor', 'borderColor',
- 'edit', 'toFront', 'toBack', 'lockUnlock', 'solid', 'dashed', 'pasteSize',
- 'dotted', 'fillColor', 'gradientColor', 'shadow', 'fontColor',
- 'formattedText', 'rounded', 'toggleRounded', 'sharp', 'strokeColor'];
-
- for (var i = 0; i < actions.length; i++)
- {
- this.actions.get(actions[i]).setEnabled(selected);
- }
-
- this.actions.get('setAsDefaultStyle').setEnabled(graph.getSelectionCount() == 1);
- this.actions.get('clearWaypoints').setEnabled(!graph.isSelectionEmpty());
- this.actions.get('copySize').setEnabled(graph.getSelectionCount() == 1);
- this.actions.get('turn').setEnabled(!graph.isSelectionEmpty());
- this.actions.get('curved').setEnabled(edgeSelected);
- this.actions.get('rotation').setEnabled(vertexSelected);
- this.actions.get('wordWrap').setEnabled(vertexSelected);
- this.actions.get('autosize').setEnabled(vertexSelected);
- var oneVertexSelected = vertexSelected && graph.getSelectionCount() == 1;
- this.actions.get('group').setEnabled(graph.getSelectionCount() > 1 ||
- (oneVertexSelected && !graph.isContainer(graph.getSelectionCell())));
- this.actions.get('ungroup').setEnabled(groupSelected);
- this.actions.get('removeFromGroup').setEnabled(oneVertexSelected &&
- graph.getModel().isVertex(graph.getModel().getParent(graph.getSelectionCell())));
-
- // Updates menu states
- var state = graph.view.getState(graph.getSelectionCell());
- this.menus.get('navigation').setEnabled(selected || graph.view.currentRoot != null);
- this.actions.get('collapsible').setEnabled(vertexSelected &&
- (graph.isContainer(graph.getSelectionCell()) || graph.model.getChildCount(graph.getSelectionCell()) > 0));
- this.actions.get('home').setEnabled(graph.view.currentRoot != null);
- this.actions.get('exitGroup').setEnabled(graph.view.currentRoot != null);
- this.actions.get('enterGroup').setEnabled(graph.getSelectionCount() == 1 && graph.isValidRoot(graph.getSelectionCell()));
- var foldable = graph.getSelectionCount() == 1 && graph.isCellFoldable(graph.getSelectionCell());
- this.actions.get('expand').setEnabled(foldable);
- this.actions.get('collapse').setEnabled(foldable);
- this.actions.get('editLink').setEnabled(graph.getSelectionCount() == 1);
- this.actions.get('openLink').setEnabled(graph.getSelectionCount() == 1 &&
- graph.getLinkForCell(graph.getSelectionCell()) != null);
- this.actions.get('guides').setEnabled(graph.isEnabled());
- this.actions.get('grid').setEnabled(!this.editor.chromeless || this.editor.editable);
-
- var unlocked = graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent());
- this.menus.get('layout').setEnabled(unlocked);
- this.menus.get('insert').setEnabled(unlocked);
- this.menus.get('direction').setEnabled(unlocked && vertexSelected);
- this.menus.get('align').setEnabled(unlocked && vertexSelected && graph.getSelectionCount() > 1);
- this.menus.get('distribute').setEnabled(unlocked && vertexSelected && graph.getSelectionCount() > 1);
- this.actions.get('selectVertices').setEnabled(unlocked);
- this.actions.get('selectEdges').setEnabled(unlocked);
- this.actions.get('selectAll').setEnabled(unlocked);
- this.actions.get('selectNone').setEnabled(unlocked);
-
- this.updatePasteActionStates();
-};
-
-EditorUi.prototype.zeroOffset = new mxPoint(0, 0);
-
-EditorUi.prototype.getDiagramContainerOffset = function()
-{
- return this.zeroOffset;
-};
-
-/**
- * Refreshes the viewport.
- */
-EditorUi.prototype.refresh = function(sizeDidChange)
-{
- sizeDidChange = (sizeDidChange != null) ? sizeDidChange : true;
-
- var quirks = mxClient.IS_IE && (document.documentMode == null || document.documentMode == 5);
- var w = this.container.clientWidth;
- var h = this.container.clientHeight;
-
- if (this.container == document.body)
- {
- w = document.body.clientWidth || document.documentElement.clientWidth;
- h = (quirks) ? document.body.clientHeight || document.documentElement.clientHeight : document.documentElement.clientHeight;
- }
-
- // Workaround for bug on iOS see
- // http://stackoverflow.com/questions/19012135/ios-7-ipad-safari-landscape-innerheight-outerheight-layout-issue
- // FIXME: Fix if footer visible
- var off = 0;
-
- if (mxClient.IS_IOS && !window.navigator.standalone)
- {
- if (window.innerHeight != document.documentElement.clientHeight)
- {
- off = document.documentElement.clientHeight - window.innerHeight;
- window.scrollTo(0, 0);
- }
- }
-
- var effHsplitPosition = Math.max(0, Math.min(this.hsplitPosition, w - this.splitSize - 20));
- var tmp = 0;
-
- if (this.menubar != null)
- {
- this.menubarContainer.style.height = this.menubarHeight + 'px';
- tmp += this.menubarHeight;
- }
-
- if (this.toolbar != null)
- {
- this.toolbarContainer.style.top = this.menubarHeight + 'px';
- this.toolbarContainer.style.height = this.toolbarHeight + 'px';
- tmp += this.toolbarHeight;
- }
-
- if (tmp > 0 && !mxClient.IS_QUIRKS)
- {
- tmp += 1;
- }
-
- var sidebarFooterHeight = 0;
-
- if (this.sidebarFooterContainer != null)
- {
- var bottom = this.footerHeight + off;
- sidebarFooterHeight = Math.max(0, Math.min(h - tmp - bottom, this.sidebarFooterHeight));
- this.sidebarFooterContainer.style.width = effHsplitPosition + 'px';
- this.sidebarFooterContainer.style.height = sidebarFooterHeight + 'px';
- this.sidebarFooterContainer.style.bottom = bottom + 'px';
- }
-
- var fw = (this.format != null) ? this.formatWidth : 0;
- this.sidebarContainer.style.top = tmp + 'px';
- this.sidebarContainer.style.width = effHsplitPosition + 'px';
- this.formatContainer.style.top = tmp + 'px';
- this.formatContainer.style.width = fw + 'px';
- this.formatContainer.style.display = (this.format != null) ? '' : 'none';
-
- var diagContOffset = this.getDiagramContainerOffset();
- var contLeft = (this.hsplit.parentNode != null) ? (effHsplitPosition + this.splitSize) : 0;
- this.diagramContainer.style.left = (contLeft + diagContOffset.x) + 'px';
- this.diagramContainer.style.top = (tmp + diagContOffset.y) + 'px';
- this.footerContainer.style.height = this.footerHeight + 'px';
- this.hsplit.style.top = this.sidebarContainer.style.top;
- this.hsplit.style.bottom = (this.footerHeight + off) + 'px';
- this.hsplit.style.left = effHsplitPosition + 'px';
- this.footerContainer.style.display = (this.footerHeight == 0) ? 'none' : '';
-
- if (this.tabContainer != null)
- {
- this.tabContainer.style.left = contLeft + 'px';
- }
-
- if (quirks)
- {
- this.menubarContainer.style.width = w + 'px';
- this.toolbarContainer.style.width = this.menubarContainer.style.width;
- var sidebarHeight = Math.max(0, h - this.footerHeight - this.menubarHeight - this.toolbarHeight);
- this.sidebarContainer.style.height = (sidebarHeight - sidebarFooterHeight) + 'px';
- this.formatContainer.style.height = sidebarHeight + 'px';
- this.diagramContainer.style.width = (this.hsplit.parentNode != null) ? Math.max(0, w - effHsplitPosition - this.splitSize - fw) + 'px' : w + 'px';
- this.footerContainer.style.width = this.menubarContainer.style.width;
- var diagramHeight = Math.max(0, h - this.footerHeight - this.menubarHeight - this.toolbarHeight);
-
- if (this.tabContainer != null)
- {
- this.tabContainer.style.width = this.diagramContainer.style.width;
- this.tabContainer.style.bottom = (this.footerHeight + off) + 'px';
- diagramHeight -= this.tabContainer.clientHeight;
- }
-
- this.diagramContainer.style.height = diagramHeight + 'px';
- this.hsplit.style.height = diagramHeight + 'px';
- }
- else
- {
- if (this.footerHeight > 0)
- {
- this.footerContainer.style.bottom = off + 'px';
- }
-
- this.diagramContainer.style.right = fw + 'px';
- var th = 0;
-
- if (this.tabContainer != null)
- {
- this.tabContainer.style.bottom = (this.footerHeight + off) + 'px';
- this.tabContainer.style.right = this.diagramContainer.style.right;
- th = this.tabContainer.clientHeight;
- }
-
- this.sidebarContainer.style.bottom = (this.footerHeight + sidebarFooterHeight + off) + 'px';
- this.formatContainer.style.bottom = (this.footerHeight + off) + 'px';
- this.diagramContainer.style.bottom = (this.footerHeight + off + th) + 'px';
- }
-
- if (sizeDidChange)
- {
- this.editor.graph.sizeDidChange();
- }
-};
-
-/**
- * Creates the required containers.
- */
-EditorUi.prototype.createTabContainer = function()
-{
- return null;
-};
-
-/**
- * Creates the required containers.
- */
-EditorUi.prototype.createDivs = function()
-{
- this.menubarContainer = this.createDiv('geMenubarContainer');
- this.toolbarContainer = this.createDiv('geToolbarContainer');
- this.sidebarContainer = this.createDiv('geSidebarContainer');
- this.formatContainer = this.createDiv('geSidebarContainer geFormatContainer');
- this.diagramContainer = this.createDiv('geDiagramContainer');
- this.footerContainer = this.createDiv('geFooterContainer');
- this.hsplit = this.createDiv('geHsplit');
- this.hsplit.setAttribute('title', mxResources.get('collapseExpand'));
-
- // Sets static style for containers
- this.menubarContainer.style.top = '0px';
- this.menubarContainer.style.left = '0px';
- this.menubarContainer.style.right = '0px';
- this.toolbarContainer.style.left = '0px';
- this.toolbarContainer.style.right = '0px';
- this.sidebarContainer.style.left = '0px';
- this.formatContainer.style.right = '0px';
- this.formatContainer.style.zIndex = '1';
- this.diagramContainer.style.right = ((this.format != null) ? this.formatWidth : 0) + 'px';
- this.footerContainer.style.left = '0px';
- this.footerContainer.style.right = '0px';
- this.footerContainer.style.bottom = '0px';
- this.footerContainer.style.zIndex = mxPopupMenu.prototype.zIndex - 2;
- this.hsplit.style.width = this.splitSize + 'px';
- this.sidebarFooterContainer = this.createSidebarFooterContainer();
-
- if (this.sidebarFooterContainer)
- {
- this.sidebarFooterContainer.style.left = '0px';
- }
-
- if (!this.editor.chromeless)
- {
- this.tabContainer = this.createTabContainer();
- }
- else
- {
- this.diagramContainer.style.border = 'none';
- }
-};
-
-/**
- * Hook for sidebar footer container. This implementation returns null.
- */
-EditorUi.prototype.createSidebarFooterContainer = function()
-{
- return null;
-};
-
-/**
- * Creates the required containers.
- */
-EditorUi.prototype.createUi = function()
-{
- // Creates menubar
- this.menubar = (this.editor.chromeless) ? null : this.menus.createMenubar(this.createDiv('geMenubar'));
-
- if (this.menubar != null)
- {
- this.menubarContainer.appendChild(this.menubar.container);
- }
-
- // Adds status bar in menubar
- if (this.menubar != null)
- {
- this.statusContainer = this.createStatusContainer();
-
- // Connects the status bar to the editor status
- this.editor.addListener('statusChanged', mxUtils.bind(this, function()
- {
- this.setStatusText(this.editor.getStatus());
- }));
-
- this.setStatusText(this.editor.getStatus());
- this.menubar.container.appendChild(this.statusContainer);
-
- // Inserts into DOM
- this.container.appendChild(this.menubarContainer);
- }
-
- // Creates the sidebar
- this.sidebar = (this.editor.chromeless) ? null : this.createSidebar(this.sidebarContainer);
-
- if (this.sidebar != null)
- {
- this.container.appendChild(this.sidebarContainer);
- }
-
- // Creates the format sidebar
- this.format = (this.editor.chromeless || !this.formatEnabled) ? null : this.createFormat(this.formatContainer);
-
- if (this.format != null)
- {
- this.container.appendChild(this.formatContainer);
- }
-
- // Creates the footer
- var footer = (this.editor.chromeless) ? null : this.createFooter();
-
- if (footer != null)
- {
- this.footerContainer.appendChild(footer);
- this.container.appendChild(this.footerContainer);
- }
-
- if (this.sidebar != null && this.sidebarFooterContainer)
- {
- this.container.appendChild(this.sidebarFooterContainer);
- }
-
- this.container.appendChild(this.diagramContainer);
-
- if (this.container != null && this.tabContainer != null)
- {
- this.container.appendChild(this.tabContainer);
- }
-
- // Creates toolbar
- this.toolbar = (this.editor.chromeless) ? null : this.createToolbar(this.createDiv('geToolbar'));
-
- if (this.toolbar != null)
- {
- this.toolbarContainer.appendChild(this.toolbar.container);
- this.container.appendChild(this.toolbarContainer);
- }
-
- // HSplit
- if (this.sidebar != null)
- {
- this.container.appendChild(this.hsplit);
-
- this.addSplitHandler(this.hsplit, true, 0, mxUtils.bind(this, function(value)
- {
- this.hsplitPosition = value;
- this.refresh();
- }));
- }
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createStatusContainer = function()
-{
- var container = document.createElement('a');
- container.className = 'geItem geStatus';
-
- return container;
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.setStatusText = function(value)
-{
- this.statusContainer.innerHTML = value;
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createToolbar = function(container)
-{
- return new Toolbar(this, container);
-};
-
-/**
- * Creates a new sidebar for the given container.
- */
-EditorUi.prototype.createSidebar = function(container)
-{
- return new Sidebar(this, container);
-};
-
-/**
- * Creates a new sidebar for the given container.
- */
-EditorUi.prototype.createFormat = function(container)
-{
- return new Format(this, container);
-};
-
-/**
- * Creates and returns a new footer.
- */
-EditorUi.prototype.createFooter = function()
-{
- return this.createDiv('geFooter');
-};
-
-/**
- * Creates the actual toolbar for the toolbar container.
- */
-EditorUi.prototype.createDiv = function(classname)
-{
- var elt = document.createElement('div');
- elt.className = classname;
-
- return elt;
-};
-
-/**
- * Updates the states of the given undo/redo items.
- */
-EditorUi.prototype.addSplitHandler = function(elt, horizontal, dx, onChange)
-{
- var start = null;
- var initial = null;
- var ignoreClick = true;
- var last = null;
-
- // Disables built-in pan and zoom in IE10 and later
- if (mxClient.IS_POINTER)
- {
- elt.style.touchAction = 'none';
- }
-
- var getValue = mxUtils.bind(this, function()
- {
- var result = parseInt(((horizontal) ? elt.style.left : elt.style.bottom));
-
- // Takes into account hidden footer
- if (!horizontal)
- {
- result = result + dx - this.footerHeight;
- }
-
- return result;
- });
-
- function moveHandler(evt)
- {
- if (start != null)
- {
- var pt = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
- onChange(Math.max(0, initial + ((horizontal) ? (pt.x - start.x) : (start.y - pt.y)) - dx));
- mxEvent.consume(evt);
-
- if (initial != getValue())
- {
- ignoreClick = true;
- last = null;
- }
- }
- };
-
- function dropHandler(evt)
- {
- moveHandler(evt);
- initial = null;
- start = null;
- };
-
- mxEvent.addGestureListeners(elt, function(evt)
- {
- start = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
- initial = getValue();
- ignoreClick = false;
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt)
- {
- if (!ignoreClick && this.hsplitClickEnabled)
- {
- var next = (last != null) ? last - dx : 0;
- last = getValue();
- onChange(next);
- mxEvent.consume(evt);
- }
- }));
-
- mxEvent.addGestureListeners(document, null, moveHandler, dropHandler);
-
- this.destroyFunctions.push(function()
- {
- mxEvent.removeGestureListeners(document, null, moveHandler, dropHandler);
- });
-};
-
-/**
- * Translates this point by the given vector.
- *
- * @param {number} dx X-coordinate of the translation.
- * @param {number} dy Y-coordinate of the translation.
- */
-EditorUi.prototype.handleError = function(resp, title, fn, invokeFnOnClose, notFoundMessage)
-{
- var e = (resp != null && resp.error != null) ? resp.error : resp;
-
- if (e != null || title != null)
- {
- var msg = mxUtils.htmlEntities(mxResources.get('unknownError'));
- var btn = mxResources.get('ok');
- title = (title != null) ? title : mxResources.get('error');
-
- if (e != null && e.message != null)
- {
- msg = mxUtils.htmlEntities(e.message);
- }
-
- this.showError(title, msg, btn, fn, null, null, null, null, null,
- null, null, null, (invokeFnOnClose) ? fn : null);
- }
- else if (fn != null)
- {
- fn();
- }
-};
-
-/**
- * Translates this point by the given vector.
- *
- * @param {number} dx X-coordinate of the translation.
- * @param {number} dy Y-coordinate of the translation.
- */
-EditorUi.prototype.showError = function(title, msg, btn, fn, retry, btn2, fn2, btn3, fn3, w, h, hide, onClose)
-{
- var dlg = new ErrorDialog(this, title, msg, btn || mxResources.get('ok'),
- fn, retry, btn2, fn2, hide, btn3, fn3);
- var lines = Math.ceil((msg != null) ? msg.length / 50 : 1);
- this.showDialog(dlg.container, w || 340, h || (100 + lines * 20), true, false, onClose);
- dlg.init();
-};
-
-/**
- * Displays a print dialog.
- */
-EditorUi.prototype.showDialog = function(elt, w, h, modal, closable, onClose, noScroll, transparent, onResize, ignoreBgClick)
-{
- this.editor.graph.tooltipHandler.resetTimer();
- this.editor.graph.tooltipHandler.hideTooltip();
-
- if (this.dialogs == null)
- {
- this.dialogs = [];
- }
-
- this.dialog = new Dialog(this, elt, w, h, modal, closable, onClose, noScroll, transparent, onResize, ignoreBgClick);
- this.dialogs.push(this.dialog);
-};
-
-/**
- * Displays a print dialog.
- */
-EditorUi.prototype.hideDialog = function(cancel, isEsc, matchContainer)
-{
- if (this.dialogs != null && this.dialogs.length > 0)
- {
- if (matchContainer != null && matchContainer != this.dialog.container.firstChild)
- {
- return;
- }
-
- var dlg = this.dialogs.pop();
-
- if (dlg.close(cancel, isEsc) == false)
- {
- //add the dialog back if dialog closing is cancelled
- this.dialogs.push(dlg);
- return;
- }
-
- this.dialog = (this.dialogs.length > 0) ? this.dialogs[this.dialogs.length - 1] : null;
- this.editor.fireEvent(new mxEventObject('hideDialog'));
-
- if (this.dialog == null && this.editor.graph.container.style.visibility != 'hidden')
- {
- window.setTimeout(mxUtils.bind(this, function()
- {
- if (this.editor.graph.isEditing() && this.editor.graph.cellEditor.textarea != null)
- {
- this.editor.graph.cellEditor.textarea.focus();
- }
- else
- {
- mxUtils.clearSelection();
- this.editor.graph.container.focus();
- }
- }), 0);
- }
- }
-};
-
-/**
- * Handles ctrl+enter keystroke to clone cells.
- */
-EditorUi.prototype.ctrlEnter = function()
-{
- var graph = this.editor.graph;
-
- if (graph.isEnabled())
- {
- try
- {
- var cells = graph.getSelectionCells();
- var lookup = new mxDictionary();
- var newCells = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- // Clones table rows instead of cells
- var cell = (graph.isTableCell(cells[i])) ? graph.model.getParent(cells[i]) : cells[i];
-
- if (cell != null && !lookup.get(cell))
- {
- lookup.put(cell, true);
- newCells.push(cell);
- }
- }
-
- graph.setSelectionCells(graph.duplicateCells(newCells, false));
- }
- catch (e)
- {
- this.handleError(e);
- }
- }
-};
-
-/**
- * Display a color dialog.
- */
-EditorUi.prototype.pickColor = function(color, apply)
-{
- var graph = this.editor.graph;
- var selState = graph.cellEditor.saveSelection();
- var h = 226 + ((Math.ceil(ColorDialog.prototype.presetColors.length / 12) +
- Math.ceil(ColorDialog.prototype.defaultColors.length / 12)) * 17);
-
- var dlg = new ColorDialog(this, color || 'none', function(color)
- {
- graph.cellEditor.restoreSelection(selState);
- apply(color);
- }, function()
- {
- graph.cellEditor.restoreSelection(selState);
- });
- this.showDialog(dlg.container, 230, h, true, false);
- dlg.init();
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-EditorUi.prototype.openFile = function()
-{
- // Closes dialog after open
- window.openFile = new OpenFile(mxUtils.bind(this, function(cancel)
- {
- this.hideDialog(cancel);
- }));
-
- // Removes openFile if dialog is closed
- this.showDialog(new OpenDialog(this).container, (Editor.useLocalStorage) ? 640 : 320,
- (Editor.useLocalStorage) ? 480 : 220, true, true, function()
- {
- window.openFile = null;
- });
-};
-
-/**
- * Extracs the graph model from the given HTML data from a data transfer event.
- */
-EditorUi.prototype.extractGraphModelFromHtml = function(data)
-{
- var result = null;
-
- try
- {
- var idx = data.indexOf('&lt;mxGraphModel ');
-
- if (idx >= 0)
- {
- var idx2 = data.lastIndexOf('&lt;/mxGraphModel&gt;');
-
- if (idx2 > idx)
- {
- result = data.substring(idx, idx2 + 21).replace(/&gt;/g, '>').
- replace(/&lt;/g, '<').replace(/\\&quot;/g, '"').replace(/\n/g, '');
- }
- }
- }
- catch (e)
- {
- // ignore
- }
-
- return result;
-};
-
-/**
- * Opens the given files in the editor.
- */
-EditorUi.prototype.extractGraphModelFromEvent = function(evt)
-{
- var result = null;
- var data = null;
-
- if (evt != null)
- {
- var provider = (evt.dataTransfer != null) ? evt.dataTransfer : evt.clipboardData;
-
- if (provider != null)
- {
- if (document.documentMode == 10 || document.documentMode == 11)
- {
- data = provider.getData('Text');
- }
- else
- {
- data = (mxUtils.indexOf(provider.types, 'text/html') >= 0) ? provider.getData('text/html') : null;
-
- if (mxUtils.indexOf(provider.types, 'text/plain' && (data == null || data.length == 0)))
- {
- data = provider.getData('text/plain');
- }
- }
-
- if (data != null)
- {
- data = Graph.zapGremlins(mxUtils.trim(data));
-
- // Tries parsing as HTML document with embedded XML
- var xml = this.extractGraphModelFromHtml(data);
-
- if (xml != null)
- {
- data = xml;
- }
- }
- }
- }
-
- if (data != null && this.isCompatibleString(data))
- {
- result = data;
- }
-
- return result;
-};
-
-/**
- * Hook for subclassers to return true if event data is a supported format.
- * This implementation always returns false.
- */
-EditorUi.prototype.isCompatibleString = function(data)
-{
- return false;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-EditorUi.prototype.saveFile = function(forceDialog)
-{
- if (!forceDialog && this.editor.filename != null)
- {
- this.save(this.editor.getOrCreateFilename());
- }
- else
- {
- var dlg = new FilenameDialog(this, this.editor.getOrCreateFilename(), mxResources.get('save'), mxUtils.bind(this, function(name)
- {
- this.save(name);
- }), null, mxUtils.bind(this, function(name)
- {
- if (name != null && name.length > 0)
- {
- return true;
- }
-
- mxUtils.confirm(mxResources.get('invalidName'));
-
- return false;
- }));
- this.showDialog(dlg.container, 300, 100, true, true);
- dlg.init();
- }
-};
-
-/**
- * Saves the current graph under the given filename.
- */
-EditorUi.prototype.save = function(name)
-{
- if (name != null)
- {
- if (this.editor.graph.isEditing())
- {
- this.editor.graph.stopEditing();
- }
-
- var xml = mxUtils.getXml(this.editor.getGraphXml());
-
- try
- {
- if (Editor.useLocalStorage)
- {
- if (localStorage.getItem(name) != null &&
- !mxUtils.confirm(mxResources.get('replaceIt', [name])))
- {
- return;
- }
-
- localStorage.setItem(name, xml);
- this.editor.setStatus(mxUtils.htmlEntities(mxResources.get('saved')) + ' ' + new Date());
- }
- else
- {
- if (xml.length < MAX_REQUEST_SIZE)
- {
- new mxXmlRequest(SAVE_URL, 'filename=' + encodeURIComponent(name) +
- '&xml=' + encodeURIComponent(xml)).simulate(document, '_blank');
- }
- else
- {
- mxUtils.alert(mxResources.get('drawingTooLarge'));
- mxUtils.popup(xml);
-
- return;
- }
- }
-
- this.editor.setModified(false);
- this.editor.setFilename(name);
- this.updateDocumentTitle();
- }
- catch (e)
- {
- this.editor.setStatus(mxUtils.htmlEntities(mxResources.get('errorSavingFile')));
- }
- }
-};
-
-/**
- * Executes the given layout.
- */
-EditorUi.prototype.executeLayout = function(exec, animate, post)
-{
- var graph = this.editor.graph;
-
- if (graph.isEnabled())
- {
- graph.getModel().beginUpdate();
- try
- {
- exec();
- }
- catch (e)
- {
- throw e;
- }
- finally
- {
- // Animates the changes in the graph model except
- // for Camino, where animation is too slow
- if (this.allowAnimation && animate && (navigator.userAgent == null ||
- navigator.userAgent.indexOf('Camino') < 0))
- {
- // New API for animating graph layout results asynchronously
- var morph = new mxMorphing(graph);
- morph.addListener(mxEvent.DONE, mxUtils.bind(this, function()
- {
- graph.getModel().endUpdate();
-
- if (post != null)
- {
- post();
- }
- }));
-
- morph.startAnimation();
- }
- else
- {
- graph.getModel().endUpdate();
-
- if (post != null)
- {
- post();
- }
- }
- }
- }
-};
-
-/**
- * Hides the current menu.
- */
-EditorUi.prototype.showImageDialog = function(title, value, fn, ignoreExisting)
-{
- var cellEditor = this.editor.graph.cellEditor;
- var selState = cellEditor.saveSelection();
- var newValue = mxUtils.prompt(title, value);
- cellEditor.restoreSelection(selState);
-
- if (newValue != null && newValue.length > 0)
- {
- var img = new Image();
-
- img.onload = function()
- {
- fn(newValue, img.width, img.height);
- };
- img.onerror = function()
- {
- fn(null);
- mxUtils.alert(mxResources.get('fileNotFound'));
- };
-
- img.src = newValue;
- }
- else
- {
- fn(null);
- }
-};
-
-/**
- * Hides the current menu.
- */
-EditorUi.prototype.showLinkDialog = function(value, btnLabel, fn)
-{
- var dlg = new LinkDialog(this, value, btnLabel, fn);
- this.showDialog(dlg.container, 420, 90, true, true);
- dlg.init();
-};
-
-/**
- * Hides the current menu.
- */
-EditorUi.prototype.showDataDialog = function(cell)
-{
- if (cell != null)
- {
- var dlg = new EditDataDialog(this, cell);
- this.showDialog(dlg.container, 480, 420, true, false, null, false);
- dlg.init();
- }
-};
-
-/**
- * Hides the current menu.
- */
-EditorUi.prototype.showBackgroundImageDialog = function(apply, img)
-{
- apply = (apply != null) ? apply : mxUtils.bind(this, function(image)
- {
- var change = new ChangePageSetup(this, null, image);
- change.ignoreColor = true;
-
- this.editor.graph.model.execute(change);
- });
-
- var newValue = mxUtils.prompt(mxResources.get('backgroundImage'), (img != null) ? img.src : '');
-
- if (newValue != null && newValue.length > 0)
- {
- var img = new Image();
-
- img.onload = function()
- {
- apply(new mxImage(newValue, img.width, img.height), false);
- };
- img.onerror = function()
- {
- apply(null, true);
- mxUtils.alert(mxResources.get('fileNotFound'));
- };
-
- img.src = newValue;
- }
- else
- {
- apply(null);
- }
-};
-
-/**
- * Loads the stylesheet for this graph.
- */
-EditorUi.prototype.setBackgroundImage = function(image)
-{
- this.editor.graph.setBackgroundImage(image);
- this.editor.graph.view.validateBackgroundImage();
-
- this.fireEvent(new mxEventObject('backgroundImageChanged'));
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-EditorUi.prototype.confirm = function(msg, okFn, cancelFn)
-{
- if (mxUtils.confirm(msg))
- {
- if (okFn != null)
- {
- okFn();
- }
- }
- else if (cancelFn != null)
- {
- cancelFn();
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-EditorUi.prototype.createOutline = function(wnd)
-{
- var outline = new mxOutline(this.editor.graph);
- outline.border = 20;
-
- mxEvent.addListener(window, 'resize', function()
- {
- outline.update();
- });
-
- this.addListener('pageFormatChanged', function()
- {
- outline.update();
- });
-
- return outline;
-};
-
-// Alt+Shift+Keycode mapping to action
-EditorUi.prototype.altShiftActions = {67: 'clearWaypoints', // Alt+Shift+C
- 65: 'connectionArrows', // Alt+Shift+A
- 76: 'editLink', // Alt+Shift+L
- 80: 'connectionPoints', // Alt+Shift+P
- 84: 'editTooltip', // Alt+Shift+T
- 86: 'pasteSize', // Alt+Shift+V
- 88: 'copySize' // Alt+Shift+X
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-EditorUi.prototype.createKeyHandler = function(editor)
-{
- var editorUi = this;
- var graph = this.editor.graph;
- var keyHandler = new mxKeyHandler(graph);
-
- var isEventIgnored = keyHandler.isEventIgnored;
- keyHandler.isEventIgnored = function(evt)
- {
- // Handles undo/redo/ctrl+./,/u via action and allows ctrl+b/i
- // only if editing value is HTML (except for FF and Safari)
- return !(mxEvent.isShiftDown(evt) && evt.keyCode == 9) &&
- ((!this.isControlDown(evt) || mxEvent.isShiftDown(evt) ||
- (evt.keyCode != 90 && evt.keyCode != 89 && evt.keyCode != 188 &&
- evt.keyCode != 190 && evt.keyCode != 85)) && ((evt.keyCode != 66 && evt.keyCode != 73) ||
- !this.isControlDown(evt) || (this.graph.cellEditor.isContentEditing() &&
- !mxClient.IS_FF && !mxClient.IS_SF)) && isEventIgnored.apply(this, arguments));
- };
-
- // Ignores graph enabled state but not chromeless state
- keyHandler.isEnabledForEvent = function(evt)
- {
- return (!mxEvent.isConsumed(evt) && this.isGraphEvent(evt) && this.isEnabled() &&
- (editorUi.dialogs == null || editorUi.dialogs.length == 0));
- };
-
- // Routes command-key to control-key on Mac
- keyHandler.isControlDown = function(evt)
- {
- return mxEvent.isControlDown(evt) || (mxClient.IS_MAC && evt.metaKey);
- };
-
- var queue = [];
- var thread = null;
-
- // Helper function to move cells with the cursor keys
- function nudge(keyCode, stepSize, resize)
- {
- queue.push(function()
- {
- if (!graph.isSelectionEmpty() && graph.isEnabled())
- {
- stepSize = (stepSize != null) ? stepSize : 1;
-
- if (resize)
- {
- // Resizes all selected vertices
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
-
- for (var i = 0; i < cells.length; i++)
- {
- if (graph.getModel().isVertex(cells[i]) && graph.isCellResizable(cells[i]))
- {
- var geo = graph.getCellGeometry(cells[i]);
-
- if (geo != null)
- {
- geo = geo.clone();
-
- if (keyCode == 37)
- {
- geo.width = Math.max(0, geo.width - stepSize);
- }
- else if (keyCode == 38)
- {
- geo.height = Math.max(0, geo.height - stepSize);
- }
- else if (keyCode == 39)
- {
- geo.width += stepSize;
- }
- else if (keyCode == 40)
- {
- geo.height += stepSize;
- }
-
- graph.getModel().setGeometry(cells[i], geo);
- }
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- else
- {
- // Moves vertices up/down in a stack layout
- var cell = graph.getSelectionCell();
- var parent = graph.model.getParent(cell);
- var layout = null;
-
- if (graph.getSelectionCount() == 1 && graph.model.isVertex(cell) &&
- graph.layoutManager != null && !graph.isCellLocked(cell))
- {
- layout = graph.layoutManager.getLayout(parent);
- }
-
- if (layout != null && layout.constructor == mxStackLayout)
- {
- var index = parent.getIndex(cell);
-
- if (keyCode == 37 || keyCode == 38)
- {
- graph.model.add(parent, cell, Math.max(0, index - 1));
- }
- else if (keyCode == 39 ||keyCode == 40)
- {
- graph.model.add(parent, cell, Math.min(graph.model.getChildCount(parent), index + 1));
- }
- }
- else
- {
- var cells = graph.getMovableCells(graph.getSelectionCells());
- var realCells = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- // TODO: Use getCompositeParent
- var style = graph.getCurrentCellStyle(cells[i]);
-
- if (mxUtils.getValue(style, 'part', '0') == '1')
- {
- var parent = graph.model.getParent(cells[i]);
-
- if (graph.model.isVertex(parent) && mxUtils.indexOf(cells, parent) < 0)
- {
- realCells.push(parent);
- }
- }
- else
- {
- realCells.push(cells[i]);
- }
- }
-
- if (realCells.length > 0)
- {
- cells = realCells;
- var dx = 0;
- var dy = 0;
-
- if (keyCode == 37)
- {
- dx = -stepSize;
- }
- else if (keyCode == 38)
- {
- dy = -stepSize;
- }
- else if (keyCode == 39)
- {
- dx = stepSize;
- }
- else if (keyCode == 40)
- {
- dy = stepSize;
- }
-
- graph.moveCells(cells, dx, dy);
- }
- }
- }
- }
- });
-
- if (thread != null)
- {
- window.clearTimeout(thread);
- }
-
- thread = window.setTimeout(function()
- {
- if (queue.length > 0)
- {
- graph.getModel().beginUpdate();
-
- try
- {
- for (var i = 0; i < queue.length; i++)
- {
- queue[i]();
- }
-
- queue = [];
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- }, 200);
- };
-
- // Overridden to handle special alt+shift+cursor keyboard shortcuts
- var directions = {37: mxConstants.DIRECTION_WEST, 38: mxConstants.DIRECTION_NORTH,
- 39: mxConstants.DIRECTION_EAST, 40: mxConstants.DIRECTION_SOUTH};
-
- var keyHandlerGetFunction = keyHandler.getFunction;
-
- mxKeyHandler.prototype.getFunction = function(evt)
- {
- if (graph.isEnabled())
- {
- // TODO: Add alt modified state in core API, here are some specific cases
- if (mxEvent.isShiftDown(evt) && mxEvent.isAltDown(evt))
- {
- var action = editorUi.actions.get(editorUi.altShiftActions[evt.keyCode]);
-
- if (action != null)
- {
- return action.funct;
- }
- }
-
- if (evt.keyCode == 9 && mxEvent.isAltDown(evt))
- {
- if (graph.cellEditor.isContentEditing())
- {
- // Alt+Shift+Tab while editing
- return function()
- {
- document.execCommand('outdent', false, null);
- };
- }
- else if (mxEvent.isShiftDown(evt))
- {
- // Alt+Shift+Tab
- return function()
- {
- graph.selectParentCell();
- };
- }
- else
- {
- // Alt+Tab
- return function()
- {
- graph.selectChildCell();
- };
- }
- }
- else if (directions[evt.keyCode] != null && !graph.isSelectionEmpty())
- {
- // On macOS, Control+Cursor is used by Expose so allow for Alt+Control to resize
- if (!this.isControlDown(evt) && mxEvent.isShiftDown(evt) && mxEvent.isAltDown(evt))
- {
- if (graph.model.isVertex(graph.getSelectionCell()))
- {
- return function()
- {
- var cells = graph.connectVertex(graph.getSelectionCell(), directions[evt.keyCode],
- graph.defaultEdgeLength, evt, true);
-
- if (cells != null && cells.length > 0)
- {
- if (cells.length == 1 && graph.model.isEdge(cells[0]))
- {
- graph.setSelectionCell(graph.model.getTerminal(cells[0], false));
- }
- else
- {
- graph.setSelectionCell(cells[cells.length - 1]);
- }
-
- graph.scrollCellToVisible(graph.getSelectionCell());
-
- if (editorUi.hoverIcons != null)
- {
- editorUi.hoverIcons.update(graph.view.getState(graph.getSelectionCell()));
- }
- }
- };
- }
- }
- else
- {
- // Avoids consuming event if no vertex is selected by returning null below
- // Cursor keys move and resize (ctrl) cells
- if (this.isControlDown(evt))
- {
- return function()
- {
- nudge(evt.keyCode, (mxEvent.isShiftDown(evt)) ? graph.gridSize : null, true);
- };
- }
- else
- {
- return function()
- {
- nudge(evt.keyCode, (mxEvent.isShiftDown(evt)) ? graph.gridSize : null);
- };
- }
- }
- }
- }
-
- return keyHandlerGetFunction.apply(this, arguments);
- };
-
- // Binds keystrokes to actions
- keyHandler.bindAction = mxUtils.bind(this, function(code, control, key, shift)
- {
- var action = this.actions.get(key);
-
- if (action != null)
- {
- var f = function()
- {
- if (action.isEnabled())
- {
- action.funct();
- }
- };
-
- if (control)
- {
- if (shift)
- {
- keyHandler.bindControlShiftKey(code, f);
- }
- else
- {
- keyHandler.bindControlKey(code, f);
- }
- }
- else
- {
- if (shift)
- {
- keyHandler.bindShiftKey(code, f);
- }
- else
- {
- keyHandler.bindKey(code, f);
- }
- }
- }
- });
-
- var ui = this;
- var keyHandlerEscape = keyHandler.escape;
- keyHandler.escape = function(evt)
- {
- keyHandlerEscape.apply(this, arguments);
- };
-
- // Ignores enter keystroke. Remove this line if you want the
- // enter keystroke to stop editing. N, W, T are reserved.
- keyHandler.enter = function() {};
-
- keyHandler.bindControlShiftKey(36, function() { graph.exitGroup(); }); // Ctrl+Shift+Home
- keyHandler.bindControlShiftKey(35, function() { graph.enterGroup(); }); // Ctrl+Shift+End
- keyHandler.bindShiftKey(36, function() { graph.home(); }); // Ctrl+Shift+Home
- keyHandler.bindKey(35, function() { graph.refresh(); }); // End
- keyHandler.bindAction(107, true, 'zoomIn'); // Ctrl+Plus
- keyHandler.bindAction(109, true, 'zoomOut'); // Ctrl+Minus
- keyHandler.bindAction(80, true, 'print'); // Ctrl+P
- keyHandler.bindAction(79, true, 'outline', true); // Ctrl+Shift+O
-
- if (!this.editor.chromeless || this.editor.editable)
- {
- keyHandler.bindControlKey(36, function() { if (graph.isEnabled()) { graph.foldCells(true); }}); // Ctrl+Home
- keyHandler.bindControlKey(35, function() { if (graph.isEnabled()) { graph.foldCells(false); }}); // Ctrl+End
- keyHandler.bindControlKey(13, function() { ui.ctrlEnter(); }); // Ctrl+Enter
- keyHandler.bindAction(8, false, 'delete'); // Backspace
- keyHandler.bindAction(8, true, 'deleteAll'); // Ctrl+Backspace
- keyHandler.bindAction(8, false, 'deleteLabels', true); // Shift+Backspace
- keyHandler.bindAction(46, false, 'delete'); // Delete
- keyHandler.bindAction(46, true, 'deleteAll'); // Ctrl+Delete
- keyHandler.bindAction(46, false, 'deleteLabels', true); // Shift+Delete
- keyHandler.bindAction(36, false, 'resetView'); // Home
- keyHandler.bindAction(72, true, 'fitWindow', true); // Ctrl+Shift+H
- keyHandler.bindAction(74, true, 'fitPage'); // Ctrl+J
- keyHandler.bindAction(74, true, 'fitTwoPages', true); // Ctrl+Shift+J
- keyHandler.bindAction(48, true, 'customZoom'); // Ctrl+0
- keyHandler.bindAction(82, true, 'turn'); // Ctrl+R
- keyHandler.bindAction(82, true, 'clearDefaultStyle', true); // Ctrl+Shift+R
- keyHandler.bindAction(83, true, 'save'); // Ctrl+S
- keyHandler.bindAction(83, true, 'saveAs', true); // Ctrl+Shift+S
- keyHandler.bindAction(65, true, 'selectAll'); // Ctrl+A
- keyHandler.bindAction(65, true, 'selectNone', true); // Ctrl+A
- keyHandler.bindAction(73, true, 'selectVertices', true); // Ctrl+Shift+I
- keyHandler.bindAction(69, true, 'selectEdges', true); // Ctrl+Shift+E
- keyHandler.bindAction(69, true, 'editStyle'); // Ctrl+E
- keyHandler.bindAction(66, true, 'bold'); // Ctrl+B
- keyHandler.bindAction(66, true, 'toBack', true); // Ctrl+Shift+B
- keyHandler.bindAction(70, true, 'toFront', true); // Ctrl+Shift+F
- keyHandler.bindAction(68, true, 'duplicate'); // Ctrl+D
- keyHandler.bindAction(68, true, 'setAsDefaultStyle', true); // Ctrl+Shift+D
- keyHandler.bindAction(90, true, 'undo'); // Ctrl+Z
- keyHandler.bindAction(89, true, 'autosize', true); // Ctrl+Shift+Y
- keyHandler.bindAction(88, true, 'cut'); // Ctrl+X
- keyHandler.bindAction(67, true, 'copy'); // Ctrl+C
- keyHandler.bindAction(86, true, 'paste'); // Ctrl+V
- keyHandler.bindAction(71, true, 'group'); // Ctrl+G
- keyHandler.bindAction(77, true, 'editData'); // Ctrl+M
- keyHandler.bindAction(71, true, 'grid', true); // Ctrl+Shift+G
- keyHandler.bindAction(73, true, 'italic'); // Ctrl+I
- keyHandler.bindAction(76, true, 'lockUnlock'); // Ctrl+L
- keyHandler.bindAction(76, true, 'layers', true); // Ctrl+Shift+L
- keyHandler.bindAction(80, true, 'formatPanel', true); // Ctrl+Shift+P
- keyHandler.bindAction(85, true, 'underline'); // Ctrl+U
- keyHandler.bindAction(85, true, 'ungroup', true); // Ctrl+Shift+U
- keyHandler.bindAction(190, true, 'superscript'); // Ctrl+.
- keyHandler.bindAction(188, true, 'subscript'); // Ctrl+,
- keyHandler.bindAction(9, false, 'indent', true); // Shift+Tab,
- keyHandler.bindKey(13, function() { if (graph.isEnabled()) { graph.startEditingAtCell(); }}); // Enter
- keyHandler.bindKey(113, function() { if (graph.isEnabled()) { graph.startEditingAtCell(); }}); // F2
- }
-
- if (!mxClient.IS_WIN)
- {
- keyHandler.bindAction(90, true, 'redo', true); // Ctrl+Shift+Z
- }
- else
- {
- keyHandler.bindAction(89, true, 'redo'); // Ctrl+Y
- }
-
- return keyHandler;
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-EditorUi.prototype.destroy = function()
-{
- if (this.editor != null)
- {
- this.editor.destroy();
- this.editor = null;
- }
-
- if (this.menubar != null)
- {
- this.menubar.destroy();
- this.menubar = null;
- }
-
- if (this.toolbar != null)
- {
- this.toolbar.destroy();
- this.toolbar = null;
- }
-
- if (this.sidebar != null)
- {
- this.sidebar.destroy();
- this.sidebar = null;
- }
-
- if (this.keyHandler != null)
- {
- this.keyHandler.destroy();
- this.keyHandler = null;
- }
-
- if (this.keydownHandler != null)
- {
- mxEvent.removeListener(document, 'keydown', this.keydownHandler);
- this.keydownHandler = null;
- }
-
- if (this.keyupHandler != null)
- {
- mxEvent.removeListener(document, 'keyup', this.keyupHandler);
- this.keyupHandler = null;
- }
-
- if (this.resizeHandler != null)
- {
- mxEvent.removeListener(window, 'resize', this.resizeHandler);
- this.resizeHandler = null;
- }
-
- if (this.gestureHandler != null)
- {
- mxEvent.removeGestureListeners(document, this.gestureHandler);
- this.gestureHandler = null;
- }
-
- if (this.orientationChangeHandler != null)
- {
- mxEvent.removeListener(window, 'orientationchange', this.orientationChangeHandler);
- this.orientationChangeHandler = null;
- }
-
- if (this.scrollHandler != null)
- {
- mxEvent.removeListener(window, 'scroll', this.scrollHandler);
- this.scrollHandler = null;
- }
-
- if (this.destroyFunctions != null)
- {
- for (var i = 0; i < this.destroyFunctions.length; i++)
- {
- this.destroyFunctions[i]();
- }
-
- this.destroyFunctions = null;
- }
-
- var c = [this.menubarContainer, this.toolbarContainer, this.sidebarContainer,
- this.formatContainer, this.diagramContainer, this.footerContainer,
- this.chromelessToolbar, this.hsplit, this.sidebarFooterContainer,
- this.layersDialog];
-
- for (var i = 0; i < c.length; i++)
- {
- if (c[i] != null && c[i].parentNode != null)
- {
- c[i].parentNode.removeChild(c[i]);
- }
- }
-};
diff --git a/src/main/webapp/js/mxgraph/Format.js b/src/main/webapp/js/mxgraph/Format.js
deleted file mode 100644
index 021d522b..00000000
--- a/src/main/webapp/js/mxgraph/Format.js
+++ /dev/null
@@ -1,6629 +0,0 @@
-/**
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-Format = function(editorUi, container)
-{
- this.editorUi = editorUi;
- this.container = container;
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.labelIndex = 0;
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.diagramIndex = 0;
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.currentIndex = 0;
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.showCloseButton = true;
-
-/**
- * Background color for inactive tabs.
- */
-Format.prototype.inactiveTabBackgroundColor = '#f1f3f4';
-
-/**
- * Background color for inactive tabs.
- */
-Format.prototype.roundableShapes = ['label', 'rectangle', 'internalStorage', 'corner',
- 'parallelogram', 'swimlane', 'triangle', 'trapezoid', 'ext', 'step', 'tee', 'process',
- 'link', 'rhombus', 'offPageConnector', 'loopLimit', 'hexagon', 'manualInput', 'card',
- 'curlyBracket', 'singleArrow', 'callout', 'doubleArrow', 'flexArrow', 'umlLifeline'];
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Format.prototype.init = function()
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- this.update = mxUtils.bind(this, function(sender, evt)
- {
- this.clearSelectionState();
- this.refresh();
- });
-
- graph.getSelectionModel().addListener(mxEvent.CHANGE, this.update);
- graph.addListener(mxEvent.EDITING_STARTED, this.update);
- graph.addListener(mxEvent.EDITING_STOPPED, this.update);
- graph.getModel().addListener(mxEvent.CHANGE, this.update);
- graph.getView().addListener('unitChanged', this.update);
-
- graph.addListener(mxEvent.ROOT, mxUtils.bind(this, function()
- {
- this.refresh();
- }));
-
- ui.addListener('styleChanged', mxUtils.bind(this, function(sender, evt)
- {
- this.refresh();
- }));
-
- editor.addListener('autosaveChanged', mxUtils.bind(this, function()
- {
- this.refresh();
- }));
-
- this.refresh();
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.clearSelectionState = function()
-{
- this.selectionState = null;
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.getSelectionState = function()
-{
- if (this.selectionState == null)
- {
- this.selectionState = this.createSelectionState();
- }
-
- return this.selectionState;
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.createSelectionState = function()
-{
- var cells = this.editorUi.editor.graph.getSelectionCells();
- var result = this.initSelectionState();
-
- for (var i = 0; i < cells.length; i++)
- {
- this.updateSelectionStateForCell(result, cells[i], cells);
- }
-
- return result;
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.initSelectionState = function()
-{
- return {vertices: [], edges: [], x: null, y: null, width: null, height: null, style: {},
- containsImage: false, containsLabel: false, fill: true, glass: true, rounded: true,
- autoSize: false, image: true, shadow: true, lineJumps: true, resizable: true,
- table: false, cell: false, row: false, movable: true, rotatable: true, stroke: true};
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.updateSelectionStateForCell = function(result, cell, cells)
-{
- var graph = this.editorUi.editor.graph;
-
- if (graph.getModel().isVertex(cell))
- {
- result.resizable = result.resizable && graph.isCellResizable(cell);
- result.rotatable = result.rotatable && graph.isCellRotatable(cell);
- result.movable = result.movable && graph.isCellMovable(cell) &&
- !graph.isTableRow(cell) && !graph.isTableCell(cell);
- result.table = result.table || graph.isTable(cell);
- result.cell = result.cell || graph.isTableCell(cell);
- result.row = result.row || graph.isTableRow(cell);
- result.vertices.push(cell);
- var geo = graph.getCellGeometry(cell);
-
- if (geo != null)
- {
- if (geo.width > 0)
- {
- if (result.width == null)
- {
- result.width = geo.width;
- }
- else if (result.width != geo.width)
- {
- result.width = '';
- }
- }
- else
- {
- result.containsLabel = true;
- }
-
- if (geo.height > 0)
- {
- if (result.height == null)
- {
- result.height = geo.height;
- }
- else if (result.height != geo.height)
- {
- result.height = '';
- }
- }
- else
- {
- result.containsLabel = true;
- }
-
- if (!geo.relative || geo.offset != null)
- {
- var x = (geo.relative) ? geo.offset.x : geo.x;
- var y = (geo.relative) ? geo.offset.y : geo.y;
-
- if (result.x == null)
- {
- result.x = x;
- }
- else if (result.x != x)
- {
- result.x = '';
- }
-
- if (result.y == null)
- {
- result.y = y;
- }
- else if (result.y != y)
- {
- result.y = '';
- }
- }
- }
- }
- else if (graph.getModel().isEdge(cell))
- {
- result.edges.push(cell);
- result.resizable = false;
- result.rotatable = false;
- result.movable = false;
- }
-
- var state = graph.view.getState(cell);
-
- if (state != null)
- {
- result.autoSize = result.autoSize || this.isAutoSizeState(state);
- result.glass = result.glass && this.isGlassState(state);
- result.rounded = result.rounded && this.isRoundedState(state);
- result.lineJumps = result.lineJumps && this.isLineJumpState(state);
- result.image = result.image && this.isImageState(state);
- result.shadow = result.shadow && this.isShadowState(state);
- result.fill = result.fill && this.isFillState(state);
- result.stroke = result.stroke && this.isStrokeState(state);
-
- var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null);
- result.containsImage = result.containsImage || shape == 'image';
-
- for (var key in state.style)
- {
- var value = state.style[key];
-
- if (value != null)
- {
- if (result.style[key] == null)
- {
- result.style[key] = value;
- }
- else if (result.style[key] != value)
- {
- result.style[key] = '';
- }
- }
- }
- }
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isFillState = function(state)
-{
- return !this.isSpecialColor(state.style[mxConstants.STYLE_FILLCOLOR]) &&
- (state.view.graph.model.isVertex(state.cell) ||
- mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'arrow' ||
- mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'filledEdge' ||
- mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'flexArrow');
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isStrokeState = function(state)
-{
- return !this.isSpecialColor(state.style[mxConstants.STYLE_STROKECOLOR]);
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isSpecialColor = function(color)
-{
- return mxUtils.indexOf([mxConstants.STYLE_STROKECOLOR,
- mxConstants.STYLE_FILLCOLOR, 'inherit', 'swimlane',
- 'indicated'], color) >= 0;
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isGlassState = function(state)
-{
- var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null);
-
- return (shape == 'label' || shape == 'rectangle' || shape == 'internalStorage' ||
- shape == 'ext' || shape == 'umlLifeline' || shape == 'swimlane' ||
- shape == 'process');
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isRoundedState = function(state)
-{
- return (state.shape != null) ? state.shape.isRoundable() :
- mxUtils.indexOf(this.roundableShapes, mxUtils.getValue(state.style,
- mxConstants.STYLE_SHAPE, null)) >= 0;
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isLineJumpState = function(state)
-{
- var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null);
- var curved = mxUtils.getValue(state.style, mxConstants.STYLE_CURVED, false);
-
- return !curved && (shape == 'connector' || shape == 'filledEdge');
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isAutoSizeState = function(state)
-{
- return mxUtils.getValue(state.style, mxConstants.STYLE_AUTOSIZE, null) == '1';
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isImageState = function(state)
-{
- var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null);
-
- return (shape == 'label' || shape == 'image');
-};
-
-/**
- * Returns information about the current selection.
- */
-Format.prototype.isShadowState = function(state)
-{
- var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null);
-
- return (shape != 'image');
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Format.prototype.clear = function()
-{
- this.container.innerHTML = '';
-
- // Destroy existing panels
- if (this.panels != null)
- {
- for (var i = 0; i < this.panels.length; i++)
- {
- this.panels[i].destroy();
- }
- }
-
- this.panels = [];
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Format.prototype.refresh = function()
-{
- // Performance tweak: No refresh needed if not visible
- if (this.container.style.width == '0px')
- {
- return;
- }
-
- this.clear();
- var ui = this.editorUi;
- var graph = ui.editor.graph;
-
- var div = document.createElement('div');
- div.style.whiteSpace = 'nowrap';
- div.style.color = 'rgb(112, 112, 112)';
- div.style.textAlign = 'left';
- div.style.cursor = 'default';
-
- var label = document.createElement('div');
- label.className = 'geFormatSection';
- label.style.textAlign = 'center';
- label.style.fontWeight = 'bold';
- label.style.paddingTop = '8px';
- label.style.fontSize = '13px';
- label.style.borderWidth = '0px 0px 1px 1px';
- label.style.borderStyle = 'solid';
- label.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
- label.style.height = (mxClient.IS_QUIRKS) ? '34px' : '25px';
- label.style.overflow = 'hidden';
- label.style.width = '100%';
- this.container.appendChild(div);
-
- // Prevents text selection
- mxEvent.addListener(label, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown',
- mxUtils.bind(this, function(evt)
- {
- evt.preventDefault();
- }));
-
- var containsLabel = this.getSelectionState().containsLabel;
- var currentLabel = null;
- var currentPanel = null;
-
- var addClickHandler = mxUtils.bind(this, function(elt, panel, index)
- {
- var clickHandler = mxUtils.bind(this, function(evt)
- {
- if (currentLabel != elt)
- {
- if (containsLabel)
- {
- this.labelIndex = index;
- }
- else if (graph.isSelectionEmpty())
- {
- this.diagramIndex = index;
- }
- else
- {
- this.currentIndex = index;
- }
-
- if (currentLabel != null)
- {
- currentLabel.style.backgroundColor = this.inactiveTabBackgroundColor;
- currentLabel.style.borderBottomWidth = '1px';
- }
-
- currentLabel = elt;
- currentLabel.style.backgroundColor = '';
- currentLabel.style.borderBottomWidth = '0px';
-
- if (currentPanel != panel)
- {
- if (currentPanel != null)
- {
- currentPanel.style.display = 'none';
- }
-
- currentPanel = panel;
- currentPanel.style.display = '';
- }
- }
- });
-
- mxEvent.addListener(elt, 'click', clickHandler);
-
- // Prevents text selection
- mxEvent.addListener(elt, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown',
- mxUtils.bind(this, function(evt)
- {
- evt.preventDefault();
- }));
-
- if (index == ((containsLabel) ? this.labelIndex : ((graph.isSelectionEmpty()) ?
- this.diagramIndex : this.currentIndex)))
- {
- // Invokes handler directly as a workaround for no click on DIV in KHTML.
- clickHandler();
- }
- });
-
- var idx = 0;
-
- if (graph.isSelectionEmpty())
- {
- mxUtils.write(label, mxResources.get('diagram'));
- label.style.borderLeftWidth = '0px';
-
- div.appendChild(label);
- var diagramPanel = div.cloneNode(false);
- this.panels.push(new DiagramFormatPanel(this, ui, diagramPanel));
- this.container.appendChild(diagramPanel);
-
- if (Editor.styles != null)
- {
- diagramPanel.style.display = 'none';
- label.style.width = (this.showCloseButton) ? '106px' : '50%';
- label.style.cursor = 'pointer';
- label.style.backgroundColor = this.inactiveTabBackgroundColor;
-
- var label2 = label.cloneNode(false);
- label2.style.borderLeftWidth = '1px';
- label2.style.borderRightWidth = '1px';
- label2.style.backgroundColor = this.inactiveTabBackgroundColor;
-
- addClickHandler(label, diagramPanel, idx++);
-
- var stylePanel = div.cloneNode(false);
- stylePanel.style.display = 'none';
- mxUtils.write(label2, mxResources.get('style'));
- div.appendChild(label2);
- this.panels.push(new DiagramStylePanel(this, ui, stylePanel));
- this.container.appendChild(stylePanel);
-
- addClickHandler(label2, stylePanel, idx++);
- }
-
- // Adds button to hide the format panel since
- // people don't seem to find the toolbar button
- // and the menu item in the format menu
- if (this.showCloseButton)
- {
- var label2 = label.cloneNode(false);
- label2.style.borderLeftWidth = '1px';
- label2.style.borderRightWidth = '1px';
- label2.style.borderBottomWidth = '1px';
- label2.style.backgroundColor = this.inactiveTabBackgroundColor;
- label2.style.position = 'absolute';
- label2.style.right = '0px';
- label2.style.top = '0px';
- label2.style.width = '25px';
-
- var img = document.createElement('img');
- img.setAttribute('border', '0');
- img.setAttribute('src', Dialog.prototype.closeImage);
- img.setAttribute('title', mxResources.get('hide'));
- img.style.position = 'absolute';
- img.style.display = 'block';
- img.style.right = '0px';
- img.style.top = '8px';
- img.style.cursor = 'pointer';
- img.style.marginTop = '1px';
- img.style.marginRight = '6px';
- img.style.border = '1px solid transparent';
- img.style.padding = '1px';
- img.style.opacity = 0.5;
- label2.appendChild(img)
-
- mxEvent.addListener(img, 'click', function()
- {
- ui.actions.get('formatPanel').funct();
- });
-
- div.appendChild(label2);
- }
- }
- else if (graph.isEditing())
- {
- mxUtils.write(label, mxResources.get('text'));
- div.appendChild(label);
- this.panels.push(new TextFormatPanel(this, ui, div));
- }
- else
- {
- label.style.backgroundColor = this.inactiveTabBackgroundColor;
- label.style.borderLeftWidth = '1px';
- label.style.cursor = 'pointer';
- label.style.width = (containsLabel) ? '50%' : '33.3%';
- var label2 = label.cloneNode(false);
- var label3 = label2.cloneNode(false);
-
- // Workaround for ignored background in IE
- label2.style.backgroundColor = this.inactiveTabBackgroundColor;
- label3.style.backgroundColor = this.inactiveTabBackgroundColor;
-
- // Style
- if (containsLabel)
- {
- label2.style.borderLeftWidth = '0px';
- }
- else
- {
- label.style.borderLeftWidth = '0px';
- mxUtils.write(label, mxResources.get('style'));
- div.appendChild(label);
-
- var stylePanel = div.cloneNode(false);
- stylePanel.style.display = 'none';
- this.panels.push(new StyleFormatPanel(this, ui, stylePanel));
- this.container.appendChild(stylePanel);
-
- addClickHandler(label, stylePanel, idx++);
- }
-
- // Text
- mxUtils.write(label2, mxResources.get('text'));
- div.appendChild(label2);
-
- var textPanel = div.cloneNode(false);
- textPanel.style.display = 'none';
- this.panels.push(new TextFormatPanel(this, ui, textPanel));
- this.container.appendChild(textPanel);
-
- // Arrange
- mxUtils.write(label3, mxResources.get('arrange'));
- div.appendChild(label3);
-
- var arrangePanel = div.cloneNode(false);
- arrangePanel.style.display = 'none';
- this.panels.push(new ArrangePanel(this, ui, arrangePanel));
- this.container.appendChild(arrangePanel);
-
- addClickHandler(label2, textPanel, idx++);
- addClickHandler(label3, arrangePanel, idx++);
- }
-};
-
-/**
- * Base class for format panels.
- */
-BaseFormatPanel = function(format, editorUi, container)
-{
- this.format = format;
- this.editorUi = editorUi;
- this.container = container;
- this.listeners = [];
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.buttonBackgroundColor = 'white';
-
-/**
- * Adds the given color option.
- */
-BaseFormatPanel.prototype.getSelectionState = function()
-{
- var graph = this.editorUi.editor.graph;
- var cells = graph.getSelectionCells();
- var shape = null;
-
- for (var i = 0; i < cells.length; i++)
- {
- var state = graph.view.getState(cells[i]);
-
- if (state != null)
- {
- var tmp = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null);
-
- if (tmp != null)
- {
- if (shape == null)
- {
- shape = tmp;
- }
- else if (shape != tmp)
- {
- return null;
- }
- }
-
- }
- }
-
- return shape;
-};
-
-/**
- * Install input handler.
- */
-BaseFormatPanel.prototype.installInputHandler = function(input, key, defaultValue, min, max, unit, textEditFallback, isFloat)
-{
- unit = (unit != null) ? unit : '';
- isFloat = (isFloat != null) ? isFloat : false;
-
- var ui = this.editorUi;
- var graph = ui.editor.graph;
-
- min = (min != null) ? min : 1;
- max = (max != null) ? max : 999;
-
- var selState = null;
- var updating = false;
-
- var update = mxUtils.bind(this, function(evt)
- {
- var value = (isFloat) ? parseFloat(input.value) : parseInt(input.value);
-
- // Special case: angle mod 360
- if (!isNaN(value) && key == mxConstants.STYLE_ROTATION)
- {
- // Workaround for decimal rounding errors in floats is to
- // use integer and round all numbers to two decimal point
- value = mxUtils.mod(Math.round(value * 100), 36000) / 100;
- }
-
- value = Math.min(max, Math.max(min, (isNaN(value)) ? defaultValue : value));
-
- if (graph.cellEditor.isContentEditing() && textEditFallback)
- {
- if (!updating)
- {
- updating = true;
-
- if (selState != null)
- {
- graph.cellEditor.restoreSelection(selState);
- selState = null;
- }
-
- textEditFallback(value);
- input.value = value + unit;
-
- // Restore focus and selection in input
- updating = false;
- }
- }
- else if (value != mxUtils.getValue(this.format.getSelectionState().style, key, defaultValue))
- {
- if (graph.isEditing())
- {
- graph.stopEditing(true);
- }
-
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
- graph.setCellStyles(key, value, cells);
-
- // Handles special case for fontSize where HTML labels are parsed and updated
- if (key == mxConstants.STYLE_FONTSIZE)
- {
- graph.updateLabelElements(graph.getSelectionCells(), function(elt)
- {
- elt.style.fontSize = value + 'px';
- elt.removeAttribute('size');
- });
- }
-
- for (var i = 0; i < cells.length; i++)
- {
- if (graph.model.getChildCount(cells[i]) == 0)
- {
- graph.autoSizeCell(cells[i], false);
- }
- }
-
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [key],
- 'values', [value], 'cells', cells));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
-
- input.value = value + unit;
- mxEvent.consume(evt);
- });
-
- if (textEditFallback && graph.cellEditor.isContentEditing())
- {
- // KNOWN: Arrow up/down clear selection text in quirks/IE 8
- // Text size via arrow button limits to 16 in IE11. Why?
- mxEvent.addListener(input, 'mousedown', function()
- {
- if (document.activeElement == graph.cellEditor.textarea)
- {
- selState = graph.cellEditor.saveSelection();
- }
- });
-
- mxEvent.addListener(input, 'touchstart', function()
- {
- if (document.activeElement == graph.cellEditor.textarea)
- {
- selState = graph.cellEditor.saveSelection();
- }
- });
- }
-
- mxEvent.addListener(input, 'change', update);
- mxEvent.addListener(input, 'blur', update);
-
- return update;
-};
-
-/**
- * Adds the given option.
- */
-BaseFormatPanel.prototype.createPanel = function()
-{
- var div = document.createElement('div');
- div.className = 'geFormatSection';
- div.style.padding = '12px 0px 12px 18px';
-
- return div;
-};
-
-/**
- * Adds the given option.
- */
-BaseFormatPanel.prototype.createTitle = function(title)
-{
- var div = document.createElement('div');
- div.style.padding = '0px 0px 6px 0px';
- div.style.whiteSpace = 'nowrap';
- div.style.overflow = 'hidden';
- div.style.width = '200px';
- div.style.fontWeight = 'bold';
- mxUtils.write(div, title);
-
- return div;
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.createStepper = function(input, update, step, height, disableFocus, defaultValue, isFloat)
-{
- step = (step != null) ? step : 1;
- height = (height != null) ? height : 8;
-
- if (mxClient.IS_QUIRKS)
- {
- height = height - 2;
- }
- else if (mxClient.IS_MT || document.documentMode >= 8)
- {
- height = height + 1;
- }
-
- var stepper = document.createElement('div');
- mxUtils.setPrefixedStyle(stepper.style, 'borderRadius', '3px');
- stepper.style.border = '1px solid rgb(192, 192, 192)';
- stepper.style.position = 'absolute';
-
- var up = document.createElement('div');
- up.style.borderBottom = '1px solid rgb(192, 192, 192)';
- up.style.position = 'relative';
- up.style.height = height + 'px';
- up.style.width = '10px';
- up.className = 'geBtnUp';
- stepper.appendChild(up);
-
- var down = up.cloneNode(false);
- down.style.border = 'none';
- down.style.height = height + 'px';
- down.className = 'geBtnDown';
- stepper.appendChild(down);
-
- mxEvent.addListener(down, 'click', function(evt)
- {
- if (input.value == '')
- {
- input.value = defaultValue || '2';
- }
-
- var val = isFloat? parseFloat(input.value) : parseInt(input.value);
-
- if (!isNaN(val))
- {
- input.value = val - step;
-
- if (update != null)
- {
- update(evt);
- }
- }
-
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(up, 'click', function(evt)
- {
- if (input.value == '')
- {
- input.value = defaultValue || '0';
- }
-
- var val = isFloat? parseFloat(input.value) : parseInt(input.value);
-
- if (!isNaN(val))
- {
- input.value = val + step;
-
- if (update != null)
- {
- update(evt);
- }
- }
-
- mxEvent.consume(evt);
- });
-
- // Disables transfer of focus to DIV but also :active CSS
- // so it's only used for fontSize where the focus should
- // stay on the selected text, but not for any other input.
- if (disableFocus)
- {
- var currentSelection = null;
-
- mxEvent.addGestureListeners(stepper,
- function(evt)
- {
- // Workaround for lost current selection in page because of focus in IE
- if (mxClient.IS_QUIRKS || document.documentMode == 8)
- {
- currentSelection = document.selection.createRange();
- }
-
- mxEvent.consume(evt);
- },
- null,
- function(evt)
- {
- // Workaround for lost current selection in page because of focus in IE
- if (currentSelection != null)
- {
- try
- {
- currentSelection.select();
- }
- catch (e)
- {
- // ignore
- }
-
- currentSelection = null;
- mxEvent.consume(evt);
- }
- }
- );
- }
-
- return stepper;
-};
-
-/**
- * Adds the given option.
- */
-BaseFormatPanel.prototype.createOption = function(label, isCheckedFn, setCheckedFn, listener, fn)
-{
- var div = document.createElement('div');
- div.style.padding = '6px 0px 1px 0px';
- div.style.whiteSpace = 'nowrap';
- div.style.overflow = 'hidden';
- div.style.width = '200px';
- div.style.height = (mxClient.IS_QUIRKS) ? '27px' : '18px';
-
- var cb = document.createElement('input');
- cb.setAttribute('type', 'checkbox');
- cb.style.margin = '0px 6px 0px 0px';
- div.appendChild(cb);
-
- var span = document.createElement('span');
- mxUtils.write(span, label);
- div.appendChild(span);
-
- var applying = false;
- var value = isCheckedFn();
-
- var apply = function(newValue)
- {
- if (!applying)
- {
- applying = true;
-
- if (newValue)
- {
- cb.setAttribute('checked', 'checked');
- cb.defaultChecked = true;
- cb.checked = true;
- }
- else
- {
- cb.removeAttribute('checked');
- cb.defaultChecked = false;
- cb.checked = false;
- }
-
- if (value != newValue)
- {
- value = newValue;
-
- // Checks if the color value needs to be updated in the model
- if (isCheckedFn() != value)
- {
- setCheckedFn(value);
- }
- }
-
- applying = false;
- }
- };
-
- mxEvent.addListener(div, 'click', function(evt)
- {
- if (cb.getAttribute('disabled') != 'disabled')
- {
- // Toggles checkbox state for click on label
- var source = mxEvent.getSource(evt);
-
- if (source == div || source == span)
- {
- cb.checked = !cb.checked;
- }
-
- apply(cb.checked);
- }
- });
-
- apply(value);
-
- if (listener != null)
- {
- listener.install(apply);
- this.listeners.push(listener);
- }
-
- if (fn != null)
- {
- fn(div);
- }
-
- return div;
-};
-
-/**
- * The string 'null' means use null in values.
- */
-BaseFormatPanel.prototype.createCellOption = function(label, key, defaultValue, enabledValue, disabledValue, fn, action, stopEditing)
-{
- enabledValue = (enabledValue != null) ? ((enabledValue == 'null') ? null : enabledValue) : '1';
- disabledValue = (disabledValue != null) ? ((disabledValue == 'null') ? null : disabledValue) : '0';
-
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- return this.createOption(label, function()
- {
- // Seems to be null sometimes, not sure why...
- var state = graph.view.getState(graph.getSelectionCell());
-
- if (state != null)
- {
- return mxUtils.getValue(state.style, key, defaultValue) != disabledValue;
- }
-
- return null;
- }, function(checked)
- {
- if (stopEditing)
- {
- graph.stopEditing();
- }
-
- if (action != null)
- {
- action.funct();
- }
- else
- {
- graph.getModel().beginUpdate();
- try
- {
- var value = (checked) ? enabledValue : disabledValue;
- graph.setCellStyles(key, value, graph.getSelectionCells());
-
- if (fn != null)
- {
- fn(graph.getSelectionCells(), value);
- }
-
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [key],
- 'values', [value], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }
- },
- {
- install: function(apply)
- {
- this.listener = function()
- {
- // Seems to be null sometimes, not sure why...
- var state = graph.view.getState(graph.getSelectionCell());
-
- if (state != null)
- {
- apply(mxUtils.getValue(state.style, key, defaultValue) != disabledValue);
- }
- };
-
- graph.getModel().addListener(mxEvent.CHANGE, this.listener);
- },
- destroy: function()
- {
- graph.getModel().removeListener(this.listener);
- }
- });
-};
-
-/**
- * Adds the given color option.
- */
-BaseFormatPanel.prototype.createColorOption = function(label, getColorFn, setColorFn, defaultColor, listener, callbackFn, hideCheckbox)
-{
- var div = document.createElement('div');
- div.style.padding = '6px 0px 1px 0px';
- div.style.whiteSpace = 'nowrap';
- div.style.overflow = 'hidden';
- div.style.width = '200px';
- div.style.height = (mxClient.IS_QUIRKS) ? '27px' : '18px';
-
- var cb = document.createElement('input');
- cb.setAttribute('type', 'checkbox');
- cb.style.margin = '0px 6px 0px 0px';
-
- if (!hideCheckbox)
- {
- div.appendChild(cb);
- }
-
- var span = document.createElement('span');
- mxUtils.write(span, label);
- div.appendChild(span);
-
- var value = getColorFn();
- var applying = false;
- var btn = null;
-
- var apply = function(color, disableUpdate, forceUpdate)
- {
- if (!applying)
- {
- applying = true;
- color = (/(^#?[a-zA-Z0-9]*$)/.test(color)) ? color : defaultColor;
- btn.innerHTML = '<div style="width:' + ((mxClient.IS_QUIRKS) ? '30' : '36') +
- 'px;height:12px;margin:3px;border:1px solid black;background-color:' +
- mxUtils.htmlEntities((color != null && color != mxConstants.NONE) ?
- color : defaultColor) + ';"></div>';
-
- // Fine-tuning in Firefox, quirks mode and IE8 standards
- if (mxClient.IS_QUIRKS || document.documentMode == 8)
- {
- btn.firstChild.style.margin = '0px';
- }
-
- if (color != null && color != mxConstants.NONE)
- {
- cb.setAttribute('checked', 'checked');
- cb.defaultChecked = true;
- cb.checked = true;
- }
- else
- {
- cb.removeAttribute('checked');
- cb.defaultChecked = false;
- cb.checked = false;
- }
-
- btn.style.display = (cb.checked || hideCheckbox) ? '' : 'none';
-
- if (callbackFn != null)
- {
- callbackFn(color);
- }
-
- if (!disableUpdate)
- {
- value = color;
-
- // Checks if the color value needs to be updated in the model
- if (forceUpdate || hideCheckbox || getColorFn() != value)
- {
- setColorFn(value);
- }
- }
-
- applying = false;
- }
- };
-
- btn = mxUtils.button('', mxUtils.bind(this, function(evt)
- {
- this.editorUi.pickColor(value, function(color)
- {
- apply(color, null, true);
- });
- mxEvent.consume(evt);
- }));
-
- btn.style.position = 'absolute';
- btn.style.marginTop = '-4px';
- btn.style.right = (mxClient.IS_QUIRKS) ? '0px' : '20px';
- btn.style.height = '22px';
- btn.className = 'geColorBtn';
- btn.style.display = (cb.checked || hideCheckbox) ? '' : 'none';
- div.appendChild(btn);
-
- mxEvent.addListener(div, 'click', function(evt)
- {
- var source = mxEvent.getSource(evt);
-
- if (source == cb || source.nodeName != 'INPUT')
- {
- // Toggles checkbox state for click on label
- if (source != cb)
- {
- cb.checked = !cb.checked;
- }
-
- // Overrides default value with current value to make it easier
- // to restore previous value if the checkbox is clicked twice
- if (!cb.checked && value != null && value != mxConstants.NONE &&
- defaultColor != mxConstants.NONE)
- {
- defaultColor = value;
- }
-
- apply((cb.checked) ? defaultColor : mxConstants.NONE);
- }
- });
-
- apply(value, true);
-
- if (listener != null)
- {
- listener.install(apply);
- this.listeners.push(listener);
- }
-
- return div;
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.createCellColorOption = function(label, colorKey, defaultColor, callbackFn, setStyleFn)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- return this.createColorOption(label, function()
- {
- // Seems to be null sometimes, not sure why...
- var state = graph.view.getState(graph.getSelectionCell());
-
- if (state != null)
- {
- return mxUtils.getValue(state.style, colorKey, null);
- }
-
- return null;
- }, function(color)
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles(colorKey, color, graph.getSelectionCells());
-
- if (setStyleFn != null)
- {
- setStyleFn(color);
- }
-
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [colorKey],
- 'values', [color], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }, defaultColor || mxConstants.NONE,
- {
- install: function(apply)
- {
- this.listener = function()
- {
- // Seems to be null sometimes, not sure why...
- var state = graph.view.getState(graph.getSelectionCell());
-
- if (state != null)
- {
- apply(mxUtils.getValue(state.style, colorKey, null));
- }
- };
-
- graph.getModel().addListener(mxEvent.CHANGE, this.listener);
- },
- destroy: function()
- {
- graph.getModel().removeListener(this.listener);
- }
- }, callbackFn);
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.addArrow = function(elt, height)
-{
- height = (height != null) ? height : 10;
-
- var arrow = document.createElement('div');
- arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
- arrow.style.padding = '6px';
- arrow.style.paddingRight = '4px';
-
- var m = (10 - height);
-
- if (m == 2)
- {
- arrow.style.paddingTop = 6 + 'px';
- }
- else if (m > 0)
- {
- arrow.style.paddingTop = (6 - m) + 'px';
- }
- else
- {
- arrow.style.marginTop = '-2px';
- }
-
- arrow.style.height = height + 'px';
- arrow.style.borderLeft = '1px solid #a0a0a0';
- arrow.innerHTML = '<img border="0" src="' + ((mxClient.IS_SVG) ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHBJREFUeNpidHB2ZyAGsACxDRBPIKCuA6TwCBB/h2rABu4A8SYmKCcXiP/iUFgAxL9gCi8A8SwsirZCMQMTkmANEH9E4v+CmsaArvAdyNFI/FlQ92EoBIE+qCRIUz168DBgsU4OqhinQpgHMABAgAEALY4XLIsJ20oAAAAASUVORK5CYII=' :
- IMAGE_PATH + '/dropdown.png') + '" style="margin-bottom:4px;">';
- mxUtils.setOpacity(arrow, 70);
-
- var symbol = elt.getElementsByTagName('div')[0];
-
- if (symbol != null)
- {
- symbol.style.paddingRight = '6px';
- symbol.style.marginLeft = '4px';
- symbol.style.marginTop = '-1px';
- symbol.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
- mxUtils.setOpacity(symbol, 60);
- }
-
- mxUtils.setOpacity(elt, 100);
- elt.style.border = '1px solid #a0a0a0';
- elt.style.backgroundColor = this.buttonBackgroundColor;
- elt.style.backgroundImage = 'none';
- elt.style.width = 'auto';
- elt.className += ' geColorBtn';
- mxUtils.setPrefixedStyle(elt.style, 'borderRadius', '3px');
-
- elt.appendChild(arrow);
-
- return symbol;
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.addUnitInput = function(container, unit, right, width, update, step, marginTop, disableFocus, isFloat)
-{
- marginTop = (marginTop != null) ? marginTop : 0;
-
- var input = document.createElement('input');
- input.style.position = 'absolute';
- input.style.textAlign = 'right';
- input.style.marginTop = '-2px';
- input.style.right = (right + 12) + 'px';
- input.style.width = width + 'px';
- container.appendChild(input);
-
- var stepper = this.createStepper(input, update, step, null, disableFocus, null, isFloat);
- stepper.style.marginTop = (marginTop - 2) + 'px';
- stepper.style.right = right + 'px';
- container.appendChild(stepper);
-
- return input;
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.createRelativeOption = function(label, key, width, handler, init)
-{
- width = (width != null) ? width : 44;
-
- var graph = this.editorUi.editor.graph;
- var div = this.createPanel();
- div.style.paddingTop = '10px';
- div.style.paddingBottom = '10px';
- mxUtils.write(div, label);
- div.style.fontWeight = 'bold';
-
- var update = mxUtils.bind(this, function(evt)
- {
- if (handler != null)
- {
- handler(input);
- }
- else
- {
- var value = parseInt(input.value);
- value = Math.min(100, Math.max(0, (isNaN(value)) ? 100 : value));
- var state = graph.view.getState(graph.getSelectionCell());
-
- if (state != null && value != mxUtils.getValue(state.style, key, 100))
- {
- // Removes entry in style (assumes 100 is default for relative values)
- if (value == 100)
- {
- value = null;
- }
-
- graph.setCellStyles(key, value, graph.getSelectionCells());
- this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [key],
- 'values', [value], 'cells', graph.getSelectionCells()));
- }
-
- input.value = ((value != null) ? value : '100') + ' %';
- }
-
- mxEvent.consume(evt);
- });
-
- var input = this.addUnitInput(div, '%', 20, width, update, 10, -15, handler != null);
-
- if (key != null)
- {
- var listener = mxUtils.bind(this, function(sender, evt, force)
- {
- if (force || input != document.activeElement)
- {
- var ss = this.format.getSelectionState();
- var tmp = parseInt(mxUtils.getValue(ss.style, key, 100));
- input.value = (isNaN(tmp)) ? '' : tmp + ' %';
- }
- });
-
- mxEvent.addListener(input, 'keydown', function(e)
- {
- if (e.keyCode == 13)
- {
- graph.container.focus();
- mxEvent.consume(e);
- }
- else if (e.keyCode == 27)
- {
- listener(null, null, true);
- graph.container.focus();
- mxEvent.consume(e);
- }
- });
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
- }
-
- mxEvent.addListener(input, 'blur', update);
- mxEvent.addListener(input, 'change', update);
-
- if (init != null)
- {
- init(input);
- }
-
- return div;
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.addLabel = function(div, title, right, width)
-{
- width = (width != null) ? width : 61;
-
- var label = document.createElement('div');
- mxUtils.write(label, title);
- label.style.position = 'absolute';
- label.style.right = right + 'px';
- label.style.width = width + 'px';
- label.style.marginTop = '6px';
- label.style.textAlign = 'center';
- div.appendChild(label);
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.addKeyHandler = function(input, listener)
-{
- mxEvent.addListener(input, 'keydown', mxUtils.bind(this, function(e)
- {
- if (e.keyCode == 13)
- {
- this.editorUi.editor.graph.container.focus();
- mxEvent.consume(e);
- }
- else if (e.keyCode == 27)
- {
- if (listener != null)
- {
- listener(null, null, true);
- }
-
- this.editorUi.editor.graph.container.focus();
- mxEvent.consume(e);
- }
- }));
-};
-
-/**
- *
- */
-BaseFormatPanel.prototype.styleButtons = function(elts)
-{
- for (var i = 0; i < elts.length; i++)
- {
- mxUtils.setPrefixedStyle(elts[i].style, 'borderRadius', '3px');
- mxUtils.setOpacity(elts[i], 100);
- elts[i].style.border = '1px solid #a0a0a0';
- elts[i].style.padding = '4px';
- elts[i].style.paddingTop = '3px';
- elts[i].style.paddingRight = '1px';
- elts[i].style.margin = '1px';
- elts[i].style.width = '24px';
- elts[i].style.height = '20px';
- elts[i].className += ' geColorBtn';
- }
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-BaseFormatPanel.prototype.destroy = function()
-{
- if (this.listeners != null)
- {
- for (var i = 0; i < this.listeners.length; i++)
- {
- this.listeners[i].destroy();
- }
-
- this.listeners = null;
- }
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-ArrangePanel = function(format, editorUi, container)
-{
- BaseFormatPanel.call(this, format, editorUi, container);
- this.init();
-};
-
-mxUtils.extend(ArrangePanel, BaseFormatPanel);
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-ArrangePanel.prototype.init = function()
-{
- var graph = this.editorUi.editor.graph;
- var ss = this.format.getSelectionState();
-
- this.container.appendChild(this.addLayerOps(this.createPanel()));
- // Special case that adds two panels
- this.addGeometry(this.container);
- this.addEdgeGeometry(this.container);
-
- if (!ss.containsLabel || ss.edges.length == 0)
- {
- this.container.appendChild(this.addAngle(this.createPanel()));
- }
-
- if (!ss.containsLabel && ss.edges.length == 0 &&
- ss.style.shape != 'rectangle' &&
- ss.style.shape != 'label')
- {
- this.container.appendChild(this.addFlip(this.createPanel()));
- }
-
- if (ss.vertices.length > 1)
- {
- this.container.appendChild(this.addAlign(this.createPanel()));
- this.container.appendChild(this.addDistribute(this.createPanel()));
- }
-
- if (graph.isTable(ss.vertices[0]) ||
- graph.isTableRow(ss.vertices[0]) ||
- graph.isTableCell(ss.vertices[0]))
- {
- this.container.appendChild(this.addTable(this.createPanel()));
- }
-
- this.container.appendChild(this.addGroupOps(this.createPanel()));
-
- if (ss.containsLabel)
- {
- // Adds functions from hidden style format panel
- var span = document.createElement('div');
- span.style.width = '100%';
- span.style.marginTop = '0px';
- span.style.fontWeight = 'bold';
- span.style.padding = '10px 0 0 18px';
- mxUtils.write(span, mxResources.get('style'));
- this.container.appendChild(span);
-
- new StyleFormatPanel(this.format, this.editorUi, this.container);
- }
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addTable = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- var ss = this.format.getSelectionState();
- div.style.paddingTop = '6px';
- div.style.paddingBottom = '10px';
-
- var span = document.createElement('div');
- span.style.marginTop = '2px';
- span.style.marginBottom = '8px';
- span.style.fontWeight = 'bold';
- mxUtils.write(span, mxResources.get('table'));
- div.appendChild(span);
-
- var panel = document.createElement('div');
- panel.style.position = 'relative';
- panel.style.paddingLeft = '0px';
- panel.style.borderWidth = '0px';
- panel.className = 'geToolbarContainer';
-
- var btns = [
- ui.toolbar.addButton('geSprite-insertcolumnbefore', mxResources.get('insertColumnBefore'),
- mxUtils.bind(this, function()
- {
- try
- {
- graph.insertTableColumn(ss.vertices[0], true);
- }
- catch (e)
- {
- ui.handleError(e);
- }
- }), panel),
- ui.toolbar.addButton('geSprite-insertcolumnafter', mxResources.get('insertColumnAfter'),
- mxUtils.bind(this, function()
- {
- try
- {
- graph.insertTableColumn(ss.vertices[0], false);
- }
- catch (e)
- {
- ui.handleError(e);
- }
- }), panel),
- ui.toolbar.addButton('geSprite-deletecolumn', mxResources.get('deleteColumn'),
- mxUtils.bind(this, function()
- {
- try
- {
- graph.deleteTableColumn(ss.vertices[0]);
- }
- catch (e)
- {
- ui.handleError(e);
- }
- }), panel),
- ui.toolbar.addButton('geSprite-insertrowbefore', mxResources.get('insertRowBefore'),
- mxUtils.bind(this, function()
- {
- try
- {
- graph.insertTableRow(ss.vertices[0], true);
- }
- catch (e)
- {
- ui.handleError(e);
- }
- }), panel),
- ui.toolbar.addButton('geSprite-insertrowafter', mxResources.get('insertRowAfter'),
- mxUtils.bind(this, function()
- {
- try
- {
- graph.insertTableRow(ss.vertices[0], false);
- }
- catch (e)
- {
- ui.handleError(e);
- }
- }), panel),
- ui.toolbar.addButton('geSprite-deleterow', mxResources.get('deleteRow'),
- mxUtils.bind(this, function()
- {
- try
- {
- graph.deleteTableRow(ss.vertices[0]);
- }
- catch (e)
- {
- ui.handleError(e);
- }
- }), panel)];
- this.styleButtons(btns);
- div.appendChild(panel);
- btns[2].style.marginRight = '9px';
-
- return div;
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addLayerOps = function(div)
-{
- var ui = this.editorUi;
-
- var btn = mxUtils.button(mxResources.get('toFront'), function(evt)
- {
- ui.actions.get('toFront').funct();
- })
-
- btn.setAttribute('title', mxResources.get('toFront') + ' (' + this.editorUi.actions.get('toFront').shortcut + ')');
- btn.style.width = '100px';
- btn.style.marginRight = '2px';
- div.appendChild(btn);
-
- var btn = mxUtils.button(mxResources.get('toBack'), function(evt)
- {
- ui.actions.get('toBack').funct();
- })
-
- btn.setAttribute('title', mxResources.get('toBack') + ' (' + this.editorUi.actions.get('toBack').shortcut + ')');
- btn.style.width = '100px';
- div.appendChild(btn);
-
- return div;
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addGroupOps = function(div)
-{
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var cell = graph.getSelectionCell();
- var ss = this.format.getSelectionState();
- var count = 0;
- var btn = null;
-
- div.style.paddingTop = '8px';
- div.style.paddingBottom = '6px';
-
- if (graph.getSelectionCount() > 1)
- {
- btn = mxUtils.button(mxResources.get('group'), function(evt)
- {
- ui.actions.get('group').funct();
- })
-
- btn.setAttribute('title', mxResources.get('group') + ' (' + this.editorUi.actions.get('group').shortcut + ')');
- btn.style.width = '202px';
- btn.style.marginBottom = '2px';
- div.appendChild(btn);
- count++;
- }
- else if (graph.getSelectionCount() == 1 && !graph.getModel().isEdge(cell) && !graph.isSwimlane(cell) &&
- !graph.isTable(cell) && !ss.row && !ss.cell && graph.getModel().getChildCount(cell) > 0)
- {
- btn = mxUtils.button(mxResources.get('ungroup'), function(evt)
- {
- ui.actions.get('ungroup').funct();
- })
-
- btn.setAttribute('title', mxResources.get('ungroup') + ' (' +
- this.editorUi.actions.get('ungroup').shortcut + ')');
- btn.style.width = '202px';
- btn.style.marginBottom = '2px';
- div.appendChild(btn);
- count++;
- }
-
- if (ss.vertices.length > 0)
- {
- if (count > 0)
- {
- mxUtils.br(div);
- count = 0;
- }
-
- var btn = mxUtils.button(mxResources.get('copySize'), function(evt)
- {
- ui.actions.get('copySize').funct();
- });
-
- btn.setAttribute('title', mxResources.get('copySize') + ' (' +
- this.editorUi.actions.get('copySize').shortcut + ')');
- btn.style.width = '202px';
- btn.style.marginBottom = '2px';
-
- div.appendChild(btn);
- count++;
-
- if (ui.copiedSize != null)
- {
- var btn2 = mxUtils.button(mxResources.get('pasteSize'), function(evt)
- {
- ui.actions.get('pasteSize').funct();
- });
-
- btn2.setAttribute('title', mxResources.get('pasteSize') + ' (' +
- this.editorUi.actions.get('pasteSize').shortcut + ')');
-
- div.appendChild(btn2);
- count++;
-
- btn.style.width = '100px';
- btn.style.marginBottom = '2px';
- btn2.style.width = '100px';
- btn2.style.marginBottom = '2px';
- }
- }
-
- if (graph.getSelectionCount() == 1 && graph.getModel().isVertex(cell) && !ss.row &&
- !ss.cell && graph.getModel().isVertex(graph.getModel().getParent(cell)))
- {
- if (count > 0)
- {
- mxUtils.br(div);
- }
-
- btn = mxUtils.button(mxResources.get('removeFromGroup'), function(evt)
- {
- ui.actions.get('removeFromGroup').funct();
- })
-
- btn.setAttribute('title', mxResources.get('removeFromGroup'));
- btn.style.width = '202px';
- btn.style.marginBottom = '2px';
- div.appendChild(btn);
- count++;
- }
- else if (graph.getSelectionCount() > 0)
- {
- if (count > 0)
- {
- mxUtils.br(div);
- }
-
- btn = mxUtils.button(mxResources.get('clearWaypoints'), mxUtils.bind(this, function(evt)
- {
- this.editorUi.actions.get('clearWaypoints').funct();
- }));
-
- btn.setAttribute('title', mxResources.get('clearWaypoints') + ' (' + this.editorUi.actions.get('clearWaypoints').shortcut + ')');
- btn.style.width = '202px';
- btn.style.marginBottom = '2px';
- div.appendChild(btn);
-
- count++;
- }
-
- if (graph.getSelectionCount() == 1)
- {
- if (count > 0)
- {
- mxUtils.br(div);
- }
-
- btn = mxUtils.button(mxResources.get('editData'), mxUtils.bind(this, function(evt)
- {
- this.editorUi.actions.get('editData').funct();
- }));
-
- btn.setAttribute('title', mxResources.get('editData') + ' (' + this.editorUi.actions.get('editData').shortcut + ')');
- btn.style.width = '100px';
- btn.style.marginBottom = '2px';
- div.appendChild(btn);
- count++;
-
- btn = mxUtils.button(mxResources.get('editLink'), mxUtils.bind(this, function(evt)
- {
- this.editorUi.actions.get('editLink').funct();
- }));
-
- btn.setAttribute('title', mxResources.get('editLink'));
- btn.style.width = '100px';
- btn.style.marginLeft = '2px';
- btn.style.marginBottom = '2px';
- div.appendChild(btn);
- count++;
- }
-
- if (count == 0)
- {
- div.style.display = 'none';
- }
-
- return div;
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addAlign = function(div)
-{
- var graph = this.editorUi.editor.graph;
- div.style.paddingTop = '6px';
- div.style.paddingBottom = '12px';
- div.appendChild(this.createTitle(mxResources.get('align')));
-
- var stylePanel = document.createElement('div');
- stylePanel.style.position = 'relative';
- stylePanel.style.paddingLeft = '0px';
- stylePanel.style.borderWidth = '0px';
- stylePanel.className = 'geToolbarContainer';
-
- if (mxClient.IS_QUIRKS)
- {
- div.style.height = '60px';
- }
-
- var left = this.editorUi.toolbar.addButton('geSprite-alignleft', mxResources.get('left'),
- function() { graph.alignCells(mxConstants.ALIGN_LEFT); }, stylePanel);
- var center = this.editorUi.toolbar.addButton('geSprite-aligncenter', mxResources.get('center'),
- function() { graph.alignCells(mxConstants.ALIGN_CENTER); }, stylePanel);
- var right = this.editorUi.toolbar.addButton('geSprite-alignright', mxResources.get('right'),
- function() { graph.alignCells(mxConstants.ALIGN_RIGHT); }, stylePanel);
-
- var top = this.editorUi.toolbar.addButton('geSprite-aligntop', mxResources.get('top'),
- function() { graph.alignCells(mxConstants.ALIGN_TOP); }, stylePanel);
- var middle = this.editorUi.toolbar.addButton('geSprite-alignmiddle', mxResources.get('middle'),
- function() { graph.alignCells(mxConstants.ALIGN_MIDDLE); }, stylePanel);
- var bottom = this.editorUi.toolbar.addButton('geSprite-alignbottom', mxResources.get('bottom'),
- function() { graph.alignCells(mxConstants.ALIGN_BOTTOM); }, stylePanel);
-
- this.styleButtons([left, center, right, top, middle, bottom]);
- right.style.marginRight = '6px';
- div.appendChild(stylePanel);
-
- return div;
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addFlip = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- div.style.paddingTop = '6px';
- div.style.paddingBottom = '10px';
-
- var span = document.createElement('div');
- span.style.marginTop = '2px';
- span.style.marginBottom = '8px';
- span.style.fontWeight = 'bold';
- mxUtils.write(span, mxResources.get('flip'));
- div.appendChild(span);
-
- var btn = mxUtils.button(mxResources.get('horizontal'), function(evt)
- {
- graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false);
- })
-
- btn.setAttribute('title', mxResources.get('horizontal'));
- btn.style.width = '100px';
- btn.style.marginRight = '2px';
- div.appendChild(btn);
-
- var btn = mxUtils.button(mxResources.get('vertical'), function(evt)
- {
- graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false);
- })
-
- btn.setAttribute('title', mxResources.get('vertical'));
- btn.style.width = '100px';
- div.appendChild(btn);
-
- return div;
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addDistribute = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- div.style.paddingTop = '6px';
- div.style.paddingBottom = '12px';
-
- div.appendChild(this.createTitle(mxResources.get('distribute')));
-
- var btn = mxUtils.button(mxResources.get('horizontal'), function(evt)
- {
- graph.distributeCells(true);
- })
-
- btn.setAttribute('title', mxResources.get('horizontal'));
- btn.style.width = '100px';
- btn.style.marginRight = '2px';
- div.appendChild(btn);
-
- var btn = mxUtils.button(mxResources.get('vertical'), function(evt)
- {
- graph.distributeCells(false);
- })
-
- btn.setAttribute('title', mxResources.get('vertical'));
- btn.style.width = '100px';
- div.appendChild(btn);
-
- return div;
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addAngle = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- var ss = this.format.getSelectionState();
-
- div.style.paddingBottom = '8px';
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.width = '70px';
- span.style.marginTop = '0px';
- span.style.fontWeight = 'bold';
-
- var input = null;
- var update = null;
- var btn = null;
-
- if (ss.rotatable && !ss.table && !ss.row && !ss.cell)
- {
- mxUtils.write(span, mxResources.get('angle'));
- div.appendChild(span);
-
- input = this.addUnitInput(div, '°', 20, 44, function()
- {
- update.apply(this, arguments);
- });
-
- mxUtils.br(div);
- div.style.paddingTop = '10px';
- }
- else
- {
- div.style.paddingTop = '8px';
- }
-
- if (!ss.containsLabel)
- {
- var label = mxResources.get('reverse');
-
- if (ss.vertices.length > 0 && ss.edges.length > 0)
- {
- label = mxResources.get('turn') + ' / ' + label;
- }
- else if (ss.vertices.length > 0)
- {
- label = mxResources.get('turn');
- }
-
- btn = mxUtils.button(label, function(evt)
- {
- ui.actions.get('turn').funct(evt);
- })
-
- btn.setAttribute('title', label + ' (' + this.editorUi.actions.get('turn').shortcut + ')');
- btn.style.width = '202px';
- div.appendChild(btn);
-
- if (input != null)
- {
- btn.style.marginTop = '8px';
- }
- }
-
- if (input != null)
- {
- var listener = mxUtils.bind(this, function(sender, evt, force)
- {
- if (force || document.activeElement != input)
- {
- ss = this.format.getSelectionState();
- var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_ROTATION, 0));
- input.value = (isNaN(tmp)) ? '' : tmp + '°';
- }
- });
-
- update = this.installInputHandler(input, mxConstants.STYLE_ROTATION, 0, 0, 360, '°', null, true);
- this.addKeyHandler(input, listener);
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
- }
-
- return div;
-};
-
-BaseFormatPanel.prototype.getUnit = function()
-{
- var unit = this.editorUi.editor.graph.view.unit;
-
- switch(unit)
- {
- case mxConstants.POINTS:
- return 'pt';
- case mxConstants.INCHES:
- return '"';
- case mxConstants.MILLIMETERS:
- return 'mm';
- }
-};
-
-BaseFormatPanel.prototype.inUnit = function(pixels)
-{
- return this.editorUi.editor.graph.view.formatUnitText(pixels);
-};
-
-BaseFormatPanel.prototype.fromUnit = function(value)
-{
- var unit = this.editorUi.editor.graph.view.unit;
-
- switch(unit)
- {
- case mxConstants.POINTS:
- return value;
- case mxConstants.INCHES:
- return value * mxConstants.PIXELS_PER_INCH;
- case mxConstants.MILLIMETERS:
- return value * mxConstants.PIXELS_PER_MM;
- }
-};
-
-BaseFormatPanel.prototype.isFloatUnit = function()
-{
- return this.editorUi.editor.graph.view.unit != mxConstants.POINTS;
-};
-
-BaseFormatPanel.prototype.getUnitStep = function()
-{
- var unit = this.editorUi.editor.graph.view.unit;
-
- switch(unit)
- {
- case mxConstants.POINTS:
- return 1;
- case mxConstants.INCHES:
- return 0.1;
- case mxConstants.MILLIMETERS:
- return 0.5;
- }
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addGeometry = function(container)
-{
- var panel = this;
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var rect = this.format.getSelectionState();
-
- var div = this.createPanel();
- div.style.paddingBottom = '8px';
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.width = '50px';
- span.style.marginTop = '0px';
- span.style.fontWeight = 'bold';
- mxUtils.write(span, mxResources.get('size'));
- div.appendChild(span);
-
- var widthUpdate, heightUpdate, leftUpdate, topUpdate;
- var width = this.addUnitInput(div, this.getUnit(), 84, 44, function()
- {
- widthUpdate.apply(this, arguments);
- }, this.getUnitStep(), null, null, this.isFloatUnit());
- var height = this.addUnitInput(div, this.getUnit(), 20, 44, function()
- {
- heightUpdate.apply(this, arguments);
- }, this.getUnitStep(), null, null, this.isFloatUnit());
-
- var autosizeBtn = document.createElement('div');
- autosizeBtn.className = 'geSprite geSprite-fit';
- autosizeBtn.setAttribute('title', mxResources.get('autosize') + ' (' + this.editorUi.actions.get('autosize').shortcut + ')');
- autosizeBtn.style.position = 'relative';
- autosizeBtn.style.cursor = 'pointer';
- autosizeBtn.style.marginTop = '-3px';
- autosizeBtn.style.border = '0px';
- autosizeBtn.style.left = '42px';
- mxUtils.setOpacity(autosizeBtn, 50);
-
- mxEvent.addListener(autosizeBtn, 'mouseenter', function()
- {
- mxUtils.setOpacity(autosizeBtn, 100);
- });
-
- mxEvent.addListener(autosizeBtn, 'mouseleave', function()
- {
- mxUtils.setOpacity(autosizeBtn, 50);
- });
-
- mxEvent.addListener(autosizeBtn, 'click', function()
- {
- ui.actions.get('autosize').funct();
- });
-
- div.appendChild(autosizeBtn);
-
- if (rect.row)
- {
- width.style.visibility = 'hidden';
- width.nextSibling.style.visibility = 'hidden';
- }
- else
- {
- this.addLabel(div, mxResources.get('width'), 84);
- }
-
- this.addLabel(div, mxResources.get('height'), 20);
- mxUtils.br(div);
-
- var wrapper = document.createElement('div');
- wrapper.style.paddingTop = '8px';
- wrapper.style.paddingRight = '20px';
- wrapper.style.whiteSpace = 'nowrap';
- wrapper.style.textAlign = 'right';
- var opt = this.createCellOption(mxResources.get('constrainProportions'),
- mxConstants.STYLE_ASPECT, null, 'fixed', 'null');
- opt.style.width = '100%';
- wrapper.appendChild(opt);
-
- if (!rect.cell && !rect.row)
- {
- div.appendChild(wrapper);
- }
- else
- {
- autosizeBtn.style.visibility = 'hidden';
- }
-
- var constrainCheckbox = opt.getElementsByTagName('input')[0];
- this.addKeyHandler(width, listener);
- this.addKeyHandler(height, listener);
-
- widthUpdate = this.addGeometryHandler(width, function(geo, value, cell)
- {
- if (graph.isTableCell(cell))
- {
- graph.setTableColumnWidth(cell, value - geo.width, true);
-
- // Blocks processing in caller
- return true;
- }
- else if (geo.width > 0)
- {
- var value = Math.max(1, panel.fromUnit(value));
-
- if (constrainCheckbox.checked)
- {
- geo.height = Math.round((geo.height * value * 100) / geo.width) / 100;
- }
-
- geo.width = value;
- }
- });
- heightUpdate = this.addGeometryHandler(height, function(geo, value, cell)
- {
- if (graph.isTableCell(cell))
- {
- cell = graph.model.getParent(cell);
- }
-
- if (graph.isTableRow(cell))
- {
- graph.setTableRowHeight(cell, value - geo.height);
-
- // Blocks processing in caller
- return true;
- }
- else if (geo.height > 0)
- {
- var value = Math.max(1, panel.fromUnit(value));
-
- if (constrainCheckbox.checked)
- {
- geo.width = Math.round((geo.width * value * 100) / geo.height) / 100;
- }
-
- geo.height = value;
- }
- });
-
- if (rect.resizable || rect.row || rect.cell)
- {
- container.appendChild(div);
- }
-
- var div2 = this.createPanel();
- div2.style.paddingBottom = '30px';
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.width = '70px';
- span.style.marginTop = '0px';
- span.style.fontWeight = 'bold';
- mxUtils.write(span, mxResources.get('position'));
- div2.appendChild(span);
-
- var left = this.addUnitInput(div2, this.getUnit(), 84, 44, function()
- {
- leftUpdate.apply(this, arguments);
- }, this.getUnitStep(), null, null, this.isFloatUnit());
- var top = this.addUnitInput(div2, this.getUnit(), 20, 44, function()
- {
- topUpdate.apply(this, arguments);
- }, this.getUnitStep(), null, null, this.isFloatUnit());
-
- mxUtils.br(div2);
-
- this.addLabel(div2, mxResources.get('left'), 84);
- this.addLabel(div2, mxResources.get('top'), 20);
-
- var listener = mxUtils.bind(this, function(sender, evt, force)
- {
- rect = this.format.getSelectionState();
-
- if (!rect.containsLabel && rect.vertices.length == graph.getSelectionCount() &&
- rect.width != null && rect.height != null)
- {
- div.style.display = '';
-
- if (force || document.activeElement != width)
- {
- width.value = this.inUnit(rect.width) + ((rect.width == '') ? '' : ' ' + this.getUnit());
- }
-
- if (force || document.activeElement != height)
- {
- height.value = this.inUnit(rect.height) + ((rect.height == '') ? '' : ' ' + this.getUnit());
- }
- }
- else
- {
- div.style.display = 'none';
- }
-
- if (rect.vertices.length == graph.getSelectionCount() &&
- rect.x != null && rect.y != null)
- {
- div2.style.display = '';
-
- if (force || document.activeElement != left)
- {
- left.value = this.inUnit(rect.x) + ((rect.x == '') ? '' : ' ' + this.getUnit());
- }
-
- if (force || document.activeElement != top)
- {
- top.value = this.inUnit(rect.y) + ((rect.y == '') ? '' : ' ' + this.getUnit());
- }
- }
- else
- {
- div2.style.display = 'none';
- }
- });
-
- this.addKeyHandler(left, listener);
- this.addKeyHandler(top, listener);
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
-
- leftUpdate = this.addGeometryHandler(left, function(geo, value)
- {
- value = panel.fromUnit(value);
-
- if (geo.relative)
- {
- geo.offset.x = value;
- }
- else
- {
- geo.x = value;
- }
- });
- topUpdate = this.addGeometryHandler(top, function(geo, value)
- {
- value = panel.fromUnit(value);
-
- if (geo.relative)
- {
- geo.offset.y = value;
- }
- else
- {
- geo.y = value;
- }
- });
-
- if (rect.movable)
- {
- container.appendChild(div2);
- }
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addGeometryHandler = function(input, fn)
-{
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var initialValue = null;
- var panel = this;
-
- function update(evt)
- {
- if (input.value != '')
- {
- var value = parseFloat(input.value);
-
- if (isNaN(value))
- {
- input.value = initialValue + ' ' + panel.getUnit();
- }
- else if (value != initialValue)
- {
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
-
- for (var i = 0; i < cells.length; i++)
- {
- if (graph.getModel().isVertex(cells[i]))
- {
- var geo = graph.getCellGeometry(cells[i]);
-
- if (geo != null)
- {
- geo = geo.clone();
-
- if (!fn(geo, value, cells[i]))
- {
- var state = graph.view.getState(cells[i]);
-
- if (state != null && graph.isRecursiveVertexResize(state))
- {
- graph.resizeChildCells(cells[i], geo);
- }
-
- graph.getModel().setGeometry(cells[i], geo);
- graph.constrainChildCells(cells[i]);
- }
- }
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- initialValue = value;
- input.value = value + ' ' + panel.getUnit();
- }
- }
-
- mxEvent.consume(evt);
- };
-
- mxEvent.addListener(input, 'blur', update);
- mxEvent.addListener(input, 'change', update);
- mxEvent.addListener(input, 'focus', function()
- {
- initialValue = input.value;
- });
-
- return update;
-};
-
-ArrangePanel.prototype.addEdgeGeometryHandler = function(input, fn)
-{
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var initialValue = null;
-
- function update(evt)
- {
- if (input.value != '')
- {
- var value = parseFloat(input.value);
-
- if (isNaN(value))
- {
- input.value = initialValue + ' pt';
- }
- else if (value != initialValue)
- {
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
-
- for (var i = 0; i < cells.length; i++)
- {
- if (graph.getModel().isEdge(cells[i]))
- {
- var geo = graph.getCellGeometry(cells[i]);
-
- if (geo != null)
- {
- geo = geo.clone();
- fn(geo, value);
-
- graph.getModel().setGeometry(cells[i], geo);
- }
- }
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- initialValue = value;
- input.value = value + ' pt';
- }
- }
-
- mxEvent.consume(evt);
- };
-
- mxEvent.addListener(input, 'blur', update);
- mxEvent.addListener(input, 'change', update);
- mxEvent.addListener(input, 'focus', function()
- {
- initialValue = input.value;
- });
-
- return update;
-};
-
-/**
- *
- */
-ArrangePanel.prototype.addEdgeGeometry = function(container)
-{
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var rect = this.format.getSelectionState();
-
- var div = this.createPanel();
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.width = '70px';
- span.style.marginTop = '0px';
- span.style.fontWeight = 'bold';
- mxUtils.write(span, mxResources.get('width'));
- div.appendChild(span);
-
- var widthUpdate, xtUpdate, ytUpdate, xsUpdate, ysUpdate;
- var width = this.addUnitInput(div, 'pt', 20, 44, function()
- {
- widthUpdate.apply(this, arguments);
- });
-
- mxUtils.br(div);
- this.addKeyHandler(width, listener);
-
- function widthUpdate(evt)
- {
- // Maximum stroke width is 999
- var value = parseInt(width.value);
- value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value));
-
- if (value != mxUtils.getValue(rect.style, 'width', mxCellRenderer.defaultShapes['flexArrow'].prototype.defaultWidth))
- {
- graph.setCellStyles('width', value, graph.getSelectionCells());
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['width'],
- 'values', [value], 'cells', graph.getSelectionCells()));
- }
-
- width.value = value + ' pt';
- mxEvent.consume(evt);
- };
-
- mxEvent.addListener(width, 'blur', widthUpdate);
- mxEvent.addListener(width, 'change', widthUpdate);
-
- container.appendChild(div);
-
- var divs = this.createPanel();
- divs.style.paddingBottom = '30px';
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.width = '70px';
- span.style.marginTop = '0px';
- span.style.fontWeight = 'bold';
- mxUtils.write(span, 'Start');
- divs.appendChild(span);
-
- var xs = this.addUnitInput(divs, 'pt', 84, 44, function()
- {
- xsUpdate.apply(this, arguments);
- });
- var ys = this.addUnitInput(divs, 'pt', 20, 44, function()
- {
- ysUpdate.apply(this, arguments);
- });
-
- mxUtils.br(divs);
- this.addLabel(divs, mxResources.get('left'), 84);
- this.addLabel(divs, mxResources.get('top'), 20);
- container.appendChild(divs);
- this.addKeyHandler(xs, listener);
- this.addKeyHandler(ys, listener);
-
- var divt = this.createPanel();
- divt.style.paddingBottom = '30px';
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.width = '70px';
- span.style.marginTop = '0px';
- span.style.fontWeight = 'bold';
- mxUtils.write(span, 'End');
- divt.appendChild(span);
-
- var xt = this.addUnitInput(divt, 'pt', 84, 44, function()
- {
- xtUpdate.apply(this, arguments);
- });
- var yt = this.addUnitInput(divt, 'pt', 20, 44, function()
- {
- ytUpdate.apply(this, arguments);
- });
-
- mxUtils.br(divt);
- this.addLabel(divt, mxResources.get('left'), 84);
- this.addLabel(divt, mxResources.get('top'), 20);
- container.appendChild(divt);
- this.addKeyHandler(xt, listener);
- this.addKeyHandler(yt, listener);
-
- var listener = mxUtils.bind(this, function(sender, evt, force)
- {
- rect = this.format.getSelectionState();
- var cell = graph.getSelectionCell();
-
- if (rect.style.shape == 'link' || rect.style.shape == 'flexArrow')
- {
- div.style.display = '';
-
- if (force || document.activeElement != width)
- {
- var value = mxUtils.getValue(rect.style, 'width',
- mxCellRenderer.defaultShapes['flexArrow'].prototype.defaultWidth);
- width.value = value + ' pt';
- }
- }
- else
- {
- div.style.display = 'none';
- }
-
- if (graph.getSelectionCount() == 1 && graph.model.isEdge(cell))
- {
- var geo = graph.model.getGeometry(cell);
-
- if (geo.sourcePoint != null && graph.model.getTerminal(cell, true) == null)
- {
- xs.value = geo.sourcePoint.x;
- ys.value = geo.sourcePoint.y;
- }
- else
- {
- divs.style.display = 'none';
- }
-
- if (geo.targetPoint != null && graph.model.getTerminal(cell, false) == null)
- {
- xt.value = geo.targetPoint.x;
- yt.value = geo.targetPoint.y;
- }
- else
- {
- divt.style.display = 'none';
- }
- }
- else
- {
- divs.style.display = 'none';
- divt.style.display = 'none';
- }
- });
-
- xsUpdate = this.addEdgeGeometryHandler(xs, function(geo, value)
- {
- geo.sourcePoint.x = value;
- });
-
- ysUpdate = this.addEdgeGeometryHandler(ys, function(geo, value)
- {
- geo.sourcePoint.y = value;
- });
-
- xtUpdate = this.addEdgeGeometryHandler(xt, function(geo, value)
- {
- geo.targetPoint.x = value;
- });
-
- ytUpdate = this.addEdgeGeometryHandler(yt, function(geo, value)
- {
- geo.targetPoint.y = value;
- });
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-TextFormatPanel = function(format, editorUi, container)
-{
- BaseFormatPanel.call(this, format, editorUi, container);
- this.init();
-};
-
-mxUtils.extend(TextFormatPanel, BaseFormatPanel);
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-TextFormatPanel.prototype.init = function()
-{
- this.container.style.borderBottom = 'none';
- this.addFont(this.container);
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-TextFormatPanel.prototype.addFont = function(container)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- var ss = this.format.getSelectionState();
-
- var title = this.createTitle(mxResources.get('font'));
- title.style.paddingLeft = '18px';
- title.style.paddingTop = '10px';
- title.style.paddingBottom = '6px';
- container.appendChild(title);
-
- var stylePanel = this.createPanel();
- stylePanel.style.paddingTop = '2px';
- stylePanel.style.paddingBottom = '2px';
- stylePanel.style.position = 'relative';
- stylePanel.style.marginLeft = '-2px';
- stylePanel.style.borderWidth = '0px';
- stylePanel.className = 'geToolbarContainer';
-
- if (mxClient.IS_QUIRKS)
- {
- stylePanel.style.display = 'block';
- }
-
- if (graph.cellEditor.isContentEditing())
- {
- var cssPanel = stylePanel.cloneNode();
-
- var cssMenu = this.editorUi.toolbar.addMenu(mxResources.get('style'),
- mxResources.get('style'), true, 'formatBlock', cssPanel, null, true);
- cssMenu.style.color = 'rgb(112, 112, 112)';
- cssMenu.style.whiteSpace = 'nowrap';
- cssMenu.style.overflow = 'hidden';
- cssMenu.style.margin = '0px';
- this.addArrow(cssMenu);
- cssMenu.style.width = '192px';
- cssMenu.style.height = '15px';
-
- var arrow = cssMenu.getElementsByTagName('div')[0];
- arrow.style.cssFloat = 'right';
- container.appendChild(cssPanel);
- }
-
- container.appendChild(stylePanel);
-
- var colorPanel = this.createPanel();
- colorPanel.style.marginTop = '8px';
- colorPanel.style.borderTop = '1px solid #c0c0c0';
- colorPanel.style.paddingTop = '6px';
- colorPanel.style.paddingBottom = '6px';
-
- var fontMenu = this.editorUi.toolbar.addMenu('Helvetica', mxResources.get('fontFamily'),
- true, 'fontFamily', stylePanel, null, true);
- fontMenu.style.color = 'rgb(112, 112, 112)';
- fontMenu.style.whiteSpace = 'nowrap';
- fontMenu.style.overflow = 'hidden';
- fontMenu.style.margin = '0px';
-
- this.addArrow(fontMenu);
- fontMenu.style.width = '192px';
- fontMenu.style.height = '15px';
-
- var stylePanel2 = stylePanel.cloneNode(false);
- stylePanel2.style.marginLeft = '-3px';
- var fontStyleItems = this.editorUi.toolbar.addItems(['bold', 'italic', 'underline'], stylePanel2, true);
- fontStyleItems[0].setAttribute('title', mxResources.get('bold') + ' (' + this.editorUi.actions.get('bold').shortcut + ')');
- fontStyleItems[1].setAttribute('title', mxResources.get('italic') + ' (' + this.editorUi.actions.get('italic').shortcut + ')');
- fontStyleItems[2].setAttribute('title', mxResources.get('underline') + ' (' + this.editorUi.actions.get('underline').shortcut + ')');
-
- var verticalItem = this.editorUi.toolbar.addItems(['vertical'], stylePanel2, true)[0];
-
- if (mxClient.IS_QUIRKS)
- {
- mxUtils.br(container);
- }
-
- container.appendChild(stylePanel2);
-
- this.styleButtons(fontStyleItems);
- this.styleButtons([verticalItem]);
-
- var stylePanel3 = stylePanel.cloneNode(false);
- stylePanel3.style.marginLeft = '-3px';
- stylePanel3.style.paddingBottom = '0px';
-
- // Helper function to return a wrapper function does not pass any arguments
- var callFn = function(fn)
- {
- return function()
- {
- return fn();
- };
- };
-
- var left = this.editorUi.toolbar.addButton('geSprite-left', mxResources.get('left'),
- (graph.cellEditor.isContentEditing()) ?
- function(evt)
- {
- graph.cellEditor.alignText(mxConstants.ALIGN_LEFT, evt);
- } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_LEFT])), stylePanel3);
- var center = this.editorUi.toolbar.addButton('geSprite-center', mxResources.get('center'),
- (graph.cellEditor.isContentEditing()) ?
- function(evt)
- {
- graph.cellEditor.alignText(mxConstants.ALIGN_CENTER, evt);
- } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_CENTER])), stylePanel3);
- var right = this.editorUi.toolbar.addButton('geSprite-right', mxResources.get('right'),
- (graph.cellEditor.isContentEditing()) ?
- function(evt)
- {
- graph.cellEditor.alignText(mxConstants.ALIGN_RIGHT, evt);
- } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_RIGHT])), stylePanel3);
-
- this.styleButtons([left, center, right]);
-
- // Quick hack for strikethrough
- // TODO: Add translations and toggle state
- if (graph.cellEditor.isContentEditing())
- {
- var strike = this.editorUi.toolbar.addButton('geSprite-removeformat', mxResources.get('strikethrough'),
- function()
- {
- document.execCommand('strikeThrough', false, null);
- }, stylePanel2);
- this.styleButtons([strike]);
-
- strike.firstChild.style.background = 'url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGRlZnM+PHBhdGggaWQ9ImEiIGQ9Ik0wIDBoMjR2MjRIMFYweiIvPjwvZGVmcz48Y2xpcFBhdGggaWQ9ImIiPjx1c2UgeGxpbms6aHJlZj0iI2EiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PC9jbGlwUGF0aD48cGF0aCBjbGlwLXBhdGg9InVybCgjYikiIGZpbGw9IiMwMTAxMDEiIGQ9Ik03LjI0IDguNzVjLS4yNi0uNDgtLjM5LTEuMDMtLjM5LTEuNjcgMC0uNjEuMTMtMS4xNi40LTEuNjcuMjYtLjUuNjMtLjkzIDEuMTEtMS4yOS40OC0uMzUgMS4wNS0uNjMgMS43LS44My42Ni0uMTkgMS4zOS0uMjkgMi4xOC0uMjkuODEgMCAxLjU0LjExIDIuMjEuMzQuNjYuMjIgMS4yMy41NCAxLjY5Ljk0LjQ3LjQuODMuODggMS4wOCAxLjQzLjI1LjU1LjM4IDEuMTUuMzggMS44MWgtMy4wMWMwLS4zMS0uMDUtLjU5LS4xNS0uODUtLjA5LS4yNy0uMjQtLjQ5LS40NC0uNjgtLjItLjE5LS40NS0uMzMtLjc1LS40NC0uMy0uMS0uNjYtLjE2LTEuMDYtLjE2LS4zOSAwLS43NC4wNC0xLjAzLjEzLS4yOS4wOS0uNTMuMjEtLjcyLjM2LS4xOS4xNi0uMzQuMzQtLjQ0LjU1LS4xLjIxLS4xNS40My0uMTUuNjYgMCAuNDguMjUuODguNzQgMS4yMS4zOC4yNS43Ny40OCAxLjQxLjdINy4zOWMtLjA1LS4wOC0uMTEtLjE3LS4xNS0uMjV6TTIxIDEydi0ySDN2Mmg5LjYyYy4xOC4wNy40LjE0LjU1LjIuMzcuMTcuNjYuMzQuODcuNTEuMjEuMTcuMzUuMzYuNDMuNTcuMDcuMi4xMS40My4xMS42OSAwIC4yMy0uMDUuNDUtLjE0LjY2LS4wOS4yLS4yMy4zOC0uNDIuNTMtLjE5LjE1LS40Mi4yNi0uNzEuMzUtLjI5LjA4LS42My4xMy0xLjAxLjEzLS40MyAwLS44My0uMDQtMS4xOC0uMTNzLS42Ni0uMjMtLjkxLS40MmMtLjI1LS4xOS0uNDUtLjQ0LS41OS0uNzUtLjE0LS4zMS0uMjUtLjc2LS4yNS0xLjIxSDYuNGMwIC41NS4wOCAxLjEzLjI0IDEuNTguMTYuNDUuMzcuODUuNjUgMS4yMS4yOC4zNS42LjY2Ljk4LjkyLjM3LjI2Ljc4LjQ4IDEuMjIuNjUuNDQuMTcuOS4zIDEuMzguMzkuNDguMDguOTYuMTMgMS40NC4xMy44IDAgMS41My0uMDkgMi4xOC0uMjhzMS4yMS0uNDUgMS42Ny0uNzljLjQ2LS4zNC44Mi0uNzcgMS4wNy0xLjI3cy4zOC0xLjA3LjM4LTEuNzFjMC0uNi0uMS0xLjE0LS4zMS0xLjYxLS4wNS0uMTEtLjExLS4yMy0uMTctLjMzSDIxeiIvPjwvc3ZnPg==)';
- strike.firstChild.style.backgroundPosition = '2px 2px';
- strike.firstChild.style.backgroundSize = '18px 18px';
-
- this.styleButtons([strike]);
- }
-
- var top = this.editorUi.toolbar.addButton('geSprite-top', mxResources.get('top'),
- callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_TOP])), stylePanel3);
- var middle = this.editorUi.toolbar.addButton('geSprite-middle', mxResources.get('middle'),
- callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_MIDDLE])), stylePanel3);
- var bottom = this.editorUi.toolbar.addButton('geSprite-bottom', mxResources.get('bottom'),
- callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_BOTTOM])), stylePanel3);
-
- this.styleButtons([top, middle, bottom]);
-
- if (mxClient.IS_QUIRKS)
- {
- mxUtils.br(container);
- }
-
- container.appendChild(stylePanel3);
-
- // Hack for updating UI state below based on current text selection
- // currentTable is the current selected DOM table updated below
- var sub, sup, full, tableWrapper, currentTable, tableCell, tableRow;
-
- if (graph.cellEditor.isContentEditing())
- {
- top.style.display = 'none';
- middle.style.display = 'none';
- bottom.style.display = 'none';
- verticalItem.style.display = 'none';
-
- full = this.editorUi.toolbar.addButton('geSprite-justifyfull', mxResources.get('block'),
- function()
- {
- if (full.style.opacity == 1)
- {
- document.execCommand('justifyfull', false, null);
- }
- }, stylePanel3);
- full.style.marginRight = '9px';
- full.style.opacity = 1;
-
- this.styleButtons([full,
- sub = this.editorUi.toolbar.addButton('geSprite-subscript',
- mxResources.get('subscript') + ' (' + Editor.ctrlKey + '+,)',
- function()
- {
- document.execCommand('subscript', false, null);
- }, stylePanel3), sup = this.editorUi.toolbar.addButton('geSprite-superscript',
- mxResources.get('superscript') + ' (' + Editor.ctrlKey + '+.)',
- function()
- {
- document.execCommand('superscript', false, null);
- }, stylePanel3)]);
- sub.style.marginLeft = '9px';
-
- var tmp = stylePanel3.cloneNode(false);
- tmp.style.paddingTop = '4px';
- var btns = [this.editorUi.toolbar.addButton('geSprite-orderedlist', mxResources.get('numberedList'),
- function()
- {
- document.execCommand('insertorderedlist', false, null);
- }, tmp),
- this.editorUi.toolbar.addButton('geSprite-unorderedlist', mxResources.get('bulletedList'),
- function()
- {
- document.execCommand('insertunorderedlist', false, null);
- }, tmp),
- this.editorUi.toolbar.addButton('geSprite-outdent', mxResources.get('decreaseIndent'),
- function()
- {
- document.execCommand('outdent', false, null);
- }, tmp),
- this.editorUi.toolbar.addButton('geSprite-indent', mxResources.get('increaseIndent'),
- function()
- {
- document.execCommand('indent', false, null);
- }, tmp),
- this.editorUi.toolbar.addButton('geSprite-removeformat', mxResources.get('removeFormat'),
- function()
- {
- document.execCommand('removeformat', false, null);
- }, tmp),
- this.editorUi.toolbar.addButton('geSprite-code', mxResources.get('html'),
- function()
- {
- graph.cellEditor.toggleViewMode();
- }, tmp)];
- this.styleButtons(btns);
- btns[btns.length - 2].style.marginLeft = '9px';
-
- if (mxClient.IS_QUIRKS)
- {
- mxUtils.br(container);
- tmp.style.height = '40';
- }
-
- container.appendChild(tmp);
- }
- else
- {
- fontStyleItems[2].style.marginRight = '9px';
- right.style.marginRight = '9px';
- }
-
- // Label position
- var stylePanel4 = stylePanel.cloneNode(false);
- stylePanel4.style.marginLeft = '0px';
- stylePanel4.style.paddingTop = '8px';
- stylePanel4.style.paddingBottom = '4px';
- stylePanel4.style.fontWeight = 'normal';
-
- mxUtils.write(stylePanel4, mxResources.get('position'));
-
- // Adds label position options
- var positionSelect = document.createElement('select');
- positionSelect.style.position = 'absolute';
- positionSelect.style.right = '20px';
- positionSelect.style.width = '97px';
- positionSelect.style.marginTop = '-2px';
-
- var directions = ['topLeft', 'top', 'topRight', 'left', 'center', 'right', 'bottomLeft', 'bottom', 'bottomRight'];
- var lset = {'topLeft': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_TOP, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_BOTTOM],
- 'top': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_TOP, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_BOTTOM],
- 'topRight': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_TOP, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM],
- 'left': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_MIDDLE],
- 'center': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_MIDDLE],
- 'right': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_MIDDLE],
- 'bottomLeft': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_TOP],
- 'bottom': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_TOP],
- 'bottomRight': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_TOP]};
-
- for (var i = 0; i < directions.length; i++)
- {
- var positionOption = document.createElement('option');
- positionOption.setAttribute('value', directions[i]);
- mxUtils.write(positionOption, mxResources.get(directions[i]));
- positionSelect.appendChild(positionOption);
- }
-
- stylePanel4.appendChild(positionSelect);
-
- // Writing direction
- var stylePanel5 = stylePanel.cloneNode(false);
- stylePanel5.style.marginLeft = '0px';
- stylePanel5.style.paddingTop = '4px';
- stylePanel5.style.paddingBottom = '4px';
- stylePanel5.style.fontWeight = 'normal';
-
- mxUtils.write(stylePanel5, mxResources.get('writingDirection'));
-
- // Adds writing direction options
- // LATER: Handle reselect of same option in all selects (change event
- // is not fired for same option so have opened state on click) and
- // handle multiple different styles for current selection
- var dirSelect = document.createElement('select');
- dirSelect.style.position = 'absolute';
- dirSelect.style.right = '20px';
- dirSelect.style.width = '97px';
- dirSelect.style.marginTop = '-2px';
-
- // NOTE: For automatic we use the value null since automatic
- // requires the text to be non formatted and non-wrapped
- var dirs = ['automatic', 'leftToRight', 'rightToLeft'];
- var dirSet = {'automatic': null,
- 'leftToRight': mxConstants.TEXT_DIRECTION_LTR,
- 'rightToLeft': mxConstants.TEXT_DIRECTION_RTL};
-
- for (var i = 0; i < dirs.length; i++)
- {
- var dirOption = document.createElement('option');
- dirOption.setAttribute('value', dirs[i]);
- mxUtils.write(dirOption, mxResources.get(dirs[i]));
- dirSelect.appendChild(dirOption);
- }
-
- stylePanel5.appendChild(dirSelect);
-
- if (!graph.isEditing())
- {
- container.appendChild(stylePanel4);
-
- mxEvent.addListener(positionSelect, 'change', function(evt)
- {
- graph.getModel().beginUpdate();
- try
- {
- var vals = lset[positionSelect.value];
-
- if (vals != null)
- {
- graph.setCellStyles(mxConstants.STYLE_LABEL_POSITION, vals[0], graph.getSelectionCells());
- graph.setCellStyles(mxConstants.STYLE_VERTICAL_LABEL_POSITION, vals[1], graph.getSelectionCells());
- graph.setCellStyles(mxConstants.STYLE_ALIGN, vals[2], graph.getSelectionCells());
- graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, vals[3], graph.getSelectionCells());
- }
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- mxEvent.consume(evt);
- });
-
- // LATER: Update dir in text editor while editing and update style with label
- // NOTE: The tricky part is handling and passing on the auto value
- container.appendChild(stylePanel5);
-
- mxEvent.addListener(dirSelect, 'change', function(evt)
- {
- graph.setCellStyles(mxConstants.STYLE_TEXT_DIRECTION, dirSet[dirSelect.value], graph.getSelectionCells());
- mxEvent.consume(evt);
- });
- }
-
- // Font size
- var input = document.createElement('input');
- input.style.textAlign = 'right';
- input.style.marginTop = '4px';
-
- if (!mxClient.IS_QUIRKS)
- {
- input.style.position = 'absolute';
- input.style.right = '32px';
- }
-
- input.style.width = '40px';
- input.style.height = (mxClient.IS_QUIRKS) ? '21px' : '17px';
- stylePanel2.appendChild(input);
-
- // Workaround for font size 4 if no text is selected is update font size below
- // after first character was entered (as the font element is lazy created)
- var pendingFontSize = null;
-
- var inputUpdate = this.installInputHandler(input, mxConstants.STYLE_FONTSIZE, Menus.prototype.defaultFontSize, 1, 999, ' pt',
- function(fontSize)
- {
- // IE does not support containsNode
- // KNOWN: Fixes font size issues but bypasses undo
- if (window.getSelection && !mxClient.IS_IE && !mxClient.IS_IE11)
- {
- var selection = window.getSelection();
- var container = (selection.rangeCount > 0) ? selection.getRangeAt(0).commonAncestorContainer :
- graph.cellEditor.textarea;
-
- function updateSize(elt, ignoreContains)
- {
- if (graph.cellEditor.textarea != null && elt != graph.cellEditor.textarea &&
- graph.cellEditor.textarea.contains(elt) &&
- (ignoreContains || selection.containsNode(elt, true)))
- {
- if (elt.nodeName == 'FONT')
- {
- elt.removeAttribute('size');
- elt.style.fontSize = fontSize + 'px';
- }
- else
- {
- var css = mxUtils.getCurrentStyle(elt);
-
- if (css.fontSize != fontSize + 'px')
- {
- if (mxUtils.getCurrentStyle(elt.parentNode).fontSize != fontSize + 'px')
- {
- elt.style.fontSize = fontSize + 'px';
- }
- else
- {
- elt.style.fontSize = '';
- }
- }
- }
- }
- };
-
- // Wraps text node or mixed selection with leading text in a font element
- if (container == graph.cellEditor.textarea ||
- container.nodeType != mxConstants.NODETYPE_ELEMENT)
- {
- document.execCommand('fontSize', false, '1');
- }
-
- if (container != graph.cellEditor.textarea)
- {
- container = container.parentNode;
- }
-
- if (container != null && container.nodeType == mxConstants.NODETYPE_ELEMENT)
- {
- var elts = container.getElementsByTagName('*');
- updateSize(container);
-
- for (var i = 0; i < elts.length; i++)
- {
- updateSize(elts[i]);
- }
- }
-
- input.value = fontSize + ' pt';
- }
- else if (window.getSelection || document.selection)
- {
- // Checks selection
- var par = null;
-
- if (document.selection)
- {
- par = document.selection.createRange().parentElement();
- }
- else
- {
- var selection = window.getSelection();
-
- if (selection.rangeCount > 0)
- {
- par = selection.getRangeAt(0).commonAncestorContainer;
- }
- }
-
- // Node.contains does not work for text nodes in IE11
- function isOrContains(container, node)
- {
- while (node != null)
- {
- if (node === container)
- {
- return true;
- }
-
- node = node.parentNode;
- }
-
- return false;
- };
-
- if (par != null && isOrContains(graph.cellEditor.textarea, par))
- {
- pendingFontSize = fontSize;
-
- // Workaround for can't set font size in px is to change font size afterwards
- document.execCommand('fontSize', false, '4');
- var elts = graph.cellEditor.textarea.getElementsByTagName('font');
-
- for (var i = 0; i < elts.length; i++)
- {
- if (elts[i].getAttribute('size') == '4')
- {
- elts[i].removeAttribute('size');
- elts[i].style.fontSize = pendingFontSize + 'px';
-
- // Overrides fontSize in input with the one just assigned as a workaround
- // for potential fontSize values of parent elements that don't match
- window.setTimeout(function()
- {
- input.value = pendingFontSize + ' pt';
- pendingFontSize = null;
- }, 0);
-
- break;
- }
- }
- }
- }
- }, true);
-
- var stepper = this.createStepper(input, inputUpdate, 1, 10, true, Menus.prototype.defaultFontSize);
- stepper.style.display = input.style.display;
- stepper.style.marginTop = '4px';
-
- if (!mxClient.IS_QUIRKS)
- {
- stepper.style.right = '20px';
- }
-
- stylePanel2.appendChild(stepper);
-
- var arrow = fontMenu.getElementsByTagName('div')[0];
- arrow.style.cssFloat = 'right';
-
- var bgColorApply = null;
- var currentBgColor = '#ffffff';
-
- var fontColorApply = null;
- var currentFontColor = '#000000';
-
- var bgPanel = (graph.cellEditor.isContentEditing()) ? this.createColorOption(mxResources.get('backgroundColor'), function()
- {
- return currentBgColor;
- }, function(color)
- {
- document.execCommand('backcolor', false, (color != mxConstants.NONE) ? color : 'transparent');
- }, '#ffffff',
- {
- install: function(apply) { bgColorApply = apply; },
- destroy: function() { bgColorApply = null; }
- }, null, true) : this.createCellColorOption(mxResources.get('backgroundColor'), mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, '#ffffff', null, function(color)
- {
- graph.updateLabelElements(graph.getSelectionCells(), function(elt)
- {
- elt.style.backgroundColor = null;
- });
- });
- bgPanel.style.fontWeight = 'bold';
-
- var borderPanel = this.createCellColorOption(mxResources.get('borderColor'), mxConstants.STYLE_LABEL_BORDERCOLOR, '#000000');
- borderPanel.style.fontWeight = 'bold';
-
- var defs = (ss.vertices.length >= 1) ? graph.stylesheet.getDefaultVertexStyle() : graph.stylesheet.getDefaultEdgeStyle();
- var panel = (graph.cellEditor.isContentEditing()) ? this.createColorOption(mxResources.get('fontColor'), function()
- {
- return currentFontColor;
- }, function(color)
- {
- if (mxClient.IS_FF)
- {
- // Workaround for Firefox that adds the font element around
- // anchor elements which ignore inherited colors is to move
- // the font element inside anchor elements
- var tmp = graph.cellEditor.textarea.getElementsByTagName('font');
- var oldFonts = [];
-
- for (var i = 0; i < tmp.length; i++)
- {
- oldFonts.push(
- {
- node: tmp[i],
- color: tmp[i].getAttribute('color')
- });
- }
-
- document.execCommand('forecolor', false, (color != mxConstants.NONE) ?
- color : 'transparent');
-
- // Finds the new or changed font element
- var newFonts = graph.cellEditor.textarea.getElementsByTagName('font');
-
- for (var i = 0; i < newFonts.length; i++)
- {
- if (i >= oldFonts.length || newFonts[i] != oldFonts[i].node ||
- (newFonts[i] == oldFonts[i].node &&
- newFonts[i].getAttribute('color') != oldFonts[i].color))
- {
- var child = newFonts[i].firstChild;
-
- // Moves the font element to inside the anchor element and adopts all children
- if (child != null && child.nodeName == 'A' && child.nextSibling ==
- null &&
- child.firstChild != null)
- {
- var parent = newFonts[i].parentNode;
- parent.insertBefore(child, newFonts[i]);
- var tmp = child.firstChild;
-
- while (tmp != null)
- {
- var next = tmp.nextSibling;
- newFonts[i].appendChild(tmp);
- tmp = next;
- }
-
- child.appendChild(newFonts[i]);
- }
-
- break;
- }
- }
- }
- else
- {
- document.execCommand('forecolor', false, (color != mxConstants.NONE) ?
- color : 'transparent');
- }
- }, (defs[mxConstants.STYLE_FONTCOLOR] != null) ? defs[mxConstants.STYLE_FONTCOLOR] : '#000000',
- {
- install: function(apply) { fontColorApply = apply; },
- destroy: function() { fontColorApply = null; }
- }, null, true) : this.createCellColorOption(mxResources.get('fontColor'), mxConstants.STYLE_FONTCOLOR,
- (defs[mxConstants.STYLE_FONTCOLOR] != null) ? defs[mxConstants.STYLE_FONTCOLOR] : '#000000', function(color)
- {
- if (color == mxConstants.NONE)
- {
- bgPanel.style.display = 'none';
- }
- else
- {
- bgPanel.style.display = '';
- }
-
- borderPanel.style.display = bgPanel.style.display;
- }, function(color)
- {
- if (color == mxConstants.NONE)
- {
- graph.setCellStyles(mxConstants.STYLE_NOLABEL, '1', graph.getSelectionCells());
- }
- else
- {
- graph.setCellStyles(mxConstants.STYLE_NOLABEL, null, graph.getSelectionCells());
- }
-
- graph.updateCellStyles(mxConstants.STYLE_FONTCOLOR, color, graph.getSelectionCells());
-
- graph.updateLabelElements(graph.getSelectionCells(), function(elt)
- {
- elt.removeAttribute('color');
- elt.style.color = null;
- });
- });
- panel.style.fontWeight = 'bold';
-
- colorPanel.appendChild(panel);
- colorPanel.appendChild(bgPanel);
-
- if (!graph.cellEditor.isContentEditing())
- {
- colorPanel.appendChild(borderPanel);
- }
-
- container.appendChild(colorPanel);
-
- var extraPanel = this.createPanel();
- extraPanel.style.paddingTop = '2px';
- extraPanel.style.paddingBottom = '4px';
-
- // LATER: Fix toggle using '' instead of 'null'
- var wwOpt = this.createCellOption(mxResources.get('wordWrap'), mxConstants.STYLE_WHITE_SPACE, null, 'wrap', 'null', null, null, true);
- wwOpt.style.fontWeight = 'bold';
-
- // Word wrap in edge labels only supported via labelWidth style
- if (!ss.containsLabel && !ss.autoSize && ss.edges.length == 0)
- {
- extraPanel.appendChild(wwOpt);
- }
-
- // Delegates switch of style to formattedText action as it also convertes newlines
- var htmlOpt = this.createCellOption(mxResources.get('formattedText'), 'html', '0',
- null, null, null, ui.actions.get('formattedText'));
- htmlOpt.style.fontWeight = 'bold';
- extraPanel.appendChild(htmlOpt);
-
- var spacingPanel = this.createPanel();
- spacingPanel.style.paddingTop = '10px';
- spacingPanel.style.paddingBottom = '28px';
- spacingPanel.style.fontWeight = 'normal';
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.width = '70px';
- span.style.marginTop = '0px';
- span.style.fontWeight = 'bold';
- mxUtils.write(span, mxResources.get('spacing'));
- spacingPanel.appendChild(span);
-
- var topUpdate, globalUpdate, leftUpdate, bottomUpdate, rightUpdate;
- var topSpacing = this.addUnitInput(spacingPanel, 'pt', 91, 44, function()
- {
- topUpdate.apply(this, arguments);
- });
- var globalSpacing = this.addUnitInput(spacingPanel, 'pt', 20, 44, function()
- {
- globalUpdate.apply(this, arguments);
- });
-
- mxUtils.br(spacingPanel);
- this.addLabel(spacingPanel, mxResources.get('top'), 91);
- this.addLabel(spacingPanel, mxResources.get('global'), 20);
- mxUtils.br(spacingPanel);
- mxUtils.br(spacingPanel);
-
- var leftSpacing = this.addUnitInput(spacingPanel, 'pt', 162, 44, function()
- {
- leftUpdate.apply(this, arguments);
- });
- var bottomSpacing = this.addUnitInput(spacingPanel, 'pt', 91, 44, function()
- {
- bottomUpdate.apply(this, arguments);
- });
- var rightSpacing = this.addUnitInput(spacingPanel, 'pt', 20, 44, function()
- {
- rightUpdate.apply(this, arguments);
- });
-
- mxUtils.br(spacingPanel);
- this.addLabel(spacingPanel, mxResources.get('left'), 162);
- this.addLabel(spacingPanel, mxResources.get('bottom'), 91);
- this.addLabel(spacingPanel, mxResources.get('right'), 20);
-
- if (!graph.cellEditor.isContentEditing())
- {
- container.appendChild(extraPanel);
- container.appendChild(this.createRelativeOption(mxResources.get('opacity'), mxConstants.STYLE_TEXT_OPACITY));
- container.appendChild(spacingPanel);
- }
- else
- {
- var selState = null;
- var lineHeightInput = null;
-
- container.appendChild(this.createRelativeOption(mxResources.get('lineheight'), null, null, function(input)
- {
- var value = (input.value == '') ? 120 : parseInt(input.value);
- value = Math.max(0, (isNaN(value)) ? 120 : value);
-
- if (selState != null)
- {
- graph.cellEditor.restoreSelection(selState);
- selState = null;
- }
-
- var selectedElement = graph.getSelectedElement();
- var node = selectedElement;
-
- while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT)
- {
- node = node.parentNode;
- }
-
- if (node != null && node == graph.cellEditor.textarea && graph.cellEditor.textarea.firstChild != null)
- {
- if (graph.cellEditor.textarea.firstChild.nodeName != 'P')
- {
- graph.cellEditor.textarea.innerHTML = '<p>' + graph.cellEditor.textarea.innerHTML + '</p>';
- }
-
- node = graph.cellEditor.textarea.firstChild;
- }
-
- if (node != null && graph.cellEditor.textarea != null && node != graph.cellEditor.textarea &&
- graph.cellEditor.textarea.contains(node))
- {
- node.style.lineHeight = value + '%';
- }
-
- input.value = value + ' %';
- }, function(input)
- {
- // Used in CSS handler to update current value
- lineHeightInput = input;
-
- // KNOWN: Arrow up/down clear selection text in quirks/IE 8
- // Text size via arrow button limits to 16 in IE11. Why?
- mxEvent.addListener(input, 'mousedown', function()
- {
- if (document.activeElement == graph.cellEditor.textarea)
- {
- selState = graph.cellEditor.saveSelection();
- }
- });
-
- mxEvent.addListener(input, 'touchstart', function()
- {
- if (document.activeElement == graph.cellEditor.textarea)
- {
- selState = graph.cellEditor.saveSelection();
- }
- });
-
- input.value = '120 %';
- }));
-
- var insertPanel = stylePanel.cloneNode(false);
- insertPanel.style.paddingLeft = '0px';
- var insertBtns = this.editorUi.toolbar.addItems(['link', 'image'], insertPanel, true);
-
- var btns = [
- this.editorUi.toolbar.addButton('geSprite-horizontalrule', mxResources.get('insertHorizontalRule'),
- function()
- {
- document.execCommand('inserthorizontalrule', false);
- }, insertPanel),
- this.editorUi.toolbar.addMenuFunctionInContainer(insertPanel, 'geSprite-table', mxResources.get('table'), false, mxUtils.bind(this, function(menu)
- {
- this.editorUi.menus.addInsertTableItem(menu);
- }))];
- this.styleButtons(insertBtns);
- this.styleButtons(btns);
-
- var wrapper2 = this.createPanel();
- wrapper2.style.paddingTop = '10px';
- wrapper2.style.paddingBottom = '10px';
- wrapper2.appendChild(this.createTitle(mxResources.get('insert')));
- wrapper2.appendChild(insertPanel);
- container.appendChild(wrapper2);
-
- if (mxClient.IS_QUIRKS)
- {
- wrapper2.style.height = '70';
- }
-
- var tablePanel = stylePanel.cloneNode(false);
- tablePanel.style.paddingLeft = '0px';
-
- var btns = [
- this.editorUi.toolbar.addButton('geSprite-insertcolumnbefore', mxResources.get('insertColumnBefore'),
- mxUtils.bind(this, function()
- {
- try
- {
- if (currentTable != null)
- {
- graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex : 0);
- }
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), tablePanel),
- this.editorUi.toolbar.addButton('geSprite-insertcolumnafter', mxResources.get('insertColumnAfter'),
- mxUtils.bind(this, function()
- {
- try
- {
- if (currentTable != null)
- {
- graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex + 1 : -1);
- }
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), tablePanel),
- this.editorUi.toolbar.addButton('geSprite-deletecolumn', mxResources.get('deleteColumn'),
- mxUtils.bind(this, function()
- {
- try
- {
- if (currentTable != null && tableCell != null)
- {
- graph.deleteColumn(currentTable, tableCell.cellIndex);
- }
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), tablePanel),
- this.editorUi.toolbar.addButton('geSprite-insertrowbefore', mxResources.get('insertRowBefore'),
- mxUtils.bind(this, function()
- {
- try
- {
- if (currentTable != null && tableRow != null)
- {
- graph.insertRow(currentTable, tableRow.sectionRowIndex);
- }
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), tablePanel),
- this.editorUi.toolbar.addButton('geSprite-insertrowafter', mxResources.get('insertRowAfter'),
- mxUtils.bind(this, function()
- {
- try
- {
- if (currentTable != null && tableRow != null)
- {
- graph.insertRow(currentTable, tableRow.sectionRowIndex + 1);
- }
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), tablePanel),
- this.editorUi.toolbar.addButton('geSprite-deleterow', mxResources.get('deleteRow'),
- mxUtils.bind(this, function()
- {
- try
- {
- if (currentTable != null && tableRow != null)
- {
- graph.deleteRow(currentTable, tableRow.sectionRowIndex);
- }
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), tablePanel)];
- this.styleButtons(btns);
- btns[2].style.marginRight = '9px';
-
- var wrapper3 = this.createPanel();
- wrapper3.style.paddingTop = '10px';
- wrapper3.style.paddingBottom = '10px';
- wrapper3.appendChild(this.createTitle(mxResources.get('table')));
- wrapper3.appendChild(tablePanel);
-
- if (mxClient.IS_QUIRKS)
- {
- mxUtils.br(container);
- wrapper3.style.height = '70';
- }
-
- var tablePanel2 = stylePanel.cloneNode(false);
- tablePanel2.style.paddingLeft = '0px';
-
- var btns = [
- this.editorUi.toolbar.addButton('geSprite-strokecolor', mxResources.get('borderColor'),
- mxUtils.bind(this, function(evt)
- {
- if (currentTable != null)
- {
- // Converts rgb(r,g,b) values
- var color = currentTable.style.borderColor.replace(
- /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,
- function($0, $1, $2, $3) {
- return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2);
- });
- this.editorUi.pickColor(color, function(newColor)
- {
- var targetElt = (tableCell != null && (evt == null || !mxEvent.isShiftDown(evt))) ? tableCell : currentTable;
-
- graph.processElements(targetElt, function(elt)
- {
- elt.style.border = null;
- });
-
- if (newColor == null || newColor == mxConstants.NONE)
- {
- targetElt.removeAttribute('border');
- targetElt.style.border = '';
- targetElt.style.borderCollapse = '';
- }
- else
- {
- targetElt.setAttribute('border', '1');
- targetElt.style.border = '1px solid ' + newColor;
- targetElt.style.borderCollapse = 'collapse';
- }
- });
- }
- }), tablePanel2),
- this.editorUi.toolbar.addButton('geSprite-fillcolor', mxResources.get('backgroundColor'),
- mxUtils.bind(this, function(evt)
- {
- // Converts rgb(r,g,b) values
- if (currentTable != null)
- {
- var color = currentTable.style.backgroundColor.replace(
- /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,
- function($0, $1, $2, $3) {
- return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2);
- });
- this.editorUi.pickColor(color, function(newColor)
- {
- var targetElt = (tableCell != null && (evt == null || !mxEvent.isShiftDown(evt))) ? tableCell : currentTable;
-
- graph.processElements(targetElt, function(elt)
- {
- elt.style.backgroundColor = null;
- });
-
- if (newColor == null || newColor == mxConstants.NONE)
- {
- targetElt.style.backgroundColor = '';
- }
- else
- {
- targetElt.style.backgroundColor = newColor;
- }
- });
- }
- }), tablePanel2),
- this.editorUi.toolbar.addButton('geSprite-fit', mxResources.get('spacing'),
- function()
- {
- if (currentTable != null)
- {
- var value = currentTable.getAttribute('cellPadding') || 0;
-
- var dlg = new FilenameDialog(ui, value, mxResources.get('apply'), mxUtils.bind(this, function(newValue)
- {
- if (newValue != null && newValue.length > 0)
- {
- currentTable.setAttribute('cellPadding', newValue);
- }
- else
- {
- currentTable.removeAttribute('cellPadding');
- }
- }), mxResources.get('spacing'));
- ui.showDialog(dlg.container, 300, 80, true, true);
- dlg.init();
- }
- }, tablePanel2),
- this.editorUi.toolbar.addButton('geSprite-left', mxResources.get('left'),
- function()
- {
- if (currentTable != null)
- {
- currentTable.setAttribute('align', 'left');
- }
- }, tablePanel2),
- this.editorUi.toolbar.addButton('geSprite-center', mxResources.get('center'),
- function()
- {
- if (currentTable != null)
- {
- currentTable.setAttribute('align', 'center');
- }
- }, tablePanel2),
- this.editorUi.toolbar.addButton('geSprite-right', mxResources.get('right'),
- function()
- {
- if (currentTable != null)
- {
- currentTable.setAttribute('align', 'right');
- }
- }, tablePanel2)];
- this.styleButtons(btns);
- btns[2].style.marginRight = '9px';
-
- if (mxClient.IS_QUIRKS)
- {
- mxUtils.br(wrapper3);
- mxUtils.br(wrapper3);
- }
-
- wrapper3.appendChild(tablePanel2);
- container.appendChild(wrapper3);
-
- tableWrapper = wrapper3;
- }
-
- function setSelected(elt, selected)
- {
- if (mxClient.IS_IE && (mxClient.IS_QUIRKS || document.documentMode < 10))
- {
- elt.style.filter = (selected) ? 'progid:DXImageTransform.Microsoft.Gradient('+
- 'StartColorStr=\'#c5ecff\', EndColorStr=\'#87d4fb\', GradientType=0)' : '';
- }
- else
- {
- elt.style.backgroundImage = (selected) ? 'linear-gradient(#c5ecff 0px,#87d4fb 100%)' : '';
- }
- };
-
- var listener = mxUtils.bind(this, function(sender, evt, force)
- {
- ss = this.format.getSelectionState();
- var fontStyle = mxUtils.getValue(ss.style, mxConstants.STYLE_FONTSTYLE, 0);
- setSelected(fontStyleItems[0], (fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD);
- setSelected(fontStyleItems[1], (fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC);
- setSelected(fontStyleItems[2], (fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE);
- fontMenu.firstChild.nodeValue = mxUtils.getValue(ss.style, mxConstants.STYLE_FONTFAMILY, Menus.prototype.defaultFont);
-
- setSelected(verticalItem, mxUtils.getValue(ss.style, mxConstants.STYLE_HORIZONTAL, '1') == '0');
-
- if (force || document.activeElement != input)
- {
- var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_FONTSIZE, Menus.prototype.defaultFontSize));
- input.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- var align = mxUtils.getValue(ss.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER);
- setSelected(left, align == mxConstants.ALIGN_LEFT);
- setSelected(center, align == mxConstants.ALIGN_CENTER);
- setSelected(right, align == mxConstants.ALIGN_RIGHT);
-
- var valign = mxUtils.getValue(ss.style, mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE);
- setSelected(top, valign == mxConstants.ALIGN_TOP);
- setSelected(middle, valign == mxConstants.ALIGN_MIDDLE);
- setSelected(bottom, valign == mxConstants.ALIGN_BOTTOM);
-
- var pos = mxUtils.getValue(ss.style, mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER);
- var vpos = mxUtils.getValue(ss.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE);
-
- if (pos == mxConstants.ALIGN_LEFT && vpos == mxConstants.ALIGN_TOP)
- {
- positionSelect.value = 'topLeft';
- }
- else if (pos == mxConstants.ALIGN_CENTER && vpos == mxConstants.ALIGN_TOP)
- {
- positionSelect.value = 'top';
- }
- else if (pos == mxConstants.ALIGN_RIGHT && vpos == mxConstants.ALIGN_TOP)
- {
- positionSelect.value = 'topRight';
- }
- else if (pos == mxConstants.ALIGN_LEFT && vpos == mxConstants.ALIGN_BOTTOM)
- {
- positionSelect.value = 'bottomLeft';
- }
- else if (pos == mxConstants.ALIGN_CENTER && vpos == mxConstants.ALIGN_BOTTOM)
- {
- positionSelect.value = 'bottom';
- }
- else if (pos == mxConstants.ALIGN_RIGHT && vpos == mxConstants.ALIGN_BOTTOM)
- {
- positionSelect.value = 'bottomRight';
- }
- else if (pos == mxConstants.ALIGN_LEFT)
- {
- positionSelect.value = 'left';
- }
- else if (pos == mxConstants.ALIGN_RIGHT)
- {
- positionSelect.value = 'right';
- }
- else
- {
- positionSelect.value = 'center';
- }
-
- var dir = mxUtils.getValue(ss.style, mxConstants.STYLE_TEXT_DIRECTION, mxConstants.DEFAULT_TEXT_DIRECTION);
-
- if (dir == mxConstants.TEXT_DIRECTION_RTL)
- {
- dirSelect.value = 'rightToLeft';
- }
- else if (dir == mxConstants.TEXT_DIRECTION_LTR)
- {
- dirSelect.value = 'leftToRight';
- }
- else if (dir == mxConstants.TEXT_DIRECTION_AUTO)
- {
- dirSelect.value = 'automatic';
- }
-
- if (force || document.activeElement != globalSpacing)
- {
- var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING, 2));
- globalSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != topSpacing)
- {
- var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_TOP, 0));
- topSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != rightSpacing)
- {
- var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_RIGHT, 0));
- rightSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != bottomSpacing)
- {
- var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_BOTTOM, 0));
- bottomSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != leftSpacing)
- {
- var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_LEFT, 0));
- leftSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
- });
-
- globalUpdate = this.installInputHandler(globalSpacing, mxConstants.STYLE_SPACING, 2, -999, 999, ' pt');
- topUpdate = this.installInputHandler(topSpacing, mxConstants.STYLE_SPACING_TOP, 0, -999, 999, ' pt');
- rightUpdate = this.installInputHandler(rightSpacing, mxConstants.STYLE_SPACING_RIGHT, 0, -999, 999, ' pt');
- bottomUpdate = this.installInputHandler(bottomSpacing, mxConstants.STYLE_SPACING_BOTTOM, 0, -999, 999, ' pt');
- leftUpdate = this.installInputHandler(leftSpacing, mxConstants.STYLE_SPACING_LEFT, 0, -999, 999, ' pt');
-
- this.addKeyHandler(input, listener);
- this.addKeyHandler(globalSpacing, listener);
- this.addKeyHandler(topSpacing, listener);
- this.addKeyHandler(rightSpacing, listener);
- this.addKeyHandler(bottomSpacing, listener);
- this.addKeyHandler(leftSpacing, listener);
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
-
- if (graph.cellEditor.isContentEditing())
- {
- var updating = false;
-
- var updateCssHandler = function()
- {
- if (!updating)
- {
- updating = true;
-
- window.setTimeout(function()
- {
- var node = graph.getSelectedEditingElement();
-
- if (node != null)
- {
- function getRelativeLineHeight(fontSize, css, elt)
- {
- if (elt.style != null && css != null)
- {
- var lineHeight = css.lineHeight
-
- if (elt.style.lineHeight != null && elt.style.lineHeight.substring(elt.style.lineHeight.length - 1) == '%')
- {
- return parseInt(elt.style.lineHeight) / 100;
- }
- else
- {
- return (lineHeight.substring(lineHeight.length - 2) == 'px') ?
- parseFloat(lineHeight) / fontSize : parseInt(lineHeight);
- }
- }
- else
- {
- return '';
- }
- };
-
- function getAbsoluteFontSize(css)
- {
- var fontSize = (css != null) ? css.fontSize : null;
-
- if (fontSize != null && fontSize.substring(fontSize.length - 2) == 'px')
- {
- return parseFloat(fontSize);
- }
- else
- {
- return mxConstants.DEFAULT_FONTSIZE;
- }
- };
-
- var css = mxUtils.getCurrentStyle(node);
- var fontSize = getAbsoluteFontSize(css);
- var lineHeight = getRelativeLineHeight(fontSize, css, node);
-
- // Finds common font size
- var elts = node.getElementsByTagName('*');
-
- // IE does not support containsNode
- if (elts.length > 0 && window.getSelection && !mxClient.IS_IE && !mxClient.IS_IE11)
- {
- var selection = window.getSelection();
-
- for (var i = 0; i < elts.length; i++)
- {
- if (selection.containsNode(elts[i], true))
- {
- temp = mxUtils.getCurrentStyle(elts[i]);
- fontSize = Math.max(getAbsoluteFontSize(temp), fontSize);
- var lh = getRelativeLineHeight(fontSize, temp, elts[i]);
-
- if (lh != lineHeight || isNaN(lh))
- {
- lineHeight = '';
- }
- }
- }
- }
-
- function hasParentOrOnlyChild(name)
- {
- if (graph.getParentByName(node, name, graph.cellEditor.textarea) != null)
- {
- return true;
- }
- else
- {
- var child = node;
-
- while (child != null && child.childNodes.length == 1)
- {
- child = child.childNodes[0];
-
- if (child.nodeName == name)
- {
- return true;
- }
- }
- }
-
- return false;
- };
-
- function isEqualOrPrefixed(str, value)
- {
- if (str != null && value != null)
- {
- if (str == value)
- {
- return true;
- }
- else if (str.length > value.length + 1)
- {
- return str.substring(str.length - value.length - 1, str.length) == '-' + value;
- }
- }
-
- return false;
- };
-
- if (css != null)
- {
- setSelected(fontStyleItems[0], css.fontWeight == 'bold' ||
- css.fontWeight > 400 || hasParentOrOnlyChild('B') ||
- hasParentOrOnlyChild('STRONG'));
- setSelected(fontStyleItems[1], css.fontStyle == 'italic' ||
- hasParentOrOnlyChild('I') || hasParentOrOnlyChild('EM'));
- setSelected(fontStyleItems[2], hasParentOrOnlyChild('U'));
- setSelected(sup, hasParentOrOnlyChild('SUP'));
- setSelected(sub, hasParentOrOnlyChild('SUB'));
-
- if (!graph.cellEditor.isTableSelected())
- {
- var align = graph.cellEditor.align || mxUtils.getValue(ss.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER);
-
- if (isEqualOrPrefixed(css.textAlign, 'justify'))
- {
- setSelected(full, isEqualOrPrefixed(css.textAlign, 'justify'));
- setSelected(left, false);
- setSelected(center, false);
- setSelected(right, false);
- }
- else
- {
- setSelected(full, false);
- setSelected(left, align == mxConstants.ALIGN_LEFT);
- setSelected(center, align == mxConstants.ALIGN_CENTER);
- setSelected(right, align == mxConstants.ALIGN_RIGHT);
- }
- }
- else
- {
- setSelected(full, isEqualOrPrefixed(css.textAlign, 'justify'));
- setSelected(left, isEqualOrPrefixed(css.textAlign, 'left'));
- setSelected(center, isEqualOrPrefixed(css.textAlign, 'center'));
- setSelected(right, isEqualOrPrefixed(css.textAlign, 'right'));
- }
-
- currentTable = graph.getParentByName(node, 'TABLE', graph.cellEditor.textarea);
- tableRow = (currentTable == null) ? null : graph.getParentByName(node, 'TR', currentTable);
- tableCell = (currentTable == null) ? null : graph.getParentByNames(node, ['TD', 'TH'], currentTable);
- tableWrapper.style.display = (currentTable != null) ? '' : 'none';
-
- if (document.activeElement != input)
- {
- if (node.nodeName == 'FONT' && node.getAttribute('size') == '4' &&
- pendingFontSize != null)
- {
- node.removeAttribute('size');
- node.style.fontSize = pendingFontSize + ' pt';
- pendingFontSize = null;
- }
- else
- {
- input.value = (isNaN(fontSize)) ? '' : fontSize + ' pt';
- }
-
- var lh = parseFloat(lineHeight);
-
- if (!isNaN(lh))
- {
- lineHeightInput.value = Math.round(lh * 100) + ' %';
- }
- else
- {
- lineHeightInput.value = '100 %';
- }
- }
-
- // Converts rgb(r,g,b) values
- var color = css.color.replace(
- /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,
- function($0, $1, $2, $3) {
- return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2);
- });
- var color2 = css.backgroundColor.replace(
- /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,
- function($0, $1, $2, $3) {
- return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2);
- });
-
- // Updates the color picker for the current font
- if (fontColorApply != null)
- {
- if (color.charAt(0) == '#')
- {
- currentFontColor = color;
- }
- else
- {
- currentFontColor = '#000000';
- }
-
- fontColorApply(currentFontColor, true);
- }
-
- if (bgColorApply != null)
- {
- if (color2.charAt(0) == '#')
- {
- currentBgColor = color2;
- }
- else
- {
- currentBgColor = null;
- }
-
- bgColorApply(currentBgColor, true);
- }
-
- // Workaround for firstChild is null or not an object
- // in the log which seems to be IE8- only / 29.01.15
- if (fontMenu.firstChild != null)
- {
- fontMenu.firstChild.nodeValue = Graph.stripQuotes(css.fontFamily);
- }
- }
- }
-
- updating = false;
- }, 0);
- }
- };
-
- if (mxClient.IS_FF || mxClient.IS_EDGE || mxClient.IS_IE || mxClient.IS_IE11)
- {
- mxEvent.addListener(graph.cellEditor.textarea, 'DOMSubtreeModified', updateCssHandler);
- }
-
- mxEvent.addListener(graph.cellEditor.textarea, 'input', updateCssHandler);
- mxEvent.addListener(graph.cellEditor.textarea, 'touchend', updateCssHandler);
- mxEvent.addListener(graph.cellEditor.textarea, 'mouseup', updateCssHandler);
- mxEvent.addListener(graph.cellEditor.textarea, 'keyup', updateCssHandler);
- this.listeners.push({destroy: function()
- {
- // No need to remove listener since textarea is destroyed after edit
- }});
- updateCssHandler();
- }
-
- return container;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel = function(format, editorUi, container)
-{
- BaseFormatPanel.call(this, format, editorUi, container);
- this.init();
-};
-
-mxUtils.extend(StyleFormatPanel, BaseFormatPanel);
-
-/**
- *
- */
-StyleFormatPanel.prototype.defaultStrokeColor = 'black';
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.init = function()
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- var ss = this.format.getSelectionState();
-
- if (!ss.containsLabel)
- {
- if (ss.containsImage && ss.vertices.length == 1 && ss.style.shape == 'image' &&
- ss.style.image != null && ss.style.image.substring(0, 19) == 'data:image/svg+xml;')
- {
- this.container.appendChild(this.addSvgStyles(this.createPanel()));
- }
-
- if (!ss.containsImage || ss.style.shape == 'image')
- {
- this.container.appendChild(this.addFill(this.createPanel()));
- }
-
- this.container.appendChild(this.addStroke(this.createPanel()));
- this.container.appendChild(this.addLineJumps(this.createPanel()));
- var opacityPanel = this.createRelativeOption(mxResources.get('opacity'), mxConstants.STYLE_OPACITY, 41);
- opacityPanel.style.paddingTop = '8px';
- opacityPanel.style.paddingBottom = '8px';
- this.container.appendChild(opacityPanel);
- this.container.appendChild(this.addEffects(this.createPanel()));
- }
-
- var opsPanel = this.addEditOps(this.createPanel());
-
- if (opsPanel.firstChild != null)
- {
- mxUtils.br(opsPanel);
- }
-
- this.container.appendChild(this.addStyleOps(opsPanel));
-};
-
-/**
- * Use browser for parsing CSS.
- */
-StyleFormatPanel.prototype.getCssRules = function(css)
-{
- var doc = document.implementation.createHTMLDocument('');
- var styleElement = document.createElement('style');
-
- mxUtils.setTextContent(styleElement, css);
- doc.body.appendChild(styleElement);
-
- return styleElement.sheet.cssRules;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.addSvgStyles = function(container)
-{
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var ss = this.format.getSelectionState();
- container.style.paddingTop = '6px';
- container.style.paddingBottom = '6px';
- container.style.fontWeight = 'bold';
- container.style.display = 'none';
-
- try
- {
- var exp = ss.style.editableCssRules;
-
- if (exp != null)
- {
- var regex = new RegExp(exp);
-
- var data = ss.style.image.substring(ss.style.image.indexOf(',') + 1);
- var xml = (window.atob) ? atob(data) : Base64.decode(data, true);
- var svg = mxUtils.parseXml(xml);
-
- if (svg != null)
- {
- var styles = svg.getElementsByTagName('style');
-
- for (var i = 0; i < styles.length; i++)
- {
- var rules = this.getCssRules(mxUtils.getTextContent(styles[i]));
-
- for (var j = 0; j < rules.length; j++)
- {
- this.addSvgRule(container, rules[j], svg, styles[i], rules, j, regex);
- }
- }
- }
- }
- }
- catch (e)
- {
- // ignore
- }
-
- return container;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.addSvgRule = function(container, rule, svg, styleElem, rules, ruleIndex, regex)
-{
- var ui = this.editorUi;
- var graph = ui.editor.graph;
-
- if (regex.test(rule.selectorText))
- {
- function rgb2hex(rgb)
- {
- rgb = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i);
-
- return (rgb && rgb.length === 4) ? "#" +
- ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
- ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) +
- ("0" + parseInt(rgb[3],10).toString(16)).slice(-2) : '';
- };
-
- var addStyleRule = mxUtils.bind(this, function(rule, key, label)
- {
- var value = mxUtils.trim(rule.style[key]);
-
- if (value != '' && value.substring(0, 4) != 'url(')
- {
- var option = this.createColorOption(label + ' ' + rule.selectorText, function()
- {
- return rgb2hex(value);
- }, function(color)
- {
- rules[ruleIndex].style[key] = color;
- var cssTxt = '';
-
- for (var i = 0; i < rules.length; i++)
- {
- cssTxt += rules[i].cssText + ' ';
- }
-
- styleElem.textContent = cssTxt;
- var xml = mxUtils.getXml(svg.documentElement);
-
- graph.setCellStyles(mxConstants.STYLE_IMAGE, 'data:image/svg+xml,' +
- ((window.btoa) ? btoa(xml) : Base64.encode(xml, true)),
- graph.getSelectionCells());
- }, '#ffffff',
- {
- install: function(apply)
- {
- // ignore
- },
- destroy: function()
- {
- // ignore
- }
- });
-
- container.appendChild(option);
-
- // Shows container if rules are added
- container.style.display = '';
- }
- });
-
- addStyleRule(rule, 'fill', mxResources.get('fill'));
- addStyleRule(rule, 'stroke', mxResources.get('line'));
- addStyleRule(rule, 'stop-color', mxResources.get('gradient'));
- }
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.addEditOps = function(div)
-{
- var ss = this.format.getSelectionState();
- var btn = null;
-
- if (this.editorUi.editor.graph.getSelectionCount() == 1)
- {
- btn = mxUtils.button(mxResources.get('editStyle'), mxUtils.bind(this, function(evt)
- {
- this.editorUi.actions.get('editStyle').funct();
- }));
-
- btn.setAttribute('title', mxResources.get('editStyle') + ' (' + this.editorUi.actions.get('editStyle').shortcut + ')');
- btn.style.width = '202px';
- btn.style.marginBottom = '2px';
-
- div.appendChild(btn);
- }
-
- if (ss.image)
- {
- var btn2 = mxUtils.button(mxResources.get('editImage'), mxUtils.bind(this, function(evt)
- {
- this.editorUi.actions.get('image').funct();
- }));
-
- btn2.setAttribute('title', mxResources.get('editImage'));
- btn2.style.marginBottom = '2px';
-
- if (btn == null)
- {
- btn2.style.width = '202px';
- }
- else
- {
- btn.style.width = '100px';
- btn2.style.width = '100px';
- btn2.style.marginLeft = '2px';
- }
-
- div.appendChild(btn2);
- }
-
- return div;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.addFill = function(container)
-{
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var ss = this.format.getSelectionState();
- container.style.paddingTop = '6px';
- container.style.paddingBottom = '6px';
-
- // Adds gradient direction option
- var gradientSelect = document.createElement('select');
- gradientSelect.style.position = 'absolute';
- gradientSelect.style.marginTop = '-2px';
- gradientSelect.style.right = (mxClient.IS_QUIRKS) ? '52px' : '72px';
- gradientSelect.style.width = '70px';
-
- var fillStyleSelect = gradientSelect.cloneNode(false);
-
- // Stops events from bubbling to color option event handler
- mxEvent.addListener(gradientSelect, 'click', function(evt)
- {
- mxEvent.consume(evt);
- });
- mxEvent.addListener(fillStyleSelect, 'click', function(evt)
- {
- mxEvent.consume(evt);
- });
-
- var defs = (ss.vertices.length >= 1) ? graph.stylesheet.getDefaultVertexStyle() : graph.stylesheet.getDefaultEdgeStyle();
- var gradientPanel = this.createCellColorOption(mxResources.get('gradient'), mxConstants.STYLE_GRADIENTCOLOR,
- (defs[mxConstants.STYLE_GRADIENTCOLOR] != null) ? defs[mxConstants.STYLE_GRADIENTCOLOR] : '#ffffff', function(color)
- {
- if (color == null || color == mxConstants.NONE)
- {
- gradientSelect.style.display = 'none';
- }
- else
- {
- gradientSelect.style.display = '';
- }
- }, function(color)
- {
- graph.updateCellStyles(mxConstants.STYLE_GRADIENTCOLOR, color, graph.getSelectionCells());
- });
-
- var fillKey = (ss.style.shape == 'image') ? mxConstants.STYLE_IMAGE_BACKGROUND : mxConstants.STYLE_FILLCOLOR;
- var label = (ss.style.shape == 'image') ? mxResources.get('background') : mxResources.get('fill');
-
- var defs = (ss.vertices.length >= 1) ? graph.stylesheet.getDefaultVertexStyle() : graph.stylesheet.getDefaultEdgeStyle();
- var fillPanel = this.createCellColorOption(label, fillKey, (defs[fillKey] != null) ? defs[fillKey] : '#ffffff', null, mxUtils.bind(this, function(color)
- {
- graph.updateCellStyles(fillKey, color, graph.getSelectionCells());
- }));
- fillPanel.style.fontWeight = 'bold';
-
- var tmpColor = mxUtils.getValue(ss.style, fillKey, null);
- gradientPanel.style.display = (tmpColor != null && tmpColor != mxConstants.NONE &&
- ss.fill && ss.style.shape != 'image') ? '' : 'none';
-
- var directions = [mxConstants.DIRECTION_NORTH, mxConstants.DIRECTION_EAST,
- mxConstants.DIRECTION_SOUTH, mxConstants.DIRECTION_WEST];
-
- for (var i = 0; i < directions.length; i++)
- {
- var gradientOption = document.createElement('option');
- gradientOption.setAttribute('value', directions[i]);
- mxUtils.write(gradientOption, mxResources.get(directions[i]));
- gradientSelect.appendChild(gradientOption);
- }
-
- gradientPanel.appendChild(gradientSelect);
-
- for (var i = 0; i < Editor.roughFillStyles.length; i++)
- {
- var fillStyleOption = document.createElement('option');
- fillStyleOption.setAttribute('value', Editor.roughFillStyles[i].val);
- mxUtils.write(fillStyleOption, Editor.roughFillStyles[i].dispName);
- fillStyleSelect.appendChild(fillStyleOption);
- }
-
- fillPanel.appendChild(fillStyleSelect);
-
- var listener = mxUtils.bind(this, function()
- {
- ss = this.format.getSelectionState();
- var value = mxUtils.getValue(ss.style, mxConstants.STYLE_GRADIENT_DIRECTION, mxConstants.DIRECTION_SOUTH);
- var fillStyle = mxUtils.getValue(ss.style, 'fillStyle', 'auto');
-
- // Handles empty string which is not allowed as a value
- if (value == '')
- {
- value = mxConstants.DIRECTION_SOUTH;
- }
-
- gradientSelect.value = value;
- fillStyleSelect.value = fillStyle;
- container.style.display = (ss.fill) ? '' : 'none';
-
- var fillColor = mxUtils.getValue(ss.style, mxConstants.STYLE_FILLCOLOR, null);
-
- if (!ss.fill || ss.containsImage || fillColor == null || fillColor == mxConstants.NONE || ss.style.shape == 'filledEdge')
- {
- fillStyleSelect.style.display = 'none';
- gradientPanel.style.display = 'none';
- }
- else
- {
- fillStyleSelect.style.display = (ss.style.sketch == '1') ? '' : 'none';
- gradientPanel.style.display = (ss.style.sketch != '1' || fillStyle == 'solid' || fillStyle == 'auto') ? '' : 'none';
- }
- });
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
-
- mxEvent.addListener(gradientSelect, 'change', function(evt)
- {
- graph.setCellStyles(mxConstants.STYLE_GRADIENT_DIRECTION, gradientSelect.value, graph.getSelectionCells());
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(fillStyleSelect, 'change', function(evt)
- {
- graph.setCellStyles('fillStyle', fillStyleSelect.value, graph.getSelectionCells());
- mxEvent.consume(evt);
- });
-
- container.appendChild(fillPanel);
- container.appendChild(gradientPanel);
-
- // Adds custom colors
- var custom = this.getCustomColors();
-
- for (var i = 0; i < custom.length; i++)
- {
- container.appendChild(this.createCellColorOption(custom[i].title, custom[i].key, custom[i].defaultValue));
- }
-
- return container;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.getCustomColors = function()
-{
- var ss = this.format.getSelectionState();
- var result = [];
-
- if (ss.style.shape == 'swimlane' || ss.style.shape == 'table')
- {
- result.push({title: mxResources.get('laneColor'), key: 'swimlaneFillColor', defaultValue: '#ffffff'});
- }
-
- return result;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.addStroke = function(container)
-{
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var ss = this.format.getSelectionState();
-
- container.style.paddingTop = '4px';
- container.style.paddingBottom = '4px';
- container.style.whiteSpace = 'normal';
-
- var colorPanel = document.createElement('div');
- colorPanel.style.fontWeight = 'bold';
-
- if (!ss.stroke)
- {
- colorPanel.style.display = 'none';
- }
-
- // Adds gradient direction option
- var styleSelect = document.createElement('select');
- styleSelect.style.position = 'absolute';
- styleSelect.style.marginTop = '-2px';
- styleSelect.style.right = '72px';
- styleSelect.style.width = '80px';
-
- var styles = ['sharp', 'rounded', 'curved'];
-
- for (var i = 0; i < styles.length; i++)
- {
- var styleOption = document.createElement('option');
- styleOption.setAttribute('value', styles[i]);
- mxUtils.write(styleOption, mxResources.get(styles[i]));
- styleSelect.appendChild(styleOption);
- }
-
- mxEvent.addListener(styleSelect, 'change', function(evt)
- {
- graph.getModel().beginUpdate();
- try
- {
- var keys = [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED];
- // Default for rounded is 1
- var values = ['0', null];
-
- if (styleSelect.value == 'rounded')
- {
- values = ['1', null];
- }
- else if (styleSelect.value == 'curved')
- {
- values = [null, '1'];
- }
-
- for (var i = 0; i < keys.length; i++)
- {
- graph.setCellStyles(keys[i], values[i], graph.getSelectionCells());
- }
-
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', keys,
- 'values', values, 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- mxEvent.consume(evt);
- });
-
- // Stops events from bubbling to color option event handler
- mxEvent.addListener(styleSelect, 'click', function(evt)
- {
- mxEvent.consume(evt);
- });
-
- var strokeKey = (ss.style.shape == 'image') ? mxConstants.STYLE_IMAGE_BORDER : mxConstants.STYLE_STROKECOLOR;
- var label = (ss.style.shape == 'image') ? mxResources.get('border') : mxResources.get('line');
-
- var defs = (ss.vertices.length >= 1) ? graph.stylesheet.getDefaultVertexStyle() : graph.stylesheet.getDefaultEdgeStyle();
- var lineColor = this.createCellColorOption(label, strokeKey, (defs[strokeKey] != null) ? defs[strokeKey] : '#000000', null, mxUtils.bind(this, function(color)
- {
- graph.updateCellStyles(strokeKey, color, graph.getSelectionCells());
- }));
-
- lineColor.appendChild(styleSelect);
- colorPanel.appendChild(lineColor);
-
- // Used if only edges selected
- var stylePanel = colorPanel.cloneNode(false);
- stylePanel.style.fontWeight = 'normal';
- stylePanel.style.whiteSpace = 'nowrap';
- stylePanel.style.position = 'relative';
- stylePanel.style.paddingLeft = '16px'
- stylePanel.style.marginBottom = '2px';
- stylePanel.style.marginTop = '2px';
- stylePanel.className = 'geToolbarContainer';
-
- var addItem = mxUtils.bind(this, function(menu, width, cssName, keys, values)
- {
- var item = this.editorUi.menus.styleChange(menu, '', keys, values, 'geIcon', null);
-
- var pat = document.createElement('div');
- pat.style.width = width + 'px';
- pat.style.height = '1px';
- pat.style.borderBottom = '1px ' + cssName + ' ' + this.defaultStrokeColor;
- pat.style.paddingTop = '6px';
-
- item.firstChild.firstChild.style.padding = '0px 4px 0px 4px';
- item.firstChild.firstChild.style.width = width + 'px';
- item.firstChild.firstChild.appendChild(pat);
-
- return item;
- });
-
- var pattern = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel, 'geSprite-orthogonal', mxResources.get('pattern'), false, mxUtils.bind(this, function(menu)
- {
- addItem(menu, 75, 'solid', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], [null, null]).setAttribute('title', mxResources.get('solid'));
- addItem(menu, 75, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed'));
- addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)');
- addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)');
- addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)');
- }));
-
- // Used for mixed selection (vertices and edges)
- var altStylePanel = stylePanel.cloneNode(false);
-
- var edgeShape = this.editorUi.toolbar.addMenuFunctionInContainer(altStylePanel, 'geSprite-connection', mxResources.get('connection'), false, mxUtils.bind(this, function(menu)
- {
- this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], [null, null, null, null], 'geIcon geSprite geSprite-connection', null, true).setAttribute('title', mxResources.get('line'));
- this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['link', null, null, null], 'geIcon geSprite geSprite-linkedge', null, true).setAttribute('title', mxResources.get('link'));
- this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['flexArrow', null, null, null], 'geIcon geSprite geSprite-arrow', null, true).setAttribute('title', mxResources.get('arrow'));
- this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['arrow', null, null, null], 'geIcon geSprite geSprite-simplearrow', null, true).setAttribute('title', mxResources.get('simpleArrow'));
- }));
-
- var altPattern = this.editorUi.toolbar.addMenuFunctionInContainer(altStylePanel, 'geSprite-orthogonal', mxResources.get('pattern'), false, mxUtils.bind(this, function(menu)
- {
- addItem(menu, 33, 'solid', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], [null, null]).setAttribute('title', mxResources.get('solid'));
- addItem(menu, 33, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed'));
- addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)');
- addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)');
- addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)');
- }));
-
- var stylePanel2 = stylePanel.cloneNode(false);
-
- // Stroke width
- var input = document.createElement('input');
- input.style.textAlign = 'right';
- input.style.marginTop = '2px';
- input.style.width = '41px';
- input.setAttribute('title', mxResources.get('linewidth'));
-
- stylePanel.appendChild(input);
-
- var altInput = input.cloneNode(true);
- altStylePanel.appendChild(altInput);
-
- function update(evt)
- {
- // Maximum stroke width is 999
- var value = parseInt(input.value);
- value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value));
-
- if (value != mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1))
- {
- graph.setCellStyles(mxConstants.STYLE_STROKEWIDTH, value, graph.getSelectionCells());
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_STROKEWIDTH],
- 'values', [value], 'cells', graph.getSelectionCells()));
- }
-
- input.value = value + ' pt';
- mxEvent.consume(evt);
- };
-
- function altUpdate(evt)
- {
- // Maximum stroke width is 999
- var value = parseInt(altInput.value);
- value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value));
-
- if (value != mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1))
- {
- graph.setCellStyles(mxConstants.STYLE_STROKEWIDTH, value, graph.getSelectionCells());
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_STROKEWIDTH],
- 'values', [value], 'cells', graph.getSelectionCells()));
- }
-
- altInput.value = value + ' pt';
- mxEvent.consume(evt);
- };
-
- var stepper = this.createStepper(input, update, 1, 9);
- stepper.style.display = input.style.display;
- stepper.style.marginTop = '2px';
- stylePanel.appendChild(stepper);
-
- var altStepper = this.createStepper(altInput, altUpdate, 1, 9);
- altStepper.style.display = altInput.style.display;
- altStepper.style.marginTop = '2px';
- altStylePanel.appendChild(altStepper);
-
- if (!mxClient.IS_QUIRKS)
- {
- input.style.position = 'absolute';
- input.style.height = '15px';
- input.style.left = '141px';
- stepper.style.left = '190px';
-
- altInput.style.position = 'absolute';
- altInput.style.left = '141px';
- altInput.style.height = '15px';
- altStepper.style.left = '190px';
- }
- else
- {
- input.style.height = '17px';
- altInput.style.height = '17px';
- }
-
- mxEvent.addListener(input, 'blur', update);
- mxEvent.addListener(input, 'change', update);
-
- mxEvent.addListener(altInput, 'blur', altUpdate);
- mxEvent.addListener(altInput, 'change', altUpdate);
-
- if (mxClient.IS_QUIRKS)
- {
- mxUtils.br(stylePanel2);
- mxUtils.br(stylePanel2);
- }
-
- var edgeStyle = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-orthogonal', mxResources.get('waypoints'), false, mxUtils.bind(this, function(menu)
- {
- if (ss.style.shape != 'arrow')
- {
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], [null, null, null], 'geIcon geSprite geSprite-straight', null, true).setAttribute('title', mxResources.get('straight'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', null, null], 'geIcon geSprite geSprite-orthogonal', null, true).setAttribute('title', mxResources.get('orthogonal'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalelbow', null, true).setAttribute('title', mxResources.get('simple'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalelbow', null, true).setAttribute('title', mxResources.get('simple'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalisometric', null, true).setAttribute('title', mxResources.get('isometric'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalisometric', null, true).setAttribute('title', mxResources.get('isometric'));
-
- if (ss.style.shape == 'connector')
- {
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', '1', null], 'geIcon geSprite geSprite-curved', null, true).setAttribute('title', mxResources.get('curved'));
- }
-
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['entityRelationEdgeStyle', null, null], 'geIcon geSprite geSprite-entity', null, true).setAttribute('title', mxResources.get('entityRelation'));
- }
- }));
-
- var lineStart = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-startclassic', mxResources.get('linestart'), false, mxUtils.bind(this, function(menu)
- {
- if (ss.style.shape == 'connector' || ss.style.shape == 'flexArrow' || ss.style.shape == 'filledEdge')
- {
- var item = this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.NONE, 0], 'geIcon', null, false);
- item.setAttribute('title', mxResources.get('none'));
- item.firstChild.firstChild.innerHTML = '<font style="font-size:10px;">' + mxUtils.htmlEntities(mxResources.get('none')) + '</font>';
-
- if (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge')
- {
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-startclassic', null, false).setAttribute('title', mxResources.get('classic'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC_THIN, 1], 'geIcon geSprite geSprite-startclassicthin', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN, 0], 'geIcon geSprite geSprite-startopen', null, false).setAttribute('title', mxResources.get('openArrow'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN_THIN, 0], 'geIcon geSprite geSprite-startopenthin', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['openAsync', 0], 'geIcon geSprite geSprite-startopenasync', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-startblock', null, false).setAttribute('title', mxResources.get('block'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK_THIN, 1], 'geIcon geSprite geSprite-startblockthin', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['async', 1], 'geIcon geSprite geSprite-startasync', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-startoval', null, false).setAttribute('title', mxResources.get('oval'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-startdiamond', null, false).setAttribute('title', mxResources.get('diamond'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-startthindiamond', null, false).setAttribute('title', mxResources.get('diamondThin'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-startclassictrans', null, false).setAttribute('title', mxResources.get('classic'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC_THIN, 0], 'geIcon geSprite geSprite-startclassicthintrans', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-startblocktrans', null, false).setAttribute('title', mxResources.get('block'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK_THIN, 0], 'geIcon geSprite geSprite-startblockthintrans', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['async', 0], 'geIcon geSprite geSprite-startasynctrans', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-startovaltrans', null, false).setAttribute('title', mxResources.get('oval'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-startdiamondtrans', null, false).setAttribute('title', mxResources.get('diamond'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-startthindiamondtrans', null, false).setAttribute('title', mxResources.get('diamondThin'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['box', 0], 'geIcon geSprite geSvgSprite geSprite-box', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['halfCircle', 0], 'geIcon geSprite geSvgSprite geSprite-halfCircle', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['dash', 0], 'geIcon geSprite geSprite-startdash', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['cross', 0], 'geIcon geSprite geSprite-startcross', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['circlePlus', 0], 'geIcon geSprite geSprite-startcircleplus', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['circle', 1], 'geIcon geSprite geSprite-startcircle', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERone', 0], 'geIcon geSprite geSprite-starterone', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERmandOne', 0], 'geIcon geSprite geSprite-starteronetoone', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERmany', 0], 'geIcon geSprite geSprite-startermany', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERoneToMany', 0], 'geIcon geSprite geSprite-starteronetomany', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERzeroToOne', 1], 'geIcon geSprite geSprite-starteroneopt', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERzeroToMany', 1], 'geIcon geSprite geSprite-startermanyopt', null, false);
- }
- else
- {
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW], [mxConstants.ARROW_BLOCK], 'geIcon geSprite geSprite-startblocktrans', null, false).setAttribute('title', mxResources.get('block'));
- }
- }
- }));
-
- var lineEnd = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-endclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
- {
- if (ss.style.shape == 'connector' || ss.style.shape == 'flexArrow' || ss.style.shape == 'filledEdge')
- {
- var item = this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.NONE, 0], 'geIcon', null, false);
- item.setAttribute('title', mxResources.get('none'));
- item.firstChild.firstChild.innerHTML = '<font style="font-size:10px;">' + mxUtils.htmlEntities(mxResources.get('none')) + '</font>';
-
- if (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge')
- {
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-endclassic', null, false).setAttribute('title', mxResources.get('classic'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC_THIN, 1], 'geIcon geSprite geSprite-endclassicthin', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN, 0], 'geIcon geSprite geSprite-endopen', null, false).setAttribute('title', mxResources.get('openArrow'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN_THIN, 0], 'geIcon geSprite geSprite-endopenthin', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['openAsync', 0], 'geIcon geSprite geSprite-endopenasync', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-endblock', null, false).setAttribute('title', mxResources.get('block'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK_THIN, 1], 'geIcon geSprite geSprite-endblockthin', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['async', 1], 'geIcon geSprite geSprite-endasync', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-endoval', null, false).setAttribute('title', mxResources.get('oval'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-enddiamond', null, false).setAttribute('title', mxResources.get('diamond'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-endthindiamond', null, false).setAttribute('title', mxResources.get('diamondThin'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-endclassictrans', null, false).setAttribute('title', mxResources.get('classic'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC_THIN, 0], 'geIcon geSprite geSprite-endclassicthintrans', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-endblocktrans', null, false).setAttribute('title', mxResources.get('block'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK_THIN, 0], 'geIcon geSprite geSprite-endblockthintrans', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['async', 0], 'geIcon geSprite geSprite-endasynctrans', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-endovaltrans', null, false).setAttribute('title', mxResources.get('oval'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-enddiamondtrans', null, false).setAttribute('title', mxResources.get('diamond'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-endthindiamondtrans', null, false).setAttribute('title', mxResources.get('diamondThin'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['box', 0], 'geIcon geSprite geSvgSprite geFlipSprite geSprite-box', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['halfCircle', 0], 'geIcon geSprite geSvgSprite geFlipSprite geSprite-halfCircle', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['dash', 0], 'geIcon geSprite geSprite-enddash', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['cross', 0], 'geIcon geSprite geSprite-endcross', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['circlePlus', 0], 'geIcon geSprite geSprite-endcircleplus', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['circle', 1], 'geIcon geSprite geSprite-endcircle', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERone', 0], 'geIcon geSprite geSprite-enderone', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERmandOne', 0], 'geIcon geSprite geSprite-enderonetoone', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERmany', 0], 'geIcon geSprite geSprite-endermany', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERoneToMany', 0], 'geIcon geSprite geSprite-enderonetomany', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERzeroToOne', 1], 'geIcon geSprite geSprite-enderoneopt', null, false);
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERzeroToMany', 1], 'geIcon geSprite geSprite-endermanyopt', null, false);
- }
- else
- {
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW], [mxConstants.ARROW_BLOCK], 'geIcon geSprite geSprite-endblocktrans', null, false).setAttribute('title', mxResources.get('block'));
- }
- }
- }));
-
- this.addArrow(edgeShape, 8);
- this.addArrow(edgeStyle);
- this.addArrow(lineStart);
- this.addArrow(lineEnd);
-
- var symbol = this.addArrow(pattern, 9);
- symbol.className = 'geIcon';
- symbol.style.width = 'auto';
-
- var altSymbol = this.addArrow(altPattern, 9);
- altSymbol.className = 'geIcon';
- altSymbol.style.width = '22px';
-
- var solid = document.createElement('div');
- solid.style.width = '85px';
- solid.style.height = '1px';
- solid.style.borderBottom = '1px solid ' + this.defaultStrokeColor;
- solid.style.marginBottom = '9px';
- symbol.appendChild(solid);
-
- var altSolid = document.createElement('div');
- altSolid.style.width = '23px';
- altSolid.style.height = '1px';
- altSolid.style.borderBottom = '1px solid ' + this.defaultStrokeColor;
- altSolid.style.marginBottom = '9px';
- altSymbol.appendChild(altSolid);
-
- pattern.style.height = '15px';
- altPattern.style.height = '15px';
- edgeShape.style.height = '15px';
- edgeStyle.style.height = '17px';
- lineStart.style.marginLeft = '3px';
- lineStart.style.height = '17px';
- lineEnd.style.marginLeft = '3px';
- lineEnd.style.height = '17px';
-
- container.appendChild(colorPanel);
- container.appendChild(altStylePanel);
- container.appendChild(stylePanel);
-
- var arrowPanel = stylePanel.cloneNode(false);
- arrowPanel.style.paddingBottom = '6px';
- arrowPanel.style.paddingTop = '4px';
- arrowPanel.style.fontWeight = 'normal';
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.marginLeft = '3px';
- span.style.marginBottom = '12px';
- span.style.marginTop = '2px';
- span.style.fontWeight = 'normal';
- span.style.width = '76px';
-
- mxUtils.write(span, mxResources.get('lineend'));
- arrowPanel.appendChild(span);
-
- var endSpacingUpdate, endSizeUpdate;
- var endSpacing = this.addUnitInput(arrowPanel, 'pt', 74, 33, function()
- {
- endSpacingUpdate.apply(this, arguments);
- });
- var endSize = this.addUnitInput(arrowPanel, 'pt', 20, 33, function()
- {
- endSizeUpdate.apply(this, arguments);
- });
-
- mxUtils.br(arrowPanel);
-
- var spacer = document.createElement('div');
- spacer.style.height = '8px';
- arrowPanel.appendChild(spacer);
-
- span = span.cloneNode(false);
- mxUtils.write(span, mxResources.get('linestart'));
- arrowPanel.appendChild(span);
-
- var startSpacingUpdate, startSizeUpdate;
- var startSpacing = this.addUnitInput(arrowPanel, 'pt', 74, 33, function()
- {
- startSpacingUpdate.apply(this, arguments);
- });
- var startSize = this.addUnitInput(arrowPanel, 'pt', 20, 33, function()
- {
- startSizeUpdate.apply(this, arguments);
- });
-
- mxUtils.br(arrowPanel);
- this.addLabel(arrowPanel, mxResources.get('spacing'), 74, 50);
- this.addLabel(arrowPanel, mxResources.get('size'), 20, 50);
- mxUtils.br(arrowPanel);
-
- var perimeterPanel = colorPanel.cloneNode(false);
- perimeterPanel.style.fontWeight = 'normal';
- perimeterPanel.style.position = 'relative';
- perimeterPanel.style.paddingLeft = '16px'
- perimeterPanel.style.marginBottom = '2px';
- perimeterPanel.style.marginTop = '6px';
- perimeterPanel.style.borderWidth = '0px';
- perimeterPanel.style.paddingBottom = '18px';
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.marginLeft = '3px';
- span.style.marginBottom = '12px';
- span.style.marginTop = '1px';
- span.style.fontWeight = 'normal';
- span.style.width = '120px';
- mxUtils.write(span, mxResources.get('perimeter'));
- perimeterPanel.appendChild(span);
-
- var perimeterUpdate;
- var perimeterSpacing = this.addUnitInput(perimeterPanel, 'pt', 20, 41, function()
- {
- perimeterUpdate.apply(this, arguments);
- });
-
- if (ss.edges.length == graph.getSelectionCount())
- {
- container.appendChild(stylePanel2);
-
- if (mxClient.IS_QUIRKS)
- {
- mxUtils.br(container);
- mxUtils.br(container);
- }
-
- container.appendChild(arrowPanel);
- }
- else if (ss.vertices.length == graph.getSelectionCount())
- {
- if (mxClient.IS_QUIRKS)
- {
- mxUtils.br(container);
- }
-
- container.appendChild(perimeterPanel);
- }
-
- var listener = mxUtils.bind(this, function(sender, evt, force)
- {
- ss = this.format.getSelectionState();
- var color = mxUtils.getValue(ss.style, strokeKey, null);
-
- if (force || document.activeElement != input)
- {
- var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1));
- input.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != altInput)
- {
- var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1));
- altInput.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- styleSelect.style.visibility = (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') ? '' : 'hidden';
-
- if (mxUtils.getValue(ss.style, mxConstants.STYLE_CURVED, null) == '1')
- {
- styleSelect.value = 'curved';
- }
- else if (mxUtils.getValue(ss.style, mxConstants.STYLE_ROUNDED, null) == '1')
- {
- styleSelect.value = 'rounded';
- }
-
- if (mxUtils.getValue(ss.style, mxConstants.STYLE_DASHED, null) == '1')
- {
- if (mxUtils.getValue(ss.style, mxConstants.STYLE_DASH_PATTERN, null) == null)
- {
- solid.style.borderBottom = '1px dashed ' + this.defaultStrokeColor;
- }
- else
- {
- solid.style.borderBottom = '1px dotted ' + this.defaultStrokeColor;
- }
- }
- else
- {
- solid.style.borderBottom = '1px solid ' + this.defaultStrokeColor;
- }
-
- altSolid.style.borderBottom = solid.style.borderBottom;
-
- // Updates toolbar icon for edge style
- var edgeStyleDiv = edgeStyle.getElementsByTagName('div')[0];
-
- if (edgeStyleDiv != null)
- {
- var es = mxUtils.getValue(ss.style, mxConstants.STYLE_EDGE, null);
-
- if (mxUtils.getValue(ss.style, mxConstants.STYLE_NOEDGESTYLE, null) == '1')
- {
- es = null;
- }
-
- if (es == 'orthogonalEdgeStyle' && mxUtils.getValue(ss.style, mxConstants.STYLE_CURVED, null) == '1')
- {
- edgeStyleDiv.className = 'geSprite geSprite-curved';
- }
- else if (es == 'straight' || es == 'none' || es == null)
- {
- edgeStyleDiv.className = 'geSprite geSprite-straight';
- }
- else if (es == 'entityRelationEdgeStyle')
- {
- edgeStyleDiv.className = 'geSprite geSprite-entity';
- }
- else if (es == 'elbowEdgeStyle')
- {
- edgeStyleDiv.className = 'geSprite ' + ((mxUtils.getValue(ss.style,
- mxConstants.STYLE_ELBOW, null) == 'vertical') ?
- 'geSprite-verticalelbow' : 'geSprite-horizontalelbow');
- }
- else if (es == 'isometricEdgeStyle')
- {
- edgeStyleDiv.className = 'geSprite ' + ((mxUtils.getValue(ss.style,
- mxConstants.STYLE_ELBOW, null) == 'vertical') ?
- 'geSprite-verticalisometric' : 'geSprite-horizontalisometric');
- }
- else
- {
- edgeStyleDiv.className = 'geSprite geSprite-orthogonal';
- }
- }
-
- // Updates icon for edge shape
- var edgeShapeDiv = edgeShape.getElementsByTagName('div')[0];
-
- if (edgeShapeDiv != null)
- {
- if (ss.style.shape == 'link')
- {
- edgeShapeDiv.className = 'geSprite geSprite-linkedge';
- }
- else if (ss.style.shape == 'flexArrow')
- {
- edgeShapeDiv.className = 'geSprite geSprite-arrow';
- }
- else if (ss.style.shape == 'arrow')
- {
- edgeShapeDiv.className = 'geSprite geSprite-simplearrow';
- }
- else
- {
- edgeShapeDiv.className = 'geSprite geSprite-connection';
- }
- }
-
- if (ss.edges.length == graph.getSelectionCount())
- {
- altStylePanel.style.display = '';
- stylePanel.style.display = 'none';
- }
- else
- {
- altStylePanel.style.display = 'none';
- stylePanel.style.display = '';
- }
-
- function updateArrow(marker, fill, elt, prefix)
- {
- var markerDiv = elt.getElementsByTagName('div')[0];
-
- if (markerDiv != null)
- {
- markerDiv.className = ui.getCssClassForMarker(prefix, ss.style.shape, marker, fill);
-
- if (markerDiv.className == 'geSprite geSprite-noarrow')
- {
- markerDiv.innerHTML = mxUtils.htmlEntities(mxResources.get('none'));
- markerDiv.style.backgroundImage = 'none';
- markerDiv.style.verticalAlign = 'top';
- markerDiv.style.marginTop = '5px';
- markerDiv.style.fontSize = '10px';
- markerDiv.style.filter = 'none';
- markerDiv.style.color = this.defaultStrokeColor;
- markerDiv.nextSibling.style.marginTop = '0px';
- }
- }
-
- return markerDiv;
- };
-
- var sourceDiv = updateArrow(mxUtils.getValue(ss.style, mxConstants.STYLE_STARTARROW, null),
- mxUtils.getValue(ss.style, 'startFill', '1'), lineStart, 'start');
- var targetDiv = updateArrow(mxUtils.getValue(ss.style, mxConstants.STYLE_ENDARROW, null),
- mxUtils.getValue(ss.style, 'endFill', '1'), lineEnd, 'end');
-
- // Special cases for markers
- if (sourceDiv != null && targetDiv != null)
- {
- if (ss.style.shape == 'arrow')
- {
- sourceDiv.className = 'geSprite geSprite-noarrow';
- targetDiv.className = 'geSprite geSprite-endblocktrans';
- }
- else if (ss.style.shape == 'link')
- {
- sourceDiv.className = 'geSprite geSprite-noarrow';
- targetDiv.className = 'geSprite geSprite-noarrow';
- }
- }
-
- mxUtils.setOpacity(edgeStyle, (ss.style.shape == 'arrow') ? 30 : 100);
-
- if (ss.style.shape != 'connector' && ss.style.shape != 'flexArrow' && ss.style.shape != 'filledEdge')
- {
- mxUtils.setOpacity(lineStart, 30);
- mxUtils.setOpacity(lineEnd, 30);
- }
- else
- {
- mxUtils.setOpacity(lineStart, 100);
- mxUtils.setOpacity(lineEnd, 100);
- }
-
- if (force || document.activeElement != startSize)
- {
- var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE));
- startSize.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != startSpacing)
- {
- var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_SOURCE_PERIMETER_SPACING, 0));
- startSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != endSize)
- {
- var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE));
- endSize.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != startSpacing)
- {
- var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_TARGET_PERIMETER_SPACING, 0));
- endSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
-
- if (force || document.activeElement != perimeterSpacing)
- {
- var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_PERIMETER_SPACING, 0));
- perimeterSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
- });
-
- startSizeUpdate = this.installInputHandler(startSize, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE, 0, 999, ' pt');
- startSpacingUpdate = this.installInputHandler(startSpacing, mxConstants.STYLE_SOURCE_PERIMETER_SPACING, 0, -999, 999, ' pt');
- endSizeUpdate = this.installInputHandler(endSize, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE, 0, 999, ' pt');
- endSpacingUpdate = this.installInputHandler(endSpacing, mxConstants.STYLE_TARGET_PERIMETER_SPACING, 0, -999, 999, ' pt');
- perimeterUpdate = this.installInputHandler(perimeterSpacing, mxConstants.STYLE_PERIMETER_SPACING, 0, 0, 999, ' pt');
-
- this.addKeyHandler(input, listener);
- this.addKeyHandler(startSize, listener);
- this.addKeyHandler(startSpacing, listener);
- this.addKeyHandler(endSize, listener);
- this.addKeyHandler(endSpacing, listener);
- this.addKeyHandler(perimeterSpacing, listener);
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
-
- return container;
-};
-
-/**
- * Adds UI for configuring line jumps.
- */
-StyleFormatPanel.prototype.addLineJumps = function(container)
-{
- var ss = this.format.getSelectionState();
-
- if (Graph.lineJumpsEnabled && ss.edges.length > 0 &&
- ss.vertices.length == 0 && ss.lineJumps)
- {
- container.style.padding = '8px 0px 24px 18px';
-
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- var span = document.createElement('div');
- span.style.position = 'absolute';
- span.style.fontWeight = 'bold';
- span.style.width = '80px';
-
- mxUtils.write(span, mxResources.get('lineJumps'));
- container.appendChild(span);
-
- var styleSelect = document.createElement('select');
- styleSelect.style.position = 'absolute';
- styleSelect.style.marginTop = '-2px';
- styleSelect.style.right = '76px';
- styleSelect.style.width = '62px';
-
- var styles = ['none', 'arc', 'gap', 'sharp'];
-
- for (var i = 0; i < styles.length; i++)
- {
- var styleOption = document.createElement('option');
- styleOption.setAttribute('value', styles[i]);
- mxUtils.write(styleOption, mxResources.get(styles[i]));
- styleSelect.appendChild(styleOption);
- }
-
- mxEvent.addListener(styleSelect, 'change', function(evt)
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.setCellStyles('jumpStyle', styleSelect.value, graph.getSelectionCells());
- ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['jumpStyle'],
- 'values', [styleSelect.value], 'cells', graph.getSelectionCells()));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- mxEvent.consume(evt);
- });
-
- // Stops events from bubbling to color option event handler
- mxEvent.addListener(styleSelect, 'click', function(evt)
- {
- mxEvent.consume(evt);
- });
-
- container.appendChild(styleSelect);
-
- var jumpSizeUpdate;
-
- var jumpSize = this.addUnitInput(container, 'pt', 22, 33, function()
- {
- jumpSizeUpdate.apply(this, arguments);
- });
-
- jumpSizeUpdate = this.installInputHandler(jumpSize, 'jumpSize',
- Graph.defaultJumpSize, 0, 999, ' pt');
-
- var listener = mxUtils.bind(this, function(sender, evt, force)
- {
- ss = this.format.getSelectionState();
- styleSelect.value = mxUtils.getValue(ss.style, 'jumpStyle', 'none');
-
- if (force || document.activeElement != jumpSize)
- {
- var tmp = parseInt(mxUtils.getValue(ss.style, 'jumpSize', Graph.defaultJumpSize));
- jumpSize.value = (isNaN(tmp)) ? '' : tmp + ' pt';
- }
- });
-
- this.addKeyHandler(jumpSize, listener);
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
- }
- else
- {
- container.style.display = 'none';
- }
-
- return container;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.addEffects = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- var ss = this.format.getSelectionState();
-
- div.style.paddingTop = '0px';
- div.style.paddingBottom = '2px';
-
- var table = document.createElement('table');
-
- if (mxClient.IS_QUIRKS)
- {
- table.style.fontSize = '1em';
- }
-
- table.style.width = '100%';
- table.style.fontWeight = 'bold';
- table.style.paddingRight = '20px';
- var tbody = document.createElement('tbody');
- var row = document.createElement('tr');
- row.style.padding = '0px';
- var left = document.createElement('td');
- left.style.padding = '0px';
- left.style.width = '50%';
- left.setAttribute('valign', 'top');
-
- var right = left.cloneNode(true);
- right.style.paddingLeft = '8px';
- row.appendChild(left);
- row.appendChild(right);
- tbody.appendChild(row);
- table.appendChild(tbody);
- div.appendChild(table);
-
- var current = left;
- var count = 0;
-
- var addOption = mxUtils.bind(this, function(label, key, defaultValue)
- {
- var opt = this.createCellOption(label, key, defaultValue);
- opt.style.width = '100%';
- current.appendChild(opt);
- current = (current == left) ? right : left;
- count++;
- });
-
- var listener = mxUtils.bind(this, function(sender, evt, force)
- {
- ss = this.format.getSelectionState();
-
- left.innerHTML = '';
- right.innerHTML = '';
- current = left;
-
- if (ss.rounded)
- {
- addOption(mxResources.get('rounded'), mxConstants.STYLE_ROUNDED, 0);
- }
-
- if (ss.style.shape == 'swimlane')
- {
- addOption(mxResources.get('divider'), 'swimlaneLine', 1);
- }
-
- if (!ss.containsImage)
- {
- addOption(mxResources.get('shadow'), mxConstants.STYLE_SHADOW, 0);
- }
-
- if (ss.glass)
- {
- addOption(mxResources.get('glass'), mxConstants.STYLE_GLASS, 0);
- }
-
- addOption(mxResources.get('sketch'), 'sketch', 0);
- });
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
- listener();
-
- return div;
-}
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-StyleFormatPanel.prototype.addStyleOps = function(div)
-{
- div.style.paddingTop = '10px';
- div.style.paddingBottom = '10px';
-
- var btn = mxUtils.button(mxResources.get('setAsDefaultStyle'), mxUtils.bind(this, function(evt)
- {
- this.editorUi.actions.get('setAsDefaultStyle').funct();
- }));
-
- btn.setAttribute('title', mxResources.get('setAsDefaultStyle') + ' (' + this.editorUi.actions.get('setAsDefaultStyle').shortcut + ')');
- btn.style.width = '202px';
- div.appendChild(btn);
-
- return div;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramStylePanel = function(format, editorUi, container)
-{
- BaseFormatPanel.call(this, format, editorUi, container);
- this.init();
-};
-
-mxUtils.extend(DiagramStylePanel, BaseFormatPanel);
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramStylePanel.prototype.init = function()
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- this.container.appendChild(this.addView(this.createPanel()));
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramStylePanel.prototype.addView = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
- var model = graph.getModel();
-
- div.style.whiteSpace = 'normal';
-
- var sketch = graph.currentVertexStyle['sketch'] == '1' && graph.currentEdgeStyle['sketch'] == '1';
- var rounded = graph.currentVertexStyle['rounded'] == '1';
- var curved = graph.currentEdgeStyle['curved'] == '1';
-
- var opts = document.createElement('div');
- opts.style.paddingBottom = '12px';
- opts.style.marginRight = '16px';
- div.style.paddingTop = '8px';
-
- var table = document.createElement('table');
-
- if (mxClient.IS_QUIRKS)
- {
- table.style.fontSize = '1em';
- }
-
- table.style.width = '100%';
- table.style.fontWeight = 'bold';
-
- var tbody = document.createElement('tbody');
- var row = document.createElement('tr');
- row.style.padding = '0px';
-
- var left = document.createElement('td');
- left.style.padding = '0px';
- left.style.width = '50%';
- left.setAttribute('valign', 'middle');
-
- var right = left.cloneNode(true);
- right.style.paddingLeft = '8px';
- row.appendChild(left);
- row.appendChild(right);
- tbody.appendChild(row);
- table.appendChild(tbody);
-
- // Sketch
- left.appendChild(this.createOption(mxResources.get('sketch'), function()
- {
- return sketch;
- }, function(checked)
- {
- sketch = checked;
-
- if (checked)
- {
- graph.currentEdgeStyle['sketch'] = '1';
- graph.currentVertexStyle['sketch'] = '1';
- }
- else
- {
- delete graph.currentEdgeStyle['sketch'];
- delete graph.currentVertexStyle['sketch'];
- }
-
- graph.updateCellStyles('sketch', (checked) ? '1' : null, graph.getVerticesAndEdges());
- }, null, function(div)
- {
- div.style.width = 'auto';
- }));
-
- // Rounded
- right.appendChild(this.createOption(mxResources.get('rounded'), function()
- {
- return rounded;
- }, function(checked)
- {
- rounded = checked;
-
- if (checked)
- {
- graph.currentVertexStyle['rounded'] = '1';
- }
- else
- {
- delete graph.currentVertexStyle['rounded'];
- }
-
- graph.updateCellStyles('rounded', (checked) ? '1' : null, graph.getVerticesAndEdges(true, true));
- }, null, function(div)
- {
- div.style.width = 'auto';
- }));
-
- // Curved
- left = left.cloneNode(false);
- right = right.cloneNode(false);
- row = row.cloneNode(false);
- row.appendChild(left);
- row.appendChild(right);
- tbody.appendChild(row);
-
- left.appendChild(this.createOption(mxResources.get('curved'), function()
- {
- return curved;
- }, function(checked)
- {
- curved = checked;
-
- if (checked)
- {
- graph.currentEdgeStyle['curved'] = '1';
- }
- else
- {
- delete graph.currentEdgeStyle['curved'];
- }
-
- graph.updateCellStyles('curved', (checked) ? '1' : null, graph.getVerticesAndEdges(false, true));
- }, null, function(div)
- {
- div.style.width = 'auto';
- }));
-
- opts.appendChild(table);
- div.appendChild(opts);
-
- var defaultStyles = ['fillColor', 'strokeColor', 'fontColor', 'gradientColor'];
-
- var updateCells = mxUtils.bind(this, function(styles, graphStyle)
- {
- var cells = graph.getVerticesAndEdges();
-
- model.beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- var style = graph.getCellStyle(cells[i]);
-
- // Handles special label background color
- if (style['labelBackgroundColor'] != null)
- {
- graph.updateCellStyles('labelBackgroundColor', (graphStyle != null) ?
- graphStyle.background : null, [cells[i]]);
- }
-
- var edge = model.isEdge(cells[i]);
- var newStyle = model.getStyle(cells[i]);
- var current = (edge) ? graph.currentEdgeStyle : graph.currentVertexStyle;
-
- for (var j = 0; j < styles.length; j++)
- {
- if ((style[styles[j]] != null && style[styles[j]] != mxConstants.NONE) ||
- (styles[j] != mxConstants.STYLE_FILLCOLOR &&
- styles[j] != mxConstants.STYLE_STROKECOLOR))
- {
- newStyle = mxUtils.setStyle(newStyle, styles[j], current[styles[j]]);
- }
- }
-
- model.setStyle(cells[i], newStyle);
- }
- }
- finally
- {
- model.endUpdate();
- }
- });
-
- var removeStyles = mxUtils.bind(this, function(style, styles, defaultStyle)
- {
- if (style != null)
- {
- for (var j = 0; j < styles.length; j++)
- {
- if (((style[styles[j]] != null &&
- style[styles[j]] != mxConstants.NONE) ||
- (styles[j] != mxConstants.STYLE_FILLCOLOR &&
- styles[j] != mxConstants.STYLE_STROKECOLOR)))
- {
- style[styles[j]] = defaultStyle[styles[j]];
- }
- }
- }
- });
-
- var applyStyle = mxUtils.bind(this, function(style, result, cell, graphStyle, theGraph)
- {
- if (style != null)
- {
- if (cell != null)
- {
- // Handles special label background color
- if (result['labelBackgroundColor'] != null)
- {
- var bg = (graphStyle != null) ? graphStyle.background : null;
- theGraph = (theGraph != null) ? theGraph : graph;
-
- if (bg == null)
- {
- bg = theGraph.background;
- }
-
- if (bg == null)
- {
- bg = theGraph.defaultPageBackgroundColor;
- }
-
- result['labelBackgroundColor'] = bg;
- }
- }
-
- for (var key in style)
- {
- if (cell == null || ((result[key] != null &&
- result[key] != mxConstants.NONE) ||
- (key != mxConstants.STYLE_FILLCOLOR &&
- key != mxConstants.STYLE_STROKECOLOR)))
- {
- result[key] = style[key];
- }
- }
- }
- });
-
- var btn = mxUtils.button(mxResources.get('reset'), mxUtils.bind(this, function(evt)
- {
- var all = graph.getVerticesAndEdges(true, true);
-
- if (all.length > 0)
- {
- model.beginUpdate();
- try
- {
- graph.updateCellStyles('sketch', null, all);
- graph.updateCellStyles('rounded', null, all);
- graph.updateCellStyles('curved', null, graph.getVerticesAndEdges(false, true));
- }
- finally
- {
- model.endUpdate();
- }
- }
-
- graph.defaultVertexStyle = mxUtils.clone(ui.initialDefaultVertexStyle);
- graph.defaultEdgeStyle = mxUtils.clone(ui.initialDefaultEdgeStyle);
- ui.clearDefaultStyle();
- }));
-
- btn.setAttribute('title', mxResources.get('reset'));
- btn.style.textOverflow = 'ellipsis';
- btn.style.maxWidth = '90px';
- right.appendChild(btn);
-
- var createPreview = mxUtils.bind(this, function(commonStyle, vertexStyle, edgeStyle, graphStyle, container)
- {
- // Wrapper needed to catch events
- var div = document.createElement('div');
- div.style.cssText = 'position:absolute;display:inline-block;width:100%;height:100%;overflow:hidden;pointer-events:none;';
- container.appendChild(div);
-
- var graph2 = new Graph(div, null, null, graph.getStylesheet());
- graph2.resetViewOnRootChange = false;
- graph2.foldingEnabled = false;
- graph2.gridEnabled = false;
- graph2.autoScroll = false;
- graph2.setTooltips(false);
- graph2.setConnectable(false);
- graph2.setPanning(false);
- graph2.setEnabled(false);
-
- graph2.getCellStyle = function(cell)
- {
- var result = mxUtils.clone(Graph.prototype.getCellStyle.apply(this, arguments));
- var defaultStyle = graph.stylesheet.getDefaultVertexStyle();
- var appliedStyle = vertexStyle;
-
- if (model.isEdge(cell))
- {
- defaultStyle = graph.stylesheet.getDefaultEdgeStyle();
- appliedStyle = edgeStyle;
- }
-
- removeStyles(result, defaultStyles, defaultStyle);
- applyStyle(commonStyle, result, cell, graphStyle, graph2);
- applyStyle(appliedStyle, result, cell, graphStyle, graph2);
-
- return result;
- };
-
- // Avoid HTML labels to capture events in bubble phase
- graph2.model.beginUpdate();
- try
- {
- var v1 = graph2.insertVertex(graph2.getDefaultParent(), null, 'Shape', 14, 8, 70, 40, 'strokeWidth=2;');
- var e1 = graph2.insertEdge(graph2.getDefaultParent(), null, 'Connector', v1, v1,
- 'edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;endSize=5;strokeWidth=2;')
- e1.geometry.points = [new mxPoint(32, 70)];
- e1.geometry.offset = new mxPoint(0, 8);
- }
- finally
- {
- graph2.model.endUpdate();
- }
- });
-
- // Entries
- var entries = document.createElement('div');
- entries.style.position = 'relative';
- div.appendChild(entries);
-
- // Cached entries
- if (this.format.cachedStyleEntries == null)
- {
- this.format.cachedStyleEntries = [];
- }
-
- var addEntry = mxUtils.bind(this, function(commonStyle, vertexStyle, edgeStyle, graphStyle, index)
- {
- var panel = this.format.cachedStyleEntries[index];
-
- if (panel == null)
- {
- panel = document.createElement('div');
- panel.style.cssText = 'display:inline-block;position:relative;width:96px;height:90px;' +
- 'cursor:pointer;border:1px solid gray;margin:2px;overflow:hidden;';
-
- if (graphStyle != null && graphStyle.background != null)
- {
- panel.style.backgroundColor = graphStyle.background;
- }
-
- createPreview(commonStyle, vertexStyle, edgeStyle, graphStyle, panel);
-
- mxEvent.addGestureListeners(panel, mxUtils.bind(this, function(evt)
- {
- panel.style.opacity = 0.5;
- }), null, mxUtils.bind(this, function(evt)
- {
- panel.style.opacity = 1;
- graph.defaultVertexStyle = mxUtils.clone(ui.initialDefaultVertexStyle);
- graph.defaultEdgeStyle = mxUtils.clone(ui.initialDefaultEdgeStyle);
-
- applyStyle(commonStyle, graph.defaultVertexStyle);
- applyStyle(commonStyle, graph.defaultEdgeStyle);
- applyStyle(vertexStyle, graph.defaultVertexStyle);
- applyStyle(edgeStyle, graph.defaultEdgeStyle);
- ui.clearDefaultStyle();
-
- if (sketch)
- {
- graph.currentEdgeStyle['sketch'] = '1';
- graph.currentVertexStyle['sketch'] = '1';
- }
- else
- {
- graph.currentEdgeStyle['sketch'] = '0';
- graph.currentVertexStyle['sketch'] = '0';
- }
-
- if (rounded)
- {
- graph.currentVertexStyle['rounded'] = '1';
- graph.currentEdgeStyle['rounded'] = '1';
- }
- else
- {
- graph.currentVertexStyle['rounded'] = '0';
- graph.currentEdgeStyle['rounded'] = '1';
- }
-
- if (curved)
- {
- graph.currentEdgeStyle['curved'] = '1';
- }
- else
- {
- graph.currentEdgeStyle['curved'] = '0';
- }
-
- model.beginUpdate();
- try
- {
- updateCells(defaultStyles, graphStyle);
-
- var change = new ChangePageSetup(ui, (graphStyle != null) ? graphStyle.background : null);
- change.ignoreImage = true;
- model.execute(change);
-
- model.execute(new ChangeGridColor(ui, (graphStyle != null && graphStyle.gridColor != null) ?
- graphStyle.gridColor : graph.view.defaultGridColor));
- }
- finally
- {
- model.endUpdate();
- }
- }));
-
- mxEvent.addListener(panel, 'mouseenter', mxUtils.bind(this, function(evt)
- {
- var prev = graph.getCellStyle;
- var prevBg = graph.background;
- var prevGrid = graph.view.gridColor;
-
- graph.background = (graphStyle != null) ? graphStyle.background : null;
- graph.view.gridColor = (graphStyle != null && graphStyle.gridColor != null) ?
- graphStyle.gridColor : graph.view.defaultGridColor;
-
- graph.getCellStyle = function(cell)
- {
- var result = mxUtils.clone(prev.apply(this, arguments));
-
- var defaultStyle = graph.stylesheet.getDefaultVertexStyle();
- var appliedStyle = vertexStyle;
-
- if (model.isEdge(cell))
- {
- defaultStyle = graph.stylesheet.getDefaultEdgeStyle();
- appliedStyle = edgeStyle;
- }
-
- removeStyles(result, defaultStyles, defaultStyle);
- applyStyle(commonStyle, result, cell, graphStyle);
- applyStyle(appliedStyle, result, cell, graphStyle);
-
- return result;
- };
-
- graph.refresh();
- graph.getCellStyle = prev;
- graph.background = prevBg;
- graph.view.gridColor = prevGrid;
- }));
-
- mxEvent.addListener(panel, 'mouseleave', mxUtils.bind(this, function(evt)
- {
- graph.refresh();
- }));
-
- this.format.cachedStyleEntries[index] = panel;
- }
-
- entries.appendChild(panel);
- });
-
- // Maximum palettes to switch the switcher
- var maxEntries = 10;
- var pageCount = Math.ceil(Editor.styles.length / maxEntries);
- this.format.currentStylePage = (this.format.currentStylePage != null) ? this.format.currentStylePage : 0;
- var dots = [];
-
- var addEntries = mxUtils.bind(this, function()
- {
- if (dots.length > 0)
- {
- dots[this.format.currentStylePage].style.background = '#84d7ff';
- }
-
- for (var i = this.format.currentStylePage * maxEntries;
- i < Math.min((this.format.currentStylePage + 1) * maxEntries,
- Editor.styles.length); i++)
- {
- var s = Editor.styles[i];
- addEntry(s.commonStyle, s.vertexStyle, s.edgeStyle, s.graph, i);
- }
- });
-
- var selectPage = mxUtils.bind(this, function(index)
- {
- if (index >= 0 && index < pageCount)
- {
- dots[this.format.currentStylePage].style.background = 'transparent';
- entries.innerHTML = '';
- this.format.currentStylePage = index;
- addEntries();
- }
- });
-
- if (pageCount > 1)
- {
- // Selector
- var switcher = document.createElement('div');
- switcher.style.whiteSpace = 'nowrap';
- switcher.style.position = 'relative';
- switcher.style.textAlign = 'center';
- switcher.style.paddingTop = '4px';
- switcher.style.width = '210px';
-
- div.style.paddingBottom = '8px';
-
- for (var i = 0; i < pageCount; i++)
- {
- var dot = document.createElement('div');
- dot.style.display = 'inline-block';
- dot.style.width = '6px';
- dot.style.height = '6px';
- dot.style.marginLeft = '4px';
- dot.style.marginRight = '3px';
- dot.style.borderRadius = '3px';
- dot.style.cursor = 'pointer';
- dot.style.background = 'transparent';
- dot.style.border = '1px solid #b5b6b7';
-
- (mxUtils.bind(this, function(index, elt)
- {
- mxEvent.addListener(dot, 'click', mxUtils.bind(this, function()
- {
- selectPage(index);
- }));
- }))(i, dot);
-
- switcher.appendChild(dot);
- dots.push(dot);
- }
-
- div.appendChild(switcher);
- addEntries();
-
- if (pageCount < 15)
- {
- var left = document.createElement('div');
- left.style.cssText = 'position:absolute;left:0px;top:4px;bottom:0px;width:20px;margin:0px;opacity:0.5;' +
- 'background-repeat:no-repeat;background-position:center center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQBAMAAADQT4M0AAAAIVBMVEUAAAB2dnZ4eHh3d3d1dXVxcXF2dnZ2dnZ2dnZxcXF2dnYmb3w1AAAACnRSTlMAfCTkhhvb7cQSPH2JPgAAADRJREFUCNdjwACMAmBKaiGYs2oJmLPKAZ3DabU8AMRTXpUKopislqFyVzCAuUZgikkBZjoAcMYLnp53P/UAAAAASUVORK5CYII=);';
-
- mxEvent.addListener(left, 'click', mxUtils.bind(this, function()
- {
- selectPage(mxUtils.mod(this.format.currentStylePage - 1, pageCount));
- }));
-
- var right = document.createElement('div');
- right.style.cssText = 'position:absolute;right:2px;top:4px;bottom:0px;width:20px;margin:0px;opacity:0.5;' +
- 'background-repeat:no-repeat;background-position:center center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQBAMAAADQT4M0AAAAIVBMVEUAAAB2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYBuwCcAAAACnRSTlMAfCTkhhvb7cQSPH2JPgAAADZJREFUCNdjQAOMAmBKaiGY8loF5rKswsZlrVo8AUiFrTICcbIWK8A5DF1gDoMymMPApIAwHwCS0Qx/U7qCBQAAAABJRU5ErkJggg==);';
- switcher.appendChild(left);
- switcher.appendChild(right);
-
- mxEvent.addListener(right, 'click', mxUtils.bind(this, function()
- {
- selectPage(mxUtils.mod(this.format.currentStylePage + 1, pageCount));
- }));
-
- // Hover state
- function addHoverState(elt)
- {
- mxEvent.addListener(elt, 'mouseenter', function()
- {
- elt.style.opacity = '1';
- });
- mxEvent.addListener(elt, 'mouseleave', function()
- {
- elt.style.opacity = '0.5';
- });
- };
-
- addHoverState(left);
- addHoverState(right);
- }
- }
- else
- {
- addEntries();
- }
-
- return div;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramFormatPanel = function(format, editorUi, container)
-{
- BaseFormatPanel.call(this, format, editorUi, container);
- this.init();
-};
-
-mxUtils.extend(DiagramFormatPanel, BaseFormatPanel);
-
-/**
- * Switch to disable page view.
- */
-DiagramFormatPanel.showPageView = true;
-
-/**
- * Specifies if the background image option should be shown. Default is true.
- */
-DiagramFormatPanel.prototype.showBackgroundImageOption = true;
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramFormatPanel.prototype.init = function()
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- this.container.appendChild(this.addView(this.createPanel()));
-
- if (graph.isEnabled())
- {
- this.container.appendChild(this.addOptions(this.createPanel()));
- this.container.appendChild(this.addPaperSize(this.createPanel()));
- this.container.appendChild(this.addStyleOps(this.createPanel()));
- }
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramFormatPanel.prototype.addView = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- div.appendChild(this.createTitle(mxResources.get('view')));
-
- // Grid
- this.addGridOption(div);
-
- // Page View
- if (DiagramFormatPanel.showPageView)
- {
- div.appendChild(this.createOption(mxResources.get('pageView'), function()
- {
- return graph.pageVisible;
- }, function(checked)
- {
- ui.actions.get('pageView').funct();
- },
- {
- install: function(apply)
- {
- this.listener = function()
- {
- apply(graph.pageVisible);
- };
-
- ui.addListener('pageViewChanged', this.listener);
- },
- destroy: function()
- {
- ui.removeListener(this.listener);
- }
- }));
- }
-
- if (graph.isEnabled())
- {
- // Background
- var bg = this.createColorOption(mxResources.get('background'), function()
- {
- return graph.background;
- }, function(color)
- {
- var change = new ChangePageSetup(ui, color);
- change.ignoreImage = true;
-
- graph.model.execute(change);
- }, '#ffffff',
- {
- install: function(apply)
- {
- this.listener = function()
- {
- apply(graph.background);
- };
-
- ui.addListener('backgroundColorChanged', this.listener);
- },
- destroy: function()
- {
- ui.removeListener(this.listener);
- }
- });
-
- if (this.showBackgroundImageOption)
- {
- var btn = mxUtils.button(mxResources.get('image'), function(evt)
- {
- ui.showBackgroundImageDialog(null, ui.editor.graph.backgroundImage);
- mxEvent.consume(evt);
- })
-
- btn.style.position = 'absolute';
- btn.className = 'geColorBtn';
- btn.style.marginTop = '-4px';
- btn.style.paddingBottom = (document.documentMode == 11 || mxClient.IS_MT) ? '0px' : '2px';
- btn.style.height = '22px';
- btn.style.right = (mxClient.IS_QUIRKS) ? '52px' : '72px';
- btn.style.width = '56px';
-
- bg.appendChild(btn);
- }
-
- div.appendChild(bg);
- }
-
- return div;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramFormatPanel.prototype.addOptions = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- div.appendChild(this.createTitle(mxResources.get('options')));
-
- if (graph.isEnabled())
- {
- // Connection arrows
- div.appendChild(this.createOption(mxResources.get('connectionArrows'), function()
- {
- return graph.connectionArrowsEnabled;
- }, function(checked)
- {
- ui.actions.get('connectionArrows').funct();
- },
- {
- install: function(apply)
- {
- this.listener = function()
- {
- apply(graph.connectionArrowsEnabled);
- };
-
- ui.addListener('connectionArrowsChanged', this.listener);
- },
- destroy: function()
- {
- ui.removeListener(this.listener);
- }
- }));
-
- // Connection points
- div.appendChild(this.createOption(mxResources.get('connectionPoints'), function()
- {
- return graph.connectionHandler.isEnabled();
- }, function(checked)
- {
- ui.actions.get('connectionPoints').funct();
- },
- {
- install: function(apply)
- {
- this.listener = function()
- {
- apply(graph.connectionHandler.isEnabled());
- };
-
- ui.addListener('connectionPointsChanged', this.listener);
- },
- destroy: function()
- {
- ui.removeListener(this.listener);
- }
- }));
-
- // Guides
- div.appendChild(this.createOption(mxResources.get('guides'), function()
- {
- return graph.graphHandler.guidesEnabled;
- }, function(checked)
- {
- ui.actions.get('guides').funct();
- },
- {
- install: function(apply)
- {
- this.listener = function()
- {
- apply(graph.graphHandler.guidesEnabled);
- };
-
- ui.addListener('guidesEnabledChanged', this.listener);
- },
- destroy: function()
- {
- ui.removeListener(this.listener);
- }
- }));
- }
-
- return div;
-};
-
-/**
- *
- */
-DiagramFormatPanel.prototype.addGridOption = function(container)
-{
- var fPanel = this;
- var ui = this.editorUi;
- var graph = ui.editor.graph;
-
- var input = document.createElement('input');
- input.style.position = 'absolute';
- input.style.textAlign = 'right';
- input.style.width = '38px';
- input.value = this.inUnit(graph.getGridSize()) + ' ' + this.getUnit();
-
- var stepper = this.createStepper(input, update, this.getUnitStep(), null, null, null, this.isFloatUnit());
- input.style.display = (graph.isGridEnabled()) ? '' : 'none';
- stepper.style.display = input.style.display;
-
- mxEvent.addListener(input, 'keydown', function(e)
- {
- if (e.keyCode == 13)
- {
- graph.container.focus();
- mxEvent.consume(e);
- }
- else if (e.keyCode == 27)
- {
- input.value = graph.getGridSize();
- graph.container.focus();
- mxEvent.consume(e);
- }
- });
-
- function update(evt)
- {
- var value = fPanel.isFloatUnit()? parseFloat(input.value) : parseInt(input.value);
- value = fPanel.fromUnit(Math.max(fPanel.inUnit(1), (isNaN(value)) ? fPanel.inUnit(10) : value));
-
- if (value != graph.getGridSize())
- {
- graph.setGridSize(value)
- }
-
- input.value = fPanel.inUnit(value) + ' ' + fPanel.getUnit();
- mxEvent.consume(evt);
- };
-
- mxEvent.addListener(input, 'blur', update);
- mxEvent.addListener(input, 'change', update);
-
- if (mxClient.IS_SVG)
- {
- input.style.marginTop = '-2px';
- input.style.right = '84px';
- stepper.style.marginTop = '-16px';
- stepper.style.right = '72px';
-
- var panel = this.createColorOption(mxResources.get('grid'), function()
- {
- var color = graph.view.gridColor;
-
- return (graph.isGridEnabled()) ? color : null;
- }, function(color)
- {
- var enabled = graph.isGridEnabled();
-
- if (color == mxConstants.NONE)
- {
- graph.setGridEnabled(false);
- }
- else
- {
- graph.setGridEnabled(true);
- ui.setGridColor(color);
- }
-
- input.style.display = (graph.isGridEnabled()) ? '' : 'none';
- stepper.style.display = input.style.display;
-
- if (enabled != graph.isGridEnabled())
- {
- ui.fireEvent(new mxEventObject('gridEnabledChanged'));
- }
- }, '#e0e0e0',
- {
- install: function(apply)
- {
- this.listener = function()
- {
- apply((graph.isGridEnabled()) ? graph.view.gridColor : null);
- };
-
- ui.addListener('gridColorChanged', this.listener);
- ui.addListener('gridEnabledChanged', this.listener);
- },
- destroy: function()
- {
- ui.removeListener(this.listener);
- }
- });
-
- panel.appendChild(input);
- panel.appendChild(stepper);
- container.appendChild(panel);
- }
- else
- {
- input.style.marginTop = '2px';
- input.style.right = '32px';
- stepper.style.marginTop = '2px';
- stepper.style.right = '20px';
-
- container.appendChild(input);
- container.appendChild(stepper);
-
- container.appendChild(this.createOption(mxResources.get('grid'), function()
- {
- return graph.isGridEnabled();
- }, function(checked)
- {
- graph.setGridEnabled(checked);
-
- if (graph.isGridEnabled())
- {
- graph.view.gridColor = '#e0e0e0';
- }
-
- ui.fireEvent(new mxEventObject('gridEnabledChanged'));
- },
- {
- install: function(apply)
- {
- this.listener = function()
- {
- input.style.display = (graph.isGridEnabled()) ? '' : 'none';
- stepper.style.display = input.style.display;
-
- apply(graph.isGridEnabled());
- };
-
- ui.addListener('gridEnabledChanged', this.listener);
- },
- destroy: function()
- {
- ui.removeListener(this.listener);
- }
- }));
- }
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramFormatPanel.prototype.addDocumentProperties = function(div)
-{
- // Hook for subclassers
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- div.appendChild(this.createTitle(mxResources.get('options')));
-
- return div;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramFormatPanel.prototype.addPaperSize = function(div)
-{
- var ui = this.editorUi;
- var editor = ui.editor;
- var graph = editor.graph;
-
- div.appendChild(this.createTitle(mxResources.get('paperSize')));
-
- var accessor = PageSetupDialog.addPageFormatPanel(div, 'formatpanel', graph.pageFormat, function(pageFormat)
- {
- if (graph.pageFormat == null || graph.pageFormat.width != pageFormat.width ||
- graph.pageFormat.height != pageFormat.height)
- {
- var change = new ChangePageSetup(ui, null, null, pageFormat);
- change.ignoreColor = true;
- change.ignoreImage = true;
-
- graph.model.execute(change);
- }
- });
-
- this.addKeyHandler(accessor.widthInput, function()
- {
- accessor.set(graph.pageFormat);
- });
- this.addKeyHandler(accessor.heightInput, function()
- {
- accessor.set(graph.pageFormat);
- });
-
- var listener = function()
- {
- accessor.set(graph.pageFormat);
- };
-
- ui.addListener('pageFormatChanged', listener);
- this.listeners.push({destroy: function() { ui.removeListener(listener); }});
-
- graph.getModel().addListener(mxEvent.CHANGE, listener);
- this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }});
-
- return div;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramFormatPanel.prototype.addStyleOps = function(div)
-{
- var btn = mxUtils.button(mxResources.get('editData'), mxUtils.bind(this, function(evt)
- {
- this.editorUi.actions.get('editData').funct();
- }));
-
- btn.setAttribute('title', mxResources.get('editData') + ' (' + this.editorUi.actions.get('editData').shortcut + ')');
- btn.style.width = '202px';
- btn.style.marginBottom = '2px';
- div.appendChild(btn);
-
- mxUtils.br(div);
-
- btn = mxUtils.button(mxResources.get('clearDefaultStyle'), mxUtils.bind(this, function(evt)
- {
- this.editorUi.actions.get('clearDefaultStyle').funct();
- }));
-
- btn.setAttribute('title', mxResources.get('clearDefaultStyle') + ' (' + this.editorUi.actions.get('clearDefaultStyle').shortcut + ')');
- btn.style.width = '202px';
- div.appendChild(btn);
-
- return div;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-DiagramFormatPanel.prototype.destroy = function()
-{
- BaseFormatPanel.prototype.destroy.apply(this, arguments);
-
- if (this.gridEnabledListener)
- {
- this.editorUi.removeListener(this.gridEnabledListener);
- this.gridEnabledListener = null;
- }
-};
diff --git a/src/main/webapp/js/mxgraph/Graph.js b/src/main/webapp/js/mxgraph/Graph.js
deleted file mode 100644
index 43c8bfde..00000000
--- a/src/main/webapp/js/mxgraph/Graph.js
+++ /dev/null
@@ -1,11948 +0,0 @@
-/**
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-// Workaround for allowing target="_blank" in HTML sanitizer
-// see https://code.google.com/p/google-caja/issues/detail?can=2&q=&colspec=ID%20Type%20Status%20Priority%20Owner%20Summary&groupby=&sort=&id=1296
-if (typeof html4 !== 'undefined')
-{
- html4.ATTRIBS['a::target'] = 0;
- html4.ATTRIBS['source::src'] = 0;
- html4.ATTRIBS['video::src'] = 0;
- // Would be nice for tooltips but probably a security risk...
- //html4.ATTRIBS['video::autoplay'] = 0;
- //html4.ATTRIBS['video::autobuffer'] = 0;
-}
-
-// Workaround for handling named HTML entities in mxUtils.parseXml
-// LATER: How to configure DOMParser to just ignore all entities?
-(function()
-{
- var entities = [
- ['nbsp', '160'],
- ['shy', '173']
- ];
-
- var parseXml = mxUtils.parseXml;
-
- mxUtils.parseXml = function(text)
- {
- for (var i = 0; i < entities.length; i++)
- {
- text = text.replace(new RegExp(
- '&' + entities[i][0] + ';', 'g'),
- '&#' + entities[i][1] + ';');
- }
-
- return parseXml(text);
- };
-})();
-
-// Shim for missing toISOString in older versions of IE
-// See https://stackoverflow.com/questions/12907862
-if (!Date.prototype.toISOString)
-{
- (function()
- {
- function pad(number)
- {
- var r = String(number);
-
- if (r.length === 1)
- {
- r = '0' + r;
- }
-
- return r;
- };
-
- Date.prototype.toISOString = function()
- {
- return this.getUTCFullYear()
- + '-' + pad( this.getUTCMonth() + 1 )
- + '-' + pad( this.getUTCDate() )
- + 'T' + pad( this.getUTCHours() )
- + ':' + pad( this.getUTCMinutes() )
- + ':' + pad( this.getUTCSeconds() )
- + '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 )
- + 'Z';
- };
- }());
-}
-
-// Shim for Date.now()
-if (!Date.now)
-{
- Date.now = function()
- {
- return new Date().getTime();
- };
-}
-
-// Changes default colors
-/**
- * Measurements Units
- */
-mxConstants.POINTS = 1;
-mxConstants.MILLIMETERS = 2;
-mxConstants.INCHES = 3;
-/**
- * This ratio is with page scale 1
- */
-mxConstants.PIXELS_PER_MM = 3.937;
-mxConstants.PIXELS_PER_INCH = 100;
-
-mxConstants.SHADOW_OPACITY = 0.25;
-mxConstants.SHADOWCOLOR = '#000000';
-mxConstants.VML_SHADOWCOLOR = '#d0d0d0';
-mxGraph.prototype.pageBreakColor = '#c0c0c0';
-mxGraph.prototype.pageScale = 1;
-
-// Letter page format is default in US, Canada and Mexico
-(function()
-{
- try
- {
- if (navigator != null && navigator.language != null)
- {
- var lang = navigator.language.toLowerCase();
- mxGraph.prototype.pageFormat = (lang === 'en-us' || lang === 'en-ca' || lang === 'es-mx') ?
- mxConstants.PAGE_FORMAT_LETTER_PORTRAIT : mxConstants.PAGE_FORMAT_A4_PORTRAIT;
- }
- }
- catch (e)
- {
- // ignore
- }
-})();
-
-// Matches label positions of mxGraph 1.x
-mxText.prototype.baseSpacingTop = 5;
-mxText.prototype.baseSpacingBottom = 1;
-
-// Keeps edges between relative child cells inside parent
-mxGraphModel.prototype.ignoreRelativeEdgeParent = false;
-
-// Defines grid properties
-mxGraphView.prototype.gridImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhCgAKAJEAAAAAAP///8zMzP///yH5BAEAAAMALAAAAAAKAAoAAAIJ1I6py+0Po2wFADs=' :
- IMAGE_PATH + '/grid.gif';
-mxGraphView.prototype.gridSteps = 4;
-mxGraphView.prototype.minGridSize = 4;
-
-// UrlParams is null in embed mode
-mxGraphView.prototype.defaultGridColor = '#d0d0d0';
-mxGraphView.prototype.gridColor = mxGraphView.prototype.defaultGridColor;
-
-//Units
-mxGraphView.prototype.unit = mxConstants.POINTS;
-
-mxGraphView.prototype.setUnit = function(unit)
-{
- if (this.unit != unit)
- {
- this.unit = unit;
-
- this.fireEvent(new mxEventObject('unitChanged', 'unit', unit));
- }
-};
-
-// Alternative text for unsupported foreignObjects
-mxSvgCanvas2D.prototype.foAltText = '[Not supported by viewer]';
-
-// Hook for custom constraints
-mxShape.prototype.getConstraints = function(style, w, h)
-{
- return null;
-};
-
-/**
- * Constructs a new graph instance. Note that the constructor does not take a
- * container because the graph instance is needed for creating the UI, which
- * in turn will create the container for the graph. Hence, the container is
- * assigned later in EditorUi.
- */
-/**
- * Defines graph class.
- */
-Graph = function(container, model, renderHint, stylesheet, themes, standalone)
-{
- mxGraph.call(this, container, model, renderHint, stylesheet);
-
- this.themes = themes || this.defaultThemes;
- this.currentEdgeStyle = mxUtils.clone(this.defaultEdgeStyle);
- this.currentVertexStyle = mxUtils.clone(this.defaultVertexStyle);
- this.standalone = (standalone != null) ? standalone : false;
-
- // Sets the base domain URL and domain path URL for relative links.
- var b = this.baseUrl;
- var p = b.indexOf('//');
- this.domainUrl = '';
- this.domainPathUrl = '';
-
- if (p > 0)
- {
- var d = b.indexOf('/', p + 2);
-
- if (d > 0)
- {
- this.domainUrl = b.substring(0, d);
- }
-
- d = b.lastIndexOf('/');
-
- if (d > 0)
- {
- this.domainPathUrl = b.substring(0, d + 1);
- }
- }
-
- // Adds support for HTML labels via style. Note: Currently, only the Java
- // backend supports HTML labels but CSS support is limited to the following:
- // http://docs.oracle.com/javase/6/docs/api/index.html?javax/swing/text/html/CSS.html
- // TODO: Wrap should not affect isHtmlLabel output (should be handled later)
- this.isHtmlLabel = function(cell)
- {
- var style = this.getCurrentCellStyle(cell);
-
- return (style != null) ? (style['html'] == '1' || style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') : false;
- };
-
- // Implements a listener for hover and click handling on edges
- if (this.edgeMode)
- {
- var start = {
- point: null,
- event: null,
- state: null,
- handle: null,
- selected: false
- };
-
- // Uses this event to process mouseDown to check the selection state before it is changed
- this.addListener(mxEvent.FIRE_MOUSE_EVENT, mxUtils.bind(this, function(sender, evt)
- {
- if (evt.getProperty('eventName') == 'mouseDown' && this.isEnabled())
- {
- var me = evt.getProperty('event');
- var state = me.getState();
-
- if (!mxEvent.isAltDown(me.getEvent()) && state != null)
- {
- // Checks if state was removed in call to stopEditing above
- if (this.model.isEdge(state.cell))
- {
- start.point = new mxPoint(me.getGraphX(), me.getGraphY());
- start.selected = this.isCellSelected(state.cell);
- start.state = state;
- start.event = me;
-
- if (state.text != null && state.text.boundingBox != null &&
- mxUtils.contains(state.text.boundingBox, me.getGraphX(), me.getGraphY()))
- {
- start.handle = mxEvent.LABEL_HANDLE;
- }
- else
- {
- var handler = this.selectionCellsHandler.getHandler(state.cell);
-
- if (handler != null && handler.bends != null && handler.bends.length > 0)
- {
- start.handle = handler.getHandleForEvent(me);
- }
- }
- }
- else if (!this.panningHandler.isActive() && !mxEvent.isControlDown(me.getEvent()))
- {
- var handler = this.selectionCellsHandler.getHandler(state.cell);
-
- // Cell handles have precedence over row and col resize
- if (handler == null || handler.getHandleForEvent(me) == null)
- {
- var box = new mxRectangle(me.getGraphX() - 1, me.getGraphY() - 1);
- box.grow(mxEvent.isTouchEvent(me.getEvent()) ?
- mxShape.prototype.svgStrokeTolerance - 1 :
- (mxShape.prototype.svgStrokeTolerance + 1) / 2);
-
- if (this.isTableCell(state.cell) && !this.isCellSelected(state.cell))
- {
- var row = this.model.getParent(state.cell);
- var table = this.model.getParent(row);
-
- if (!this.isCellSelected(table))
- {
- if ((mxUtils.intersects(box, new mxRectangle(state.x, state.y - 2, state.width, 3)) &&
- this.model.getChildAt(table, 0) != row) || mxUtils.intersects(box, new mxRectangle(
- state.x, state.y + state.height - 2, state.width, 3)) ||
- (mxUtils.intersects(box, new mxRectangle(state.x - 2, state.y, 2, state.height)) &&
- this.model.getChildAt(row, 0) != state.cell) || mxUtils.intersects(box, new mxRectangle(
- state.x + state.width - 2, state.y, 2, state.height)))
- {
- var wasSelected = this.selectionCellsHandler.isHandled(table);
- this.selectCellForEvent(table, me.getEvent());
- handler = this.selectionCellsHandler.getHandler(table);
-
- if (handler != null)
- {
- var handle = handler.getHandleForEvent(me);
-
- if (handle != null)
- {
- handler.start(me.getGraphX(), me.getGraphY(), handle);
- handler.blockDelayedSelection = !wasSelected;
- me.consume();
- }
- }
- }
- }
- }
-
- // Hover for swimlane start sizes inside tables
- var current = state;
-
- while (!me.isConsumed() && current != null && (this.isTableCell(current.cell) ||
- this.isTableRow(current.cell) || this.isTable(current.cell)))
- {
- if (this.isSwimlane(current.cell))
- {
- var offset = this.getActualStartSize(current.cell);
- var s = this.view.scale;
-
- if (((offset.x > 0 || offset.width > 0) && mxUtils.intersects(box, new mxRectangle(
- current.x + (offset.x - offset.width - 1) * s + ((offset.x == 0) ? current.width : 0),
- current.y, 1, current.height))) || ((offset.y > 0 || offset.height > 0) &&
- mxUtils.intersects(box, new mxRectangle(current.x, current.y + (offset.y -
- offset.height - 1) * s + ((offset.y == 0) ? current.height : 0), current.width, 1))))
- {
- this.selectCellForEvent(current.cell, me.getEvent());
- handler = this.selectionCellsHandler.getHandler(current.cell);
-
- if (handler != null)
- {
- // Swimlane start size handle is last custom handle
- var handle = mxEvent.CUSTOM_HANDLE - handler.customHandles.length + 1;
- handler.start(me.getGraphX(), me.getGraphY(), handle);
- me.consume();
- }
- }
- }
-
- current = this.view.getState(this.model.getParent(current.cell));
- }
- }
- }
- }
- }
- }));
-
- var mouseDown = null;
-
- this.addMouseListener(
- {
- mouseDown: function(sender, me) {},
- mouseMove: mxUtils.bind(this, function(sender, me)
- {
- // Checks if any other handler is active
- var handlerMap = this.selectionCellsHandler.handlers.map;
-
- for (var key in handlerMap)
- {
- if (handlerMap[key].index != null)
- {
- return;
- }
- }
-
- if (this.isEnabled() && !this.panningHandler.isActive() && !mxEvent.isAltDown(me.getEvent()))
- {
- var tol = this.tolerance;
-
- if (start.point != null && start.state != null && start.event != null)
- {
- var state = start.state;
-
- if (Math.abs(start.point.x - me.getGraphX()) > tol ||
- Math.abs(start.point.y - me.getGraphY()) > tol)
- {
- var handler = this.selectionCellsHandler.getHandler(state.cell);
-
- if (handler == null && this.model.isEdge(state.cell))
- {
- handler = this.createHandler(state);
- }
-
- if (handler != null && handler.bends != null && handler.bends.length > 0)
- {
- var handle = handler.getHandleForEvent(start.event);
- var edgeStyle = this.view.getEdgeStyle(state);
- var entity = edgeStyle == mxEdgeStyle.EntityRelation;
-
- // Handles special case where label was clicked on unselected edge in which
- // case the label will be moved regardless of the handle that is returned
- if (!start.selected && start.handle == mxEvent.LABEL_HANDLE)
- {
- handle = start.handle;
- }
-
- if (!entity || handle == 0 || handle == handler.bends.length - 1 || handle == mxEvent.LABEL_HANDLE)
- {
- // Source or target handle or connected for direct handle access or orthogonal line
- // with just two points where the central handle is moved regardless of mouse position
- if (handle == mxEvent.LABEL_HANDLE || handle == 0 || state.visibleSourceState != null ||
- handle == handler.bends.length - 1 || state.visibleTargetState != null)
- {
- if (!entity && handle != mxEvent.LABEL_HANDLE)
- {
- var pts = state.absolutePoints;
-
- // Default case where handles are at corner points handles
- // drag of corner as drag of existing point
- if (pts != null && ((edgeStyle == null && handle == null) ||
- edgeStyle == mxEdgeStyle.OrthConnector))
- {
- // Does not use handles if they were not initially visible
- handle = start.handle;
-
- if (handle == null)
- {
- var box = new mxRectangle(start.point.x, start.point.y);
- box.grow(mxEdgeHandler.prototype.handleImage.width / 2);
-
- if (mxUtils.contains(box, pts[0].x, pts[0].y))
- {
- // Moves source terminal handle
- handle = 0;
- }
- else if (mxUtils.contains(box, pts[pts.length - 1].x, pts[pts.length - 1].y))
- {
- // Moves target terminal handle
- handle = handler.bends.length - 1;
- }
- else
- {
- // Checks if edge has no bends
- var nobends = edgeStyle != null && (pts.length == 2 || (pts.length == 3 &&
- ((Math.round(pts[0].x - pts[1].x) == 0 && Math.round(pts[1].x - pts[2].x) == 0) ||
- (Math.round(pts[0].y - pts[1].y) == 0 && Math.round(pts[1].y - pts[2].y) == 0))));
-
- if (nobends)
- {
- // Moves central handle for straight orthogonal edges
- handle = 2;
- }
- else
- {
- // Finds and moves vertical or horizontal segment
- handle = mxUtils.findNearestSegment(state, start.point.x, start.point.y);
-
- // Converts segment to virtual handle index
- if (edgeStyle == null)
- {
- handle = mxEvent.VIRTUAL_HANDLE - handle;
- }
- // Maps segment to handle
- else
- {
- handle += 1;
- }
- }
- }
- }
- }
-
- // Creates a new waypoint and starts moving it
- if (handle == null)
- {
- handle = mxEvent.VIRTUAL_HANDLE;
- }
- }
-
- handler.start(me.getGraphX(), me.getGraphX(), handle);
- me.consume();
-
- // Removes preview rectangle in graph handler
- this.graphHandler.reset();
- }
- }
- else if (entity && (state.visibleSourceState != null || state.visibleTargetState != null))
- {
- // Disables moves on entity to make it consistent
- this.graphHandler.reset();
- me.consume();
- }
- }
-
- if (handler != null)
- {
- // Lazy selection for edges inside groups
- if (this.selectionCellsHandler.isHandlerActive(handler))
- {
- if (!this.isCellSelected(state.cell))
- {
- this.selectionCellsHandler.handlers.put(state.cell, handler);
- this.selectCellForEvent(state.cell, me.getEvent());
- }
- }
- else if (!this.isCellSelected(state.cell))
- {
- // Destroy temporary handler
- handler.destroy();
- }
- }
-
- // Reset start state
- start.selected = false;
- start.handle = null;
- start.state = null;
- start.event = null;
- start.point = null;
- }
- }
- else
- {
- // Updates cursor for unselected edges under the mouse
- var state = me.getState();
-
- if (state != null)
- {
- var cursor = null;
-
- // Checks if state was removed in call to stopEditing above
- if (this.model.isEdge(state.cell))
- {
- var box = new mxRectangle(me.getGraphX(), me.getGraphY());
- box.grow(mxEdgeHandler.prototype.handleImage.width / 2);
- var pts = state.absolutePoints;
-
- if (pts != null)
- {
- if (state.text != null && state.text.boundingBox != null &&
- mxUtils.contains(state.text.boundingBox, me.getGraphX(), me.getGraphY()))
- {
- cursor = 'move';
- }
- else if (mxUtils.contains(box, pts[0].x, pts[0].y) ||
- mxUtils.contains(box, pts[pts.length - 1].x, pts[pts.length - 1].y))
- {
- cursor = 'pointer';
- }
- else if (state.visibleSourceState != null || state.visibleTargetState != null)
- {
- // Moving is not allowed for entity relation but still indicate hover state
- var tmp = this.view.getEdgeStyle(state);
- cursor = 'crosshair';
-
- if (tmp != mxEdgeStyle.EntityRelation && this.isOrthogonal(state))
- {
- var idx = mxUtils.findNearestSegment(state, me.getGraphX(), me.getGraphY());
-
- if (idx < pts.length - 1 && idx >= 0)
- {
- cursor = (Math.round(pts[idx].x - pts[idx + 1].x) == 0) ?
- 'col-resize' : 'row-resize';
- }
- }
- }
- }
- }
- else if (!mxEvent.isControlDown(me.getEvent()))
- {
- var box = new mxRectangle(me.getGraphX() - 1, me.getGraphY() - 1);
- box.grow(mxShape.prototype.svgStrokeTolerance / 2);
-
- if (this.isTableCell(state.cell))
- {
- var row = this.model.getParent(state.cell);
- var table = this.model.getParent(row);
-
- if (!this.isCellSelected(table))
- {
- if ((mxUtils.intersects(box, new mxRectangle(state.x - 2, state.y, 2, state.height)) &&
- this.model.getChildAt(row, 0) != state.cell) || mxUtils.intersects(box,
- new mxRectangle(state.x + state.width - 2, state.y, 2, state.height)))
- {
- cursor ='col-resize';
- }
- else if ((mxUtils.intersects(box, new mxRectangle(state.x, state.y - 2, state.width, 3)) &&
- this.model.getChildAt(table, 0) != row) || mxUtils.intersects(box,
- new mxRectangle(state.x, state.y + state.height - 2, state.width, 3)))
- {
- cursor ='row-resize';
- }
- }
- }
-
- // Hover for swimlane start sizes inside tables
- var current = state;
-
- while (cursor == null && current != null && (this.isTableCell(current.cell) ||
- this.isTableRow(current.cell) || this.isTable(current.cell)))
- {
- if (this.isSwimlane(current.cell))
- {
- var offset = this.getActualStartSize(current.cell);
- var s = this.view.scale;
-
- if ((offset.x > 0 || offset.width > 0) && mxUtils.intersects(box, new mxRectangle(
- current.x + (offset.x - offset.width - 1) * s + ((offset.x == 0) ? current.width * s : 0),
- current.y, 1, current.height)))
- {
- cursor ='col-resize';
- }
- else if ((offset.y > 0 || offset.height > 0) && mxUtils.intersects(box, new mxRectangle(
- current.x, current.y + (offset.y - offset.height - 1) * s + ((offset.y == 0) ? current.height : 0),
- current.width, 1)))
- {
- cursor ='row-resize';
- }
- }
-
- current = this.view.getState(this.model.getParent(current.cell));
- }
- }
-
- if (cursor != null)
- {
- state.setCursor(cursor);
- }
- }
- }
- }
- }),
- mouseUp: mxUtils.bind(this, function(sender, me)
- {
- start.state = null;
- start.event = null;
- start.point = null;
- start.handle = null;
- })
- });
- }
-
- // HTML entities are displayed as plain text in wrapped plain text labels
- this.cellRenderer.getLabelValue = function(state)
- {
- var result = mxCellRenderer.prototype.getLabelValue.apply(this, arguments);
-
- if (state.view.graph.isHtmlLabel(state.cell))
- {
- if (state.style['html'] != 1)
- {
- result = mxUtils.htmlEntities(result, false);
- }
- else
- {
- result = state.view.graph.sanitizeHtml(result);
- }
- }
-
- return result;
- };
-
- // All code below not available and not needed in embed mode
- if (typeof mxVertexHandler !== 'undefined')
- {
- this.setConnectable(true);
- this.setDropEnabled(true);
- this.setPanning(true);
- this.setTooltips(true);
- this.setAllowLoops(true);
- this.allowAutoPanning = true;
- this.resetEdgesOnConnect = false;
- this.constrainChildren = false;
- this.constrainRelativeChildren = true;
-
- // Do not scroll after moving cells
- this.graphHandler.scrollOnMove = false;
- this.graphHandler.scaleGrid = true;
-
- // Disables cloning of connection sources by default
- this.connectionHandler.setCreateTarget(false);
- this.connectionHandler.insertBeforeSource = true;
-
- // Disables built-in connection starts
- this.connectionHandler.isValidSource = function(cell, me)
- {
- return false;
- };
-
- // Sets the style to be used when an elbow edge is double clicked
- this.alternateEdgeStyle = 'vertical';
-
- if (stylesheet == null)
- {
- this.loadStylesheet();
- }
-
- // Adds page centers to the guides for moving cells
- var graphHandlerGetGuideStates = this.graphHandler.getGuideStates;
- this.graphHandler.getGuideStates = function()
- {
- var result = graphHandlerGetGuideStates.apply(this, arguments);
-
- // Create virtual cell state for page centers
- if (this.graph.pageVisible)
- {
- var guides = [];
-
- var pf = this.graph.pageFormat;
- var ps = this.graph.pageScale;
- var pw = pf.width * ps;
- var ph = pf.height * ps;
- var t = this.graph.view.translate;
- var s = this.graph.view.scale;
-
- var layout = this.graph.getPageLayout();
-
- for (var i = 0; i < layout.width; i++)
- {
- guides.push(new mxRectangle(((layout.x + i) * pw + t.x) * s,
- (layout.y * ph + t.y) * s, pw * s, ph * s));
- }
-
- for (var j = 1; j < layout.height; j++)
- {
- guides.push(new mxRectangle((layout.x * pw + t.x) * s,
- ((layout.y + j) * ph + t.y) * s, pw * s, ph * s));
- }
-
- // Page center guides have precedence over normal guides
- result = guides.concat(result);
- }
-
- return result;
- };
-
- // Overrides zIndex for dragElement
- mxDragSource.prototype.dragElementZIndex = mxPopupMenu.prototype.zIndex;
-
- // Overrides color for virtual guides for page centers
- mxGuide.prototype.getGuideColor = function(state, horizontal)
- {
- return (state.cell == null) ? '#ffa500' /* orange */ : mxConstants.GUIDE_COLOR;
- };
-
- // Changes color of move preview for black backgrounds
- this.graphHandler.createPreviewShape = function(bounds)
- {
- this.previewColor = (this.graph.background == '#000000') ? '#ffffff' : mxGraphHandler.prototype.previewColor;
-
- return mxGraphHandler.prototype.createPreviewShape.apply(this, arguments);
- };
-
- // Handles parts of cells by checking if part=1 is in the style and returning the parent
- // if the parent is not already in the list of cells. container style is used to disable
- // step into swimlanes and dropTarget style is used to disable acting as a drop target.
- // LATER: Handle recursive parts
- var graphHandlerGetCells = this.graphHandler.getCells;
-
- this.graphHandler.getCells = function(initialCell)
- {
- var cells = graphHandlerGetCells.apply(this, arguments);
- var lookup = new mxDictionary();
- var newCells = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- // Propagates to composite parents or moves selected table rows
- var cell = (this.graph.isTableCell(initialCell) &&
- this.graph.isTableCell(cells[i]) &&
- this.graph.isCellSelected(cells[i])) ?
- this.graph.model.getParent(cells[i]) :
- ((this.graph.isTableRow(initialCell) &&
- this.graph.isTableRow(cells[i]) &&
- this.graph.isCellSelected(cells[i])) ?
- cells[i] : this.graph.getCompositeParent(cells[i]));
-
- if (cell != null && !lookup.get(cell))
- {
- lookup.put(cell, true);
- newCells.push(cell);
- }
- }
-
- return newCells;
- };
-
- // Handles parts and selected rows in tables of cells for drag and drop
- var graphHandlerStart = this.graphHandler.start;
-
- this.graphHandler.start = function(cell, x, y, cells)
- {
- // Propagates to selected table row to start move
- var ignoreParent = false;
-
- if (this.graph.isTableCell(cell))
- {
- if (!this.graph.isCellSelected(cell))
- {
- cell = this.graph.model.getParent(cell);
- }
- else
- {
- ignoreParent = true;
- }
- }
-
- if (!ignoreParent && (!this.graph.isTableRow(cell) || !this.graph.isCellSelected(cell)))
- {
- cell = this.graph.getCompositeParent(cell);
- }
-
- graphHandlerStart.apply(this, arguments);
- };
-
- // Handles parts of cells when cloning the source for new connections
- this.connectionHandler.createTargetVertex = function(evt, source)
- {
- source = this.graph.getCompositeParent(source);
-
- return mxConnectionHandler.prototype.createTargetVertex.apply(this, arguments);
- };
-
- var rubberband = new mxRubberband(this);
-
- this.getRubberband = function()
- {
- return rubberband;
- };
-
- // Timer-based activation of outline connect in connection handler
- var startTime = new Date().getTime();
- var timeOnTarget = 0;
-
- var connectionHandlerMouseMove = this.connectionHandler.mouseMove;
-
- this.connectionHandler.mouseMove = function()
- {
- var prev = this.currentState;
- connectionHandlerMouseMove.apply(this, arguments);
-
- if (prev != this.currentState)
- {
- startTime = new Date().getTime();
- timeOnTarget = 0;
- }
- else
- {
- timeOnTarget = new Date().getTime() - startTime;
- }
- };
-
- // Activates outline connect after 1500ms with touch event or if alt is pressed inside the shape
- // outlineConnect=0 is a custom style that means do not connect to strokes inside the shape,
- // or in other words, connect to the shape's perimeter if the highlight is under the mouse
- // (the name is because the highlight, including all strokes, is called outline in the code)
- var connectionHandleIsOutlineConnectEvent = this.connectionHandler.isOutlineConnectEvent;
-
- this.connectionHandler.isOutlineConnectEvent = function(me)
- {
- return (this.currentState != null && me.getState() == this.currentState && timeOnTarget > 2000) ||
- ((this.currentState == null || mxUtils.getValue(this.currentState.style, 'outlineConnect', '1') != '0') &&
- connectionHandleIsOutlineConnectEvent.apply(this, arguments));
- };
-
- // Adds shift+click to toggle selection state
- var isToggleEvent = this.isToggleEvent;
- this.isToggleEvent = function(evt)
- {
- return isToggleEvent.apply(this, arguments) || (!mxClient.IS_CHROMEOS && mxEvent.isShiftDown(evt));
- };
-
- // Workaround for Firefox where first mouse down is received
- // after tap and hold if scrollbars are visible, which means
- // start rubberband immediately if no cell is under mouse.
- var isForceRubberBandEvent = rubberband.isForceRubberbandEvent;
- rubberband.isForceRubberbandEvent = function(me)
- {
- return (isForceRubberBandEvent.apply(this, arguments) && !mxEvent.isShiftDown(me.getEvent()) &&
- !mxEvent.isControlDown(me.getEvent())) || (mxClient.IS_CHROMEOS && mxEvent.isShiftDown(me.getEvent())) ||
- (mxUtils.hasScrollbars(this.graph.container) && mxClient.IS_FF &&
- mxClient.IS_WIN && me.getState() == null && mxEvent.isTouchEvent(me.getEvent()));
- };
-
- // Shows hand cursor while panning
- var prevCursor = null;
-
- this.panningHandler.addListener(mxEvent.PAN_START, mxUtils.bind(this, function()
- {
- if (this.isEnabled())
- {
- prevCursor = this.container.style.cursor;
- this.container.style.cursor = 'move';
- }
- }));
-
- this.panningHandler.addListener(mxEvent.PAN_END, mxUtils.bind(this, function()
- {
- if (this.isEnabled())
- {
- this.container.style.cursor = prevCursor;
- }
- }));
-
- this.popupMenuHandler.autoExpand = true;
-
- this.popupMenuHandler.isSelectOnPopup = function(me)
- {
- return mxEvent.isMouseEvent(me.getEvent());
- };
-
- // Handles links if graph is read-only or cell is locked
- var click = this.click;
- this.click = function(me)
- {
- var locked = me.state == null && me.sourceState != null &&
- this.isCellLocked(me.sourceState.cell);
-
- if ((!this.isEnabled() || locked) && !me.isConsumed())
- {
- var cell = (locked) ? me.sourceState.cell : me.getCell();
-
- if (cell != null)
- {
- var link = this.getClickableLinkForCell(cell);
-
- if (link != null)
- {
- if (this.isCustomLink(link))
- {
- this.customLinkClicked(link);
- }
- else
- {
- this.openLink(link);
- }
- }
- }
-
- if (this.isEnabled() && locked)
- {
- this.clearSelection();
- }
- }
- else
- {
- return click.apply(this, arguments);
- }
- };
-
- // Redirects tooltips for locked cells
- this.tooltipHandler.getStateForEvent = function(me)
- {
- return me.sourceState;
- };
-
- // Opens links in tooltips in new windows
- var tooltipHandlerShow = this.tooltipHandler.show;
- this.tooltipHandler.show = function()
- {
- tooltipHandlerShow.apply(this, arguments);
-
- if (this.div != null)
- {
- var links = this.div.getElementsByTagName('a');
-
- for (var i = 0; i < links.length; i++)
- {
- if (links[i].getAttribute('href') != null &&
- links[i].getAttribute('target') == null)
- {
- links[i].setAttribute('target', '_blank');
- }
- }
- }
- };
-
- // Redirects tooltips for locked cells
- this.tooltipHandler.getStateForEvent = function(me)
- {
- return me.sourceState;
- };
-
- // Redirects cursor for locked cells
- var getCursorForMouseEvent = this.getCursorForMouseEvent;
- this.getCursorForMouseEvent = function(me)
- {
- var locked = me.state == null && me.sourceState != null && this.isCellLocked(me.sourceState.cell);
-
- return this.getCursorForCell((locked) ? me.sourceState.cell : me.getCell());
- };
-
- // Shows pointer cursor for clickable cells with links
- // ie. if the graph is disabled and cells cannot be selected
- var getCursorForCell = this.getCursorForCell;
- this.getCursorForCell = function(cell)
- {
- if (!this.isEnabled() || this.isCellLocked(cell))
- {
- var link = this.getClickableLinkForCell(cell);
-
- if (link != null)
- {
- return 'pointer';
- }
- else if (this.isCellLocked(cell))
- {
- return 'default';
- }
- }
-
- return getCursorForCell.apply(this, arguments);
- };
-
- // Changes rubberband selection ignore locked cells
- this.selectRegion = function(rect, evt)
- {
- var cells = this.getCells(rect.x, rect.y, rect.width, rect.height, null, null, null, function(state)
- {
- return mxUtils.getValue(state.style, 'locked', '0') == '1';
- }, true);
-
- this.selectCellsForEvent(cells, evt);
-
- return cells;
- };
-
- // Never removes cells from parents that are being moved
- var graphHandlerShouldRemoveCellsFromParent = this.graphHandler.shouldRemoveCellsFromParent;
- this.graphHandler.shouldRemoveCellsFromParent = function(parent, cells, evt)
- {
- if (this.graph.isCellSelected(parent))
- {
- return false;
- }
-
- return graphHandlerShouldRemoveCellsFromParent.apply(this, arguments);
- };
-
- // Unlocks all cells
- this.isCellLocked = function(cell)
- {
- var pState = this.view.getState(cell);
-
- while (pState != null)
- {
- if (mxUtils.getValue(pState.style, 'locked', '0') == '1')
- {
- return true;
- }
-
- pState = this.view.getState(this.model.getParent(pState.cell));
- }
-
- return false;
- };
-
- var tapAndHoldSelection = null;
-
- // Uses this event to process mouseDown to check the selection state before it is changed
- this.addListener(mxEvent.FIRE_MOUSE_EVENT, mxUtils.bind(this, function(sender, evt)
- {
- if (evt.getProperty('eventName') == 'mouseDown')
- {
- var me = evt.getProperty('event');
- var state = me.getState();
-
- if (state != null && !this.isSelectionEmpty() && !this.isCellSelected(state.cell))
- {
- tapAndHoldSelection = this.getSelectionCells();
- }
- else
- {
- tapAndHoldSelection = null;
- }
- }
- }));
-
- // Tap and hold on background starts rubberband for multiple selected
- // cells the cell associated with the event is deselected
- this.addListener(mxEvent.TAP_AND_HOLD, mxUtils.bind(this, function(sender, evt)
- {
- if (!mxEvent.isMultiTouchEvent(evt))
- {
- var me = evt.getProperty('event');
- var cell = evt.getProperty('cell');
-
- if (cell == null)
- {
- var pt = mxUtils.convertPoint(this.container,
- mxEvent.getClientX(me), mxEvent.getClientY(me));
- rubberband.start(pt.x, pt.y);
- }
- else if (tapAndHoldSelection != null)
- {
- this.addSelectionCells(tapAndHoldSelection);
- }
- else if (this.getSelectionCount() > 1 && this.isCellSelected(cell))
- {
- this.removeSelectionCell(cell);
- }
-
- // Blocks further processing of the event
- tapAndHoldSelection = null;
- evt.consume();
- }
- }));
-
- // On connect the target is selected and we clone the cell of the preview edge for insert
- this.connectionHandler.selectCells = function(edge, target)
- {
- this.graph.setSelectionCell(target || edge);
- };
-
- // Shows connection points only if cell not selected and parent table not handled
- this.connectionHandler.constraintHandler.isStateIgnored = function(state, source)
- {
- var graph = state.view.graph;
-
- return source && (graph.isCellSelected(state.cell) || (graph.isTableRow(state.cell) &&
- graph.selectionCellsHandler.isHandled(graph.model.getParent(state.cell))));
- };
-
- // Updates constraint handler if the selection changes
- this.selectionModel.addListener(mxEvent.CHANGE, mxUtils.bind(this, function()
- {
- var ch = this.connectionHandler.constraintHandler;
-
- if (ch.currentFocus != null && ch.isStateIgnored(ch.currentFocus, true))
- {
- ch.currentFocus = null;
- ch.constraints = null;
- ch.destroyIcons();
- }
-
- ch.destroyFocusHighlight();
- }));
-
- // Initializes touch interface
- if (Graph.touchStyle)
- {
- this.initTouch();
- }
-
- /**
- * Adds locking
- */
- var graphUpdateMouseEvent = this.updateMouseEvent;
- this.updateMouseEvent = function(me)
- {
- me = graphUpdateMouseEvent.apply(this, arguments);
-
- if (me.state != null && this.isCellLocked(me.getCell()))
- {
- me.state = null;
- }
-
- return me;
- };
- }
-
- //Create a unique offset object for each graph instance.
- this.currentTranslate = new mxPoint(0, 0);
-};
-
-/**
- * Specifies if the touch UI should be used (cannot detect touch in FF so always on for Windows/Linux)
- */
-Graph.touchStyle = mxClient.IS_TOUCH || (mxClient.IS_FF && mxClient.IS_WIN) || navigator.maxTouchPoints > 0 ||
- navigator.msMaxTouchPoints > 0 || window.urlParams == null || urlParams['touch'] == '1';
-
-/**
- * Shortcut for capability check.
- */
-Graph.fileSupport = window.File != null && window.FileReader != null && window.FileList != null &&
- (window.urlParams == null || urlParams['filesupport'] != '0');
-
-/**
- * Shortcut for capability check.
- */
-Graph.translateDiagram = urlParams['translate-diagram'] == '1';
-
-/**
- * Shortcut for capability check.
- */
-Graph.diagramLanguage = (urlParams['diagram-language'] != null) ? urlParams['diagram-language'] : mxClient.language;
-
-/**
- * Default size for line jumps.
- */
-Graph.lineJumpsEnabled = true;
-
-/**
- * Default size for line jumps.
- */
-Graph.defaultJumpSize = 6;
-
-/**
- * Minimum width for table columns.
- */
-Graph.minTableColumnWidth = 20;
-
-/**
- * Minimum height for table rows.
- */
-Graph.minTableRowHeight = 20;
-
-/**
- * Text for foreign object warning.
- */
-Graph.foreignObjectWarningText = 'Viewer does not support full SVG 1.1';
-
-/**
- * Link for foreign object warning.
- */
-Graph.foreignObjectWarningLink = 'https://www.diagrams.net/doc/faq/svg-export-text-problems';
-
-/**
- * Minimum height for table rows.
- */
-Graph.pasteStyles = ['rounded', 'shadow', 'dashed', 'dashPattern', 'fontFamily', 'fontSource', 'fontSize', 'fontColor', 'fontStyle',
- 'align', 'verticalAlign', 'strokeColor', 'strokeWidth', 'fillColor', 'gradientColor', 'swimlaneFillColor',
- 'textOpacity', 'gradientDirection', 'glass', 'labelBackgroundColor', 'labelBorderColor', 'opacity',
- 'spacing', 'spacingTop', 'spacingLeft', 'spacingBottom', 'spacingRight', 'endFill', 'endArrow',
- 'endSize', 'targetPerimeterSpacing', 'startFill', 'startArrow', 'startSize', 'sourcePerimeterSpacing',
- 'arcSize', 'comic', 'sketch', 'fillWeight', 'hachureGap', 'hachureAngle', 'jiggle', 'disableMultiStroke',
- 'disableMultiStrokeFill', 'fillStyle', 'curveFitting', 'simplification', 'comicStyle'];
-
-/**
- * Helper function for creating SVG data URI.
- */
-Graph.createSvgImage = function(w, h, data, coordWidth, coordHeight)
-{
- var tmp = unescape(encodeURIComponent(
- '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">' +
- '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="' + w + 'px" height="' + h + 'px" ' +
- ((coordWidth != null && coordHeight != null) ? 'viewBox="0 0 ' + coordWidth + ' ' + coordHeight + '" ' : '') +
- 'version="1.1">' + data + '</svg>'));
-
- return new mxImage('data:image/svg+xml;base64,' + ((window.btoa) ? btoa(tmp) : Base64.encode(tmp, true)), w, h)
-};
-
-/**
- * Removes all illegal control characters with ASCII code <32 except TAB, LF
- * and CR.
- */
-Graph.zapGremlins = function(text)
-{
- var lastIndex = 0;
- var checked = [];
-
- for (var i = 0; i < text.length; i++)
- {
- var code = text.charCodeAt(i);
-
- // Removes all control chars except TAB, LF and CR
- if (!((code >= 32 || code == 9 || code == 10 || code == 13) &&
- code != 0xFFFF && code != 0xFFFE))
- {
- checked.push(text.substring(lastIndex, i));
- lastIndex = i + 1;
- }
- }
-
- if (lastIndex > 0 && lastIndex < text.length)
- {
- checked.push(text.substring(lastIndex));
- }
-
- return (checked.length == 0) ? text : checked.join('');
-};
-
-/**
- * Turns the given string into an array.
- */
-Graph.stringToBytes = function(str)
-{
- var arr = new Array(str.length);
-
- for (var i = 0; i < str.length; i++)
- {
- arr[i] = str.charCodeAt(i);
- }
-
- return arr;
-};
-
-/**
- * Turns the given array into a string.
- */
-Graph.bytesToString = function(arr)
-{
- var result = new Array(arr.length);
-
- for (var i = 0; i < arr.length; i++)
- {
- result[i] = String.fromCharCode(arr[i]);
- }
-
- return result.join('');
-};
-
-/**
- * Turns the given array into a string.
- */
-Graph.base64EncodeUnicode = function(str)
-{
- return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
- return String.fromCharCode(parseInt(p1, 16))
- }));
-};
-
-/**
- * Turns the given array into a string.
- */
-Graph.base64DecodeUnicode = function(str)
-{
- return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
- return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
- }).join(''));
-};
-
-/**
- * Returns a base64 encoded version of the compressed outer XML of the given node.
- */
-Graph.compressNode = function(node, checked)
-{
- var xml = mxUtils.getXml(node);
-
- return Graph.compress((checked) ? xml : Graph.zapGremlins(xml));
-};
-
-/**
- * Returns a base64 encoded version of the compressed string.
- */
-Graph.compress = function(data, deflate)
-{
- if (data == null || data.length == 0 || typeof(pako) === 'undefined')
- {
- return data;
- }
- else
- {
- var tmp = (deflate) ? pako.deflate(encodeURIComponent(data), {to: 'string'}) :
- pako.deflateRaw(encodeURIComponent(data), {to: 'string'});
-
- return (window.btoa) ? btoa(tmp) : Base64.encode(tmp, true);
- }
-};
-
-/**
- * Returns a decompressed version of the base64 encoded string.
- */
-Graph.decompress = function(data, inflate, checked)
-{
- if (data == null || data.length == 0 || typeof(pako) === 'undefined')
- {
- return data;
- }
- else
- {
- var tmp = (window.atob) ? atob(data) : Base64.decode(data, true);
-
- var inflated = decodeURIComponent((inflate) ?
- pako.inflate(tmp, {to: 'string'}) :
- pako.inflateRaw(tmp, {to: 'string'}));
-
- return (checked) ? inflated : Graph.zapGremlins(inflated);
- }
-};
-
-/**
- * Removes formatting from pasted HTML.
- */
-Graph.removePasteFormatting = function(elt)
-{
- while (elt != null)
- {
- if (elt.firstChild != null)
- {
- Graph.removePasteFormatting(elt.firstChild);
- }
-
- if (elt.nodeType == mxConstants.NODETYPE_ELEMENT && elt.style != null)
- {
- elt.style.whiteSpace = '';
-
- if (elt.style.color == '#000000')
- {
- elt.style.color = '';
- }
- }
-
- elt = elt.nextSibling;
- }
-};
-
-/**
- * Sanitizes the given HTML markup.
- */
-Graph.sanitizeHtml = function(value, editing)
-{
- // Uses https://code.google.com/p/google-caja/wiki/JsHtmlSanitizer
- // NOTE: Original minimized sanitizer was modified to support
- // data URIs for images, mailto and special data:-links.
- // LATER: Add MathML to whitelisted tags
- function urlX(link)
- {
- if (link != null && link.toString().toLowerCase().substring(0, 11) !== 'javascript:')
- {
- return link;
- }
-
- return null;
- };
- function idX(id) { return id };
-
- return html_sanitize(value, urlX, idX);
-};
-
-/**
- * Returns the CSS font family from the given computed style.
- */
-Graph.stripQuotes = function(text)
-{
- if (text != null)
- {
- if (text.charAt(0) == '\'')
- {
- text = text.substring(1);
- }
-
- if (text.charAt(text.length - 1) == '\'')
- {
- text = text.substring(0, text.length - 1);
- }
-
- if (text.charAt(0) == '"')
- {
- text = text.substring(1);
- }
-
- if (text.charAt(text.length - 1) == '"')
- {
- text = text.substring(0, text.length - 1);
- }
- }
-
- return text;
-};
-
-/**
- * Returns true if the given string is a link.
- *
- * See https://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-a-url
- */
-Graph.isLink = function(text)
-{
- return text != null && Graph.linkPattern.test(text);
-};
-
-/**
- * Regular expression for links.
- */
-Graph.linkPattern = new RegExp('^(https?:\\/\\/)?'+ // protocol
- '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name
- '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
- '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
- '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
- '(\\#[-a-z\\d_]*)?$','i'); // fragment locator
-
-/**
- * Graph inherits from mxGraph.
- */
-mxUtils.extend(Graph, mxGraph);
-
-/**
- * Allows all values in fit.
- */
-Graph.prototype.minFitScale = null;
-
-/**
- * Allows all values in fit.
- */
-Graph.prototype.maxFitScale = null;
-
-/**
- * Sets the policy for links. Possible values are "self" to replace any framesets,
- * "blank" to load the URL in <linkTarget> and "auto" (default).
- */
-Graph.prototype.linkPolicy = (urlParams['target'] == 'frame') ? 'blank' : (urlParams['target'] || 'auto');
-
-/**
- * Target for links that open in a new window. Default is _blank.
- */
-Graph.prototype.linkTarget = (urlParams['target'] == 'frame') ? '_self' : '_blank';
-
-/**
- * Value to the rel attribute of links. Default is 'nofollow noopener noreferrer'.
- * NOTE: There are security implications when this is changed and if noopener is removed,
- * then <openLink> must be overridden to allow for the opener to be set by default.
- */
-Graph.prototype.linkRelation = 'nofollow noopener noreferrer';
-
-/**
- * Scrollbars are enabled on non-touch devices (not including Firefox because touch events
- * cannot be detected in Firefox, see above).
- */
-Graph.prototype.defaultScrollbars = !mxClient.IS_IOS;
-
-/**
- * Specifies if the page should be visible for new files. Default is true.
- */
-Graph.prototype.defaultPageVisible = true;
-
-/**
- * Specifies if the app should run in chromeless mode. Default is false.
- * This default is only used if the contructor argument is null.
- */
-Graph.prototype.lightbox = false;
-
-/**
- *
- */
-Graph.prototype.defaultPageBackgroundColor = '#ffffff';
-
-/**
- *
- */
-Graph.prototype.defaultPageBorderColor = '#ffffff';
-
-/**
- * Specifies the size of the size for "tiles" to be used for a graph with
- * scrollbars but no visible background page. A good value is large
- * enough to reduce the number of repaints that is caused for auto-
- * translation, which depends on this value, and small enough to give
- * a small empty buffer around the graph. Default is 400x400.
- */
-Graph.prototype.scrollTileSize = new mxRectangle(0, 0, 400, 400);
-
-/**
- * Overrides the background color and paints a transparent background.
- */
-Graph.prototype.transparentBackground = true;
-
-/**
- * Sets global constants.
- */
-Graph.prototype.selectParentAfterDelete = false;
-
-/**
- * Sets the default target for all links in cells.
- */
-Graph.prototype.defaultEdgeLength = 80;
-
-/**
- * Disables move of bends/segments without selecting.
- */
-Graph.prototype.edgeMode = false;
-
-/**
- * Allows all values in fit.
- */
-Graph.prototype.connectionArrowsEnabled = true;
-
-/**
- * Specifies the regular expression for matching placeholders.
- */
-Graph.prototype.placeholderPattern = new RegExp('%(date\{.*\}|[^%^\{^\}]+)%', 'g');
-
-/**
- * Specifies the regular expression for matching placeholders.
- */
-Graph.prototype.absoluteUrlPattern = new RegExp('^(?:[a-z]+:)?//', 'i');
-
-/**
- * Specifies the default name for the theme. Default is 'default'.
- */
-Graph.prototype.defaultThemeName = 'default';
-
-/**
- * Specifies the default name for the theme. Default is 'default'.
- */
-Graph.prototype.defaultThemes = {};
-
-/**
- * Base URL for relative links.
- */
-Graph.prototype.baseUrl = (urlParams['base'] != null) ?
- decodeURIComponent(urlParams['base']) :
- (((window != window.top) ? document.referrer :
- document.location.toString()).split('#')[0]);
-
-/**
- * Specifies if the label should be edited after an insert.
- */
-Graph.prototype.editAfterInsert = false;
-
-/**
- * Defines the built-in properties to be ignored in tooltips.
- */
-Graph.prototype.builtInProperties = ['label', 'tooltip', 'placeholders', 'placeholder'];
-
-/**
- * Defines if the graph is part of an EditorUi. If this is false the graph can
- * be used in an EditorUi instance but will not have a UI added, functions
- * overridden or event handlers added.
- */
-Graph.prototype.standalone = false;
-
-/**
- * Installs child layout styles.
- */
-Graph.prototype.init = function(container)
-{
- mxGraph.prototype.init.apply(this, arguments);
-
- // Intercepts links with no target attribute and opens in new window
- this.cellRenderer.initializeLabel = function(state, shape)
- {
- mxCellRenderer.prototype.initializeLabel.apply(this, arguments);
-
- // Checks tolerance for clicks on links
- var tol = state.view.graph.tolerance;
- var handleClick = true;
- var first = null;
-
- var down = mxUtils.bind(this, function(evt)
- {
- handleClick = true;
- first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
- });
-
- var move = mxUtils.bind(this, function(evt)
- {
- handleClick = handleClick && first != null &&
- Math.abs(first.x - mxEvent.getClientX(evt)) < tol &&
- Math.abs(first.y - mxEvent.getClientY(evt)) < tol;
- });
-
- var up = mxUtils.bind(this, function(evt)
- {
- if (handleClick)
- {
- var elt = mxEvent.getSource(evt)
-
- while (elt != null && elt != shape.node)
- {
- if (elt.nodeName.toLowerCase() == 'a')
- {
- state.view.graph.labelLinkClicked(state, elt, evt);
- break;
- }
-
- elt = elt.parentNode;
- }
- }
- });
-
- mxEvent.addGestureListeners(shape.node, down, move, up);
- mxEvent.addListener(shape.node, 'click', function(evt)
- {
- mxEvent.consume(evt);
- });
- };
-
- this.initLayoutManager();
-};
-
-/**
- * Implements zoom and offset via CSS transforms. This is currently only used
- * in read-only as there are fewer issues with the mxCellState not being scaled
- * and translated.
- *
- * KNOWN ISSUES TO FIX:
- * - Apply CSS transforms to HTML labels in IE11
- */
-(function()
-{
- /**
- * Uses CSS transforms for scale and translate.
- */
- Graph.prototype.useCssTransforms = false;
-
- /**
- * Contains the scale.
- */
- Graph.prototype.currentScale = 1;
-
- /**
- * Contains the offset.
- */
- Graph.prototype.currentTranslate = new mxPoint(0, 0);
-
- /**
- *
- */
- Graph.prototype.getVerticesAndEdges = function(vertices, edges)
- {
- vertices = (vertices != null) ? vertices : true;
- edges = (edges != null) ? edges : true;
- var model = this.model;
-
- return model.filterDescendants(function(cell)
- {
- return (vertices && model.isVertex(cell)) || (edges && model.isEdge(cell));
- }, model.getRoot());
- };
-
- /**
- * Returns the cell for editing the given cell.
- */
- Graph.prototype.getStartEditingCell = function(cell, trigger)
- {
- // Redirect editing for tables
- var style = this.getCellStyle(cell);
- var size = parseInt(mxUtils.getValue(style, mxConstants.STYLE_STARTSIZE, 0));
-
- if (this.isTable(cell) && (!this.isSwimlane(cell) ||
- size == 0) && this.getLabel(cell) == '' &&
- this.model.getChildCount(cell) > 0)
- {
- cell = this.model.getChildAt(cell, 0);
-
- style = this.getCellStyle(cell);
- size = parseInt(mxUtils.getValue(style, mxConstants.STYLE_STARTSIZE, 0));
- }
-
- // Redirect editing for table rows
- if (this.isTableRow(cell) && (!this.isSwimlane(cell) ||
- size == 0) && this.getLabel(cell) == '' &&
- this.model.getChildCount(cell) > 0)
- {
- for (var i = 0; i < this.model.getChildCount(cell); i++)
- {
- var temp = this.model.getChildAt(cell, i);
-
- if (this.isCellEditable(temp))
- {
- cell = temp;
- break;
- }
- }
- }
-
- return cell;
- };
-
- /**
- * Returns true if fast zoom preview should be used.
- */
- Graph.prototype.copyStyle = function(cell)
- {
- var style = null;
-
- if (cell != null)
- {
- style = mxUtils.clone(this.getCurrentCellStyle(cell));
-
- // Handles special case for value "none"
- var cellStyle = this.model.getStyle(cell);
- var tokens = (cellStyle != null) ? cellStyle.split(';') : [];
-
- for (var j = 0; j < tokens.length; j++)
- {
- var tmp = tokens[j];
- var pos = tmp.indexOf('=');
-
- if (pos >= 0)
- {
- var key = tmp.substring(0, pos);
- var value = tmp.substring(pos + 1);
-
- if (style[key] == null && value == mxConstants.NONE)
- {
- style[key] = mxConstants.NONE;
- }
- }
- }
- }
-
- return style;
- };
-
- /**
- * Returns true if fast zoom preview should be used.
- */
- Graph.prototype.pasteStyle = function(style, cells, keys)
- {
- keys = (keys != null) ? keys : Graph.pasteStyles;
-
- this.model.beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- var temp = this.getCurrentCellStyle(cells[i]);
-
- for (var j = 0; j < keys.length; j++)
- {
- var current = temp[keys[j]];
- var value = style[keys[j]];
-
- if (current != value && (current != null || value != mxConstants.NONE))
- {
- this.setCellStyles(keys[j], value, [cells[i]]);
- }
- }
- }
- }
- finally
- {
- this.model.endUpdate();
- }
- };
-
- /**
- * Returns true if fast zoom preview should be used.
- */
- Graph.prototype.isFastZoomEnabled = function()
- {
- return urlParams['zoom'] != 'nocss' && !mxClient.NO_FO && !mxClient.IS_EDGE &&
- !this.useCssTransforms && this.isCssTransformsSupported();
- };
-
- /**
- * Only foreignObject supported for now (no IE11). Safari disabled as it ignores
- * overflow visible on foreignObject in negative space (lightbox and viewer).
- * Check the following test case on page 1 before enabling this in production:
- * https://devhost.jgraph.com/git/drawio/etc/embed/sf-math-fo-clipping.html?dev=1
- */
- Graph.prototype.isCssTransformsSupported = function()
- {
- return this.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO &&
- (!this.lightbox || !mxClient.IS_SF);
- };
-
- /**
- * Function: getCellAt
- *
- * Needs to modify original method for recursive call.
- */
- Graph.prototype.getCellAt = function(x, y, parent, vertices, edges, ignoreFn)
- {
- if (this.useCssTransforms)
- {
- x = x / this.currentScale - this.currentTranslate.x;
- y = y / this.currentScale - this.currentTranslate.y;
- }
-
- return this.getScaledCellAt.apply(this, arguments);
- };
-
- /**
- * Function: getScaledCellAt
- *
- * Overridden for recursion.
- */
- Graph.prototype.getScaledCellAt = function(x, y, parent, vertices, edges, ignoreFn)
- {
- vertices = (vertices != null) ? vertices : true;
- edges = (edges != null) ? edges : true;
-
- if (parent == null)
- {
- parent = this.getCurrentRoot();
-
- if (parent == null)
- {
- parent = this.getModel().getRoot();
- }
- }
-
- if (parent != null)
- {
- var childCount = this.model.getChildCount(parent);
-
- for (var i = childCount - 1; i >= 0; i--)
- {
- var cell = this.model.getChildAt(parent, i);
- var result = this.getScaledCellAt(x, y, cell, vertices, edges, ignoreFn);
-
- if (result != null)
- {
- return result;
- }
- else if (this.isCellVisible(cell) && (edges && this.model.isEdge(cell) ||
- vertices && this.model.isVertex(cell)))
- {
- var state = this.view.getState(cell);
-
- if (state != null && (ignoreFn == null || !ignoreFn(state, x, y)) &&
- this.intersects(state, x, y))
- {
- return cell;
- }
- }
- }
- }
-
- return null;
- };
-
- /**
- * Returns if the child cells of the given vertex cell state should be resized.
- */
- Graph.prototype.isRecursiveVertexResize = function(state)
- {
- return !this.isSwimlane(state.cell) && this.model.getChildCount(state.cell) > 0 &&
- !this.isCellCollapsed(state.cell) && mxUtils.getValue(state.style, 'recursiveResize', '1') == '1' &&
- mxUtils.getValue(state.style, 'childLayout', null) == null;
- }
-
- /**
- * Returns the first parent that is not a part.
- */
- Graph.prototype.isPart = function(cell)
- {
- return mxUtils.getValue(this.getCurrentCellStyle(cell), 'part', '0') == '1' ||
- this.isTableCell(cell) || this.isTableRow(cell);
- };
-
- /**
- * Returns the first parent that is not a part.
- */
- Graph.prototype.getCompositeParent = function(cell)
- {
- while (this.isPart(cell))
- {
- var temp = this.model.getParent(cell);
-
- if (!this.model.isVertex(temp))
- {
- break;
- }
-
- cell = temp;
- }
-
- return cell;
- };
-
- /**
- * Function: repaint
- *
- * Updates the highlight after a change of the model or view.
- */
- mxCellHighlight.prototype.getStrokeWidth = function(state)
- {
- var s = this.strokeWidth;
-
- if (this.graph.useCssTransforms)
- {
- s /= this.graph.currentScale;
- }
-
- return s;
- };
-
- /**
- * Function: getGraphBounds
- *
- * Overrides getGraphBounds to use bounding box from SVG.
- */
- mxGraphView.prototype.getGraphBounds = function()
- {
- var b = this.graphBounds;
-
- if (this.graph.useCssTransforms)
- {
- var t = this.graph.currentTranslate;
- var s = this.graph.currentScale;
-
- b = new mxRectangle(
- (b.x + t.x) * s, (b.y + t.y) * s,
- b.width * s, b.height * s);
- }
-
- return b;
- };
-
- /**
- * Overrides to bypass full cell tree validation.
- * TODO: Check if this improves performance
- */
- mxGraphView.prototype.viewStateChanged = function()
- {
- if (this.graph.useCssTransforms)
- {
- this.validate();
- this.graph.sizeDidChange();
- }
- else
- {
- this.revalidate();
- this.graph.sizeDidChange();
- }
- };
-
- /**
- * Overrides validate to normalize validation view state and pass
- * current state to CSS transform.
- */
- var graphViewValidate = mxGraphView.prototype.validate;
- mxGraphView.prototype.validate = function(cell)
- {
- if (this.graph.useCssTransforms)
- {
- this.graph.currentScale = this.scale;
- this.graph.currentTranslate.x = this.translate.x;
- this.graph.currentTranslate.y = this.translate.y;
-
- this.scale = 1;
- this.translate.x = 0;
- this.translate.y = 0;
- }
-
- graphViewValidate.apply(this, arguments);
-
- if (this.graph.useCssTransforms)
- {
- this.graph.updateCssTransform();
-
- this.scale = this.graph.currentScale;
- this.translate.x = this.graph.currentTranslate.x;
- this.translate.y = this.graph.currentTranslate.y;
- }
- };
-
- /**
- * Overrides function to exclude table cells and rows from groups.
- */
- var graphGetCellsForGroup = mxGraph.prototype.getCellsForGroup;
- Graph.prototype.getCellsForGroup = function(cells)
- {
- cells = graphGetCellsForGroup.apply(this, arguments);
- var result = [];
-
- // Filters selection cells with the same parent
- for (var i = 0; i < cells.length; i++)
- {
- if (!this.isTableRow(cells[i]) &&
- !this.isTableCell(cells[i]))
- {
- result.push(cells[i]);
- }
- }
-
- return result;
- };
-
- /**
- * Overrides function to exclude tables, rows and cells from ungrouping.
- */
- var graphGetCellsForUngroup = mxGraph.prototype.getCellsForUngroup;
- Graph.prototype.getCellsForUngroup = function(cells)
- {
- cells = graphGetCellsForUngroup.apply(this, arguments);
- var result = [];
-
- // Filters selection cells with the same parent
- for (var i = 0; i < cells.length; i++)
- {
- if (!this.isTable(cells[i]) &&
- !this.isTableRow(cells[i]) &&
- !this.isTableCell(cells[i]))
- {
- result.push(cells[i]);
- }
- }
-
- return result;
- };
-
- /**
- * Function: updateCssTransform
- *
- * Zooms out of the graph by <zoomFactor>.
- */
- Graph.prototype.updateCssTransform = function()
- {
- var temp = this.view.getDrawPane();
-
- if (temp != null)
- {
- var g = temp.parentNode;
-
- if (!this.useCssTransforms)
- {
- g.removeAttribute('transformOrigin');
- g.removeAttribute('transform');
- }
- else
- {
- var prev = g.getAttribute('transform');
- g.setAttribute('transformOrigin', '0 0');
- var s = Math.round(this.currentScale * 100) / 100;
- var dx = Math.round(this.currentTranslate.x * 100) / 100;
- var dy = Math.round(this.currentTranslate.y * 100) / 100;
- g.setAttribute('transform', 'scale(' + s + ',' + s + ')' +
- 'translate(' + dx + ',' + dy + ')');
-
- // Applies workarounds only if translate has changed
- if (prev != g.getAttribute('transform'))
- {
- try
- {
- // Applies transform to labels outside of the SVG DOM
- // Excluded via isCssTransformsSupported
- // if (mxClient.NO_FO)
- // {
- // var transform = 'scale(' + this.currentScale + ')' + 'translate(' +
- // this.currentTranslate.x + 'px,' + this.currentTranslate.y + 'px)';
- //
- // this.view.states.visit(mxUtils.bind(this, function(cell, state)
- // {
- // if (state.text != null && state.text.node != null)
- // {
- // // Stores initial CSS transform that is used for the label alignment
- // if (state.text.originalTransform == null)
- // {
- // state.text.originalTransform = state.text.node.style.transform;
- // }
- //
- // state.text.node.style.transform = transform + state.text.originalTransform;
- // }
- // }));
- // }
- // Workaround for https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/4320441/
- if (mxClient.IS_EDGE)
- {
- // Recommended workaround is to do this on all
- // foreignObjects, but this seems to be faster
- var val = g.style.display;
- g.style.display = 'none';
- g.getBBox();
- g.style.display = val;
- }
- }
- catch (e)
- {
- // ignore
- }
- }
- }
- }
- };
-
- var graphViewValidateBackgroundPage = mxGraphView.prototype.validateBackgroundPage;
- mxGraphView.prototype.validateBackgroundPage = function()
- {
- var useCssTranforms = this.graph.useCssTransforms, scale = this.scale,
- translate = this.translate;
-
- if (useCssTranforms)
- {
- this.scale = this.graph.currentScale;
- this.translate = this.graph.currentTranslate;
- }
-
- graphViewValidateBackgroundPage.apply(this, arguments);
-
- if (useCssTranforms)
- {
- this.scale = scale;
- this.translate = translate;
- }
- };
-
- var graphUpdatePageBreaks = mxGraph.prototype.updatePageBreaks;
- mxGraph.prototype.updatePageBreaks = function(visible, width, height)
- {
- var useCssTranforms = this.useCssTransforms, scale = this.view.scale,
- translate = this.view.translate;
-
- if (useCssTranforms)
- {
- this.view.scale = 1;
- this.view.translate = new mxPoint(0, 0);
- this.useCssTransforms = false;
- }
-
- graphUpdatePageBreaks.apply(this, arguments);
-
- if (useCssTranforms)
- {
- this.view.scale = scale;
- this.view.translate = translate;
- this.useCssTransforms = true;
- }
- };
-})();
-
-/**
- * Sets the XML node for the current diagram.
- */
-Graph.prototype.isLightboxView = function()
-{
- return this.lightbox;
-};
-
-/**
- * Sets the XML node for the current diagram.
- */
-Graph.prototype.isViewer = function()
-{
- return false;
-};
-
-/**
- * Installs automatic layout via styles
- */
-Graph.prototype.labelLinkClicked = function(state, elt, evt)
-{
- var href = elt.getAttribute('href');
-
- if (href != null && !this.isCustomLink(href) && ((mxEvent.isLeftMouseButton(evt) &&
- !mxEvent.isPopupTrigger(evt)) || mxEvent.isTouchEvent(evt)))
- {
- if (!this.isEnabled() || this.isCellLocked(state.cell))
- {
- var target = this.isBlankLink(href) ? this.linkTarget : '_top';
- this.openLink(this.getAbsoluteUrl(href), target);
- }
-
- mxEvent.consume(evt);
- }
-};
-
-/**
- * Returns the size of the page format scaled with the page size.
- */
-Graph.prototype.openLink = function(href, target, allowOpener)
-{
- var result = window;
-
- try
- {
- // Workaround for blocking in same iframe
- if (target == '_self' && window != window.top)
- {
- window.location.href = href;
- }
- else
- {
- // Avoids page reload for anchors (workaround for IE but used everywhere)
- if (href.substring(0, this.baseUrl.length) == this.baseUrl &&
- href.charAt(this.baseUrl.length) == '#' &&
- target == '_top' && window == window.top)
- {
- var hash = href.split('#')[1];
-
- // Forces navigation if on same hash
- if (window.location.hash == '#' + hash)
- {
- window.location.hash = '';
- }
-
- window.location.hash = hash;
- }
- else
- {
- result = window.open(href, (target != null) ? target : '_blank');
-
- if (result != null && !allowOpener)
- {
- result.opener = null;
- }
- }
- }
- }
- catch (e)
- {
- // ignores permission denied
- }
-
- return result;
-};
-
-/**
- * Adds support for page links.
- */
-Graph.prototype.getLinkTitle = function(href)
-{
- return href.substring(href.lastIndexOf('/') + 1);
-};
-
-/**
- * Adds support for page links.
- */
-Graph.prototype.isCustomLink = function(href)
-{
- return href.substring(0, 5) == 'data:';
-};
-
-/**
- * Adds support for page links.
- */
-Graph.prototype.customLinkClicked = function(link)
-{
- return false;
-};
-
-/**
- * Returns true if the given href references an external protocol that
- * should never open in a new window. Default returns true for mailto.
- */
-Graph.prototype.isExternalProtocol = function(href)
-{
- return href.substring(0, 7) === 'mailto:';
-};
-
-/**
- * Hook for links to open in same window. Default returns true for anchors,
- * links to same domain or if target == 'self' in the config.
- */
-Graph.prototype.isBlankLink = function(href)
-{
- return !this.isExternalProtocol(href) &&
- (this.linkPolicy === 'blank' ||
- (this.linkPolicy !== 'self' &&
- !this.isRelativeUrl(href) &&
- href.substring(0, this.domainUrl.length) !== this.domainUrl));
-};
-
-/**
- *
- */
-Graph.prototype.isRelativeUrl = function(url)
-{
- return url != null && !this.absoluteUrlPattern.test(url) &&
- url.substring(0, 5) !== 'data:' &&
- !this.isExternalProtocol(url);
-};
-
-/**
- *
- */
-Graph.prototype.getAbsoluteUrl = function(url)
-{
- if (url != null && this.isRelativeUrl(url))
- {
- if (url.charAt(0) == '#')
- {
- url = this.baseUrl + url;
- }
- else if (url.charAt(0) == '/')
- {
- url = this.domainUrl + url;
- }
- else
- {
- url = this.domainPathUrl + url;
- }
- }
-
- return url;
-};
-
-/**
- * Installs automatic layout via styles
- */
-Graph.prototype.initLayoutManager = function()
-{
- this.layoutManager = new mxLayoutManager(this);
-
- this.layoutManager.hasLayout = function(cell, eventName)
- {
- return this.graph.getCellStyle(cell)['childLayout'] != null;
- };
-
- this.layoutManager.getLayout = function(cell, eventName)
- {
- var parent = this.graph.model.getParent(cell);
-
- // Executes layouts from top to bottom except for nested layouts where
- // child layouts are executed before and after the parent layout runs
- // in case the layout changes the size of the child cell
- if (eventName != mxEvent.BEGIN_UPDATE || this.hasLayout(parent, eventName))
- {
- var style = this.graph.getCellStyle(cell);
-
- if (style['childLayout'] == 'stackLayout')
- {
- var stackLayout = new mxStackLayout(this.graph, true);
- stackLayout.resizeParentMax = mxUtils.getValue(style, 'resizeParentMax', '1') == '1';
- stackLayout.horizontal = mxUtils.getValue(style, 'horizontalStack', '1') == '1';
- stackLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1';
- stackLayout.resizeLast = mxUtils.getValue(style, 'resizeLast', '0') == '1';
- stackLayout.spacing = style['stackSpacing'] || stackLayout.spacing;
- stackLayout.border = style['stackBorder'] || stackLayout.border;
- stackLayout.marginLeft = style['marginLeft'] || 0;
- stackLayout.marginRight = style['marginRight'] || 0;
- stackLayout.marginTop = style['marginTop'] || 0;
- stackLayout.marginBottom = style['marginBottom'] || 0;
- stackLayout.allowGaps = style['allowGaps'] || 0;
- stackLayout.fill = true;
-
- if (stackLayout.allowGaps)
- {
- stackLayout.gridSize = parseFloat(mxUtils.getValue(style, 'stackUnitSize', 20));
- }
-
- return stackLayout;
- }
- else if (style['childLayout'] == 'treeLayout')
- {
- var treeLayout = new mxCompactTreeLayout(this.graph);
- treeLayout.horizontal = mxUtils.getValue(style, 'horizontalTree', '1') == '1';
- treeLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1';
- treeLayout.groupPadding = mxUtils.getValue(style, 'parentPadding', 20);
- treeLayout.levelDistance = mxUtils.getValue(style, 'treeLevelDistance', 30);
- treeLayout.maintainParentLocation = true;
- treeLayout.edgeRouting = false;
- treeLayout.resetEdges = false;
-
- return treeLayout;
- }
- else if (style['childLayout'] == 'flowLayout')
- {
- var flowLayout = new mxHierarchicalLayout(this.graph, mxUtils.getValue(style,
- 'flowOrientation', mxConstants.DIRECTION_EAST));
- flowLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1';
- flowLayout.parentBorder = mxUtils.getValue(style, 'parentPadding', 20);
- flowLayout.maintainParentLocation = true;
-
- // Special undocumented styles for changing the hierarchical
- flowLayout.intraCellSpacing = mxUtils.getValue(style, 'intraCellSpacing',
- mxHierarchicalLayout.prototype.intraCellSpacing);
- flowLayout.interRankCellSpacing = mxUtils.getValue(style, 'interRankCellSpacing',
- mxHierarchicalLayout.prototype.interRankCellSpacing);
- flowLayout.interHierarchySpacing = mxUtils.getValue(style, 'interHierarchySpacing',
- mxHierarchicalLayout.prototype.interHierarchySpacing);
- flowLayout.parallelEdgeSpacing = mxUtils.getValue(style, 'parallelEdgeSpacing',
- mxHierarchicalLayout.prototype.parallelEdgeSpacing);
-
- return flowLayout;
- }
- else if (style['childLayout'] == 'circleLayout')
- {
- return new mxCircleLayout(this.graph);
- }
- else if (style['childLayout'] == 'organicLayout')
- {
- return new mxFastOrganicLayout(this.graph);
- }
- else if (style['childLayout'] == 'tableLayout')
- {
- return new TableLayout(this.graph);
- }
- }
-
- return null;
- };
-};
-
-/**
- * Returns the size of the page format scaled with the page size.
- */
-Graph.prototype.getPageSize = function()
-{
- return (this.pageVisible) ? new mxRectangle(0, 0, this.pageFormat.width * this.pageScale,
- this.pageFormat.height * this.pageScale) : this.scrollTileSize;
-};
-
-/**
- * Returns a rectangle describing the position and count of the
- * background pages, where x and y are the position of the top,
- * left page and width and height are the vertical and horizontal
- * page count.
- */
-Graph.prototype.getPageLayout = function()
-{
- var size = this.getPageSize();
- var bounds = this.getGraphBounds();
-
- if (bounds.width == 0 || bounds.height == 0)
- {
- return new mxRectangle(0, 0, 1, 1);
- }
- else
- {
- var x0 = Math.floor(Math.ceil(bounds.x / this.view.scale -
- this.view.translate.x) / size.width);
- var y0 = Math.floor(Math.ceil(bounds.y / this.view.scale -
- this.view.translate.y) / size.height);
- var w0 = Math.ceil((Math.floor((bounds.x + bounds.width) / this.view.scale) -
- this.view.translate.x) / size.width) - x0;
- var h0 = Math.ceil((Math.floor((bounds.y + bounds.height) / this.view.scale) -
- this.view.translate.y) / size.height) - y0;
-
- return new mxRectangle(x0, y0, w0, h0);
- }
-};
-
-/**
- * Sanitizes the given HTML markup.
- */
-Graph.prototype.sanitizeHtml = function(value, editing)
-{
- return Graph.sanitizeHtml(value, editing);
-};
-
-/**
- * Revalidates all cells with placeholders in the current graph model.
- */
-Graph.prototype.updatePlaceholders = function()
-{
- var model = this.model;
- var validate = false;
-
- for (var key in this.model.cells)
- {
- var cell = this.model.cells[key];
-
- if (this.isReplacePlaceholders(cell))
- {
- this.view.invalidate(cell, false, false);
- validate = true;
- }
- }
-
- if (validate)
- {
- this.view.validate();
- }
-};
-
-/**
- * Adds support for placeholders in labels.
- */
-Graph.prototype.isReplacePlaceholders = function(cell)
-{
- return cell.value != null && typeof(cell.value) == 'object' &&
- cell.value.getAttribute('placeholders') == '1';
-};
-
-/**
- * Returns true if the given mouse wheel event should be used for zooming. This
- * is invoked if no dialogs are showing and returns true with Alt or Control
- * (or cmd in macOS only) is pressed.
- */
-Graph.prototype.isZoomWheelEvent = function(evt)
-{
- return mxEvent.isAltDown(evt) || (mxEvent.isMetaDown(evt) && mxClient.IS_MAC) ||
- mxEvent.isControlDown(evt);
-};
-
-/**
- * Returns true if the given scroll wheel event should be used for scrolling.
- */
-Graph.prototype.isScrollWheelEvent = function(evt)
-{
- return !this.isZoomWheelEvent(evt);
-};
-
-/**
- * Adds Alt+click to select cells behind cells (Shift+Click on Chrome OS).
- */
-Graph.prototype.isTransparentClickEvent = function(evt)
-{
- return mxEvent.isAltDown(evt) || (mxClient.IS_CHROMEOS && mxEvent.isShiftDown(evt));
-};
-
-/**
- * Adds ctrl+shift+connect to disable connections.
- */
-Graph.prototype.isIgnoreTerminalEvent = function(evt)
-{
- return mxEvent.isShiftDown(evt) && mxEvent.isControlDown(evt);
-};
-
-/**
- * Adds support for placeholders in labels.
- */
-Graph.prototype.isSplitTarget = function(target, cells, evt)
-{
- return !this.model.isEdge(cells[0]) &&
- !mxEvent.isAltDown(evt) && !mxEvent.isShiftDown(evt) &&
- mxGraph.prototype.isSplitTarget.apply(this, arguments);
-};
-
-/**
- * Adds support for placeholders in labels.
- */
-Graph.prototype.getLabel = function(cell)
-{
- var result = mxGraph.prototype.getLabel.apply(this, arguments);
-
- if (result != null && this.isReplacePlaceholders(cell) && cell.getAttribute('placeholder') == null)
- {
- result = this.replacePlaceholders(cell, result);
- }
-
- return result;
-};
-
-/**
- * Adds labelMovable style.
- */
-Graph.prototype.isLabelMovable = function(cell)
-{
- var style = this.getCurrentCellStyle(cell);
-
- return !this.isCellLocked(cell) &&
- ((this.model.isEdge(cell) && this.edgeLabelsMovable) ||
- (this.model.isVertex(cell) && (this.vertexLabelsMovable ||
- mxUtils.getValue(style, 'labelMovable', '0') == '1')));
-};
-
-/**
- * Adds event if grid size is changed.
- */
-Graph.prototype.setGridSize = function(value)
-{
- this.gridSize = value;
- this.fireEvent(new mxEventObject('gridSizeChanged'));
-};
-
-/**
- * Adds event if default parent is changed.
- */
-Graph.prototype.setDefaultParent = function(cell)
-{
- this.defaultParent = cell;
- this.fireEvent(new mxEventObject('defaultParentChanged'));
-};
-
-/**
- * Function: getClickableLinkForCell
- *
- * Returns the first non-null link for the cell or its ancestors.
- *
- * Parameters:
- *
- * cell - <mxCell> whose link should be returned.
- */
-Graph.prototype.getClickableLinkForCell = function(cell)
-{
- do
- {
- var link = this.getLinkForCell(cell);
-
- if (link != null)
- {
- return link;
- }
-
- cell = this.model.getParent(cell);
- } while (cell != null);
-
- return null;
-};
-
-/**
- * Private helper method.
- */
-Graph.prototype.getGlobalVariable = function(name)
-{
- var val = null;
-
- if (name == 'date')
- {
- val = new Date().toLocaleDateString();
- }
- else if (name == 'time')
- {
- val = new Date().toLocaleTimeString();
- }
- else if (name == 'timestamp')
- {
- val = new Date().toLocaleString();
- }
- else if (name.substring(0, 5) == 'date{')
- {
- var fmt = name.substring(5, name.length - 1);
- val = this.formatDate(new Date(), fmt);
- }
-
- return val;
-};
-
-/**
- * Formats a date, see http://blog.stevenlevithan.com/archives/date-time-format
- */
-Graph.prototype.formatDate = function(date, mask, utc)
-{
- // LATER: Cache regexs
- if (this.dateFormatCache == null)
- {
- this.dateFormatCache = {
- i18n: {
- dayNames: [
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
- "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
- ],
- monthNames: [
- "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
- "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
- ]
- },
-
- masks: {
- "default": "ddd mmm dd yyyy HH:MM:ss",
- shortDate: "m/d/yy",
- mediumDate: "mmm d, yyyy",
- longDate: "mmmm d, yyyy",
- fullDate: "dddd, mmmm d, yyyy",
- shortTime: "h:MM TT",
- mediumTime: "h:MM:ss TT",
- longTime: "h:MM:ss TT Z",
- isoDate: "yyyy-mm-dd",
- isoTime: "HH:MM:ss",
- isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
- isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
- }
- };
- }
-
- var dF = this.dateFormatCache;
- var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
- timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
- timezoneClip = /[^-+\dA-Z]/g,
- pad = function (val, len) {
- val = String(val);
- len = len || 2;
- while (val.length < len) val = "0" + val;
- return val;
- };
-
- // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
- if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
- mask = date;
- date = undefined;
- }
-
- // Passing date through Date applies Date.parse, if necessary
- date = date ? new Date(date) : new Date;
- if (isNaN(date)) throw SyntaxError("invalid date");
-
- mask = String(dF.masks[mask] || mask || dF.masks["default"]);
-
- // Allow setting the utc argument via the mask
- if (mask.slice(0, 4) == "UTC:") {
- mask = mask.slice(4);
- utc = true;
- }
-
- var _ = utc ? "getUTC" : "get",
- d = date[_ + "Date"](),
- D = date[_ + "Day"](),
- m = date[_ + "Month"](),
- y = date[_ + "FullYear"](),
- H = date[_ + "Hours"](),
- M = date[_ + "Minutes"](),
- s = date[_ + "Seconds"](),
- L = date[_ + "Milliseconds"](),
- o = utc ? 0 : date.getTimezoneOffset(),
- flags = {
- d: d,
- dd: pad(d),
- ddd: dF.i18n.dayNames[D],
- dddd: dF.i18n.dayNames[D + 7],
- m: m + 1,
- mm: pad(m + 1),
- mmm: dF.i18n.monthNames[m],
- mmmm: dF.i18n.monthNames[m + 12],
- yy: String(y).slice(2),
- yyyy: y,
- h: H % 12 || 12,
- hh: pad(H % 12 || 12),
- H: H,
- HH: pad(H),
- M: M,
- MM: pad(M),
- s: s,
- ss: pad(s),
- l: pad(L, 3),
- L: pad(L > 99 ? Math.round(L / 10) : L),
- t: H < 12 ? "a" : "p",
- tt: H < 12 ? "am" : "pm",
- T: H < 12 ? "A" : "P",
- TT: H < 12 ? "AM" : "PM",
- Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
- o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
- S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
- };
-
- return mask.replace(token, function ($0)
- {
- return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
- });
-};
-
-/**
- *
- */
-Graph.prototype.createLayersDialog = function(onchange)
-{
- var div = document.createElement('div');
- div.style.position = 'absolute';
-
- var model = this.getModel();
- var childCount = model.getChildCount(model.root);
-
- for (var i = 0; i < childCount; i++)
- {
- (mxUtils.bind(this, function(layer)
- {
- var span = document.createElement('div');
- span.style.overflow = 'hidden';
- span.style.textOverflow = 'ellipsis';
- span.style.padding = '2px';
- span.style.whiteSpace = 'nowrap';
-
- var cb = document.createElement('input');
- cb.style.display = 'inline-block';
- cb.setAttribute('type', 'checkbox');
-
- if (model.isVisible(layer))
- {
- cb.setAttribute('checked', 'checked');
- cb.defaultChecked = true;
- }
-
- span.appendChild(cb);
-
- var title = this.convertValueToString(layer) || (mxResources.get('background') || 'Background');
- span.setAttribute('title', title);
- mxUtils.write(span, title);
- div.appendChild(span);
-
- mxEvent.addListener(cb, 'click', function()
- {
- if (cb.getAttribute('checked') != null)
- {
- cb.removeAttribute('checked');
- }
- else
- {
- cb.setAttribute('checked', 'checked');
- }
-
- model.setVisible(layer, cb.checked);
-
- if (onchange != null)
- {
- onchange(layer);
- }
- });
- })(model.getChildAt(model.root, i)));
- }
-
- return div;
-};
-
-/**
- * Private helper method.
- */
-Graph.prototype.replacePlaceholders = function(cell, str, vars, translate)
-{
- var result = [];
-
- if (str != null)
- {
- var last = 0;
-
- while (match = this.placeholderPattern.exec(str))
- {
- var val = match[0];
-
- if (val.length > 2 && val != '%label%' && val != '%tooltip%')
- {
- var tmp = null;
-
- if (match.index > last && str.charAt(match.index - 1) == '%')
- {
- tmp = val.substring(1);
- }
- else
- {
- var name = val.substring(1, val.length - 1);
-
- // Workaround for invalid char for getting attribute in older versions of IE
- if (name == 'id')
- {
- tmp = cell.id;
- }
- else if (name.indexOf('{') < 0)
- {
- var current = cell;
-
- while (tmp == null && current != null)
- {
- if (current.value != null && typeof(current.value) == 'object')
- {
- if (Graph.translateDiagram && Graph.diagramLanguage != null)
- {
- tmp = current.getAttribute(name + '_' + Graph.diagramLanguage);
- }
-
- if (tmp == null)
- {
- tmp = (current.hasAttribute(name)) ? ((current.getAttribute(name) != null) ?
- current.getAttribute(name) : '') : null;
- }
- }
-
- current = this.model.getParent(current);
- }
- }
-
- if (tmp == null)
- {
- tmp = this.getGlobalVariable(name);
- }
-
- if (tmp == null && vars != null)
- {
- tmp = vars[name];
- }
- }
-
- result.push(str.substring(last, match.index) + ((tmp != null) ? tmp : val));
- last = match.index + val.length;
- }
- }
-
- result.push(str.substring(last));
- }
-
- return result.join('');
-};
-
-/**
- * Resolves the given cells in the model and selects them.
- */
-Graph.prototype.restoreSelection = function(cells)
-{
- if (cells != null && cells.length > 0)
- {
- var temp = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- var newCell = this.model.getCell(cells[i].id);
-
- if (newCell != null)
- {
- temp.push(newCell);
- }
- }
-
- this.setSelectionCells(temp);
- }
- else
- {
- this.clearSelection();
- }
-};
-
-/**
- * Selects cells for connect vertex return value.
- */
-Graph.prototype.selectCellsForConnectVertex = function(cells, evt, hoverIcons)
-{
- // Selects only target vertex if one exists
- if (cells.length == 2 && this.model.isVertex(cells[1]))
- {
- this.setSelectionCell(cells[1]);
- this.scrollCellToVisible(cells[1]);
-
- if (hoverIcons != null)
- {
- // Adds hover icons for cloned vertex or hides icons
- if (mxEvent.isTouchEvent(evt))
- {
- hoverIcons.update(hoverIcons.getState(this.view.getState(cells[1])));
- }
- else
- {
- hoverIcons.reset();
- }
- }
- }
- else
- {
- this.setSelectionCells(cells);
- }
-};
-
-/**
- * Never connects children in stack layouts or tables.
- */
-Graph.prototype.isCloneConnectSource = function(source)
-{
- var layout = null;
-
- if (this.layoutManager != null)
- {
- layout = this.layoutManager.getLayout(this.model.getParent(source));
- }
-
- return this.isTableRow(source) || this.isTableCell(source) ||
- (layout != null && layout.constructor == mxStackLayout);
-};
-
-/**
- * Adds a connection to the given vertex.
- */
-Graph.prototype.connectVertex = function(source, direction, length, evt, forceClone, ignoreCellAt, createTarget, done)
-{
- ignoreCellAt = (ignoreCellAt) ? ignoreCellAt : false;
-
- // Ignores relative edge labels
- if (source.geometry.relative && this.model.isEdge(source.parent))
- {
- return [];
- }
-
- // Uses parent for relative child cells
- while (source.geometry.relative && this.model.isVertex(source.parent))
- {
- source = source.parent;
- }
-
- // Handles clone connect sources
- var cloneSource = this.isCloneConnectSource(source);
- var composite = (cloneSource) ? source : this.getCompositeParent(source);
-
- var pt = (source.geometry.relative && source.parent.geometry != null) ?
- new mxPoint(source.parent.geometry.width * source.geometry.x,
- source.parent.geometry.height * source.geometry.y) :
- new mxPoint(composite.geometry.x, composite.geometry.y);
-
- if (direction == mxConstants.DIRECTION_NORTH)
- {
- pt.x += composite.geometry.width / 2;
- pt.y -= length ;
- }
- else if (direction == mxConstants.DIRECTION_SOUTH)
- {
- pt.x += composite.geometry.width / 2;
- pt.y += composite.geometry.height + length;
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- pt.x -= length;
- pt.y += composite.geometry.height / 2;
- }
- else
- {
- pt.x += composite.geometry.width + length;
- pt.y += composite.geometry.height / 2;
- }
-
- var parentState = this.view.getState(this.model.getParent(source));
- var s = this.view.scale;
- var t = this.view.translate;
- var dx = t.x * s;
- var dy = t.y * s;
-
- if (parentState != null && this.model.isVertex(parentState.cell))
- {
- dx = parentState.x;
- dy = parentState.y;
- }
-
- // Workaround for relative child cells
- if (this.model.isVertex(source.parent) && source.geometry.relative)
- {
- pt.x += source.parent.geometry.x;
- pt.y += source.parent.geometry.y;
- }
-
- // Checks actual end point of edge for target cell
- var rect = (!ignoreCellAt) ? new mxRectangle(dx + pt.x * s, dy + pt.y * s).grow(40) : null;
- var tempCells = (rect != null) ? this.getCells(0, 0, 0, 0, null, null, rect) : null;
- var target = (tempCells != null && tempCells.length > 0) ? tempCells.reverse()[0] : null;
- var keepParent = false;
-
- if (target != null && this.model.isAncestor(target, source))
- {
- keepParent = true;
- target = null;
- }
-
- // Checks for swimlane at drop location
- if (target == null)
- {
- var temp = this.getSwimlaneAt(dx + pt.x * s, dy + pt.y * s);
-
- if (temp != null)
- {
- keepParent = false;
- target = temp;
- }
- }
-
- // Checks if target or ancestor is locked
- var temp = target;
-
- while (temp != null)
- {
- if (this.isCellLocked(temp))
- {
- target = null;
- break;
- }
-
- temp = this.model.getParent(temp);
- }
-
- // Checks if source and target intersect
- if (target != null)
- {
- var sourceState = this.view.getState(source);
- var targetState = this.view.getState(target);
-
- if (sourceState != null && targetState != null && mxUtils.intersects(sourceState, targetState))
- {
- target = null;
- }
- }
-
- var duplicate = (!mxEvent.isShiftDown(evt) || mxEvent.isControlDown(evt)) || forceClone;
-
- if (duplicate)
- {
- if (direction == mxConstants.DIRECTION_NORTH)
- {
- pt.y -= source.geometry.height / 2;
- }
- else if (direction == mxConstants.DIRECTION_SOUTH)
- {
- pt.y += source.geometry.height / 2;
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- pt.x -= source.geometry.width / 2;
- }
- else
- {
- pt.x += source.geometry.width / 2;
- }
- }
-
- // Uses connectable parent vertex if one exists
- // TODO: Fix using target as parent for swimlane
- if (target != null && !this.isCellConnectable(target) && !this.isSwimlane(target))
- {
- var parent = this.getModel().getParent(target);
-
- if (this.getModel().isVertex(parent) && this.isCellConnectable(parent))
- {
- target = parent;
- }
- }
-
- if (target == source || this.model.isEdge(target) ||
- !this.isCellConnectable(target) &&
- !this.isSwimlane(target))
- {
- target = null;
- }
-
- var result = [];
- var swimlane = target != null && this.isSwimlane(target);
- var realTarget = (!swimlane) ? target : null;
-
- var execute = mxUtils.bind(this, function(targetCell)
- {
- if (createTarget == null || targetCell != null || (target == null && cloneSource))
- {
- this.model.beginUpdate();
- try
- {
- if (realTarget == null && duplicate)
- {
- // Handles relative children
- var cellToClone = (targetCell != null) ? targetCell : source;
- var geo = this.getCellGeometry(cellToClone);
-
- while (geo != null && geo.relative)
- {
- cellToClone = this.getModel().getParent(cellToClone);
- geo = this.getCellGeometry(cellToClone);
- }
-
- // Handles composite cells for cloning
- cellToClone = (cloneSource) ? source : this.getCompositeParent(cellToClone);
- realTarget = (targetCell != null) ? targetCell : this.duplicateCells([cellToClone], false)[0];
-
- if (targetCell != null)
- {
- this.addCells([realTarget], this.model.getParent(source), null, null, null, true);
- }
-
- var geo = this.getCellGeometry(realTarget);
-
- if (geo != null)
- {
- geo.x = pt.x - geo.width / 2;
- geo.y = pt.y - geo.height / 2;
- }
-
- if (swimlane)
- {
- this.addCells([realTarget], target, null, null, null, true);
- target = null;
- }
- else if (duplicate && target == null && !keepParent && !cloneSource)
- {
- this.addCells([realTarget], this.getDefaultParent(), null, null, null, true);
- }
- }
-
- var edge = ((mxEvent.isControlDown(evt) && mxEvent.isShiftDown(evt) && duplicate) ||
- (target == null && cloneSource)) ? null : this.insertEdge(this.model.getParent(source),
- null, '', source, realTarget, this.createCurrentEdgeStyle());
-
- // Inserts edge before source
- if (edge != null && this.connectionHandler.insertBeforeSource)
- {
- var index = null;
- var tmp = source;
-
- while (tmp.parent != null && tmp.geometry != null &&
- tmp.geometry.relative && tmp.parent != edge.parent)
- {
- tmp = this.model.getParent(tmp);
- }
-
- if (tmp != null && tmp.parent != null && tmp.parent == edge.parent)
- {
- var index = tmp.parent.getIndex(tmp);
- this.model.add(tmp.parent, edge, index);
- }
- }
-
- // Special case: Click on west icon puts clone before cell
- if (target == null && realTarget != null && source.parent != null &&
- cloneSource && direction == mxConstants.DIRECTION_WEST)
- {
- var index = source.parent.getIndex(source);
- this.model.add(source.parent, realTarget, index);
- }
-
- if (edge != null)
- {
- result.push(edge);
- }
-
- if (target == null && realTarget != null)
- {
- result.push(realTarget);
- }
-
- if (realTarget == null && edge != null)
- {
- edge.geometry.setTerminalPoint(pt, false);
- }
-
- if (edge != null)
- {
- this.fireEvent(new mxEventObject('cellsInserted', 'cells', [edge]));
- }
- }
- finally
- {
- this.model.endUpdate();
- }
- }
-
- if (done != null)
- {
- done(result);
- }
- else
- {
- return result;
- }
- });
-
- if (createTarget != null && realTarget == null && duplicate &&
- (target != null || !cloneSource))
- {
- createTarget(dx + pt.x * s, dy + pt.y * s, execute);
- }
- else
- {
- return execute(realTarget);
- }
-};
-
-/**
- * Returns all labels in the diagram as a string.
- */
-Graph.prototype.getIndexableText = function()
-{
- var tmp = document.createElement('div');
- var labels = [];
- var label = '';
-
- for (var key in this.model.cells)
- {
- var cell = this.model.cells[key];
-
- if (this.model.isVertex(cell) || this.model.isEdge(cell))
- {
- if (this.isHtmlLabel(cell))
- {
- tmp.innerHTML = this.sanitizeHtml(this.getLabel(cell));
- label = mxUtils.extractTextWithWhitespace([tmp]);
- }
- else
- {
- label = this.getLabel(cell);
- }
-
- label = mxUtils.trim(label.replace(/[\x00-\x1F\x7F-\x9F]|\s+/g, ' '));
-
- if (label.length > 0)
- {
- labels.push(label);
- }
- }
- }
-
- return labels.join(' ');
-};
-
-/**
- * Returns the label for the given cell.
- */
-Graph.prototype.convertValueToString = function(cell)
-{
- var value = this.model.getValue(cell);
-
- if (value != null && typeof(value) == 'object')
- {
- var result = null;
-
- if (this.isReplacePlaceholders(cell) && cell.getAttribute('placeholder') != null)
- {
- var name = cell.getAttribute('placeholder');
- var current = cell;
-
- while (result == null && current != null)
- {
- if (current.value != null && typeof(current.value) == 'object')
- {
- result = (current.hasAttribute(name)) ? ((current.getAttribute(name) != null) ?
- current.getAttribute(name) : '') : null;
- }
-
- current = this.model.getParent(current);
- }
- }
- else
- {
- var result = null;
-
- if (Graph.translateDiagram && Graph.diagramLanguage != null)
- {
- result = value.getAttribute('label_' + Graph.diagramLanguage);
- }
-
- if (result == null)
- {
- result = value.getAttribute('label') || '';
- }
- }
-
- return result || '';
- }
-
- return mxGraph.prototype.convertValueToString.apply(this, arguments);
-};
-
-/**
- * Returns the link for the given cell.
- */
-Graph.prototype.getLinksForState = function(state)
-{
- if (state != null && state.text != null && state.text.node != null)
- {
- return state.text.node.getElementsByTagName('a');
- }
-
- return null;
-};
-
-/**
- * Returns the link for the given cell.
- */
-Graph.prototype.getLinkForCell = function(cell)
-{
- if (cell.value != null && typeof(cell.value) == 'object')
- {
- var link = cell.value.getAttribute('link');
-
- // Removes links with leading javascript: protocol
- // TODO: Check more possible attack vectors
- if (link != null && link.toLowerCase().substring(0, 11) === 'javascript:')
- {
- link = link.substring(11);
- }
-
- return link;
- }
-
- return null;
-};
-
-/**
- * Overrides label orientation for collapsed swimlanes inside stack and
- * for partial rectangles inside tables.
- */
-Graph.prototype.getCellStyle = function(cell)
-{
- var style = mxGraph.prototype.getCellStyle.apply(this, arguments);
-
- if (cell != null && this.layoutManager != null)
- {
- var parent = this.model.getParent(cell);
-
- if (this.model.isVertex(parent) && this.isCellCollapsed(cell))
- {
- var layout = this.layoutManager.getLayout(parent);
-
- if (layout != null && layout.constructor == mxStackLayout)
- {
- style[mxConstants.STYLE_HORIZONTAL] = !layout.horizontal;
- }
- }
- }
-
- return style;
-};
-
-/**
- * Disables alternate width persistence for stack layout parents
- */
-Graph.prototype.updateAlternateBounds = function(cell, geo, willCollapse)
-{
- if (cell != null && geo != null && this.layoutManager != null && geo.alternateBounds != null)
- {
- var layout = this.layoutManager.getLayout(this.model.getParent(cell));
-
- if (layout != null && layout.constructor == mxStackLayout)
- {
- if (layout.horizontal)
- {
- geo.alternateBounds.height = 0;
- }
- else
- {
- geo.alternateBounds.width = 0;
- }
- }
- }
-
- mxGraph.prototype.updateAlternateBounds.apply(this, arguments);
-};
-
-/**
- * Adds Shift+collapse/expand and size management for folding inside stack
- */
-Graph.prototype.isMoveCellsEvent = function(evt, state)
-{
- return mxEvent.isShiftDown(evt) || mxUtils.getValue(state.style, 'moveCells', '0') == '1';
-};
-
-/**
- * Adds Shift+collapse/expand and size management for folding inside stack
- */
-Graph.prototype.foldCells = function(collapse, recurse, cells, checkFoldable, evt)
-{
- recurse = (recurse != null) ? recurse : false;
-
- if (cells == null)
- {
- cells = this.getFoldableCells(this.getSelectionCells(), collapse);
- }
-
- if (cells != null)
- {
- this.model.beginUpdate();
-
- try
- {
- mxGraph.prototype.foldCells.apply(this, arguments);
-
- // Resizes all parent stacks if alt is not pressed
- if (this.layoutManager != null)
- {
- for (var i = 0; i < cells.length; i++)
- {
- var state = this.view.getState(cells[i]);
- var geo = this.getCellGeometry(cells[i]);
-
- if (state != null && geo != null)
- {
- var dx = Math.round(geo.width - state.width / this.view.scale);
- var dy = Math.round(geo.height - state.height / this.view.scale);
-
- if (dy != 0 || dx != 0)
- {
- var parent = this.model.getParent(cells[i]);
- var layout = this.layoutManager.getLayout(parent);
-
- if (layout == null)
- {
- // Moves cells to the right and down after collapse/expand
- if (evt != null && this.isMoveCellsEvent(evt, state))
- {
- this.moveSiblings(state, parent, dx, dy);
- }
- }
- else if ((evt == null || !mxEvent.isAltDown(evt)) &&
- layout.constructor == mxStackLayout && !layout.resizeLast)
- {
- this.resizeParentStacks(parent, layout, dx, dy);
- }
- }
- }
- }
- }
- }
- finally
- {
- this.model.endUpdate();
- }
-
- // Selects cells after folding
- if (this.isEnabled())
- {
- this.setSelectionCells(cells);
- }
- }
-};
-
-/**
- * Overrides label orientation for collapsed swimlanes inside stack.
- */
-Graph.prototype.moveSiblings = function(state, parent, dx, dy)
-{
- this.model.beginUpdate();
- try
- {
- var cells = this.getCellsBeyond(state.x, state.y, parent, true, true);
-
- for (var i = 0; i < cells.length; i++)
- {
- if (cells[i] != state.cell)
- {
- var tmp = this.view.getState(cells[i]);
- var geo = this.getCellGeometry(cells[i]);
-
- if (tmp != null && geo != null)
- {
- geo = geo.clone();
- geo.translate(Math.round(dx * Math.max(0, Math.min(1, (tmp.x - state.x) / state.width))),
- Math.round(dy * Math.max(0, Math.min(1, (tmp.y - state.y) / state.height))));
- this.model.setGeometry(cells[i], geo);
- }
- }
- }
- }
- finally
- {
- this.model.endUpdate();
- }
-};
-
-/**
- * Overrides label orientation for collapsed swimlanes inside stack.
- */
-Graph.prototype.resizeParentStacks = function(parent, layout, dx, dy)
-{
- if (this.layoutManager != null && layout != null && layout.constructor == mxStackLayout && !layout.resizeLast)
- {
- this.model.beginUpdate();
- try
- {
- var dir = layout.horizontal;
-
- // Bubble resize up for all parent stack layouts with same orientation
- while (parent != null && layout != null && layout.constructor == mxStackLayout &&
- layout.horizontal == dir && !layout.resizeLast)
- {
- var pgeo = this.getCellGeometry(parent);
- var pstate = this.view.getState(parent);
-
- if (pstate != null && pgeo != null)
- {
- pgeo = pgeo.clone();
-
- if (layout.horizontal)
- {
- pgeo.width += dx + Math.min(0, pstate.width / this.view.scale - pgeo.width);
- }
- else
- {
- pgeo.height += dy + Math.min(0, pstate.height / this.view.scale - pgeo.height);
- }
-
- this.model.setGeometry(parent, pgeo);
- }
-
- parent = this.model.getParent(parent);
- layout = this.layoutManager.getLayout(parent);
- }
- }
- finally
- {
- this.model.endUpdate();
- }
- }
-};
-
-/**
- * Disables drill-down for non-swimlanes.
- */
-Graph.prototype.isContainer = function(cell)
-{
- var style = this.getCurrentCellStyle(cell);
-
- if (this.isSwimlane(cell))
- {
- return style['container'] != '0';
- }
- else
- {
- return style['container'] == '1';
- }
-};
-
-/**
- * Adds a connectable style.
- */
-Graph.prototype.isCellConnectable = function(cell)
-{
- var style = this.getCurrentCellStyle(cell);
-
- return (style['connectable'] != null) ? style['connectable'] != '0' :
- mxGraph.prototype.isCellConnectable.apply(this, arguments);
-};
-
-/**
- * Adds labelMovable style.
- */
-Graph.prototype.isLabelMovable = function(cell)
-{
- var style = this.getCurrentCellStyle(cell);
-
- return (style['movableLabel'] != null) ? style['movableLabel'] != '0' :
- mxGraph.prototype.isLabelMovable.apply(this, arguments);
-};
-
-/**
- * Function: selectAll
- *
- * Selects all children of the given parent cell or the children of the
- * default parent if no parent is specified. To select leaf vertices and/or
- * edges use <selectCells>.
- *
- * Parameters:
- *
- * parent - Optional <mxCell> whose children should be selected.
- * Default is <defaultParent>.
- */
-Graph.prototype.selectAll = function(parent)
-{
- parent = parent || this.getDefaultParent();
-
- if (!this.isCellLocked(parent))
- {
- mxGraph.prototype.selectAll.apply(this, arguments);
- }
-};
-
-/**
- * Function: selectCells
- *
- * Selects all vertices and/or edges depending on the given boolean
- * arguments recursively, starting at the given parent or the default
- * parent if no parent is specified. Use <selectAll> to select all cells.
- * For vertices, only cells with no children are selected.
- *
- * Parameters:
- *
- * vertices - Boolean indicating if vertices should be selected.
- * edges - Boolean indicating if edges should be selected.
- * parent - Optional <mxCell> that acts as the root of the recursion.
- * Default is <defaultParent>.
- */
-Graph.prototype.selectCells = function(vertices, edges, parent)
-{
- parent = parent || this.getDefaultParent();
-
- if (!this.isCellLocked(parent))
- {
- mxGraph.prototype.selectCells.apply(this, arguments);
- }
-};
-
-/**
- * Function: getSwimlaneAt
- *
- * Returns the bottom-most swimlane that intersects the given point (x, y)
- * in the cell hierarchy that starts at the given parent.
- *
- * Parameters:
- *
- * x - X-coordinate of the location to be checked.
- * y - Y-coordinate of the location to be checked.
- * parent - <mxCell> that should be used as the root of the recursion.
- * Default is <defaultParent>.
- */
-Graph.prototype.getSwimlaneAt = function (x, y, parent)
-{
- var result = mxGraph.prototype.getSwimlaneAt.apply(this, arguments);
-
- if (this.isCellLocked(result))
- {
- result = null;
- }
-
- return result;
-};
-
-/**
- * Disables folding for non-swimlanes.
- */
-Graph.prototype.isCellFoldable = function(cell)
-{
- var style = this.getCurrentCellStyle(cell);
-
- return this.foldingEnabled && (style['treeFolding'] == '1' ||
- (!this.isCellLocked(cell) &&
- ((this.isContainer(cell) && style['collapsible'] != '0') ||
- (!this.isContainer(cell) && style['collapsible'] == '1'))));
-};
-
-/**
- * Stops all interactions and clears the selection.
- */
-Graph.prototype.reset = function()
-{
- if (this.isEditing())
- {
- this.stopEditing(true);
- }
-
- this.escape();
-
- if (!this.isSelectionEmpty())
- {
- this.clearSelection();
- }
-};
-
-/**
- * Overridden to limit zoom to 1% - 16.000%.
- */
-Graph.prototype.zoom = function(factor, center)
-{
- factor = Math.max(0.01, Math.min(this.view.scale * factor, 160)) / this.view.scale;
-
- mxGraph.prototype.zoom.apply(this, arguments);
-};
-
-/**
- * Function: zoomIn
- *
- * Zooms into the graph by <zoomFactor>.
- */
-Graph.prototype.zoomIn = function()
-{
- // Switches to 1% zoom steps below 15%
- if (this.view.scale < 0.15)
- {
- this.zoom((this.view.scale + 0.01) / this.view.scale);
- }
- else
- {
- // Uses to 5% zoom steps for better grid rendering in webkit
- // and to avoid rounding errors for zoom steps
- this.zoom((Math.round(this.view.scale * this.zoomFactor * 20) / 20) / this.view.scale);
- }
-};
-
-/**
- * Function: zoomOut
- *
- * Zooms out of the graph by <zoomFactor>.
- */
-Graph.prototype.zoomOut = function()
-{
- // Switches to 1% zoom steps below 15%
- if (this.view.scale <= 0.15)
- {
- this.zoom((this.view.scale - 0.01) / this.view.scale);
- }
- else
- {
- // Uses to 5% zoom steps for better grid rendering in webkit
- // and to avoid rounding errors for zoom steps
- this.zoom((Math.round(this.view.scale * (1 / this.zoomFactor) * 20) / 20) / this.view.scale);
- }
-};
-
-/**
- * Function: fitWindow
- *
- * Sets the current visible rectangle of the window in graph coordinates.
- */
-Graph.prototype.fitWindow = function(bounds, border)
-{
- border = (border != null) ? border : 10;
-
- var cw = this.container.clientWidth - border;
- var ch = this.container.clientHeight - border;
- var scale = Math.floor(20 * Math.min(cw / bounds.width, ch / bounds.height)) / 20;
- this.zoomTo(scale);
-
- if (mxUtils.hasScrollbars(this.container))
- {
- var t = this.view.translate;
- this.container.scrollTop = (bounds.y + t.y) * scale -
- Math.max((ch - bounds.height * scale) / 2 + border / 2, 0);
- this.container.scrollLeft = (bounds.x + t.x) * scale -
- Math.max((cw - bounds.width * scale) / 2 + border / 2, 0);
- }
-};
-
-/**
- * Overrides tooltips to show custom tooltip or metadata.
- */
-Graph.prototype.getTooltipForCell = function(cell)
-{
- var tip = '';
-
- if (mxUtils.isNode(cell.value))
- {
- var tmp = null;
-
- if (Graph.translateDiagram && Graph.diagramLanguage != null)
- {
- tmp = cell.value.getAttribute('tooltip_' + Graph.diagramLanguage);
- }
-
- if (tmp == null)
- {
- tmp = cell.value.getAttribute('tooltip');
- }
-
- if (tmp != null)
- {
- if (tmp != null && this.isReplacePlaceholders(cell))
- {
- tmp = this.replacePlaceholders(cell, tmp);
- }
-
- tip = this.sanitizeHtml(tmp);
- }
- else
- {
- var ignored = this.builtInProperties;
- var attrs = cell.value.attributes;
- var temp = [];
-
- // Hides links in edit mode
- if (this.isEnabled())
- {
- ignored.push('link');
- }
-
- for (var i = 0; i < attrs.length; i++)
- {
- if (mxUtils.indexOf(ignored, attrs[i].nodeName) < 0 && attrs[i].nodeValue.length > 0)
- {
- temp.push({name: attrs[i].nodeName, value: attrs[i].nodeValue});
- }
- }
-
- // Sorts by name
- temp.sort(function(a, b)
- {
- if (a.name < b.name)
- {
- return -1;
- }
- else if (a.name > b.name)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- });
-
- for (var i = 0; i < temp.length; i++)
- {
- if (temp[i].name != 'link' || !this.isCustomLink(temp[i].value))
- {
- tip += ((temp[i].name != 'link') ? '<b>' + temp[i].name + ':</b> ' : '') +
- mxUtils.htmlEntities(temp[i].value) + '\n';
- }
- }
-
- if (tip.length > 0)
- {
- tip = tip.substring(0, tip.length - 1);
-
- if (mxClient.IS_SVG)
- {
- tip = '<div style="max-width:360px;text-overflow:ellipsis;overflow:hidden;">' +
- tip + '</div>';
- }
- }
- }
- }
-
- return tip;
-};
-
-/**
- * Turns the given string into an array.
- */
-Graph.prototype.stringToBytes = function(str)
-{
- return Graph.stringToBytes(str);
-};
-
-/**
- * Turns the given array into a string.
- */
-Graph.prototype.bytesToString = function(arr)
-{
- return Graph.bytesToString(arr);
-};
-
-/**
- * Returns a base64 encoded version of the compressed outer XML of the given node.
- */
-Graph.prototype.compressNode = function(node)
-{
- return Graph.compressNode(node);
-};
-
-/**
- * Returns a base64 encoded version of the compressed string.
- */
-Graph.prototype.compress = function(data, deflate)
-{
- return Graph.compress(data, deflate);
-};
-
-/**
- * Returns a decompressed version of the base64 encoded string.
- */
-Graph.prototype.decompress = function(data, inflate)
-{
- return Graph.decompress(data, inflate);
-};
-
-/**
- * Redirects to Graph.zapGremlins.
- */
-Graph.prototype.zapGremlins = function(text)
-{
- return Graph.zapGremlins(text);
-};
-
-/**
- * Hover icons are used for hover, vertex handler and drag from sidebar.
- */
-HoverIcons = function(graph)
-{
- this.graph = graph;
- this.init();
-};
-
-/**
- * Up arrow.
- */
-HoverIcons.prototype.arrowSpacing = 2;
-
-/**
- * Delay to switch to another state for overlapping bbox. Default is 500ms.
- */
-HoverIcons.prototype.updateDelay = 500;
-
-/**
- * Delay to switch between states. Default is 140ms.
- */
-HoverIcons.prototype.activationDelay = 140;
-
-/**
- * Up arrow.
- */
-HoverIcons.prototype.currentState = null;
-
-/**
- * Up arrow.
- */
-HoverIcons.prototype.activeArrow = null;
-
-/**
- * Up arrow.
- */
-HoverIcons.prototype.inactiveOpacity = 15;
-
-/**
- * Up arrow.
- */
-HoverIcons.prototype.cssCursor = 'copy';
-
-/**
- * Whether to hide arrows that collide with vertices.
- * LATER: Add keyboard override, touch support.
- */
-HoverIcons.prototype.checkCollisions = true;
-
-/**
- * Up arrow.
- */
-HoverIcons.prototype.arrowFill = '#29b6f2';
-
-/**
- * Up arrow.
- */
-HoverIcons.prototype.triangleUp = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-up.png', 26, 14) :
- Graph.createSvgImage(18, 28, '<path d="m 6 26 L 12 26 L 12 12 L 18 12 L 9 1 L 1 12 L 6 12 z" ' +
- 'stroke="#fff" fill="' + HoverIcons.prototype.arrowFill + '"/>');
-
-/**
- * Right arrow.
- */
-HoverIcons.prototype.triangleRight = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-right.png', 14, 26) :
- Graph.createSvgImage(26, 18, '<path d="m 1 6 L 14 6 L 14 1 L 26 9 L 14 18 L 14 12 L 1 12 z" ' +
- 'stroke="#fff" fill="' + HoverIcons.prototype.arrowFill + '"/>');
-
-/**
- * Down arrow.
- */
-HoverIcons.prototype.triangleDown = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-down.png', 26, 14) :
- Graph.createSvgImage(18, 26, '<path d="m 6 1 L 6 14 L 1 14 L 9 26 L 18 14 L 12 14 L 12 1 z" ' +
- 'stroke="#fff" fill="' + HoverIcons.prototype.arrowFill + '"/>');
-
-/**
- * Left arrow.
- */
-HoverIcons.prototype.triangleLeft = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-left.png', 14, 26) :
- Graph.createSvgImage(28, 18, '<path d="m 1 9 L 12 1 L 12 6 L 26 6 L 26 12 L 12 12 L 12 18 z" ' +
- 'stroke="#fff" fill="' + HoverIcons.prototype.arrowFill + '"/>');
-
-/**
- * Round target.
- */
-HoverIcons.prototype.roundDrop = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/round-drop.png', 26, 26) :
- Graph.createSvgImage(26, 26, '<circle cx="13" cy="13" r="12" ' +
- 'stroke="#fff" fill="' + HoverIcons.prototype.arrowFill + '"/>');
-
-/**
- * Refresh target.
- */
-HoverIcons.prototype.refreshTarget = new mxImage((mxClient.IS_SVG) ? 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjM2cHgiIGhlaWdodD0iMzZweCI+PGVsbGlwc2UgZmlsbD0iIzI5YjZmMiIgY3g9IjEyIiBjeT0iMTIiIHJ4PSIxMiIgcnk9IjEyIi8+PHBhdGggdHJhbnNmb3JtPSJzY2FsZSgwLjgpIHRyYW5zbGF0ZSgyLjQsIDIuNCkiIHN0cm9rZT0iI2ZmZiIgZmlsbD0iI2ZmZiIgZD0iTTEyIDZ2M2w0LTQtNC00djNjLTQuNDIgMC04IDMuNTgtOCA4IDAgMS41Ny40NiAzLjAzIDEuMjQgNC4yNkw2LjcgMTQuOGMtLjQ1LS44My0uNy0xLjc5LS43LTIuOCAwLTMuMzEgMi42OS02IDYtNnptNi43NiAxLjc0TDE3LjMgOS4yYy40NC44NC43IDEuNzkuNyAyLjggMCAzLjMxLTIuNjkgNi02IDZ2LTNsLTQgNCA0IDR2LTNjNC40MiAwIDgtMy41OCA4LTggMC0xLjU3LS40Ni0zLjAzLTEuMjQtNC4yNnoiLz48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PC9zdmc+Cg==' :
- IMAGE_PATH + '/refresh.png', 38, 38);
-
-/**
- * Tolerance for hover icon clicks.
- */
-HoverIcons.prototype.tolerance = (mxClient.IS_TOUCH) ? 6 : 0;
-
-/**
- *
- */
-HoverIcons.prototype.init = function()
-{
- this.arrowUp = this.createArrow(this.triangleUp, mxResources.get('plusTooltip'));
- this.arrowRight = this.createArrow(this.triangleRight, mxResources.get('plusTooltip'));
- this.arrowDown = this.createArrow(this.triangleDown, mxResources.get('plusTooltip'));
- this.arrowLeft = this.createArrow(this.triangleLeft, mxResources.get('plusTooltip'));
-
- this.elts = [this.arrowUp, this.arrowRight, this.arrowDown, this.arrowLeft];
-
- this.resetHandler = mxUtils.bind(this, function()
- {
- this.reset();
- });
-
- this.repaintHandler = mxUtils.bind(this, function()
- {
- this.repaint();
- });
-
- this.graph.selectionModel.addListener(mxEvent.CHANGE, this.resetHandler);
- this.graph.model.addListener(mxEvent.CHANGE, this.repaintHandler);
- this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE, this.repaintHandler);
- this.graph.view.addListener(mxEvent.TRANSLATE, this.repaintHandler);
- this.graph.view.addListener(mxEvent.SCALE, this.repaintHandler);
- this.graph.view.addListener(mxEvent.DOWN, this.repaintHandler);
- this.graph.view.addListener(mxEvent.UP, this.repaintHandler);
- this.graph.addListener(mxEvent.ROOT, this.repaintHandler);
- this.graph.addListener(mxEvent.ESCAPE, this.resetHandler);
- mxEvent.addListener(this.graph.container, 'scroll', this.resetHandler);
-
- // Resets the mouse point on escape
- this.graph.addListener(mxEvent.ESCAPE, mxUtils.bind(this, function()
- {
- this.mouseDownPoint = null;
- }));
-
- // Removes hover icons if mouse leaves the container
- mxEvent.addListener(this.graph.container, 'mouseleave', mxUtils.bind(this, function(evt)
- {
- // Workaround for IE11 firing mouseleave for touch in diagram
- if (evt.relatedTarget != null && mxEvent.getSource(evt) == this.graph.container)
- {
- this.setDisplay('none');
- }
- }));
-
- // Resets current state when in-place editor starts
- this.graph.addListener(mxEvent.START_EDITING, mxUtils.bind(this, function(evt)
- {
- this.reset();
- }));
-
- // Resets current state after update of selection state for touch events
- var graphClick = this.graph.click;
- this.graph.click = mxUtils.bind(this, function(me)
- {
- graphClick.apply(this.graph, arguments);
-
- if (this.currentState != null && !this.graph.isCellSelected(this.currentState.cell) &&
- mxEvent.isTouchEvent(me.getEvent()) && !this.graph.model.isVertex(me.getCell()))
- {
- this.reset();
- }
- });
-
- // Checks if connection handler was active in mouse move
- // as workaround for possible double connection inserted
- var connectionHandlerActive = false;
-
- // Implements a listener for hover and click handling
- this.graph.addMouseListener(
- {
- mouseDown: mxUtils.bind(this, function(sender, me)
- {
- connectionHandlerActive = false;
- var evt = me.getEvent();
-
- if (this.isResetEvent(evt))
- {
- this.reset();
- }
- else if (!this.isActive())
- {
- var state = this.getState(me.getState());
-
- if (state != null || !mxEvent.isTouchEvent(evt))
- {
- this.update(state);
- }
- }
-
- this.setDisplay('none');
- }),
- mouseMove: mxUtils.bind(this, function(sender, me)
- {
- var evt = me.getEvent();
-
- if (this.isResetEvent(evt))
- {
- this.reset();
- }
- else if (!this.graph.isMouseDown && !mxEvent.isTouchEvent(evt))
- {
- this.update(this.getState(me.getState()),
- me.getGraphX(), me.getGraphY());
- }
-
- if (this.graph.connectionHandler != null &&
- this.graph.connectionHandler.shape != null)
- {
- connectionHandlerActive = true;
- }
- }),
- mouseUp: mxUtils.bind(this, function(sender, me)
- {
- var evt = me.getEvent();
- var pt = mxUtils.convertPoint(this.graph.container,
- mxEvent.getClientX(evt), mxEvent.getClientY(evt))
-
- if (this.isResetEvent(evt))
- {
- this.reset();
- }
- else if (this.isActive() && !connectionHandlerActive &&
- this.mouseDownPoint != null)
- {
- this.click(this.currentState, this.getDirection(), me);
- }
- else if (this.isActive())
- {
- // Selects target vertex after drag and clone if not only new edge was inserted
- if (this.graph.getSelectionCount() != 1 || !this.graph.model.isEdge(
- this.graph.getSelectionCell()))
- {
- this.update(this.getState(this.graph.view.getState(
- this.graph.getCellAt(me.getGraphX(), me.getGraphY()))));
- }
- else
- {
- this.reset();
- }
- }
- else if (mxEvent.isTouchEvent(evt) || (this.bbox != null &&
- mxUtils.contains(this.bbox, me.getGraphX(), me.getGraphY())))
- {
- // Shows existing hover icons if inside bounding box
- this.setDisplay('');
- this.repaint();
- }
- else if (!mxEvent.isTouchEvent(evt))
- {
- this.reset();
- }
-
- connectionHandlerActive = false;
- this.resetActiveArrow();
- })
- });
-};
-
-/**
- *
- */
-HoverIcons.prototype.isResetEvent = function(evt, allowShift)
-{
- return mxEvent.isAltDown(evt) || (this.activeArrow == null && mxEvent.isShiftDown(evt)) ||
- (mxEvent.isPopupTrigger(evt) && !this.graph.isCloneEvent(evt));
-};
-
-/**
- *
- */
-HoverIcons.prototype.createArrow = function(img, tooltip)
-{
- var arrow = null;
-
- if (mxClient.IS_IE && !mxClient.IS_SVG)
- {
- // Workaround for PNG images in IE6
- if (mxClient.IS_IE6 && document.compatMode != 'CSS1Compat')
- {
- arrow = document.createElement(mxClient.VML_PREFIX + ':image');
- arrow.setAttribute('src', img.src);
- arrow.style.borderStyle = 'none';
- }
- else
- {
- arrow = document.createElement('div');
- arrow.style.backgroundImage = 'url(' + img.src + ')';
- arrow.style.backgroundPosition = 'center';
- arrow.style.backgroundRepeat = 'no-repeat';
- }
-
- arrow.style.width = (img.width + 4) + 'px';
- arrow.style.height = (img.height + 4) + 'px';
- arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
- }
- else
- {
- arrow = mxUtils.createImage(img.src);
- arrow.style.width = img.width + 'px';
- arrow.style.height = img.height + 'px';
- arrow.style.padding = this.tolerance + 'px';
- }
-
- if (tooltip != null)
- {
- arrow.setAttribute('title', tooltip);
- }
-
- arrow.style.position = 'absolute';
- arrow.style.cursor = this.cssCursor;
-
- mxEvent.addGestureListeners(arrow, mxUtils.bind(this, function(evt)
- {
- if (this.currentState != null && !this.isResetEvent(evt))
- {
- this.mouseDownPoint = mxUtils.convertPoint(this.graph.container,
- mxEvent.getClientX(evt), mxEvent.getClientY(evt));
- this.drag(evt, this.mouseDownPoint.x, this.mouseDownPoint.y);
- this.activeArrow = arrow;
- this.setDisplay('none');
- mxEvent.consume(evt);
- }
- }));
-
- // Captures mouse events as events on graph
- mxEvent.redirectMouseEvents(arrow, this.graph, this.currentState);
-
- mxEvent.addListener(arrow, 'mouseenter', mxUtils.bind(this, function(evt)
- {
- // Workaround for Firefox firing mouseenter on touchend
- if (mxEvent.isMouseEvent(evt))
- {
- if (this.activeArrow != null && this.activeArrow != arrow)
- {
- mxUtils.setOpacity(this.activeArrow, this.inactiveOpacity);
- }
-
- this.graph.connectionHandler.constraintHandler.reset();
- mxUtils.setOpacity(arrow, 100);
- this.activeArrow = arrow;
- }
- }));
-
- mxEvent.addListener(arrow, 'mouseleave', mxUtils.bind(this, function(evt)
- {
- // Workaround for IE11 firing this event on touch
- if (!this.graph.isMouseDown)
- {
- this.resetActiveArrow();
- }
- }));
-
- return arrow;
-};
-
-/**
- *
- */
-HoverIcons.prototype.resetActiveArrow = function()
-{
- if (this.activeArrow != null)
- {
- mxUtils.setOpacity(this.activeArrow, this.inactiveOpacity);
- this.activeArrow = null;
- }
-};
-
-/**
- *
- */
-HoverIcons.prototype.getDirection = function()
-{
- var dir = mxConstants.DIRECTION_EAST;
-
- if (this.activeArrow == this.arrowUp)
- {
- dir = mxConstants.DIRECTION_NORTH;
- }
- else if (this.activeArrow == this.arrowDown)
- {
- dir = mxConstants.DIRECTION_SOUTH;
- }
- else if (this.activeArrow == this.arrowLeft)
- {
- dir = mxConstants.DIRECTION_WEST;
- }
-
- return dir;
-};
-
-/**
- *
- */
-HoverIcons.prototype.visitNodes = function(visitor)
-{
- for (var i = 0; i < this.elts.length; i++)
- {
- if (this.elts[i] != null)
- {
- visitor(this.elts[i]);
- }
- }
-};
-
-/**
- *
- */
-HoverIcons.prototype.removeNodes = function()
-{
- this.visitNodes(function(elt)
- {
- if (elt.parentNode != null)
- {
- elt.parentNode.removeChild(elt);
- }
- });
-};
-
-/**
- *
- */
-HoverIcons.prototype.setDisplay = function(display)
-{
- this.visitNodes(function(elt)
- {
- elt.style.display = display;
- });
-};
-
-/**
- *
- */
-HoverIcons.prototype.isActive = function()
-{
- return this.activeArrow != null && this.currentState != null;
-};
-
-/**
- *
- */
-HoverIcons.prototype.drag = function(evt, x, y)
-{
- this.graph.popupMenuHandler.hideMenu();
- this.graph.stopEditing(false);
-
- // Checks if state was removed in call to stopEditing above
- if (this.currentState != null)
- {
- this.graph.connectionHandler.start(this.currentState, x, y);
- this.graph.isMouseTrigger = mxEvent.isMouseEvent(evt);
- this.graph.isMouseDown = true;
-
- // Hides handles for selection cell
- var handler = this.graph.selectionCellsHandler.getHandler(this.currentState.cell);
-
- if (handler != null)
- {
- handler.setHandlesVisible(false);
- }
-
- // Ctrl+shift drag sets source constraint
- var es = this.graph.connectionHandler.edgeState;
-
- if (evt != null && mxEvent.isShiftDown(evt) && mxEvent.isControlDown(evt) && es != null &&
- mxUtils.getValue(es.style, mxConstants.STYLE_EDGE, null) === 'orthogonalEdgeStyle')
- {
- var direction = this.getDirection();
- es.cell.style = mxUtils.setStyle(es.cell.style, 'sourcePortConstraint', direction);
- es.style['sourcePortConstraint'] = direction;
- }
- }
-};
-
-/**
- *
- */
-HoverIcons.prototype.getStateAt = function(state, x, y)
-{
- return this.graph.view.getState(this.graph.getCellAt(x, y));
-};
-
-/**
- *
- */
-HoverIcons.prototype.click = function(state, dir, me)
-{
- var evt = me.getEvent();
- var x = me.getGraphX();
- var y = me.getGraphY();
-
- var tmp = this.getStateAt(state, x, y);
-
- if (tmp != null && this.graph.model.isEdge(tmp.cell) && !this.graph.isCloneEvent(evt) &&
- (tmp.getVisibleTerminalState(true) == state || tmp.getVisibleTerminalState(false) == state))
- {
- this.graph.setSelectionCell(tmp.cell);
- this.reset();
- }
- else if (state != null)
- {
- this.execute(state, dir, me);
- }
-
- me.consume();
-};
-
-/**
- *
- */
-HoverIcons.prototype.execute = function(state, dir, me)
-{
- var evt = me.getEvent();
-
- this.graph.selectCellsForConnectVertex(this.graph.connectVertex(
- state.cell, dir, this.graph.defaultEdgeLength, evt, this.graph.isCloneEvent(evt),
- this.graph.isCloneEvent(evt)), evt, this);
-};
-
-/**
- *
- */
-HoverIcons.prototype.reset = function(clearTimeout)
-{
- clearTimeout = (clearTimeout == null) ? true : clearTimeout;
-
- if (clearTimeout && this.updateThread != null)
- {
- window.clearTimeout(this.updateThread);
- }
-
- this.mouseDownPoint = null;
- this.currentState = null;
- this.activeArrow = null;
- this.removeNodes();
- this.bbox = null;
-};
-
-/**
- *
- */
-HoverIcons.prototype.repaint = function()
-{
- this.bbox = null;
-
- if (this.currentState != null)
- {
- // Checks if cell was deleted
- this.currentState = this.getState(this.currentState);
-
- // Cell was deleted
- if (this.currentState != null &&
- this.graph.model.isVertex(this.currentState.cell) &&
- this.graph.isCellConnectable(this.currentState.cell))
- {
- var bds = mxRectangle.fromRectangle(this.currentState);
-
- // Uses outer bounding box to take rotation into account
- if (this.currentState.shape != null && this.currentState.shape.boundingBox != null)
- {
- bds = mxRectangle.fromRectangle(this.currentState.shape.boundingBox);
- }
-
- bds.grow(this.graph.tolerance);
- bds.grow(this.arrowSpacing);
-
- var handler = this.graph.selectionCellsHandler.getHandler(this.currentState.cell);
-
- if (this.graph.isTableRow(this.currentState.cell))
- {
- handler = this.graph.selectionCellsHandler.getHandler(
- this.graph.model.getParent(this.currentState.cell));
- }
-
- var rotationBbox = null;
-
- if (handler != null)
- {
- bds.x -= handler.horizontalOffset / 2;
- bds.y -= handler.verticalOffset / 2;
- bds.width += handler.horizontalOffset;
- bds.height += handler.verticalOffset;
-
- // Adds bounding box of rotation handle to avoid overlap
- if (handler.rotationShape != null && handler.rotationShape.node != null &&
- handler.rotationShape.node.style.visibility != 'hidden' &&
- handler.rotationShape.node.style.display != 'none' &&
- handler.rotationShape.boundingBox != null)
- {
- rotationBbox = handler.rotationShape.boundingBox;
- }
- }
-
- // Positions arrows avoid collisions with rotation handle
- var positionArrow = mxUtils.bind(this, function(arrow, x, y)
- {
- if (rotationBbox != null)
- {
- var bbox = new mxRectangle(x, y, arrow.clientWidth, arrow.clientHeight);
-
- if (mxUtils.intersects(bbox, rotationBbox))
- {
- if (arrow == this.arrowUp)
- {
- y -= bbox.y + bbox.height - rotationBbox.y;
- }
- else if (arrow == this.arrowRight)
- {
- x += rotationBbox.x + rotationBbox.width - bbox.x;
- }
- else if (arrow == this.arrowDown)
- {
- y += rotationBbox.y + rotationBbox.height - bbox.y;
- }
- else if (arrow == this.arrowLeft)
- {
- x -= bbox.x + bbox.width - rotationBbox.x;
- }
- }
- }
-
- arrow.style.left = x + 'px';
- arrow.style.top = y + 'px';
- mxUtils.setOpacity(arrow, this.inactiveOpacity);
- });
-
- positionArrow(this.arrowUp,
- Math.round(this.currentState.getCenterX() - this.triangleUp.width / 2 - this.tolerance),
- Math.round(bds.y - this.triangleUp.height - this.tolerance));
-
- positionArrow(this.arrowRight, Math.round(bds.x + bds.width - this.tolerance),
- Math.round(this.currentState.getCenterY() - this.triangleRight.height / 2 - this.tolerance));
-
- positionArrow(this.arrowDown, parseInt(this.arrowUp.style.left),
- Math.round(bds.y + bds.height - this.tolerance));
-
- positionArrow(this.arrowLeft, Math.round(bds.x - this.triangleLeft.width - this.tolerance),
- parseInt(this.arrowRight.style.top));
-
- if (this.checkCollisions)
- {
- var right = this.graph.getCellAt(bds.x + bds.width +
- this.triangleRight.width / 2, this.currentState.getCenterY());
- var left = this.graph.getCellAt(bds.x - this.triangleLeft.width / 2, this.currentState.getCenterY());
- var top = this.graph.getCellAt(this.currentState.getCenterX(), bds.y - this.triangleUp.height / 2);
- var bottom = this.graph.getCellAt(this.currentState.getCenterX(), bds.y + bds.height + this.triangleDown.height / 2);
-
- // Shows hover icons large cell is behind all directions of current cell
- if (right != null && right == left && left == top && top == bottom)
- {
- right = null;
- left = null;
- top = null;
- bottom = null;
- }
-
- var currentGeo = this.graph.getCellGeometry(this.currentState.cell);
-
- var checkCollision = mxUtils.bind(this, function(cell, arrow)
- {
- var geo = this.graph.model.isVertex(cell) && this.graph.getCellGeometry(cell);
-
- // Ignores collision if vertex is more than 3 times the size of this vertex
- if (cell != null && !this.graph.model.isAncestor(cell, this.currentState.cell) &&
- !this.graph.isSwimlane(cell) && (geo == null || currentGeo == null ||
- (geo.height < 3 * currentGeo.height && geo.width < 3 * currentGeo.width)))
- {
- arrow.style.visibility = 'hidden';
- }
- else
- {
- arrow.style.visibility = 'visible';
- }
- });
-
- checkCollision(right, this.arrowRight);
- checkCollision(left, this.arrowLeft);
- checkCollision(top, this.arrowUp);
- checkCollision(bottom, this.arrowDown);
- }
- else
- {
- this.arrowLeft.style.visibility = 'visible';
- this.arrowRight.style.visibility = 'visible';
- this.arrowUp.style.visibility = 'visible';
- this.arrowDown.style.visibility = 'visible';
- }
-
- if (this.graph.tooltipHandler.isEnabled())
- {
- this.arrowLeft.setAttribute('title', mxResources.get('plusTooltip'));
- this.arrowRight.setAttribute('title', mxResources.get('plusTooltip'));
- this.arrowUp.setAttribute('title', mxResources.get('plusTooltip'));
- this.arrowDown.setAttribute('title', mxResources.get('plusTooltip'));
- }
- else
- {
- this.arrowLeft.removeAttribute('title');
- this.arrowRight.removeAttribute('title');
- this.arrowUp.removeAttribute('title');
- this.arrowDown.removeAttribute('title');
- }
- }
- else
- {
- this.reset();
- }
-
- // Updates bounding box
- if (this.currentState != null)
- {
- this.bbox = this.computeBoundingBox();
-
- // Adds tolerance for hover
- if (this.bbox != null)
- {
- this.bbox.grow(10);
- }
- }
- }
-};
-
-/**
- *
- */
-HoverIcons.prototype.computeBoundingBox = function()
-{
- var bbox = (!this.graph.model.isEdge(this.currentState.cell)) ? mxRectangle.fromRectangle(this.currentState) : null;
-
- this.visitNodes(function(elt)
- {
- if (elt.parentNode != null)
- {
- var tmp = new mxRectangle(elt.offsetLeft, elt.offsetTop, elt.offsetWidth, elt.offsetHeight);
-
- if (bbox == null)
- {
- bbox = tmp;
- }
- else
- {
- bbox.add(tmp);
- }
- }
- });
-
- return bbox;
-};
-
-/**
- *
- */
-HoverIcons.prototype.getState = function(state)
-{
- if (state != null)
- {
- var cell = state.cell;
-
- if (!this.graph.getModel().contains(cell))
- {
- state = null;
- }
- else
- {
- // Uses connectable parent vertex if child is not connectable
- if (this.graph.getModel().isVertex(cell) && !this.graph.isCellConnectable(cell))
- {
- var parent = this.graph.getModel().getParent(cell);
-
- if (this.graph.getModel().isVertex(parent) && this.graph.isCellConnectable(parent))
- {
- cell = parent;
- }
- }
-
- // Ignores locked cells and edges
- if (this.graph.isCellLocked(cell) || this.graph.model.isEdge(cell))
- {
- cell = null;
- }
-
- state = this.graph.view.getState(cell);
-
- if (state != null && state.style == null)
- {
- state = null;
- }
- }
- }
-
- return state;
-};
-
-/**
- *
- */
-HoverIcons.prototype.update = function(state, x, y)
-{
- if (!this.graph.connectionArrowsEnabled || (state != null &&
- mxUtils.getValue(state.style, 'allowArrows', '1') == '0'))
- {
- this.reset();
- }
- else
- {
- if (state != null && state.cell.geometry != null && state.cell.geometry.relative &&
- this.graph.model.isEdge(state.cell.parent))
- {
- state = null;
- }
-
- var timeOnTarget = null;
-
- // Time on target
- if (this.prev != state || this.isActive())
- {
- this.startTime = new Date().getTime();
- this.prev = state;
- timeOnTarget = 0;
-
- if (this.updateThread != null)
- {
- window.clearTimeout(this.updateThread);
- }
-
- if (state != null)
- {
- // Starts timer to update current state with no mouse events
- this.updateThread = window.setTimeout(mxUtils.bind(this, function()
- {
- if (!this.isActive() && !this.graph.isMouseDown &&
- !this.graph.panningHandler.isActive())
- {
- this.prev = state;
- this.update(state, x, y);
- }
- }), this.updateDelay + 10);
- }
- }
- else if (this.startTime != null)
- {
- timeOnTarget = new Date().getTime() - this.startTime;
- }
-
- this.setDisplay('');
-
- if (this.currentState != null && this.currentState != state && timeOnTarget < this.activationDelay &&
- this.bbox != null && !mxUtils.contains(this.bbox, x, y))
- {
- this.reset(false);
- }
- else if (this.currentState != null || timeOnTarget > this.activationDelay)
- {
- if (this.currentState != state && ((timeOnTarget > this.updateDelay && state != null) ||
- this.bbox == null || x == null || y == null || !mxUtils.contains(this.bbox, x, y)))
- {
- if (state != null && this.graph.isEnabled())
- {
- this.removeNodes();
- this.setCurrentState(state);
- this.repaint();
-
- // Resets connection points on other focused cells
- if (this.graph.connectionHandler.constraintHandler.currentFocus != state)
- {
- this.graph.connectionHandler.constraintHandler.reset();
- }
- }
- else
- {
- this.reset();
- }
- }
- }
- }
-};
-
-/**
- *
- */
-HoverIcons.prototype.setCurrentState = function(state)
-{
- if (state.style['portConstraint'] != 'eastwest')
- {
- this.graph.container.appendChild(this.arrowUp);
- this.graph.container.appendChild(this.arrowDown);
- }
-
- this.graph.container.appendChild(this.arrowRight);
- this.graph.container.appendChild(this.arrowLeft);
- this.currentState = state;
-};
-
-/**
- * Returns true if the given cell is a table.
- */
-Graph.prototype.createParent = function(parent, child, childCount, dx, dy)
-{
- parent = this.cloneCell(parent);
-
- for (var i = 0; i < childCount; i++)
- {
- var clone = this.cloneCell(child);
- var geo = this.getCellGeometry(clone)
-
- if (geo != null)
- {
- geo.x += i * dx;
- geo.y += i * dy;
- }
-
- parent.insert(clone);
- }
-
- return parent;
-};
-
-/**
- * Returns true if the given cell is a table.
- */
-Graph.prototype.createTable = function(rowCount, colCount, w, h, title, startSize, tableStyle, rowStyle, cellStyle)
-{
- w = (w != null) ? w : 60;
- h = (h != null) ? h : 40;
- startSize = (startSize != null) ? startSize : 30;
- tableStyle = (tableStyle != null) ? tableStyle : 'shape=table;html=1;whiteSpace=wrap;startSize=' +
- ((title != null) ? startSize : '0') + ';container=1;collapsible=0;childLayout=tableLayout;';
- rowStyle = (rowStyle != null) ? rowStyle : 'shape=partialRectangle;html=1;whiteSpace=wrap;collapsible=0;dropTarget=0;' +
- 'pointerEvents=0;fillColor=none;top=0;left=0;bottom=0;right=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;';
- cellStyle = (cellStyle != null) ? cellStyle : 'shape=partialRectangle;html=1;whiteSpace=wrap;connectable=0;' +
- 'overflow=hidden;fillColor=none;top=0;left=0;bottom=0;right=0;';
-
- return this.createParent(this.createVertex(null, null, (title != null) ? title : '',
- 0, 0, colCount * w, rowCount * h + ((title != null) ? startSize : 0), tableStyle),
- this.createParent(this.createVertex(null, null, '', 0, 0, colCount * w, h, rowStyle),
- this.createVertex(null, null, '', 0, 0, w, h, cellStyle),
- colCount, w, 0), rowCount, 0, h);
-};
-
-/**
- * Sets the values for the cells and rows in the given table and returns the table.
- */
-Graph.prototype.setTableValues = function(table, values, rowValues)
-{
- var rows = this.model.getChildCells(table, true);
-
- for (var i = 0; i < rows.length; i++)
- {
- if (rowValues != null)
- {
- rows[i].value = rowValues[i];
- }
-
- if (values != null)
- {
- var cells = this.model.getChildCells(rows[i], true);
-
- for (var j = 0; j < cells.length; j++)
- {
- if (values[i][j] != null)
- {
- cells[j].value = values[i][j];
- }
- }
- }
- }
-
- return table;
-};
-
-/**
- *
- */
-Graph.prototype.createCrossFunctionalSwimlane = function(rowCount, colCount, w, h, startSize, tableStyle, rowStyle, firstCellStyle, cellStyle)
-{
- w = (w != null) ? w : 120;
- h = (h != null) ? h : 120;
- startSize = (startSize != null) ? startSize : 40;
-
- var s = 'html=1;whiteSpace=wrap;collapsible=0;recursiveResize=0;expand=0;pointerEvents=0;';
- tableStyle = (tableStyle != null) ? tableStyle : 'shape=table;childLayout=tableLayout;' +
- 'rowLines=0;columnLines=0;startSize=' + startSize + ';' + s;
- rowStyle = (rowStyle != null) ? rowStyle : 'swimlane;horizontal=0;points=[[0,0.5],[1,0.5]];' +
- 'portConstraint=eastwest;startSize=' + startSize + ';' + s;
- firstCellStyle = (firstCellStyle != null) ? firstCellStyle : 'swimlane;connectable=0;startSize=40;' + s;
- cellStyle = (cellStyle != null) ? cellStyle : 'swimlane;connectable=0;startSize=0;' + s;
-
- var table = this.createVertex(null, null, '', 0, 0,
- colCount * w, rowCount * h, tableStyle);
- var t = mxUtils.getValue(this.getCellStyle(table), mxConstants.STYLE_STARTSIZE,
- mxConstants.DEFAULT_STARTSIZE);
- table.geometry.width += t;
- table.geometry.height += t;
-
- var row = this.createVertex(null, null, '', 0, t, colCount * w + t, h, rowStyle);
- table.insert(this.createParent(row, this.createVertex(null, null,
- '', t, 0, w, h, firstCellStyle), colCount, w, 0));
-
- if (rowCount > 1)
- {
- row.geometry.y = h + t;
-
- return this.createParent(table, this.createParent(row,
- this.createVertex(null, null, '', t, 0, w, h, cellStyle),
- colCount, w, 0), rowCount - 1, 0, h);
- }
- else
- {
- return table;
- }
-};
-
-/**
- * Returns true if the given cell is a table cell.
- */
-Graph.prototype.isTableCell = function(cell)
-{
- return this.model.isVertex(cell) && this.isTableRow(this.model.getParent(cell));
-};
-
-/**
- * Returns true if the given cell is a table row.
- */
-Graph.prototype.isTableRow = function(cell)
-{
- return this.model.isVertex(cell) && this.isTable(this.model.getParent(cell));
-};
-
-/**
- * Returns true if the given cell is a table.
- */
-Graph.prototype.isTable = function(cell)
-{
- var style = this.getCellStyle(cell);
-
- return style != null && style['childLayout'] == 'tableLayout';
-};
-
-/**
- * Updates the row and table heights.
- */
-Graph.prototype.setTableRowHeight = function(row, dy, extend)
-{
- extend = (extend != null) ? extend : true;
- var model = this.getModel();
-
- model.beginUpdate();
- try
- {
- var rgeo = this.getCellGeometry(row);
-
- // Sets height of row
- if (rgeo != null)
- {
- rgeo = rgeo.clone();
- rgeo.height += dy;
- model.setGeometry(row, rgeo);
-
- var table = model.getParent(row);
- var rows = model.getChildCells(table, true);
-
- // Shifts and resizes neighbor row
- if (!extend)
- {
- var index = mxUtils.indexOf(rows, row);
-
- if (index < rows.length - 1)
- {
- var nextRow = rows[index + 1];
- var geo = this.getCellGeometry(nextRow);
-
- if (geo != null)
- {
- geo = geo.clone();
- geo.y += dy;
- geo.height -= dy;
-
- model.setGeometry(nextRow, geo);
- }
- }
- }
-
- // Updates height of table
- var tgeo = this.getCellGeometry(table);
-
- if (tgeo != null)
- {
- // Always extends for last row
- if (!extend)
- {
- extend = row == rows[rows.length - 1];
- }
-
- if (extend)
- {
- tgeo = tgeo.clone();
- tgeo.height += dy;
- model.setGeometry(table, tgeo);
- }
- }
-
- if (this.layoutManager != null)
- {
- this.layoutManager.executeLayout(table, true);
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
-};
-
-/**
- * Updates column width and row height.
- */
-Graph.prototype.setTableColumnWidth = function(col, dx, extend)
-{
- extend = (extend != null) ? extend : false;
-
- var model = this.getModel();
- var row = model.getParent(col);
- var table = model.getParent(row);
- var cells = model.getChildCells(row, true);
- var index = mxUtils.indexOf(cells, col);
- var lastColumn = index == cells.length - 1;
-
- model.beginUpdate();
- try
- {
- // Sets width of child cell
- var rows = model.getChildCells(table, true);
-
- for (var i = 0; i < rows.length; i++)
- {
- row = rows[i];
- cells = model.getChildCells(row, true);
- var cell = cells[index];
- var geo = this.getCellGeometry(cell);
-
- if (geo != null)
- {
- geo = geo.clone();
- geo.width += dx;
- model.setGeometry(cell, geo);
- }
-
- // Shifts and resizes neighbor column
- if (index < cells.length - 1)
- {
- cell = cells[index + 1];
- var geo = this.getCellGeometry(cell);
-
- if (geo != null)
- {
- geo = geo.clone();
- geo.x += dx;
-
- if (!extend)
- {
- geo.width -= dx;
- }
-
- model.setGeometry(cell, geo);
- }
- }
- }
-
- if (lastColumn || extend)
- {
- // Updates width of table
- var tgeo = this.getCellGeometry(table);
-
- if (tgeo != null)
- {
- tgeo = tgeo.clone();
- tgeo.width += dx;
- model.setGeometry(table, tgeo);
- }
- }
-
- if (this.layoutManager != null)
- {
- this.layoutManager.executeLayout(table, true);
- }
- }
- finally
- {
- model.endUpdate();
- }
-};
-
-/**
- * Special Layout for tables.
- */
-function TableLayout(graph)
-{
- mxGraphLayout.call(this, graph);
-};
-
-/**
- * Extends mxGraphLayout.
- */
-TableLayout.prototype = new mxStackLayout();
-TableLayout.prototype.constructor = TableLayout;
-
-/**
- * Function: isHorizontal
- *
- * Overrides stack layout to handle row reorder.
- */
-TableLayout.prototype.isHorizontal = function()
-{
- return false;
-};
-
-/**
- * Function: isVertexIgnored
- *
- * Overrides to allow for table rows and cells.
- */
-TableLayout.prototype.isVertexIgnored = function(vertex)
-{
- return !this.graph.getModel().isVertex(vertex) ||
- !this.graph.isCellVisible(vertex);
-};
-
-/**
- * Function: getSize
- *
- * Returns the total vertical or horizontal size of the given cells.
- */
-TableLayout.prototype.getSize = function(cells, horizontal)
-{
- var total = 0;
-
- for (var i = 0; i < cells.length; i++)
- {
- if (!this.isVertexIgnored(cells[i]))
- {
- var geo = this.graph.getCellGeometry(cells[i]);
-
- if (geo != null)
- {
- total += (horizontal) ? geo.width : geo.height;
- }
- }
- }
-
- return total;
-};
-
-/**
- * Function: getRowLayout
- *
- * Returns the column positions for the given row and table width.
- */
-TableLayout.prototype.getRowLayout = function(row, width)
-{
- var cells = this.graph.model.getChildCells(row, true);
- var off = this.graph.getActualStartSize(row, true);
- var sw = this.getSize(cells, true);
- var rw = width - off.x - off.width;
- var result = [];
- var x = off.x;
-
- for (var i = 0; i < cells.length; i++)
- {
- var cell = this.graph.getCellGeometry(cells[i]);
-
- if (cell != null)
- {
- x += cell.width * rw / sw;
- result.push(Math.round(x));
- }
- }
-
- return result;
-};
-
-/**
- * Function: layoutRow
- *
- * Places the cells at the given positions in the given row.
- */
-TableLayout.prototype.layoutRow = function(row, positions, height, tw)
-{
- var model = this.graph.getModel();
- var cells = model.getChildCells(row, true);
- var off = this.graph.getActualStartSize(row, true);
- var x = off.x;
- var sw = 0;
-
- if (positions != null)
- {
- positions = positions.slice();
- positions.splice(0, 0, off.x);
- }
-
- for (var i = 0; i < cells.length; i++)
- {
- var cell = this.graph.getCellGeometry(cells[i]);
-
- if (cell != null)
- {
- cell = cell.clone();
-
- cell.y = off.y;
- cell.height = height - off.y - off.height;
-
- if (positions != null)
- {
- cell.x = positions[i];
- cell.width = positions[i + 1] - cell.x;
-
- // Fills with last cell if not enough cells
- if (i == cells.length - 1 && i < positions.length - 2)
- {
- cell.width = tw - cell.x - off.x - off.width;
- }
- }
- else
- {
- cell.x = x;
- x += cell.width;
-
- if (i == cells.length - 1)
- {
- cell.width = tw - off.x - off.width - sw;
- }
- else
- {
- sw += cell.width;
- }
- }
-
- model.setGeometry(cells[i], cell);
- }
- }
-
- return sw;
-};
-
-/**
- * Function: execute
- *
- * Implements <mxGraphLayout.execute>.
- */
-TableLayout.prototype.execute = function(parent)
-{
- if (parent != null)
- {
- var offset = this.graph.getActualStartSize(parent, true);
- var table = this.graph.getCellGeometry(parent);
- var style = this.graph.getCellStyle(parent);
- var resizeLastRow = mxUtils.getValue(style,
- 'resizeLastRow', '0') == '1';
- var resizeLast = mxUtils.getValue(style,
- 'resizeLast', '0') == '1';
- var fixedRows = mxUtils.getValue(style,
- 'fixedRows', '0') == '1';
- var model = this.graph.getModel();
- var sw = 0;
-
- model.beginUpdate();
- try
- {
- var th = table.height - offset.y - offset.height;
- var tw = table.width - offset.x - offset.width;
- var rows = model.getChildCells(parent, true);
- var sh = this.getSize(rows, false);
-
- if (th > 0 && tw > 0 && rows.length > 0 && sh > 0)
- {
- if (resizeLastRow)
- {
- var row = this.graph.getCellGeometry(rows[rows.length - 1]);
-
- if (row != null)
- {
- row = row.clone();
- row.height = th - sh + row.height;
- model.setGeometry(rows[rows.length - 1], row);
- }
- }
-
- var pos = (resizeLast) ? null : this.getRowLayout(rows[0], tw);
- var y = offset.y;
-
- // Updates row geometries
- for (var i = 0; i < rows.length; i++)
- {
- var row = this.graph.getCellGeometry(rows[i]);
-
- if (row != null)
- {
- row = row.clone();
- row.x = offset.x;
- row.width = tw;
- row.y = Math.round(y);
-
- if (resizeLastRow || fixedRows)
- {
- y += row.height;
- }
- else
- {
- y += (row.height / sh) * th;
- }
-
- row.height = Math.round(y) - row.y;
- model.setGeometry(rows[i], row);
- }
-
- // Updates cell geometries
- sw = Math.max(sw, this.layoutRow(rows[i], pos, row.height, tw));
- }
-
- if (fixedRows && th < sh)
- {
- table = table.clone();
- table.height = y + offset.height;
- model.setGeometry(parent, table);
- }
-
- if (resizeLast && tw < sw + Graph.minTableColumnWidth)
- {
- table = table.clone();
- table.width = sw + offset.width + offset.x + Graph.minTableColumnWidth;
- model.setGeometry(parent, table);
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
- }
-};
-
-(function()
-{
- /**
- * Reset the list of processed edges.
- */
- var mxGraphViewResetValidationState = mxGraphView.prototype.resetValidationState;
- mxGraphView.prototype.resetValidationState = function()
- {
- mxGraphViewResetValidationState.apply(this, arguments);
-
- this.validEdges = [];
- };
-
- /**
- * Updates jumps for valid edges and repaints if needed.
- */
- var mxGraphViewValidateCellState = mxGraphView.prototype.validateCellState;
- mxGraphView.prototype.validateCellState = function(cell, recurse)
- {
- recurse = (recurse != null) ? recurse : true;
- var state = this.getState(cell);
-
- // Forces repaint if jumps change on a valid edge
- if (state != null && recurse && this.graph.model.isEdge(state.cell) &&
- state.style != null && state.style[mxConstants.STYLE_CURVED] != 1 &&
- !state.invalid && this.updateLineJumps(state))
- {
- this.graph.cellRenderer.redraw(state, false, this.isRendering());
- }
-
- state = mxGraphViewValidateCellState.apply(this, arguments);
-
- // Adds to the list of edges that may intersect with later edges
- if (state != null && recurse && this.graph.model.isEdge(state.cell) &&
- state.style != null && state.style[mxConstants.STYLE_CURVED] != 1)
- {
- // LATER: Reuse jumps for valid edges
- this.validEdges.push(state);
- }
-
- return state;
- };
-
- /**
- * Forces repaint if routed points have changed.
- */
- var mxCellRendererIsShapeInvalid = mxCellRenderer.prototype.isShapeInvalid;
- mxCellRenderer.prototype.isShapeInvalid = function(state, shape)
- {
- return mxCellRendererIsShapeInvalid.apply(this, arguments) ||
- (state.routedPoints != null && shape.routedPoints != null &&
- !mxUtils.equalPoints(shape.routedPoints, state.routedPoints))
- };
-
- /**
- * Updates jumps for invalid edges.
- */
- var mxGraphViewUpdateCellState = mxGraphView.prototype.updateCellState;
- mxGraphView.prototype.updateCellState = function(state)
- {
- mxGraphViewUpdateCellState.apply(this, arguments);
-
- // Updates jumps on invalid edge before repaint
- if (this.graph.model.isEdge(state.cell) &&
- state.style[mxConstants.STYLE_CURVED] != 1)
- {
- this.updateLineJumps(state);
- }
- };
-
- /**
- * Updates the jumps between given state and processed edges.
- */
- mxGraphView.prototype.updateLineJumps = function(state)
- {
- var pts = state.absolutePoints;
-
- if (Graph.lineJumpsEnabled)
- {
- var changed = state.routedPoints != null;
- var actual = null;
-
- if (pts != null && this.validEdges != null &&
- mxUtils.getValue(state.style, 'jumpStyle', 'none') !== 'none')
- {
- var thresh = 0.5 * this.scale;
- changed = false;
- actual = [];
-
- // Type 0 means normal waypoint, 1 means jump
- function addPoint(type, x, y)
- {
- var rpt = new mxPoint(x, y);
- rpt.type = type;
-
- actual.push(rpt);
- var curr = (state.routedPoints != null) ? state.routedPoints[actual.length - 1] : null;
-
- return curr == null || curr.type != type || curr.x != x || curr.y != y;
- };
-
- for (var i = 0; i < pts.length - 1; i++)
- {
- var p1 = pts[i + 1];
- var p0 = pts[i];
- var list = [];
-
- // Ignores waypoints on straight segments
- var pn = pts[i + 2];
-
- while (i < pts.length - 2 &&
- mxUtils.ptSegDistSq(p0.x, p0.y, pn.x, pn.y,
- p1.x, p1.y) < 1 * this.scale * this.scale)
- {
- p1 = pn;
- i++;
- pn = pts[i + 2];
- }
-
- changed = addPoint(0, p0.x, p0.y) || changed;
-
- // Processes all previous edges
- for (var e = 0; e < this.validEdges.length; e++)
- {
- var state2 = this.validEdges[e];
- var pts2 = state2.absolutePoints;
-
- if (pts2 != null && mxUtils.intersects(state, state2) && state2.style['noJump'] != '1')
- {
- // Compares each segment of the edge with the current segment
- for (var j = 0; j < pts2.length - 1; j++)
- {
- var p3 = pts2[j + 1];
- var p2 = pts2[j];
-
- // Ignores waypoints on straight segments
- pn = pts2[j + 2];
-
- while (j < pts2.length - 2 &&
- mxUtils.ptSegDistSq(p2.x, p2.y, pn.x, pn.y,
- p3.x, p3.y) < 1 * this.scale * this.scale)
- {
- p3 = pn;
- j++;
- pn = pts2[j + 2];
- }
-
- var pt = mxUtils.intersection(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);
-
- // Handles intersection between two segments
- if (pt != null && (Math.abs(pt.x - p0.x) > thresh ||
- Math.abs(pt.y - p0.y) > thresh) &&
- (Math.abs(pt.x - p1.x) > thresh ||
- Math.abs(pt.y - p1.y) > thresh) &&
- (Math.abs(pt.x - p2.x) > thresh ||
- Math.abs(pt.y - p2.y) > thresh) &&
- (Math.abs(pt.x - p3.x) > thresh ||
- Math.abs(pt.y - p3.y) > thresh))
- {
- var dx = pt.x - p0.x;
- var dy = pt.y - p0.y;
- var temp = {distSq: dx * dx + dy * dy, x: pt.x, y: pt.y};
-
- // Intersections must be ordered by distance from start of segment
- for (var t = 0; t < list.length; t++)
- {
- if (list[t].distSq > temp.distSq)
- {
- list.splice(t, 0, temp);
- temp = null;
-
- break;
- }
- }
-
- // Ignores multiple intersections at segment joint
- if (temp != null && (list.length == 0 ||
- list[list.length - 1].x !== temp.x ||
- list[list.length - 1].y !== temp.y))
- {
- list.push(temp);
- }
- }
- }
- }
- }
-
- // Adds ordered intersections to routed points
- for (var j = 0; j < list.length; j++)
- {
- changed = addPoint(1, list[j].x, list[j].y) || changed;
- }
- }
-
- var pt = pts[pts.length - 1];
- changed = addPoint(0, pt.x, pt.y) || changed;
- }
-
- state.routedPoints = actual;
-
- return changed;
- }
- else
- {
- return false;
- }
- };
-
- /**
- * Overrides painting the actual shape for taking into account jump style.
- */
- var mxConnectorPaintLine = mxConnector.prototype.paintLine;
-
- mxConnector.prototype.paintLine = function (c, absPts, rounded)
- {
- // Required for checking dirty state
- this.routedPoints = (this.state != null) ? this.state.routedPoints : null;
-
- if (this.outline || this.state == null || this.style == null ||
- this.state.routedPoints == null || this.state.routedPoints.length == 0)
- {
- mxConnectorPaintLine.apply(this, arguments);
- }
- else
- {
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.LINE_ARCSIZE) / 2;
- var size = (parseInt(mxUtils.getValue(this.style, 'jumpSize',
- Graph.defaultJumpSize)) - 2) / 2 + this.strokewidth;
- var style = mxUtils.getValue(this.style, 'jumpStyle', 'none');
- var moveTo = true;
- var last = null;
- var len = null;
- var pts = [];
- var n = null;
- c.begin();
-
- for (var i = 0; i < this.state.routedPoints.length; i++)
- {
- var rpt = this.state.routedPoints[i];
- var pt = new mxPoint(rpt.x / this.scale, rpt.y / this.scale);
-
- // Takes first and last point from passed-in array
- if (i == 0)
- {
- pt = absPts[0];
- }
- else if (i == this.state.routedPoints.length - 1)
- {
- pt = absPts[absPts.length - 1];
- }
-
- var done = false;
-
- // Type 1 is an intersection
- if (last != null && rpt.type == 1)
- {
- // Checks if next/previous points are too close
- var next = this.state.routedPoints[i + 1];
- var dx = next.x / this.scale - pt.x;
- var dy = next.y / this.scale - pt.y;
- var dist = dx * dx + dy * dy;
-
- if (n == null)
- {
- n = new mxPoint(pt.x - last.x, pt.y - last.y);
- len = Math.sqrt(n.x * n.x + n.y * n.y);
-
- if (len > 0)
- {
- n.x = n.x * size / len;
- n.y = n.y * size / len;
- }
- else
- {
- n = null;
- }
- }
-
- if (dist > size * size && len > 0)
- {
- var dx = last.x - pt.x;
- var dy = last.y - pt.y;
- var dist = dx * dx + dy * dy;
-
- if (dist > size * size)
- {
- var p0 = new mxPoint(pt.x - n.x, pt.y - n.y);
- var p1 = new mxPoint(pt.x + n.x, pt.y + n.y);
- pts.push(p0);
-
- this.addPoints(c, pts, rounded, arcSize, false, null, moveTo);
-
- var f = (Math.round(n.x) < 0 || (Math.round(n.x) == 0
- && Math.round(n.y) <= 0)) ? 1 : -1;
- moveTo = false;
-
- if (style == 'sharp')
- {
- c.lineTo(p0.x - n.y * f, p0.y + n.x * f);
- c.lineTo(p1.x - n.y * f, p1.y + n.x * f);
- c.lineTo(p1.x, p1.y);
- }
- else if (style == 'arc')
- {
- f *= 1.3;
- c.curveTo(p0.x - n.y * f, p0.y + n.x * f,
- p1.x - n.y * f, p1.y + n.x * f,
- p1.x, p1.y);
- }
- else
- {
- c.moveTo(p1.x, p1.y);
- moveTo = true;
- }
-
- pts = [p1];
- done = true;
- }
- }
- }
- else
- {
- n = null;
- }
-
- if (!done)
- {
- pts.push(pt);
- last = pt;
- }
- }
-
- this.addPoints(c, pts, rounded, arcSize, false, null, moveTo);
- c.stroke();
- }
- };
-
- /**
- * Adds support for snapToPoint style.
- */
- var mxGraphViewUpdateFloatingTerminalPoint = mxGraphView.prototype.updateFloatingTerminalPoint;
-
- mxGraphView.prototype.updateFloatingTerminalPoint = function(edge, start, end, source)
- {
- if (start != null && edge != null &&
- (start.style['snapToPoint'] == '1' ||
- edge.style['snapToPoint'] == '1'))
- {
- start = this.getTerminalPort(edge, start, source);
- var next = this.getNextPoint(edge, end, source);
-
- var orth = this.graph.isOrthogonal(edge);
- var alpha = mxUtils.toRadians(Number(start.style[mxConstants.STYLE_ROTATION] || '0'));
- var center = new mxPoint(start.getCenterX(), start.getCenterY());
-
- if (alpha != 0)
- {
- var cos = Math.cos(-alpha);
- var sin = Math.sin(-alpha);
- next = mxUtils.getRotatedPoint(next, cos, sin, center);
- }
-
- var border = parseFloat(edge.style[mxConstants.STYLE_PERIMETER_SPACING] || 0);
- border += parseFloat(edge.style[(source) ?
- mxConstants.STYLE_SOURCE_PERIMETER_SPACING :
- mxConstants.STYLE_TARGET_PERIMETER_SPACING] || 0);
- var pt = this.getPerimeterPoint(start, next, alpha == 0 && orth, border);
-
- if (alpha != 0)
- {
- var cos = Math.cos(alpha);
- var sin = Math.sin(alpha);
- pt = mxUtils.getRotatedPoint(pt, cos, sin, center);
- }
-
- edge.setAbsoluteTerminalPoint(this.snapToAnchorPoint(edge, start, end, source, pt), source);
- }
- else
- {
- mxGraphViewUpdateFloatingTerminalPoint.apply(this, arguments);
- }
- };
-
- mxGraphView.prototype.snapToAnchorPoint = function(edge, start, end, source, pt)
- {
- if (start != null && edge != null)
- {
- var constraints = this.graph.getAllConnectionConstraints(start)
- var nearest = null;
- var dist = null;
-
- if (constraints != null)
- {
- for (var i = 0; i < constraints.length; i++)
- {
- var cp = this.graph.getConnectionPoint(start, constraints[i]);
-
- if (cp != null)
- {
- var tmp = (cp.x - pt.x) * (cp.x - pt.x) + (cp.y - pt.y) * (cp.y - pt.y);
-
- if (dist == null || tmp < dist)
- {
- nearest = cp;
- dist = tmp;
- }
- }
- }
- }
-
- if (nearest != null)
- {
- pt = nearest;
- }
- }
-
- return pt;
- };
-
- /**
- * Adds support for placeholders in text elements of shapes.
- */
- var mxStencilEvaluateTextAttribute = mxStencil.prototype.evaluateTextAttribute;
-
- mxStencil.prototype.evaluateTextAttribute = function(node, attribute, shape)
- {
- var result = mxStencilEvaluateTextAttribute.apply(this, arguments);
- var placeholders = node.getAttribute('placeholders');
-
- if (placeholders == '1' && shape.state != null)
- {
- result = shape.state.view.graph.replacePlaceholders(shape.state.cell, result);
- }
-
- return result;
- };
-
- /**
- * Adds custom stencils defined via shape=stencil(value) style. The value is a base64 encoded, compressed and
- * URL encoded XML definition of the shape according to the stencil definition language of mxGraph.
- *
- * Needs to be in this file to make sure its part of the embed client code. Also the check for ZLib is
- * different than for the Editor code.
- */
- var mxCellRendererCreateShape = mxCellRenderer.prototype.createShape;
- mxCellRenderer.prototype.createShape = function(state)
- {
- if (state.style != null && typeof(pako) !== 'undefined')
- {
- var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null);
-
- // Extracts and decodes stencil XML if shape has the form shape=stencil(value)
- if (shape != null && typeof shape === 'string' && shape.substring(0, 8) == 'stencil(')
- {
- try
- {
- var stencil = shape.substring(8, shape.length - 1);
- var doc = mxUtils.parseXml(Graph.decompress(stencil));
-
- return new mxShape(new mxStencil(doc.documentElement));
- }
- catch (e)
- {
- if (window.console != null)
- {
- console.log('Error in shape: ' + e);
- }
- }
- }
- }
-
- return mxCellRendererCreateShape.apply(this, arguments);
- };
-})();
-
-/**
- * Overrides stencil registry for dynamic loading of stencils.
- */
-/**
- * Maps from library names to an array of Javascript filenames,
- * which are synchronously loaded. Currently only stencil files
- * (.xml) and JS files (.js) are supported.
- * IMPORTANT: For embedded diagrams to work entries must also
- * be added in EmbedServlet.java.
- */
-mxStencilRegistry.libraries = {};
-
-/**
- * Global switch to disable dynamic loading.
- */
-mxStencilRegistry.dynamicLoading = true;
-
-/**
- * Global switch to disable eval for JS (preload all JS instead).
- */
-mxStencilRegistry.allowEval = true;
-
-/**
- * Stores all package names that have been dynamically loaded.
- * Each package is only loaded once.
- */
-mxStencilRegistry.packages = [];
-
-// Extends the default stencil registry to add dynamic loading
-mxStencilRegistry.getStencil = function(name)
-{
- var result = mxStencilRegistry.stencils[name];
-
- if (result == null && mxCellRenderer.defaultShapes[name] == null && mxStencilRegistry.dynamicLoading)
- {
- var basename = mxStencilRegistry.getBasenameForStencil(name);
-
- // Loads stencil files and tries again
- if (basename != null)
- {
- var libs = mxStencilRegistry.libraries[basename];
-
- if (libs != null)
- {
- if (mxStencilRegistry.packages[basename] == null)
- {
- for (var i = 0; i < libs.length; i++)
- {
- var fname = libs[i];
-
- if (fname.toLowerCase().substring(fname.length - 4, fname.length) == '.xml')
- {
- mxStencilRegistry.loadStencilSet(fname, null);
- }
- else if (fname.toLowerCase().substring(fname.length - 3, fname.length) == '.js')
- {
- try
- {
- if (mxStencilRegistry.allowEval)
- {
- var req = mxUtils.load(fname);
-
- if (req != null && req.getStatus() >= 200 && req.getStatus() <= 299)
- {
- eval.call(window, req.getText());
- }
- }
- }
- catch (e)
- {
- if (window.console != null)
- {
- console.log('error in getStencil:', fname, e);
- }
- }
- }
- else
- {
- // FIXME: This does not yet work as the loading is triggered after
- // the shape was used in the graph, at which point the keys have
- // typically been translated in the calling method.
- //mxResources.add(fname);
- }
- }
-
- mxStencilRegistry.packages[basename] = 1;
- }
- }
- else
- {
- // Replaces '_-_' with '_'
- basename = basename.replace('_-_', '_');
- mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/' + basename + '.xml', null);
- }
-
- result = mxStencilRegistry.stencils[name];
- }
- }
-
- return result;
-};
-
-// Returns the basename for the given stencil or null if no file must be
-// loaded to render the given stencil.
-mxStencilRegistry.getBasenameForStencil = function(name)
-{
- var tmp = null;
-
- if (name != null && typeof name === 'string')
- {
- var parts = name.split('.');
-
- if (parts.length > 0 && parts[0] == 'mxgraph')
- {
- tmp = parts[1];
-
- for (var i = 2; i < parts.length - 1; i++)
- {
- tmp += '/' + parts[i];
- }
- }
- }
-
- return tmp;
-};
-
-// Loads the given stencil set
-mxStencilRegistry.loadStencilSet = function(stencilFile, postStencilLoad, force, async)
-{
- force = (force != null) ? force : false;
-
- // Uses additional cache for detecting previous load attempts
- var xmlDoc = mxStencilRegistry.packages[stencilFile];
-
- if (force || xmlDoc == null)
- {
- var install = false;
-
- if (xmlDoc == null)
- {
- try
- {
- if (async)
- {
- mxStencilRegistry.loadStencil(stencilFile, mxUtils.bind(this, function(xmlDoc2)
- {
- if (xmlDoc2 != null && xmlDoc2.documentElement != null)
- {
- mxStencilRegistry.packages[stencilFile] = xmlDoc2;
- install = true;
- mxStencilRegistry.parseStencilSet(xmlDoc2.documentElement, postStencilLoad, install);
- }
- }));
-
- return;
- }
- else
- {
- xmlDoc = mxStencilRegistry.loadStencil(stencilFile);
- mxStencilRegistry.packages[stencilFile] = xmlDoc;
- install = true;
- }
- }
- catch (e)
- {
- if (window.console != null)
- {
- console.log('error in loadStencilSet:', stencilFile, e);
- }
- }
- }
-
- if (xmlDoc != null && xmlDoc.documentElement != null)
- {
- mxStencilRegistry.parseStencilSet(xmlDoc.documentElement, postStencilLoad, install);
- }
- }
-};
-
-// Loads the given stencil XML file.
-mxStencilRegistry.loadStencil = function(filename, fn)
-{
- if (fn != null)
- {
- var req = mxUtils.get(filename, mxUtils.bind(this, function(req)
- {
- fn((req.getStatus() >= 200 && req.getStatus() <= 299) ? req.getXml() : null);
- }));
- }
- else
- {
- return mxUtils.load(filename).getXml();
- }
-};
-
-// Takes array of strings
-mxStencilRegistry.parseStencilSets = function(stencils)
-{
- for (var i = 0; i < stencils.length; i++)
- {
- mxStencilRegistry.parseStencilSet(mxUtils.parseXml(stencils[i]).documentElement);
- }
-};
-
-// Parses the given stencil set
-mxStencilRegistry.parseStencilSet = function(root, postStencilLoad, install)
-{
- if (root.nodeName == 'stencils')
- {
- var shapes = root.firstChild;
-
- while (shapes != null)
- {
- if (shapes.nodeName == 'shapes')
- {
- mxStencilRegistry.parseStencilSet(shapes, postStencilLoad, install);
- }
-
- shapes = shapes.nextSibling;
- }
- }
- else
- {
- install = (install != null) ? install : true;
- var shape = root.firstChild;
- var packageName = '';
- var name = root.getAttribute('name');
-
- if (name != null)
- {
- packageName = name + '.';
- }
-
- while (shape != null)
- {
- if (shape.nodeType == mxConstants.NODETYPE_ELEMENT)
- {
- name = shape.getAttribute('name');
-
- if (name != null)
- {
- packageName = packageName.toLowerCase();
- var stencilName = name.replace(/ /g,"_");
-
- if (install)
- {
- mxStencilRegistry.addStencil(packageName + stencilName.toLowerCase(), new mxStencil(shape));
- }
-
- if (postStencilLoad != null)
- {
- var w = shape.getAttribute('w');
- var h = shape.getAttribute('h');
-
- w = (w == null) ? 80 : parseInt(w, 10);
- h = (h == null) ? 80 : parseInt(h, 10);
-
- postStencilLoad(packageName, stencilName, name, w, h);
- }
- }
- }
-
- shape = shape.nextSibling;
- }
- }
-};
-
-/**
- * These overrides are only added if mxVertexHandler is defined (ie. not in embedded graph)
- */
-if (typeof mxVertexHandler != 'undefined')
-{
- (function()
- {
- // Sets colors for handles
- mxConstants.HANDLE_FILLCOLOR = '#29b6f2';
- mxConstants.HANDLE_STROKECOLOR = '#0088cf';
- mxConstants.VERTEX_SELECTION_COLOR = '#00a8ff';
- mxConstants.OUTLINE_COLOR = '#00a8ff';
- mxConstants.OUTLINE_HANDLE_FILLCOLOR = '#99ccff';
- mxConstants.OUTLINE_HANDLE_STROKECOLOR = '#00a8ff';
- mxConstants.CONNECT_HANDLE_FILLCOLOR = '#cee7ff';
- mxConstants.EDGE_SELECTION_COLOR = '#00a8ff';
- mxConstants.DEFAULT_VALID_COLOR = '#00a8ff';
- mxConstants.LABEL_HANDLE_FILLCOLOR = '#cee7ff';
- mxConstants.GUIDE_COLOR = '#0088cf';
- mxConstants.HIGHLIGHT_OPACITY = 30;
- mxConstants.HIGHLIGHT_SIZE = 5;
-
- // Enables snapping to off-grid terminals for edge waypoints
- mxEdgeHandler.prototype.snapToTerminals = true;
-
- // Enables guides
- mxGraphHandler.prototype.guidesEnabled = true;
-
- // Removes parents where all child cells are moved out
- mxGraphHandler.prototype.removeEmptyParents = true;
-
- // Enables fading of rubberband
- mxRubberband.prototype.fadeOut = true;
-
- // Alt-move disables guides
- mxGuide.prototype.isEnabledForEvent = function(evt)
- {
- return !mxEvent.isAltDown(evt);
- };
-
- // Ignores all table cells in layouts
- var graphLayoutIsVertexIgnored = mxGraphLayout.prototype.isVertexIgnored;
- mxGraphLayout.prototype.isVertexIgnored = function(vertex)
- {
- return graphLayoutIsVertexIgnored.apply(this, arguments) ||
- this.graph.isTableRow(vertex) || this.graph.isTableCell(vertex);
- };
-
- // Extends connection handler to enable ctrl+drag for cloning source cell
- // since copyOnConnect is now disabled by default
- var mxConnectionHandlerCreateTarget = mxConnectionHandler.prototype.isCreateTarget;
- mxConnectionHandler.prototype.isCreateTarget = function(evt)
- {
- return this.graph.isCloneEvent(evt) || mxConnectionHandlerCreateTarget.apply(this, arguments);
- };
-
- // Overrides highlight shape for connection points
- mxConstraintHandler.prototype.createHighlightShape = function()
- {
- var hl = new mxEllipse(null, this.highlightColor, this.highlightColor, 0);
- hl.opacity = mxConstants.HIGHLIGHT_OPACITY;
-
- return hl;
- };
-
- // Overrides edge preview to use current edge shape and default style
- mxConnectionHandler.prototype.livePreview = true;
- mxConnectionHandler.prototype.cursor = 'crosshair';
-
- // Uses current edge style for connect preview
- mxConnectionHandler.prototype.createEdgeState = function(me)
- {
- var style = this.graph.createCurrentEdgeStyle();
- var edge = this.graph.createEdge(null, null, null, null, null, style);
- var state = new mxCellState(this.graph.view, edge, this.graph.getCellStyle(edge));
-
- for (var key in this.graph.currentEdgeStyle)
- {
- state.style[key] = this.graph.currentEdgeStyle[key];
- }
-
- return state;
- };
-
- // Overrides dashed state with current edge style
- var connectionHandlerCreateShape = mxConnectionHandler.prototype.createShape;
- mxConnectionHandler.prototype.createShape = function()
- {
- var shape = connectionHandlerCreateShape.apply(this, arguments);
-
- shape.isDashed = this.graph.currentEdgeStyle[mxConstants.STYLE_DASHED] == '1';
-
- return shape;
- }
-
- // Overrides live preview to keep current style
- mxConnectionHandler.prototype.updatePreview = function(valid)
- {
- // do not change color of preview
- };
-
- // Overrides connection handler to ignore edges instead of not allowing connections
- var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker;
- mxConnectionHandler.prototype.createMarker = function()
- {
- var marker = mxConnectionHandlerCreateMarker.apply(this, arguments);
-
- var markerGetCell = marker.getCell;
- marker.getCell = mxUtils.bind(this, function(me)
- {
- var result = markerGetCell.apply(this, arguments);
-
- this.error = null;
-
- return result;
- });
-
- return marker;
- };
-
- /**
- *
- */
- Graph.prototype.defaultVertexStyle = {};
-
- /**
- * Contains the default style for edges.
- */
- Graph.prototype.defaultEdgeStyle = {'edgeStyle': 'orthogonalEdgeStyle', 'rounded': '0',
- 'jettySize': 'auto', 'orthogonalLoop': '1'};
-
- /**
- * Returns the current edge style as a string.
- */
- Graph.prototype.createCurrentEdgeStyle = function()
- {
- var style = 'edgeStyle=' + (this.currentEdgeStyle['edgeStyle'] || 'none') + ';';
- var keys = ['shape', 'curved', 'rounded', 'comic', 'sketch', 'fillWeight', 'hachureGap',
- 'hachureAngle', 'jiggle', 'disableMultiStroke', 'disableMultiStrokeFill', 'fillStyle',
- 'curveFitting', 'simplification', 'comicStyle', 'jumpStyle', 'jumpSize'];
-
- for (var i = 0; i < keys.length; i++)
- {
- if (this.currentEdgeStyle[keys[i]] != null)
- {
- style += keys[i] + '=' + this.currentEdgeStyle[keys[i]] + ';';
- }
- }
-
- // Overrides the global default to match the default edge style
- if (this.currentEdgeStyle['orthogonalLoop'] != null)
- {
- style += 'orthogonalLoop=' + this.currentEdgeStyle['orthogonalLoop'] + ';';
- }
- else if (Graph.prototype.defaultEdgeStyle['orthogonalLoop'] != null)
- {
- style += 'orthogonalLoop=' + Graph.prototype.defaultEdgeStyle['orthogonalLoop'] + ';';
- }
-
- // Overrides the global default to match the default edge style
- if (this.currentEdgeStyle['jettySize'] != null)
- {
- style += 'jettySize=' + this.currentEdgeStyle['jettySize'] + ';';
- }
- else if (Graph.prototype.defaultEdgeStyle['jettySize'] != null)
- {
- style += 'jettySize=' + Graph.prototype.defaultEdgeStyle['jettySize'] + ';';
- }
-
- // Special logic for custom property of elbowEdgeStyle
- if (this.currentEdgeStyle['edgeStyle'] == 'elbowEdgeStyle' && this.currentEdgeStyle['elbow'] != null)
- {
- style += 'elbow=' + this.currentEdgeStyle['elbow'] + ';';
- }
-
- if (this.currentEdgeStyle['html'] != null)
- {
- style += 'html=' + this.currentEdgeStyle['html'] + ';';
- }
- else
- {
- style += 'html=1;';
- }
-
- return style;
- };
-
- /**
- * Removes implicit styles from cell styles so that dark mode works using the
- * default values from the stylesheet.
- */
- Graph.prototype.updateCellStyles = function(key, value, cells)
- {
- this.model.beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- if (this.model.isVertex(cells[i]) || this.model.isEdge(cells[i]))
- {
- this.setCellStyles(key, null, [cells[i]]);
- var style = this.getCellStyle(cells[i]);
- var temp = style[key];
-
- if (value != ((temp == null) ? mxConstants.NONE : temp))
- {
- this.setCellStyles(key, value, [cells[i]]);
- }
- }
- }
- }
- finally
- {
- this.model.endUpdate();
- }
- };
-
- /**
- * Hook for subclassers.
- */
- Graph.prototype.getPagePadding = function()
- {
- return new mxPoint(0, 0);
- };
-
- /**
- * Loads the stylesheet for this graph.
- */
- Graph.prototype.loadStylesheet = function()
- {
- var node = (this.themes != null) ? this.themes[this.defaultThemeName] :
- (!mxStyleRegistry.dynamicLoading) ? null :
- mxUtils.load(STYLE_PATH + '/default.xml').getDocumentElement();
-
- if (node != null)
- {
- var dec = new mxCodec(node.ownerDocument);
- dec.decode(node, this.getStylesheet());
- }
- };
-
- /**
- * Creates lookup from object IDs to cell IDs.
- */
- Graph.prototype.createCellLookup = function(cells, lookup)
- {
- lookup = (lookup != null) ? lookup : new Object();
-
- for (var i = 0; i < cells.length; i++)
- {
- var cell = cells[i];
- lookup[mxObjectIdentity.get(cell)] = cell.getId();
- var childCount = this.model.getChildCount(cell);
-
- for (var j = 0; j < childCount; j++)
- {
- this.createCellLookup([this.model.getChildAt(cell, j)], lookup);
- }
- }
-
- return lookup;
- };
-
- /**
- * Creates lookup from original to cloned cell IDs where mapping is
- * the mapping used in cloneCells and lookup is a mapping from
- * object IDs to cell IDs.
- */
- Graph.prototype.createCellMapping = function(mapping, lookup, cellMapping)
- {
- cellMapping = (cellMapping != null) ? cellMapping : new Object();
-
- for (var objectId in mapping)
- {
- var cellId = lookup[objectId];
-
- if (cellMapping[cellId] == null)
- {
- // Uses empty string if clone ID was null which means
- // the cell was cloned but not inserted into the model.
- cellMapping[cellId] = mapping[objectId].getId() || '';
- }
- }
-
- return cellMapping;
- };
-
- /**
- *
- */
- Graph.prototype.importGraphModel = function(node, dx, dy, crop)
- {
- dx = (dx != null) ? dx : 0;
- dy = (dy != null) ? dy : 0;
-
- var codec = new mxCodec(node.ownerDocument);
- var tempModel = new mxGraphModel();
- codec.decode(node, tempModel);
- var cells = []
-
- // Clones cells to remove invalid edges
- var cloneMap = new Object();
- var cellMapping = new Object();
- var layers = tempModel.getChildren(this.cloneCell(tempModel.root,
- this.isCloneInvalidEdges(), cloneMap));
-
- if (layers != null)
- {
- // Creates lookup from object IDs to cell IDs
- var lookup = this.createCellLookup([tempModel.root]);
-
- // Uses copy as layers are removed from array inside loop
- layers = layers.slice();
-
- this.model.beginUpdate();
- try
- {
- // Merges into unlocked current layer if one layer is pasted
- if (layers.length == 1 && !this.isCellLocked(this.getDefaultParent()))
- {
- var children = tempModel.getChildren(layers[0]);
-
- if (children != null)
- {
- cells = this.moveCells(children,
- dx, dy, false, this.getDefaultParent());
-
- // Imported default parent maps to local default parent
- cellMapping[tempModel.getChildAt(tempModel.root, 0).getId()] =
- this.getDefaultParent().getId();
- }
- }
- else
- {
- for (var i = 0; i < layers.length; i++)
- {
- var children = this.model.getChildren(this.moveCells(
- [layers[i]], dx, dy, false, this.model.getRoot())[0]);
-
- if (children != null)
- {
- cells = cells.concat(children);
- }
- }
- }
-
- if (cells != null)
- {
- // Adds mapping for all cloned entries from imported to local cell ID
- this.createCellMapping(cloneMap, lookup, cellMapping);
- this.updateCustomLinks(cellMapping, cells);
-
- if (crop)
- {
- if (this.isGridEnabled())
- {
- dx = this.snap(dx);
- dy = this.snap(dy);
- }
-
- var bounds = this.getBoundingBoxFromGeometry(cells, true);
-
- if (bounds != null)
- {
- this.moveCells(cells, dx - bounds.x, dy - bounds.y);
- }
- }
- }
- }
- finally
- {
- this.model.endUpdate();
- }
- }
-
- return cells;
- };
-
- /**
- * Translates this point by the given vector.
- *
- * @param {number} dx X-coordinate of the translation.
- * @param {number} dy Y-coordinate of the translation.
- */
- Graph.prototype.encodeCells = function(cells)
- {
- var cloneMap = new Object();
- var clones = this.cloneCells(cells, null, cloneMap);
-
- // Creates a dictionary for fast lookups
- var dict = new mxDictionary();
-
- for (var i = 0; i < cells.length; i++)
- {
- dict.put(cells[i], true);
- }
-
- var codec = new mxCodec();
- var model = new mxGraphModel();
- var parent = model.getChildAt(model.getRoot(), 0);
-
- for (var i = 0; i < clones.length; i++)
- {
- model.add(parent, clones[i]);
-
- // Checks for orphaned relative children and makes absolute
- var state = this.view.getState(cells[i]);
-
- if (state != null)
- {
- var geo = this.getCellGeometry(clones[i]);
-
- if (geo != null && geo.relative && !this.model.isEdge(cells[i]) &&
- dict.get(this.model.getParent(cells[i])) == null)
- {
- geo.offset = null;
- geo.relative = false;
- geo.x = state.x / state.view.scale - state.view.translate.x;
- geo.y = state.y / state.view.scale - state.view.translate.y;
- }
- }
- }
-
- this.updateCustomLinks(this.createCellMapping(cloneMap,
- this.createCellLookup(cells)), clones);
-
- return codec.encode(model);
- };
-
- /**
- * Overridden to check for table shape.
- */
- Graph.prototype.isSwimlane = function(cell, ignoreState)
- {
- if (cell != null && this.model.getParent(cell) != this.model.getRoot() &&
- !this.model.isEdge(cell))
- {
- var shape = this.getCurrentCellStyle(cell, ignoreState)
- [mxConstants.STYLE_SHAPE];
-
- return shape == mxConstants.SHAPE_SWIMLANE || shape == 'table';
- }
-
- return false;
- };
-
- /**
- * Overridden to add expand style.
- */
- var graphIsExtendParent = Graph.prototype.isExtendParent;
- Graph.prototype.isExtendParent = function(cell)
- {
- var parent = this.model.getParent(cell);
-
- if (parent != null)
- {
- var style = this.getCurrentCellStyle(parent);
-
- if (style['expand'] != null)
- {
- return style['expand'] != '0';
- }
- }
-
- return graphIsExtendParent.apply(this, arguments) &&
- (parent == null || !this.isTable(parent));
- };
-
- /**
- * Overridden to use table cell instead of table as parent.
- */
- var graphSplitEdge = Graph.prototype.splitEdge;
- Graph.prototype.splitEdge = function(edge, cells, newEdge, dx, dy, x, y, parent)
- {
- if (parent == null)
- {
- parent = this.model.getParent(edge);
-
- if (this.isTable(parent) || this.isTableRow(parent))
- {
- parent = this.getCellAt(x, y, null, true, false);
- }
- }
-
- graphSplitEdge.apply(this, [edge, cells, newEdge, dx, dy, x, y, parent]);
- };
-
- /**
- * Overridden to flatten cell hierarchy for selecting next and previous.
- */
- var graphSelectCell = Graph.prototype.selectCell;
- Graph.prototype.selectCell = function(isNext, isParent, isChild)
- {
- if (isParent || isChild)
- {
- graphSelectCell.apply(this, arguments);
- }
- else
- {
- var cell = this.getSelectionCell();
- var index = null;
- var cells = [];
-
- // LATER: Reverse traverse order for !isNext
- var flatten = mxUtils.bind(this, function(temp)
- {
- if (this.view.getState(temp) != null &&
- (this.model.isVertex(temp) ||
- this.model.isEdge(temp)))
- {
- cells.push(temp);
-
- if (temp == cell)
- {
- index = cells.length - 1;
- }
- else if ((isNext && cell == null && cells.length > 0) ||
- (index != null && ((isNext && cells.length > index)) ||
- (!isNext && index > 0)))
- {
- return;
- }
- }
-
- for (var i = 0; i < this.model.getChildCount(temp); i++)
- {
- flatten(this.model.getChildAt(temp, i));
- }
- });
-
- flatten(this.model.root);
-
- if (cells.length > 0)
- {
- if (index != null)
- {
- index = mxUtils.mod(index + ((isNext) ? 1 : -1), cells.length)
- }
- else
- {
- index = 0;
- }
-
- this.setSelectionCell(cells[index]);
- }
- }
- };
-
- /**
- * Overrides cloning cells in moveCells.
- */
- var graphMoveCells = Graph.prototype.moveCells;
- Graph.prototype.moveCells = function(cells, dx, dy, clone, target, evt, mapping)
- {
- mapping = (mapping != null) ? mapping : new Object();
-
- // Replaces source tables with rows
- if (this.isTable(target))
- {
- var newCells = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- if (this.isTable(cells[i]))
- {
- newCells = newCells.concat(this.model.getChildCells(cells[i], true).reverse());
- }
- else
- {
- newCells.push(cells[i]);
- }
- }
-
- cells = newCells;
- }
-
- this.model.beginUpdate();
- try
- {
- // Updates source and target table heights and matches
- // column count for moving rows between tables
- var sourceTables = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- if (target != null && this.isTableRow(cells[i]))
- {
- var parent = this.model.getParent(cells[i]);
- var row = this.getCellGeometry(cells[i]);
-
- if (this.isTable(parent))
- {
- sourceTables.push(parent);
- }
-
- if (parent != null && row != null &&
- this.isTable(parent) &&
- this.isTable(target) &&
- (clone || parent != target))
- {
- if (!clone)
- {
- var table = this.getCellGeometry(parent);
-
- if (table != null)
- {
- table = table.clone();
- table.height -= row.height;
- this.model.setGeometry(parent, table);
- }
- }
-
- var table = this.getCellGeometry(target);
-
- if (table != null)
- {
- table = table.clone();
- table.height += row.height;
- this.model.setGeometry(target, table);
- }
-
- // Matches column count
- var rows = this.model.getChildCells(target, true);
-
- if (rows.length > 0)
- {
- cells[i] = (clone) ? this.cloneCell(cells[i]) : cells[i];
- var sourceCols = this.model.getChildCells(cells[i], true);
- var cols = this.model.getChildCells(rows[0], true);
- var count = cols.length - sourceCols.length;
-
- if (count > 0)
- {
- for (var j = 0; j < count; j++)
- {
- var col = this.cloneCell(sourceCols[sourceCols.length - 1]);
-
- if (col != null)
- {
- col.value = '';
-
- this.model.add(cells[i], col);
- }
- }
- }
- else if (count < 0)
- {
- for (var j = 0; j > count; j--)
- {
- this.model.remove(sourceCols[sourceCols.length + j - 1]);
- }
- }
-
- // Updates column widths
- sourceCols = this.model.getChildCells(cells[i], true);
-
- for (var j = 0; j < cols.length; j++)
- {
- var geo = this.getCellGeometry(cols[j]);
- var geo2 = this.getCellGeometry(sourceCols[j]);
-
- if (geo != null && geo2 != null)
- {
- geo2 = geo2.clone();
- geo2.width = geo.width;
-
- this.model.setGeometry(sourceCols[j], geo2);
- }
- }
- }
- }
- }
- }
-
- var result = graphMoveCells.apply(this, arguments);
-
- // Removes empty tables
- for (var i = 0; i < sourceTables.length; i++)
- {
- if (!clone && this.model.contains(sourceTables[i]) &&
- this.model.getChildCount(sourceTables[i]) == 0)
- {
- this.model.remove(sourceTables[i]);
- }
- }
-
- if (clone)
- {
- this.updateCustomLinks(this.createCellMapping(mapping,
- this.createCellLookup(cells)), result);
- }
- }
- finally
- {
- this.model.endUpdate();
- }
-
- return result;
- };
-
- /**
- * Overriddes to delete label for table cells.
- */
- var graphRemoveCells = Graph.prototype.removeCells;
- Graph.prototype.removeCells = function(cells, includeEdges)
- {
- var result = [];
-
- this.model.beginUpdate();
- try
- {
- // Clears labels on table cells
- for (var i = 0; i < cells.length; i++)
- {
- if (this.isTableCell(cells[i]))
- {
- var row = this.model.getParent(cells[i]);
- var table = this.model.getParent(row);
-
- // Removes table if one cell in one row left
- if (this.model.getChildCount(row) == 1 &&
- this.model.getChildCount(table) == 1)
- {
- if (mxUtils.indexOf(cells, table) < 0 &&
- mxUtils.indexOf(result, table) < 0)
- {
- result.push(table);
- }
- }
- else
- {
- this.labelChanged(cells[i], '');
- }
- }
- else
- {
- // Deletes table if all rows are removed
- if (this.isTableRow(cells[i]))
- {
- var table = this.model.getParent(cells[i]);
-
- if (mxUtils.indexOf(cells, table) < 0 &&
- mxUtils.indexOf(result, table) < 0)
- {
- var rows = this.model.getChildCells(table, true);
- var deleteCount = 0;
-
- for (var j = 0; j < rows.length; j++)
- {
- if (mxUtils.indexOf(cells, rows[j]) >= 0)
- {
- deleteCount++;
- }
- }
-
- if (deleteCount == rows.length)
- {
- result.push(table);
- }
- }
- }
-
- result.push(cells[i]);
- }
- }
-
- result = graphRemoveCells.apply(this, [result, includeEdges]);
- }
- finally
- {
- this.model.endUpdate();
- }
-
- return result;
- };
-
- /**
- * Updates cells IDs for custom links in the given cells.
- */
- Graph.prototype.updateCustomLinks = function(mapping, cells)
- {
- for (var i = 0; i < cells.length; i++)
- {
- if (cells[i] != null)
- {
- this.updateCustomLinksForCell(mapping, cells[i]);
- }
- }
- };
-
- /**
- * Updates cell IDs in custom links on the given cell and its label.
- */
- Graph.prototype.updateCustomLinksForCell = function(mapping, cell)
- {
- // Hook for subclassers
- };
-
- /**
- * Overrides method to provide connection constraints for shapes.
- */
- Graph.prototype.getAllConnectionConstraints = function(terminal, source)
- {
- if (terminal != null)
- {
- var constraints = mxUtils.getValue(terminal.style, 'points', null);
-
- if (constraints != null)
- {
- // Requires an array of arrays with x, y (0..1), an optional
- // [perimeter (0 or 1), dx, and dy] eg. points=[[0,0,1,-10,10],[0,1,0],[1,1]]
- var result = [];
-
- try
- {
- var c = JSON.parse(constraints);
-
- for (var i = 0; i < c.length; i++)
- {
- var tmp = c[i];
- result.push(new mxConnectionConstraint(new mxPoint(tmp[0], tmp[1]), (tmp.length > 2) ? tmp[2] != '0' : true,
- null, (tmp.length > 3) ? tmp[3] : 0, (tmp.length > 4) ? tmp[4] : 0));
- }
- }
- catch (e)
- {
- // ignore
- }
-
- return result;
- }
- else if (terminal.shape != null && terminal.shape.bounds != null)
- {
- var dir = terminal.shape.direction;
- var bounds = terminal.shape.bounds;
- var scale = terminal.shape.scale;
- var w = bounds.width / scale;
- var h = bounds.height / scale;
-
- if (dir == mxConstants.DIRECTION_NORTH || dir == mxConstants.DIRECTION_SOUTH)
- {
- var tmp = w;
- w = h;
- h = tmp;
- }
-
- constraints = terminal.shape.getConstraints(terminal.style, w, h);
-
- if (constraints != null)
- {
- return constraints;
- }
- else if (terminal.shape.stencil != null && terminal.shape.stencil.constraints != null)
- {
- return terminal.shape.stencil.constraints;
- }
- else if (terminal.shape.constraints != null)
- {
- return terminal.shape.constraints;
- }
- }
- }
-
- return null;
- };
-
- /**
- * Inverts the elbow edge style without removing existing styles.
- */
- Graph.prototype.flipEdge = function(edge)
- {
- if (edge != null)
- {
- var style = this.getCurrentCellStyle(edge);
- var elbow = mxUtils.getValue(style, mxConstants.STYLE_ELBOW,
- mxConstants.ELBOW_HORIZONTAL);
- var value = (elbow == mxConstants.ELBOW_HORIZONTAL) ?
- mxConstants.ELBOW_VERTICAL : mxConstants.ELBOW_HORIZONTAL;
- this.setCellStyles(mxConstants.STYLE_ELBOW, value, [edge]);
- }
- };
-
- /**
- * Disables drill-down for non-swimlanes.
- */
- Graph.prototype.isValidRoot = function(cell)
- {
- // Counts non-relative children
- var childCount = this.model.getChildCount(cell);
- var realChildCount = 0;
-
- for (var i = 0; i < childCount; i++)
- {
- var child = this.model.getChildAt(cell, i);
-
- if (this.model.isVertex(child))
- {
- var geometry = this.getCellGeometry(child);
-
- if (geometry != null && !geometry.relative)
- {
- realChildCount++;
- }
- }
- }
-
- return realChildCount > 0 || this.isContainer(cell);
- };
-
- /**
- * Disables drill-down for non-swimlanes.
- */
- Graph.prototype.isValidDropTarget = function(cell, cells, evt)
- {
- var style = this.getCurrentCellStyle(cell);
- var tables = true;
- var rows = true;
-
- for (var i = 0; i < cells.length && rows; i++)
- {
- tables = tables && this.isTable(cells[i]);
- rows = rows && this.isTableRow(cells[i]);
- }
-
- return (mxUtils.getValue(style, 'part', '0') != '1' || this.isContainer(cell)) &&
- mxUtils.getValue(style, 'dropTarget', '1') != '0' &&
- (mxGraph.prototype.isValidDropTarget.apply(this, arguments) ||
- this.isContainer(cell)) && !this.isTableRow(cell) &&
- (!this.isTable(cell) || rows || tables);
- };
-
- /**
- * Overrides createGroupCell to set the group style for new groups to 'group'.
- */
- Graph.prototype.createGroupCell = function()
- {
- var group = mxGraph.prototype.createGroupCell.apply(this, arguments);
- group.setStyle('group');
-
- return group;
- };
-
- /**
- * Disables extending parents with stack layouts on add
- */
- Graph.prototype.isExtendParentsOnAdd = function(cell)
- {
- var result = mxGraph.prototype.isExtendParentsOnAdd.apply(this, arguments);
-
- if (result && cell != null && this.layoutManager != null)
- {
- var parent = this.model.getParent(cell);
-
- if (parent != null)
- {
- var layout = this.layoutManager.getLayout(parent);
-
- if (layout != null && layout.constructor == mxStackLayout)
- {
- result = false;
- }
- }
- }
-
- return result;
- };
-
- /**
- * Overrides autosize to add a border.
- */
- Graph.prototype.getPreferredSizeForCell = function(cell)
- {
- var result = mxGraph.prototype.getPreferredSizeForCell.apply(this, arguments);
-
- // Adds buffer
- if (result != null)
- {
- result.width += 10;
- result.height += 4;
-
- if (this.gridEnabled)
- {
- result.width = this.snap(result.width);
- result.height = this.snap(result.height);
- }
- }
-
- return result;
- }
-
- /**
- * Turns the given cells and returns the changed cells.
- */
- Graph.prototype.turnShapes = function(cells, backwards)
- {
- var model = this.getModel();
- var select = [];
-
- model.beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- var cell = cells[i];
-
- if (model.isEdge(cell))
- {
- var src = model.getTerminal(cell, true);
- var trg = model.getTerminal(cell, false);
-
- model.setTerminal(cell, trg, true);
- model.setTerminal(cell, src, false);
-
- var geo = model.getGeometry(cell);
-
- if (geo != null)
- {
- geo = geo.clone();
-
- if (geo.points != null)
- {
- geo.points.reverse();
- }
-
- var sp = geo.getTerminalPoint(true);
- var tp = geo.getTerminalPoint(false)
-
- geo.setTerminalPoint(sp, false);
- geo.setTerminalPoint(tp, true);
- model.setGeometry(cell, geo);
-
- // Inverts constraints
- var edgeState = this.view.getState(cell);
- var sourceState = this.view.getState(src);
- var targetState = this.view.getState(trg);
-
- if (edgeState != null)
- {
- var sc = (sourceState != null) ? this.getConnectionConstraint(edgeState, sourceState, true) : null;
- var tc = (targetState != null) ? this.getConnectionConstraint(edgeState, targetState, false) : null;
-
- this.setConnectionConstraint(cell, src, true, tc);
- this.setConnectionConstraint(cell, trg, false, sc);
- }
-
- select.push(cell);
- }
- }
- else if (model.isVertex(cell))
- {
- var geo = this.getCellGeometry(cell);
-
- if (geo != null)
- {
- // Rotates the size and position in the geometry
- if (!this.isTable(cell) && !this.isTableRow(cell) &&
- !this.isTableCell(cell) && !this.isSwimlane(cell))
- {
- geo = geo.clone();
- geo.x += geo.width / 2 - geo.height / 2;
- geo.y += geo.height / 2 - geo.width / 2;
- var tmp = geo.width;
- geo.width = geo.height;
- geo.height = tmp;
- model.setGeometry(cell, geo);
- }
-
- // Reads the current direction and advances by 90 degrees
- var state = this.view.getState(cell);
-
- if (state != null)
- {
- var dirs = [mxConstants.DIRECTION_EAST, mxConstants.DIRECTION_SOUTH,
- mxConstants.DIRECTION_WEST, mxConstants.DIRECTION_NORTH];
- var dir = mxUtils.getValue(state.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST);
- this.setCellStyles(mxConstants.STYLE_DIRECTION,
- dirs[mxUtils.mod(mxUtils.indexOf(dirs, dir) +
- ((backwards) ? -1 : 1), dirs.length)], [cell]);
- }
-
- select.push(cell);
- }
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
-
- return select;
- };
-
- /**
- * Returns true if the given stencil contains any placeholder text.
- */
- Graph.prototype.stencilHasPlaceholders = function(stencil)
- {
- if (stencil != null && stencil.fgNode != null)
- {
- var node = stencil.fgNode.firstChild;
-
- while (node != null)
- {
- if (node.nodeName == 'text' && node.getAttribute('placeholders') == '1')
- {
- return true;
- }
-
- node = node.nextSibling;
- }
- }
-
- return false;
- };
-
- /**
- * Updates the child cells with placeholders if metadata of a
- * cell has changed and propagates geometry changes in tables.
- */
- var graphProcessChange = Graph.prototype.processChange;
- Graph.prototype.processChange = function(change)
- {
- if (change instanceof mxGeometryChange &&
- (this.isTableCell(change.cell) || this.isTableRow(change.cell)) &&
- ((change.previous == null && change.geometry != null) ||
- (change.previous != null && !change.previous.equals(change.geometry))))
- {
- var cell = change.cell;
-
- if (this.isTableCell(cell))
- {
- cell = this.model.getParent(cell);
- }
-
- if (this.isTableRow(cell))
- {
- cell = this.model.getParent(cell);
- }
-
- // Forces repaint of table with unchanged style and geometry
- var state = this.view.getState(cell);
-
- if (state != null && state.shape != null)
- {
- this.view.invalidate(cell);
- state.shape.bounds = null;
- }
- }
-
- graphProcessChange.apply(this, arguments);
-
- if (change instanceof mxValueChange && change.cell != null &&
- change.cell.value != null && typeof(change.cell.value) == 'object')
- {
- this.invalidateDescendantsWithPlaceholders(change.cell);
- }
- };
-
- /**
- * Replaces the given element with a span.
- */
- Graph.prototype.invalidateDescendantsWithPlaceholders = function(cell)
- {
- // Invalidates all descendants with placeholders
- var desc = this.model.getDescendants(cell);
-
- // LATER: Check if only label or tooltip have changed
- if (desc.length > 0)
- {
- for (var i = 0; i < desc.length; i++)
- {
- var state = this.view.getState(desc[i]);
-
- if (state != null && state.shape != null && state.shape.stencil != null &&
- this.stencilHasPlaceholders(state.shape.stencil))
- {
- this.removeStateForCell(desc[i]);
- }
- else if (this.isReplacePlaceholders(desc[i]))
- {
- this.view.invalidate(desc[i], false, false);
- }
- }
- }
- };
-
- /**
- * Replaces the given element with a span.
- */
- Graph.prototype.replaceElement = function(elt, tagName)
- {
- var span = elt.ownerDocument.createElement((tagName != null) ? tagName : 'span');
- var attributes = Array.prototype.slice.call(elt.attributes);
-
- while (attr = attributes.pop())
- {
- span.setAttribute(attr.nodeName, attr.nodeValue);
- }
-
- span.innerHTML = elt.innerHTML;
- elt.parentNode.replaceChild(span, elt);
- };
-
- /**
- *
- */
- Graph.prototype.processElements = function(elt, fn)
- {
- if (elt != null)
- {
- var elts = elt.getElementsByTagName('*');
-
- for (var i = 0; i < elts.length; i++)
- {
- fn(elts[i]);
- }
- }
- };
-
- /**
- * Handles label changes for XML user objects.
- */
- Graph.prototype.updateLabelElements = function(cells, fn, tagName)
- {
- cells = (cells != null) ? cells : this.getSelectionCells();
- var div = document.createElement('div');
-
- for (var i = 0; i < cells.length; i++)
- {
- // Changes font tags inside HTML labels
- if (this.isHtmlLabel(cells[i]))
- {
- var label = this.convertValueToString(cells[i]);
-
- if (label != null && label.length > 0)
- {
- div.innerHTML = label;
- var elts = div.getElementsByTagName((tagName != null) ? tagName : '*');
-
- for (var j = 0; j < elts.length; j++)
- {
- fn(elts[j]);
- }
-
- if (div.innerHTML != label)
- {
- this.cellLabelChanged(cells[i], div.innerHTML);
- }
- }
- }
- }
- };
-
- /**
- * Handles label changes for XML user objects.
- */
- Graph.prototype.cellLabelChanged = function(cell, value, autoSize)
- {
- // Removes all illegal control characters in user input
- value = Graph.zapGremlins(value);
-
- this.model.beginUpdate();
- try
- {
- if (cell.value != null && typeof cell.value == 'object')
- {
- if (this.isReplacePlaceholders(cell) &&
- cell.getAttribute('placeholder') != null)
- {
- // LATER: Handle delete, name change
- var name = cell.getAttribute('placeholder');
- var current = cell;
-
- while (current != null)
- {
- if (current == this.model.getRoot() || (current.value != null &&
- typeof(current.value) == 'object' && current.hasAttribute(name)))
- {
- this.setAttributeForCell(current, name, value);
-
- break;
- }
-
- current = this.model.getParent(current);
- }
- }
-
- var tmp = cell.value.cloneNode(true);
-
- if (Graph.translateDiagram && Graph.diagramLanguage != null &&
- tmp.hasAttribute('label_' + Graph.diagramLanguage))
- {
- tmp.setAttribute('label_' + Graph.diagramLanguage, value);
- }
- else
- {
- tmp.setAttribute('label', value);
- }
-
- value = tmp;
- }
-
- mxGraph.prototype.cellLabelChanged.apply(this, arguments);
- }
- finally
- {
- this.model.endUpdate();
- }
- };
-
- /**
- * Removes transparent empty groups if all children are removed.
- */
- Graph.prototype.cellsRemoved = function(cells)
- {
- if (cells != null)
- {
- var dict = new mxDictionary();
-
- for (var i = 0; i < cells.length; i++)
- {
- dict.put(cells[i], true);
- }
-
- // LATER: Recurse up the cell hierarchy
- var parents = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- var parent = this.model.getParent(cells[i]);
-
- if (parent != null && !dict.get(parent))
- {
- dict.put(parent, true);
- parents.push(parent);
- }
- }
-
- for (var i = 0; i < parents.length; i++)
- {
- var state = this.view.getState(parents[i]);
-
- if (state != null && (this.model.isEdge(state.cell) ||
- this.model.isVertex(state.cell)) &&
- this.isCellDeletable(state.cell) &&
- this.isTransparentState(state))
- {
- var allChildren = true;
-
- for (var j = 0; j < this.model.getChildCount(state.cell) && allChildren; j++)
- {
- if (!dict.get(this.model.getChildAt(state.cell, j)))
- {
- allChildren = false;
- }
- }
-
- if (allChildren)
- {
- cells.push(state.cell);
- }
- }
- }
- }
-
- mxGraph.prototype.cellsRemoved.apply(this, arguments);
- };
-
- /**
- * Overrides ungroup to check if group should be removed.
- */
- Graph.prototype.removeCellsAfterUngroup = function(cells)
- {
- var cellsToRemove = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- if (this.isCellDeletable(cells[i]) &&
- this.isTransparentState(
- this.view.getState(cells[i])))
- {
- cellsToRemove.push(cells[i]);
- }
- }
-
- cells = cellsToRemove;
-
- mxGraph.prototype.removeCellsAfterUngroup.apply(this, arguments);
- };
-
- /**
- * Sets the link for the given cell.
- */
- Graph.prototype.setLinkForCell = function(cell, link)
- {
- this.setAttributeForCell(cell, 'link', link);
- };
-
- /**
- * Sets the link for the given cell.
- */
- Graph.prototype.setTooltipForCell = function(cell, link)
- {
- var key = 'tooltip';
-
- if (Graph.translateDiagram && Graph.diagramLanguage != null &&
- mxUtils.isNode(cell.value) && cell.value.hasAttribute('tooltip_' + Graph.diagramLanguage))
- {
- key = 'tooltip_' + Graph.diagramLanguage;
- }
-
- this.setAttributeForCell(cell, key, link);
- };
-
- /**
- * Returns the cells in the model (or given array) that have all of the
- * given tags in their tags property.
- */
- Graph.prototype.getAttributeForCell = function(cell, attributeName, defaultValue)
- {
- var value = (cell.value != null && typeof cell.value === 'object') ?
- cell.value.getAttribute(attributeName) : null;
-
- return (value != null) ? value : defaultValue;
- };
-
- /**
- * Sets the link for the given cell.
- */
- Graph.prototype.setAttributeForCell = function(cell, attributeName, attributeValue)
- {
- var value = null;
-
- if (cell.value != null && typeof(cell.value) == 'object')
- {
- value = cell.value.cloneNode(true);
- }
- else
- {
- var doc = mxUtils.createXmlDocument();
-
- value = doc.createElement('UserObject');
- value.setAttribute('label', cell.value || '');
- }
-
- if (attributeValue != null)
- {
- value.setAttribute(attributeName, attributeValue);
- }
- else
- {
- value.removeAttribute(attributeName);
- }
-
- this.model.setValue(cell, value);
- };
-
- /**
- * Overridden to stop moving edge labels between cells.
- */
- var graphGetDropTarget = Graph.prototype.getDropTarget;
- Graph.prototype.getDropTarget = function(cells, evt, cell, clone)
- {
- var model = this.getModel();
-
- // Disables drop into group if alt is pressed
- if (mxEvent.isAltDown(evt))
- {
- return null;
- }
-
- // Disables dragging edge labels out of edges
- for (var i = 0; i < cells.length; i++)
- {
- if (this.model.isEdge(this.model.getParent(cells[i])))
- {
- return null;
- }
- }
-
- var target = graphGetDropTarget.apply(this, arguments);
-
- // Always drops rows to tables
- var rows = true;
-
- for (var i = 0; i < cells.length && rows; i++)
- {
- rows = rows && this.isTableRow(cells[i]);
- }
-
- if (rows)
- {
- if (this.isTableCell(target))
- {
- target = this.model.getParent(target);
- }
-
- if (this.isTableRow(target))
- {
- target = this.model.getParent(target);
- }
-
- if (!this.isTable(target))
- {
- target = null;
- }
- }
-
- return target;
- };
-
- /**
- * Overrides double click handling to avoid accidental inserts of new labels in dblClick below.
- */
- Graph.prototype.click = function(me)
- {
- mxGraph.prototype.click.call(this, me);
-
- // Stores state and source for checking in dblClick
- this.firstClickState = me.getState();
- this.firstClickSource = me.getSource();
- };
-
- /**
- * Overrides double click handling to add the tolerance and inserting text.
- */
- Graph.prototype.dblClick = function(evt, cell)
- {
- if (this.isEnabled())
- {
- cell = this.insertTextForEvent(evt, cell);
- mxGraph.prototype.dblClick.call(this, evt, cell);
- }
- };
-
- /**
- * Overrides double click handling to add the tolerance and inserting text.
- */
- Graph.prototype.insertTextForEvent = function(evt, cell)
- {
- var pt = mxUtils.convertPoint(this.container, mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-
- // Automatically adds new child cells to edges on double click
- if (evt != null && !this.model.isVertex(cell))
- {
- var state = (this.model.isEdge(cell)) ? this.view.getState(cell) : null;
- var src = mxEvent.getSource(evt);
-
- if ((this.firstClickState == state && this.firstClickSource == src) &&
- (state == null || (state.text == null || state.text.node == null ||
- state.text.boundingBox == null || (!mxUtils.contains(state.text.boundingBox,
- pt.x, pt.y) && !mxUtils.isAncestorNode(state.text.node, mxEvent.getSource(evt))))) &&
- ((state == null && !this.isCellLocked(this.getDefaultParent())) ||
- (state != null && !this.isCellLocked(state.cell))) &&
- (state != null || (mxClient.IS_VML && src == this.view.getCanvas()) ||
- (mxClient.IS_SVG && src == this.view.getCanvas().ownerSVGElement)))
- {
- if (state == null)
- {
- state = this.view.getState(this.getCellAt(pt.x, pt.y));
- }
-
- cell = this.addText(pt.x, pt.y, state);
- }
- }
-
- return cell;
- };
-
- /**
- * Returns a point that specifies the location for inserting cells.
- */
- Graph.prototype.getInsertPoint = function()
- {
- var gs = this.getGridSize();
- var dx = this.container.scrollLeft / this.view.scale - this.view.translate.x;
- var dy = this.container.scrollTop / this.view.scale - this.view.translate.y;
-
- if (this.pageVisible)
- {
- var layout = this.getPageLayout();
- var page = this.getPageSize();
- dx = Math.max(dx, layout.x * page.width);
- dy = Math.max(dy, layout.y * page.height);
- }
-
- return new mxPoint(this.snap(dx + gs), this.snap(dy + gs));
- };
-
- /**
- *
- */
- Graph.prototype.getFreeInsertPoint = function()
- {
- var view = this.view;
- var bds = this.getGraphBounds();
- var pt = this.getInsertPoint();
-
- // Places at same x-coord and 2 grid sizes below existing graph
- var x = this.snap(Math.round(Math.max(pt.x, bds.x / view.scale - view.translate.x +
- ((bds.width == 0) ? 2 * this.gridSize : 0))));
- var y = this.snap(Math.round(Math.max(pt.y, (bds.y + bds.height) / view.scale - view.translate.y +
- 2 * this.gridSize)));
-
- return new mxPoint(x, y);
- };
-
- /**
- *
- */
- Graph.prototype.getCenterInsertPoint = function(bbox)
- {
- bbox = (bbox != null) ? bbox : new mxRectangle();
-
- if (mxUtils.hasScrollbars(this.container))
- {
- return new mxPoint(
- this.snap(Math.round((this.container.scrollLeft + this.container.clientWidth / 2) /
- this.view.scale - this.view.translate.x - bbox.width / 2)),
- this.snap(Math.round((this.container.scrollTop + this.container.clientHeight / 2) /
- this.view.scale - this.view.translate.y - bbox.height / 2)));
- }
- else
- {
- return new mxPoint(
- this.snap(Math.round(this.container.clientWidth / 2 / this.view.scale -
- this.view.translate.x - bbox.width / 2)),
- this.snap(Math.round(this.container.clientHeight / 2 / this.view.scale -
- this.view.translate.y - bbox.height / 2)));
- }
- };
-
- /**
- * Hook for subclassers to return true if the current insert point was defined
- * using a mouse hover event.
- */
- Graph.prototype.isMouseInsertPoint = function()
- {
- return false;
- };
-
- /**
- * Adds a new label at the given position and returns the new cell. State is
- * an optional edge state to be used as the parent for the label. Vertices
- * are not allowed currently as states.
- */
- Graph.prototype.addText = function(x, y, state)
- {
- // Creates a new edge label with a predefined text
- var label = new mxCell();
- label.value = 'Text';
- label.geometry = new mxGeometry(0, 0, 0, 0);
- label.vertex = true;
- var style = 'html=1;align=center;verticalAlign=middle;resizable=0;points=[];';
-
- if (state != null && this.model.isEdge(state.cell))
- {
- label.style = 'edgeLabel;' + style;
- label.geometry.relative = true;
- label.connectable = false;
-
- // Resets the relative location stored inside the geometry
- var pt2 = this.view.getRelativePoint(state, x, y);
- label.geometry.x = Math.round(pt2.x * 10000) / 10000;
- label.geometry.y = Math.round(pt2.y);
-
- // Resets the offset inside the geometry to find the offset from the resulting point
- label.geometry.offset = new mxPoint(0, 0);
- pt2 = this.view.getPoint(state, label.geometry);
-
- var scale = this.view.scale;
- label.geometry.offset = new mxPoint(Math.round((x - pt2.x) / scale), Math.round((y - pt2.y) / scale));
- }
- else
- {
- var tr = this.view.translate;
- label.style = 'text;' + style;
- label.geometry.width = 40;
- label.geometry.height = 20;
- label.geometry.x = Math.round(x / this.view.scale) -
- tr.x - ((state != null) ? state.origin.x : 0);
- label.geometry.y = Math.round(y / this.view.scale) -
- tr.y - ((state != null) ? state.origin.y : 0);
- label.style += 'autosize=1;'
- }
-
- this.getModel().beginUpdate();
- try
- {
- this.addCells([label], (state != null) ? state.cell : null);
- this.fireEvent(new mxEventObject('textInserted', 'cells', [label]));
-
- // Updates size of text after possible change of style via event
- this.autoSizeCell(label);
- }
- finally
- {
- this.getModel().endUpdate();
- }
-
- return label;
- };
-
- /**
- * Adds a handler for clicking on shapes with links. This replaces all links in labels.
- */
- Graph.prototype.addClickHandler = function(highlight, beforeClick, onClick)
- {
- // Replaces links in labels for consistent right-clicks
- var checkLinks = mxUtils.bind(this, function()
- {
- var links = this.container.getElementsByTagName('a');
-
- if (links != null)
- {
- for (var i = 0; i < links.length; i++)
- {
- var href = this.getAbsoluteUrl(links[i].getAttribute('href'));
-
- if (href != null)
- {
- links[i].setAttribute('rel', this.linkRelation);
- links[i].setAttribute('href', href);
-
- if (beforeClick != null)
- {
- mxEvent.addGestureListeners(links[i], null, null, beforeClick);
- }
- }
- }
- }
- });
-
- this.model.addListener(mxEvent.CHANGE, checkLinks);
- checkLinks();
-
- var cursor = this.container.style.cursor;
- var tol = this.getTolerance();
- var graph = this;
-
- var mouseListener =
- {
- currentState: null,
- currentLink: null,
- highlight: (highlight != null && highlight != '' && highlight != mxConstants.NONE) ?
- new mxCellHighlight(graph, highlight, 4) : null,
- startX: 0,
- startY: 0,
- scrollLeft: 0,
- scrollTop: 0,
- updateCurrentState: function(me)
- {
- var tmp = me.sourceState;
-
- // Gets topmost intersecting cell with link
- if (tmp == null || graph.getLinkForCell(tmp.cell) == null)
- {
- var cell = graph.getCellAt(me.getGraphX(), me.getGraphY(), null, null, null, function(state, x, y)
- {
- return graph.getLinkForCell(state.cell) == null;
- });
-
- tmp = graph.view.getState(cell);
- }
-
- if (tmp != this.currentState)
- {
- if (this.currentState != null)
- {
- this.clear();
- }
-
- this.currentState = tmp;
-
- if (this.currentState != null)
- {
- this.activate(this.currentState);
- }
- }
- },
- mouseDown: function(sender, me)
- {
- this.startX = me.getGraphX();
- this.startY = me.getGraphY();
- this.scrollLeft = graph.container.scrollLeft;
- this.scrollTop = graph.container.scrollTop;
-
- if (this.currentLink == null && graph.container.style.overflow == 'auto')
- {
- graph.container.style.cursor = 'move';
- }
-
- this.updateCurrentState(me);
- },
- mouseMove: function(sender, me)
- {
- if (graph.isMouseDown)
- {
- if (this.currentLink != null)
- {
- var dx = Math.abs(this.startX - me.getGraphX());
- var dy = Math.abs(this.startY - me.getGraphY());
-
- if (dx > tol || dy > tol)
- {
- this.clear();
- }
- }
- }
- else
- {
- // Checks for parent link
- var linkNode = me.getSource();
-
- while (linkNode != null && linkNode.nodeName.toLowerCase() != 'a')
- {
- linkNode = linkNode.parentNode;
- }
-
- if (linkNode != null)
- {
- this.clear();
- }
- else
- {
- if (graph.tooltipHandler != null && this.currentLink != null && this.currentState != null)
- {
- graph.tooltipHandler.reset(me, true, this.currentState);
- }
-
- if (this.currentState != null && (me.getState() == this.currentState || me.sourceState == null) &&
- graph.intersects(this.currentState, me.getGraphX(), me.getGraphY()))
- {
- return;
- }
-
- this.updateCurrentState(me);
- }
- }
- },
- mouseUp: function(sender, me)
- {
- var source = me.getSource();
- var evt = me.getEvent();
-
- // Checks for parent link
- var linkNode = source;
-
- while (linkNode != null && linkNode.nodeName.toLowerCase() != 'a')
- {
- linkNode = linkNode.parentNode;
- }
-
- // Ignores clicks on links and collapse/expand icon
- if (linkNode == null &&
- (((Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol &&
- Math.abs(this.scrollTop - graph.container.scrollTop) < tol) &&
- (me.sourceState == null || !me.isSource(me.sourceState.control))) &&
- (((mxEvent.isLeftMouseButton(evt) || mxEvent.isMiddleMouseButton(evt)) &&
- !mxEvent.isPopupTrigger(evt)) || mxEvent.isTouchEvent(evt))))
- {
- if (this.currentLink != null)
- {
- var blank = graph.isBlankLink(this.currentLink);
-
- if ((this.currentLink.substring(0, 5) === 'data:' ||
- !blank) && beforeClick != null)
- {
- beforeClick(evt, this.currentLink);
- }
-
- if (!mxEvent.isConsumed(evt))
- {
- var target = (mxEvent.isMiddleMouseButton(evt)) ? '_blank' :
- ((blank) ? graph.linkTarget : '_top');
- graph.openLink(this.currentLink, target);
- me.consume();
- }
- }
- else if (onClick != null && !me.isConsumed() &&
- (Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol &&
- Math.abs(this.scrollTop - graph.container.scrollTop) < tol) &&
- (Math.abs(this.startX - me.getGraphX()) < tol &&
- Math.abs(this.startY - me.getGraphY()) < tol))
- {
- onClick(me.getEvent());
- }
- }
-
- this.clear();
- },
- activate: function(state)
- {
- this.currentLink = graph.getAbsoluteUrl(graph.getLinkForCell(state.cell));
-
- if (this.currentLink != null)
- {
- graph.container.style.cursor = 'pointer';
-
- if (this.highlight != null)
- {
- this.highlight.highlight(state);
- }
- }
- },
- clear: function()
- {
- if (graph.container != null)
- {
- graph.container.style.cursor = cursor;
- }
-
- this.currentState = null;
- this.currentLink = null;
-
- if (this.highlight != null)
- {
- this.highlight.hide();
- }
-
- if (graph.tooltipHandler != null)
- {
- graph.tooltipHandler.hide();
- }
- }
- };
-
- // Ignores built-in click handling
- graph.click = function(me) {};
- graph.addMouseListener(mouseListener);
-
- mxEvent.addListener(document, 'mouseleave', function(evt)
- {
- mouseListener.clear();
- });
- };
-
- /**
- * Duplicates the given cells and returns the duplicates.
- */
- Graph.prototype.duplicateCells = function(cells, append)
- {
- cells = (cells != null) ? cells : this.getSelectionCells();
- append = (append != null) ? append : true;
-
- // Duplicates rows for table cells
- for (var i = 0; i < cells.length; i++)
- {
- if (this.isTableCell(cells[i]))
- {
- cells[i] = this.model.getParent(cells[i]);
- }
- }
-
- cells = this.model.getTopmostCells(cells);
-
- var model = this.getModel();
- var s = this.gridSize;
- var select = [];
-
- model.beginUpdate();
- try
- {
- var clones = this.cloneCells(cells, false, null, true);
-
- for (var i = 0; i < cells.length; i++)
- {
- var parent = model.getParent(cells[i]);
- var child = this.moveCells([clones[i]], s, s, false)[0];
- select.push(child);
-
- if (append)
- {
- model.add(parent, clones[i]);
- }
- else
- {
- // Maintains child index by inserting after clone in parent
- var index = parent.getIndex(cells[i]);
- model.add(parent, clones[i], index + 1);
- }
-
- // Extends tables
- if (this.isTable(parent))
- {
- var row = this.getCellGeometry(clones[i]);
- var table = this.getCellGeometry(parent);
-
- if (row != null && table != null)
- {
- table = table.clone();
- table.height += row.height;
- model.setGeometry(parent, table);
- }
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
-
- return select;
- };
-
- /**
- * Inserts the given image at the cursor in a content editable text box using
- * the insertimage command on the document instance.
- */
- Graph.prototype.insertImage = function(newValue, w, h)
- {
- // To find the new image, we create a list of all existing links first
- if (newValue != null && this.cellEditor.textarea != null)
- {
- var tmp = this.cellEditor.textarea.getElementsByTagName('img');
- var oldImages = [];
-
- for (var i = 0; i < tmp.length; i++)
- {
- oldImages.push(tmp[i]);
- }
-
- // LATER: Fix inserting link/image in IE8/quirks after focus lost
- document.execCommand('insertimage', false, newValue);
-
- // Sets size of new image
- var newImages = this.cellEditor.textarea.getElementsByTagName('img');
-
- if (newImages.length == oldImages.length + 1)
- {
- // Inverse order in favor of appended images
- for (var i = newImages.length - 1; i >= 0; i--)
- {
- if (i == 0 || newImages[i] != oldImages[i - 1])
- {
- // Workaround for lost styles during undo and redo is using attributes
- newImages[i].setAttribute('width', w);
- newImages[i].setAttribute('height', h);
-
- break;
- }
- }
- }
- }
- };
-
- /**
- * Inserts the given image at the cursor in a content editable text box using
- * the insertimage command on the document instance.
- */
- Graph.prototype.insertLink = function(value)
- {
- if (this.cellEditor.textarea != null)
- {
- if (value.length == 0)
- {
- document.execCommand('unlink', false);
- }
- else if (mxClient.IS_FF)
- {
- // Workaround for Firefox that adds a new link and removes
- // the href from the inner link if its parent is a span is
- // to remove all inner links inside the new outer link
- var tmp = this.cellEditor.textarea.getElementsByTagName('a');
- var oldLinks = [];
-
- for (var i = 0; i < tmp.length; i++)
- {
- oldLinks.push(tmp[i]);
- }
-
- document.execCommand('createlink', false, mxUtils.trim(value));
-
- // Finds the new link element
- var newLinks = this.cellEditor.textarea.getElementsByTagName('a');
-
- if (newLinks.length == oldLinks.length + 1)
- {
- // Inverse order in favor of appended links
- for (var i = newLinks.length - 1; i >= 0; i--)
- {
- if (newLinks[i] != oldLinks[i - 1])
- {
- // Removes all inner links from the new link and
- // moves the children to the inner link parent
- var tmp = newLinks[i].getElementsByTagName('a');
-
- while (tmp.length > 0)
- {
- var parent = tmp[0].parentNode;
-
- while (tmp[0].firstChild != null)
- {
- parent.insertBefore(tmp[0].firstChild, tmp[0]);
- }
-
- parent.removeChild(tmp[0]);
- }
-
- break;
- }
- }
- }
- }
- else
- {
- // LATER: Fix inserting link/image in IE8/quirks after focus lost
- document.execCommand('createlink', false, mxUtils.trim(value));
- }
- }
- };
-
- /**
- *
- * @param cell
- * @returns {Boolean}
- */
- Graph.prototype.isCellResizable = function(cell)
- {
- var result = mxGraph.prototype.isCellResizable.apply(this, arguments);
- var style = this.getCurrentCellStyle(cell);
-
- return !this.isTableCell(cell) && !this.isTableRow(cell) && (result ||
- (mxUtils.getValue(style, mxConstants.STYLE_RESIZABLE, '1') != '0' &&
- style[mxConstants.STYLE_WHITE_SPACE] == 'wrap'));
- };
-
- /**
- * Function: distributeCells
- *
- * Distribuets the centers of the given cells equally along the available
- * horizontal or vertical space.
- *
- * Parameters:
- *
- * horizontal - Boolean that specifies the direction of the distribution.
- * cells - Optional array of <mxCells> to be distributed. Edges are ignored.
- */
- Graph.prototype.distributeCells = function(horizontal, cells)
- {
- if (cells == null)
- {
- cells = this.getSelectionCells();
- }
-
- if (cells != null && cells.length > 1)
- {
- var vertices = [];
- var max = null;
- var min = null;
-
- for (var i = 0; i < cells.length; i++)
- {
- if (this.getModel().isVertex(cells[i]))
- {
- var state = this.view.getState(cells[i]);
-
- if (state != null)
- {
- var tmp = (horizontal) ? state.getCenterX() : state.getCenterY();
- max = (max != null) ? Math.max(max, tmp) : tmp;
- min = (min != null) ? Math.min(min, tmp) : tmp;
-
- vertices.push(state);
- }
- }
- }
-
- if (vertices.length > 2)
- {
- vertices.sort(function(a, b)
- {
- return (horizontal) ? a.x - b.x : a.y - b.y;
- });
-
- var t = this.view.translate;
- var s = this.view.scale;
-
- min = min / s - ((horizontal) ? t.x : t.y);
- max = max / s - ((horizontal) ? t.x : t.y);
-
- this.getModel().beginUpdate();
- try
- {
- var dt = (max - min) / (vertices.length - 1);
- var t0 = min;
-
- for (var i = 1; i < vertices.length - 1; i++)
- {
- var pstate = this.view.getState(this.model.getParent(vertices[i].cell));
- var geo = this.getCellGeometry(vertices[i].cell);
- t0 += dt;
-
- if (geo != null && pstate != null)
- {
- geo = geo.clone();
-
- if (horizontal)
- {
- geo.x = Math.round(t0 - geo.width / 2) - pstate.origin.x;
- }
- else
- {
- geo.y = Math.round(t0 - geo.height / 2) - pstate.origin.y;
- }
-
- this.getModel().setGeometry(vertices[i].cell, geo);
- }
- }
- }
- finally
- {
- this.getModel().endUpdate();
- }
- }
- }
-
- return cells;
- };
-
- /**
- * Adds meta-drag an Mac.
- * @param evt
- * @returns
- */
- Graph.prototype.isCloneEvent = function(evt)
- {
- return (mxClient.IS_MAC && mxEvent.isMetaDown(evt)) || mxEvent.isControlDown(evt);
- };
-
- /**
- * Translates this point by the given vector.
- *
- * @param {number} dx X-coordinate of the translation.
- * @param {number} dy Y-coordinate of the translation.
- */
- Graph.prototype.createSvgImageExport = function()
- {
- var exp = new mxImageExport();
-
- // Adds hyperlinks (experimental)
- exp.getLinkForCellState = mxUtils.bind(this, function(state, canvas)
- {
- return this.getLinkForCell(state.cell);
- });
-
- return exp;
- };
-
- /**
- * Translates this point by the given vector.
- *
- * @param {number} dx X-coordinate of the translation.
- * @param {number} dy Y-coordinate of the translation.
- */
- Graph.prototype.getSvg = function(background, scale, border, nocrop, crisp,
- ignoreSelection, showText, imgExport, linkTarget, hasShadow, incExtFonts,
- keepTheme, exportType)
- {
- //Disable Css Transforms if it is used
- var origUseCssTrans = this.useCssTransforms;
-
- if (origUseCssTrans)
- {
- this.useCssTransforms = false;
- this.view.revalidate();
- this.sizeDidChange();
- }
-
- try
- {
- scale = (scale != null) ? scale : 1;
- border = (border != null) ? border : 0;
- crisp = (crisp != null) ? crisp : true;
- ignoreSelection = (ignoreSelection != null) ? ignoreSelection : true;
- showText = (showText != null) ? showText : true;
-
- var bounds = (exportType == 'page') ? this.view.getBackgroundPageBounds() :
- ((ignoreSelection || nocrop || exportType == 'diagram') ?
- this.getGraphBounds() : this.getBoundingBox(
- this.getSelectionCells()));
-
- if (bounds == null)
- {
- throw Error(mxResources.get('drawingEmpty'));
- }
-
- var vs = this.view.scale;
-
- // Prepares SVG document that holds the output
- var svgDoc = mxUtils.createXmlDocument();
- var root = (svgDoc.createElementNS != null) ?
- svgDoc.createElementNS(mxConstants.NS_SVG, 'svg') : svgDoc.createElement('svg');
-
- if (background != null)
- {
- if (root.style != null)
- {
- root.style.backgroundColor = background;
- }
- else
- {
- root.setAttribute('style', 'background-color:' + background);
- }
- }
-
- if (svgDoc.createElementNS == null)
- {
- root.setAttribute('xmlns', mxConstants.NS_SVG);
- root.setAttribute('xmlns:xlink', mxConstants.NS_XLINK);
- }
- else
- {
- // KNOWN: Ignored in IE9-11, adds namespace for each image element instead. No workaround.
- root.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', mxConstants.NS_XLINK);
- }
-
- var s = scale / vs;
- var w = Math.max(1, Math.ceil(bounds.width * s) + 2 * border) + ((hasShadow) ? 5 : 0);
- var h = Math.max(1, Math.ceil(bounds.height * s) + 2 * border) + ((hasShadow) ? 5 : 0);
-
- root.setAttribute('version', '1.1');
- root.setAttribute('width', w + 'px');
- root.setAttribute('height', h + 'px');
- root.setAttribute('viewBox', ((crisp) ? '-0.5 -0.5' : '0 0') + ' ' + w + ' ' + h);
- svgDoc.appendChild(root);
-
- // Renders graph. Offset will be multiplied with state's scale when painting state.
- // TextOffset only seems to affect FF output but used everywhere for consistency.
- var group = (svgDoc.createElementNS != null) ?
- svgDoc.createElementNS(mxConstants.NS_SVG, 'g') : svgDoc.createElement('g');
- root.appendChild(group);
-
- var svgCanvas = this.createSvgCanvas(group);
- svgCanvas.foOffset = (crisp) ? -0.5 : 0;
- svgCanvas.textOffset = (crisp) ? -0.5 : 0;
- svgCanvas.imageOffset = (crisp) ? -0.5 : 0;
- svgCanvas.translate(Math.floor((border / scale - bounds.x) / vs),
- Math.floor((border / scale - bounds.y) / vs));
-
- // Convert HTML entities
- var htmlConverter = document.createElement('div');
-
- // Adds simple text fallback for viewers with no support for foreignObjects
- var getAlternateText = svgCanvas.getAlternateText;
- svgCanvas.getAlternateText = function(fo, x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation)
- {
- // Assumes a max character width of 0.5em
- if (str != null && this.state.fontSize > 0)
- {
- try
- {
- if (mxUtils.isNode(str))
- {
- str = str.innerText;
- }
- else
- {
- htmlConverter.innerHTML = str;
- str = mxUtils.extractTextWithWhitespace(htmlConverter.childNodes);
- }
-
- // Workaround for substring breaking double byte UTF
- var exp = Math.ceil(2 * w / this.state.fontSize);
- var result = [];
- var length = 0;
- var index = 0;
-
- while ((exp == 0 || length < exp) && index < str.length)
- {
- var char = str.charCodeAt(index);
-
- if (char == 10 || char == 13)
- {
- if (length > 0)
- {
- break;
- }
- }
- else
- {
- result.push(str.charAt(index));
-
- if (char < 255)
- {
- length++;
- }
- }
-
- index++;
- }
-
- // Uses result and adds ellipsis if more than 1 char remains
- if (result.length < str.length && str.length - result.length > 1)
- {
- str = mxUtils.trim(result.join('')) + '...';
- }
-
- return str;
- }
- catch (e)
- {
- return getAlternateText.apply(this, arguments);
- }
- }
- else
- {
- return getAlternateText.apply(this, arguments);
- }
- };
-
- // Paints background image
- var bgImg = this.backgroundImage;
-
- if (bgImg != null)
- {
- var s2 = vs / scale;
- var tr = this.view.translate;
- var tmp = new mxRectangle(tr.x * s2, tr.y * s2, bgImg.width * s2, bgImg.height * s2);
-
- // Checks if visible
- if (mxUtils.intersects(bounds, tmp))
- {
- svgCanvas.image(tr.x, tr.y, bgImg.width, bgImg.height, bgImg.src, true);
- }
- }
-
- svgCanvas.scale(s);
- svgCanvas.textEnabled = showText;
-
- imgExport = (imgExport != null) ? imgExport : this.createSvgImageExport();
- var imgExportDrawCellState = imgExport.drawCellState;
-
- // Ignores custom links
- var imgExportGetLinkForCellState = imgExport.getLinkForCellState;
-
- imgExport.getLinkForCellState = function(state, canvas)
- {
- var result = imgExportGetLinkForCellState.apply(this, arguments);
-
- return (result != null && !state.view.graph.isCustomLink(result)) ? result : null;
- };
-
- // Implements ignoreSelection flag
- imgExport.drawCellState = function(state, canvas)
- {
- var graph = state.view.graph;
- var selected = graph.isCellSelected(state.cell);
- var parent = graph.model.getParent(state.cell);
-
- // Checks if parent cell is selected
- while (!ignoreSelection && !selected && parent != null)
- {
- selected = graph.isCellSelected(parent);
- parent = graph.model.getParent(parent);
- }
-
- if (ignoreSelection || selected)
- {
- imgExportDrawCellState.apply(this, arguments);
- }
- };
-
- imgExport.drawState(this.getView().getState(this.model.root), svgCanvas);
- this.updateSvgLinks(root, linkTarget, true);
- this.addForeignObjectWarning(svgCanvas, root);
-
- return root;
- }
- finally
- {
- if (origUseCssTrans)
- {
- this.useCssTransforms = true;
- this.view.revalidate();
- this.sizeDidChange();
- }
- }
- };
-
- /**
- * Adds warning for truncated labels in older viewers.
- */
- Graph.prototype.addForeignObjectWarning = function(canvas, root)
- {
- if (urlParams['svg-warning'] != '0' && root.getElementsByTagName('foreignObject').length > 0)
- {
- var sw = canvas.createElement('switch');
- var g1 = canvas.createElement('g');
- g1.setAttribute('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Extensibility');
- var a = canvas.createElement('a');
- a.setAttribute('transform', 'translate(0,-5)');
-
- // Workaround for implicit namespace handling in HTML5 export, IE adds NS1 namespace so use code below
- // in all IE versions except quirks mode. KNOWN: Adds xlink namespace to each image tag in output.
- if (a.setAttributeNS == null || (root.ownerDocument != document && document.documentMode == null))
- {
- a.setAttribute('xlink:href', Graph.foreignObjectWarningLink);
- a.setAttribute('target', '_blank');
- }
- else
- {
- a.setAttributeNS(mxConstants.NS_XLINK, 'xlink:href', Graph.foreignObjectWarningLink);
- a.setAttributeNS(mxConstants.NS_XLINK, 'target', '_blank');
- }
-
- var text = canvas.createElement('text');
- text.setAttribute('text-anchor', 'middle');
- text.setAttribute('font-size', '10px');
- text.setAttribute('x', '50%');
- text.setAttribute('y', '100%');
- mxUtils.write(text, Graph.foreignObjectWarningText);
-
- sw.appendChild(g1);
- a.appendChild(text);
- sw.appendChild(a);
- root.appendChild(sw);
- }
- };
-
- /**
- * Hook for creating the canvas used in getSvg.
- */
- Graph.prototype.updateSvgLinks = function(node, target, removeCustom)
- {
- var links = node.getElementsByTagName('a');
-
- for (var i = 0; i < links.length; i++)
- {
- var href = links[i].getAttribute('href');
-
- if (href == null)
- {
- href = links[i].getAttribute('xlink:href');
- }
-
- if (href != null)
- {
- if (target != null && /^https?:\/\//.test(href))
- {
- links[i].setAttribute('target', target);
- }
- else if (removeCustom && this.isCustomLink(href))
- {
- links[i].setAttribute('href', 'javascript:void(0);');
- }
- }
- }
- };
-
- /**
- * Hook for creating the canvas used in getSvg.
- */
- Graph.prototype.createSvgCanvas = function(node)
- {
- var canvas = new mxSvgCanvas2D(node);
-
- canvas.pointerEvents = true;
-
- return canvas;
- };
-
- /**
- * Returns the first ancestor of the current selection with the given name.
- */
- Graph.prototype.getSelectedElement = function()
- {
- var node = null;
-
- if (window.getSelection)
- {
- var sel = window.getSelection();
-
- if (sel.getRangeAt && sel.rangeCount)
- {
- var range = sel.getRangeAt(0);
- node = range.commonAncestorContainer;
- }
- }
- else if (document.selection)
- {
- node = document.selection.createRange().parentElement();
- }
-
- return node;
- };
-
- /**
- * Returns the text editing element.
- */
- Graph.prototype.getSelectedEditingElement = function()
- {
- var node = this.getSelectedElement();
-
- while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT)
- {
- node = node.parentNode;
- }
-
- if (node != null)
- {
- // Workaround for commonAncestor on range in IE11 returning parent of common ancestor
- if (node == this.cellEditor.textarea && this.cellEditor.textarea.children.length == 1 &&
- this.cellEditor.textarea.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT)
- {
- node = this.cellEditor.textarea.firstChild;
- }
- }
-
- return node;
- };
-
- /**
- * Returns the first ancestor of the current selection with the given name.
- */
- Graph.prototype.getParentByName = function(node, name, stopAt)
- {
- while (node != null)
- {
- if (node.nodeName == name)
- {
- return node;
- }
-
- if (node == stopAt)
- {
- return null;
- }
-
- node = node.parentNode;
- }
-
- return node;
- };
-
- /**
- * Returns the first ancestor of the current selection with the given name.
- */
- Graph.prototype.getParentByNames = function(node, names, stopAt)
- {
- while (node != null)
- {
- if (mxUtils.indexOf(names, node.nodeName) >= 0)
- {
- return node;
- }
-
- if (node == stopAt)
- {
- return null;
- }
-
- node = node.parentNode;
- }
-
- return node;
- };
-
- /**
- * Selects the given node.
- */
- Graph.prototype.selectNode = function(node)
- {
- var sel = null;
-
- // IE9 and non-IE
- if (window.getSelection)
- {
- sel = window.getSelection();
-
- if (sel.getRangeAt && sel.rangeCount)
- {
- var range = document.createRange();
- range.selectNode(node);
- sel.removeAllRanges();
- sel.addRange(range);
- }
- }
- // IE < 9
- else if ((sel = document.selection) && sel.type != 'Control')
- {
- var originalRange = sel.createRange();
- originalRange.collapse(true);
- var range = sel.createRange();
- range.setEndPoint('StartToStart', originalRange);
- range.select();
- }
- };
-
- /**
- * Deletes the given cells and returns the cells to be selected.
- */
- Graph.prototype.deleteCells = function(cells, includeEdges)
- {
- var select = null;
-
- if (cells != null && cells.length > 0)
- {
- this.model.beginUpdate();
- try
- {
- // Shrinks tables
- for (var i = 0; i < cells.length; i++)
- {
- var parent = this.model.getParent(cells[i]);
-
- if (this.isTable(parent))
- {
- var row = this.getCellGeometry(cells[i]);
- var table = this.getCellGeometry(parent);
-
- if (row != null && table != null)
- {
- table = table.clone();
- table.height -= row.height;
- this.model.setGeometry(parent, table);
- }
- }
- }
-
- var parents = (this.selectParentAfterDelete) ? this.model.getParents(cells) : null;
- this.removeCells(cells, includeEdges);
- }
- finally
- {
- this.model.endUpdate();
- }
-
- // Selects parents for easier editing of groups
- if (parents != null)
- {
- select = [];
-
- for (var i = 0; i < parents.length; i++)
- {
- if (this.model.contains(parents[i]) &&
- (this.model.isVertex(parents[i]) ||
- this.model.isEdge(parents[i])))
- {
- select.push(parents[i]);
- }
- }
- }
- }
-
- return select;
- };
-
- /**
- * Inserts a column in the table for the given cell.
- */
- Graph.prototype.insertTableColumn = function(cell, before)
- {
- var model = this.getModel();
- model.beginUpdate();
-
- try
- {
- var table = cell;
- var index = 0;
-
- if (this.isTableCell(cell))
- {
- var row = model.getParent(cell);
- table = model.getParent(row);
- index = mxUtils.indexOf(model.getChildCells(row, true), cell);
- }
- else
- {
- if (this.isTableRow(cell))
- {
- table = model.getParent(cell);
- }
- else
- {
- cell = model.getChildCells(table, true)[0];
- }
-
- if (!before)
- {
- index = model.getChildCells(cell, true).length - 1;
- }
- }
-
- var rows = model.getChildCells(table, true);
- var dw = Graph.minTableColumnWidth;
-
- for (var i = 0; i < rows.length; i++)
- {
- var child = model.getChildCells(rows[i], true)[index];
- var clone = model.cloneCell(child, false);
- var geo = this.getCellGeometry(clone);
- clone.value = null;
-
- if (geo != null)
- {
- dw = geo.width;
- var rowGeo = this.getCellGeometry(rows[i]);
-
- if (rowGeo != null)
- {
- geo.height = rowGeo.height;
- }
- }
-
- model.add(rows[i], clone, index + ((before) ? 0 : 1));
- }
-
- var tableGeo = this.getCellGeometry(table);
-
- if (tableGeo != null)
- {
- tableGeo = tableGeo.clone();
- tableGeo.width += dw;
-
- model.setGeometry(table, tableGeo);
- }
- }
- finally
- {
- model.endUpdate();
- }
- };
-
- /**
- * Inserts a row in the table for the given cell.
- */
- Graph.prototype.insertTableRow = function(cell, before)
- {
- var model = this.getModel();
- model.beginUpdate();
-
- try
- {
- var table = cell;
- var row = cell;
-
- if (this.isTableCell(cell))
- {
- row = model.getParent(cell);
- table = model.getParent(row);
- }
- else if (this.isTableRow(cell))
- {
- table = model.getParent(cell);
- }
- else
- {
- var rows = model.getChildCells(table, true);
- row = rows[(before) ? 0 : rows.length - 1];
- }
-
- var cells = model.getChildCells(row, true);
- var index = table.getIndex(row);
- row = model.cloneCell(row, false);
- row.value = null;
-
- var rowGeo = this.getCellGeometry(row);
-
- if (rowGeo != null)
- {
- for (var i = 0; i < cells.length; i++)
- {
- var cell = model.cloneCell(cells[i], false);
- row.insert(cell);
- cell.value = null;
-
- var geo = this.getCellGeometry(cell);
-
- if (geo != null)
- {
- geo.height = rowGeo.height;
- }
- }
-
- model.add(table, row, index + ((before) ? 0 : 1));
-
- var tableGeo = this.getCellGeometry(table);
-
- if (tableGeo != null)
- {
- tableGeo = tableGeo.clone();
- tableGeo.height += rowGeo.height;
-
- model.setGeometry(table, tableGeo);
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
- };
-
- /**
- *
- */
- Graph.prototype.deleteTableColumn = function(cell)
- {
- var model = this.getModel();
- model.beginUpdate();
-
- try
- {
- var table = cell;
- var row = cell;
-
- if (this.isTableCell(cell))
- {
- row = model.getParent(cell);
- }
-
- if (this.isTableRow(row))
- {
- table = model.getParent(row);
- }
-
- var rows = model.getChildCells(table, true);
-
- if (rows.length == 0)
- {
- model.remove(table);
- }
- else
- {
- if (!this.isTableRow(row))
- {
- row = rows[0];
- }
-
- var cells = model.getChildCells(row, true);
-
- if (cells.length <= 1)
- {
- model.remove(table);
- }
- else
- {
- var index = cells.length - 1;
-
- if (this.isTableCell(cell))
- {
- index = mxUtils.indexOf(cells, cell);
- }
-
- var width = 0;
-
- for (var i = 0; i < rows.length; i++)
- {
- var child = model.getChildCells(rows[i], true)[index];
- model.remove(child);
-
- var geo = this.getCellGeometry(child);
-
- if (geo != null)
- {
- width = Math.max(width, geo.width);
- }
- }
-
- var tableGeo = this.getCellGeometry(table);
-
- if (tableGeo != null)
- {
- tableGeo = tableGeo.clone();
- tableGeo.width -= width;
-
- model.setGeometry(table, tableGeo);
- }
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
- };
-
- /**
- *
- */
- Graph.prototype.deleteTableRow = function(cell)
- {
- var model = this.getModel();
- model.beginUpdate();
-
- try
- {
- var table = cell;
- var row = cell;
-
- if (this.isTableCell(cell))
- {
- row = model.getParent(cell);
- cell = row;
- }
-
- if (this.isTableRow(cell))
- {
- table = model.getParent(row);
- }
-
- var rows = model.getChildCells(table, true);
-
- if (rows.length <= 1)
- {
- model.remove(table);
- }
- else
- {
- if (!this.isTableRow(row))
- {
- row = rows[rows.length - 1];
- }
-
- model.remove(row);
- var height = 0;
-
- var geo = this.getCellGeometry(row);
-
- if (geo != null)
- {
- height = geo.height;
- }
-
- var tableGeo = this.getCellGeometry(table);
-
- if (tableGeo != null)
- {
- tableGeo = tableGeo.clone();
- tableGeo.height -= height;
-
- model.setGeometry(table, tableGeo);
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
- };
-
- /**
- * Inserts a new row into the given table.
- */
- Graph.prototype.insertRow = function(table, index)
- {
- var bd = table.tBodies[0];
- var cells = bd.rows[0].cells;
- var cols = 0;
-
- // Counts columns including colspans
- for (var i = 0; i < cells.length; i++)
- {
- var colspan = cells[i].getAttribute('colspan');
- cols += (colspan != null) ? parseInt(colspan) : 1;
- }
-
- var row = bd.insertRow(index);
-
- for (var i = 0; i < cols; i++)
- {
- mxUtils.br(row.insertCell(-1));
- }
-
- return row.cells[0];
- };
-
- /**
- * Deletes the given column.
- */
- Graph.prototype.deleteRow = function(table, index)
- {
- table.tBodies[0].deleteRow(index);
- };
-
- /**
- * Deletes the given column.
- */
- Graph.prototype.insertColumn = function(table, index)
- {
- var hd = table.tHead;
-
- if (hd != null)
- {
- // TODO: use colIndex
- for (var h = 0; h < hd.rows.length; h++)
- {
- var th = document.createElement('th');
- hd.rows[h].appendChild(th);
- mxUtils.br(th);
- }
- }
-
- var bd = table.tBodies[0];
-
- for (var i = 0; i < bd.rows.length; i++)
- {
- var cell = bd.rows[i].insertCell(index);
- mxUtils.br(cell);
- }
-
- return bd.rows[0].cells[(index >= 0) ? index : bd.rows[0].cells.length - 1];
- };
-
- /**
- * Deletes the given column.
- */
- Graph.prototype.deleteColumn = function(table, index)
- {
- if (index >= 0)
- {
- var bd = table.tBodies[0];
- var rows = bd.rows;
-
- for (var i = 0; i < rows.length; i++)
- {
- if (rows[i].cells.length > index)
- {
- rows[i].deleteCell(index);
- }
- }
- }
- };
-
- /**
- * Inserts the given HTML at the caret position (no undo).
- */
- Graph.prototype.pasteHtmlAtCaret = function(html)
- {
- var sel, range;
-
- // IE9 and non-IE
- if (window.getSelection)
- {
- sel = window.getSelection();
-
- if (sel.getRangeAt && sel.rangeCount)
- {
- range = sel.getRangeAt(0);
- range.deleteContents();
-
- // Range.createContextualFragment() would be useful here but is
- // only relatively recently standardized and is not supported in
- // some browsers (IE9, for one)
- var el = document.createElement("div");
- el.innerHTML = html;
- var frag = document.createDocumentFragment(), node;
-
- while ((node = el.firstChild))
- {
- lastNode = frag.appendChild(node);
- }
-
- range.insertNode(frag);
- }
- }
- // IE < 9
- else if ((sel = document.selection) && sel.type != "Control")
- {
- // FIXME: Does not work if selection is empty
- sel.createRange().pasteHTML(html);
- }
- };
-
- /**
- * Creates an anchor elements for handling the given link in the
- * hint that is shown when the cell is selected.
- */
- Graph.prototype.createLinkForHint = function(link, label)
- {
- link = (link != null) ? link : 'javascript:void(0);';
-
- if (label == null || label.length == 0)
- {
- if (this.isCustomLink(link))
- {
- label = this.getLinkTitle(link);
- }
- else
- {
- label = link;
- }
- }
-
- // Helper function to shorten strings
- function short(str, max)
- {
- if (str.length > max)
- {
- str = str.substring(0, Math.round(max / 2)) + '...' +
- str.substring(str.length - Math.round(max / 4));
- }
-
- return str;
- };
-
- var a = document.createElement('a');
- a.setAttribute('rel', this.linkRelation);
- a.setAttribute('href', this.getAbsoluteUrl(link));
- a.setAttribute('title', short((this.isCustomLink(link)) ?
- this.getLinkTitle(link) : link, 80));
-
- if (this.linkTarget != null)
- {
- a.setAttribute('target', this.linkTarget);
- }
-
- // Adds shortened label to link
- mxUtils.write(a, short(label, 40));
-
- // Handles custom links
- if (this.isCustomLink(link))
- {
- mxEvent.addListener(a, 'click', mxUtils.bind(this, function(evt)
- {
- this.customLinkClicked(link);
- mxEvent.consume(evt);
- }));
- }
-
- return a;
- };
-
- /**
- * Customized graph for touch devices.
- */
- Graph.prototype.initTouch = function()
- {
- // Disables new connections via "hotspot"
- this.connectionHandler.marker.isEnabled = function()
- {
- return this.graph.connectionHandler.first != null;
- };
-
- // Hides menu when editing starts
- this.addListener(mxEvent.START_EDITING, function(sender, evt)
- {
- this.popupMenuHandler.hideMenu();
- });
-
- // Adds custom hit detection if native hit detection found no cell
- var graphUpdateMouseEvent = this.updateMouseEvent;
- this.updateMouseEvent = function(me)
- {
- me = graphUpdateMouseEvent.apply(this, arguments);
-
- if (mxEvent.isTouchEvent(me.getEvent()) && me.getState() == null)
- {
- var cell = this.getCellAt(me.graphX, me.graphY);
-
- if (cell != null && this.isSwimlane(cell) && this.hitsSwimlaneContent(cell, me.graphX, me.graphY))
- {
- cell = null;
- }
- else
- {
- me.state = this.view.getState(cell);
-
- if (me.state != null && me.state.shape != null)
- {
- this.container.style.cursor = me.state.shape.node.style.cursor;
- }
- }
- }
-
- if (me.getState() == null && this.isEnabled())
- {
- this.container.style.cursor = 'default';
- }
-
- return me;
- };
-
- // Context menu trigger implementation depending on current selection state
- // combined with support for normal popup trigger.
- var cellSelected = false;
- var selectionEmpty = false;
- var menuShowing = false;
-
- var oldFireMouseEvent = this.fireMouseEvent;
-
- this.fireMouseEvent = function(evtName, me, sender)
- {
- if (evtName == mxEvent.MOUSE_DOWN)
- {
- // For hit detection on edges
- me = this.updateMouseEvent(me);
-
- cellSelected = this.isCellSelected(me.getCell());
- selectionEmpty = this.isSelectionEmpty();
- menuShowing = this.popupMenuHandler.isMenuShowing();
- }
-
- oldFireMouseEvent.apply(this, arguments);
- };
-
- // Shows popup menu if cell was selected or selection was empty and background was clicked
- // FIXME: Conflicts with mxPopupMenuHandler.prototype.getCellForPopupEvent in Editor.js by
- // selecting parent for selected children in groups before this check can be made.
- this.popupMenuHandler.mouseUp = mxUtils.bind(this, function(sender, me)
- {
- this.popupMenuHandler.popupTrigger = !this.isEditing() && this.isEnabled() &&
- (me.getState() == null || !me.isSource(me.getState().control)) &&
- (this.popupMenuHandler.popupTrigger || (!menuShowing && !mxEvent.isMouseEvent(me.getEvent()) &&
- ((selectionEmpty && me.getCell() == null && this.isSelectionEmpty()) ||
- (cellSelected && this.isCellSelected(me.getCell())))));
- mxPopupMenuHandler.prototype.mouseUp.apply(this.popupMenuHandler, arguments);
- });
- };
-
- /**
- * HTML in-place editor
- */
- mxCellEditor.prototype.isContentEditing = function()
- {
- var state = this.graph.view.getState(this.editingCell);
-
- return state != null && state.style['html'] == 1;
- };
-
- /**
- * Returns true if all selected text is inside a table element.
- */
- mxCellEditor.prototype.isTableSelected = function()
- {
- return this.graph.getParentByName(
- this.graph.getSelectedElement(),
- 'TABLE', this.textarea) != null;
- };
-
- /**
- * Sets the alignment of the current selected cell. This sets the
- * alignment in the cell style, removes all alignment within the
- * text and invokes the built-in alignment function.
- *
- * Only the built-in function is invoked if shift is pressed or
- * if table cells are selected and shift is not pressed.
- */
- mxCellEditor.prototype.alignText = function(align, evt)
- {
- var shiftPressed = evt != null && mxEvent.isShiftDown(evt);
-
- if (shiftPressed || (window.getSelection != null && window.getSelection().containsNode != null))
- {
- var allSelected = true;
-
- this.graph.processElements(this.textarea, function(node)
- {
- if (shiftPressed || window.getSelection().containsNode(node, true))
- {
- node.removeAttribute('align');
- node.style.textAlign = null;
- }
- else
- {
- allSelected = false;
- }
- });
-
- if (allSelected)
- {
- this.graph.cellEditor.setAlign(align);
- }
- }
-
- document.execCommand('justify' + align.toLowerCase(), false, null);
- };
-
- /**
- * Creates the keyboard event handler for the current graph and history.
- */
- mxCellEditor.prototype.saveSelection = function()
- {
- if (window.getSelection)
- {
- var sel = window.getSelection();
-
- if (sel.getRangeAt && sel.rangeCount)
- {
- var ranges = [];
-
- for (var i = 0, len = sel.rangeCount; i < len; ++i)
- {
- ranges.push(sel.getRangeAt(i));
- }
-
- return ranges;
- }
- }
- else if (document.selection && document.selection.createRange)
- {
- return document.selection.createRange();
- }
-
- return null;
- };
-
- /**
- * Creates the keyboard event handler for the current graph and history.
- */
- mxCellEditor.prototype.restoreSelection = function(savedSel)
- {
- try
- {
- if (savedSel)
- {
- if (window.getSelection)
- {
- sel = window.getSelection();
- sel.removeAllRanges();
-
- for (var i = 0, len = savedSel.length; i < len; ++i)
- {
- sel.addRange(savedSel[i]);
- }
- }
- else if (document.selection && savedSel.select)
- {
- savedSel.select();
- }
- }
- }
- catch (e)
- {
- // ignore
- }
- };
-
- /**
- * Handling of special nl2Br style for not converting newlines to breaks in HTML labels.
- * NOTE: Since it's easier to set this when the label is created we assume that it does
- * not change during the lifetime of the mxText instance.
- */
- var mxCellRendererInitializeLabel = mxCellRenderer.prototype.initializeLabel;
- mxCellRenderer.prototype.initializeLabel = function(state)
- {
- if (state.text != null)
- {
- state.text.replaceLinefeeds = mxUtils.getValue(state.style, 'nl2Br', '1') != '0';
- }
-
- mxCellRendererInitializeLabel.apply(this, arguments);
- };
-
- var mxConstraintHandlerUpdate = mxConstraintHandler.prototype.update;
- mxConstraintHandler.prototype.update = function(me, source)
- {
- if (this.isKeepFocusEvent(me) || !mxEvent.isAltDown(me.getEvent()))
- {
- mxConstraintHandlerUpdate.apply(this, arguments);
- }
- else
- {
- this.reset();
- }
- };
-
- /**
- * No dashed shapes.
- */
- mxGuide.prototype.createGuideShape = function(horizontal)
- {
- var guide = new mxPolyline([], mxConstants.GUIDE_COLOR, mxConstants.GUIDE_STROKEWIDTH);
-
- return guide;
- };
-
- /**
- * HTML in-place editor
- */
- mxCellEditor.prototype.escapeCancelsEditing = false;
-
- /**
- * Overridden to set CSS classes.
- */
- var mxCellEditorStartEditing = mxCellEditor.prototype.startEditing;
- mxCellEditor.prototype.startEditing = function(cell, trigger)
- {
- cell = this.graph.getStartEditingCell(cell, trigger);
-
- mxCellEditorStartEditing.apply(this, arguments);
-
- // Overrides class in case of HTML content to add
- // dashed borders for divs and table cells
- var state = this.graph.view.getState(cell);
-
- if (state != null && state.style['html'] == 1)
- {
- this.textarea.className = 'mxCellEditor geContentEditable';
- }
- else
- {
- this.textarea.className = 'mxCellEditor mxPlainTextEditor';
- }
-
- // Toggles markup vs wysiwyg mode
- this.codeViewMode = false;
-
- // Stores current selection range when switching between markup and code
- this.switchSelectionState = null;
-
- // Selects editing cell
- this.graph.setSelectionCell(cell);
-
- // Enables focus outline for edges and edge labels
- var parent = this.graph.getModel().getParent(cell);
- var geo = this.graph.getCellGeometry(cell);
-
- if ((this.graph.getModel().isEdge(parent) && geo != null && geo.relative) ||
- this.graph.getModel().isEdge(cell))
- {
- // Quirks does not support outline at all so use border instead
- if (mxClient.IS_QUIRKS)
- {
- this.textarea.style.border = 'gray dotted 1px';
- }
- // IE>8 and FF on Windows uses outline default of none
- else if (mxClient.IS_IE || mxClient.IS_IE11 || (mxClient.IS_FF && mxClient.IS_WIN))
- {
- this.textarea.style.outline = 'gray dotted 1px';
- }
- else
- {
- this.textarea.style.outline = '';
- }
- }
- else if (mxClient.IS_QUIRKS)
- {
- this.textarea.style.outline = 'none';
- this.textarea.style.border = '';
- }
- }
-
- /**
- * HTML in-place editor
- */
- var cellEditorInstallListeners = mxCellEditor.prototype.installListeners;
- mxCellEditor.prototype.installListeners = function(elt)
- {
- cellEditorInstallListeners.apply(this, arguments);
-
- // Adds a reference from the clone to the original node, recursively
- function reference(node, clone)
- {
- clone.originalNode = node;
-
- node = node.firstChild;
- var child = clone.firstChild;
-
- while (node != null && child != null)
- {
- reference(node, child);
- node = node.nextSibling;
- child = child.nextSibling;
- }
-
- return clone;
- };
-
- // Checks the given node for new nodes, recursively
- function checkNode(node, clone)
- {
- if (node != null)
- {
- if (clone.originalNode != node)
- {
- cleanNode(node);
- }
- else
- {
- node = node.firstChild;
- clone = clone.firstChild;
-
- while (node != null)
- {
- var nextNode = node.nextSibling;
-
- if (clone == null)
- {
- cleanNode(node);
- }
- else
- {
- checkNode(node, clone);
- clone = clone.nextSibling;
- }
-
- node = nextNode;
- }
- }
- }
- };
-
- // Removes unused DOM nodes and attributes, recursively
- function cleanNode(node)
- {
- var child = node.firstChild;
-
- while (child != null)
- {
- var next = child.nextSibling;
- cleanNode(child);
- child = next;
- }
-
- if ((node.nodeType != 1 || (node.nodeName !== 'BR' && node.firstChild == null)) &&
- (node.nodeType != 3 || mxUtils.trim(mxUtils.getTextContent(node)).length == 0))
- {
- node.parentNode.removeChild(node);
- }
- else
- {
- // Removes linefeeds
- if (node.nodeType == 3)
- {
- mxUtils.setTextContent(node, mxUtils.getTextContent(node).replace(/\n|\r/g, ''));
- }
-
- // Removes CSS classes and styles (for Word and Excel)
- if (node.nodeType == 1)
- {
- node.removeAttribute('style');
- node.removeAttribute('class');
- node.removeAttribute('width');
- node.removeAttribute('cellpadding');
- node.removeAttribute('cellspacing');
- node.removeAttribute('border');
- }
- }
- };
-
- // Handles paste from Word, Excel etc by removing styles, classnames and unused nodes
- // LATER: Fix undo/redo for paste
- if (!mxClient.IS_QUIRKS && document.documentMode !== 7 && document.documentMode !== 8)
- {
- mxEvent.addListener(this.textarea, 'paste', mxUtils.bind(this, function(evt)
- {
- var clone = reference(this.textarea, this.textarea.cloneNode(true));
-
- window.setTimeout(mxUtils.bind(this, function()
- {
- if (this.textarea != null)
- {
- // Paste from Word or Excel
- if (this.textarea.innerHTML.indexOf('<o:OfficeDocumentSettings>') >= 0 ||
- this.textarea.innerHTML.indexOf('<!--[if !mso]>') >= 0)
- {
- checkNode(this.textarea, clone);
- }
- else
- {
- Graph.removePasteFormatting(this.textarea);
- }
- }
- }), 0);
- }));
- }
- };
-
- mxCellEditor.prototype.toggleViewMode = function()
- {
- var state = this.graph.view.getState(this.editingCell);
-
- if (state != null)
- {
- var nl2Br = state != null && mxUtils.getValue(state.style, 'nl2Br', '1') != '0';
- var tmp = this.saveSelection();
-
- if (!this.codeViewMode)
- {
- // Clears the initial empty label on the first keystroke
- if (this.clearOnChange && this.textarea.innerHTML == this.getEmptyLabelText())
- {
- this.clearOnChange = false;
- this.textarea.innerHTML = '';
- }
-
- // Removes newlines from HTML and converts breaks to newlines
- // to match the HTML output in plain text
- var content = mxUtils.htmlEntities(this.textarea.innerHTML);
-
- // Workaround for trailing line breaks being ignored in the editor
- if (!mxClient.IS_QUIRKS && document.documentMode != 8)
- {
- content = mxUtils.replaceTrailingNewlines(content, '<div><br></div>');
- }
-
- content = this.graph.sanitizeHtml((nl2Br) ? content.replace(/\n/g, '').replace(/&lt;br\s*.?&gt;/g, '<br>') : content, true);
- this.textarea.className = 'mxCellEditor mxPlainTextEditor';
-
- var size = mxConstants.DEFAULT_FONTSIZE;
-
- this.textarea.style.lineHeight = (mxConstants.ABSOLUTE_LINE_HEIGHT) ? Math.round(size * mxConstants.LINE_HEIGHT) + 'px' : mxConstants.LINE_HEIGHT;
- this.textarea.style.fontSize = Math.round(size) + 'px';
- this.textarea.style.textDecoration = '';
- this.textarea.style.fontWeight = 'normal';
- this.textarea.style.fontStyle = '';
- this.textarea.style.fontFamily = mxConstants.DEFAULT_FONTFAMILY;
- this.textarea.style.textAlign = 'left';
-
- // Adds padding to make cursor visible with borders
- this.textarea.style.padding = '2px';
-
- if (this.textarea.innerHTML != content)
- {
- this.textarea.innerHTML = content;
- }
-
- this.codeViewMode = true;
- }
- else
- {
- var content = mxUtils.extractTextWithWhitespace(this.textarea.childNodes);
-
- // Strips trailing line break
- if (content.length > 0 && content.charAt(content.length - 1) == '\n')
- {
- content = content.substring(0, content.length - 1);
- }
-
- content = this.graph.sanitizeHtml((nl2Br) ? content.replace(/\n/g, '<br/>') : content, true)
- this.textarea.className = 'mxCellEditor geContentEditable';
-
- var size = mxUtils.getValue(state.style, mxConstants.STYLE_FONTSIZE, mxConstants.DEFAULT_FONTSIZE);
- var family = mxUtils.getValue(state.style, mxConstants.STYLE_FONTFAMILY, mxConstants.DEFAULT_FONTFAMILY);
- var align = mxUtils.getValue(state.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_LEFT);
- var bold = (mxUtils.getValue(state.style, mxConstants.STYLE_FONTSTYLE, 0) &
- mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD;
- var italic = (mxUtils.getValue(state.style, mxConstants.STYLE_FONTSTYLE, 0) &
- mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC;
- var txtDecor = [];
-
- if ((mxUtils.getValue(state.style, mxConstants.STYLE_FONTSTYLE, 0) &
- mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE)
- {
- txtDecor.push('underline');
- }
-
- if ((mxUtils.getValue(state.style, mxConstants.STYLE_FONTSTYLE, 0) &
- mxConstants.FONT_STRIKETHROUGH) == mxConstants.FONT_STRIKETHROUGH)
- {
- txtDecor.push('line-through');
- }
-
- this.textarea.style.lineHeight = (mxConstants.ABSOLUTE_LINE_HEIGHT) ? Math.round(size * mxConstants.LINE_HEIGHT) + 'px' : mxConstants.LINE_HEIGHT;
- this.textarea.style.fontSize = Math.round(size) + 'px';
- this.textarea.style.textDecoration = txtDecor.join(' ');
- this.textarea.style.fontWeight = (bold) ? 'bold' : 'normal';
- this.textarea.style.fontStyle = (italic) ? 'italic' : '';
- this.textarea.style.fontFamily = family;
- this.textarea.style.textAlign = align;
- this.textarea.style.padding = '0px';
-
- if (this.textarea.innerHTML != content)
- {
- this.textarea.innerHTML = content;
-
- if (this.textarea.innerHTML.length == 0)
- {
- this.textarea.innerHTML = this.getEmptyLabelText();
- this.clearOnChange = this.textarea.innerHTML.length > 0;
- }
- }
-
- this.codeViewMode = false;
- }
-
- this.textarea.focus();
-
- if (this.switchSelectionState != null)
- {
- this.restoreSelection(this.switchSelectionState);
- }
-
- this.switchSelectionState = tmp;
- this.resize();
- }
- };
-
- var mxCellEditorResize = mxCellEditor.prototype.resize;
- mxCellEditor.prototype.resize = function(state, trigger)
- {
- if (this.textarea != null)
- {
- var state = this.graph.getView().getState(this.editingCell);
-
- if (this.codeViewMode && state != null)
- {
- var scale = state.view.scale;
- this.bounds = mxRectangle.fromRectangle(state);
-
- // General placement of code editor if cell has no size
- // LATER: Fix HTML editor bounds for edge labels
- if (this.bounds.width == 0 && this.bounds.height == 0)
- {
- this.bounds.width = 160 * scale;
- this.bounds.height = 60 * scale;
-
- var m = (state.text != null) ? state.text.margin : null;
-
- if (m == null)
- {
- m = mxUtils.getAlignmentAsPoint(mxUtils.getValue(state.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER),
- mxUtils.getValue(state.style, mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE));
- }
-
- this.bounds.x += m.x * this.bounds.width;
- this.bounds.y += m.y * this.bounds.height;
- }
-
- this.textarea.style.width = Math.round((this.bounds.width - 4) / scale) + 'px';
- this.textarea.style.height = Math.round((this.bounds.height - 4) / scale) + 'px';
- this.textarea.style.overflow = 'auto';
-
- // Adds scrollbar offset if visible
- if (this.textarea.clientHeight < this.textarea.offsetHeight)
- {
- this.textarea.style.height = Math.round((this.bounds.height / scale)) + (this.textarea.offsetHeight - this.textarea.clientHeight) + 'px';
- this.bounds.height = parseInt(this.textarea.style.height) * scale;
- }
-
- if (this.textarea.clientWidth < this.textarea.offsetWidth)
- {
- this.textarea.style.width = Math.round((this.bounds.width / scale)) + (this.textarea.offsetWidth - this.textarea.clientWidth) + 'px';
- this.bounds.width = parseInt(this.textarea.style.width) * scale;
- }
-
- this.textarea.style.left = Math.round(this.bounds.x) + 'px';
- this.textarea.style.top = Math.round(this.bounds.y) + 'px';
-
- if (mxClient.IS_VML)
- {
- this.textarea.style.zoom = scale;
- }
- else
- {
- mxUtils.setPrefixedStyle(this.textarea.style, 'transform', 'scale(' + scale + ',' + scale + ')');
- }
- }
- else
- {
- this.textarea.style.height = '';
- this.textarea.style.overflow = '';
- mxCellEditorResize.apply(this, arguments);
- }
- }
- };
-
- mxCellEditorGetInitialValue = mxCellEditor.prototype.getInitialValue;
- mxCellEditor.prototype.getInitialValue = function(state, trigger)
- {
- if (mxUtils.getValue(state.style, 'html', '0') == '0')
- {
- return mxCellEditorGetInitialValue.apply(this, arguments);
- }
- else
- {
- var result = this.graph.getEditingValue(state.cell, trigger)
-
- if (mxUtils.getValue(state.style, 'nl2Br', '1') == '1')
- {
- result = result.replace(/\n/g, '<br/>');
- }
-
- result = this.graph.sanitizeHtml(result, true);
-
- return result;
- }
- };
-
- mxCellEditorGetCurrentValue = mxCellEditor.prototype.getCurrentValue;
- mxCellEditor.prototype.getCurrentValue = function(state)
- {
- if (mxUtils.getValue(state.style, 'html', '0') == '0')
- {
- return mxCellEditorGetCurrentValue.apply(this, arguments);
- }
- else
- {
- var result = this.graph.sanitizeHtml(this.textarea.innerHTML, true);
-
- if (mxUtils.getValue(state.style, 'nl2Br', '1') == '1')
- {
- result = result.replace(/\r\n/g, '<br/>').replace(/\n/g, '<br/>');
- }
- else
- {
- result = result.replace(/\r\n/g, '').replace(/\n/g, '');
- }
-
- return result;
- }
- };
-
- var mxCellEditorStopEditing = mxCellEditor.prototype.stopEditing;
- mxCellEditor.prototype.stopEditing = function(cancel)
- {
- // Restores default view mode before applying value
- if (this.codeViewMode)
- {
- this.toggleViewMode();
- }
-
- mxCellEditorStopEditing.apply(this, arguments);
-
- // Tries to move focus back to container after editing if possible
- this.focusContainer();
- };
-
- mxCellEditor.prototype.focusContainer = function()
- {
- try
- {
- this.graph.container.focus();
- }
- catch (e)
- {
- // ignore
- }
- };
-
- var mxCellEditorApplyValue = mxCellEditor.prototype.applyValue;
- mxCellEditor.prototype.applyValue = function(state, value)
- {
- // Removes empty relative child labels in edges
- this.graph.getModel().beginUpdate();
-
- try
- {
- mxCellEditorApplyValue.apply(this, arguments);
-
- if (value == '' && this.graph.isCellDeletable(state.cell) &&
- this.graph.model.getChildCount(state.cell) == 0 &&
- this.graph.isTransparentState(state))
- {
- this.graph.removeCells([state.cell], false);
- }
- }
- finally
- {
- this.graph.getModel().endUpdate();
- }
- };
-
- /**
- * Returns the background color to be used for the editing box. This returns
- * the label background for edge labels and null for all other cases.
- */
- mxCellEditor.prototype.getBackgroundColor = function(state)
- {
- var color = mxUtils.getValue(state.style, mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, null);
-
- if ((color == null || color == mxConstants.NONE) &&
- (state.cell.geometry != null && state.cell.geometry.width > 0) &&
- (mxUtils.getValue(state.style, mxConstants.STYLE_ROTATION, 0) != 0 ||
- mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, 1) == 0))
- {
- color = mxUtils.getValue(state.style, mxConstants.STYLE_FILLCOLOR, null);
- }
-
- if (color == mxConstants.NONE)
- {
- color = null;
- }
-
- return color;
- };
-
- mxCellEditor.prototype.getMinimumSize = function(state)
- {
- var scale = this.graph.getView().scale;
-
- return new mxRectangle(0, 0, (state.text == null) ? 30 : state.text.size * scale + 20, 30);
- };
-
- /**
- * Hold Alt to ignore drop target.
- */
- mxGraphHandlerIsValidDropTarget = mxGraphHandler.prototype.isValidDropTarget;
- mxGraphHandler.prototype.isValidDropTarget = function(target, me)
- {
- return mxGraphHandlerIsValidDropTarget.apply(this, arguments) &&
- !mxEvent.isAltDown(me.getEvent);
- };
-
- /**
- * Hints on handlers
- */
- function createHint()
- {
- var hint = document.createElement('div');
- hint.className = 'geHint';
- hint.style.whiteSpace = 'nowrap';
- hint.style.position = 'absolute';
-
- return hint;
- };
-
- /**
- * Format pixels in the given unit
- */
- function formatHintText(pixels, unit)
- {
- switch(unit)
- {
- case mxConstants.POINTS:
- return pixels;
- case mxConstants.MILLIMETERS:
- return (pixels / mxConstants.PIXELS_PER_MM).toFixed(1);
- case mxConstants.INCHES:
- return (pixels / mxConstants.PIXELS_PER_INCH).toFixed(2);
- }
- };
-
-
- mxGraphView.prototype.formatUnitText = function(pixels)
- {
- return pixels? formatHintText(pixels, this.unit) : pixels;
- };
-
- /**
- * Updates the hint for the current operation.
- */
- mxGraphHandler.prototype.updateHint = function(me)
- {
- if (this.pBounds != null && (this.shape != null || this.livePreviewActive))
- {
- if (this.hint == null)
- {
- this.hint = createHint();
- this.graph.container.appendChild(this.hint);
- }
-
- var t = this.graph.view.translate;
- var s = this.graph.view.scale;
- var x = this.roundLength((this.bounds.x + this.currentDx) / s - t.x);
- var y = this.roundLength((this.bounds.y + this.currentDy) / s - t.y);
- var unit = this.graph.view.unit;
-
- this.hint.innerHTML = formatHintText(x, unit) + ', ' + formatHintText(y, unit);
-
- this.hint.style.left = (this.pBounds.x + this.currentDx +
- Math.round((this.pBounds.width - this.hint.clientWidth) / 2)) + 'px';
- this.hint.style.top = (this.pBounds.y + this.currentDy +
- this.pBounds.height + Editor.hintOffset) + 'px';
- }
- };
-
- /**
- * Updates the hint for the current operation.
- */
- mxGraphHandler.prototype.removeHint = function()
- {
- if (this.hint != null)
- {
- this.hint.parentNode.removeChild(this.hint);
- this.hint = null;
- }
- };
-
- /**
- * Overridden to allow for shrinking pools when lanes are resized.
- */
- var stackLayoutResizeCell = mxStackLayout.prototype.resizeCell;
- mxStackLayout.prototype.resizeCell = function(cell, bounds)
- {
- stackLayoutResizeCell.apply(this, arguments);
- var style = this.graph.getCellStyle(cell);
-
- if (style['childLayout'] == null)
- {
- var parent = this.graph.model.getParent(cell);
- var geo = (parent != null) ? this.graph.getCellGeometry(parent) : null;
-
- if (geo != null)
- {
- style = this.graph.getCellStyle(parent);
-
- if (style['childLayout'] == 'stackLayout')
- {
- var border = parseFloat(mxUtils.getValue(style, 'stackBorder', mxStackLayout.prototype.border));
- var horizontal = mxUtils.getValue(style, 'horizontalStack', '1') == '1';
- var start = this.graph.getActualStartSize(parent);
- geo = geo.clone();
-
- if (horizontal)
- {
- geo.height = bounds.height + start.y + start.height + 2 * border;
- }
- else
- {
- geo.width = bounds.width + start.x + start.width + 2 * border;
- }
-
- this.graph.model.setGeometry(parent, geo);
- }
- }
- }
- };
-
- /**
- * Shows handle for table instead of rows and cells.
- */
- var selectionCellsHandlerGetHandledSelectionCells = mxSelectionCellsHandler.prototype.getHandledSelectionCells;
- mxSelectionCellsHandler.prototype.getHandledSelectionCells = function()
- {
- var cells = selectionCellsHandlerGetHandledSelectionCells.apply(this, arguments);
- var dict = new mxDictionary();
- var model = this.graph.model;
- var result = [];
-
- function addCell(cell)
- {
- if (!dict.get(cell))
- {
- dict.put(cell, true);
- result.push(cell);
- }
- };
-
- for (var i = 0; i < cells.length; i++)
- {
- var cell = cells[i];
-
- if (this.graph.isTableCell(cell))
- {
- addCell(model.getParent(model.getParent(cell)));
- }
- else if (this.graph.isTableRow(cell))
- {
- addCell(model.getParent(cell));
- }
-
- addCell(cell);
- }
-
- return result;
- };
-
- /**
- * Creates the shape used to draw the selection border.
- */
- var vertexHandlerCreateParentHighlightShape = mxVertexHandler.prototype.createParentHighlightShape;
- mxVertexHandler.prototype.createParentHighlightShape = function(bounds)
- {
- var shape = vertexHandlerCreateParentHighlightShape.apply(this, arguments);
-
- shape.stroke = '#C0C0C0';
- shape.strokewidth = 1;
-
- return shape;
- };
-
- /**
- * Creates the shape used to draw the selection border.
- */
- var edgeHandlerCreateParentHighlightShape = mxEdgeHandler.prototype.createParentHighlightShape;
- mxEdgeHandler.prototype.createParentHighlightShape = function(bounds)
- {
- var shape = edgeHandlerCreateParentHighlightShape.apply(this, arguments);
-
- shape.stroke = '#C0C0C0';
- shape.strokewidth = 1;
-
- return shape;
- };
-
- /**
- * Moves rotation handle to top, right corner.
- */
- mxVertexHandler.prototype.rotationHandleVSpacing = -12;
- mxVertexHandler.prototype.getRotationHandlePosition = function()
- {
- var padding = this.getHandlePadding();
-
- return new mxPoint(this.bounds.x + this.bounds.width - this.rotationHandleVSpacing + padding.x / 2,
- this.bounds.y + this.rotationHandleVSpacing - padding.y / 2)
- };
-
- /**
- * Enables recursive resize for groups.
- */
- mxVertexHandler.prototype.isRecursiveResize = function(state, me)
- {
- return this.graph.isRecursiveVertexResize(state) &&
- !mxEvent.isControlDown(me.getEvent());
- };
-
- /**
- * Enables centered resize events.
- */
- mxVertexHandler.prototype.isCenteredEvent = function(state, me)
- {
- return (!(!this.graph.isSwimlane(state.cell) && this.graph.model.getChildCount(state.cell) > 0 &&
- !this.graph.isCellCollapsed(state.cell) &&
- mxUtils.getValue(state.style, 'recursiveResize', '1') == '1' &&
- mxUtils.getValue(state.style, 'childLayout', null) == null) &&
- mxEvent.isControlDown(me.getEvent())) ||
- mxEvent.isMetaDown(me.getEvent());
- };
-
- /**
- * Hides rotation handle for table cells and rows.
- */
- var vertexHandlerIsRotationHandleVisible = mxVertexHandler.prototype.isRotationHandleVisible;
- mxVertexHandler.prototype.isRotationHandleVisible = function()
- {
- return vertexHandlerIsRotationHandleVisible.apply(this, arguments) &&
- !this.graph.isTableCell(this.state.cell) &&
- !this.graph.isTableRow(this.state.cell) &&
- !this.graph.isTable(this.state.cell);
- };
-
- /**
- * Hides rotation handle for table cells and rows.
- */
- mxVertexHandler.prototype.getSizerBounds = function()
- {
- if (this.graph.isTableCell(this.state.cell))
- {
- return this.graph.view.getState(this.graph.model.getParent(this.graph.model.getParent(this.state.cell)));
- }
- else
- {
- return this.bounds;
- }
- };
-
- /**
- * Hides rotation handle for table cells and rows.
- */
- var vertexHandlerIsParentHighlightVisible = mxVertexHandler.prototype.isParentHighlightVisible;
- mxVertexHandler.prototype.isParentHighlightVisible = function()
- {
- return vertexHandlerIsParentHighlightVisible.apply(this, arguments) &&
- !this.graph.isTableCell(this.state.cell) &&
- !this.graph.isTableRow(this.state.cell);
- };
-
- /**
- * Hides rotation handle for table cells and rows.
- */
- var vertexHandlerIsCustomHandleVisible = mxVertexHandler.prototype.isCustomHandleVisible;
- mxVertexHandler.prototype.isCustomHandleVisible = function(handle)
- {
- return handle.tableHandle ||
- (vertexHandlerIsCustomHandleVisible.apply(this, arguments) &&
- (!this.graph.isTable(this.state.cell) ||
- this.graph.isCellSelected(this.state.cell)));
- };
-
- /**
- * Adds selection border inset for table cells and rows.
- */
- mxVertexHandler.prototype.getSelectionBorderInset = function()
- {
- var result = 0;
-
- if (this.graph.isTableRow(this.state.cell))
- {
- result = 1;
- }
- else if (this.graph.isTableCell(this.state.cell))
- {
- result = 2;
- }
-
- return result;
- };
-
- /**
- * Adds custom handles for table cells.
- */
- var vertexHandlerGetSelectionBorderBounds = mxVertexHandler.prototype.getSelectionBorderBounds;
- mxVertexHandler.prototype.getSelectionBorderBounds = function()
- {
- return vertexHandlerGetSelectionBorderBounds.apply(this, arguments).grow(
- -this.getSelectionBorderInset());
- };
-
- /**
- * Adds custom handles for table cells.
- */
- var vertexHandlerCreateCustomHandles = mxVertexHandler.prototype.createCustomHandles;
- mxVertexHandler.prototype.createCustomHandles = function()
- {
- var handles = vertexHandlerCreateCustomHandles.apply(this, arguments);
-
- if (this.graph.isTable(this.state.cell))
- {
- var graph = this.graph;
- var model = graph.model;
- var tableState = this.state;
- var sel = this.selectionBorder;
- var self = this;
-
- if (handles == null)
- {
- handles = [];
- }
-
- // Adds handles for rows and columns
- var rows = graph.view.getCellStates(model.getChildCells(this.state.cell, true));
-
- if (rows.length > 0)
- {
- var cols = graph.view.getCellStates(model.getChildCells(rows[0].cell, true));
-
- // Adds column width handles
- for (var i = 0; i < cols.length; i++)
- {
- (mxUtils.bind(this, function(index)
- {
- var colState = cols[index];
- var nextCol = (index < cols.length - 1) ? cols[index + 1] : null;
-
- var shape = new mxLine(new mxRectangle(), mxConstants.NONE, 1, true);
- shape.isDashed = sel.isDashed;
-
- // Workaround for event handling on overlapping cells with tolerance
- shape.svgStrokeTolerance++;
-
- var handle = new mxHandle(colState, 'col-resize', null, shape);
- handle.tableHandle = true;
- var dx = 0;
-
- handle.shape.node.parentNode.insertBefore(handle.shape.node,
- handle.shape.node.parentNode.firstChild);
-
- handle.redraw = function()
- {
- if (this.shape != null && this.state.shape != null)
- {
- var start = graph.getActualStartSize(tableState.cell);
- this.shape.stroke = (dx == 0) ? mxConstants.NONE : sel.stroke;
- this.shape.bounds.x = this.state.x + this.state.width +
- dx * this.graph.view.scale;
- this.shape.bounds.width = 1;
- this.shape.bounds.y = tableState.y + ((index == cols.length - 1) ?
- 0 : start.y * this.graph.view.scale);
- this.shape.bounds.height = tableState.height -
- ((index == cols.length - 1) ? 0 :
- (start.height + start.y) * this.graph.view.scale);
- this.shape.redraw();
- }
- };
-
- var shiftPressed = false;
-
- handle.setPosition = function(bounds, pt, me)
- {
- dx = Math.max(Graph.minTableColumnWidth - bounds.width,
- pt.x - bounds.x - bounds.width);
- shiftPressed = mxEvent.isShiftDown(me.getEvent());
-
- if (nextCol != null && !shiftPressed)
- {
- dx = Math.min((nextCol.x + nextCol.width - colState.x -
- colState.width) / graph.view.scale -
- Graph.minTableColumnWidth, dx);
- }
- };
-
- handle.execute = function(me)
- {
- if (dx != 0)
- {
- graph.setTableColumnWidth(this.state.cell,
- dx, shiftPressed);
- }
- else if (!self.blockDelayedSelection)
- {
- var temp = graph.getCellAt(me.getGraphX(), me.getGraphY()) || tableState.cell;
- graph.graphHandler.selectCellForEvent(temp, me);
- }
-
- dx = 0;
- };
-
- handle.reset = function()
- {
- dx = 0;
- };
-
- handles.push(handle);
- }))(i);
- }
-
- // Adds row height handles
- for (var i = 0; i < rows.length; i++)
- {
- (mxUtils.bind(this, function(index)
- {
- var rowState = rows[index];
-
- var shape = new mxLine(new mxRectangle(), mxConstants.NONE, 1);
- shape.isDashed = sel.isDashed;
- shape.svgStrokeTolerance++;
-
- var handle = new mxHandle(rowState, 'row-resize', null, shape);
- handle.tableHandle = true;
- var dy = 0;
-
- handle.shape.node.parentNode.insertBefore(handle.shape.node,
- handle.shape.node.parentNode.firstChild);
-
- handle.redraw = function()
- {
- if (this.shape != null && this.state.shape != null)
- {
- this.shape.stroke = (dy == 0) ? mxConstants.NONE : sel.stroke;
- this.shape.bounds.x = this.state.x;
- this.shape.bounds.width = this.state.width;
- this.shape.bounds.y = this.state.y + this.state.height +
- dy * this.graph.view.scale;
- this.shape.bounds.height = 1;
- this.shape.redraw();
- }
- };
-
- handle.setPosition = function(bounds, pt, me)
- {
- dy = Math.max(Graph.minTableRowHeight - bounds.height,
- pt.y - bounds.y - bounds.height);
- };
-
- handle.execute = function(me)
- {
- if (dy != 0)
- {
- graph.setTableRowHeight(this.state.cell, dy,
- !mxEvent.isShiftDown(me.getEvent()));
- }
- else if (!self.blockDelayedSelection)
- {
- var temp = graph.getCellAt(me.getGraphX(), me.getGraphY()) || tableState.cell;
- graph.graphHandler.selectCellForEvent(temp, me);
- }
-
- dy = 0;
- };
-
- handle.reset = function()
- {
- dy = 0;
- };
-
- handles.push(handle);
- }))(i);
- }
- }
- }
-
- // Reserve gives point handles precedence over line handles
- return (handles != null) ? handles.reverse() : null;
- };
-
- var vertexHandlerSetHandlesVisible = mxVertexHandler.prototype.setHandlesVisible;
-
- mxVertexHandler.prototype.setHandlesVisible = function(visible)
- {
- vertexHandlerSetHandlesVisible.apply(this, arguments);
-
- if (this.moveHandles != null)
- {
- for (var i = 0; i < this.moveHandles.length; i++)
- {
- this.moveHandles[i].style.visibility = (visible) ? '' : 'hidden';
- }
- }
-
- if (this.cornerHandles != null)
- {
- for (var i = 0; i < this.cornerHandles.length; i++)
- {
- this.cornerHandles[i].node.style.visibility = (visible) ? '' : 'hidden';
- }
- }
- };
-
- /**
- * Creates or updates special handles for moving rows.
- */
- mxVertexHandler.prototype.refreshMoveHandles = function()
- {
- var graph = this.graph;
- var model = graph.model;
-
- // Destroys existing handles
- if (this.moveHandles != null)
- {
- for (var i = 0; i < this.moveHandles.length; i++)
- {
- this.moveHandles[i].parentNode.removeChild(this.moveHandles[i]);
- }
-
- this.moveHandles = null;
- }
-
- // Creates new handles
- this.moveHandles = [];
-
- for (var i = 0; i < model.getChildCount(this.state.cell); i++)
- {
- (mxUtils.bind(this, function(rowState)
- {
- if (rowState != null && model.isVertex(rowState.cell))
- {
- // Adds handle to move row
- // LATER: Move to overlay pane to hide during zoom but keep padding
- var moveHandle = mxUtils.createImage(Editor.rowMoveImage);
- moveHandle.style.position = 'absolute';
- moveHandle.style.cursor = 'pointer';
- moveHandle.style.width = '7px';
- moveHandle.style.height = '4px';
- moveHandle.style.padding = '4px 2px 4px 2px';
- moveHandle.rowState = rowState;
-
- mxEvent.addGestureListeners(moveHandle, mxUtils.bind(this, function(evt)
- {
- this.graph.popupMenuHandler.hideMenu();
- this.graph.stopEditing(false);
-
- if (this.graph.isToggleEvent(evt) ||
- !this.graph.isCellSelected(rowState.cell))
- {
- this.graph.selectCellForEvent(rowState.cell, evt);
- }
-
- if (!mxEvent.isPopupTrigger(evt))
- {
- this.graph.graphHandler.start(this.state.cell,
- mxEvent.getClientX(evt), mxEvent.getClientY(evt),
- this.graph.getSelectionCells());
- this.graph.graphHandler.cellWasClicked = true;
- this.graph.isMouseTrigger = mxEvent.isMouseEvent(evt);
- this.graph.isMouseDown = true;
- }
-
- mxEvent.consume(evt);
- }), null, mxUtils.bind(this, function(evt)
- {
- if (mxEvent.isPopupTrigger(evt))
- {
- this.graph.popupMenuHandler.popup(mxEvent.getClientX(evt),
- mxEvent.getClientY(evt), rowState.cell, evt);
- mxEvent.consume(evt);
- }
- }));
-
- this.moveHandles.push(moveHandle);
- this.graph.container.appendChild(moveHandle);
-
- }
- }))(this.graph.view.getState(model.getChildAt(this.state.cell, i)));
- }
- };
-
- /**
- * Adds handle padding for editing cells and exceptions.
- */
- mxVertexHandler.prototype.refresh = function()
- {
- if (this.customHandles != null)
- {
- for (var i = 0; i < this.customHandles.length; i++)
- {
- this.customHandles[i].destroy();
- }
-
- this.customHandles = this.createCustomHandles();
- }
-
- if (this.graph.isTable(this.state.cell))
- {
- this.refreshMoveHandles();
- }
- };
-
- /**
- * Adds handle padding for editing cells and exceptions.
- */
- var vertexHandlerGetHandlePadding = mxVertexHandler.prototype.getHandlePadding;
- mxVertexHandler.prototype.getHandlePadding = function()
- {
- var result = new mxPoint(0, 0);
- var tol = this.tolerance;
- var name = this.state.style['shape'];
-
- if (mxCellRenderer.defaultShapes[name] == null &&
- mxStencilRegistry.getStencil(name) == null)
- {
- name = mxConstants.SHAPE_RECTANGLE;
- }
-
- // Checks if custom handles are overlapping with the shape border
- var handlePadding = this.graph.isTable(this.state.cell) ||
- this.graph.cellEditor.getEditingCell() == this.state.cell;
-
- if (!handlePadding)
- {
- if (this.customHandles != null)
- {
- for (var i = 0; i < this.customHandles.length; i++)
- {
- if (this.customHandles[i].shape != null &&
- this.customHandles[i].shape.bounds != null)
- {
- var b = this.customHandles[i].shape.bounds;
- var px = b.getCenterX();
- var py = b.getCenterY();
-
- if ((Math.abs(this.state.x - px) < b.width / 2) ||
- (Math.abs(this.state.y - py) < b.height / 2) ||
- (Math.abs(this.state.x + this.state.width - px) < b.width / 2) ||
- (Math.abs(this.state.y + this.state.height - py) < b.height / 2))
- {
- handlePadding = true;
- break;
- }
- }
- }
- }
- }
-
- if (handlePadding && this.sizers != null &&
- this.sizers.length > 0 && this.sizers[0] != null)
- {
- tol /= 2;
-
- // Makes room for row move handle
- if (this.graph.isTable(this.state.cell))
- {
- tol += 7;
- }
-
- result.x = this.sizers[0].bounds.width + tol;
- result.y = this.sizers[0].bounds.height + tol;
- }
- else
- {
- result = vertexHandlerGetHandlePadding.apply(this, arguments);
- }
-
- return result;
- };
-
- /**
- * Updates the hint for the current operation.
- */
- mxVertexHandler.prototype.updateHint = function(me)
- {
- if (this.index != mxEvent.LABEL_HANDLE)
- {
- if (this.hint == null)
- {
- this.hint = createHint();
- this.state.view.graph.container.appendChild(this.hint);
- }
-
- if (this.index == mxEvent.ROTATION_HANDLE)
- {
- this.hint.innerHTML = this.currentAlpha + '&deg;';
- }
- else
- {
- var s = this.state.view.scale;
- var unit = this.state.view.unit;
- this.hint.innerHTML = formatHintText(this.roundLength(this.bounds.width / s), unit) + ' x ' +
- formatHintText(this.roundLength(this.bounds.height / s), unit);
- }
-
- var rot = (this.currentAlpha != null) ? this.currentAlpha : this.state.style[mxConstants.STYLE_ROTATION] || '0';
- var bb = mxUtils.getBoundingBox(this.bounds, rot);
-
- if (bb == null)
- {
- bb = this.bounds;
- }
-
- this.hint.style.left = bb.x + Math.round((bb.width - this.hint.clientWidth) / 2) + 'px';
- this.hint.style.top = (bb.y + bb.height + Editor.hintOffset) + 'px';
-
- if (this.linkHint != null)
- {
- this.linkHint.style.display = 'none';
- }
- }
- };
-
- /**
- * Updates the hint for the current operation.
- */
- mxVertexHandler.prototype.removeHint = function()
- {
- mxGraphHandler.prototype.removeHint.apply(this, arguments);
-
- if (this.linkHint != null)
- {
- this.linkHint.style.display = '';
- }
- };
-
- /**
- * Hides link hint while moving cells.
- */
- var edgeHandlerMouseMove = mxEdgeHandler.prototype.mouseMove;
-
- mxEdgeHandler.prototype.mouseMove = function(sender, me)
- {
- edgeHandlerMouseMove.apply(this, arguments);
-
- if (this.linkHint != null && this.linkHint.style.display != 'none' &&
- this.graph.graphHandler != null && this.graph.graphHandler.first != null)
- {
- this.linkHint.style.display = 'none';
- }
- }
-
- /**
- * Hides link hint while moving cells.
- */
- var edgeHandlerMouseUp = mxEdgeHandler.prototype.mouseUp;
-
- mxEdgeHandler.prototype.mouseUp = function(sender, me)
- {
- edgeHandlerMouseUp.apply(this, arguments);
-
- if (this.linkHint != null && this.linkHint.style.display == 'none')
- {
- this.linkHint.style.display = '';
- }
- }
-
- /**
- * Updates the hint for the current operation.
- */
- mxEdgeHandler.prototype.updateHint = function(me, point)
- {
- if (this.hint == null)
- {
- this.hint = createHint();
- this.state.view.graph.container.appendChild(this.hint);
- }
-
- var t = this.graph.view.translate;
- var s = this.graph.view.scale;
- var x = this.roundLength(point.x / s - t.x);
- var y = this.roundLength(point.y / s - t.y);
- var unit = this.graph.view.unit;
-
- this.hint.innerHTML = formatHintText(x, unit) + ', ' + formatHintText(y, unit);
- this.hint.style.visibility = 'visible';
-
- if (this.isSource || this.isTarget)
- {
- if (this.constraintHandler.currentConstraint != null &&
- this.constraintHandler.currentFocus != null)
- {
- var pt = this.constraintHandler.currentConstraint.point;
- this.hint.innerHTML = '[' + Math.round(pt.x * 100) + '%, '+ Math.round(pt.y * 100) + '%]';
- }
- else if (this.marker.hasValidState())
- {
- this.hint.style.visibility = 'hidden';
- }
- }
-
- this.hint.style.left = Math.round(me.getGraphX() - this.hint.clientWidth / 2) + 'px';
- this.hint.style.top = (Math.max(me.getGraphY(), point.y) + Editor.hintOffset) + 'px';
-
- if (this.linkHint != null)
- {
- this.linkHint.style.display = 'none';
- }
- };
-
- /**
- * Updates the hint for the current operation.
- */
- mxEdgeHandler.prototype.removeHint = mxVertexHandler.prototype.removeHint;
-
- /**
- * Defines the handles for the UI. Uses data-URIs to speed-up loading time where supported.
- */
- // TODO: Increase handle padding
- HoverIcons.prototype.mainHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-main.png', 17, 17) :
- Graph.createSvgImage(18, 18, '<circle cx="9" cy="9" r="5" stroke="#fff" fill="' + HoverIcons.prototype.arrowFill + '" stroke-width="1"/>');
- HoverIcons.prototype.secondaryHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-secondary.png', 17, 17) :
- Graph.createSvgImage(16, 16, '<path d="m 8 3 L 13 8 L 8 13 L 3 8 z" stroke="#fff" fill="#fca000"/>');
- HoverIcons.prototype.fixedHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-fixed.png', 17, 17) :
- Graph.createSvgImage(18, 18, '<circle cx="9" cy="9" r="5" stroke="#fff" fill="' + HoverIcons.prototype.arrowFill + '" stroke-width="1"/><path d="m 7 7 L 11 11 M 7 11 L 11 7" stroke="#fff"/>');
- HoverIcons.prototype.terminalHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-terminal.png', 17, 17) :
- Graph.createSvgImage(18, 18, '<circle cx="9" cy="9" r="5" stroke="#fff" fill="' + HoverIcons.prototype.arrowFill + '" stroke-width="1"/><circle cx="9" cy="9" r="2" stroke="#fff" fill="transparent"/>');
- HoverIcons.prototype.rotationHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-rotate.png', 16, 16) :
- Graph.createSvgImage(16, 16, '<path stroke="' + HoverIcons.prototype.arrowFill +
- '" fill="' + HoverIcons.prototype.arrowFill +
- '" d="M15.55 5.55L11 1v3.07C7.06 4.56 4 7.92 4 12s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91V10l4.55-4.45zM19.93 11c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zM13 17.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42l1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z"/>',
- 24, 24);
-
- if (mxClient.IS_SVG)
- {
- mxConstraintHandler.prototype.pointImage = Graph.createSvgImage(5, 5, '<path d="m 0 0 L 5 5 M 0 5 L 5 0" stroke="' + HoverIcons.prototype.arrowFill + '"/>');
- }
-
- mxVertexHandler.TABLE_HANDLE_COLOR = '#fca000';
- mxVertexHandler.prototype.handleImage = HoverIcons.prototype.mainHandle;
- mxVertexHandler.prototype.secondaryHandleImage = HoverIcons.prototype.secondaryHandle;
- mxEdgeHandler.prototype.handleImage = HoverIcons.prototype.mainHandle;
- mxEdgeHandler.prototype.terminalHandleImage = HoverIcons.prototype.terminalHandle;
- mxEdgeHandler.prototype.fixedHandleImage = HoverIcons.prototype.fixedHandle;
- mxEdgeHandler.prototype.labelHandleImage = HoverIcons.prototype.secondaryHandle;
- mxOutline.prototype.sizerImage = HoverIcons.prototype.mainHandle;
-
- if (window.Sidebar != null)
- {
- Sidebar.prototype.triangleUp = HoverIcons.prototype.triangleUp;
- Sidebar.prototype.triangleRight = HoverIcons.prototype.triangleRight;
- Sidebar.prototype.triangleDown = HoverIcons.prototype.triangleDown;
- Sidebar.prototype.triangleLeft = HoverIcons.prototype.triangleLeft;
- Sidebar.prototype.refreshTarget = HoverIcons.prototype.refreshTarget;
- Sidebar.prototype.roundDrop = HoverIcons.prototype.roundDrop;
- }
-
- // Pre-fetches images (only needed for non data-uris)
- if (!mxClient.IS_SVG)
- {
- new Image().src = HoverIcons.prototype.mainHandle.src;
- new Image().src = HoverIcons.prototype.fixedHandle.src;
- new Image().src = HoverIcons.prototype.terminalHandle.src;
- new Image().src = HoverIcons.prototype.secondaryHandle.src;
- new Image().src = HoverIcons.prototype.rotationHandle.src;
-
- new Image().src = HoverIcons.prototype.triangleUp.src;
- new Image().src = HoverIcons.prototype.triangleRight.src;
- new Image().src = HoverIcons.prototype.triangleDown.src;
- new Image().src = HoverIcons.prototype.triangleLeft.src;
- new Image().src = HoverIcons.prototype.refreshTarget.src;
- new Image().src = HoverIcons.prototype.roundDrop.src;
- }
-
- // Adds rotation handle and live preview
- mxVertexHandler.prototype.rotationEnabled = true;
- mxVertexHandler.prototype.manageSizers = true;
- mxVertexHandler.prototype.livePreview = true;
- mxGraphHandler.prototype.maxLivePreview = 16;
-
- // Increases default rubberband opacity (default is 20)
- mxRubberband.prototype.defaultOpacity = 30;
-
- // Enables connections along the outline, virtual waypoints, parent highlight etc
- mxConnectionHandler.prototype.outlineConnect = true;
- mxCellHighlight.prototype.keepOnTop = true;
- mxVertexHandler.prototype.parentHighlightEnabled = true;
-
- mxEdgeHandler.prototype.parentHighlightEnabled = true;
- mxEdgeHandler.prototype.dblClickRemoveEnabled = true;
- mxEdgeHandler.prototype.straightRemoveEnabled = true;
- mxEdgeHandler.prototype.virtualBendsEnabled = true;
- mxEdgeHandler.prototype.mergeRemoveEnabled = true;
- mxEdgeHandler.prototype.manageLabelHandle = true;
- mxEdgeHandler.prototype.outlineConnect = true;
-
- // Disables adding waypoints if shift is pressed
- mxEdgeHandler.prototype.isAddVirtualBendEvent = function(me)
- {
- return !mxEvent.isShiftDown(me.getEvent());
- };
-
- // Disables custom handles if shift is pressed
- mxEdgeHandler.prototype.isCustomHandleEvent = function(me)
- {
- return !mxEvent.isShiftDown(me.getEvent());
- };
-
- /**
- * Implements touch style
- */
- if (Graph.touchStyle)
- {
- // Larger tolerance for real touch devices
- if (mxClient.IS_TOUCH || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0)
- {
- mxShape.prototype.svgStrokeTolerance = 18;
- mxVertexHandler.prototype.tolerance = 12;
- mxEdgeHandler.prototype.tolerance = 12;
- Graph.prototype.tolerance = 12;
-
- mxVertexHandler.prototype.rotationHandleVSpacing = -16;
-
- // Implements a smaller tolerance for mouse events and a larger tolerance for touch
- // events on touch devices. The default tolerance (4px) is used for mouse events.
- mxConstraintHandler.prototype.getTolerance = function(me)
- {
- return (mxEvent.isMouseEvent(me.getEvent())) ? 4 : this.graph.getTolerance();
- };
- }
-
- // One finger pans (no rubberband selection) must start regardless of mouse button
- mxPanningHandler.prototype.isPanningTrigger = function(me)
- {
- var evt = me.getEvent();
-
- return (me.getState() == null && !mxEvent.isMouseEvent(evt)) ||
- (mxEvent.isPopupTrigger(evt) && (me.getState() == null ||
- mxEvent.isControlDown(evt) || mxEvent.isShiftDown(evt)));
- };
-
- // Don't clear selection if multiple cells selected
- var graphHandlerMouseDown = mxGraphHandler.prototype.mouseDown;
- mxGraphHandler.prototype.mouseDown = function(sender, me)
- {
- graphHandlerMouseDown.apply(this, arguments);
-
- if (mxEvent.isTouchEvent(me.getEvent()) && this.graph.isCellSelected(me.getCell()) &&
- this.graph.getSelectionCount() > 1)
- {
- this.delayedSelection = false;
- }
- };
- }
- else
- {
- // Removes ctrl+shift as panning trigger for space splitting
- mxPanningHandler.prototype.isPanningTrigger = function(me)
- {
- var evt = me.getEvent();
-
- return (mxEvent.isLeftMouseButton(evt) && ((this.useLeftButtonForPanning &&
- me.getState() == null) || (mxEvent.isControlDown(evt) &&
- !mxEvent.isShiftDown(evt)))) || (this.usePopupTrigger &&
- mxEvent.isPopupTrigger(evt));
- };
- }
-
- // Overrides/extends rubberband for space handling with Ctrl+Shift(+Alt) drag ("scissors tool")
- mxRubberband.prototype.isSpaceEvent = function(me)
- {
- return this.graph.isEnabled() && !this.graph.isCellLocked(this.graph.getDefaultParent()) &&
- mxEvent.isControlDown(me.getEvent()) && mxEvent.isShiftDown(me.getEvent());
- };
-
- // Cancelled state
- mxRubberband.prototype.cancelled = false;
-
- // Cancels ongoing rubberband selection but consumed event to avoid reset of selection
- mxRubberband.prototype.cancel = function()
- {
- if (this.isActive())
- {
- this.cancelled = true;
- this.reset();
- }
- };
-
- // Handles moving of cells in both half panes
- mxRubberband.prototype.mouseUp = function(sender, me)
- {
- if (this.cancelled)
- {
- this.cancelled = false;
- me.consume();
- }
- else
- {
- var execute = this.div != null && this.div.style.display != 'none';
-
- var x0 = null;
- var y0 = null;
- var dx = null;
- var dy = null;
-
- if (this.first != null && this.currentX != null && this.currentY != null)
- {
- x0 = this.first.x;
- y0 = this.first.y;
- dx = (this.currentX - x0) / this.graph.view.scale;
- dy = (this.currentY - y0) / this.graph.view.scale;
-
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- dx = this.graph.snap(dx);
- dy = this.graph.snap(dy);
-
- if (!this.graph.isGridEnabled())
- {
- if (Math.abs(dx) < this.graph.tolerance)
- {
- dx = 0;
- }
-
- if (Math.abs(dy) < this.graph.tolerance)
- {
- dy = 0;
- }
- }
- }
- }
-
- this.reset();
-
- if (execute)
- {
- if (mxEvent.isAltDown(me.getEvent()) && this.graph.isToggleEvent(me.getEvent()))
- {
- var rect = new mxRectangle(this.x, this.y, this.width, this.height);
- var cells = this.graph.getCells(rect.x, rect.y, rect.width, rect.height);
-
- this.graph.removeSelectionCells(cells);
- }
- else if (this.isSpaceEvent(me))
- {
- this.graph.model.beginUpdate();
- try
- {
- var cells = this.graph.getCellsBeyond(x0, y0, this.graph.getDefaultParent(), true, true);
-
- for (var i = 0; i < cells.length; i++)
- {
- if (this.graph.isCellMovable(cells[i]))
- {
- var tmp = this.graph.view.getState(cells[i]);
- var geo = this.graph.getCellGeometry(cells[i]);
-
- if (tmp != null && geo != null)
- {
- geo = geo.clone();
- geo.translate(dx, dy);
- this.graph.model.setGeometry(cells[i], geo);
- }
- }
- }
- }
- finally
- {
- this.graph.model.endUpdate();
- }
- }
- else
- {
- var rect = new mxRectangle(this.x, this.y, this.width, this.height);
- this.graph.selectRegion(rect, me.getEvent());
- }
-
- me.consume();
- }
- }
- };
-
- // Handles preview for creating/removing space in diagram
- mxRubberband.prototype.mouseMove = function(sender, me)
- {
- if (!me.isConsumed() && this.first != null)
- {
- var origin = mxUtils.getScrollOrigin(this.graph.container);
- var offset = mxUtils.getOffset(this.graph.container);
- origin.x -= offset.x;
- origin.y -= offset.y;
- var x = me.getX() + origin.x;
- var y = me.getY() + origin.y;
- var dx = this.first.x - x;
- var dy = this.first.y - y;
- var tol = this.graph.tolerance;
-
- if (this.div != null || Math.abs(dx) > tol || Math.abs(dy) > tol)
- {
- if (this.div == null)
- {
- this.div = this.createShape();
- }
-
- // Clears selection while rubberbanding. This is required because
- // the event is not consumed in mouseDown.
- mxUtils.clearSelection();
- this.update(x, y);
-
- if (this.isSpaceEvent(me))
- {
- var right = this.x + this.width;
- var bottom = this.y + this.height;
- var scale = this.graph.view.scale;
-
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- this.width = this.graph.snap(this.width / scale) * scale;
- this.height = this.graph.snap(this.height / scale) * scale;
-
- if (!this.graph.isGridEnabled())
- {
- if (this.width < this.graph.tolerance)
- {
- this.width = 0;
- }
-
- if (this.height < this.graph.tolerance)
- {
- this.height = 0;
- }
- }
-
- if (this.x < this.first.x)
- {
- this.x = right - this.width;
- }
-
- if (this.y < this.first.y)
- {
- this.y = bottom - this.height;
- }
- }
-
- this.div.style.borderStyle = 'dashed';
- this.div.style.backgroundColor = 'white';
- this.div.style.left = this.x + 'px';
- this.div.style.top = this.y + 'px';
- this.div.style.width = Math.max(0, this.width) + 'px';
- this.div.style.height = this.graph.container.clientHeight + 'px';
- this.div.style.borderWidth = (this.width <= 0) ? '0px 1px 0px 0px' : '0px 1px 0px 1px';
-
- if (this.secondDiv == null)
- {
- this.secondDiv = this.div.cloneNode(true);
- this.div.parentNode.appendChild(this.secondDiv);
- }
-
- this.secondDiv.style.left = this.x + 'px';
- this.secondDiv.style.top = this.y + 'px';
- this.secondDiv.style.width = this.graph.container.clientWidth + 'px';
- this.secondDiv.style.height = Math.max(0, this.height) + 'px';
- this.secondDiv.style.borderWidth = (this.height <= 0) ? '1px 0px 0px 0px' : '1px 0px 1px 0px';
- }
- else
- {
- // Hides second div and restores style
- this.div.style.backgroundColor = '';
- this.div.style.borderWidth = '';
- this.div.style.borderStyle = '';
-
- if (this.secondDiv != null)
- {
- this.secondDiv.parentNode.removeChild(this.secondDiv);
- this.secondDiv = null;
- }
- }
-
- me.consume();
- }
- }
- };
-
- // Removes preview
- var mxRubberbandReset = mxRubberband.prototype.reset;
- mxRubberband.prototype.reset = function()
- {
- if (this.secondDiv != null)
- {
- this.secondDiv.parentNode.removeChild(this.secondDiv);
- this.secondDiv = null;
- }
-
- mxRubberbandReset.apply(this, arguments);
- };
-
- // Timer-based activation of outline connect in connection handler
- var startTime = new Date().getTime();
- var timeOnTarget = 0;
-
- var mxEdgeHandlerUpdatePreviewState = mxEdgeHandler.prototype.updatePreviewState;
-
- mxEdgeHandler.prototype.updatePreviewState = function(edge, point, terminalState, me)
- {
- mxEdgeHandlerUpdatePreviewState.apply(this, arguments);
-
- if (terminalState != this.currentTerminalState)
- {
- startTime = new Date().getTime();
- timeOnTarget = 0;
- }
- else
- {
- timeOnTarget = new Date().getTime() - startTime;
- }
-
- this.currentTerminalState = terminalState;
- };
-
- // Timer-based outline connect
- var mxEdgeHandlerIsOutlineConnectEvent = mxEdgeHandler.prototype.isOutlineConnectEvent;
-
- mxEdgeHandler.prototype.isOutlineConnectEvent = function(me)
- {
- return (this.currentTerminalState != null && me.getState() == this.currentTerminalState && timeOnTarget > 2000) ||
- ((this.currentTerminalState == null || mxUtils.getValue(this.currentTerminalState.style, 'outlineConnect', '1') != '0') &&
- mxEdgeHandlerIsOutlineConnectEvent.apply(this, arguments));
- };
-
- // Shows secondary handle for fixed connection points
- mxEdgeHandler.prototype.createHandleShape = function(index, virtual)
- {
- var source = index != null && index == 0;
- var terminalState = this.state.getVisibleTerminalState(source);
- var c = (index != null && (index == 0 || index >= this.state.absolutePoints.length - 1 ||
- (this.constructor == mxElbowEdgeHandler && index == 2))) ?
- this.graph.getConnectionConstraint(this.state, terminalState, source) : null;
- var pt = (c != null) ? this.graph.getConnectionPoint(this.state.getVisibleTerminalState(source), c) : null;
- var img = (pt != null) ? this.fixedHandleImage : ((c != null && terminalState != null) ?
- this.terminalHandleImage : this.handleImage);
-
- if (img != null)
- {
- var shape = new mxImageShape(new mxRectangle(0, 0, img.width, img.height), img.src);
-
- // Allows HTML rendering of the images
- shape.preserveImageAspect = false;
-
- return shape;
- }
- else
- {
- var s = mxConstants.HANDLE_SIZE;
-
- if (this.preferHtml)
- {
- s -= 1;
- }
-
- return new mxRectangleShape(new mxRectangle(0, 0, s, s), mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR);
- }
- };
-
- var vertexHandlerCreateSizerShape = mxVertexHandler.prototype.createSizerShape;
- mxVertexHandler.prototype.createSizerShape = function(bounds, index, fillColor)
- {
- this.handleImage = (index == mxEvent.ROTATION_HANDLE) ? HoverIcons.prototype.rotationHandle : (index == mxEvent.LABEL_HANDLE) ? this.secondaryHandleImage : this.handleImage;
-
- return vertexHandlerCreateSizerShape.apply(this, arguments);
- };
-
- // Special case for single edge label handle moving in which case the text bounding box is used
- var mxGraphHandlerGetBoundingBox = mxGraphHandler.prototype.getBoundingBox;
- mxGraphHandler.prototype.getBoundingBox = function(cells)
- {
- if (cells != null && cells.length == 1)
- {
- var model = this.graph.getModel();
- var parent = model.getParent(cells[0]);
- var geo = this.graph.getCellGeometry(cells[0]);
-
- if (model.isEdge(parent) && geo != null && geo.relative)
- {
- var state = this.graph.view.getState(cells[0]);
-
- if (state != null && state.width < 2 && state.height < 2 && state.text != null &&
- state.text.boundingBox != null)
- {
- return mxRectangle.fromRectangle(state.text.boundingBox);
- }
- }
- }
-
- return mxGraphHandlerGetBoundingBox.apply(this, arguments);
- };
-
- // Ignores child cells with part style as guides
- var mxGraphHandlerGetGuideStates = mxGraphHandler.prototype.getGuideStates;
-
- mxGraphHandler.prototype.getGuideStates = function()
- {
- var states = mxGraphHandlerGetGuideStates.apply(this, arguments);
- var result = [];
-
- // NOTE: Could do via isStateIgnored hook
- for (var i = 0; i < states.length; i++)
- {
- if (mxUtils.getValue(states[i].style, 'part', '0') != '1')
- {
- result.push(states[i]);
- }
- }
-
- return result;
- };
-
- // Uses text bounding box for edge labels
- var mxVertexHandlerGetSelectionBounds = mxVertexHandler.prototype.getSelectionBounds;
- mxVertexHandler.prototype.getSelectionBounds = function(state)
- {
- var model = this.graph.getModel();
- var parent = model.getParent(state.cell);
- var geo = this.graph.getCellGeometry(state.cell);
-
- if (model.isEdge(parent) && geo != null && geo.relative && state.width < 2 && state.height < 2 && state.text != null && state.text.boundingBox != null)
- {
- var bbox = state.text.unrotatedBoundingBox || state.text.boundingBox;
-
- return new mxRectangle(Math.round(bbox.x), Math.round(bbox.y), Math.round(bbox.width), Math.round(bbox.height));
- }
- else
- {
- return mxVertexHandlerGetSelectionBounds.apply(this, arguments);
- }
- };
-
- // Redirects moving of edge labels to mxGraphHandler by not starting here.
- // This will use the move preview of mxGraphHandler (see above).
- var mxVertexHandlerMouseDown = mxVertexHandler.prototype.mouseDown;
- mxVertexHandler.prototype.mouseDown = function(sender, me)
- {
- var model = this.graph.getModel();
- var parent = model.getParent(this.state.cell);
- var geo = this.graph.getCellGeometry(this.state.cell);
-
- // Lets rotation events through
- var handle = this.getHandleForEvent(me);
-
- if (handle == mxEvent.ROTATION_HANDLE || !model.isEdge(parent) || geo == null || !geo.relative ||
- this.state == null || this.state.width >= 2 || this.state.height >= 2)
- {
- mxVertexHandlerMouseDown.apply(this, arguments);
- }
- };
-
- // Invokes turn on single click on rotation handle
- mxVertexHandler.prototype.rotateClick = function()
- {
- var stroke = mxUtils.getValue(this.state.style, mxConstants.STYLE_STROKECOLOR, mxConstants.NONE);
- var fill = mxUtils.getValue(this.state.style, mxConstants.STYLE_FILLCOLOR, mxConstants.NONE);
-
- if (this.state.view.graph.model.isVertex(this.state.cell) &&
- stroke == mxConstants.NONE && fill == mxConstants.NONE)
- {
- var angle = mxUtils.mod(mxUtils.getValue(this.state.style, mxConstants.STYLE_ROTATION, 0) + 90, 360);
- this.state.view.graph.setCellStyles(mxConstants.STYLE_ROTATION, angle, [this.state.cell]);
- }
- else
- {
- this.state.view.graph.turnShapes([this.state.cell]);
- }
- };
-
- var vertexHandlerMouseMove = mxVertexHandler.prototype.mouseMove;
-
- // Workaround for "isConsumed not defined" in MS Edge is to use arguments
- mxVertexHandler.prototype.mouseMove = function(sender, me)
- {
- vertexHandlerMouseMove.apply(this, arguments);
-
- if (this.graph.graphHandler.first != null)
- {
- if (this.rotationShape != null && this.rotationShape.node != null)
- {
- this.rotationShape.node.style.display = 'none';
- }
-
- if (this.linkHint != null && this.linkHint.style.display != 'none')
- {
- this.linkHint.style.display = 'none';
- }
- }
- };
-
- var vertexHandlerMouseUp = mxVertexHandler.prototype.mouseUp;
-
- mxVertexHandler.prototype.mouseUp = function(sender, me)
- {
- vertexHandlerMouseUp.apply(this, arguments);
-
- // Shows rotation handle only if one vertex is selected
- if (this.rotationShape != null && this.rotationShape.node != null)
- {
- this.rotationShape.node.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none';
- }
-
- if (this.linkHint != null && this.linkHint.style.display == 'none')
- {
- this.linkHint.style.display = '';
- }
-
- // Resets state after gesture
- this.blockDelayedSelection = null;
- };
-
- var vertexHandlerInit = mxVertexHandler.prototype.init;
- mxVertexHandler.prototype.init = function()
- {
- vertexHandlerInit.apply(this, arguments);
- var redraw = false;
-
- if (this.rotationShape != null)
- {
- this.rotationShape.node.setAttribute('title', mxResources.get('rotateTooltip'));
- }
-
- if (this.graph.isTable(this.state.cell))
- {
- this.refreshMoveHandles();
- }
- // Draws corner rectangles for single selected table cells and rows
- else if (this.graph.getSelectionCount() == 1 &&
- (this.graph.isTableCell(this.state.cell) ||
- this.graph.isTableRow(this.state.cell)))
- {
- this.cornerHandles = [];
-
- for (var i = 0; i < 4; i++)
- {
- var shape = new mxRectangleShape(new mxRectangle(0, 0, 6, 6),
- '#ffffff', mxConstants.HANDLE_STROKECOLOR);
- shape.dialect = (this.graph.dialect != mxConstants.DIALECT_SVG) ?
- mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
- shape.init(this.graph.view.getOverlayPane());
- this.cornerHandles.push(shape);
- }
- }
-
- var update = mxUtils.bind(this, function()
- {
- if (this.specialHandle != null)
- {
- this.specialHandle.node.style.display = (this.graph.isEnabled() &&
- this.graph.getSelectionCount() < this.graph.graphHandler.maxCells) ?
- '' : 'none';
- }
-
- this.redrawHandles();
- });
-
- this.changeHandler = mxUtils.bind(this, function(sender, evt)
- {
- this.updateLinkHint(this.graph.getLinkForCell(this.state.cell),
- this.graph.getLinksForState(this.state));
- update();
- });
-
- this.graph.getSelectionModel().addListener(mxEvent.CHANGE, this.changeHandler);
- this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler);
-
- // Repaint needed when editing stops and no change event is fired
- this.editingHandler = mxUtils.bind(this, function(sender, evt)
- {
- this.redrawHandles();
- });
-
- this.graph.addListener(mxEvent.EDITING_STOPPED, this.editingHandler);
-
- var link = this.graph.getLinkForCell(this.state.cell);
- var links = this.graph.getLinksForState(this.state);
- this.updateLinkHint(link, links);
-
- if (link != null || (links != null && links.length > 0))
- {
- redraw = true;
- }
-
- if (redraw)
- {
- this.redrawHandles();
- }
- };
-
- mxVertexHandler.prototype.updateLinkHint = function(link, links)
- {
- try
- {
- if ((link == null && (links == null || links.length == 0)) ||
- this.graph.getSelectionCount() > 1)
- {
- if (this.linkHint != null)
- {
- this.linkHint.parentNode.removeChild(this.linkHint);
- this.linkHint = null;
- }
- }
- else if (link != null || (links != null && links.length > 0))
- {
- if (this.linkHint == null)
- {
- this.linkHint = createHint();
- this.linkHint.style.padding = '6px 8px 6px 8px';
- this.linkHint.style.opacity = '1';
- this.linkHint.style.filter = '';
-
- this.graph.container.appendChild(this.linkHint);
- }
-
- this.linkHint.innerHTML = '';
-
- if (link != null)
- {
- this.linkHint.appendChild(this.graph.createLinkForHint(link));
-
- if (this.graph.isEnabled() && typeof this.graph.editLink === 'function')
- {
- var changeLink = document.createElement('img');
- changeLink.setAttribute('src', Editor.editImage);
- changeLink.setAttribute('title', mxResources.get('editLink'));
- changeLink.setAttribute('width', '11');
- changeLink.setAttribute('height', '11');
- changeLink.style.marginLeft = '10px';
- changeLink.style.marginBottom = '-1px';
- changeLink.style.cursor = 'pointer';
- this.linkHint.appendChild(changeLink);
-
- mxEvent.addListener(changeLink, 'click', mxUtils.bind(this, function(evt)
- {
- this.graph.setSelectionCell(this.state.cell);
- this.graph.editLink();
- mxEvent.consume(evt);
- }));
-
- var removeLink = document.createElement('img');
- removeLink.setAttribute('src', Dialog.prototype.clearImage);
- removeLink.setAttribute('title', mxResources.get('removeIt', [mxResources.get('link')]));
- removeLink.setAttribute('width', '13');
- removeLink.setAttribute('height', '10');
- removeLink.style.marginLeft = '4px';
- removeLink.style.marginBottom = '-1px';
- removeLink.style.cursor = 'pointer';
- this.linkHint.appendChild(removeLink);
-
- mxEvent.addListener(removeLink, 'click', mxUtils.bind(this, function(evt)
- {
- this.graph.setLinkForCell(this.state.cell, null);
- mxEvent.consume(evt);
- }));
- }
- }
-
- if (links != null)
- {
- for (var i = 0; i < links.length; i++)
- {
- var div = document.createElement('div');
- div.style.marginTop = (link != null || i > 0) ? '6px' : '0px';
- div.appendChild(this.graph.createLinkForHint(
- links[i].getAttribute('href'),
- mxUtils.getTextContent(links[i])));
-
- this.linkHint.appendChild(div);
- }
- }
- }
- }
- catch (e)
- {
- // ignore
- }
- };
-
- mxEdgeHandler.prototype.updateLinkHint = mxVertexHandler.prototype.updateLinkHint;
-
- // Creates special handles
- var edgeHandlerInit = mxEdgeHandler.prototype.init;
- mxEdgeHandler.prototype.init = function()
- {
- edgeHandlerInit.apply(this, arguments);
-
- // Disables connection points
- this.constraintHandler.isEnabled = mxUtils.bind(this, function()
- {
- return this.state.view.graph.connectionHandler.isEnabled();
- });
-
- var update = mxUtils.bind(this, function()
- {
- if (this.linkHint != null)
- {
- this.linkHint.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none';
- }
-
- if (this.labelShape != null)
- {
- this.labelShape.node.style.display = (this.graph.isEnabled() &&
- this.graph.getSelectionCount() < this.graph.graphHandler.maxCells) ?
- '' : 'none';
- }
- });
-
- this.changeHandler = mxUtils.bind(this, function(sender, evt)
- {
- this.updateLinkHint(this.graph.getLinkForCell(this.state.cell),
- this.graph.getLinksForState(this.state));
- update();
- this.redrawHandles();
- });
-
- this.graph.getSelectionModel().addListener(mxEvent.CHANGE, this.changeHandler);
- this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler);
-
- var link = this.graph.getLinkForCell(this.state.cell);
- var links = this.graph.getLinksForState(this.state);
-
- if (link != null || (links != null && links.length > 0))
- {
- this.updateLinkHint(link, links);
- this.redrawHandles();
- }
- };
-
- // Disables connection points
- var connectionHandlerInit = mxConnectionHandler.prototype.init;
-
- mxConnectionHandler.prototype.init = function()
- {
- connectionHandlerInit.apply(this, arguments);
-
- this.constraintHandler.isEnabled = mxUtils.bind(this, function()
- {
- return this.graph.connectionHandler.isEnabled();
- });
- };
-
- // Updates special handles
- var vertexHandlerRedrawHandles = mxVertexHandler.prototype.redrawHandles;
- mxVertexHandler.prototype.redrawHandles = function()
- {
- if (this.moveHandles != null)
- {
- for (var i = 0; i < this.moveHandles.length; i++)
- {
- this.moveHandles[i].style.left = (this.moveHandles[i].rowState.x +
- this.moveHandles[i].rowState.width - 5) + 'px';
- this.moveHandles[i].style.top = (this.moveHandles[i].rowState.y +
- this.moveHandles[i].rowState.height / 2 - 6) + 'px';
- }
- }
-
- if (this.cornerHandles != null)
- {
- var inset = this.getSelectionBorderInset();
- var ch = this.cornerHandles;
- var w = ch[0].bounds.width / 2;
- var h = ch[0].bounds.height / 2;
-
- ch[0].bounds.x = this.state.x - w + inset;
- ch[0].bounds.y = this.state.y - h + inset;
- ch[0].redraw();
- ch[1].bounds.x = ch[0].bounds.x + this.state.width - 2 * inset;
- ch[1].bounds.y = ch[0].bounds.y;
- ch[1].redraw();
- ch[2].bounds.x = ch[0].bounds.x;
- ch[2].bounds.y = this.state.y + this.state.height - 2 * inset;
- ch[2].redraw();
- ch[3].bounds.x = ch[1].bounds.x;
- ch[3].bounds.y = ch[2].bounds.y;
- ch[3].redraw();
-
- for (var i = 0; i < this.cornerHandles.length; i++)
- {
- this.cornerHandles[i].node.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none';
- }
- }
-
- // Shows rotation handle only if one vertex is selected
- if (this.rotationShape != null && this.rotationShape.node != null)
- {
- this.rotationShape.node.style.display = (this.moveHandles == null &&
- (this.graph.getSelectionCount() == 1 && (this.index == null ||
- this.index == mxEvent.ROTATION_HANDLE))) ? '' : 'none';
- }
-
- vertexHandlerRedrawHandles.apply(this);
-
- if (this.state != null && this.linkHint != null)
- {
- var c = new mxPoint(this.state.getCenterX(), this.state.getCenterY());
- var tmp = new mxRectangle(this.state.x, this.state.y - 22, this.state.width + 24, this.state.height + 22);
- var bb = mxUtils.getBoundingBox(tmp, this.state.style[mxConstants.STYLE_ROTATION] || '0', c);
- var rs = (bb != null) ? mxUtils.getBoundingBox(this.state,
- this.state.style[mxConstants.STYLE_ROTATION] || '0') : this.state;
- var tb = (this.state.text != null) ? this.state.text.boundingBox : null;
-
- if (bb == null)
- {
- bb = this.state;
- }
-
- var b = bb.y + bb.height;
-
- if (tb != null)
- {
- b = Math.max(b, tb.y + tb.height);
- }
-
- this.linkHint.style.left = Math.max(0, Math.round(rs.x + (rs.width - this.linkHint.clientWidth) / 2)) + 'px';
- this.linkHint.style.top = Math.round(b + this.verticalOffset / 2 + Editor.hintOffset) + 'px';
- }
- };
-
- // Destroys special handles
- var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
- mxVertexHandler.prototype.destroy = function()
- {
- vertexHandlerDestroy.apply(this, arguments);
-
- if (this.moveHandles != null)
- {
- for (var i = 0; i < this.moveHandles.length; i++)
- {
- if (this.moveHandles[i] != null && this.moveHandles[i].parentNode != null)
- {
- this.moveHandles[i].parentNode.removeChild(this.moveHandles[i]);
- }
- }
-
- this.moveHandles = null;
- }
-
- if (this.cornerHandles != null)
- {
- for (var i = 0; i < this.cornerHandles.length; i++)
- {
- if (this.cornerHandles[i] != null && this.cornerHandles[i].node != null &&
- this.cornerHandles[i].node.parentNode != null)
- {
- this.cornerHandles[i].node.parentNode.removeChild(this.cornerHandles[i].node);
- }
- }
-
- this.cornerHandles = null;
- }
-
- if (this.linkHint != null)
- {
- if (this.linkHint.parentNode != null)
- {
- this.linkHint.parentNode.removeChild(this.linkHint);
- }
-
- this.linkHint = null;
- }
-
- if (this.changeHandler != null)
- {
- this.graph.getSelectionModel().removeListener(this.changeHandler);
- this.graph.getModel().removeListener(this.changeHandler);
- this.changeHandler = null;
- }
-
- if (this.editingHandler != null)
- {
- this.graph.removeListener(this.editingHandler);
- this.editingHandler = null;
- }
- };
-
- var edgeHandlerRedrawHandles = mxEdgeHandler.prototype.redrawHandles;
- mxEdgeHandler.prototype.redrawHandles = function()
- {
- // Workaround for special case where handler
- // is reset before this which leads to a NPE
- if (this.marker != null)
- {
- edgeHandlerRedrawHandles.apply(this);
-
- if (this.state != null && this.linkHint != null)
- {
- var b = this.state;
-
- if (this.state.text != null && this.state.text.bounds != null)
- {
- b = new mxRectangle(b.x, b.y, b.width, b.height);
- b.add(this.state.text.bounds);
- }
-
- this.linkHint.style.left = Math.max(0, Math.round(b.x + (b.width - this.linkHint.clientWidth) / 2)) + 'px';
- this.linkHint.style.top = Math.round(b.y + b.height + Editor.hintOffset) + 'px';
- }
- }
- };
-
- var edgeHandlerReset = mxEdgeHandler.prototype.reset;
- mxEdgeHandler.prototype.reset = function()
- {
- edgeHandlerReset.apply(this, arguments);
-
- if (this.linkHint != null)
- {
- this.linkHint.style.visibility = '';
- }
- };
-
- var edgeHandlerDestroy = mxEdgeHandler.prototype.destroy;
- mxEdgeHandler.prototype.destroy = function()
- {
- edgeHandlerDestroy.apply(this, arguments);
-
- if (this.linkHint != null)
- {
- this.linkHint.parentNode.removeChild(this.linkHint);
- this.linkHint = null;
- }
-
- if (this.changeHandler != null)
- {
- this.graph.getModel().removeListener(this.changeHandler);
- this.graph.getSelectionModel().removeListener(this.changeHandler);
- this.changeHandler = null;
- }
- };
- })();
-}
diff --git a/src/main/webapp/js/mxgraph/Init.js b/src/main/webapp/js/mxgraph/Init.js
deleted file mode 100644
index d4467ea1..00000000
--- a/src/main/webapp/js/mxgraph/Init.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// urlParams is null when used for embedding
-window.urlParams = window.urlParams || {};
-
-// Public global variables
-window.MAX_REQUEST_SIZE = window.MAX_REQUEST_SIZE || 10485760;
-window.MAX_AREA = window.MAX_AREA || 15000 * 15000;
-
-// URLs for save and export
-window.EXPORT_URL = window.EXPORT_URL || '/export';
-window.SAVE_URL = window.SAVE_URL || '/save';
-window.OPEN_URL = window.OPEN_URL || '/open';
-window.RESOURCES_PATH = window.RESOURCES_PATH || 'resources';
-window.RESOURCE_BASE = window.RESOURCE_BASE || window.RESOURCES_PATH + '/grapheditor';
-window.STENCIL_PATH = window.STENCIL_PATH || 'stencils';
-window.IMAGE_PATH = window.IMAGE_PATH || 'images';
-window.STYLE_PATH = window.STYLE_PATH || 'styles';
-window.CSS_PATH = window.CSS_PATH || 'styles';
-window.OPEN_FORM = window.OPEN_FORM || 'open.html';
-
-// Sets the base path, the UI language via URL param and configures the
-// supported languages to avoid 404s. The loading of all core language
-// resources is disabled as all required resources are in grapheditor.
-// properties. Note that in this example the loading of two resource
-// files (the special bundle and the default bundle) is disabled to
-// save a GET request. This requires that all resources be present in
-// each properties file since only one file is loaded.
-window.mxBasePath = window.mxBasePath || '../../../src';
-window.mxLanguage = window.mxLanguage || urlParams['lang'];
-window.mxLanguages = window.mxLanguages || ['de', 'se'];
diff --git a/src/main/webapp/js/mxgraph/Menus.js b/src/main/webapp/js/mxgraph/Menus.js
deleted file mode 100644
index d06882b9..00000000
--- a/src/main/webapp/js/mxgraph/Menus.js
+++ /dev/null
@@ -1,1462 +0,0 @@
-/**
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new graph editor
- */
-Menus = function(editorUi)
-{
- this.editorUi = editorUi;
- this.menus = new Object();
- this.init();
-
- // Pre-fetches checkmark image
- if (!mxClient.IS_SVG)
- {
- new Image().src = this.checkmarkImage;
- }
-};
-
-/**
- * Sets the default font family.
- */
-Menus.prototype.defaultFont = 'Helvetica';
-
-/**
- * Sets the default font size.
- */
-Menus.prototype.defaultFontSize = '12';
-
-/**
- * Sets the default font size.
- */
-Menus.prototype.defaultMenuItems = ['file', 'edit', 'view', 'arrange', 'extras', 'help'];
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.defaultFonts = ['Helvetica', 'Verdana', 'Times New Roman', 'Garamond', 'Comic Sans MS',
- 'Courier New', 'Georgia', 'Lucida Console', 'Tahoma'];
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.init = function()
-{
- var graph = this.editorUi.editor.graph;
- var isGraphEnabled = mxUtils.bind(graph, graph.isEnabled);
-
- this.customFonts = [];
- this.customFontSizes = [];
-
- this.put('fontFamily', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- var addItem = mxUtils.bind(this, function(fontname)
- {
- var tr = this.styleChange(menu, fontname, [mxConstants.STYLE_FONTFAMILY], [fontname], null, parent, function()
- {
- document.execCommand('fontname', false, fontname);
- }, function()
- {
- graph.updateLabelElements(graph.getSelectionCells(), function(elt)
- {
- elt.removeAttribute('face');
- elt.style.fontFamily = null;
-
- if (elt.nodeName == 'PRE')
- {
- graph.replaceElement(elt, 'div');
- }
- });
- });
- tr.firstChild.nextSibling.style.fontFamily = fontname;
- });
-
- for (var i = 0; i < this.defaultFonts.length; i++)
- {
- addItem(this.defaultFonts[i]);
- }
-
- menu.addSeparator(parent);
-
- if (this.customFonts.length > 0)
- {
- for (var i = 0; i < this.customFonts.length; i++)
- {
- addItem(this.customFonts[i]);
- }
-
- menu.addSeparator(parent);
-
- menu.addItem(mxResources.get('reset'), null, mxUtils.bind(this, function()
- {
- this.customFonts = [];
- this.editorUi.fireEvent(new mxEventObject('customFontsChanged'));
- }), parent);
-
- menu.addSeparator(parent);
- }
-
- this.promptChange(menu, mxResources.get('custom') + '...', '', mxConstants.DEFAULT_FONTFAMILY, mxConstants.STYLE_FONTFAMILY, parent, true, mxUtils.bind(this, function(newValue)
- {
- if (mxUtils.indexOf(this.customFonts, newValue) < 0)
- {
- this.customFonts.push(newValue);
- this.editorUi.fireEvent(new mxEventObject('customFontsChanged'));
- }
- }));
- })));
- this.put('formatBlock', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- function addItem(label, tag)
- {
- return menu.addItem(label, null, mxUtils.bind(this, function()
- {
- // TODO: Check if visible
- if (graph.cellEditor.textarea != null)
- {
- graph.cellEditor.textarea.focus();
- document.execCommand('formatBlock', false, '<' + tag + '>');
- }
- }), parent);
- };
-
- addItem(mxResources.get('normal'), 'p');
-
- addItem('', 'h1').firstChild.nextSibling.innerHTML = '<h1 style="margin:0px;">' + mxResources.get('heading') + ' 1</h1>';
- addItem('', 'h2').firstChild.nextSibling.innerHTML = '<h2 style="margin:0px;">' + mxResources.get('heading') + ' 2</h2>';
- addItem('', 'h3').firstChild.nextSibling.innerHTML = '<h3 style="margin:0px;">' + mxResources.get('heading') + ' 3</h3>';
- addItem('', 'h4').firstChild.nextSibling.innerHTML = '<h4 style="margin:0px;">' + mxResources.get('heading') + ' 4</h4>';
- addItem('', 'h5').firstChild.nextSibling.innerHTML = '<h5 style="margin:0px;">' + mxResources.get('heading') + ' 5</h5>';
- addItem('', 'h6').firstChild.nextSibling.innerHTML = '<h6 style="margin:0px;">' + mxResources.get('heading') + ' 6</h6>';
-
- addItem('', 'pre').firstChild.nextSibling.innerHTML = '<pre style="margin:0px;">' + mxResources.get('formatted') + '</pre>';
- addItem('', 'blockquote').firstChild.nextSibling.innerHTML = '<blockquote style="margin-top:0px;margin-bottom:0px;">' + mxResources.get('blockquote') + '</blockquote>';
- })));
- this.put('fontSize', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- var sizes = [6, 8, 9, 10, 11, 12, 14, 18, 24, 36, 48, 72];
-
- var addItem = mxUtils.bind(this, function(fontsize)
- {
- this.styleChange(menu, fontsize, [mxConstants.STYLE_FONTSIZE], [fontsize], null, parent, function()
- {
- if (graph.cellEditor.textarea != null)
- {
- // Creates an element with arbitrary size 3
- document.execCommand('fontSize', false, '3');
-
- // Changes the css font size of the first font element inside the in-place editor with size 3
- // hopefully the above element that we've just created. LATER: Check for new element using
- // previous result of getElementsByTagName (see other actions)
- var elts = graph.cellEditor.textarea.getElementsByTagName('font');
-
- for (var i = 0; i < elts.length; i++)
- {
- if (elts[i].getAttribute('size') == '3')
- {
- elts[i].removeAttribute('size');
- elts[i].style.fontSize = fontsize + 'px';
-
- break;
- }
- }
- }
- });
- });
-
- for (var i = 0; i < sizes.length; i++)
- {
- addItem(sizes[i]);
- }
-
- menu.addSeparator(parent);
-
- if (this.customFontSizes.length > 0)
- {
- for (var i = 0; i < this.customFontSizes.length; i++)
- {
- addItem(this.customFontSizes[i]);
- }
-
- menu.addSeparator(parent);
-
- menu.addItem(mxResources.get('reset'), null, mxUtils.bind(this, function()
- {
- this.customFontSizes = [];
- }), parent);
-
- menu.addSeparator(parent);
- }
-
- this.promptChange(menu, mxResources.get('custom') + '...', '(pt)', '12', mxConstants.STYLE_FONTSIZE, parent, true, mxUtils.bind(this, function(newValue)
- {
- this.customFontSizes.push(newValue);
- }));
- })));
- this.put('direction', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- menu.addItem(mxResources.get('flipH'), null, function() { graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false); }, parent);
- menu.addItem(mxResources.get('flipV'), null, function() { graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false); }, parent);
- this.addMenuItems(menu, ['-', 'rotation'], parent);
- })));
- this.put('align', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- menu.addItem(mxResources.get('leftAlign'), null, function() { graph.alignCells(mxConstants.ALIGN_LEFT); }, parent);
- menu.addItem(mxResources.get('center'), null, function() { graph.alignCells(mxConstants.ALIGN_CENTER); }, parent);
- menu.addItem(mxResources.get('rightAlign'), null, function() { graph.alignCells(mxConstants.ALIGN_RIGHT); }, parent);
- menu.addSeparator(parent);
- menu.addItem(mxResources.get('topAlign'), null, function() { graph.alignCells(mxConstants.ALIGN_TOP); }, parent);
- menu.addItem(mxResources.get('middle'), null, function() { graph.alignCells(mxConstants.ALIGN_MIDDLE); }, parent);
- menu.addItem(mxResources.get('bottomAlign'), null, function() { graph.alignCells(mxConstants.ALIGN_BOTTOM); }, parent);
- })));
- this.put('distribute', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- menu.addItem(mxResources.get('horizontal'), null, function() { graph.distributeCells(true); }, parent);
- menu.addItem(mxResources.get('vertical'), null, function() { graph.distributeCells(false); }, parent);
- })));
- this.put('layout', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- var promptSpacing = mxUtils.bind(this, function(defaultValue, fn)
- {
- var dlg = new FilenameDialog(this.editorUi, defaultValue, mxResources.get('apply'), function(newValue)
- {
- fn(parseFloat(newValue));
- }, mxResources.get('spacing'));
- this.editorUi.showDialog(dlg.container, 300, 80, true, true);
- dlg.init();
- });
-
- menu.addItem(mxResources.get('horizontalFlow'), null, mxUtils.bind(this, function()
- {
- var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_WEST);
-
- this.editorUi.executeLayout(function()
- {
- var selectionCells = graph.getSelectionCells();
- layout.execute(graph.getDefaultParent(), selectionCells.length == 0 ? null : selectionCells);
- }, true);
- }), parent);
- menu.addItem(mxResources.get('verticalFlow'), null, mxUtils.bind(this, function()
- {
- var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_NORTH);
-
- this.editorUi.executeLayout(function()
- {
- var selectionCells = graph.getSelectionCells();
- layout.execute(graph.getDefaultParent(), selectionCells.length == 0 ? null : selectionCells);
- }, true);
- }), parent);
- menu.addSeparator(parent);
- menu.addItem(mxResources.get('horizontalTree'), null, mxUtils.bind(this, function()
- {
- var tmp = graph.getSelectionCell();
- var roots = null;
-
- if (tmp == null || graph.getModel().getChildCount(tmp) == 0)
- {
- if (graph.getModel().getEdgeCount(tmp) == 0)
- {
- roots = graph.findTreeRoots(graph.getDefaultParent());
- }
- }
- else
- {
- roots = graph.findTreeRoots(tmp);
- }
-
- if (roots != null && roots.length > 0)
- {
- tmp = roots[0];
- }
-
- if (tmp != null)
- {
- var layout = new mxCompactTreeLayout(graph, true);
- layout.edgeRouting = false;
- layout.levelDistance = 30;
-
- promptSpacing(layout.levelDistance, mxUtils.bind(this, function(newValue)
- {
- layout.levelDistance = newValue;
-
- this.editorUi.executeLayout(function()
- {
- layout.execute(graph.getDefaultParent(), tmp);
- }, true);
- }));
- }
- }), parent);
- menu.addItem(mxResources.get('verticalTree'), null, mxUtils.bind(this, function()
- {
- var tmp = graph.getSelectionCell();
- var roots = null;
-
- if (tmp == null || graph.getModel().getChildCount(tmp) == 0)
- {
- if (graph.getModel().getEdgeCount(tmp) == 0)
- {
- roots = graph.findTreeRoots(graph.getDefaultParent());
- }
- }
- else
- {
- roots = graph.findTreeRoots(tmp);
- }
-
- if (roots != null && roots.length > 0)
- {
- tmp = roots[0];
- }
-
- if (tmp != null)
- {
- var layout = new mxCompactTreeLayout(graph, false);
- layout.edgeRouting = false;
- layout.levelDistance = 30;
-
- promptSpacing(layout.levelDistance, mxUtils.bind(this, function(newValue)
- {
- layout.levelDistance = newValue;
-
- this.editorUi.executeLayout(function()
- {
- layout.execute(graph.getDefaultParent(), tmp);
- }, true);
- }));
- }
- }), parent);
- menu.addItem(mxResources.get('radialTree'), null, mxUtils.bind(this, function()
- {
- var tmp = graph.getSelectionCell();
- var roots = null;
-
- if (tmp == null || graph.getModel().getChildCount(tmp) == 0)
- {
- if (graph.getModel().getEdgeCount(tmp) == 0)
- {
- roots = graph.findTreeRoots(graph.getDefaultParent());
- }
- }
- else
- {
- roots = graph.findTreeRoots(tmp);
- }
-
- if (roots != null && roots.length > 0)
- {
- tmp = roots[0];
- }
-
- if (tmp != null)
- {
- var layout = new mxRadialTreeLayout(graph, false);
- layout.levelDistance = 80;
- layout.autoRadius = true;
-
- promptSpacing(layout.levelDistance, mxUtils.bind(this, function(newValue)
- {
- layout.levelDistance = newValue;
-
- this.editorUi.executeLayout(function()
- {
- layout.execute(graph.getDefaultParent(), tmp);
-
- if (!graph.isSelectionEmpty())
- {
- tmp = graph.getModel().getParent(tmp);
-
- if (graph.getModel().isVertex(tmp))
- {
- graph.updateGroupBounds([tmp], graph.gridSize * 2, true);
- }
- }
- }, true);
- }));
- }
- }), parent);
- menu.addSeparator(parent);
- menu.addItem(mxResources.get('organic'), null, mxUtils.bind(this, function()
- {
- var layout = new mxFastOrganicLayout(graph);
-
- promptSpacing(layout.forceConstant, mxUtils.bind(this, function(newValue)
- {
- layout.forceConstant = newValue;
-
- this.editorUi.executeLayout(function()
- {
- var tmp = graph.getSelectionCell();
-
- if (tmp == null || graph.getModel().getChildCount(tmp) == 0)
- {
- tmp = graph.getDefaultParent();
- }
-
- layout.execute(tmp);
-
- if (graph.getModel().isVertex(tmp))
- {
- graph.updateGroupBounds([tmp], graph.gridSize * 2, true);
- }
- }, true);
- }));
- }), parent);
- menu.addItem(mxResources.get('circle'), null, mxUtils.bind(this, function()
- {
- var layout = new mxCircleLayout(graph);
-
- this.editorUi.executeLayout(function()
- {
- var tmp = graph.getSelectionCell();
-
- if (tmp == null || graph.getModel().getChildCount(tmp) == 0)
- {
- tmp = graph.getDefaultParent();
- }
-
- layout.execute(tmp);
-
- if (graph.getModel().isVertex(tmp))
- {
- graph.updateGroupBounds([tmp], graph.gridSize * 2, true);
- }
- }, true);
- }), parent);
- })));
- this.put('navigation', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ['home', '-', 'exitGroup', 'enterGroup', '-', 'expand', 'collapse', '-', 'collapsible'], parent);
- })));
- this.put('arrange', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ['toFront', 'toBack', '-'], parent);
- this.addSubmenu('direction', menu, parent);
- this.addMenuItems(menu, ['turn', '-'], parent);
- this.addSubmenu('align', menu, parent);
- this.addSubmenu('distribute', menu, parent);
- menu.addSeparator(parent);
- this.addSubmenu('navigation', menu, parent);
- this.addSubmenu('insert', menu, parent);
- this.addSubmenu('layout', menu, parent);
- this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup', '-', 'clearWaypoints', 'autosize'], parent);
- }))).isEnabled = isGraphEnabled;
- this.put('insert', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ['insertLink', 'insertImage'], parent);
- })));
- this.put('view', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ((this.editorUi.format != null) ? ['formatPanel'] : []).
- concat(['outline', 'layers', '-', 'pageView', 'pageScale', '-', 'scrollbars', 'tooltips', '-',
- 'grid', 'guides', '-', 'connectionArrows', 'connectionPoints', '-',
- 'resetView', 'zoomIn', 'zoomOut'], parent));
- })));
- // Two special dropdowns that are only used in the toolbar
- this.put('viewPanels', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- if (this.editorUi.format != null)
- {
- this.addMenuItems(menu, ['formatPanel'], parent);
- }
-
- this.addMenuItems(menu, ['outline', 'layers'], parent);
- })));
- this.put('viewZoom', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ['resetView', '-'], parent);
- var scales = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4];
-
- for (var i = 0; i < scales.length; i++)
- {
- (function(scale)
- {
- menu.addItem((scale * 100) + '%', null, function()
- {
- graph.zoomTo(scale);
- }, parent);
- })(scales[i]);
- }
-
- this.addMenuItems(menu, ['-', 'fitWindow', 'fitPageWidth', 'fitPage', 'fitTwoPages', '-', 'customZoom'], parent);
- })));
- this.put('file', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ['new', 'open', '-', 'save', 'saveAs', '-', 'import', 'export', '-', 'pageSetup', 'print'], parent);
- })));
- this.put('edit', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ['undo', 'redo', '-', 'cut', 'copy', 'paste', 'delete', '-', 'duplicate', '-',
- 'editData', 'editTooltip', '-', 'editStyle', '-', 'edit', '-', 'editLink', 'openLink', '-',
- 'selectVertices', 'selectEdges', 'selectAll', 'selectNone', '-', 'lockUnlock']);
- })));
- this.put('extras', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ['copyConnect', 'collapseExpand', '-', 'editDiagram']);
- })));
- this.put('help', new Menu(mxUtils.bind(this, function(menu, parent)
- {
- this.addMenuItems(menu, ['help', '-', 'about']);
- })));
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.put = function(name, menu)
-{
- this.menus[name] = menu;
-
- return menu;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.get = function(name)
-{
- return this.menus[name];
-};
-
-/**
- * Adds the given submenu.
- */
-Menus.prototype.addSubmenu = function(name, menu, parent, label)
-{
- var entry = this.get(name);
-
- if (entry != null)
- {
- var enabled = entry.isEnabled();
-
- if (menu.showDisabled || enabled)
- {
- var submenu = menu.addItem(label || mxResources.get(name), null, null, parent, null, enabled);
- this.addMenu(name, menu, submenu);
- }
- }
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.addMenu = function(name, popupMenu, parent)
-{
- var menu = this.get(name);
-
- if (menu != null && (popupMenu.showDisabled || menu.isEnabled()))
- {
- this.get(name).execute(popupMenu, parent);
- }
-};
-
-/**
- * Adds a menu item to insert a table cell.
- */
-Menus.prototype.addInsertTableCellItem = function(menu, parent)
-{
- var graph = this.editorUi.editor.graph;
-
- this.addInsertTableItem(menu, mxUtils.bind(this, function(evt, rows, cols)
- {
- var table = (mxEvent.isControlDown(evt) || mxEvent.isMetaDown(evt)) ?
- graph.createCrossFunctionalSwimlane(rows, cols) :
- graph.createTable(rows, cols, null, null,
- (mxEvent.isShiftDown(evt)) ? 'Table' : null);
- var pt = (mxEvent.isAltDown(evt)) ? graph.getFreeInsertPoint() :
- graph.getCenterInsertPoint(graph.getBoundingBoxFromGeometry([table], true));
- var select = graph.importCells([table], pt.x, pt.y);
-
- if (select != null && select.length > 0)
- {
- graph.scrollCellToVisible(select[0]);
- graph.setSelectionCells(select);
- }
- }), parent);
-};
-
-/**
- * Adds a menu item to insert a table.
- */
-Menus.prototype.addInsertTableItem = function(menu, insertFn, parent)
-{
- insertFn = (insertFn != null) ? insertFn : mxUtils.bind(this, function(evt, rows, cols)
- {
- var graph = this.editorUi.editor.graph;
- var td = graph.getParentByName(mxEvent.getSource(evt), 'TD');
-
- if (td != null && graph.cellEditor.textarea != null)
- {
- var row2 = graph.getParentByName(td, 'TR');
-
- // To find the new link, we create a list of all existing links first
- // LATER: Refactor for reuse with code for finding inserted image below
- var tmp = graph.cellEditor.textarea.getElementsByTagName('table');
- var oldTables = [];
-
- for (var i = 0; i < tmp.length; i++)
- {
- oldTables.push(tmp[i]);
- }
-
- // Finding the new table will work with insertHTML, but IE does not support that
- graph.container.focus();
- graph.pasteHtmlAtCaret(createTable(rows, cols));
-
- // Moves cursor to first table cell
- var newTables = graph.cellEditor.textarea.getElementsByTagName('table');
-
- if (newTables.length == oldTables.length + 1)
- {
- // Inverse order in favor of appended tables
- for (var i = newTables.length - 1; i >= 0; i--)
- {
- if (i == 0 || newTables[i] != oldTables[i - 1])
- {
- graph.selectNode(newTables[i].rows[0].cells[0]);
- break;
- }
- }
- }
- }
- });
-
- // KNOWN: Does not work in IE8 standards and quirks
- var graph = this.editorUi.editor.graph;
- var row2 = null;
- var td = null;
-
- function createTable(rows, cols)
- {
- var html = ['<table>'];
-
- for (var i = 0; i < rows; i++)
- {
- html.push('<tr>');
-
- for (var j = 0; j < cols; j++)
- {
- html.push('<td><br></td>');
- }
-
- html.push('</tr>');
- }
-
- html.push('</table>');
-
- return html.join('');
- };
-
- // Show table size dialog
- var elt2 = menu.addItem('', null, null, parent, null, null, null, true);
-
- // Quirks mode does not add cell padding if cell is empty, needs good old spacer solution
- var quirksCellHtml = '<img src="' + mxClient.imageBasePath + '/transparent.gif' + '" width="16" height="16"/>';
-
- function createPicker(rows, cols)
- {
- var table2 = document.createElement('table');
- table2.setAttribute('border', '1');
- table2.style.borderCollapse = 'collapse';
- table2.style.borderStyle = 'solid';
-
- if (!mxClient.IS_QUIRKS)
- {
- table2.setAttribute('cellPadding', '8');
- }
-
- for (var i = 0; i < rows; i++)
- {
- var row = table2.insertRow(i);
-
- for (var j = 0; j < cols; j++)
- {
- var cell = row.insertCell(-1);
-
- if (mxClient.IS_QUIRKS)
- {
- cell.innerHTML = quirksCellHtml;
- }
- }
- }
-
- return table2;
- };
-
- function extendPicker(picker, rows, cols)
- {
- for (var i = picker.rows.length; i < rows; i++)
- {
- var row = picker.insertRow(i);
-
- for (var j = 0; j < picker.rows[0].cells.length; j++)
- {
- var cell = row.insertCell(-1);
-
- if (mxClient.IS_QUIRKS)
- {
- cell.innerHTML = quirksCellHtml;
- }
- }
- }
-
- for (var i = 0; i < picker.rows.length; i++)
- {
- var row = picker.rows[i];
-
- for (var j = row.cells.length; j < cols; j++)
- {
- var cell = row.insertCell(-1);
-
- if (mxClient.IS_QUIRKS)
- {
- cell.innerHTML = quirksCellHtml;
- }
- }
- }
- };
-
- elt2.firstChild.innerHTML = '';
- var picker = createPicker(5, 5);
- elt2.firstChild.appendChild(picker);
-
- var label = document.createElement('div');
- label.style.padding = '4px';
- label.style.fontSize = Menus.prototype.defaultFontSize + 'px';
- label.innerHTML = '1x1';
- elt2.firstChild.appendChild(label);
-
- function mouseover(e)
- {
- td = graph.getParentByName(mxEvent.getSource(e), 'TD');
- var selected = false;
-
- if (td != null)
- {
- row2 = graph.getParentByName(td, 'TR');
- var ext = (mxEvent.isMouseEvent(e)) ? 2 : 4;
- extendPicker(picker, Math.min(20, row2.sectionRowIndex + ext), Math.min(20, td.cellIndex + ext));
- label.innerHTML = (td.cellIndex + 1) + 'x' + (row2.sectionRowIndex + 1);
-
- for (var i = 0; i < picker.rows.length; i++)
- {
- var r = picker.rows[i];
-
- for (var j = 0; j < r.cells.length; j++)
- {
- var cell = r.cells[j];
-
- if (i == row2.sectionRowIndex &&
- j == td.cellIndex)
- {
- selected = cell.style.backgroundColor == 'blue';
- }
-
- if (i <= row2.sectionRowIndex && j <= td.cellIndex)
- {
- cell.style.backgroundColor = 'blue';
- }
- else
- {
- cell.style.backgroundColor = 'transparent';
- }
- }
- }
- }
-
- mxEvent.consume(e);
-
- return selected;
- };
-
- mxEvent.addGestureListeners(picker, null, null, mxUtils.bind(this, function (e)
- {
- var selected = mouseover(e);
-
- if (td != null && row2 != null && selected)
- {
- insertFn(e, row2.sectionRowIndex + 1, td.cellIndex + 1);
-
- // Async required to block event for elements under menu
- window.setTimeout(mxUtils.bind(this, function()
- {
- this.editorUi.hideCurrentMenu();
- }), 0);
- }
- }));
- mxEvent.addListener(picker, 'mouseover', mouseover);
-};
-
-/**
- * Adds a style change item to the given menu.
- */
-Menus.prototype.edgeStyleChange = function(menu, label, keys, values, sprite, parent, reset)
-{
- return menu.addItem(label, null, mxUtils.bind(this, function()
- {
- var graph = this.editorUi.editor.graph;
- graph.stopEditing(false);
-
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
- var edges = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- var cell = cells[i];
-
- if (graph.getModel().isEdge(cell))
- {
- if (reset)
- {
- var geo = graph.getCellGeometry(cell);
-
- // Resets all edge points
- if (geo != null)
- {
- geo = geo.clone();
- geo.points = null;
- graph.getModel().setGeometry(cell, geo);
- }
- }
-
- for (var j = 0; j < keys.length; j++)
- {
- graph.setCellStyles(keys[j], values[j], [cell]);
- }
-
- edges.push(cell);
- }
- }
-
- this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', keys,
- 'values', values, 'cells', edges));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- }), parent, sprite);
-};
-
-/**
- * Adds a style change item to the given menu.
- */
-Menus.prototype.styleChange = function(menu, label, keys, values, sprite, parent, fn, post)
-{
- var apply = this.createStyleChangeFunction(keys, values);
-
- return menu.addItem(label, null, mxUtils.bind(this, function()
- {
- var graph = this.editorUi.editor.graph;
-
- if (fn != null && graph.cellEditor.isContentEditing())
- {
- fn();
- }
- else
- {
- apply(post);
- }
- }), parent, sprite);
-};
-
-/**
- *
- */
-Menus.prototype.createStyleChangeFunction = function(keys, values)
-{
- return mxUtils.bind(this, function(post)
- {
- var graph = this.editorUi.editor.graph;
- graph.stopEditing(false);
-
- graph.getModel().beginUpdate();
- try
- {
- var cells = graph.getSelectionCells();
-
- for (var i = 0; i < keys.length; i++)
- {
- graph.setCellStyles(keys[i], values[i], cells);
-
- // Removes CSS alignment to produce consistent output
- if (keys[i] == mxConstants.STYLE_ALIGN)
- {
- graph.updateLabelElements(cells, function(elt)
- {
- elt.removeAttribute('align');
- elt.style.textAlign = null;
- });
- }
-
- // Updates autosize after font changes
- if (keys[i] == mxConstants.STYLE_FONTFAMILY)
- {
- for (var j = 0; j < cells.length; j++)
- {
- if (graph.model.getChildCount(cells[j]) == 0)
- {
- graph.autoSizeCell(cells[j], false);
- }
- }
- }
- }
-
- if (post != null)
- {
- post();
- }
-
- this.editorUi.fireEvent(new mxEventObject('styleChanged',
- 'keys', keys, 'values', values, 'cells', cells));
- }
- finally
- {
- graph.getModel().endUpdate();
- }
- });
-};
-
-/**
- * Adds a style change item with a prompt to the given menu.
- */
-Menus.prototype.promptChange = function(menu, label, hint, defaultValue, key, parent, enabled, fn, sprite)
-{
- return menu.addItem(label, null, mxUtils.bind(this, function()
- {
- var graph = this.editorUi.editor.graph;
- var value = defaultValue;
- var state = graph.getView().getState(graph.getSelectionCell());
-
- if (state != null)
- {
- value = state.style[key] || value;
- }
-
- var dlg = new FilenameDialog(this.editorUi, value, mxResources.get('apply'), mxUtils.bind(this, function(newValue)
- {
- if (newValue != null && newValue.length > 0)
- {
- graph.getModel().beginUpdate();
- try
- {
- graph.stopEditing(false);
- graph.setCellStyles(key, newValue);
- }
- finally
- {
- graph.getModel().endUpdate();
- }
-
- if (fn != null)
- {
- fn(newValue);
- }
- }
- }), mxResources.get('enterValue') + ((hint.length > 0) ? (' ' + hint) : ''));
- this.editorUi.showDialog(dlg.container, 300, 80, true, true);
- dlg.init();
- }), parent, sprite, enabled);
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Menus.prototype.pickColor = function(key, cmd, defaultValue)
-{
- var graph = this.editorUi.editor.graph;
- var h = 226 + ((Math.ceil(ColorDialog.prototype.presetColors.length / 12) +
- Math.ceil(ColorDialog.prototype.defaultColors.length / 12)) * 17);
-
- if (cmd != null && graph.cellEditor.isContentEditing())
- {
- // Saves and restores text selection for in-place editor
- var selState = graph.cellEditor.saveSelection();
-
- var dlg = new ColorDialog(this.editorUi, defaultValue || '000000', mxUtils.bind(this, function(color)
- {
- graph.cellEditor.restoreSelection(selState);
- document.execCommand(cmd, false, (color != mxConstants.NONE) ? color : 'transparent');
- }), function()
- {
- graph.cellEditor.restoreSelection(selState);
- });
- this.editorUi.showDialog(dlg.container, 230, h, true, true);
- dlg.init();
- }
- else
- {
- if (this.colorDialog == null)
- {
- this.colorDialog = new ColorDialog(this.editorUi);
- }
-
- this.colorDialog.currentColorKey = key;
- var state = graph.getView().getState(graph.getSelectionCell());
- var color = 'none';
-
- if (state != null)
- {
- color = state.style[key] || color;
- }
-
- if (color == 'none')
- {
- color = 'ffffff';
- this.colorDialog.picker.fromString('ffffff');
- this.colorDialog.colorInput.value = 'none';
- }
- else
- {
- this.colorDialog.picker.fromString(color);
- }
-
- this.editorUi.showDialog(this.colorDialog.container, 230, h, true, true);
- this.colorDialog.init();
- }
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Menus.prototype.toggleStyle = function(key, defaultValue)
-{
- var graph = this.editorUi.editor.graph;
- var value = graph.toggleCellStyles(key, defaultValue);
- this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [key], 'values', [value],
- 'cells', graph.getSelectionCells()));
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addMenuItem = function(menu, key, parent, trigger, sprite, label)
-{
- var action = this.editorUi.actions.get(key);
-
- if (action != null && (menu.showDisabled || action.isEnabled()) && action.visible)
- {
- var item = menu.addItem(label || action.label, null, function()
- {
- action.funct(trigger);
- }, parent, sprite, action.isEnabled());
-
- // Adds checkmark image
- if (action.toggleAction && action.isSelected())
- {
- menu.addCheckmark(item, Editor.checkmarkImage);
- }
-
- this.addShortcut(item, action);
-
- return item;
- }
-
- return null;
-};
-
-/**
- * Adds a checkmark to the given menuitem.
- */
-Menus.prototype.addShortcut = function(item, action)
-{
- if (action.shortcut != null)
- {
- var td = item.firstChild.nextSibling.nextSibling;
- var span = document.createElement('span');
- span.style.color = 'gray';
- mxUtils.write(span, action.shortcut);
- td.appendChild(span);
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addMenuItems = function(menu, keys, parent, trigger, sprites)
-{
- for (var i = 0; i < keys.length; i++)
- {
- if (keys[i] == '-')
- {
- menu.addSeparator(parent);
- }
- else
- {
- this.addMenuItem(menu, keys[i], parent, trigger, (sprites != null) ? sprites[i] : null);
- }
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.createPopupMenu = function(menu, cell, evt)
-{
- menu.smartSeparators = true;
-
- this.addPopupMenuHistoryItems(menu, cell, evt);
- this.addPopupMenuEditItems(menu, cell, evt);
- this.addPopupMenuStyleItems(menu, cell, evt);
- this.addPopupMenuArrangeItems(menu, cell, evt);
- this.addPopupMenuCellItems(menu, cell, evt);
- this.addPopupMenuSelectionItems(menu, cell, evt);
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addPopupMenuHistoryItems = function(menu, cell, evt)
-{
- if (this.editorUi.editor.graph.isSelectionEmpty())
- {
- this.addMenuItems(menu, ['undo', 'redo'], null, evt);
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addPopupMenuEditItems = function(menu, cell, evt)
-{
- if (this.editorUi.editor.graph.isSelectionEmpty())
- {
- this.addMenuItems(menu, ['pasteHere'], null, evt);
- }
- else
- {
- this.addMenuItems(menu, ['delete', '-', 'cut', 'copy', '-', 'duplicate'], null, evt);
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addPopupMenuStyleItems = function(menu, cell, evt)
-{
- if (this.editorUi.editor.graph.getSelectionCount() == 1)
- {
- this.addMenuItems(menu, ['-', 'setAsDefaultStyle'], null, evt);
- }
- else if (this.editorUi.editor.graph.isSelectionEmpty())
- {
- this.addMenuItems(menu, ['-', 'clearDefaultStyle'], null, evt);
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addPopupMenuArrangeItems = function(menu, cell, evt)
-{
- var graph = this.editorUi.editor.graph;
-
- if (!graph.isSelectionEmpty())
- {
- this.addMenuItems(menu, ['-', 'toFront', 'toBack'], null, evt);
- }
-
- if (graph.getSelectionCount() > 1)
- {
- this.addMenuItems(menu, ['-', 'group'], null, evt);
- }
- else if (graph.getSelectionCount() == 1 && !graph.getModel().isEdge(cell) &&
- !graph.isSwimlane(cell) && graph.getModel().getChildCount(cell) > 0)
- {
- this.addMenuItems(menu, ['-', 'ungroup'], null, evt);
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addPopupMenuCellItems = function(menu, cell, evt)
-{
- var graph = this.editorUi.editor.graph;
- cell = graph.getSelectionCell();
- var state = graph.view.getState(cell);
- menu.addSeparator();
-
- if (state != null)
- {
- var hasWaypoints = false;
-
- if (graph.getModel().isEdge(cell) && mxUtils.getValue(state.style, mxConstants.STYLE_EDGE, null) != 'entityRelationEdgeStyle' &&
- mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) != 'arrow')
- {
- var handler = graph.selectionCellsHandler.getHandler(cell);
- var isWaypoint = false;
-
- if (handler instanceof mxEdgeHandler && handler.bends != null && handler.bends.length > 2)
- {
- var index = handler.getHandleForEvent(graph.updateMouseEvent(new mxMouseEvent(evt)));
-
- // Configures removeWaypoint action before execution
- // Using trigger parameter is cleaner but have to find waypoint here anyway.
- var rmWaypointAction = this.editorUi.actions.get('removeWaypoint');
- rmWaypointAction.handler = handler;
- rmWaypointAction.index = index;
-
- isWaypoint = index > 0 && index < handler.bends.length - 1;
- }
-
- menu.addSeparator();
- this.addMenuItem(menu, 'turn', null, evt, null, mxResources.get('reverse'));
- this.addMenuItems(menu, [(isWaypoint) ? 'removeWaypoint' : 'addWaypoint'], null, evt);
-
- // Adds reset waypoints option if waypoints exist
- var geo = graph.getModel().getGeometry(cell);
- hasWaypoints = geo != null && geo.points != null && geo.points.length > 0;
- }
-
- if (graph.getSelectionCount() == 1 && (hasWaypoints || (graph.getModel().isVertex(cell) &&
- graph.getModel().getEdgeCount(cell) > 0)))
- {
- this.addMenuItems(menu, ['-', 'clearWaypoints'], null, evt);
- }
-
- if (graph.getSelectionCount() == 1)
- {
- this.addMenuItems(menu, ['-', 'editStyle', 'editData', 'editLink'], null, evt);
-
- // Shows edit image action if there is an image in the style
- if (graph.getModel().isVertex(cell) && mxUtils.getValue(state.style, mxConstants.STYLE_IMAGE, null) != null)
- {
- menu.addSeparator();
- this.addMenuItem(menu, 'image', null, evt).firstChild.nextSibling.innerHTML = mxResources.get('editImage') + '...';
- }
- }
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addPopupMenuSelectionItems = function(menu, cell, evt)
-{
- if (this.editorUi.editor.graph.isSelectionEmpty())
- {
- this.addMenuItems(menu, ['-', 'selectVertices', 'selectEdges', 'selectAll'], null, evt);
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.createMenubar = function(container)
-{
- var menubar = new Menubar(this.editorUi, container);
- var menus = this.defaultMenuItems;
-
- for (var i = 0; i < menus.length; i++)
- {
- (mxUtils.bind(this, function(menu)
- {
- var elt = menubar.addMenu(mxResources.get(menus[i]), mxUtils.bind(this, function()
- {
- // Allows extensions of menu.funct
- menu.funct.apply(this, arguments);
- }));
-
- this.menuCreated(menu, elt);
- }))(this.get(menus[i]));
- }
-
- return menubar;
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.menuCreated = function(menu, elt, className)
-{
- if (elt != null)
- {
- className = (className != null) ? className : 'geItem';
-
- menu.addListener('stateChanged', function()
- {
- elt.enabled = menu.enabled;
-
- if (!menu.enabled)
- {
- elt.className = className + ' mxDisabled';
-
- if (document.documentMode == 8)
- {
- elt.style.color = '#c3c3c3';
- }
- }
- else
- {
- elt.className = className;
-
- if (document.documentMode == 8)
- {
- elt.style.color = '';
- }
- }
- });
- }
-};
-
-/**
- * Construcs a new menubar for the given editor.
- */
-function Menubar(editorUi, container)
-{
- this.editorUi = editorUi;
- this.container = container;
-};
-
-/**
- * Adds the menubar elements.
- */
-Menubar.prototype.hideMenu = function()
-{
- this.editorUi.hideCurrentMenu();
-};
-
-/**
- * Adds a submenu to this menubar.
- */
-Menubar.prototype.addMenu = function(label, funct, before)
-{
- var elt = document.createElement('a');
- elt.className = 'geItem';
- mxUtils.write(elt, label);
- this.addMenuHandler(elt, funct);
-
- if (before != null)
- {
- this.container.insertBefore(elt, before);
- }
- else
- {
- this.container.appendChild(elt);
- }
-
- return elt;
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Menubar.prototype.addMenuHandler = function(elt, funct)
-{
- if (funct != null)
- {
- var show = true;
-
- var clickHandler = mxUtils.bind(this, function(evt)
- {
- if (show && elt.enabled == null || elt.enabled)
- {
- this.editorUi.editor.graph.popupMenuHandler.hideMenu();
- var menu = new mxPopupMenu(funct);
- menu.div.className += ' geMenubarMenu';
- menu.smartSeparators = true;
- menu.showDisabled = true;
- menu.autoExpand = true;
-
- // Disables autoexpand and destroys menu when hidden
- menu.hideMenu = mxUtils.bind(this, function()
- {
- mxPopupMenu.prototype.hideMenu.apply(menu, arguments);
- this.editorUi.resetCurrentMenu();
- menu.destroy();
- });
-
- var offset = mxUtils.getOffset(elt);
- menu.popup(offset.x, offset.y + elt.offsetHeight, null, evt);
- this.editorUi.setCurrentMenu(menu, elt);
- }
-
- mxEvent.consume(evt);
- });
-
- // Shows menu automatically while in expanded state
- mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt)
- {
- if (this.editorUi.currentMenu != null && this.editorUi.currentMenuElt != elt)
- {
- this.editorUi.hideCurrentMenu();
- clickHandler(evt);
- }
- }));
-
- // Hides menu if already showing and prevents focus
- mxEvent.addListener(elt, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown',
- mxUtils.bind(this, function(evt)
- {
- show = this.currentElt != elt;
- evt.preventDefault();
- }));
-
- mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt)
- {
- clickHandler(evt);
- show = true;
- }));
- }
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menubar.prototype.destroy = function()
-{
- // do nothing
-};
-
-/**
- * Constructs a new action for the given parameters.
- */
-function Menu(funct, enabled)
-{
- mxEventSource.call(this);
- this.funct = funct;
- this.enabled = (enabled != null) ? enabled : true;
-};
-
-// Menu inherits from mxEventSource
-mxUtils.extend(Menu, mxEventSource);
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Menu.prototype.isEnabled = function()
-{
- return this.enabled;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Menu.prototype.setEnabled = function(value)
-{
- if (this.enabled != value)
- {
- this.enabled = value;
- this.fireEvent(new mxEventObject('stateChanged'));
- }
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Menu.prototype.execute = function(menu, parent)
-{
- this.funct(menu, parent);
-};
-
-/**
- * "Installs" menus in EditorUi.
- */
-EditorUi.prototype.createMenus = function()
-{
- return new Menus(this);
-};
diff --git a/src/main/webapp/js/mxgraph/Shapes.js b/src/main/webapp/js/mxgraph/Shapes.js
deleted file mode 100644
index 4e19a780..00000000
--- a/src/main/webapp/js/mxgraph/Shapes.js
+++ /dev/null
@@ -1,5310 +0,0 @@
-/**
- * Copyright (c) 2006-2015, JGraph Ltd
- */
-
-/**
- * Registers shapes.
- */
-(function()
-{
- // LATER: Use this to implement striping
- function paintTableBackground(state, c, x, y, w, h, r)
- {
- if (state != null)
- {
- var graph = state.view.graph;
- var start = graph.getActualStartSize(state.cell);
- var rows = graph.model.getChildCells(state.cell, true);
-
- if (rows.length > 0)
- {
- var events = false;
-
- if (this.style != null)
- {
- events = mxUtils.getValue(this.style, mxConstants.STYLE_POINTER_EVENTS, '1') == '1';
- }
-
- if (!events)
- {
- c.pointerEvents = false;
- }
-
- var evenRowColor = mxUtils.getValue(state.style,
- 'evenRowColor', mxConstants.NONE);
- var oddRowColor = mxUtils.getValue(state.style,
- 'oddRowColor', mxConstants.NONE);
- var evenColColor = mxUtils.getValue(state.style,
- 'evenColumnColor', mxConstants.NONE);
- var oddColColor = mxUtils.getValue(state.style,
- 'oddColumnColor', mxConstants.NONE);
- var cols = graph.model.getChildCells(rows[0], true);
-
- // Paints column backgrounds
- for (var i = 0; i < cols.length; i++)
- {
- var clr = (mxUtils.mod(i, 2) == 1) ? evenColColor : oddColColor;
- var geo = graph.getCellGeometry(cols[i]);
-
- if (geo != null && clr != mxConstants.NONE)
- {
- c.setFillColor(clr);
- c.begin();
- c.moveTo(x + geo.x, y + start.y);
-
- if (r > 0 && i == cols.length - 1)
- {
- c.lineTo(x + geo.x + geo.width - r, y);
- c.quadTo(x + geo.x + geo.width, y, x + geo.x + geo.width, y + r);
- c.lineTo(x + geo.x + geo.width, y + h - r);
- c.quadTo(x + geo.x + geo.width, y + h, x + geo.x + geo.width - r, y + h);
- }
- else
- {
- c.lineTo(x + geo.x + geo.width, y + start.y);
- c.lineTo(x + geo.x + geo.width, y + h - start.height);
- }
-
- c.lineTo(x + geo.x, y + h);
- c.close();
- c.fill();
- }
- }
-
- // Paints row backgrounds
- for (var i = 0; i < rows.length; i++)
- {
- var clr = (mxUtils.mod(i, 2) == 1) ? evenRowColor : oddRowColor;
- var geo = graph.getCellGeometry(rows[i]);
-
- if (geo != null && clr != mxConstants.NONE)
- {
- var b = (i == rows.length - 1) ? y + h : y + geo.y + geo.height;
- c.setFillColor(clr);
-
- c.begin();
- c.moveTo(x + start.x, y + geo.y);
- c.lineTo(x + w - start.width, y + geo.y);
-
- if (r > 0 && i == rows.length - 1)
- {
- c.lineTo(x + w, b - r);
- c.quadTo(x + w, b, x + w - r, b);
- c.lineTo(x + r, b);
- c.quadTo(x, b, x, b - r);
- }
- else
- {
- c.lineTo(x + w - start.width, b);
- c.lineTo(x + start.x, b);
- }
-
- c.close();
- c.fill();
- }
- }
- }
- }
- };
-
- // Table Shape
- function TableShape()
- {
- mxSwimlane.call(this);
- };
-
- mxUtils.extend(TableShape, mxSwimlane);
-
- TableShape.prototype.getLabelBounds = function(rect)
- {
- var start = this.getTitleSize();
-
- if (start == 0)
- {
- return mxShape.prototype.getLabelBounds.apply(this, arguments);
- }
- else
- {
- return mxSwimlane.prototype.getLabelBounds.apply(this, arguments);
- }
- };
-
- TableShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- // LATER: Split background to add striping
- //paintTableBackground(this.state, c, x, y, w, h);
-
- var start = this.getTitleSize();
-
- if (start == 0)
- {
- mxRectangleShape.prototype.paintBackground.apply(this, arguments);
- }
- else
- {
- mxSwimlane.prototype.paintVertexShape.apply(this, arguments);
- c.translate(-x, -y);
- }
-
- this.paintForeground(c, x, y, w, h);
- };
-
- TableShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- if (this.state != null)
- {
- var flipH = this.flipH;
- var flipV = this.flipV;
-
- if (this.direction == mxConstants.DIRECTION_NORTH || this.direction == mxConstants.DIRECTION_SOUTH)
- {
- var tmp = flipH;
- flipH = flipV;
- flipV = tmp;
- }
-
- // Negative transform to avoid save/restore
- c.rotate(-this.getShapeRotation(), flipH, flipV, x + w / 2, y + h / 2);
-
- s = this.scale;
- x = this.bounds.x / s;
- y = this.bounds.y / s;
- w = this.bounds.width / s;
- h = this.bounds.height / s;
- this.paintTableForeground(c, x, y, w, h);
- }
- };
-
- TableShape.prototype.paintTableForeground = function(c, x, y, w, h)
- {
- var graph = this.state.view.graph;
- var start = graph.getActualStartSize(this.state.cell);
- var rows = graph.model.getChildCells(this.state.cell, true);
-
- if (rows.length > 0)
- {
- var rowLines = mxUtils.getValue(this.state.style,
- 'rowLines', '1') != '0';
- var columnLines = mxUtils.getValue(this.state.style,
- 'columnLines', '1') != '0';
-
- // Paints row lines
- if (rowLines)
- {
- for (var i = 1; i < rows.length; i++)
- {
- var geo = graph.getCellGeometry(rows[i]);
-
- if (geo != null)
- {
- c.begin();
- c.moveTo(x + start.x, y + geo.y);
- c.lineTo(x + w - start.width, y + geo.y);
- c.end();
- c.stroke();
- }
- }
- }
-
- if (columnLines)
- {
- var cols = graph.model.getChildCells(rows[0], true);
-
- // Paints column lines
- for (var i = 1; i < cols.length; i++)
- {
- var geo = graph.getCellGeometry(cols[i]);
-
- if (geo != null)
- {
- c.begin();
- c.moveTo(x + geo.x + start.x, y + start.y);
- c.lineTo(x + geo.x + start.x, y + h - start.height);
- c.end();
- c.stroke();
- }
- }
- }
- }
- };
-
- mxCellRenderer.registerShape('table', TableShape);
-
- // Cube Shape, supports size style
- function CubeShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(CubeShape, mxCylinder);
- CubeShape.prototype.size = 20;
- CubeShape.prototype.darkOpacity = 0;
- CubeShape.prototype.darkOpacity2 = 0;
-
- CubeShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
- var op = Math.max(-1, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'darkOpacity', this.darkOpacity))));
- var op2 = Math.max(-1, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'darkOpacity2', this.darkOpacity2))));
- c.translate(x, y);
-
- c.begin();
- c.moveTo(0, 0);
- c.lineTo(w - s, 0);
- c.lineTo(w, s);
- c.lineTo(w, h);
- c.lineTo(s, h);
- c.lineTo(0, h - s);
- c.lineTo(0, 0);
- c.close();
- c.end();
- c.fillAndStroke();
-
- if (!this.outline)
- {
- c.setShadow(false);
-
- if (op != 0)
- {
- c.setFillAlpha(Math.abs(op));
- c.setFillColor((op < 0) ? '#FFFFFF' : '#000000');
- c.begin();
- c.moveTo(0, 0);
- c.lineTo(w - s, 0);
- c.lineTo(w, s);
- c.lineTo(s, s);
- c.close();
- c.fill();
- }
-
- if (op2 != 0)
- {
- c.setFillAlpha(Math.abs(op2));
- c.setFillColor((op2 < 0) ? '#FFFFFF' : '#000000');
- c.begin();
- c.moveTo(0, 0);
- c.lineTo(s, s);
- c.lineTo(s, h);
- c.lineTo(0, h - s);
- c.close();
- c.fill();
- }
-
- c.begin();
- c.moveTo(s, h);
- c.lineTo(s, s);
- c.lineTo(0, 0);
- c.moveTo(s, s);
- c.lineTo(w, s);
- c.end();
- c.stroke();
- }
- };
- CubeShape.prototype.getLabelMargins = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- var s = parseFloat(mxUtils.getValue(this.style, 'size', this.size)) * this.scale;
-
- return new mxRectangle(s, s, 0, 0);
- }
-
- return null;
- };
-
- mxCellRenderer.registerShape('cube', CubeShape);
-
- var tan30 = Math.tan(mxUtils.toRadians(30));
- var tan30Dx = (0.5 - tan30) / 2;
-
- // Cube Shape, supports size style
- function IsoRectangleShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(IsoRectangleShape, mxActor);
- IsoRectangleShape.prototype.size = 20;
- IsoRectangleShape.prototype.redrawPath = function(path, x, y, w, h)
- {
- var m = Math.min(w, h / tan30);
-
- path.translate((w - m) / 2, (h - m) / 2 + m / 4);
- path.moveTo(0, 0.25 * m);
- path.lineTo(0.5 * m, m * tan30Dx);
- path.lineTo(m, 0.25 * m);
- path.lineTo(0.5 * m, (0.5 - tan30Dx) * m);
- path.lineTo(0, 0.25 * m);
- path.close();
- path.end();
- };
-
- mxCellRenderer.registerShape('isoRectangle', IsoRectangleShape);
-
- // Cube Shape, supports size style
- function IsoCubeShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(IsoCubeShape, mxCylinder);
- IsoCubeShape.prototype.size = 20;
- IsoCubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- var m = Math.min(w, h / (0.5 + tan30));
-
- if (isForeground)
- {
- path.moveTo(0, 0.25 * m);
- path.lineTo(0.5 * m, (0.5 - tan30Dx) * m);
- path.lineTo(m, 0.25 * m);
- path.moveTo(0.5 * m, (0.5 - tan30Dx) * m);
- path.lineTo(0.5 * m, (1 - tan30Dx) * m);
- path.end();
- }
- else
- {
- path.translate((w - m) / 2, (h - m) / 2);
- path.moveTo(0, 0.25 * m);
- path.lineTo(0.5 * m, m * tan30Dx);
- path.lineTo(m, 0.25 * m);
- path.lineTo(m, 0.75 * m);
- path.lineTo(0.5 * m, (1 - tan30Dx) * m);
- path.lineTo(0, 0.75 * m);
- path.close();
- path.end();
- }
- };
-
- mxCellRenderer.registerShape('isoCube', IsoCubeShape);
-
-
- // DataStore Shape, supports size style
- function DataStoreShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(DataStoreShape, mxCylinder);
-
- DataStoreShape.prototype.redrawPath = function(c, x, y, w, h, isForeground)
- {
- var dy = Math.min(h / 2, Math.round(h / 8) + this.strokewidth - 1);
-
- if ((isForeground && this.fill != null) || (!isForeground && this.fill == null))
- {
- c.moveTo(0, dy);
- c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
-
- // Needs separate shapes for correct hit-detection
- if (!isForeground)
- {
- c.stroke();
- c.begin();
- }
-
- c.translate(0, dy / 2);
- c.moveTo(0, dy);
- c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
-
- // Needs separate shapes for correct hit-detection
- if (!isForeground)
- {
- c.stroke();
- c.begin();
- }
-
- c.translate(0, dy / 2);
- c.moveTo(0, dy);
- c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
-
- // Needs separate shapes for correct hit-detection
- if (!isForeground)
- {
- c.stroke();
- c.begin();
- }
-
- c.translate(0, -dy);
- }
-
- if (!isForeground)
- {
- c.moveTo(0, dy);
- c.curveTo(0, -dy / 3, w, -dy / 3, w, dy);
- c.lineTo(w, h - dy);
- c.curveTo(w, h + dy / 3, 0, h + dy / 3, 0, h - dy);
- c.close();
- }
- };
- DataStoreShape.prototype.getLabelMargins = function(rect)
- {
- return new mxRectangle(0, 2.5 * Math.min(rect.height / 2,
- Math.round(rect.height / 8) + this.strokewidth - 1), 0, 0);
- }
-
- mxCellRenderer.registerShape('datastore', DataStoreShape);
-
- // Note Shape, supports size style
- function NoteShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(NoteShape, mxCylinder);
- NoteShape.prototype.size = 30;
- NoteShape.prototype.darkOpacity = 0;
-
- NoteShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
- var op = Math.max(-1, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'darkOpacity', this.darkOpacity))));
- c.translate(x, y);
-
- c.begin();
- c.moveTo(0, 0);
- c.lineTo(w - s, 0);
- c.lineTo(w, s);
- c.lineTo(w, h);
- c.lineTo(0, h);
- c.lineTo(0, 0);
- c.close();
- c.end();
- c.fillAndStroke();
-
- if (!this.outline)
- {
- c.setShadow(false);
-
- if (op != 0)
- {
- c.setFillAlpha(Math.abs(op));
- c.setFillColor((op < 0) ? '#FFFFFF' : '#000000');
- c.begin();
- c.moveTo(w - s, 0);
- c.lineTo(w - s, s);
- c.lineTo(w, s);
- c.close();
- c.fill();
- }
-
- c.begin();
- c.moveTo(w - s, 0);
- c.lineTo(w - s, s);
- c.lineTo(w, s);
- c.end();
- c.stroke();
- }
- };
-
- mxCellRenderer.registerShape('note', NoteShape);
-
- // Note Shape, supports size style
- function NoteShape2()
- {
- NoteShape.call(this);
- };
- mxUtils.extend(NoteShape2, NoteShape);
-
- mxCellRenderer.registerShape('note2', NoteShape2);
-
- // Flexible cube Shape
- function IsoCubeShape2()
- {
- mxShape.call(this);
- };
- mxUtils.extend(IsoCubeShape2, mxShape);
- IsoCubeShape2.prototype.isoAngle = 15;
-
- IsoCubeShape2.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- var isoAngle = Math.max(0.01, Math.min(94, parseFloat(mxUtils.getValue(this.style, 'isoAngle', this.isoAngle)))) * Math.PI / 200 ;
- var isoH = Math.min(w * Math.tan(isoAngle), h * 0.5);
-
- c.translate(x,y);
-
- c.begin();
- c.moveTo(w * 0.5, 0);
- c.lineTo(w, isoH);
- c.lineTo(w, h - isoH);
- c.lineTo(w * 0.5, h);
- c.lineTo(0, h - isoH);
- c.lineTo(0, isoH);
- c.close();
- c.fillAndStroke();
-
- c.setShadow(false);
-
- c.begin();
- c.moveTo(0, isoH);
- c.lineTo(w * 0.5, 2 * isoH);
- c.lineTo(w, isoH);
- c.moveTo(w * 0.5, 2 * isoH);
- c.lineTo(w * 0.5, h);
- c.stroke();
- };
-
- mxCellRenderer.registerShape('isoCube2', IsoCubeShape2);
-
- // (LEGACY) Flexible cylinder Shape
- function CylinderShape()
- {
- mxShape.call(this);
- };
-
- mxUtils.extend(CylinderShape, mxShape);
-
- CylinderShape.prototype.size = 15;
-
- CylinderShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- var size = Math.max(0, Math.min(h * 0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
-
- c.translate(x,y);
-
- if (size == 0)
- {
- c.rect(0, 0, w, h);
- c.fillAndStroke();
- }
- else
- {
- c.begin();
- c.moveTo(0, size);
- c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, 0);
- c.arcTo(w * 0.5, size, 0, 0, 1, w, size);
- c.lineTo(w, h - size);
- c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, h);
- c.arcTo(w * 0.5, size, 0, 0, 1, 0, h - size);
- c.close();
- c.fillAndStroke();
-
- c.setShadow(false);
-
- c.begin();
- c.moveTo(w, size);
- c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, 2 * size);
- c.arcTo(w * 0.5, size, 0, 0, 1, 0, size);
- c.stroke();
- }
- };
-
- mxCellRenderer.registerShape('cylinder2', CylinderShape);
-
- // Flexible cylinder3 Shape with offset label
- function CylinderShape3(bounds, fill, stroke, strokewidth)
- {
- mxShape.call(this);
- this.bounds = bounds;
- this.fill = fill;
- this.stroke = stroke;
- this.strokewidth = (strokewidth != null) ? strokewidth : 1;
- };
-
- mxUtils.extend(CylinderShape3, mxCylinder);
-
- CylinderShape3.prototype.size = 15;
-
- CylinderShape3.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- var size = Math.max(0, Math.min(h * 0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var lid = mxUtils.getValue(this.style, 'lid', true);
-
- c.translate(x,y);
-
- if (size == 0)
- {
- c.rect(0, 0, w, h);
- c.fillAndStroke();
- }
- else
- {
- c.begin();
-
- if (lid)
- {
- c.moveTo(0, size);
- c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, 0);
- c.arcTo(w * 0.5, size, 0, 0, 1, w, size);
- }
- else
- {
- c.moveTo(0, 0);
- c.arcTo(w * 0.5, size, 0, 0, 0, w * 0.5, size);
- c.arcTo(w * 0.5, size, 0, 0, 0, w, 0);
- }
-
- c.lineTo(w, h - size);
- c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, h);
- c.arcTo(w * 0.5, size, 0, 0, 1, 0, h - size);
- c.close();
- c.fillAndStroke();
-
- c.setShadow(false);
-
- if (lid)
- {
- c.begin();
- c.moveTo(w, size);
- c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, 2 * size);
- c.arcTo(w * 0.5, size, 0, 0, 1, 0, size);
- c.stroke();
- }
- }
- };
-
- mxCellRenderer.registerShape('cylinder3', CylinderShape3);
-
- // Switch Shape, supports size style
- function SwitchShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(SwitchShape, mxActor);
- SwitchShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var curve = 0.5;
- c.moveTo(0, 0);
- c.quadTo(w / 2, h * curve, w, 0);
- c.quadTo(w * (1 - curve), h / 2, w, h);
- c.quadTo(w / 2, h * (1 - curve), 0, h);
- c.quadTo(w * curve, h / 2, 0, 0);
- c.end();
- };
-
- mxCellRenderer.registerShape('switch', SwitchShape);
-
- // Folder Shape, supports tabWidth, tabHeight styles
- function FolderShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(FolderShape, mxCylinder);
- FolderShape.prototype.tabWidth = 60;
- FolderShape.prototype.tabHeight = 20;
- FolderShape.prototype.tabPosition = 'right';
- FolderShape.prototype.arcSize = 0.1;
-
- FolderShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- c.translate(x, y);
-
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'tabWidth', this.tabWidth))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'tabHeight', this.tabHeight))));
- var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
- var rounded = mxUtils.getValue(this.style, 'rounded', false);
- var absArcSize = mxUtils.getValue(this.style, 'absoluteArcSize', false);
- var arcSize = parseFloat(mxUtils.getValue(this.style, 'arcSize', this.arcSize));
-
- if (!absArcSize)
- {
- arcSize = Math.min(w, h) * arcSize;
- }
-
- arcSize = Math.min(arcSize, w * 0.5, (h - dy) * 0.5);
-
- dx = Math.max(dx, arcSize);
- dx = Math.min(w - arcSize, dx);
-
- if (!rounded)
- {
- arcSize = 0;
- }
-
- c.begin();
-
- if (tp == 'left')
- {
- c.moveTo(Math.max(arcSize, 0), dy);
- c.lineTo(Math.max(arcSize, 0), 0);
- c.lineTo(dx, 0);
- c.lineTo(dx, dy);
- }
- // Right is default
- else
- {
- c.moveTo(w - dx, dy);
- c.lineTo(w - dx, 0);
- c.lineTo(w - Math.max(arcSize, 0), 0);
- c.lineTo(w - Math.max(arcSize, 0), dy);
- }
-
- if (rounded)
- {
- c.moveTo(0, arcSize + dy);
- c.arcTo(arcSize, arcSize, 0, 0, 1, arcSize, dy);
- c.lineTo(w - arcSize, dy);
- c.arcTo(arcSize, arcSize, 0, 0, 1, w, arcSize + dy);
- c.lineTo(w, h - arcSize);
- c.arcTo(arcSize, arcSize, 0, 0, 1, w - arcSize, h);
- c.lineTo(arcSize, h);
- c.arcTo(arcSize, arcSize, 0, 0, 1, 0, h - arcSize);
- }
- else
- {
- c.moveTo(0, dy);
- c.lineTo(w, dy);
- c.lineTo(w, h);
- c.lineTo(0, h);
- }
-
- c.close();
- c.fillAndStroke();
-
- c.setShadow(false);
-
- var sym = mxUtils.getValue(this.style, 'folderSymbol', null);
-
- if (sym == 'triangle')
- {
- c.begin();
- c.moveTo(w - 30, dy + 20);
- c.lineTo(w - 20, dy + 10);
- c.lineTo(w - 10, dy + 20);
- c.close();
- c.stroke();
- }
- };
-
- mxCellRenderer.registerShape('folder', FolderShape);
-
- // Folder Shape, supports tabWidth, tabHeight styles
- function UMLStateShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(UMLStateShape, mxCylinder);
- UMLStateShape.prototype.arcSize = 0.1;
-
- UMLStateShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- c.translate(x, y);
-
-// var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'tabWidth', this.tabWidth))));
-// var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'tabHeight', this.tabHeight))));
-// var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
- var rounded = mxUtils.getValue(this.style, 'rounded', false);
- var absArcSize = mxUtils.getValue(this.style, 'absoluteArcSize', false);
- var arcSize = parseFloat(mxUtils.getValue(this.style, 'arcSize', this.arcSize));
- var connPoint = mxUtils.getValue(this.style, 'umlStateConnection', null);
-
-
- if (!absArcSize)
- {
- arcSize = Math.min(w, h) * arcSize;
- }
-
- arcSize = Math.min(arcSize, w * 0.5, h * 0.5);
-
- if (!rounded)
- {
- arcSize = 0;
- }
-
- var dx = 0;
-
- if (connPoint != null)
- {
- dx = 10;
- }
-
- c.begin();
- c.moveTo(dx, arcSize);
- c.arcTo(arcSize, arcSize, 0, 0, 1, dx + arcSize, 0);
- c.lineTo(w - arcSize, 0);
- c.arcTo(arcSize, arcSize, 0, 0, 1, w, arcSize);
- c.lineTo(w, h - arcSize);
- c.arcTo(arcSize, arcSize, 0, 0, 1, w - arcSize, h);
- c.lineTo(dx + arcSize, h);
- c.arcTo(arcSize, arcSize, 0, 0, 1, dx, h - arcSize);
- c.close();
- c.fillAndStroke();
-
- c.setShadow(false);
-
- var sym = mxUtils.getValue(this.style, 'umlStateSymbol', null);
-
- if (sym == 'collapseState')
- {
- c.roundrect(w - 40, h - 20, 10, 10, 3, 3);
- c.stroke();
- c.roundrect(w - 20, h - 20, 10, 10, 3, 3);
- c.stroke();
- c.begin();
- c.moveTo(w - 30, h - 15);
- c.lineTo(w - 20, h - 15);
- c.stroke();
- }
-
- if (connPoint == 'connPointRefEntry')
- {
- c.ellipse(0, h * 0.5 - 10, 20, 20);
- c.fillAndStroke();
- }
- else if (connPoint == 'connPointRefExit')
- {
- c.ellipse(0, h * 0.5 - 10, 20, 20);
- c.fillAndStroke();
-
- c.begin();
- c.moveTo(5, h * 0.5 - 5);
- c.lineTo(15, h * 0.5 + 5);
- c.moveTo(15, h * 0.5 - 5);
- c.lineTo(5, h * 0.5 + 5);
- c.stroke();
- }
-};
-
- mxCellRenderer.registerShape('umlState', UMLStateShape);
-
- // Card shape
- function CardShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CardShape, mxActor);
- CardShape.prototype.size = 30;
- CardShape.prototype.isRoundable = function()
- {
- return true;
- };
- CardShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w, 0), new mxPoint(w, h), new mxPoint(0, h), new mxPoint(0, s)],
- this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('card', CardShape);
-
- // Tape shape
- function TapeShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(TapeShape, mxActor);
- TapeShape.prototype.size = 0.4;
- TapeShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dy = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var fy = 1.4;
-
- c.moveTo(0, dy / 2);
- c.quadTo(w / 4, dy * fy, w / 2, dy / 2);
- c.quadTo(w * 3 / 4, dy * (1 - fy), w, dy / 2);
- c.lineTo(w, h - dy / 2);
- c.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
- c.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
- c.lineTo(0, dy / 2);
- c.close();
- c.end();
- };
-
- TapeShape.prototype.getLabelBounds = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- var size = mxUtils.getValue(this.style, 'size', this.size);
- var w = rect.width;
- var h = rect.height;
-
- if (this.direction == null ||
- this.direction == mxConstants.DIRECTION_EAST ||
- this.direction == mxConstants.DIRECTION_WEST)
- {
- var dy = h * size;
-
- return new mxRectangle(rect.x, rect.y + dy, w, h - 2 * dy);
- }
- else
- {
- var dx = w * size;
-
- return new mxRectangle(rect.x + dx, rect.y, w - 2 * dx, h);
- }
- }
-
- return rect;
- };
-
- mxCellRenderer.registerShape('tape', TapeShape);
-
- // Document shape
- function DocumentShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DocumentShape, mxActor);
- DocumentShape.prototype.size = 0.3;
- DocumentShape.prototype.getLabelMargins = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- return new mxRectangle(0, 0, 0, parseFloat(mxUtils.getValue(
- this.style, 'size', this.size)) * rect.height);
- }
-
- return null;
- };
- DocumentShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dy = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var fy = 1.4;
-
- c.moveTo(0, 0);
- c.lineTo(w, 0);
- c.lineTo(w, h - dy / 2);
- c.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
- c.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
- c.lineTo(0, dy / 2);
- c.close();
- c.end();
- };
-
- mxCellRenderer.registerShape('document', DocumentShape);
-
- var cylinderGetCylinderSize = mxCylinder.prototype.getCylinderSize;
-
- mxCylinder.prototype.getCylinderSize = function(x, y, w, h)
- {
- var size = mxUtils.getValue(this.style, 'size');
-
- if (size != null)
- {
- return h * Math.max(0, Math.min(1, size));
- }
- else
- {
- return cylinderGetCylinderSize.apply(this, arguments);
- }
- };
-
- mxCylinder.prototype.getLabelMargins = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- var size = mxUtils.getValue(this.style, 'size', 0.15) * 2;
-
- return new mxRectangle(0, Math.min(this.maxHeight * this.scale, rect.height * size), 0, 0);
- }
-
- return null;
- };
-
- CylinderShape3.prototype.getLabelMargins = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- var size = mxUtils.getValue(this.style, 'size', 15);
-
- if (!mxUtils.getValue(this.style, 'lid', true))
- {
- size /= 2;
- }
-
- return new mxRectangle(0, Math.min(rect.height * this.scale, size * 2 * this.scale), 0, Math.max(0, size * 0.3 * this.scale));
- }
-
- return null;
- };
-
- FolderShape.prototype.getLabelMargins = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- var sizeY = mxUtils.getValue(this.style, 'tabHeight', 15) * this.scale;
-
- if (mxUtils.getValue(this.style, 'labelInHeader', false))
- {
- var sizeX = mxUtils.getValue(this.style, 'tabWidth', 15) * this.scale;
- var sizeY = mxUtils.getValue(this.style, 'tabHeight', 15) * this.scale;
- var rounded = mxUtils.getValue(this.style, 'rounded', false);
- var absArcSize = mxUtils.getValue(this.style, 'absoluteArcSize', false);
- var arcSize = parseFloat(mxUtils.getValue(this.style, 'arcSize', this.arcSize));
-
- if (!absArcSize)
- {
- arcSize = Math.min(rect.width, rect.height) * arcSize;
- }
-
- arcSize = Math.min(arcSize, rect.width * 0.5, (rect.height - sizeY) * 0.5);
-
- if (!rounded)
- {
- arcSize = 0;
- }
-
- if (mxUtils.getValue(this.style, 'tabPosition', this.tabPosition) == 'left')
- {
- return new mxRectangle(arcSize, 0, Math.min(rect.width, rect.width - sizeX), Math.min(rect.height, rect.height - sizeY));
- }
- else
- {
- return new mxRectangle(Math.min(rect.width, rect.width - sizeX), 0, arcSize, Math.min(rect.height, rect.height - sizeY));
- }
- }
- else
- {
- return new mxRectangle(0, Math.min(rect.height, sizeY), 0, 0);
- }
- }
-
- return null;
- };
-
- UMLStateShape.prototype.getLabelMargins = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- var connPoint = mxUtils.getValue(this.style, 'umlStateConnection', null);
-
- if (connPoint != null)
- {
- return new mxRectangle(10 * this.scale, 0, 0, 0);
- }
- }
-
- return null;
- };
-
- NoteShape2.prototype.getLabelMargins = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- var size = mxUtils.getValue(this.style, 'size', 15);
-
- return new mxRectangle(0, Math.min(rect.height * this.scale, size * this.scale), 0, Math.max(0, size * this.scale));
- }
-
- return null;
- };
-
- // Parallelogram shape
- function ParallelogramShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(ParallelogramShape, mxActor);
- ParallelogramShape.prototype.size = 0.2;
- ParallelogramShape.prototype.fixedSize = 20;
- ParallelogramShape.prototype.isRoundable = function()
- {
- return true;
- };
- ParallelogramShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
-
- var dx = (fixed) ? Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) : w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, h), new mxPoint(dx, 0), new mxPoint(w, 0), new mxPoint(w - dx, h)],
- this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('parallelogram', ParallelogramShape);
-
- // Trapezoid shape
- function TrapezoidShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(TrapezoidShape, mxActor);
- TrapezoidShape.prototype.size = 0.2;
- TrapezoidShape.prototype.fixedSize = 20;
- TrapezoidShape.prototype.isRoundable = function()
- {
- return true;
- };
- TrapezoidShape.prototype.redrawPath = function(c, x, y, w, h)
- {
-
- var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
-
- var dx = (fixed) ? Math.max(0, Math.min(w * 0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) : w * Math.max(0, Math.min(0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, h), new mxPoint(dx, 0), new mxPoint(w - dx, 0), new mxPoint(w, h)],
- this.isRounded, arcSize, true);
- };
-
- mxCellRenderer.registerShape('trapezoid', TrapezoidShape);
-
- // Curly Bracket shape
- function CurlyBracketShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CurlyBracketShape, mxActor);
- CurlyBracketShape.prototype.size = 0.5;
- CurlyBracketShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.setFillColor(null);
- var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(w, 0), new mxPoint(s, 0), new mxPoint(s, h / 2),
- new mxPoint(0, h / 2), new mxPoint(s, h / 2), new mxPoint(s, h),
- new mxPoint(w, h)], this.isRounded, arcSize, false);
- c.end();
- };
-
- mxCellRenderer.registerShape('curlyBracket', CurlyBracketShape);
-
- // Parallel marker shape
- function ParallelMarkerShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(ParallelMarkerShape, mxActor);
- ParallelMarkerShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.setStrokeWidth(1);
- c.setFillColor(this.stroke);
- var w2 = w / 5;
- c.rect(0, 0, w2, h);
- c.fillAndStroke();
- c.rect(2 * w2, 0, w2, h);
- c.fillAndStroke();
- c.rect(4 * w2, 0, w2, h);
- c.fillAndStroke();
- };
-
- mxCellRenderer.registerShape('parallelMarker', ParallelMarkerShape);
-
- /**
- * Adds handJiggle style (jiggle=n sets jiggle)
- */
- function HandJiggle(canvas, defaultVariation)
- {
- this.canvas = canvas;
-
- // Avoids "spikes" in the output
- this.canvas.setLineJoin('round');
- this.canvas.setLineCap('round');
-
- this.defaultVariation = defaultVariation;
-
- this.originalLineTo = this.canvas.lineTo;
- this.canvas.lineTo = mxUtils.bind(this, HandJiggle.prototype.lineTo);
-
- this.originalMoveTo = this.canvas.moveTo;
- this.canvas.moveTo = mxUtils.bind(this, HandJiggle.prototype.moveTo);
-
- this.originalClose = this.canvas.close;
- this.canvas.close = mxUtils.bind(this, HandJiggle.prototype.close);
-
- this.originalQuadTo = this.canvas.quadTo;
- this.canvas.quadTo = mxUtils.bind(this, HandJiggle.prototype.quadTo);
-
- this.originalCurveTo = this.canvas.curveTo;
- this.canvas.curveTo = mxUtils.bind(this, HandJiggle.prototype.curveTo);
-
- this.originalArcTo = this.canvas.arcTo;
- this.canvas.arcTo = mxUtils.bind(this, HandJiggle.prototype.arcTo);
- };
-
- HandJiggle.prototype.moveTo = function(endX, endY)
- {
- this.originalMoveTo.apply(this.canvas, arguments);
- this.lastX = endX;
- this.lastY = endY;
- this.firstX = endX;
- this.firstY = endY;
- };
-
- HandJiggle.prototype.close = function()
- {
- if (this.firstX != null && this.firstY != null)
- {
- this.lineTo(this.firstX, this.firstY);
- this.originalClose.apply(this.canvas, arguments);
- }
-
- this.originalClose.apply(this.canvas, arguments);
- };
-
- HandJiggle.prototype.quadTo = function(x1, y1, x2, y2)
- {
- this.originalQuadTo.apply(this.canvas, arguments);
- this.lastX = x2;
- this.lastY = y2;
- };
-
- HandJiggle.prototype.curveTo = function(x1, y1, x2, y2, x3, y3)
- {
- this.originalCurveTo.apply(this.canvas, arguments);
- this.lastX = x3;
- this.lastY = y3;
- };
-
- HandJiggle.prototype.arcTo = function(rx, ry, angle, largeArcFlag, sweepFlag, x, y)
- {
- this.originalArcTo.apply(this.canvas, arguments);
- this.lastX = x;
- this.lastY = y;
- };
-
- HandJiggle.prototype.lineTo = function(endX, endY)
- {
- // LATER: Check why this.canvas.lastX cannot be used
- if (this.lastX != null && this.lastY != null)
- {
- var dx = Math.abs(endX - this.lastX);
- var dy = Math.abs(endY - this.lastY);
- var dist = Math.sqrt(dx * dx + dy * dy);
-
- if (dist < 2)
- {
- this.originalLineTo.apply(this.canvas, arguments);
- this.lastX = endX;
- this.lastY = endY;
-
- return;
- }
-
- var segs = Math.round(dist / 10);
- var variation = this.defaultVariation;
-
- if (segs < 5)
- {
- segs = 5;
- variation /= 3;
- }
-
- function sign(x)
- {
- return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
- }
-
- var stepX = sign(endX - this.lastX) * dx / segs;
- var stepY = sign(endY - this.lastY) * dy / segs;
-
- var fx = dx / dist;
- var fy = dy / dist;
-
- for (var s = 0; s < segs; s++)
- {
- var x = stepX * s + this.lastX;
- var y = stepY * s + this.lastY;
-
- var offset = (Math.random() - 0.5) * variation;
- this.originalLineTo.call(this.canvas, x - offset * fy, y - offset * fx);
- }
-
- this.originalLineTo.call(this.canvas, endX, endY);
- this.lastX = endX;
- this.lastY = endY;
- }
- else
- {
- this.originalLineTo.apply(this.canvas, arguments);
- this.lastX = endX;
- this.lastY = endY;
- }
- };
-
- HandJiggle.prototype.destroy = function()
- {
- this.canvas.lineTo = this.originalLineTo;
- this.canvas.moveTo = this.originalMoveTo;
- this.canvas.close = this.originalClose;
- this.canvas.quadTo = this.originalQuadTo;
- this.canvas.curveTo = this.originalCurveTo;
- this.canvas.arcTo = this.originalArcTo;
- };
-
- // Installs hand jiggle for comic and sketch style
- mxShape.prototype.defaultJiggle = 1.5;
-
- var shapeBeforePaint = mxShape.prototype.beforePaint;
- mxShape.prototype.beforePaint = function(c)
- {
- shapeBeforePaint.apply(this, arguments);
-
- if (c.handJiggle == null)
- {
- c.handJiggle = this.createHandJiggle(c);
- }
- };
-
- var shapeAfterPaint = mxShape.prototype.afterPaint;
- mxShape.prototype.afterPaint = function(c)
- {
- shapeAfterPaint.apply(this, arguments);
-
- if (c.handJiggle != null)
- {
- c.handJiggle.destroy();
- delete c.handJiggle;
- }
- };
-
- // Returns a new HandJiggle canvas
- mxShape.prototype.createComicCanvas = function(c)
- {
- return new HandJiggle(c, mxUtils.getValue(this.style, 'jiggle', this.defaultJiggle));
- };
-
- // Overrides to avoid call to rect
- mxShape.prototype.createHandJiggle = function(c)
- {
- if (!this.outline && this.style != null && mxUtils.getValue(this.style, 'comic', '0') != '0')
- {
- return this.createComicCanvas(c);
- }
-
- return null;
- };
-
- // Sets default jiggle for diamond
- mxRhombus.prototype.defaultJiggle = 2;
-
- // Overrides to avoid call to rect
- var mxRectangleShapeIsHtmlAllowed0 = mxRectangleShape.prototype.isHtmlAllowed;
- mxRectangleShape.prototype.isHtmlAllowed = function()
- {
- return !this.outline && (this.style == null || (mxUtils.getValue(this.style, 'comic', '0') == '0' &&
- mxUtils.getValue(this.style, 'sketch', (urlParams['rough'] == '1') ? '1' : '0') == '0')) &&
- mxRectangleShapeIsHtmlAllowed0.apply(this, arguments);
- };
-
- var mxRectangleShapePaintBackground0 = mxRectangleShape.prototype.paintBackground;
- mxRectangleShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- if (c.handJiggle == null || c.handJiggle.constructor != HandJiggle)
- {
- mxRectangleShapePaintBackground0.apply(this, arguments);
- }
- else
- {
- var events = true;
-
- if (this.style != null)
- {
- events = mxUtils.getValue(this.style, mxConstants.STYLE_POINTER_EVENTS, '1') == '1';
- }
-
- if (events || (this.fill != null && this.fill != mxConstants.NONE) ||
- (this.stroke != null && this.stroke != mxConstants.NONE))
- {
- if (!events && (this.fill == null || this.fill == mxConstants.NONE))
- {
- c.pointerEvents = false;
- }
-
- c.begin();
-
- if (this.isRounded)
- {
- var r = 0;
-
- if (mxUtils.getValue(this.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1')
- {
- r = Math.min(w / 2, Math.min(h / 2, mxUtils.getValue(this.style,
- mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2));
- }
- else
- {
- var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- r = Math.min(w * f, h * f);
- }
-
- c.moveTo(x + r, y);
- c.lineTo(x + w - r, y);
- c.quadTo(x + w, y, x + w, y + r);
- c.lineTo(x + w, y + h - r);
- c.quadTo(x + w, y + h, x + w - r, y + h);
- c.lineTo(x + r, y + h);
- c.quadTo(x, y + h, x, y + h - r);
- c.lineTo(x, y + r);
- c.quadTo(x, y, x + r, y);
- }
- else
- {
- c.moveTo(x, y);
- c.lineTo(x + w, y);
- c.lineTo(x + w, y + h);
- c.lineTo(x, y + h);
- c.lineTo(x, y);
- }
-
- // LATER: Check if close is needed here
- c.close();
- c.end();
-
- c.fillAndStroke();
- }
- }
- };
-
- /**
- * Disables glass effect with hand jiggle.
- */
- var mxRectangleShapePaintForeground0 = mxRectangleShape.prototype.paintForeground;
- mxRectangleShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- if (c.handJiggle == null)
- {
- mxRectangleShapePaintForeground0.apply(this, arguments);
- }
- };
-
- // End of hand jiggle integration
-
- // Process Shape
- function ProcessShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(ProcessShape, mxRectangleShape);
- ProcessShape.prototype.size = 0.1;
- ProcessShape.prototype.fixedSize = false;
-
- ProcessShape.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- ProcessShape.prototype.getLabelBounds = function(rect)
- {
- if (mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, true) ==
- (this.direction == null ||
- this.direction == mxConstants.DIRECTION_EAST ||
- this.direction == mxConstants.DIRECTION_WEST))
- {
- var w = rect.width;
- var h = rect.height;
- var r = new mxRectangle(rect.x, rect.y, w, h);
-
- var inset = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
-
- if (this.isRounded)
- {
- var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- inset = Math.max(inset, Math.min(w * f, h * f));
- }
-
- r.x += Math.round(inset);
- r.width -= Math.round(2 * inset);
-
- return r;
- }
-
- return rect;
- };
- ProcessShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- var isFixedSize = mxUtils.getValue(this.style, 'fixedSize', this.fixedSize);
- var inset = parseFloat(mxUtils.getValue(this.style, 'size', this.size));
-
- if (isFixedSize)
- {
- inset = Math.max(0, Math.min(w, inset));
- }
- else
- {
- inset = w * Math.max(0, Math.min(1, inset));
- }
-
-
- if (this.isRounded)
- {
- var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- inset = Math.max(inset, Math.min(w * f, h * f));
- }
-
- // Crisp rendering of inner lines
- inset = Math.round(inset);
-
- c.begin();
- c.moveTo(x + inset, y);
- c.lineTo(x + inset, y + h);
- c.moveTo(x + w - inset, y);
- c.lineTo(x + w - inset, y + h);
- c.end();
- c.stroke();
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- };
-
- mxCellRenderer.registerShape('process', ProcessShape);
-
- // Transparent Shape
- function TransparentShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(TransparentShape, mxRectangleShape);
- TransparentShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- c.setFillColor(mxConstants.NONE);
- c.rect(x, y, w, h);
- c.fill();
- };
- TransparentShape.prototype.paintForeground = function(c, x, y, w, h) { };
-
- mxCellRenderer.registerShape('transparent', TransparentShape);
-
- // Callout shape
- function CalloutShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CalloutShape, mxHexagon);
- CalloutShape.prototype.size = 30;
- CalloutShape.prototype.position = 0.5;
- CalloutShape.prototype.position2 = 0.5;
- CalloutShape.prototype.base = 20;
- CalloutShape.prototype.getLabelMargins = function()
- {
- return new mxRectangle(0, 0, 0, parseFloat(mxUtils.getValue(
- this.style, 'size', this.size)) * this.scale);
- };
- CalloutShape.prototype.isRoundable = function()
- {
- return true;
- };
- CalloutShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- var s = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var dx = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position', this.position))));
- var dx2 = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position2', this.position2))));
- var base = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'base', this.base))));
-
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, h - s),
- new mxPoint(Math.min(w, dx + base), h - s), new mxPoint(dx2, h),
- new mxPoint(Math.max(0, dx), h - s), new mxPoint(0, h - s)],
- this.isRounded, arcSize, true, [4]);
- };
-
- mxCellRenderer.registerShape('callout', CalloutShape);
-
- // Step shape
- function StepShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(StepShape, mxActor);
- StepShape.prototype.size = 0.2;
- StepShape.prototype.fixedSize = 20;
- StepShape.prototype.isRoundable = function()
- {
- return true;
- };
- StepShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
- var s = (fixed) ? Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) :
- w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w - s, 0), new mxPoint(w, h / 2), new mxPoint(w - s, h),
- new mxPoint(0, h), new mxPoint(s, h / 2)], this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('step', StepShape);
-
- // Hexagon shape
- function HexagonShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(HexagonShape, mxHexagon);
- HexagonShape.prototype.size = 0.25;
- HexagonShape.prototype.fixedSize = 20;
- HexagonShape.prototype.isRoundable = function()
- {
- return true;
- };
- HexagonShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
- var s = (fixed) ? Math.max(0, Math.min(w * 0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) :
- w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w - s, 0), new mxPoint(w, 0.5 * h), new mxPoint(w - s, h),
- new mxPoint(s, h), new mxPoint(0, 0.5 * h)], this.isRounded, arcSize, true);
- };
-
- mxCellRenderer.registerShape('hexagon', HexagonShape);
-
- // Plus Shape
- function PlusShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(PlusShape, mxRectangleShape);
- PlusShape.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- PlusShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- var border = Math.min(w / 5, h / 5) + 1;
-
- c.begin();
- c.moveTo(x + w / 2, y + border);
- c.lineTo(x + w / 2, y + h - border);
- c.moveTo(x + border, y + h / 2);
- c.lineTo(x + w - border, y + h / 2);
- c.end();
- c.stroke();
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- };
-
- mxCellRenderer.registerShape('plus', PlusShape);
-
- // Overrides painting of rhombus shape to allow for double style
- var mxRhombusPaintVertexShape = mxRhombus.prototype.paintVertexShape;
- mxRhombus.prototype.getLabelBounds = function(rect)
- {
- if (this.style['double'] == 1)
- {
- var margin = (Math.max(2, this.strokewidth + 1) * 2 + parseFloat(
- this.style[mxConstants.STYLE_MARGIN] || 0)) * this.scale;
-
- return new mxRectangle(rect.x + margin, rect.y + margin,
- rect.width - 2 * margin, rect.height - 2 * margin);
- }
-
- return rect;
- };
- mxRhombus.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxRhombusPaintVertexShape.apply(this, arguments);
-
- if (!this.outline && this.style['double'] == 1)
- {
- var margin = Math.max(2, this.strokewidth + 1) * 2 +
- parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0);
- x += margin;
- y += margin;
- w -= 2 * margin;
- h -= 2 * margin;
-
- if (w > 0 && h > 0)
- {
- c.setShadow(false);
-
- // Workaround for closure compiler bug where the lines with x and y above
- // are removed if arguments is used as second argument in call below.
- mxRhombusPaintVertexShape.apply(this, [c, x, y, w, h]);
- }
- }
- };
-
- // CompositeShape
- function ExtendedShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(ExtendedShape, mxRectangleShape);
- ExtendedShape.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- ExtendedShape.prototype.getLabelBounds = function(rect)
- {
- if (this.style['double'] == 1)
- {
- var margin = (Math.max(2, this.strokewidth + 1) + parseFloat(
- this.style[mxConstants.STYLE_MARGIN] || 0)) * this.scale;
-
- return new mxRectangle(rect.x + margin, rect.y + margin,
- rect.width - 2 * margin, rect.height - 2 * margin);
- }
-
- return rect;
- };
-
- ExtendedShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- if (this.style != null)
- {
- if (!this.outline && this.style['double'] == 1)
- {
- var margin = Math.max(2, this.strokewidth + 1) + parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0);
- x += margin;
- y += margin;
- w -= 2 * margin;
- h -= 2 * margin;
-
- if (w > 0 && h > 0)
- {
- mxRectangleShape.prototype.paintBackground.apply(this, arguments);
- }
- }
-
- c.setDashed(false);
-
- // Draws the symbols defined in the style. The symbols are
- // numbered from 1...n. Possible postfixes are align,
- // verticalAlign, spacing, arcSpacing, width, height
- var counter = 0;
- var shape = null;
-
- do
- {
- shape = mxCellRenderer.defaultShapes[this.style['symbol' + counter]];
-
- if (shape != null)
- {
- var align = this.style['symbol' + counter + 'Align'];
- var valign = this.style['symbol' + counter + 'VerticalAlign'];
- var width = this.style['symbol' + counter + 'Width'];
- var height = this.style['symbol' + counter + 'Height'];
- var spacing = this.style['symbol' + counter + 'Spacing'] || 0;
- var vspacing = this.style['symbol' + counter + 'VSpacing'] || spacing;
- var arcspacing = this.style['symbol' + counter + 'ArcSpacing'];
-
- if (arcspacing != null)
- {
- var arcSize = this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
- spacing += arcSize;
- vspacing += arcSize;
- }
-
- var x2 = x;
- var y2 = y;
-
- if (align == mxConstants.ALIGN_CENTER)
- {
- x2 += (w - width) / 2;
- }
- else if (align == mxConstants.ALIGN_RIGHT)
- {
- x2 += w - width - spacing;
- }
- else
- {
- x2 += spacing;
- }
-
- if (valign == mxConstants.ALIGN_MIDDLE)
- {
- y2 += (h - height) / 2;
- }
- else if (valign == mxConstants.ALIGN_BOTTOM)
- {
- y2 += h - height - vspacing;
- }
- else
- {
- y2 += vspacing;
- }
-
- c.save();
-
- // Small hack to pass style along into subshape
- var tmp = new shape();
- // TODO: Clone style and override settings (eg. strokewidth)
- tmp.style = this.style;
- shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height);
- c.restore();
- }
-
- counter++;
- }
- while (shape != null);
- }
-
- // Paints glass effect
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- };
-
- mxCellRenderer.registerShape('ext', ExtendedShape);
-
- // Tape Shape, supports size style
- function MessageShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(MessageShape, mxCylinder);
- MessageShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- if (isForeground)
- {
- path.moveTo(0, 0);
- path.lineTo(w / 2, h / 2);
- path.lineTo(w, 0);
- path.end();
- }
- else
- {
- path.moveTo(0, 0);
- path.lineTo(w, 0);
- path.lineTo(w, h);
- path.lineTo(0, h);
- path.close();
- }
- };
-
- mxCellRenderer.registerShape('message', MessageShape);
-
- // UML Actor Shape
- function UmlActorShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlActorShape, mxShape);
- UmlActorShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- c.translate(x, y);
-
- // Head
- c.ellipse(w / 4, 0, w / 2, h / 4);
- c.fillAndStroke();
-
- c.begin();
- c.moveTo(w / 2, h / 4);
- c.lineTo(w / 2, 2 * h / 3);
-
- // Arms
- c.moveTo(w / 2, h / 3);
- c.lineTo(0, h / 3);
- c.moveTo(w / 2, h / 3);
- c.lineTo(w, h / 3);
-
- // Legs
- c.moveTo(w / 2, 2 * h / 3);
- c.lineTo(0, h);
- c.moveTo(w / 2, 2 * h / 3);
- c.lineTo(w, h);
- c.end();
-
- c.stroke();
- };
-
- // Replaces existing actor shape
- mxCellRenderer.registerShape('umlActor', UmlActorShape);
-
- // UML Boundary Shape
- function UmlBoundaryShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlBoundaryShape, mxShape);
- UmlBoundaryShape.prototype.getLabelMargins = function(rect)
- {
- return new mxRectangle(rect.width / 6, 0, 0, 0);
- };
- UmlBoundaryShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- c.translate(x, y);
-
- // Base line
- c.begin();
- c.moveTo(0, h / 4);
- c.lineTo(0, h * 3 / 4);
- c.end();
- c.stroke();
-
- // Horizontal line
- c.begin();
- c.moveTo(0, h / 2);
- c.lineTo(w / 6, h / 2);
- c.end();
- c.stroke();
-
- // Circle
- c.ellipse(w / 6, 0, w * 5 / 6, h);
- c.fillAndStroke();
- };
-
- // Replaces existing actor shape
- mxCellRenderer.registerShape('umlBoundary', UmlBoundaryShape);
-
- // UML Entity Shape
- function UmlEntityShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(UmlEntityShape, mxEllipse);
- UmlEntityShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
-
- c.begin();
- c.moveTo(x + w / 8, y + h);
- c.lineTo(x + w * 7 / 8, y + h);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('umlEntity', UmlEntityShape);
-
- // UML Destroy Shape
- function UmlDestroyShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlDestroyShape, mxShape);
- UmlDestroyShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- c.translate(x, y);
-
- c.begin();
- c.moveTo(w, 0);
- c.lineTo(0, h);
- c.moveTo(0, 0);
- c.lineTo(w, h);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('umlDestroy', UmlDestroyShape);
-
- // UML Control Shape
- function UmlControlShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlControlShape, mxShape);
- UmlControlShape.prototype.getLabelBounds = function(rect)
- {
- return new mxRectangle(rect.x, rect.y + rect.height / 8, rect.width, rect.height * 7 / 8);
- };
- UmlControlShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- c.translate(x, y);
-
- // Upper line
- c.begin();
- c.moveTo(w * 3 / 8, h / 8 * 1.1);
- c.lineTo(w * 5 / 8, 0);
- c.end();
- c.stroke();
-
- // Circle
- c.ellipse(0, h / 8, w, h * 7 / 8);
- c.fillAndStroke();
- };
- UmlControlShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- // Lower line
- c.begin();
- c.moveTo(w * 3 / 8, h / 8 * 1.1);
- c.lineTo(w * 5 / 8, h / 4);
- c.end();
- c.stroke();
- };
-
- // Replaces existing actor shape
- mxCellRenderer.registerShape('umlControl', UmlControlShape);
-
- // UML Lifeline Shape
- function UmlLifeline()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(UmlLifeline, mxRectangleShape);
- UmlLifeline.prototype.size = 40;
- UmlLifeline.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- UmlLifeline.prototype.getLabelBounds = function(rect)
- {
- var size = Math.max(0, Math.min(rect.height, parseFloat(
- mxUtils.getValue(this.style, 'size', this.size)) * this.scale));
-
- return new mxRectangle(rect.x, rect.y, rect.width, size);
- };
- UmlLifeline.prototype.paintBackground = function(c, x, y, w, h)
- {
- var size = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var participant = mxUtils.getValue(this.style, 'participant');
-
- if (participant == null || this.state == null)
- {
- mxRectangleShape.prototype.paintBackground.call(this, c, x, y, w, size);
- }
- else
- {
- var ctor = this.state.view.graph.cellRenderer.getShape(participant);
-
- if (ctor != null && ctor != UmlLifeline)
- {
- var shape = new ctor();
- shape.apply(this.state);
- c.save();
- shape.paintVertexShape(c, x, y, w, size);
- c.restore();
- }
- }
-
- if (size < h)
- {
- c.setDashed(true);
- c.begin();
- c.moveTo(x + w / 2, y + size);
- c.lineTo(x + w / 2, y + h);
- c.end();
- c.stroke();
- }
- };
- UmlLifeline.prototype.paintForeground = function(c, x, y, w, h)
- {
- var size = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- mxRectangleShape.prototype.paintForeground.call(this, c, x, y, w, Math.min(h, size));
- };
-
- mxCellRenderer.registerShape('umlLifeline', UmlLifeline);
-
- // UML Frame Shape
- function UmlFrame()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlFrame, mxShape);
- UmlFrame.prototype.width = 60;
- UmlFrame.prototype.height = 30;
- UmlFrame.prototype.corner = 10;
- UmlFrame.prototype.getLabelMargins = function(rect)
- {
- return new mxRectangle(0, 0,
- rect.width - (parseFloat(mxUtils.getValue(this.style, 'width', this.width) * this.scale)),
- rect.height - (parseFloat(mxUtils.getValue(this.style, 'height', this.height) * this.scale)));
- };
- UmlFrame.prototype.paintBackground = function(c, x, y, w, h)
- {
- var co = this.corner;
- var w0 = Math.min(w, Math.max(co, parseFloat(mxUtils.getValue(this.style, 'width', this.width))));
- var h0 = Math.min(h, Math.max(co * 1.5, parseFloat(mxUtils.getValue(this.style, 'height', this.height))));
- var bg = mxUtils.getValue(this.style, mxConstants.STYLE_SWIMLANE_FILLCOLOR, mxConstants.NONE);
-
- if (bg != mxConstants.NONE)
- {
- c.setFillColor(bg);
- c.rect(x, y, w, h);
- c.fill();
- }
-
- if (this.fill != null && this.fill != mxConstants.NONE && this.gradient && this.gradient != mxConstants.NONE)
- {
- var b = this.getGradientBounds(c, x, y, w, h);
- c.setGradient(this.fill, this.gradient, x, y, w, h, this.gradientDirection);
- }
- else
- {
- c.setFillColor(this.fill);
- }
-
- c.begin();
- c.moveTo(x, y);
- c.lineTo(x + w0, y);
- c.lineTo(x + w0, y + Math.max(0, h0 - co * 1.5));
- c.lineTo(x + Math.max(0, w0 - co), y + h0);
- c.lineTo(x, y + h0);
- c.close();
- c.fillAndStroke();
-
- c.begin();
- c.moveTo(x + w0, y);
- c.lineTo(x + w, y);
- c.lineTo(x + w, y + h);
- c.lineTo(x, y + h);
- c.lineTo(x, y + h0);
- c.stroke();
- };
-
- mxCellRenderer.registerShape('umlFrame', UmlFrame);
-
- mxPerimeter.LifelinePerimeter = function (bounds, vertex, next, orthogonal)
- {
- var size = UmlLifeline.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size) * vertex.view.scale;
- }
-
- var sw = (parseFloat(vertex.style[mxConstants.STYLE_STROKEWIDTH] || 1) * vertex.view.scale / 2) - 1;
-
- if (next.x < bounds.getCenterX())
- {
- sw += 1;
- sw *= -1;
- }
-
- return new mxPoint(bounds.getCenterX() + sw, Math.min(bounds.y + bounds.height,
- Math.max(bounds.y + size, next.y)));
- };
-
- mxStyleRegistry.putValue('lifelinePerimeter', mxPerimeter.LifelinePerimeter);
-
- mxPerimeter.OrthogonalPerimeter = function (bounds, vertex, next, orthogonal)
- {
- orthogonal = true;
-
- return mxPerimeter.RectanglePerimeter.apply(this, arguments);
- };
-
- mxStyleRegistry.putValue('orthogonalPerimeter', mxPerimeter.OrthogonalPerimeter);
-
- mxPerimeter.BackbonePerimeter = function (bounds, vertex, next, orthogonal)
- {
- var sw = (parseFloat(vertex.style[mxConstants.STYLE_STROKEWIDTH] || 1) * vertex.view.scale / 2) - 1;
-
- if (vertex.style['backboneSize'] != null)
- {
- sw += (parseFloat(vertex.style['backboneSize']) * vertex.view.scale / 2) - 1;
- }
-
- if (vertex.style[mxConstants.STYLE_DIRECTION] == 'south' ||
- vertex.style[mxConstants.STYLE_DIRECTION] == 'north')
- {
- if (next.x < bounds.getCenterX())
- {
- sw += 1;
- sw *= -1;
- }
-
- return new mxPoint(bounds.getCenterX() + sw, Math.min(bounds.y + bounds.height,
- Math.max(bounds.y, next.y)));
- }
- else
- {
- if (next.y < bounds.getCenterY())
- {
- sw += 1;
- sw *= -1;
- }
-
- return new mxPoint(Math.min(bounds.x + bounds.width, Math.max(bounds.x, next.x)),
- bounds.getCenterY() + sw);
- }
- };
-
- mxStyleRegistry.putValue('backbonePerimeter', mxPerimeter.BackbonePerimeter);
-
- // Callout Perimeter
- mxPerimeter.CalloutPerimeter = function (bounds, vertex, next, orthogonal)
- {
- return mxPerimeter.RectanglePerimeter(mxUtils.getDirectedBounds(bounds, new mxRectangle(0, 0, 0,
- Math.max(0, Math.min(bounds.height, parseFloat(mxUtils.getValue(vertex.style, 'size',
- CalloutShape.prototype.size)) * vertex.view.scale))),
- vertex.style), vertex, next, orthogonal);
- };
-
- mxStyleRegistry.putValue('calloutPerimeter', mxPerimeter.CalloutPerimeter);
-
- // Parallelogram Perimeter
- mxPerimeter.ParallelogramPerimeter = function (bounds, vertex, next, orthogonal)
- {
- var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0';
- var size = (fixed) ? ParallelogramShape.prototype.fixedSize : ParallelogramShape.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size);
- }
-
- if (fixed)
- {
- size *= vertex.view.scale;
- }
-
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
-
- var direction = (vertex != null) ? mxUtils.getValue(
- vertex.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
- var vertical = direction == mxConstants.DIRECTION_NORTH ||
- direction == mxConstants.DIRECTION_SOUTH;
- var points;
-
- if (vertical)
- {
- var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(x + w, y + dy),
- new mxPoint(x + w, y + h), new mxPoint(x, y + h - dy), new mxPoint(x, y)];
- }
- else
- {
- var dx = (fixed) ? Math.max(0, Math.min(w * 0.5, size)) : w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x + dx, y), new mxPoint(x + w, y),
- new mxPoint(x + w - dx, y + h), new mxPoint(x, y + h), new mxPoint(x + dx, y)];
- }
-
- var cx = bounds.getCenterX();
- var cy = bounds.getCenterY();
-
- var p1 = new mxPoint(cx, cy);
-
- if (orthogonal)
- {
- if (next.x < x || next.x > x + w)
- {
- p1.y = next.y;
- }
- else
- {
- p1.x = next.x;
- }
- }
-
- return mxUtils.getPerimeterPoint(points, p1, next);
- };
-
- mxStyleRegistry.putValue('parallelogramPerimeter', mxPerimeter.ParallelogramPerimeter);
-
- // Trapezoid Perimeter
- mxPerimeter.TrapezoidPerimeter = function (bounds, vertex, next, orthogonal)
- {
- var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0';
- var size = (fixed) ? TrapezoidShape.prototype.fixedSize : TrapezoidShape.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size);
- }
-
- if (fixed)
- {
- size *= vertex.view.scale;
- }
-
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
-
- var direction = (vertex != null) ? mxUtils.getValue(
- vertex.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
- var points = [];
-
- if (direction == mxConstants.DIRECTION_EAST)
- {
- var dx = (fixed) ? Math.max(0, Math.min(w * 0.5, size)) : w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x + dx, y), new mxPoint(x + w - dx, y),
- new mxPoint(x + w, y + h), new mxPoint(x, y + h), new mxPoint(x + dx, y)];
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(x + w, y),
- new mxPoint(x + w - dx, y + h), new mxPoint(x + dx, y + h), new mxPoint(x, y)];
- }
- else if (direction == mxConstants.DIRECTION_NORTH)
- {
- var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y + dy), new mxPoint(x + w, y),
- new mxPoint(x + w, y + h), new mxPoint(x, y + h - dy), new mxPoint(x, y + dy)];
- }
- else
- {
- var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(x + w, y + dy),
- new mxPoint(x + w, y + h - dy), new mxPoint(x, y + h), new mxPoint(x, y)];
- }
-
- var cx = bounds.getCenterX();
- var cy = bounds.getCenterY();
-
- var p1 = new mxPoint(cx, cy);
-
- if (orthogonal)
- {
- if (next.x < x || next.x > x + w)
- {
- p1.y = next.y;
- }
- else
- {
- p1.x = next.x;
- }
- }
-
- return mxUtils.getPerimeterPoint(points, p1, next);
- };
-
- mxStyleRegistry.putValue('trapezoidPerimeter', mxPerimeter.TrapezoidPerimeter);
-
- // Step Perimeter
- mxPerimeter.StepPerimeter = function (bounds, vertex, next, orthogonal)
- {
- var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0';
- var size = (fixed) ? StepShape.prototype.fixedSize : StepShape.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size);
- }
-
- if (fixed)
- {
- size *= vertex.view.scale;
- }
-
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
-
- var cx = bounds.getCenterX();
- var cy = bounds.getCenterY();
-
- var direction = (vertex != null) ? mxUtils.getValue(
- vertex.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
- var points;
-
- if (direction == mxConstants.DIRECTION_EAST)
- {
- var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(x + w - dx, y), new mxPoint(x + w, cy),
- new mxPoint(x + w - dx, y + h), new mxPoint(x, y + h),
- new mxPoint(x + dx, cy), new mxPoint(x, y)];
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x + dx, y), new mxPoint(x + w, y), new mxPoint(x + w - dx, cy),
- new mxPoint(x + w, y + h), new mxPoint(x + dx, y + h),
- new mxPoint(x, cy), new mxPoint(x + dx, y)];
- }
- else if (direction == mxConstants.DIRECTION_NORTH)
- {
- var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y + dy), new mxPoint(cx, y), new mxPoint(x + w, y + dy),
- new mxPoint(x + w, y + h), new mxPoint(cx, y + h - dy),
- new mxPoint(x, y + h), new mxPoint(x, y + dy)];
- }
- else
- {
- var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(cx, y + dy), new mxPoint(x + w, y),
- new mxPoint(x + w, y + h - dy), new mxPoint(cx, y + h),
- new mxPoint(x, y + h - dy), new mxPoint(x, y)];
- }
-
- var p1 = new mxPoint(cx, cy);
-
- if (orthogonal)
- {
- if (next.x < x || next.x > x + w)
- {
- p1.y = next.y;
- }
- else
- {
- p1.x = next.x;
- }
- }
-
- return mxUtils.getPerimeterPoint(points, p1, next);
- };
-
- mxStyleRegistry.putValue('stepPerimeter', mxPerimeter.StepPerimeter);
-
- // Hexagon Perimeter 2 (keep existing one)
- mxPerimeter.HexagonPerimeter2 = function (bounds, vertex, next, orthogonal)
- {
- var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0';
- var size = (fixed) ? HexagonShape.prototype.fixedSize : HexagonShape.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size);
- }
-
- if (fixed)
- {
- size *= vertex.view.scale;
- }
-
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
-
- var cx = bounds.getCenterX();
- var cy = bounds.getCenterY();
-
- var direction = (vertex != null) ? mxUtils.getValue(
- vertex.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
- var vertical = direction == mxConstants.DIRECTION_NORTH ||
- direction == mxConstants.DIRECTION_SOUTH;
- var points;
-
- if (vertical)
- {
- var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(cx, y), new mxPoint(x + w, y + dy), new mxPoint(x + w, y + h - dy),
- new mxPoint(cx, y + h), new mxPoint(x, y + h - dy),
- new mxPoint(x, y + dy), new mxPoint(cx, y)];
- }
- else
- {
- var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x + dx, y), new mxPoint(x + w - dx, y), new mxPoint(x + w, cy),
- new mxPoint(x + w - dx, y + h), new mxPoint(x + dx, y + h),
- new mxPoint(x, cy), new mxPoint(x + dx, y)];
- }
-
- var p1 = new mxPoint(cx, cy);
-
- if (orthogonal)
- {
- if (next.x < x || next.x > x + w)
- {
- p1.y = next.y;
- }
- else
- {
- p1.x = next.x;
- }
- }
-
- return mxUtils.getPerimeterPoint(points, p1, next);
- };
-
- mxStyleRegistry.putValue('hexagonPerimeter2', mxPerimeter.HexagonPerimeter2);
-
- // Provided Interface Shape (aka Lollipop)
- function LollipopShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(LollipopShape, mxShape);
- LollipopShape.prototype.size = 10;
- LollipopShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- var sz = parseFloat(mxUtils.getValue(this.style, 'size', this.size));
- c.translate(x, y);
-
- c.ellipse((w - sz) / 2, 0, sz, sz);
- c.fillAndStroke();
-
- c.begin();
- c.moveTo(w / 2, sz);
- c.lineTo(w / 2, h);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('lollipop', LollipopShape);
-
- // Required Interface Shape
- function RequiresShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(RequiresShape, mxShape);
- RequiresShape.prototype.size = 10;
- RequiresShape.prototype.inset = 2;
- RequiresShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- var sz = parseFloat(mxUtils.getValue(this.style, 'size', this.size));
- var inset = parseFloat(mxUtils.getValue(this.style, 'inset', this.inset)) + this.strokewidth;
- c.translate(x, y);
-
- c.begin();
- c.moveTo(w / 2, sz + inset);
- c.lineTo(w / 2, h);
- c.end();
- c.stroke();
-
- c.begin();
- c.moveTo((w - sz) / 2 - inset, sz / 2);
- c.quadTo((w - sz) / 2 - inset, sz + inset, w / 2, sz + inset);
- c.quadTo((w + sz) / 2 + inset, sz + inset, (w + sz) / 2 + inset, sz / 2);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('requires', RequiresShape);
-
- // Required Interface Shape
- function RequiredInterfaceShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(RequiredInterfaceShape, mxShape);
-
- RequiredInterfaceShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- c.translate(x, y);
-
- c.begin();
- c.moveTo(0, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, 0, h);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('requiredInterface', RequiredInterfaceShape);
-
- // Provided and Required Interface Shape
- function ProvidedRequiredInterfaceShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(ProvidedRequiredInterfaceShape, mxShape);
- ProvidedRequiredInterfaceShape.prototype.inset = 2;
- ProvidedRequiredInterfaceShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- var inset = parseFloat(mxUtils.getValue(this.style, 'inset', this.inset)) + this.strokewidth;
- c.translate(x, y);
-
- c.ellipse(0, inset, w - 2 * inset, h - 2 * inset);
- c.fillAndStroke();
-
- c.begin();
- c.moveTo(w / 2, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, w / 2, h);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('providedRequiredInterface', ProvidedRequiredInterfaceShape);
-
- // Module shape
- function ModuleShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(ModuleShape, mxCylinder);
- ModuleShape.prototype.jettyWidth = 20;
- ModuleShape.prototype.jettyHeight = 10;
- ModuleShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- var dx = parseFloat(mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth));
- var dy = parseFloat(mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight));
- var x0 = dx / 2;
- var x1 = x0 + dx / 2;
- var y0 = Math.min(dy, h - dy);
- var y1 = Math.min(y0 + 2 * dy, h - dy);
-
- if (isForeground)
- {
- path.moveTo(x0, y0);
- path.lineTo(x1, y0);
- path.lineTo(x1, y0 + dy);
- path.lineTo(x0, y0 + dy);
- path.moveTo(x0, y1);
- path.lineTo(x1, y1);
- path.lineTo(x1, y1 + dy);
- path.lineTo(x0, y1 + dy);
- path.end();
- }
- else
- {
- path.moveTo(x0, 0);
- path.lineTo(w, 0);
- path.lineTo(w, h);
- path.lineTo(x0, h);
- path.lineTo(x0, y1 + dy);
- path.lineTo(0, y1 + dy);
- path.lineTo(0, y1);
- path.lineTo(x0, y1);
- path.lineTo(x0, y0 + dy);
- path.lineTo(0, y0 + dy);
- path.lineTo(0, y0);
- path.lineTo(x0, y0);
- path.close();
- path.end();
- }
- };
-
- mxCellRenderer.registerShape('module', ModuleShape);
-
- // Component shape
- function ComponentShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(ComponentShape, mxCylinder);
- ComponentShape.prototype.jettyWidth = 32;
- ComponentShape.prototype.jettyHeight = 12;
- ComponentShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- var dx = parseFloat(mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth));
- var dy = parseFloat(mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight));
- var x0 = dx / 2;
- var x1 = x0 + dx / 2;
- var y0 = 0.3 * h - dy / 2;
- var y1 = 0.7 * h - dy / 2;
-
- if (isForeground)
- {
- path.moveTo(x0, y0);
- path.lineTo(x1, y0);
- path.lineTo(x1, y0 + dy);
- path.lineTo(x0, y0 + dy);
- path.moveTo(x0, y1);
- path.lineTo(x1, y1);
- path.lineTo(x1, y1 + dy);
- path.lineTo(x0, y1 + dy);
- path.end();
- }
- else
- {
- path.moveTo(x0, 0);
- path.lineTo(w, 0);
- path.lineTo(w, h);
- path.lineTo(x0, h);
- path.lineTo(x0, y1 + dy);
- path.lineTo(0, y1 + dy);
- path.lineTo(0, y1);
- path.lineTo(x0, y1);
- path.lineTo(x0, y0 + dy);
- path.lineTo(0, y0 + dy);
- path.lineTo(0, y0);
- path.lineTo(x0, y0);
- path.close();
- path.end();
- }
- };
-
- mxCellRenderer.registerShape('component', ComponentShape);
-
- // Associative entity derived from rectangle shape
- function AssociativeEntity()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(AssociativeEntity, mxRectangleShape);
- AssociativeEntity.prototype.paintForeground = function(c, x, y, w, h)
- {
- var hw = w / 2;
- var hh = h / 2;
-
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- c.begin();
- this.addPoints(c, [new mxPoint(x + hw, y), new mxPoint(x + w, y + hh), new mxPoint(x + hw, y + h),
- new mxPoint(x, y + hh)], this.isRounded, arcSize, true);
- c.stroke();
-
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- };
-
- mxCellRenderer.registerShape('associativeEntity', AssociativeEntity);
-
- // State Shapes derives from double ellipse
- function StateShape()
- {
- mxDoubleEllipse.call(this);
- };
- mxUtils.extend(StateShape, mxDoubleEllipse);
- StateShape.prototype.outerStroke = true;
- StateShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- var inset = Math.min(4, Math.min(w / 5, h / 5));
-
- if (w > 0 && h > 0)
- {
- c.ellipse(x + inset, y + inset, w - 2 * inset, h - 2 * inset);
- c.fillAndStroke();
- }
-
- c.setShadow(false);
-
- if (this.outerStroke)
- {
- c.ellipse(x, y, w, h);
- c.stroke();
- }
- };
-
- mxCellRenderer.registerShape('endState', StateShape);
-
- function StartStateShape()
- {
- StateShape.call(this);
- };
- mxUtils.extend(StartStateShape, StateShape);
- StartStateShape.prototype.outerStroke = false;
-
- mxCellRenderer.registerShape('startState', StartStateShape);
-
- // Link shape
- function LinkShape()
- {
- mxArrowConnector.call(this);
- this.spacing = 0;
- };
- mxUtils.extend(LinkShape, mxArrowConnector);
- LinkShape.prototype.defaultWidth = 4;
-
- LinkShape.prototype.isOpenEnded = function()
- {
- return true;
- };
-
- LinkShape.prototype.getEdgeWidth = function()
- {
- return mxUtils.getNumber(this.style, 'width', this.defaultWidth) + Math.max(0, this.strokewidth - 1);
- };
-
- LinkShape.prototype.isArrowRounded = function()
- {
- return this.isRounded;
- };
-
- // Registers the link shape
- mxCellRenderer.registerShape('link', LinkShape);
-
- // Generic arrow
- function FlexArrowShape()
- {
- mxArrowConnector.call(this);
- this.spacing = 0;
- };
- mxUtils.extend(FlexArrowShape, mxArrowConnector);
- FlexArrowShape.prototype.defaultWidth = 10;
- FlexArrowShape.prototype.defaultArrowWidth = 20;
-
- FlexArrowShape.prototype.getStartArrowWidth = function()
- {
- return this.getEdgeWidth() + mxUtils.getNumber(this.style, 'startWidth', this.defaultArrowWidth);
- };
-
- FlexArrowShape.prototype.getEndArrowWidth = function()
- {
- return this.getEdgeWidth() + mxUtils.getNumber(this.style, 'endWidth', this.defaultArrowWidth);;
- };
-
- FlexArrowShape.prototype.getEdgeWidth = function()
- {
- return mxUtils.getNumber(this.style, 'width', this.defaultWidth) + Math.max(0, this.strokewidth - 1);
- };
-
- // Registers the link shape
- mxCellRenderer.registerShape('flexArrow', FlexArrowShape);
-
- // Manual Input shape
- function ManualInputShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(ManualInputShape, mxActor);
- ManualInputShape.prototype.size = 30;
- ManualInputShape.prototype.isRoundable = function()
- {
- return true;
- };
- ManualInputShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, h), new mxPoint(0, s), new mxPoint(w, 0), new mxPoint(w, h)],
- this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('manualInput', ManualInputShape);
-
- // Internal storage
- function InternalStorageShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(InternalStorageShape, mxRectangleShape);
- InternalStorageShape.prototype.dx = 20;
- InternalStorageShape.prototype.dy = 20;
- InternalStorageShape.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- InternalStorageShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- var inset = 0;
-
- if (this.isRounded)
- {
- var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- inset = Math.max(inset, Math.min(w * f, h * f));
- }
-
- var dx = Math.max(inset, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
- var dy = Math.max(inset, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
-
- c.begin();
- c.moveTo(x, y + dy);
- c.lineTo(x + w, y + dy);
- c.end();
- c.stroke();
-
- c.begin();
- c.moveTo(x + dx, y);
- c.lineTo(x + dx, y + h);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('internalStorage', InternalStorageShape);
-
- // Internal storage
- function CornerShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CornerShape, mxActor);
- CornerShape.prototype.dx = 20;
- CornerShape.prototype.dy = 20;
-
- // Corner
- CornerShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
-
- var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, dy), new mxPoint(dx, dy),
- new mxPoint(dx, h), new mxPoint(0, h)], this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('corner', CornerShape);
-
- // Crossbar shape
- function CrossbarShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CrossbarShape, mxActor);
-
- CrossbarShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.moveTo(0, 0);
- c.lineTo(0, h);
- c.end();
-
- c.moveTo(w, 0);
- c.lineTo(w, h);
- c.end();
-
- c.moveTo(0, h / 2);
- c.lineTo(w, h / 2);
- c.end();
- };
-
- mxCellRenderer.registerShape('crossbar', CrossbarShape);
-
- // Internal storage
- function TeeShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(TeeShape, mxActor);
- TeeShape.prototype.dx = 20;
- TeeShape.prototype.dy = 20;
-
- // Corner
- TeeShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
- var w2 = Math.abs(w - dx) / 2;
-
- var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, dy), new mxPoint((w + dx) / 2, dy),
- new mxPoint((w + dx) / 2, h), new mxPoint((w - dx) / 2, h), new mxPoint((w - dx) / 2, dy),
- new mxPoint(0, dy)], this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('tee', TeeShape);
-
- // Arrow
- function SingleArrowShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(SingleArrowShape, mxActor);
- SingleArrowShape.prototype.arrowWidth = 0.3;
- SingleArrowShape.prototype.arrowSize = 0.2;
- SingleArrowShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', this.arrowWidth))));
- var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', this.arrowSize))));
- var at = (h - aw) / 2;
- var ab = at + aw;
-
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, at), new mxPoint(w - as, at), new mxPoint(w - as, 0), new mxPoint(w, h / 2),
- new mxPoint(w - as, h), new mxPoint(w - as, ab), new mxPoint(0, ab)],
- this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('singleArrow', SingleArrowShape);
-
- // Arrow
- function DoubleArrowShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DoubleArrowShape, mxActor);
- DoubleArrowShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth))));
- var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', SingleArrowShape.prototype.arrowSize))));
- var at = (h - aw) / 2;
- var ab = at + aw;
-
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, h / 2), new mxPoint(as, 0), new mxPoint(as, at), new mxPoint(w - as, at),
- new mxPoint(w - as, 0), new mxPoint(w, h / 2), new mxPoint(w - as, h),
- new mxPoint(w - as, ab), new mxPoint(as, ab), new mxPoint(as, h)],
- this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('doubleArrow', DoubleArrowShape);
-
- // Data storage
- function DataStorageShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DataStorageShape, mxActor);
- DataStorageShape.prototype.size = 0.1;
- DataStorageShape.prototype.fixedSize = 20;
- DataStorageShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
- var s = (fixed) ? Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) :
- w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
-
- c.moveTo(s, 0);
- c.lineTo(w, 0);
- c.quadTo(w - s * 2, h / 2, w, h);
- c.lineTo(s, h);
- c.quadTo(s - s * 2, h / 2, s, 0);
- c.close();
- c.end();
- };
-
- mxCellRenderer.registerShape('dataStorage', DataStorageShape);
-
- // Or
- function OrShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(OrShape, mxActor);
- OrShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.moveTo(0, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, 0, h);
- c.close();
- c.end();
- };
-
- mxCellRenderer.registerShape('or', OrShape);
-
- // Xor
- function XorShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(XorShape, mxActor);
- XorShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.moveTo(0, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, 0, h);
- c.quadTo(w / 2, h / 2, 0, 0);
- c.close();
- c.end();
- };
-
- mxCellRenderer.registerShape('xor', XorShape);
-
- // Loop limit
- function LoopLimitShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(LoopLimitShape, mxActor);
- LoopLimitShape.prototype.size = 20;
- LoopLimitShape.prototype.isRoundable = function()
- {
- return true;
- };
- LoopLimitShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w - s, 0), new mxPoint(w, s * 0.8), new mxPoint(w, h),
- new mxPoint(0, h), new mxPoint(0, s * 0.8)], this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('loopLimit', LoopLimitShape);
-
- // Off page connector
- function OffPageConnectorShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(OffPageConnectorShape, mxActor);
- OffPageConnectorShape.prototype.size = 3 / 8;
- OffPageConnectorShape.prototype.isRoundable = function()
- {
- return true;
- };
- OffPageConnectorShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, h - s), new mxPoint(w / 2, h),
- new mxPoint(0, h - s)], this.isRounded, arcSize, true);
- c.end();
- };
-
- mxCellRenderer.registerShape('offPageConnector', OffPageConnectorShape);
-
- // Internal storage
- function TapeDataShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(TapeDataShape, mxEllipse);
- TapeDataShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
-
- c.begin();
- c.moveTo(x + w / 2, y + h);
- c.lineTo(x + w, y + h);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('tapeData', TapeDataShape);
-
- // OrEllipseShape
- function OrEllipseShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(OrEllipseShape, mxEllipse);
- OrEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
-
- c.setShadow(false);
- c.begin();
- c.moveTo(x, y + h / 2);
- c.lineTo(x + w, y + h / 2);
- c.end();
- c.stroke();
-
- c.begin();
- c.moveTo(x + w / 2, y);
- c.lineTo(x + w / 2, y + h);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('orEllipse', OrEllipseShape);
-
- // SumEllipseShape
- function SumEllipseShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(SumEllipseShape, mxEllipse);
- SumEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
- var s2 = 0.145;
-
- c.setShadow(false);
- c.begin();
- c.moveTo(x + w * s2, y + h * s2);
- c.lineTo(x + w * (1 - s2), y + h * (1 - s2));
- c.end();
- c.stroke();
-
- c.begin();
- c.moveTo(x + w * (1 - s2), y + h * s2);
- c.lineTo(x + w * s2, y + h * (1 - s2));
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('sumEllipse', SumEllipseShape);
-
- // SortShape
- function SortShape()
- {
- mxRhombus.call(this);
- };
- mxUtils.extend(SortShape, mxRhombus);
- SortShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxRhombus.prototype.paintVertexShape.apply(this, arguments);
-
- c.setShadow(false);
- c.begin();
- c.moveTo(x, y + h / 2);
- c.lineTo(x + w, y + h / 2);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('sortShape', SortShape);
-
- // CollateShape
- function CollateShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(CollateShape, mxEllipse);
- CollateShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- c.begin();
- c.moveTo(x, y);
- c.lineTo(x + w, y);
- c.lineTo(x + w / 2, y + h / 2);
- c.close();
- c.fillAndStroke();
-
- c.begin();
- c.moveTo(x, y + h);
- c.lineTo(x + w, y + h);
- c.lineTo(x + w / 2, y + h / 2);
- c.close();
- c.fillAndStroke();
- };
-
- mxCellRenderer.registerShape('collate', CollateShape);
-
- // DimensionShape
- function DimensionShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(DimensionShape, mxEllipse);
- DimensionShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- // Arrow size
- var al = 10;
- var cy = y + h - al / 2;
-
- c.begin();
- c.moveTo(x, y);
- c.lineTo(x, y + h);
- c.moveTo(x, cy);
- c.lineTo(x + al, cy - al / 2);
- c.moveTo(x, cy);
- c.lineTo(x + al, cy + al / 2);
- c.moveTo(x, cy);
- c.lineTo(x + w, cy);
-
- // Opposite side
- c.moveTo(x + w, y);
- c.lineTo(x + w, y + h);
- c.moveTo(x + w, cy);
- c.lineTo(x + w - al, cy - al / 2);
- c.moveTo(x + w, cy);
- c.lineTo(x + w - al, cy + al / 2);
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('dimension', DimensionShape);
-
- // PartialRectangleShape
- function PartialRectangleShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(PartialRectangleShape, mxEllipse);
- PartialRectangleShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- if (!this.outline)
- {
- c.setStrokeColor(null);
- }
-
- if (this.style != null)
- {
- var pointerEvents = c.pointerEvents;
- var events = mxUtils.getValue(this.style, mxConstants.STYLE_POINTER_EVENTS, '1') == '1';
-
- if (!events && (this.fill == null || this.fill == mxConstants.NONE))
- {
- c.pointerEvents = false;
- }
-
- c.rect(x, y, w, h);
- c.fill();
-
- c.pointerEvents = pointerEvents;
- c.setStrokeColor(this.stroke);
- c.begin();
- c.moveTo(x, y);
-
- if (this.outline || mxUtils.getValue(this.style, 'top', '1') == '1')
- {
- c.lineTo(x + w, y);
- }
- else
- {
- c.moveTo(x + w, y);
- }
-
- if (this.outline || mxUtils.getValue(this.style, 'right', '1') == '1')
- {
- c.lineTo(x + w, y + h);
- }
- else
- {
- c.moveTo(x + w, y + h);
- }
-
- if (this.outline || mxUtils.getValue(this.style, 'bottom', '1') == '1')
- {
- c.lineTo(x, y + h);
- }
- else
- {
- c.moveTo(x, y + h);
- }
-
- if (this.outline || mxUtils.getValue(this.style, 'left', '1') == '1')
- {
- c.lineTo(x, y);
- }
-
- c.end();
- c.stroke();
- }
- };
-
- mxCellRenderer.registerShape('partialRectangle', PartialRectangleShape);
-
- // LineEllipseShape
- function LineEllipseShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(LineEllipseShape, mxEllipse);
- LineEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
-
- c.setShadow(false);
- c.begin();
-
- if (mxUtils.getValue(this.style, 'line') == 'vertical')
- {
- c.moveTo(x + w / 2, y);
- c.lineTo(x + w / 2, y + h);
- }
- else
- {
- c.moveTo(x, y + h / 2);
- c.lineTo(x + w, y + h / 2);
- }
-
- c.end();
- c.stroke();
- };
-
- mxCellRenderer.registerShape('lineEllipse', LineEllipseShape);
-
- // Delay
- function DelayShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DelayShape, mxActor);
- DelayShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = Math.min(w, h / 2);
- c.moveTo(0, 0);
- c.lineTo(w - dx, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, w - dx, h);
- c.lineTo(0, h);
- c.close();
- c.end();
- };
-
- mxCellRenderer.registerShape('delay', DelayShape);
-
- // Cross Shape
- function CrossShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CrossShape, mxActor);
- CrossShape.prototype.size = 0.2;
- CrossShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var m = Math.min(h, w);
- var size = Math.max(0, Math.min(m, m * parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var t = (h - size) / 2;
- var b = t + size;
- var l = (w - size) / 2;
- var r = l + size;
-
- c.moveTo(0, t);
- c.lineTo(l, t);
- c.lineTo(l, 0);
- c.lineTo(r, 0);
- c.lineTo(r, t);
- c.lineTo(w, t);
- c.lineTo(w, b);
- c.lineTo(r, b);
- c.lineTo(r, h);
- c.lineTo(l, h);
- c.lineTo(l, b);
- c.lineTo(0, b);
- c.close();
- c.end();
- };
-
- mxCellRenderer.registerShape('cross', CrossShape);
-
- // Display
- function DisplayShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DisplayShape, mxActor);
- DisplayShape.prototype.size = 0.25;
- DisplayShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = Math.min(w, h / 2);
- var s = Math.min(w - dx, Math.max(0, parseFloat(mxUtils.getValue(this.style, 'size', this.size))) * w);
-
- c.moveTo(0, h / 2);
- c.lineTo(s, 0);
- c.lineTo(w - dx, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, w - dx, h);
- c.lineTo(s, h);
- c.close();
- c.end();
- };
-
- mxCellRenderer.registerShape('display', DisplayShape);
-
- // FilledEdge shape
- function FilledEdge()
- {
- mxConnector.call(this);
- };
- mxUtils.extend(FilledEdge, mxConnector);
-
- FilledEdge.prototype.origPaintEdgeShape = FilledEdge.prototype.paintEdgeShape;
- FilledEdge.prototype.paintEdgeShape = function(c, pts, rounded)
- {
- // Markers modify incoming points array
- var temp = [];
-
- for (var i = 0; i < pts.length; i++)
- {
- temp.push(mxUtils.clone(pts[i]));
- }
-
- // paintEdgeShape resets dashed to false
- var dashed = c.state.dashed;
- var fixDash = c.state.fixDash;
- FilledEdge.prototype.origPaintEdgeShape.apply(this, [c, temp, rounded]);
-
- if (c.state.strokeWidth >= 3)
- {
- var fillClr = mxUtils.getValue(this.style, 'fillColor', null);
-
- if (fillClr != null)
- {
- c.setStrokeColor(fillClr);
- c.setStrokeWidth(c.state.strokeWidth - 2);
- c.setDashed(dashed, fixDash);
-
- FilledEdge.prototype.origPaintEdgeShape.apply(this, [c, pts, rounded]);
- }
- }
- };
-
- // Registers the link shape
- mxCellRenderer.registerShape('filledEdge', FilledEdge);
-
- // Implements custom colors for shapes
- if (typeof StyleFormatPanel !== 'undefined')
- {
- (function()
- {
- var styleFormatPanelGetCustomColors = StyleFormatPanel.prototype.getCustomColors;
-
- StyleFormatPanel.prototype.getCustomColors = function()
- {
- var ss = this.format.getSelectionState();
- var result = styleFormatPanelGetCustomColors.apply(this, arguments);
-
- if (ss.style.shape == 'umlFrame')
- {
- result.push({title: mxResources.get('laneColor'), key: 'swimlaneFillColor', defaultValue: '#ffffff'});
- }
-
- return result;
- };
- })();
- }
-
- // Registers and defines the custom marker
- mxMarker.addMarker('dash', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var nx = unitX * (size + sw + 1);
- var ny = unitY * (size + sw + 1);
-
- return function()
- {
- c.begin();
- c.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
- c.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
- c.stroke();
- };
- });
-
- // Registers and defines the custom marker
- mxMarker.addMarker('box', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var nx = unitX * (size + sw + 1);
- var ny = unitY * (size + sw + 1);
- var px = pe.x + nx / 2;
- var py = pe.y + ny / 2;
-
- pe.x -= nx;
- pe.y -= ny;
-
- return function()
- {
- c.begin();
- c.moveTo(px - nx / 2 - ny / 2, py - ny / 2 + nx / 2);
- c.lineTo(px - nx / 2 + ny / 2, py - ny / 2 - nx / 2);
- c.lineTo(px + ny / 2 - 3 * nx / 2, py - 3 * ny / 2 - nx / 2);
- c.lineTo(px - ny / 2 - 3 * nx / 2, py - 3 * ny / 2 + nx / 2);
- c.close();
-
- if (filled)
- {
- c.fillAndStroke();
- }
- else
- {
- c.stroke();
- }
- };
- });
-
- // Registers and defines the custom marker
- mxMarker.addMarker('cross', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var nx = unitX * (size + sw + 1);
- var ny = unitY * (size + sw + 1);
-
- return function()
- {
- c.begin();
- c.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
- c.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
- c.moveTo(pe.x - nx / 2 + ny / 2, pe.y - ny / 2 - nx / 2);
- c.lineTo(pe.x - ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 + nx / 2);
- c.stroke();
- };
- });
-
- function circleMarker(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var a = size / 2;
- var size = size + sw;
-
- var pt = pe.clone();
-
- pe.x -= unitX * (2 * size + sw);
- pe.y -= unitY * (2 * size + sw);
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
-
- return function()
- {
- c.ellipse(pt.x - unitX - size, pt.y - unitY - size, 2 * size, 2 * size);
-
- if (filled)
- {
- c.fillAndStroke();
- }
- else
- {
- c.stroke();
- }
- };
- };
-
- mxMarker.addMarker('circle', circleMarker);
- mxMarker.addMarker('circlePlus', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var pt = pe.clone();
- var fn = circleMarker.apply(this, arguments);
- var nx = unitX * (size + 2 * sw); // (size + sw + 1);
- var ny = unitY * (size + 2 * sw); //(size + sw + 1);
-
- return function()
- {
- fn.apply(this, arguments);
-
- c.begin();
- c.moveTo(pt.x - unitX * (sw), pt.y - unitY * (sw));
- c.lineTo(pt.x - 2 * nx + unitX * (sw), pt.y - 2 * ny + unitY * (sw));
- c.moveTo(pt.x - nx - ny + unitY * sw, pt.y - ny + nx - unitX * sw);
- c.lineTo(pt.x + ny - nx - unitY * sw, pt.y - ny - nx + unitX * sw);
- c.stroke();
- };
- });
-
- // Registers and defines the custom marker
- mxMarker.addMarker('halfCircle', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var nx = unitX * (size + sw + 1);
- var ny = unitY * (size + sw + 1);
- var pt = pe.clone();
-
- pe.x -= nx;
- pe.y -= ny;
-
- return function()
- {
- c.begin();
- c.moveTo(pt.x - ny, pt.y + nx);
- c.quadTo(pe.x - ny, pe.y + nx, pe.x, pe.y);
- c.quadTo(pe.x + ny, pe.y - nx, pt.x + ny, pt.y - nx);
- c.stroke();
- };
- });
-
- mxMarker.addMarker('async', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- // The angle of the forward facing arrow sides against the x axis is
- // 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for
- // only half the strokewidth is processed ).
- var endOffsetX = unitX * sw * 1.118;
- var endOffsetY = unitY * sw * 1.118;
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
-
- var pt = pe.clone();
- pt.x -= endOffsetX;
- pt.y -= endOffsetY;
-
- var f = 1;
- pe.x += -unitX * f - endOffsetX;
- pe.y += -unitY * f - endOffsetY;
-
- return function()
- {
- c.begin();
- c.moveTo(pt.x, pt.y);
-
- if (source)
- {
- c.lineTo(pt.x - unitX - unitY / 2, pt.y - unitY + unitX / 2);
- }
- else
- {
- c.lineTo(pt.x + unitY / 2 - unitX, pt.y - unitY - unitX / 2);
- }
-
- c.lineTo(pt.x - unitX, pt.y - unitY);
- c.close();
-
- if (filled)
- {
- c.fillAndStroke();
- }
- else
- {
- c.stroke();
- }
- };
- });
-
- function createOpenAsyncArrow(widthFactor)
- {
- widthFactor = (widthFactor != null) ? widthFactor : 2;
-
- return function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
-
- var pt = pe.clone();
-
- return function()
- {
- c.begin();
- c.moveTo(pt.x, pt.y);
-
- if (source)
- {
- c.lineTo(pt.x - unitX - unitY / widthFactor, pt.y - unitY + unitX / widthFactor);
- }
- else
- {
- c.lineTo(pt.x + unitY / widthFactor - unitX, pt.y - unitY - unitX / widthFactor);
- }
-
- c.stroke();
- };
- }
- };
-
- mxMarker.addMarker('openAsync', createOpenAsyncArrow(2));
-
- function arrow(canvas, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- // The angle of the forward facing arrow sides against the x axis is
- // 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for
- // only half the strokewidth is processed ).
- var endOffsetX = unitX * sw * 1.118;
- var endOffsetY = unitY * sw * 1.118;
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
-
- var pt = pe.clone();
- pt.x -= endOffsetX;
- pt.y -= endOffsetY;
-
- var f = (type != mxConstants.ARROW_CLASSIC && type != mxConstants.ARROW_CLASSIC_THIN) ? 1 : 3 / 4;
- pe.x += -unitX * f - endOffsetX;
- pe.y += -unitY * f - endOffsetY;
-
- return function()
- {
- canvas.begin();
- canvas.moveTo(pt.x, pt.y);
- canvas.lineTo(pt.x - unitX - unitY / widthFactor, pt.y - unitY + unitX / widthFactor);
-
- if (type == mxConstants.ARROW_CLASSIC || type == mxConstants.ARROW_CLASSIC_THIN)
- {
- canvas.lineTo(pt.x - unitX * 3 / 4, pt.y - unitY * 3 / 4);
- }
-
- canvas.lineTo(pt.x + unitY / widthFactor - unitX, pt.y - unitY - unitX / widthFactor);
- canvas.close();
-
- if (filled)
- {
- canvas.fillAndStroke();
- }
- else
- {
- canvas.stroke();
- }
- };
- }
-
- // Handlers are only added if mxVertexHandler is defined (ie. not in embedded graph)
- if (typeof mxVertexHandler !== 'undefined')
- {
- function createHandle(state, keys, getPositionFn, setPositionFn, ignoreGrid, redrawEdges, executeFn)
- {
- var handle = new mxHandle(state, null, mxVertexHandler.prototype.secondaryHandleImage);
-
- handle.execute = function(me)
- {
- for (var i = 0; i < keys.length; i++)
- {
- this.copyStyle(keys[i]);
- }
-
- if (executeFn)
- {
- executeFn(me);
- }
- };
-
- handle.getPosition = getPositionFn;
- handle.setPosition = setPositionFn;
- handle.ignoreGrid = (ignoreGrid != null) ? ignoreGrid : true;
-
- // Overridden to update connected edges
- if (redrawEdges)
- {
- var positionChanged = handle.positionChanged;
-
- handle.positionChanged = function()
- {
- positionChanged.apply(this, arguments);
-
- // Redraws connected edges TODO: Include child edges
- state.view.invalidate(this.state.cell);
- state.view.validate();
- };
- }
-
- return handle;
- };
-
- function createArcHandle(state, yOffset)
- {
- return createHandle(state, [mxConstants.STYLE_ARCSIZE], function(bounds)
- {
- var tmp = (yOffset != null) ? yOffset : bounds.height / 8;
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1')
- {
- var arcSize = mxUtils.getValue(state.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
-
- return new mxPoint(bounds.x + bounds.width - Math.min(bounds.width / 2, arcSize), bounds.y + tmp);
- }
- else
- {
- var arcSize = Math.max(0, parseFloat(mxUtils.getValue(state.style,
- mxConstants.STYLE_ARCSIZE, mxConstants.RECTANGLE_ROUNDING_FACTOR * 100))) / 100;
-
- return new mxPoint(bounds.x + bounds.width - Math.min(Math.max(bounds.width / 2, bounds.height / 2),
- Math.min(bounds.width, bounds.height) * arcSize), bounds.y + tmp);
- }
- }, function(bounds, pt, me)
- {
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1')
- {
- this.state.style[mxConstants.STYLE_ARCSIZE] = Math.round(Math.max(0, Math.min(bounds.width,
- (bounds.x + bounds.width - pt.x) * 2)));
- }
- else
- {
- var f = Math.min(50, Math.max(0, (bounds.width - pt.x + bounds.x) * 100 /
- Math.min(bounds.width, bounds.height)));
- this.state.style[mxConstants.STYLE_ARCSIZE] = Math.round(f);
- }
- });
- }
-
- function createArcHandleFunction()
- {
- return function(state)
- {
- var handles = [];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- };
- };
-
- function createTrapezoidHandleFunction(max, defaultValue, fixedDefaultValue)
- {
- max = (max != null) ? max : 0.5;
-
- return function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null;
- var size = Math.max(0, parseFloat(mxUtils.getValue(this.state.style, 'size', (fixed) ? fixedDefaultValue : defaultValue)));
-
- return new mxPoint(bounds.x + Math.min(bounds.width * 0.75 * max, size * ((fixed) ? 0.75 : bounds.width * 0.75)), bounds.y + bounds.height / 4);
- }, function(bounds, pt)
- {
- var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null;
- var size = (fixed) ? (pt.x - bounds.x) : Math.max(0, Math.min(max, (pt.x - bounds.x) / bounds.width * 0.75));
-
- this.state.style['size'] = size;
- }, false, true)];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- };
- };
-
- function createDisplayHandleFunction(defaultValue, allowArcHandle, max, redrawEdges, fixedDefaultValue)
- {
- max = (max != null) ? max : 0.5;
-
- return function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null;
- var size = parseFloat(mxUtils.getValue(this.state.style, 'size', (fixed) ? fixedDefaultValue : defaultValue));
-
- return new mxPoint(bounds.x + Math.max(0, Math.min(bounds.width * 0.5, size * ((fixed) ? 1 : bounds.width))), bounds.getCenterY());
- }, function(bounds, pt, me)
- {
- var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null;
- var size = (fixed) ? (pt.x - bounds.x) : Math.max(0, Math.min(max, (pt.x - bounds.x) / bounds.width));
-
- this.state.style['size'] = size;
- }, false, redrawEdges)];
-
- if (allowArcHandle && mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- };
- };
-
- function createCubeHandleFunction(factor, defaultValue, allowArcHandle)
- {
- return function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat(
- mxUtils.getValue(this.state.style, 'size', defaultValue))))) * factor;
-
- return new mxPoint(bounds.x + size, bounds.y + size);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, pt.x - bounds.x),
- Math.min(bounds.height, pt.y - bounds.y))) / factor);
- }, false)];
-
- if (allowArcHandle && mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- };
- };
-
- function createCylinderHandleFunction(defaultValue)
- {
- return function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.height * 0.5, parseFloat(mxUtils.getValue(this.state.style, 'size', defaultValue))));
-
- return new mxPoint(bounds.x, bounds.y + size);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, pt.y - bounds.y);
- }, true)];
- }
- };
-
- function createArrowHandleFunction(maxSize)
- {
- return function(state)
- {
- return [createHandle(state, ['arrowWidth', 'arrowSize'], function(bounds)
- {
- var aw = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth)));
- var as = Math.max(0, Math.min(maxSize, mxUtils.getValue(this.state.style, 'arrowSize', SingleArrowShape.prototype.arrowSize)));
-
- return new mxPoint(bounds.x + (1 - as) * bounds.width, bounds.y + (1 - aw) * bounds.height / 2);
- }, function(bounds, pt)
- {
- this.state.style['arrowWidth'] = Math.max(0, Math.min(1, Math.abs(bounds.y + bounds.height / 2 - pt.y) / bounds.height * 2));
- this.state.style['arrowSize'] = Math.max(0, Math.min(maxSize, (bounds.x + bounds.width - pt.x) / (bounds.width)));
- })];
- };
- };
-
- function createEdgeHandle(state, keys, start, getPosition, setPosition)
- {
- return createHandle(state, keys, function(bounds)
- {
- var pts = state.absolutePoints;
- var n = pts.length - 1;
-
- var tr = state.view.translate;
- var s = state.view.scale;
-
- var p0 = (start) ? pts[0] : pts[n];
- var p1 = (start) ? pts[1] : pts[n - 1];
- var dx = (start) ? p1.x - p0.x : p1.x - p0.x;
- var dy = (start) ? p1.y - p0.y : p1.y - p0.y;
-
- var dist = Math.sqrt(dx * dx + dy * dy);
-
- var pt = getPosition.call(this, dist, dx / dist, dy / dist, p0, p1);
-
- return new mxPoint(pt.x / s - tr.x, pt.y / s - tr.y);
- }, function(bounds, pt, me)
- {
- var pts = state.absolutePoints;
- var n = pts.length - 1;
-
- var tr = state.view.translate;
- var s = state.view.scale;
-
- var p0 = (start) ? pts[0] : pts[n];
- var p1 = (start) ? pts[1] : pts[n - 1];
- var dx = (start) ? p1.x - p0.x : p1.x - p0.x;
- var dy = (start) ? p1.y - p0.y : p1.y - p0.y;
-
- var dist = Math.sqrt(dx * dx + dy * dy);
- pt.x = (pt.x + tr.x) * s;
- pt.y = (pt.y + tr.y) * s;
-
- setPosition.call(this, dist, dx / dist, dy / dist, p0, p1, pt, me);
- });
- };
-
- function createEdgeWidthHandle(state, start, spacing)
- {
- return createEdgeHandle(state, ['width'], start, function(dist, nx, ny, p0, p1)
- {
- var w = state.shape.getEdgeWidth() * state.view.scale + spacing;
-
- return new mxPoint(p0.x + nx * dist / 4 + ny * w / 2, p0.y + ny * dist / 4 - nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- state.style['width'] = Math.round(w * 2) / state.view.scale - spacing;
- });
- };
-
- function ptLineDistance(x1, y1, x2, y2, x0, y0)
- {
- return Math.abs((y2 - y1) * x0 - (x2 - x1) * y0 + x2 * y1 - y2 * x1) / Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
- }
-
- var handleFactory = {
- 'link': function(state)
- {
- var spacing = 10;
-
- return [createEdgeWidthHandle(state, true, spacing), createEdgeWidthHandle(state, false, spacing)];
- },
- 'flexArrow': function(state)
- {
- // Do not use state.shape.startSize/endSize since it is cached
- var tol = state.view.graph.gridSize / state.view.scale;
- var handles = [];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_STARTARROW, mxConstants.NONE) != mxConstants.NONE)
- {
- handles.push(createEdgeHandle(state, ['width', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], true, function(dist, nx, ny, p0, p1)
- {
- var w = (state.shape.getEdgeWidth() - state.shape.strokewidth) * state.view.scale;
- var l = mxUtils.getNumber(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
-
- return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) + ny * w / 2,
- p0.y + ny * (l + state.shape.strokewidth * state.view.scale) - nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt, me)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
-
- state.style[mxConstants.STYLE_STARTSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
- state.style['width'] = Math.round(w * 2) / state.view.scale;
-
- // Applies to opposite side
- if (mxEvent.isControlDown(me.getEvent()))
- {
- state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
- }
-
- // Snaps to end geometry
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- if (Math.abs(parseFloat(state.style[mxConstants.STYLE_STARTSIZE]) - parseFloat(state.style[mxConstants.STYLE_ENDSIZE])) < tol / 6)
- {
- state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
- }
- }
- }));
-
- handles.push(createEdgeHandle(state, ['startWidth', 'endWidth', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], true, function(dist, nx, ny, p0, p1)
- {
- var w = (state.shape.getStartArrowWidth() - state.shape.strokewidth) * state.view.scale;
- var l = mxUtils.getNumber(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
-
- return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) + ny * w / 2,
- p0.y + ny * (l + state.shape.strokewidth * state.view.scale) - nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt, me)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
-
- state.style[mxConstants.STYLE_STARTSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
- state.style['startWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale;
-
- // Applies to opposite side
- if (mxEvent.isControlDown(me.getEvent()))
- {
- state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
- state.style['endWidth'] = state.style['startWidth'];
- }
-
- // Snaps to endWidth
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- if (Math.abs(parseFloat(state.style[mxConstants.STYLE_STARTSIZE]) - parseFloat(state.style[mxConstants.STYLE_ENDSIZE])) < tol / 6)
- {
- state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
- }
-
- if (Math.abs(parseFloat(state.style['startWidth']) - parseFloat(state.style['endWidth'])) < tol)
- {
- state.style['startWidth'] = state.style['endWidth'];
- }
- }
- }));
- }
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ENDARROW, mxConstants.NONE) != mxConstants.NONE)
- {
- handles.push(createEdgeHandle(state, ['width', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], false, function(dist, nx, ny, p0, p1)
- {
- var w = (state.shape.getEdgeWidth() - state.shape.strokewidth) * state.view.scale;
- var l = mxUtils.getNumber(state.style, mxConstants.STYLE_ENDSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
-
- return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) - ny * w / 2,
- p0.y + ny * (l + state.shape.strokewidth * state.view.scale) + nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt, me)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
-
- state.style[mxConstants.STYLE_ENDSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
- state.style['width'] = Math.round(w * 2) / state.view.scale;
-
- // Applies to opposite side
- if (mxEvent.isControlDown(me.getEvent()))
- {
- state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
- }
-
- // Snaps to start geometry
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- if (Math.abs(parseFloat(state.style[mxConstants.STYLE_ENDSIZE]) - parseFloat(state.style[mxConstants.STYLE_STARTSIZE])) < tol / 6)
- {
- state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
- }
- }
- }));
-
- handles.push(createEdgeHandle(state, ['startWidth', 'endWidth', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], false, function(dist, nx, ny, p0, p1)
- {
- var w = (state.shape.getEndArrowWidth() - state.shape.strokewidth) * state.view.scale;
- var l = mxUtils.getNumber(state.style, mxConstants.STYLE_ENDSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
-
- return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) - ny * w / 2,
- p0.y + ny * (l + state.shape.strokewidth * state.view.scale) + nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt, me)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
-
- state.style[mxConstants.STYLE_ENDSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
- state.style['endWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale;
-
- // Applies to opposite side
- if (mxEvent.isControlDown(me.getEvent()))
- {
- state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
- state.style['startWidth'] = state.style['endWidth'];
- }
-
- // Snaps to start geometry
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- if (Math.abs(parseFloat(state.style[mxConstants.STYLE_ENDSIZE]) - parseFloat(state.style[mxConstants.STYLE_STARTSIZE])) < tol / 6)
- {
- state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
- }
-
- if (Math.abs(parseFloat(state.style['endWidth']) - parseFloat(state.style['startWidth'])) < tol)
- {
- state.style['endWidth'] = state.style['startWidth'];
- }
- }
- }));
- }
-
- return handles;
- },
- 'swimlane': function(state)
- {
- var handles = [];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED))
- {
- var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
- handles.push(createArcHandle(state, size / 2));
- }
-
- // Start size handle must be last item in handles for hover to work in tables (see mouse event handler in Graph)
- handles.push(createHandle(state, [mxConstants.STYLE_STARTSIZE], function(bounds)
- {
- var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, 1) == 1)
- {
- return new mxPoint(bounds.getCenterX(), bounds.y + Math.max(0, Math.min(bounds.height, size)));
- }
- else
- {
- return new mxPoint(bounds.x + Math.max(0, Math.min(bounds.width, size)), bounds.getCenterY());
- }
- }, function(bounds, pt)
- {
- state.style[mxConstants.STYLE_STARTSIZE] =
- (mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, 1) == 1) ?
- Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))) :
- Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
- }, false, null, function(me)
- {
- if (mxEvent.isControlDown(me.getEvent()))
- {
- var graph = state.view.graph;
-
- if (graph.isTableRow(state.cell) || graph.isTableCell(state.cell))
- {
- var dir = graph.getSwimlaneDirection(state.style);
- var parent = graph.model.getParent(state.cell);
- var cells = graph.model.getChildCells(parent, true);
- var temp = [];
-
- for (var i = 0; i < cells.length; i++)
- {
- // Finds siblings with the same direction and to set start size
- if (cells[i] != state.cell && graph.isSwimlane(cells[i]) &&
- graph.getSwimlaneDirection(graph.getCurrentCellStyle(
- cells[i])) == dir)
- {
- temp.push(cells[i]);
- }
- }
-
- graph.setCellStyles(mxConstants.STYLE_STARTSIZE,
- state.style[mxConstants.STYLE_STARTSIZE], temp);
- }
- }
- }));
-
- return handles;
- },
- 'label': createArcHandleFunction(),
- 'ext': createArcHandleFunction(),
- 'rectangle': createArcHandleFunction(),
- 'triangle': createArcHandleFunction(),
- 'rhombus': createArcHandleFunction(),
- 'umlLifeline': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.height, parseFloat(mxUtils.getValue(this.state.style, 'size', UmlLifeline.prototype.size))));
-
- return new mxPoint(bounds.getCenterX(), bounds.y + size);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- }, false)];
- },
- 'umlFrame': function(state)
- {
- var handles = [createHandle(state, ['width', 'height'], function(bounds)
- {
- var w0 = Math.max(UmlFrame.prototype.corner, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'width', UmlFrame.prototype.width)));
- var h0 = Math.max(UmlFrame.prototype.corner * 1.5, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'height', UmlFrame.prototype.height)));
-
- return new mxPoint(bounds.x + w0, bounds.y + h0);
- }, function(bounds, pt)
- {
- this.state.style['width'] = Math.round(Math.max(UmlFrame.prototype.corner, Math.min(bounds.width, pt.x - bounds.x)));
- this.state.style['height'] = Math.round(Math.max(UmlFrame.prototype.corner * 1.5, Math.min(bounds.height, pt.y - bounds.y)));
- }, false)];
-
- return handles;
- },
- 'process': function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
-
- var fixed = mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0';
- var size = parseFloat(mxUtils.getValue(this.state.style, 'size', ProcessShape.prototype.size));
-
- return (fixed) ? new mxPoint(bounds.x + size, bounds.y + bounds.height / 4) : new mxPoint(bounds.x + bounds.width * size, bounds.y + bounds.height / 4);
- }, function(bounds, pt)
- {
- var fixed = mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0';
- var size = (fixed) ? Math.max(0, Math.min(bounds.width * 0.5, (pt.x - bounds.x))) : Math.max(0, Math.min(0.5, (pt.x - bounds.x) / bounds.width));
- this.state.style['size'] = size;
- }, false)];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- },
- 'cross': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var m = Math.min(bounds.width, bounds.height);
- var size = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'size', CrossShape.prototype.size))) * m / 2;
-
- return new mxPoint(bounds.getCenterX() - size, bounds.getCenterY() - size);
- }, function(bounds, pt)
- {
- var m = Math.min(bounds.width, bounds.height);
- this.state.style['size'] = Math.max(0, Math.min(1, Math.min((Math.max(0, bounds.getCenterY() - pt.y) / m) * 2,
- (Math.max(0, bounds.getCenterX() - pt.x) / m) * 2)));
- })];
- },
- 'note': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat(
- mxUtils.getValue(this.state.style, 'size', NoteShape.prototype.size)))));
-
- return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, bounds.x + bounds.width - pt.x),
- Math.min(bounds.height, pt.y - bounds.y))));
- })];
- },
- 'note2': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat(
- mxUtils.getValue(this.state.style, 'size', NoteShape2.prototype.size)))));
-
- return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, bounds.x + bounds.width - pt.x),
- Math.min(bounds.height, pt.y - bounds.y))));
- })];
- },
- 'manualInput': function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', ManualInputShape.prototype.size)));
-
- return new mxPoint(bounds.x + bounds.width / 4, bounds.y + size * 3 / 4);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, (pt.y - bounds.y) * 4 / 3)));
- }, false)];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- },
- 'dataStorage': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var fixed = mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0';
- var size = parseFloat(mxUtils.getValue(this.state.style, 'size', (fixed) ? DataStorageShape.prototype.fixedSize : DataStorageShape.prototype.size));
-
- return new mxPoint(bounds.x + bounds.width - size * ((fixed) ? 1 : bounds.width), bounds.getCenterY());
- }, function(bounds, pt)
- {
- var fixed = mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0';
- var size = (fixed) ? Math.max(0, Math.min(bounds.width, (bounds.x + bounds.width - pt.x))) : Math.max(0, Math.min(1, (bounds.x + bounds.width - pt.x) / bounds.width));
-
- this.state.style['size'] = size;
- }, false)];
- },
- 'callout': function(state)
- {
- var handles = [createHandle(state, ['size', 'position'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', CalloutShape.prototype.size)));
- var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position)));
- var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base)));
-
- return new mxPoint(bounds.x + position * bounds.width, bounds.y + bounds.height - size);
- }, function(bounds, pt)
- {
- var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base)));
- this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, bounds.y + bounds.height - pt.y)));
- this.state.style['position'] = Math.round(Math.max(0, Math.min(1, (pt.x - bounds.x) / bounds.width)) * 100) / 100;
- }, false), createHandle(state, ['position2'], function(bounds)
- {
- var position2 = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position2', CalloutShape.prototype.position2)));
-
- return new mxPoint(bounds.x + position2 * bounds.width, bounds.y + bounds.height);
- }, function(bounds, pt)
- {
- this.state.style['position2'] = Math.round(Math.max(0, Math.min(1, (pt.x - bounds.x) / bounds.width)) * 100) / 100;
- }, false), createHandle(state, ['base'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', CalloutShape.prototype.size)));
- var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position)));
- var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base)));
-
- return new mxPoint(bounds.x + Math.min(bounds.width, position * bounds.width + base), bounds.y + bounds.height - size);
- }, function(bounds, pt)
- {
- var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position)));
-
- this.state.style['base'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x - position * bounds.width)));
- }, false)];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- },
- 'internalStorage': function(state)
- {
- var handles = [createHandle(state, ['dx', 'dy'], function(bounds)
- {
- var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', InternalStorageShape.prototype.dx)));
- var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', InternalStorageShape.prototype.dy)));
-
- return new mxPoint(bounds.x + dx, bounds.y + dy);
- }, function(bounds, pt)
- {
- this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
- this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- }, false)];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- },
- 'module': function(state)
- {
- var handles = [createHandle(state, ['jettyWidth', 'jettyHeight'], function(bounds)
- {
- var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'jettyWidth', ModuleShape.prototype.jettyWidth)));
- var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'jettyHeight', ModuleShape.prototype.jettyHeight)));
-
- return new mxPoint(bounds.x + dx / 2, bounds.y + dy * 2);
- }, function(bounds, pt)
- {
- this.state.style['jettyWidth'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)) * 2);
- this.state.style['jettyHeight'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)) / 2);
- })];
-
- return handles;
- },
- 'corner': function(state)
- {
- return [createHandle(state, ['dx', 'dy'], function(bounds)
- {
- var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', CornerShape.prototype.dx)));
- var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', CornerShape.prototype.dy)));
-
- return new mxPoint(bounds.x + dx, bounds.y + dy);
- }, function(bounds, pt)
- {
- this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
- this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- }, false)];
- },
- 'tee': function(state)
- {
- return [createHandle(state, ['dx', 'dy'], function(bounds)
- {
- var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', TeeShape.prototype.dx)));
- var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', TeeShape.prototype.dy)));
-
- return new mxPoint(bounds.x + (bounds.width + dx) / 2, bounds.y + dy);
- }, function(bounds, pt)
- {
- this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width / 2, (pt.x - bounds.x - bounds.width / 2)) * 2));
- this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- }, false)];
- },
- 'singleArrow': createArrowHandleFunction(1),
- 'doubleArrow': createArrowHandleFunction(0.5),
- 'folder': function(state)
- {
- return [createHandle(state, ['tabWidth', 'tabHeight'], function(bounds)
- {
- var tw = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'tabWidth', FolderShape.prototype.tabWidth)));
- var th = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'tabHeight', FolderShape.prototype.tabHeight)));
-
- if (mxUtils.getValue(this.state.style, 'tabPosition', FolderShape.prototype.tabPosition) == mxConstants.ALIGN_RIGHT)
- {
- tw = bounds.width - tw;
- }
-
- return new mxPoint(bounds.x + tw, bounds.y + th);
- }, function(bounds, pt)
- {
- var tw = Math.max(0, Math.min(bounds.width, pt.x - bounds.x));
-
- if (mxUtils.getValue(this.state.style, 'tabPosition', FolderShape.prototype.tabPosition) == mxConstants.ALIGN_RIGHT)
- {
- tw = bounds.width - tw;
- }
-
- this.state.style['tabWidth'] = Math.round(tw);
- this.state.style['tabHeight'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- }, false)];
- },
- 'document': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', DocumentShape.prototype.size))));
-
- return new mxPoint(bounds.x + 3 * bounds.width / 4, bounds.y + (1 - size) * bounds.height);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(1, (bounds.y + bounds.height - pt.y) / bounds.height));
- }, false)];
- },
- 'tape': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', TapeShape.prototype.size))));
-
- return new mxPoint(bounds.getCenterX(), bounds.y + size * bounds.height / 2);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(1, ((pt.y - bounds.y) / bounds.height) * 2));
- }, false)];
- },
- 'isoCube2' : function(state)
- {
- return [createHandle(state, ['isoAngle'], function(bounds)
- {
- var isoAngle = Math.max(0.01, Math.min(94, parseFloat(mxUtils.getValue(this.state.style, 'isoAngle', IsoCubeShape2.isoAngle)))) * Math.PI / 200 ;
- var isoH = Math.min(bounds.width * Math.tan(isoAngle), bounds.height * 0.5);
-
- return new mxPoint(bounds.x, bounds.y + isoH);
- }, function(bounds, pt)
- {
- this.state.style['isoAngle'] = Math.max(0, (pt.y - bounds.y) * 50 / bounds.height);
- }, true)];
- },
- 'cylinder2' : createCylinderHandleFunction(CylinderShape.prototype.size),
- 'cylinder3' : createCylinderHandleFunction(CylinderShape3.prototype.size),
- 'offPageConnector': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', OffPageConnectorShape.prototype.size))));
-
- return new mxPoint(bounds.getCenterX(), bounds.y + (1 - size) * bounds.height);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(1, (bounds.y + bounds.height - pt.y) / bounds.height));
- }, false)];
- },
- 'step': createDisplayHandleFunction(StepShape.prototype.size, true, null, true, StepShape.prototype.fixedSize),
- 'hexagon': createDisplayHandleFunction(HexagonShape.prototype.size, true, 0.5, true, HexagonShape.prototype.fixedSize),
- 'curlyBracket': createDisplayHandleFunction(CurlyBracketShape.prototype.size, false),
- 'display': createDisplayHandleFunction(DisplayShape.prototype.size, false),
- 'cube': createCubeHandleFunction(1, CubeShape.prototype.size, false),
- 'card': createCubeHandleFunction(0.5, CardShape.prototype.size, true),
- 'loopLimit': createCubeHandleFunction(0.5, LoopLimitShape.prototype.size, true),
- 'trapezoid': createTrapezoidHandleFunction(0.5, TrapezoidShape.prototype.size, TrapezoidShape.prototype.fixedSize),
- 'parallelogram': createTrapezoidHandleFunction(1, ParallelogramShape.prototype.size, ParallelogramShape.prototype.fixedSize)
- };
-
- // Exposes custom handles
- Graph.createHandle = createHandle;
- Graph.handleFactory = handleFactory;
-
- var vertexHandlerCreateCustomHandles = mxVertexHandler.prototype.createCustomHandles;
-
- mxVertexHandler.prototype.createCustomHandles = function()
- {
- var handles = vertexHandlerCreateCustomHandles.apply(this, arguments);
-
- if (this.graph.isCellRotatable(this.state.cell))
- // LATER: Make locked state independent of rotatable flag, fix toggle if default is false
- //if (this.graph.isCellResizable(this.state.cell) || this.graph.isCellMovable(this.state.cell))
- {
- var name = this.state.style['shape'];
-
- if (mxCellRenderer.defaultShapes[name] == null &&
- mxStencilRegistry.getStencil(name) == null)
- {
- name = mxConstants.SHAPE_RECTANGLE;
- }
- else if (this.state.view.graph.isSwimlane(this.state.cell))
- {
- name = mxConstants.SHAPE_SWIMLANE;
- }
-
- var fn = handleFactory[name];
-
- if (fn == null && this.state.shape != null && this.state.shape.isRoundable())
- {
- fn = handleFactory[mxConstants.SHAPE_RECTANGLE];
- }
-
- if (fn != null)
- {
- var temp = fn(this.state);
-
- if (temp != null)
- {
- if (handles == null)
- {
- handles = temp;
- }
- else
- {
- handles = handles.concat(temp);
- }
- }
- }
- }
-
- return handles;
- };
-
- mxEdgeHandler.prototype.createCustomHandles = function()
- {
- var name = this.state.style['shape'];
-
- if (mxCellRenderer.defaultShapes[name] == null &&
- mxStencilRegistry.getStencil(name) == null)
- {
- name = mxConstants.SHAPE_CONNECTOR;
- }
-
- var fn = handleFactory[name];
-
- if (fn != null)
- {
- return fn(this.state);
- }
-
- return null;
- }
- }
- else
- {
- // Dummy entries to avoid NPE in embed mode
- Graph.createHandle = function() {};
- Graph.handleFactory = {};
- }
-
- var isoHVector = new mxPoint(1, 0);
- var isoVVector = new mxPoint(1, 0);
-
- var alpha1 = mxUtils.toRadians(-30);
-
- var cos1 = Math.cos(alpha1);
- var sin1 = Math.sin(alpha1);
-
- isoHVector = mxUtils.getRotatedPoint(isoHVector, cos1, sin1);
-
- var alpha2 = mxUtils.toRadians(-150);
-
- var cos2 = Math.cos(alpha2);
- var sin2 = Math.sin(alpha2);
-
- isoVVector = mxUtils.getRotatedPoint(isoVVector, cos2, sin2);
-
- mxEdgeStyle.IsometricConnector = function (state, source, target, points, result)
- {
- var view = state.view;
- var pt = (points != null && points.length > 0) ? points[0] : null;
- var pts = state.absolutePoints;
- var p0 = pts[0];
- var pe = pts[pts.length-1];
-
- if (pt != null)
- {
- pt = view.transformControlPoint(state, pt);
- }
-
- if (p0 == null)
- {
- if (source != null)
- {
- p0 = new mxPoint(source.getCenterX(), source.getCenterY());
- }
- }
-
- if (pe == null)
- {
- if (target != null)
- {
- pe = new mxPoint(target.getCenterX(), target.getCenterY());
- }
- }
-
- var a1 = isoHVector.x;
- var a2 = isoHVector.y;
-
- var b1 = isoVVector.x;
- var b2 = isoVVector.y;
-
- var elbow = mxUtils.getValue(state.style, 'elbow', 'horizontal') == 'horizontal';
-
- if (pe != null && p0 != null)
- {
- var last = p0;
-
- function isoLineTo(x, y, ignoreFirst)
- {
- var c1 = x - last.x;
- var c2 = y - last.y;
-
- // Solves for isometric base vectors
- var h = (b2 * c1 - b1 * c2) / (a1 * b2 - a2 * b1);
- var v = (a2 * c1 - a1 * c2) / (a2 * b1 - a1 * b2);
-
- if (elbow)
- {
- if (ignoreFirst)
- {
- last = new mxPoint(last.x + a1 * h, last.y + a2 * h);
- result.push(last);
- }
-
- last = new mxPoint(last.x + b1 * v, last.y + b2 * v);
- result.push(last);
- }
- else
- {
- if (ignoreFirst)
- {
- last = new mxPoint(last.x + b1 * v, last.y + b2 * v);
- result.push(last);
- }
-
- last = new mxPoint(last.x + a1 * h, last.y + a2 * h);
- result.push(last);
- }
- };
-
- if (pt == null)
- {
- pt = new mxPoint(p0.x + (pe.x - p0.x) / 2, p0.y + (pe.y - p0.y) / 2);
- }
-
- isoLineTo(pt.x, pt.y, true);
- isoLineTo(pe.x, pe.y, false);
- }
- };
-
- mxStyleRegistry.putValue('isometricEdgeStyle', mxEdgeStyle.IsometricConnector);
-
- var graphCreateEdgeHandler = Graph.prototype.createEdgeHandler;
- Graph.prototype.createEdgeHandler = function(state, edgeStyle)
- {
- if (edgeStyle == mxEdgeStyle.IsometricConnector)
- {
- var handler = new mxElbowEdgeHandler(state);
- handler.snapToTerminals = false;
-
- return handler;
- }
-
- return graphCreateEdgeHandler.apply(this, arguments);
- };
-
- // Defines connection points for all shapes
- IsoRectangleShape.prototype.constraints = [];
-
- IsoCubeShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var tan30 = Math.tan(mxUtils.toRadians(30));
- var tan30Dx = (0.5 - tan30) / 2;
- var m = Math.min(w, h / (0.5 + tan30));
- var dx = (w - m) / 2;
- var dy = (h - m) / 2;
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, dy + 0.25 * m));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx + 0.5 * m, dy + m * tan30Dx));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx + m, dy + 0.25 * m));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx + m, dy + 0.75 * m));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx + 0.5 * m, dy + (1 - tan30Dx) * m));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, dy + 0.75 * m));
-
- return (constr);
- };
-
- IsoCubeShape2.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var isoAngle = Math.max(0.01, Math.min(94, parseFloat(mxUtils.getValue(this.style, 'isoAngle', this.isoAngle)))) * Math.PI / 200 ;
- var isoH = Math.min(w * Math.tan(isoAngle), h * 0.5);
-
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, isoH));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, h - isoH));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - isoH));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, isoH));
-
- return (constr);
- }
-
- CalloutShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- var s = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var dx = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position', this.position))));
- var dx2 = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position2', this.position2))));
- var base = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'base', this.base))));
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.25, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.75, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h - s) * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, h - s));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx2, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - s));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - s) * 0.5));
-
- if (w >= s * 2)
- {
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- }
-
- return (constr);
- };
-
- mxRectangleShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true),
- new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(1, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0, 1), true),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true),
- new mxConnectionConstraint(new mxPoint(1, 1), true)];
- mxEllipse.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true), new mxConnectionConstraint(new mxPoint(1, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 1), true), new mxConnectionConstraint(new mxPoint(1, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true), new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true), new mxConnectionConstraint(new mxPoint(1, 0.5))];
- PartialRectangleShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- mxImageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- mxSwimlane.prototype.constraints = mxRectangleShape.prototype.constraints;
- PlusShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- mxLabel.prototype.constraints = mxRectangleShape.prototype.constraints;
-
- NoteShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - s) * 0.5, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - s, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - s * 0.5, s * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, s));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h + s) * 0.5 ));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
-
- if (w >= s * 2)
- {
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- }
-
- return (constr);
- };
-
- CardShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
-
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + s) * 0.5, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s * 0.5, s * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, s));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h + s) * 0.5 ));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
-
- if (w >= s * 2)
- {
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- }
-
- return (constr);
- };
-
- CubeShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - s) * 0.5, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - s, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - s * 0.5, s * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, s));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h + s) * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + s) * 0.5, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s * 0.5, h - s * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - s));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - s) * 0.5));
-
- return (constr);
- };
-
- CylinderShape3.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var s = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
-
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, s));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false, null, 0, s));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 1), false, null, 0, -s));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 1), false, null, 0, -s));
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, s + (h * 0.5 - s) * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false, null, 0, s + (h * 0.5 - s) * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false, null, 0, h - s - (h * 0.5 - s) * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - s - (h * 0.5 - s) * 0.5));
-
- constr.push(new mxConnectionConstraint(new mxPoint(0.145, 0), false, null, 0, s * 0.29));
- constr.push(new mxConnectionConstraint(new mxPoint(0.855, 0), false, null, 0, s * 0.29));
- constr.push(new mxConnectionConstraint(new mxPoint(0.855, 1), false, null, 0, -s * 0.29));
- constr.push(new mxConnectionConstraint(new mxPoint(0.145, 1), false, null, 0, -s * 0.29));
-
- return (constr);
- };
-
- FolderShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'tabWidth', this.tabWidth))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'tabHeight', this.tabHeight))));
- var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
-
- if (tp == 'left')
- {
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx * 0.5, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, dy));
- }
- else
- {
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx * 0.5, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - dx) * 0.5, dy));
- }
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h - dy) * 0.25 + dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h - dy) * 0.5 + dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h - dy) * 0.75 + dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - dy) * 0.25 + dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - dy) * 0.5 + dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - dy) * 0.75 + dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0.25, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.75, 1), false));
-
- return (constr);
- }
-
- InternalStorageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- DataStorageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- TapeDataShape.prototype.constraints = mxEllipse.prototype.constraints;
- OrEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
- SumEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
- LineEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
- ManualInputShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- DelayShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-
- DisplayShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var dx = Math.min(w, h / 2);
- var s = Math.min(w - dx, Math.max(0, parseFloat(mxUtils.getValue(this.style, 'size', this.size))) * w);
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false, null));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (s + w - dx) * 0.5, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false, null));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (s + w - dx) * 0.5, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s, h));
-
- return (constr);
- };
-
- ModuleShape.prototype.getConstraints = function(style, w, h)
- {
- var x0 = parseFloat(mxUtils.getValue(style, 'jettyWidth', ModuleShape.prototype.jettyWidth)) / 2;
- var dy = parseFloat(mxUtils.getValue(style, 'jettyHeight', ModuleShape.prototype.jettyHeight));
- var constr = [new mxConnectionConstraint(new mxPoint(0, 0), false, null, x0),
- new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(1, 0), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0, 1), false, null, x0),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true),
- new mxConnectionConstraint(new mxPoint(1, 1), true),
- new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, Math.min(h - 0.5 * dy, 1.5 * dy)),
- new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, Math.min(h - 0.5 * dy, 3.5 * dy))];
-
- if (h > 5 * dy)
- {
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.75), false, null, x0));
- }
-
- if (h > 8 * dy)
- {
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false, null, x0));
- }
-
- if (h > 15 * dy)
- {
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.25), false, null, x0));
- }
-
- return constr;
- };
-
- LoopLimitShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- OffPageConnectorShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- mxCylinder.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.15, 0.05), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.85, 0.05), false),
- new mxConnectionConstraint(new mxPoint(0, 0.3), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.7), true),
- new mxConnectionConstraint(new mxPoint(1, 0.3), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.7), true),
- new mxConnectionConstraint(new mxPoint(0.15, 0.95), false),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.85, 0.95), false)];
- UmlActorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0, 1/3), false),
- new mxConnectionConstraint(new mxPoint(0, 1), false),
- new mxConnectionConstraint(new mxPoint(1, 1/3), false),
- new mxConnectionConstraint(new mxPoint(1, 1), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0.5), false)];
- ComponentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 0.3), true),
- new mxConnectionConstraint(new mxPoint(0, 0.7), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
- mxActor.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.25, 0.2), false),
- new mxConnectionConstraint(new mxPoint(0.1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0.25), false),
- new mxConnectionConstraint(new mxPoint(0.9, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
- SwitchShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0.25), false),
- new mxConnectionConstraint(new mxPoint(1, 0), false),
- new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 1), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0.75), false),
- new mxConnectionConstraint(new mxPoint(1, 1), false)];
- TapeShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.35), false),
- new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 0.65), false),
- new mxConnectionConstraint(new mxPoint(1, 0.35), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.65), false),
- new mxConnectionConstraint(new mxPoint(0.25, 1), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0), false)];
- StepShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true),
- new mxConnectionConstraint(new mxPoint(0, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true)];
- mxLine.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
- LollipopShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), false),
- new mxConnectionConstraint(new mxPoint(0.5, 1), false)];
- mxDoubleEllipse.prototype.constraints = mxEllipse.prototype.constraints;
- mxRhombus.prototype.constraints = mxEllipse.prototype.constraints;
- mxTriangle.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true)];
- mxHexagon.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.375, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.625, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.375, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.625, 1), true)];
- mxCloud.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.25), false),
- new mxConnectionConstraint(new mxPoint(0.4, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0.16, 0.55), false),
- new mxConnectionConstraint(new mxPoint(0.07, 0.4), false),
- new mxConnectionConstraint(new mxPoint(0.31, 0.8), false),
- new mxConnectionConstraint(new mxPoint(0.13, 0.77), false),
- new mxConnectionConstraint(new mxPoint(0.8, 0.8), false),
- new mxConnectionConstraint(new mxPoint(0.55, 0.95), false),
- new mxConnectionConstraint(new mxPoint(0.875, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.96, 0.7), false),
- new mxConnectionConstraint(new mxPoint(0.625, 0.2), false),
- new mxConnectionConstraint(new mxPoint(0.88, 0.25), false)];
- ParallelogramShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- TrapezoidShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- DocumentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true)];
- mxArrow.prototype.constraints = null;
-
- TeeShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
- var w2 = Math.abs(w - dx) / 2;
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w * 0.75 + dx * 0.25, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, (h + dy) * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - dx) * 0.5, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - dx) * 0.5, (h + dy) * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - dx) * 0.5, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w * 0.25 - dx * 0.25, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, dy * 0.5));
-
- return (constr);
- };
-
- CornerShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, dy));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, (h + dy) * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx * 0.5, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 1), false));
-
- return (constr);
- };
-
- CrossbarShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), false),
- new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 1), false),
- new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 1), false)];
-
- SingleArrowShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', this.arrowWidth))));
- var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', this.arrowSize))));
- var at = (h - aw) / 2;
- var ab = at + aw;
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, at));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - as) * 0.5, at));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - as, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - as, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - as) * 0.5, h - at));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - at));
-
- return (constr);
- };
-
- DoubleArrowShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth))));
- var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', SingleArrowShape.prototype.arrowSize))));
- var at = (h - aw) / 2;
- var ab = at + aw;
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, as, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w * 0.5, at));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - as, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - as, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w * 0.5, h - at));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, as, h));
-
- return (constr);
- };
-
- CrossShape.prototype.getConstraints = function(style, w, h)
- {
- var constr = [];
- var m = Math.min(h, w);
- var size = Math.max(0, Math.min(m, m * parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var t = (h - size) / 2;
- var b = t + size;
- var l = (w - size) / 2;
- var r = l + size;
-
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, t * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, 0));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, t * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, t));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, h - t * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, h));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, h - t * 0.5));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, b));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + r) * 0.5, t));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, t));
- constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, b));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + r) * 0.5, b));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, b));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l * 0.5, t));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, t));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, b));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l * 0.5, b));
- constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, t));
-
- return (constr);
- };
-
- UmlLifeline.prototype.constraints = null;
- OrShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), false),
- new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 0.75), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.7, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0.7, 0.9), false)];
- XorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.175, 0.25), false),
- new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.175, 0.75), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.7, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0.7, 0.9), false)];
- RequiredInterfaceShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
- ProvidedRequiredInterfaceShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
-})();
diff --git a/src/main/webapp/js/mxgraph/Sidebar.js b/src/main/webapp/js/mxgraph/Sidebar.js
deleted file mode 100644
index 7e384b2c..00000000
--- a/src/main/webapp/js/mxgraph/Sidebar.js
+++ /dev/null
@@ -1,4419 +0,0 @@
-/**
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Construcs a new sidebar for the given editor.
- */
-function Sidebar(editorUi, container)
-{
- this.editorUi = editorUi;
- this.container = container;
- this.palettes = new Object();
- this.taglist = new Object();
- this.showTooltips = true;
- this.graph = editorUi.createTemporaryGraph(this.editorUi.editor.graph.getStylesheet());
- this.graph.cellRenderer.minSvgStrokeWidth = this.minThumbStrokeWidth;
- this.graph.cellRenderer.antiAlias = this.thumbAntiAlias;
- this.graph.container.style.visibility = 'hidden';
- this.graph.foldingEnabled = false;
-
- document.body.appendChild(this.graph.container);
-
- this.pointerUpHandler = mxUtils.bind(this, function()
- {
- this.showTooltips = true;
- });
-
- mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointerup' : 'mouseup', this.pointerUpHandler);
-
- this.pointerDownHandler = mxUtils.bind(this, function()
- {
- this.showTooltips = false;
- this.hideTooltip();
- });
-
- mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown', this.pointerDownHandler);
-
- this.pointerMoveHandler = mxUtils.bind(this, function(evt)
- {
- var src = mxEvent.getSource(evt);
-
- while (src != null)
- {
- if (src == this.currentElt)
- {
- return;
- }
-
- src = src.parentNode;
- }
-
- this.hideTooltip();
- });
-
- mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', this.pointerMoveHandler);
-
- // Handles mouse leaving the window
- this.pointerOutHandler = mxUtils.bind(this, function(evt)
- {
- if (evt.toElement == null && evt.relatedTarget == null)
- {
- this.hideTooltip();
- }
- });
-
- mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointerout' : 'mouseout', this.pointerOutHandler);
-
- // Enables tooltips after scroll
- mxEvent.addListener(container, 'scroll', mxUtils.bind(this, function()
- {
- this.showTooltips = true;
- this.hideTooltip();
- }));
-
- this.init();
-};
-
-/**
- * Adds all palettes to the sidebar.
- */
-Sidebar.prototype.init = function()
-{
- var dir = STENCIL_PATH;
-
- this.addSearchPalette(true);
- this.addGeneralPalette(true);
- this.addMiscPalette(false);
- this.addAdvancedPalette(false);
- this.addBasicPalette(dir);
-
- this.setCurrentSearchEntryLibrary('arrows');
- this.addStencilPalette('arrows', mxResources.get('arrows'), dir + '/arrows.xml',
- ';whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#000000;strokeWidth=2');
- this.setCurrentSearchEntryLibrary();
-
- this.addUmlPalette(false);
- this.addBpmnPalette(dir, false);
-
- this.setCurrentSearchEntryLibrary('flowchart');
- this.addStencilPalette('flowchart', 'Flowchart', dir + '/flowchart.xml',
- ';whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#000000;strokeWidth=2');
- this.setCurrentSearchEntryLibrary();
-
- this.setCurrentSearchEntryLibrary('clipart');
- this.addImagePalette('clipart', mxResources.get('clipart'), dir + '/clipart/', '_128x128.png',
- ['Earth_globe', 'Empty_Folder', 'Full_Folder', 'Gear', 'Lock', 'Software', 'Virus', 'Email',
- 'Database', 'Router_Icon', 'iPad', 'iMac', 'Laptop', 'MacBook', 'Monitor_Tower', 'Printer',
- 'Server_Tower', 'Workstation', 'Firewall_02', 'Wireless_Router_N', 'Credit_Card',
- 'Piggy_Bank', 'Graph', 'Safe', 'Shopping_Cart', 'Suit1', 'Suit2', 'Suit3', 'Pilot1',
- 'Worker1', 'Soldier1', 'Doctor1', 'Tech1', 'Security1', 'Telesales1'], null,
- {'Wireless_Router_N': 'wireless router switch wap wifi access point wlan',
- 'Router_Icon': 'router switch'});
- this.setCurrentSearchEntryLibrary();
-};
-
-/**
- * Sets the default font size.
- */
-Sidebar.prototype.collapsedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/collapsed.gif' : 'data:image/gif;base64,R0lGODlhDQANAIABAJmZmf///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNUQyRTJFNjZGNUYxMUU1QjZEOThCNDYxMDQ2MzNCQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozNUQyRTJFNzZGNUYxMUU1QjZEOThCNDYxMDQ2MzNCQiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFERjc3MEUxNkY1RjExRTVCNkQ5OEI0NjEwNDYzM0JCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFERjc3MEUyNkY1RjExRTVCNkQ5OEI0NjEwNDYzM0JCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAQAsAAAAAA0ADQAAAhSMj6lrwAjcC1GyahV+dcZJgeIIFgA7';
-
-/**
- * Sets the default font size.
- */
-Sidebar.prototype.expandedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/expanded.gif' : 'data:image/gif;base64,R0lGODlhDQANAIABAJmZmf///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxREY3NzBERjZGNUYxMUU1QjZEOThCNDYxMDQ2MzNCQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxREY3NzBFMDZGNUYxMUU1QjZEOThCNDYxMDQ2MzNCQiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFERjc3MERENkY1RjExRTVCNkQ5OEI0NjEwNDYzM0JCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFERjc3MERFNkY1RjExRTVCNkQ5OEI0NjEwNDYzM0JCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAQAsAAAAAA0ADQAAAhGMj6nL3QAjVHIu6azbvPtWAAA7';
-
-/**
- *
- */
-Sidebar.prototype.searchImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/search.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAEaSURBVHjabNGxS5VxFIfxz71XaWuQUJCG/gCHhgTD9VpEETg4aMOlQRp0EoezObgcd220KQiXmpretTAHQRBdojlQEJyukPdt+b1ywfvAGc7wnHP4nlZd1yKijQW8xzNc4Su+ZOYfQ3T6/f4YNvEJYzjELXp4VVXVz263+7cR2niBxAFeZ2YPi3iHR/gYERPDwhpOsd6sz8x/mfkNG3iOlWFhFj8y89J9KvzGXER0GuEaD42mgwHqUtoljbcRsTBCeINpfM/MgZLKPpaxFxGbOCqDXmILN7hoJrTKH+axhxmcYRxP0MIDnOBDZv5q1XUNIuJxifJp+UNV7t7BFM6xeic0RMQ4Bpl5W/ol7GISx/eEUUTECrbx+f8A8xhiZht9zsgAAAAASUVORK5CYII=';
-
-/**
- *
- */
-Sidebar.prototype.dragPreviewBorder = '1px dashed black';
-
-/**
- * Specifies if tooltips should be visible. Default is true.
- */
-Sidebar.prototype.enableTooltips = true;
-
-/**
- * Specifies the delay for the tooltip. Default is 16 px.
- */
-Sidebar.prototype.tooltipBorder = 16;
-
-/**
- * Specifies the delay for the tooltip. Default is 300 ms.
- */
-Sidebar.prototype.tooltipDelay = 300;
-
-/**
- * Specifies the delay for the drop target icons. Default is 200 ms.
- */
-Sidebar.prototype.dropTargetDelay = 200;
-
-/**
- * Specifies the URL of the gear image.
- */
-Sidebar.prototype.gearImage = STENCIL_PATH + '/clipart/Gear_128x128.png';
-
-/**
- * Specifies the width of the thumbnails.
- */
-Sidebar.prototype.thumbWidth = 42;
-
-/**
- * Specifies the height of the thumbnails.
- */
-Sidebar.prototype.thumbHeight = 42;
-
-/**
- * Specifies the width of the thumbnails.
- */
-Sidebar.prototype.minThumbStrokeWidth = 1;
-
-/**
- * Specifies the width of the thumbnails.
- */
-Sidebar.prototype.thumbAntiAlias = false;
-
-/**
- * Specifies the padding for the thumbnails. Default is 3.
- */
-Sidebar.prototype.thumbPadding = (document.documentMode >= 5) ? 2 : 3;
-
-/**
- * Specifies the delay for the tooltip. Default is 2 px.
- */
-Sidebar.prototype.thumbBorder = 2;
-
-/*
- * Experimental smaller sidebar entries
- */
-if (urlParams['sidebar-entries'] != 'large')
-{
- Sidebar.prototype.thumbPadding = (document.documentMode >= 5) ? 0 : 1;
- Sidebar.prototype.thumbBorder = 1;
- Sidebar.prototype.thumbWidth = 32;
- Sidebar.prototype.thumbHeight = 30;
- Sidebar.prototype.minThumbStrokeWidth = 1.3;
- Sidebar.prototype.thumbAntiAlias = true;
-}
-
-/**
- * Specifies the size of the sidebar titles.
- */
-Sidebar.prototype.sidebarTitleSize = 9;
-
-/**
- * Specifies if titles in the sidebar should be enabled.
- */
-Sidebar.prototype.sidebarTitles = false;
-
-/**
- * Specifies if titles in the tooltips should be enabled.
- */
-Sidebar.prototype.tooltipTitles = true;
-
-/**
- * Specifies if titles in the tooltips should be enabled.
- */
-Sidebar.prototype.maxTooltipWidth = 400;
-
-/**
- * Specifies if titles in the tooltips should be enabled.
- */
-Sidebar.prototype.maxTooltipHeight = 400;
-
-/**
- * Specifies if stencil files should be loaded and added to the search index
- * when stencil palettes are added. If this is false then the stencil files
- * are lazy-loaded when the palette is shown.
- */
-Sidebar.prototype.addStencilsToIndex = true;
-
-/**
- * Specifies the width for clipart images. Default is 80.
- */
-Sidebar.prototype.defaultImageWidth = 80;
-
-/**
- * Specifies the height for clipart images. Default is 80.
- */
-Sidebar.prototype.defaultImageHeight = 80;
-
-/**
- * Adds all palettes to the sidebar.
- */
-Sidebar.prototype.getTooltipOffset = function()
-{
- return new mxPoint(0, 0);
-};
-
-/**
- * Adds all palettes to the sidebar.
- */
-Sidebar.prototype.showTooltip = function(elt, cells, w, h, title, showLabel)
-{
- if (this.enableTooltips && this.showTooltips)
- {
- if (this.currentElt != elt)
- {
- if (this.thread != null)
- {
- window.clearTimeout(this.thread);
- this.thread = null;
- }
-
- var show = mxUtils.bind(this, function()
- {
- // Lazy creation of the DOM nodes and graph instance
- if (this.tooltip == null)
- {
- this.tooltip = document.createElement('div');
- this.tooltip.className = 'geSidebarTooltip';
- this.tooltip.style.zIndex = mxPopupMenu.prototype.zIndex - 1;
- document.body.appendChild(this.tooltip);
-
- this.graph2 = new Graph(this.tooltip, null, null, this.editorUi.editor.graph.getStylesheet());
- this.graph2.resetViewOnRootChange = false;
- this.graph2.foldingEnabled = false;
- this.graph2.gridEnabled = false;
- this.graph2.autoScroll = false;
- this.graph2.setTooltips(false);
- this.graph2.setConnectable(false);
- this.graph2.setEnabled(false);
-
- if (!mxClient.IS_SVG)
- {
- this.graph2.view.canvas.style.position = 'relative';
- }
- }
-
- this.graph2.model.clear();
- this.graph2.view.setTranslate(this.tooltipBorder, this.tooltipBorder);
-
- if (w > this.maxTooltipWidth || h > this.maxTooltipHeight)
- {
- this.graph2.view.scale = Math.round(Math.min(this.maxTooltipWidth / w, this.maxTooltipHeight / h) * 100) / 100;
- }
- else
- {
- this.graph2.view.scale = 1;
- }
-
- this.tooltip.style.display = 'block';
- this.graph2.labelsVisible = (showLabel == null || showLabel);
- var fo = mxClient.NO_FO;
- mxClient.NO_FO = Editor.prototype.originalNoForeignObject;
-
- // Applies current style for preview
- var temp = this.graph2.cloneCells(cells);
- this.editorUi.insertHandler(temp, null, this.graph2.model);
- this.graph2.addCells(temp);
-
- mxClient.NO_FO = fo;
-
- var bounds = this.graph2.getGraphBounds();
- var width = bounds.width + 2 * this.tooltipBorder + 4;
- var height = bounds.height + 2 * this.tooltipBorder;
-
- if (mxClient.IS_QUIRKS)
- {
- height += 4;
- this.tooltip.style.overflow = 'hidden';
- }
- else
- {
- this.tooltip.style.overflow = 'visible';
- }
-
- this.tooltip.style.width = width + 'px';
- var w2 = width;
-
- // Adds title for entry
- if (this.tooltipTitles && title != null && title.length > 0)
- {
- if (this.tooltipTitle == null)
- {
- this.tooltipTitle = document.createElement('div');
- this.tooltipTitle.style.borderTop = '1px solid gray';
- this.tooltipTitle.style.textAlign = 'center';
- this.tooltipTitle.style.width = '100%';
- this.tooltipTitle.style.overflow = 'hidden';
- this.tooltipTitle.style.position = 'absolute';
- this.tooltipTitle.style.paddingTop = '6px';
- this.tooltipTitle.style.bottom = '6px';
-
- this.tooltip.appendChild(this.tooltipTitle);
- }
- else
- {
- this.tooltipTitle.innerHTML = '';
- }
-
- this.tooltipTitle.style.display = '';
- mxUtils.write(this.tooltipTitle, title);
-
- // Allows for wider labels
- w2 = Math.min(this.maxTooltipWidth, Math.max(width, this.tooltipTitle.scrollWidth + 4));
- var ddy = this.tooltipTitle.offsetHeight + 10;
- height += ddy;
-
- if (mxClient.IS_SVG)
- {
- this.tooltipTitle.style.marginTop = (2 - ddy) + 'px';
- }
- else
- {
- height -= 6;
- this.tooltipTitle.style.top = (height - ddy) + 'px';
- }
- }
- else if (this.tooltipTitle != null && this.tooltipTitle.parentNode != null)
- {
- this.tooltipTitle.style.display = 'none';
- }
-
- // Updates width if label is wider
- if (w2 > width)
- {
- this.tooltip.style.width = w2 + 'px';
- }
-
- this.tooltip.style.height = height + 'px';
- var x0 = -Math.round(bounds.x - this.tooltipBorder) +
- ((w2 > width) ? (w2 - width) / 2 : 0);
- var y0 = -Math.round(bounds.y - this.tooltipBorder);
-
- var b = document.body;
- var d = document.documentElement;
- var off = this.getTooltipOffset();
- var bottom = Math.max(b.clientHeight || 0, d.clientHeight);
- var left = this.container.clientWidth + this.editorUi.splitSize + 3 + this.editorUi.container.offsetLeft + off.x;
- var top = Math.min(bottom - height - 20 /*status bar*/, Math.max(0, (this.editorUi.container.offsetTop +
- this.container.offsetTop + elt.offsetTop - this.container.scrollTop - height / 2 + 16))) + off.y;
-
- if (mxClient.IS_SVG)
- {
- if (x0 != 0 || y0 != 0)
- {
- this.graph2.view.canvas.setAttribute('transform', 'translate(' + x0 + ',' + y0 + ')');
- }
- else
- {
- this.graph2.view.canvas.removeAttribute('transform');
- }
- }
- else
- {
- this.graph2.view.drawPane.style.left = x0 + 'px';
- this.graph2.view.drawPane.style.top = y0 + 'px';
- }
-
- // Workaround for ignored position CSS style in IE9
- // (changes to relative without the following line)
- this.tooltip.style.position = 'absolute';
- this.tooltip.style.left = left + 'px';
- this.tooltip.style.top = top + 'px';
- });
-
- if (this.tooltip != null && this.tooltip.style.display != 'none')
- {
- show();
- }
- else
- {
- this.thread = window.setTimeout(show, this.tooltipDelay);
- }
-
- this.currentElt = elt;
- }
- }
-};
-
-/**
- * Hides the current tooltip.
- */
-Sidebar.prototype.hideTooltip = function()
-{
- if (this.thread != null)
- {
- window.clearTimeout(this.thread);
- this.thread = null;
- }
-
- if (this.tooltip != null)
- {
- this.tooltip.style.display = 'none';
- this.currentElt = null;
- }
-};
-
-/**
- * Hides the current tooltip.
- */
-Sidebar.prototype.addDataEntry = function(tags, width, height, title, data)
-{
- return this.addEntry(tags, mxUtils.bind(this, function()
- {
- return this.createVertexTemplateFromData(data, width, height, title);
- }));
-};
-
-/**
- * Adds the give entries to the search index.
- */
-Sidebar.prototype.addEntries = function(images)
-{
- for (var i = 0; i < images.length; i++)
- {
- (mxUtils.bind(this, function(img)
- {
- var data = img.data;
- var tags = (img.title != null) ? img.title : '';
-
- if (img.tags != null)
- {
- tags += ' ' + img.tags;
- }
-
- if (data != null && tags.length > 0)
- {
- this.addEntry(tags, mxUtils.bind(this, function()
- {
- data = this.editorUi.convertDataUri(data);
- var s = 'shape=image;verticalLabelPosition=bottom;verticalAlign=top;imageAspect=0;';
-
- if (img.aspect == 'fixed')
- {
- s += 'aspect=fixed;'
- }
-
- return this.createVertexTemplate(s + 'image=' +
- data, img.w, img.h, '', img.title || '', false, false, true)
- }));
- }
- else if (img.xml != null && tags.length > 0)
- {
- this.addEntry(tags, mxUtils.bind(this, function()
- {
- var cells = this.editorUi.stringToCells(Graph.decompress(img.xml));
-
- return this.createVertexTemplateFromCells(
- cells, img.w, img.h, img.title || '', true, false, true);
- }));
- }
- }))(images[i]);
- }
-};
-
-/**
- * Hides the current tooltip.
- */
-Sidebar.prototype.setCurrentSearchEntryLibrary = function(id, lib)
-{
- this.currentSearchEntryLibrary = (id != null) ? {id: id, lib: lib} : null;
-};
-
-/**
- * Hides the current tooltip.
- */
-Sidebar.prototype.addEntry = function(tags, fn)
-{
- if (this.taglist != null && tags != null && tags.length > 0)
- {
- if (this.currentSearchEntryLibrary != null)
- {
- fn.parentLibraries = [this.currentSearchEntryLibrary];
- }
-
- // Replaces special characters
- var tmp = tags.toLowerCase().replace(/[\/\,\(\)]/g, ' ').split(' ');
- var tagList = [];
- var hash = {};
-
- // Finds unique tags
- for (var i = 0; i < tmp.length; i++)
- {
- if (hash[tmp[i]] == null)
- {
- hash[tmp[i]] = true;
- tagList.push(tmp[i]);
- }
-
- // Adds additional entry with removed trailing numbers
- var normalized = tmp[i].replace(/\.*\d*$/, '');
-
- if (normalized != tmp[i])
- {
- if (hash[normalized] == null)
- {
- hash[normalized] = true;
- tagList.push(normalized);
- }
- }
- }
-
- for (var i = 0; i < tagList.length; i++)
- {
- this.addEntryForTag(tagList[i], fn);
- }
- }
-
- return fn;
-};
-
-/**
- * Hides the current tooltip.
- */
-Sidebar.prototype.addEntryForTag = function(tag, fn)
-{
- if (tag != null && tag.length > 1)
- {
- var entry = this.taglist[tag];
-
- if (typeof entry !== 'object')
- {
- entry = {entries: []};
- this.taglist[tag] = entry;
- }
-
- entry.entries.push(fn);
- }
-};
-
-/**
- * Adds shape search UI.
- */
-Sidebar.prototype.searchEntries = function(searchTerms, count, page, success, error)
-{
- if (this.taglist != null && searchTerms != null)
- {
- var tmp = searchTerms.toLowerCase().split(' ');
- var dict = new mxDictionary();
- var max = (page + 1) * count;
- var results = [];
- var index = 0;
-
- for (var i = 0; i < tmp.length; i++)
- {
- if (tmp[i].length > 0)
- {
- var entry = this.taglist[tmp[i]];
- var tmpDict = new mxDictionary();
-
- if (entry != null)
- {
- var arr = entry.entries;
- results = [];
-
- for (var j = 0; j < arr.length; j++)
- {
- var entry = arr[j];
-
- // NOTE Array does not contain duplicates
- if ((index == 0) == (dict.get(entry) == null))
- {
- tmpDict.put(entry, entry);
- results.push(entry);
-
- if (i == tmp.length - 1 && results.length == max)
- {
- success(results.slice(page * count, max), max, true, tmp);
-
- return;
- }
- }
- }
- }
- else
- {
- results = [];
- }
-
- dict = tmpDict;
- index++;
- }
- }
-
- var len = results.length;
- success(results.slice(page * count, (page + 1) * count), len, false, tmp);
- }
- else
- {
- success([], null, null, tmp);
- }
-};
-
-/**
- * Adds shape search UI.
- */
-Sidebar.prototype.filterTags = function(tags)
-{
- if (tags != null)
- {
- var arr = tags.split(' ');
- var result = [];
- var hash = {};
-
- // Ignores tags with leading numbers, strips trailing numbers
- for (var i = 0; i < arr.length; i++)
- {
- // Removes duplicates
- if (hash[arr[i]] == null)
- {
- hash[arr[i]] = '1';
- result.push(arr[i]);
- }
- }
-
- return result.join(' ');
- }
-
- return null;
-};
-
-/**
- * Adds the general palette to the sidebar.
- */
-Sidebar.prototype.cloneCell = function(cell, value)
-{
- var clone = cell.clone();
-
- if (value != null)
- {
- clone.value = value;
- }
-
- return clone;
-};
-
-/**
- * Adds shape search UI.
- */
-Sidebar.prototype.showPopupMenuForEntry = function(elt, libs, evt)
-{
- // Hook for subclassers
-};
-
-/**
- * Adds shape search UI.
- */
-Sidebar.prototype.addSearchPalette = function(expand)
-{
- var elt = document.createElement('div');
- elt.style.visibility = 'hidden';
- this.container.appendChild(elt);
-
- var div = document.createElement('div');
- div.className = 'geSidebar';
- div.style.boxSizing = 'border-box';
- div.style.overflow = 'hidden';
- div.style.width = '100%';
- div.style.padding = '8px';
- div.style.paddingTop = '14px';
- div.style.paddingBottom = '0px';
-
- if (!expand)
- {
- div.style.display = 'none';
- }
-
- var inner = document.createElement('div');
- inner.style.whiteSpace = 'nowrap';
- inner.style.textOverflow = 'clip';
- inner.style.paddingBottom = '8px';
- inner.style.cursor = 'default';
-
- var input = document.createElement('input');
- input.setAttribute('placeholder', mxResources.get('searchShapes'));
- input.setAttribute('type', 'text');
- input.style.fontSize = '12px';
- input.style.overflow = 'hidden';
- input.style.boxSizing = 'border-box';
- input.style.border = 'solid 1px #d5d5d5';
- input.style.borderRadius = '4px';
- input.style.width = '100%';
- input.style.outline = 'none';
- input.style.padding = '6px';
- input.style.paddingRight = '20px';
- inner.appendChild(input);
-
- var cross = document.createElement('img');
- cross.setAttribute('src', Sidebar.prototype.searchImage);
- cross.setAttribute('title', mxResources.get('search'));
- cross.style.position = 'relative';
- cross.style.left = '-18px';
-
- if (mxClient.IS_QUIRKS)
- {
- input.style.height = '28px';
- cross.style.top = '-4px';
- }
- else
- {
- cross.style.top = '1px';
- }
-
- // Needed to block event transparency in IE
- cross.style.background = 'url(\'' + this.editorUi.editor.transparentImage + '\')';
-
- var find;
-
- inner.appendChild(cross);
- div.appendChild(inner);
-
- var center = document.createElement('center');
- var button = mxUtils.button(mxResources.get('moreResults'), function()
- {
- find();
- });
- button.style.display = 'none';
-
- // Workaround for inherited line-height in quirks mode
- button.style.lineHeight = 'normal';
- button.style.fontSize = '12px';
- button.style.padding = '6px 12px 6px 12px';
- button.style.marginTop = '4px';
- button.style.marginBottom = '8px';
- center.style.paddingTop = '4px';
- center.style.paddingBottom = '4px';
-
- center.appendChild(button);
- div.appendChild(center);
-
- var searchTerm = '';
- var active = false;
- var complete = false;
- var page = 0;
- var hash = new Object();
-
- // Count is dynamically updated below
- var count = 12;
-
- var clearDiv = mxUtils.bind(this, function()
- {
- active = false;
- this.currentSearch = null;
- var child = div.firstChild;
-
- while (child != null)
- {
- var next = child.nextSibling;
-
- if (child != inner && child != center)
- {
- child.parentNode.removeChild(child);
- }
-
- child = next;
- }
- });
-
- mxEvent.addListener(cross, 'click', function()
- {
- if (cross.getAttribute('src') == Dialog.prototype.closeImage)
- {
- cross.setAttribute('src', Sidebar.prototype.searchImage);
- cross.setAttribute('title', mxResources.get('search'));
- button.style.display = 'none';
- input.value = '';
- searchTerm = '';
- clearDiv();
- }
-
- input.focus();
- });
-
- find = mxUtils.bind(this, function()
- {
- // Shows 4 rows (minimum 4 results)
- count = 4 * Math.max(1, Math.floor(this.container.clientWidth / (this.thumbWidth + 10)));
- this.hideTooltip();
-
- if (input.value != '')
- {
- if (center.parentNode != null)
- {
- if (searchTerm != input.value)
- {
- clearDiv();
- searchTerm = input.value;
- hash = new Object();
- complete = false;
- page = 0;
- }
-
- if (!active && !complete)
- {
- button.setAttribute('disabled', 'true');
- button.style.display = '';
- button.style.cursor = 'wait';
- button.innerHTML = mxResources.get('loading') + '...';
- active = true;
-
- // Ignores old results
- var current = new Object();
- this.currentSearch = current;
-
- this.searchEntries(searchTerm, count, page, mxUtils.bind(this, function(results, len, more, terms)
- {
- if (this.currentSearch == current)
- {
- results = (results != null) ? results : [];
- active = false;
- page++;
- this.insertSearchHint(div, searchTerm, count, page, results, len, more, terms);
-
- // Allows to repeat the search
- if (results.length == 0 && page == 1)
- {
- searchTerm = '';
- }
-
- if (center.parentNode != null)
- {
- center.parentNode.removeChild(center);
- }
-
- for (var i = 0; i < results.length; i++)
- {
- (mxUtils.bind(this, function(result)
- {
- try
- {
- var elt = result();
-
- // Avoids duplicates in results
- if (hash[elt.innerHTML] == null)
- {
- hash[elt.innerHTML] = (result.parentLibraries != null) ? result.parentLibraries.slice() : [];
- div.appendChild(elt);
- }
- else if (result.parentLibraries != null)
- {
- hash[elt.innerHTML] = hash[elt.innerHTML].concat(result.parentLibraries);
- }
-
- mxEvent.addGestureListeners(elt, null, null, mxUtils.bind(this, function(evt)
- {
- var libs = hash[elt.innerHTML];
-
- if (mxEvent.isPopupTrigger(evt))
- {
- this.showPopupMenuForEntry(elt, libs, evt);
- }
- }));
-
- // Disables the built-in context menu
- mxEvent.disableContextMenu(elt);
- }
- catch (e)
- {
- // ignore
- }
- }))(results[i]);
- }
-
- if (more)
- {
- button.removeAttribute('disabled');
- button.innerHTML = mxResources.get('moreResults');
- }
- else
- {
- button.innerHTML = mxResources.get('reset');
- button.style.display = 'none';
- complete = true;
- }
-
- button.style.cursor = '';
- div.appendChild(center);
- }
- }), mxUtils.bind(this, function()
- {
- // TODO: Error handling
- button.style.cursor = '';
- }));
- }
- }
- }
- else
- {
- clearDiv();
- input.value = '';
- searchTerm = '';
- hash = new Object();
- button.style.display = 'none';
- complete = false;
- input.focus();
- }
- });
-
- mxEvent.addListener(input, 'keydown', mxUtils.bind(this, function(evt)
- {
- if (evt.keyCode == 13 /* Enter */)
- {
- find();
- mxEvent.consume(evt);
- }
- }));
-
- mxEvent.addListener(input, 'keyup', mxUtils.bind(this, function(evt)
- {
- if (input.value == '')
- {
- cross.setAttribute('src', Sidebar.prototype.searchImage);
- cross.setAttribute('title', mxResources.get('search'));
- }
- else
- {
- cross.setAttribute('src', Dialog.prototype.closeImage);
- cross.setAttribute('title', mxResources.get('reset'));
- }
-
- if (input.value == '')
- {
- complete = true;
- button.style.display = 'none';
- }
- else if (input.value != searchTerm)
- {
- button.style.display = 'none';
- complete = false;
- }
- else if (!active)
- {
- if (complete)
- {
- button.style.display = 'none';
- }
- else
- {
- button.style.display = '';
- }
- }
- }));
-
- // Workaround for blocked text selection in Editor
- mxEvent.addListener(input, 'mousedown', function(evt)
- {
- if (evt.stopPropagation)
- {
- evt.stopPropagation();
- }
-
- evt.cancelBubble = true;
- });
-
- // Workaround for blocked text selection in Editor
- mxEvent.addListener(input, 'selectstart', function(evt)
- {
- if (evt.stopPropagation)
- {
- evt.stopPropagation();
- }
-
- evt.cancelBubble = true;
- });
-
- var outer = document.createElement('div');
- outer.appendChild(div);
- this.container.appendChild(outer);
-
- // Keeps references to the DOM nodes
- this.palettes['search'] = [elt, outer];
-};
-
-/**
- * Adds the general palette to the sidebar.
- */
-Sidebar.prototype.insertSearchHint = function(div, searchTerm, count, page, results, len, more, terms)
-{
- if (results.length == 0 && page == 1)
- {
- var err = document.createElement('div');
- err.className = 'geTitle';
- err.style.cssText = 'background-color:transparent;border-color:transparent;' +
- 'color:gray;padding:6px 0px 0px 0px !important;margin:4px 8px 4px 8px;' +
- 'text-align:center;cursor:default !important';
-
- mxUtils.write(err, mxResources.get('noResultsFor', [searchTerm]));
- div.appendChild(err);
- }
-};
-
-/**
- * Adds the general palette to the sidebar.
- */
-Sidebar.prototype.addGeneralPalette = function(expand)
-{
- var lineTags = 'line lines connector connectors connection connections arrow arrows ';
- this.setCurrentSearchEntryLibrary('general', 'general');
-
- var fns = [
- this.createVertexTemplateEntry('rounded=0;whiteSpace=wrap;html=1;', 120, 60, '', 'Rectangle', null, null, 'rect rectangle box'),
- this.createVertexTemplateEntry('rounded=1;whiteSpace=wrap;html=1;', 120, 60, '', 'Rounded Rectangle', null, null, 'rounded rect rectangle box'),
- // Explicit strokecolor/fillcolor=none is a workaround to maintain transparent background regardless of current style
- this.createVertexTemplateEntry('text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;',
- 40, 20, 'Text', 'Text', null, null, 'text textbox textarea label'),
- this.createVertexTemplateEntry('text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;', 190, 120,
- '<h1>Heading</h1><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>',
- 'Textbox', null, null, 'text textbox textarea'),
- this.createVertexTemplateEntry('ellipse;whiteSpace=wrap;html=1;', 120, 80, '', 'Ellipse', null, null, 'oval ellipse state'),
- this.createVertexTemplateEntry('whiteSpace=wrap;html=1;aspect=fixed;', 80, 80, '', 'Square', null, null, 'square'),
- this.createVertexTemplateEntry('ellipse;whiteSpace=wrap;html=1;aspect=fixed;', 80, 80, '', 'Circle', null, null, 'circle'),
- this.createVertexTemplateEntry('shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;', 120, 60, '', 'Process', null, null, 'process task'),
- this.createVertexTemplateEntry('rhombus;whiteSpace=wrap;html=1;', 80, 80, '', 'Diamond', null, null, 'diamond rhombus if condition decision conditional question test'),
- this.createVertexTemplateEntry('shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;', 120, 60, '', 'Parallelogram'),
- this.createVertexTemplateEntry('shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;', 120, 80, '', 'Hexagon', null, null, 'hexagon preparation'),
- this.createVertexTemplateEntry('triangle;whiteSpace=wrap;html=1;', 60, 80, '', 'Triangle', null, null, 'triangle logic inverter buffer'),
- this.createVertexTemplateEntry('shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;', 60, 80, '', 'Cylinder', null, null, 'cylinder data database'),
- this.createVertexTemplateEntry('ellipse;shape=cloud;whiteSpace=wrap;html=1;', 120, 80, '', 'Cloud', null, null, 'cloud network'),
- this.createVertexTemplateEntry('shape=document;whiteSpace=wrap;html=1;boundedLbl=1;', 120, 80, '', 'Document'),
- this.createVertexTemplateEntry('shape=internalStorage;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Internal Storage'),
- this.createVertexTemplateEntry('shape=cube;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;darkOpacity=0.05;darkOpacity2=0.1;', 120, 80, '', 'Cube'),
- this.createVertexTemplateEntry('shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;', 120, 80, '', 'Step'),
- this.createVertexTemplateEntry('shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;', 120, 60, '', 'Trapezoid'),
- this.createVertexTemplateEntry('shape=tape;whiteSpace=wrap;html=1;', 120, 100, '', 'Tape'),
- this.createVertexTemplateEntry('shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;', 80, 100, '', 'Note'),
- this.createVertexTemplateEntry('shape=card;whiteSpace=wrap;html=1;', 80, 100, '', 'Card'),
- this.createVertexTemplateEntry('shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;', 120, 80, '', 'Callout', null, null, 'bubble chat thought speech message'),
- this.createVertexTemplateEntry('shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;', 30, 60, 'Actor', 'Actor', false, null, 'user person human stickman'),
- this.createVertexTemplateEntry('shape=xor;whiteSpace=wrap;html=1;', 60, 80, '', 'Or', null, null, 'logic or'),
- this.createVertexTemplateEntry('shape=or;whiteSpace=wrap;html=1;', 60, 80, '', 'And', null, null, 'logic and'),
- this.createVertexTemplateEntry('shape=dataStorage;whiteSpace=wrap;html=1;fixedSize=1;', 100, 80, '', 'Data Storage'),
- this.addEntry('curve', mxUtils.bind(this, function()
- {
- var cell = new mxCell('', new mxGeometry(0, 0, 50, 50), 'curved=1;endArrow=classic;html=1;');
- cell.geometry.setTerminalPoint(new mxPoint(0, 50), true);
- cell.geometry.setTerminalPoint(new mxPoint(50, 0), false);
- cell.geometry.points = [new mxPoint(50, 50), new mxPoint(0, 0)];
- cell.geometry.relative = true;
- cell.edge = true;
-
- return this.createEdgeTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Curve');
- })),
- this.createEdgeTemplateEntry('shape=flexArrow;endArrow=classic;startArrow=classic;html=1;', 50, 50, '', 'Bidirectional Arrow', null, lineTags + 'bidirectional'),
- this.createEdgeTemplateEntry('shape=flexArrow;endArrow=classic;html=1;', 50, 50, '', 'Arrow', null, lineTags + 'directional directed'),
- this.createEdgeTemplateEntry('endArrow=none;dashed=1;html=1;', 50, 50, '', 'Dashed Line', null, lineTags + 'dashed undirected no'),
- this.createEdgeTemplateEntry('endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;', 50, 50, '', 'Dotted Line', null, lineTags + 'dotted undirected no'),
- this.createEdgeTemplateEntry('endArrow=none;html=1;', 50, 50, '', 'Line', null, lineTags + 'simple undirected plain blank no'),
- this.createEdgeTemplateEntry('endArrow=classic;startArrow=classic;html=1;', 50, 50, '', 'Bidirectional Connector', null, lineTags + 'bidirectional'),
- this.createEdgeTemplateEntry('endArrow=classic;html=1;', 50, 50, '', 'Directional Connector', null, lineTags + 'directional directed'),
- this.createEdgeTemplateEntry('shape=link;html=1;', 100, 0, '', 'Link', null, lineTags + 'link'),
- this.addEntry(lineTags + 'edge title', mxUtils.bind(this, function()
- {
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=classic;html=1;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(100, 0), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- var cell0 = new mxCell('Label', new mxGeometry(0, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=center;verticalAlign=middle;');
- cell0.geometry.relative = true;
- cell0.setConnectable(false);
- cell0.vertex = true;
- edge.insert(cell0);
-
- return this.createEdgeTemplateFromCells([edge], 100, 0, 'Connector with Label');
- })),
- this.addEntry(lineTags + 'edge title multiplicity', mxUtils.bind(this, function()
- {
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=classic;html=1;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(160, 0), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- var cell0 = new mxCell('Label', new mxGeometry(0, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=center;verticalAlign=middle;');
- cell0.geometry.relative = true;
- cell0.setConnectable(false);
- cell0.vertex = true;
- edge.insert(cell0);
-
- var cell1 = new mxCell('Source', new mxGeometry(-1, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=left;verticalAlign=bottom;');
- cell1.geometry.relative = true;
- cell1.setConnectable(false);
- cell1.vertex = true;
- edge.insert(cell1);
-
- return this.createEdgeTemplateFromCells([edge], 160, 0, 'Connector with 2 Labels');
- })),
- this.addEntry(lineTags + 'edge title multiplicity', mxUtils.bind(this, function()
- {
- var edge = new mxCell('Label', new mxGeometry(0, 0, 0, 0), 'endArrow=classic;html=1;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(160, 0), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- var cell0 = new mxCell('Label', new mxGeometry(0, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=center;verticalAlign=middle;');
- cell0.geometry.relative = true;
- cell0.setConnectable(false);
- cell0.vertex = true;
- edge.insert(cell0);
-
- var cell1 = new mxCell('Source', new mxGeometry(-1, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=left;verticalAlign=bottom;');
- cell1.geometry.relative = true;
- cell1.setConnectable(false);
- cell1.vertex = true;
- edge.insert(cell1);
-
- var cell2 = new mxCell('Target', new mxGeometry(1, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=right;verticalAlign=bottom;');
- cell2.geometry.relative = true;
- cell2.setConnectable(false);
- cell2.vertex = true;
- edge.insert(cell2);
-
- return this.createEdgeTemplateFromCells([edge], 160, 0, 'Connector with 3 Labels');
- })),
- this.addEntry(lineTags + 'edge shape symbol message mail email', mxUtils.bind(this, function()
- {
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=classic;html=1;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(100, 0), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- var cell = new mxCell('', new mxGeometry(0, 0, 20, 14), 'shape=message;html=1;outlineConnect=0;');
- cell.geometry.relative = true;
- cell.vertex = true;
- cell.geometry.offset = new mxPoint(-10, -7);
- edge.insert(cell);
-
- return this.createEdgeTemplateFromCells([edge], 100, 0, 'Connector with Symbol');
- }))
- ];
-
- this.addPaletteFunctions('general', mxResources.get('general'), (expand != null) ? expand : true, fns);
- this.setCurrentSearchEntryLibrary();
-};
-
-/**
- * Adds the general palette to the sidebar.
- */
-Sidebar.prototype.addMiscPalette = function(expand)
-{
- var sb = this;
- var lineTags = 'line lines connector connectors connection connections arrow arrows '
- this.setCurrentSearchEntryLibrary('general', 'misc');
-
- var fns = [
- this.createVertexTemplateEntry('text;strokeColor=none;fillColor=none;html=1;fontSize=24;fontStyle=1;verticalAlign=middle;align=center;', 100, 40, 'Title', 'Title', null, null, 'text heading title'),
- this.createVertexTemplateEntry('text;strokeColor=none;fillColor=none;html=1;whiteSpace=wrap;verticalAlign=middle;overflow=hidden;', 100, 80,
- '<ul><li>Value 1</li><li>Value 2</li><li>Value 3</li></ul>', 'Unordered List'),
- this.createVertexTemplateEntry('text;strokeColor=none;fillColor=none;html=1;whiteSpace=wrap;verticalAlign=middle;overflow=hidden;', 100, 80,
- '<ol><li>Value 1</li><li>Value 2</li><li>Value 3</li></ol>', 'Ordered List'),
- this.addDataEntry('table', 180, 120, 'Table 1', '7ZjJTsMwEIafJleUhZZybVgucAFewDTT2pLjiewpaXl6xolLVQFqWBJArZRKns2xv5H7y4myvFxdW1HJWyxAR9lllOUWkdpRucpB6yiNVRFlF1GaxvyL0qsPokkTjSthwVCXgrQteBJ6Ca2ndTha6+BwUlR+SOLRu6aSSl7mRcLDWiqC+0rMfLzmTbDPkbB0r569K2Z7hoaEMmBDzQy1FpVTzWRthlS6uBFrXNLmNRtrGpYHlmD14RYbV9jfNWAJZNecUquCZMiYtBhiCWohN2WBTSxc61i81m6J8SBAex9g1h0gL5mU0HcwI2EWXVi+ZVVYrB6EXQAFR4XKENjLJ6bhgm+utM5Ro0du0PgXEVYhqGG+qX1EIiyDYQOY10kbKKMpP4wpj09G0Yh3k7OdbG1+fLqlHI0jy432c4BwVIPr3MD0aw08/YH+nfbbP2N89rZ/324NMsq5xppNqYoCTFfG2V7G454Qjw4c8WoX7wDEx0fiO3/wAyA/O+pAbzqw3m3TELIwOZQTdPZrsnB+4IiHl4UkPiIfWheS5CgMfQvDZEBhSD5xY/7fZyjZf63u7dD0fKv++5B/QRwO5ia8h3mP6sDm9tNeE9v58vcC'),
- this.addDataEntry('table', 180, 120, 'Table 2', '7ZjBbqMwEIafhmuFISTptbTbS/eyrfbuBie2ZDzITEqyT79jMMlGWVTUBlqVSkTyjGeM+SbDLxPEab67t7yQPyETOojvgji1ANiM8l0qtA6iUGVBfBtEUUi/IPrRMcvq2bDgVhjskxA1CS9cb0XjaRwl7rV3lJIXboj82bluJOa0zVtGw0oqFI8FX7n5ih6CfCVyi4/qj3OFZK/AIFdGWJ+zAq15Uap6sSZCKp098D1ssb1Na7nobW4eKL/00Raqf02/f2FR7DoZ1C4P4F5ALtDuKaRSGUofsWw4hVKojWzTPLyQl41jc8g9IqWBp/p/wnF/wrRlVFz/EivkZtMH9jnMzELxxO1GoHcUoAwKe/dCNFpoa6V1ChpcTQwYdyOEwk9qsW5znwER8ha8B3NYtIaS3NBFmNLwKgkSepqUbHa06XLhFlMwJVr6J7g1BC+xEiX2LWD0tgLOLlC/2Vn9ftfDKGQXLaQxLvpYyHfXCIjpWkNFplRZJkxf2PGrsOcDsU46WV+2aT49690p5xHQzzvRx5NEf3j3j8B+8S0Rg0nE/rRMYyjGsrOVZl+0lRYfphjXnayTabEeXzFY2Ml+Pkn2Y0oGY9+aMbRmLEfUDHZ+EG+bafFFm4m9fiofrHvOD+Ut7eXEaH+AbnSfqK+nCX9A4SDz+DGxnjv51vgX'),
- this.addDataEntry('table title', 180, 120, 'Table with Title 1', '7ZhRb6MwDMc/Da8nAmPdvZbu9nJ7WfcFMnAhUohR4o12n34OpKumrmqlDXa6VqJS/Lcdkp8bWSFK82Z9Z2Vb32MJOkpvozS3iDSMmnUOWkdJrMooXURJEvMvSv4c8IreG7fSgqFTEpIh4UXqZxiUR/mkYVAdbXRQXS1bP6Tem85ranitC8HDrlYEy1YW3t/xTlhzJC0t1auX0piFAg1JZcCGpAK1lq1T/WyLPqJWuvwrN/hM2/dsrfmKs5dhMT5balUZHhe8Sz/lPOwCLMH6IIleChjuABsgu+GQTpVUh4ibgVZcg6rqbVoWROkGoXrP3YHlQWD7Oed0j/NBxLxkUlI/QEHSVKfQ3odZWmwfpa2AgtCi8qhuX5iGC9pKaZ2jRl8Tg8a/iLANTg2rbe4TEmETDBvAvE/aQ8nm/DCmPP6VRRnvJmdb7Gx+fLilHI0jy/8EPwdIRx04OrWAyecF3ATEoUzH6nn1DeW8GrecxvjoXTm/XClksiuNHZu1KkswpyJPj56Z65EQZ2eOeP0R7wTEry/E+4RkOuSzS1sYuy3MJmwLN+dygmY/1hZ+nzni6duCiC/Ip+4LQlwaw9iNQYgJO4PYv2j/p4dIHL9mj3ZqRr5l//uQf6A7nM1V+AjzEdsDm7svgr3vwwfDNw=='),
- this.addDataEntry('table title', 180, 150, 'Table with Title 2', '7Zhdb5swFIZ/DbcTHyVrbiFdb7Kbptq9Cw5YMj7IPi1kv37HYJK1FDWbQoOmSUSyz4dt3id+L/CitGrvNavL75Bz6UV3XpRqAOxHVZtyKb3QF7kXbbww9Onnhd8mskGX9WumucJzGsK+4YXJZ95HHtmT5H3U4EG6qClZbYfYZaOkxIrOuglo2JQC+a5mmc039CYUM8g07sRPG4p8CmSgkAnFtWvKQEpWG9GttukqSiHzLTvAMw77DLNkL1qeP0BjXLeGZkuLGde6p8V37qw2zaQoFI0zEsHumLiX5Bp5OylUF3Iq3XOoOOoDlTQix9JV3PZi+iUXRTm0xS7ITB8ojr0n3WngpH8fQzTCMEmAjoyCyQeeIVPFOTDGWuca6kemC44uUIOwUt29kBpHVYWUKUiwyBQouxFC7ZKS74feJ0CEaiDjhDku2okSJ/SQTKn/JfZiepuU5sFpTo8t15iCMqjpj2LX4Mxgww2eCzB8H+DBSewwfcQzugDOmxHO4KI8lbLVJ55/jMp/gwpI2r2EhqalyHOuztU8+vDS3MykcTzS+Ec3DP2Faz24U1+bGNpQqGLbd65mgNG+BvH7BZgLzupf8LO34JblZ6tP9LOvI5yX5bkcP1tdzc9uJ/1s4VrP52cTMK7gZ+v/fja3n60/0c8Cf8QzWvYl++s7tL6aoQXBpKMtXOz5HG2CxvyORtPTR4Uu9+qbwy8='),
- this.addDataEntry('crossfunctional cross-functional cross functional flowchart swimlane table', 400, 400, 'Cross-Functional Flowchart', '7ZhRb5swEMc/DY+bMCRt97jQpi+tVC2fwINbbMnYyD4C6aefjaHpBrTRlNCoTALJPp9t+P25O5kgTvL6XtOCPaoMRBDfBXGilULfyusEhAiikGdBfBtEUWjvIFqPjJJmNCyoBonHTIj8hB0VJXiL3dyYL+tSpsiVpM55LVSVMqrROxvci9bZMFq4JtKfzrRKGRfZA92rEjtr11tpVT1wCcYOhM5ViTKXry0G7RYb/uwWXDgDw9wCuSW2WTGOsClo6gYri8uvIGhheLN1s4KGtNSG7+AHGL+Os0JdUJm1nUJxiaDvdhZQt/EvJXHTvpTbjAq+lbadgnO1hhYSaIR6FHRjainfg8oB9d66VDxD5j0WoRcjZMC3DP8yUuMN25e5B91so5VuWMa4J+P3FJW2JtLXrOK5oNLJxZTmz/blqXhNp3mO5cpe9smS8OsyWNp5ie2TQ99ezl1joqRBTXmDAajBCgxejprHKBcNK7fvBPIz3hOSRCcQctET8olRA+8JmSopIW2j8GOD6Sji8TDxepT4C9yTE1+OEo/mQ5xcTYn8ahR5PB/k0c2UyK9HC8SbX/mnLBAnqAlD8XK+onDTE+/fw+TiQF9fTin4Nl/O0xYAEs6X9LR5n5Ae6S7xv1lr/yf+4cQ/pN75Ej/pH88/UZyQkRPzR6R+0j9Bz4f0xMm/f8adD+qzZn/bPfw5bMb++LH4Gw=='),
- this.createVertexTemplateEntry('text;html=1;strokeColor=#c0c0c0;fillColor=#ffffff;overflow=fill;rounded=0;', 280, 160,
- '<table border="1" width="100%" height="100%" cellpadding="4" style="width:100%;height:100%;border-collapse:collapse;">' +
- '<tr style="background-color:#A7C942;color:#ffffff;border:1px solid #98bf21;"><th align="left">Title 1</th><th align="left">Title 2</th><th align="left">Title 3</th></tr>' +
- '<tr style="border:1px solid #98bf21;"><td>Value 1</td><td>Value 2</td><td>Value 3</td></tr>' +
- '<tr style="background-color:#EAF2D3;border:1px solid #98bf21;"><td>Value 4</td><td>Value 5</td><td>Value 6</td></tr>' +
- '<tr style="border:1px solid #98bf21;"><td>Value 7</td><td>Value 8</td><td>Value 9</td></tr>' +
- '<tr style="background-color:#EAF2D3;border:1px solid #98bf21;"><td>Value 10</td><td>Value 11</td><td>Value 12</td></tr></table>', 'HTML Table 1'),
- this.createVertexTemplateEntry('text;html=1;strokeColor=#c0c0c0;fillColor=none;overflow=fill;', 180, 140,
- '<table border="0" width="100%" height="100%" style="width:100%;height:100%;border-collapse:collapse;">' +
- '<tr><td align="center">Value 1</td><td align="center">Value 2</td><td align="center">Value 3</td></tr>' +
- '<tr><td align="center">Value 4</td><td align="center">Value 5</td><td align="center">Value 6</td></tr>' +
- '<tr><td align="center">Value 7</td><td align="center">Value 8</td><td align="center">Value 9</td></tr></table>', 'HTML Table 2'),
- this.createVertexTemplateEntry('text;html=1;strokeColor=none;fillColor=none;overflow=fill;', 180, 140,
- '<table border="1" width="100%" height="100%" style="width:100%;height:100%;border-collapse:collapse;">' +
- '<tr><td align="center">Value 1</td><td align="center">Value 2</td><td align="center">Value 3</td></tr>' +
- '<tr><td align="center">Value 4</td><td align="center">Value 5</td><td align="center">Value 6</td></tr>' +
- '<tr><td align="center">Value 7</td><td align="center">Value 8</td><td align="center">Value 9</td></tr></table>', 'HTML Table 3'),
- this.createVertexTemplateEntry('text;html=1;strokeColor=none;fillColor=none;overflow=fill;', 160, 140,
- '<table border="1" width="100%" height="100%" cellpadding="4" style="width:100%;height:100%;border-collapse:collapse;">' +
- '<tr><th align="center"><b>Title</b></th></tr>' +
- '<tr><td align="center">Section 1.1\nSection 1.2\nSection 1.3</td></tr>' +
- '<tr><td align="center">Section 2.1\nSection 2.2\nSection 2.3</td></tr></table>', 'HTML Table 4'),
- this.addEntry('link hyperlink', mxUtils.bind(this, function()
- {
- var cell = new mxCell('Link', new mxGeometry(0, 0, 60, 40), 'text;html=1;strokeColor=none;fillColor=none;whiteSpace=wrap;align=center;verticalAlign=middle;fontColor=#0000EE;fontStyle=4;');
- cell.vertex = true;
- this.graph.setLinkForCell(cell, 'https://www.draw.io');
-
- return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Link');
- })),
- this.addEntry('timestamp date time text label', mxUtils.bind(this, function()
- {
- var cell = new mxCell('%date{ddd mmm dd yyyy HH:MM:ss}%', new mxGeometry(0, 0, 160, 20), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;');
- cell.vertex = true;
- this.graph.setAttributeForCell(cell, 'placeholders', '1');
-
- return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Timestamp');
- })),
- this.addEntry('variable placeholder metadata hello world text label', mxUtils.bind(this, function()
- {
- var cell = new mxCell('%name% Text', new mxGeometry(0, 0, 80, 20), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;');
- cell.vertex = true;
- this.graph.setAttributeForCell(cell, 'placeholders', '1');
- this.graph.setAttributeForCell(cell, 'name', 'Variable');
-
- return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Variable');
- })),
- this.createVertexTemplateEntry('shape=ext;double=1;rounded=0;whiteSpace=wrap;html=1;', 120, 80, '', 'Double Rectangle', null, null, 'rect rectangle box double'),
- this.createVertexTemplateEntry('shape=ext;double=1;rounded=1;whiteSpace=wrap;html=1;', 120, 80, '', 'Double Rounded Rectangle', null, null, 'rounded rect rectangle box double'),
- this.createVertexTemplateEntry('ellipse;shape=doubleEllipse;whiteSpace=wrap;html=1;', 100, 60, '', 'Double Ellipse', null, null, 'oval ellipse start end state double'),
- this.createVertexTemplateEntry('shape=ext;double=1;whiteSpace=wrap;html=1;aspect=fixed;', 80, 80, '', 'Double Square', null, null, 'double square'),
- this.createVertexTemplateEntry('ellipse;shape=doubleEllipse;whiteSpace=wrap;html=1;aspect=fixed;', 80, 80, '', 'Double Circle', null, null, 'double circle'),
- this.createVertexTemplateEntry('rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillWeight=4;hachureGap=8;hachureAngle=45;fillColor=#1ba1e2;sketch=1;', 120, 60, '', 'Rectangle Sketch', true, null, 'rectangle rect box text sketch comic retro'),
- this.createVertexTemplateEntry('ellipse;whiteSpace=wrap;html=1;strokeWidth=2;fillWeight=2;hachureGap=8;fillColor=#990000;fillStyle=dots;sketch=1;', 120, 60, '', 'Ellipse Sketch', true, null, 'ellipse oval sketch comic retro'),
- this.createVertexTemplateEntry('rhombus;whiteSpace=wrap;html=1;strokeWidth=2;fillWeight=-1;hachureGap=8;fillStyle=cross-hatch;fillColor=#006600;sketch=1;', 120, 60, '', 'Diamond Sketch', true, null, 'diamond sketch comic retro'),
- this.createVertexTemplateEntry('html=1;whiteSpace=wrap;shape=isoCube2;backgroundOutline=1;isoAngle=15;', 90, 100, '', 'Isometric Cube', true, null, 'cube box iso isometric'),
- this.createVertexTemplateEntry('html=1;whiteSpace=wrap;aspect=fixed;shape=isoRectangle;', 150, 90, '', 'Isometric Square', true, null, 'rectangle rect box iso isometric'),
- this.createEdgeTemplateEntry('edgeStyle=isometricEdgeStyle;endArrow=none;html=1;', 50, 100, '', 'Isometric Edge 1'),
- this.createEdgeTemplateEntry('edgeStyle=isometricEdgeStyle;endArrow=none;html=1;elbow=vertical;', 50, 100, '', 'Isometric Edge 2'),
- this.createVertexTemplateEntry('shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;', 20, 120, '', 'Curly Bracket'),
- this.createVertexTemplateEntry('line;strokeWidth=2;html=1;', 160, 10, '', 'Horizontal Line'),
- this.createVertexTemplateEntry('line;strokeWidth=2;direction=south;html=1;', 10, 160, '', 'Vertical Line'),
- this.createVertexTemplateEntry('line;strokeWidth=4;html=1;perimeter=backbonePerimeter;points=[];outlineConnect=0;', 160, 10, '', 'Horizontal Backbone', false, null, 'backbone bus network'),
- this.createVertexTemplateEntry('line;strokeWidth=4;direction=south;html=1;perimeter=backbonePerimeter;points=[];outlineConnect=0;', 10, 160, '', 'Vertical Backbone', false, null, 'backbone bus network'),
- this.createVertexTemplateEntry('shape=crossbar;whiteSpace=wrap;html=1;rounded=1;', 120, 20, '', 'Crossbar', false, null, 'crossbar distance measure dimension unit'),
- this.createVertexTemplateEntry('shape=image;html=1;verticalLabelPosition=bottom;verticalAlign=top;imageAspect=1;aspect=fixed;image=' + this.gearImage, 52, 61, '', 'Image (Fixed Aspect)', false, null, 'fixed image icon symbol'),
- this.createVertexTemplateEntry('shape=image;html=1;verticalLabelPosition=bottom;verticalAlign=top;imageAspect=0;image=' + this.gearImage, 50, 60, '', 'Image (Variable Aspect)', false, null, 'strechted image icon symbol'),
- this.createVertexTemplateEntry('icon;html=1;image=' + this.gearImage, 60, 60, 'Icon', 'Icon', false, null, 'icon image symbol'),
- this.createVertexTemplateEntry('label;whiteSpace=wrap;html=1;image=' + this.gearImage, 140, 60, 'Label', 'Label 1', null, null, 'label image icon symbol'),
- this.createVertexTemplateEntry('label;whiteSpace=wrap;html=1;align=center;verticalAlign=bottom;spacingLeft=0;spacingBottom=4;imageAlign=center;imageVerticalAlign=top;image=' + this.gearImage, 120, 80, 'Label', 'Label 2', null, null, 'label image icon symbol'),
- this.addEntry('shape group container', function()
- {
- var cell = new mxCell('Label', new mxGeometry(0, 0, 160, 70),
- 'html=1;whiteSpace=wrap;container=1;recursiveResize=0;collapsible=0;');
- cell.vertex = true;
-
- var symbol = new mxCell('', new mxGeometry(20, 20, 20, 30), 'triangle;html=1;whiteSpace=wrap;');
- symbol.vertex = true;
- cell.insert(symbol);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Shape Group');
- }),
- this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;left=0;right=0;fillColor=none;', 120, 60, '', 'Partial Rectangle'),
- this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;bottom=1;right=1;left=1;top=0;fillColor=none;routingCenterX=-0.5;', 120, 60, '', 'Partial Rectangle'),
- this.createEdgeTemplateEntry('edgeStyle=segmentEdgeStyle;endArrow=classic;html=1;', 50, 50, '', 'Manual Line', null, lineTags + 'manual'),
- this.createEdgeTemplateEntry('shape=filledEdge;rounded=0;fixDash=1;endArrow=none;strokeWidth=10;fillColor=#ffffff;edgeStyle=orthogonalEdgeStyle;', 60, 40, '', 'Filled Edge'),
- this.createEdgeTemplateEntry('edgeStyle=elbowEdgeStyle;elbow=horizontal;endArrow=classic;html=1;', 50, 50, '', 'Horizontal Elbow', null, lineTags + 'elbow horizontal'),
- this.createEdgeTemplateEntry('edgeStyle=elbowEdgeStyle;elbow=vertical;endArrow=classic;html=1;', 50, 50, '', 'Vertical Elbow', null, lineTags + 'elbow vertical')
- ];
-
- this.addPaletteFunctions('misc', mxResources.get('misc'), (expand != null) ? expand : true, fns);
- this.setCurrentSearchEntryLibrary();
-};
-/**
- * Adds the container palette to the sidebar.
- */
-Sidebar.prototype.addAdvancedPalette = function(expand)
-{
- this.setCurrentSearchEntryLibrary('general', 'advanced');
- this.addPaletteFunctions('advanced', mxResources.get('advanced'), (expand != null) ? expand : false, this.createAdvancedShapes());
- this.setCurrentSearchEntryLibrary();
-};
-
-/**
- * Adds the general palette to the sidebar.
- */
-Sidebar.prototype.addBasicPalette = function(dir)
-{
- this.setCurrentSearchEntryLibrary('basic');
- this.addStencilPalette('basic', mxResources.get('basic'), dir + '/basic.xml',
- ';whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#000000;strokeWidth=2',
- null, null, null, null, [
- this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;top=0;bottom=0;fillColor=none;', 120, 60, '', 'Partial Rectangle'),
- this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;right=0;top=0;bottom=0;fillColor=none;routingCenterX=-0.5;', 120, 60, '', 'Partial Rectangle'),
- this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;bottom=0;right=0;fillColor=none;', 120, 60, '', 'Partial Rectangle'),
- this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;top=0;left=0;fillColor=none;', 120, 60, '', 'Partial Rectangle')
- ]);
- this.setCurrentSearchEntryLibrary();
-};
-
-/**
- * Adds the container palette to the sidebar.
- */
-Sidebar.prototype.createAdvancedShapes = function()
-{
- // Avoids having to bind all functions to "this"
- var sb = this;
-
- // Reusable cells
- var field = new mxCell('List Item', new mxGeometry(0, 0, 60, 26), 'text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field.vertex = true;
-
- return [
- this.createVertexTemplateEntry('shape=tapeData;whiteSpace=wrap;html=1;perimeter=ellipsePerimeter;', 80, 80, '', 'Tape Data'),
- this.createVertexTemplateEntry('shape=manualInput;whiteSpace=wrap;html=1;', 80, 80, '', 'Manual Input'),
- this.createVertexTemplateEntry('shape=loopLimit;whiteSpace=wrap;html=1;', 100, 80, '', 'Loop Limit'),
- this.createVertexTemplateEntry('shape=offPageConnector;whiteSpace=wrap;html=1;', 80, 80, '', 'Off Page Connector'),
- this.createVertexTemplateEntry('shape=delay;whiteSpace=wrap;html=1;', 80, 40, '', 'Delay'),
- this.createVertexTemplateEntry('shape=display;whiteSpace=wrap;html=1;', 80, 40, '', 'Display'),
- this.createVertexTemplateEntry('shape=singleArrow;direction=west;whiteSpace=wrap;html=1;', 100, 60, '', 'Arrow Left'),
- this.createVertexTemplateEntry('shape=singleArrow;whiteSpace=wrap;html=1;', 100, 60, '', 'Arrow Right'),
- this.createVertexTemplateEntry('shape=singleArrow;direction=north;whiteSpace=wrap;html=1;', 60, 100, '', 'Arrow Up'),
- this.createVertexTemplateEntry('shape=singleArrow;direction=south;whiteSpace=wrap;html=1;', 60, 100, '', 'Arrow Down'),
- this.createVertexTemplateEntry('shape=doubleArrow;whiteSpace=wrap;html=1;', 100, 60, '', 'Double Arrow'),
- this.createVertexTemplateEntry('shape=doubleArrow;direction=south;whiteSpace=wrap;html=1;', 60, 100, '', 'Double Arrow Vertical', null, null, 'double arrow'),
- this.createVertexTemplateEntry('shape=actor;whiteSpace=wrap;html=1;', 40, 60, '', 'User', null, null, 'user person human'),
- this.createVertexTemplateEntry('shape=cross;whiteSpace=wrap;html=1;', 80, 80, '', 'Cross'),
- this.createVertexTemplateEntry('shape=corner;whiteSpace=wrap;html=1;', 80, 80, '', 'Corner'),
- this.createVertexTemplateEntry('shape=tee;whiteSpace=wrap;html=1;', 80, 80, '', 'Tee'),
- this.createVertexTemplateEntry('shape=datastore;whiteSpace=wrap;html=1;', 60, 60, '', 'Data Store', null, null, 'data store cylinder database'),
- this.createVertexTemplateEntry('shape=orEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Or', null, null, 'or circle oval ellipse'),
- this.createVertexTemplateEntry('shape=sumEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Sum', null, null, 'sum circle oval ellipse'),
- this.createVertexTemplateEntry('shape=lineEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Ellipse with horizontal divider', null, null, 'circle oval ellipse'),
- this.createVertexTemplateEntry('shape=lineEllipse;line=vertical;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Ellipse with vertical divider', null, null, 'circle oval ellipse'),
- this.createVertexTemplateEntry('shape=sortShape;perimeter=rhombusPerimeter;whiteSpace=wrap;html=1;', 80, 80, '', 'Sort', null, null, 'sort'),
- this.createVertexTemplateEntry('shape=collate;whiteSpace=wrap;html=1;', 80, 80, '', 'Collate', null, null, 'collate'),
- this.createVertexTemplateEntry('shape=switch;whiteSpace=wrap;html=1;', 60, 60, '', 'Switch', null, null, 'switch router'),
- this.addEntry('process bar', function()
- {
- return sb.createVertexTemplateFromData('zZXRaoMwFIafJpcDjbNrb2233rRQ8AkyPdPQaCRJV+3T7yTG2rUVBoOtgpDzn/xJzncCIdGyateKNeVW5iBI9EqipZLS9KOqXYIQhAY8J9GKUBrgT+jbRDZ02aBhCmrzEwPtDZ9MHKBXdkpmoDWKCVN9VptO+Kw+8kqwGqMkK7nIN6yTB7uTNizbD1FSSsVPsjYMC1qFKHxwIZZSSIVxLZ1/nJNar5+oQPMT7IYCrqUta1ENzuqGaeOFTArBGs3f3Vmtoo2Se7ja1h00kSoHK4bBIKUNy3hdoPYU0mF91i9mT8EEL2ocZ3gKa00ayWujLZY4IfHKFonVDLsRGgXuQ90zBmWgneyTk3yT1iArMKrDKUeem9L3ajHrbSXwohxsQd/ggOleKM7ese048J2/fwuim1uQGmhQCW8vQMkacP3GCQgBFMftHEsr7cYYe95CnmKTPMFbYD8CQ++DGQy+/M5X4ku5wHYmdIktfvk9tecpavThqS3m/0YtnqIWPTy1cD77K2wYjo+Ay317I74A', 296, 100, 'Process Bar');
- }),
- this.createVertexTemplateEntry('swimlane;', 200, 200, 'Container', 'Container', null, null, 'container swimlane lane pool group'),
- this.addEntry('list group erd table', function()
- {
- var cell = new mxCell('List', new mxGeometry(0, 0, 140, 110),
- 'swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;' +
- 'resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;');
- cell.vertex = true;
- cell.insert(sb.cloneCell(field, 'Item 1'));
- cell.insert(sb.cloneCell(field, 'Item 2'));
- cell.insert(sb.cloneCell(field, 'Item 3'));
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'List');
- }),
- this.addEntry('list item entry value group erd table', function()
- {
- return sb.createVertexTemplateFromCells([sb.cloneCell(field, 'List Item')], field.geometry.width, field.geometry.height, 'List Item');
- })
- ];
-};
-
-/**
- * Adds the general palette to the sidebar.
- */
-Sidebar.prototype.addUmlPalette = function(expand)
-{
- // Avoids having to bind all functions to "this"
- var sb = this;
-
- // Reusable cells
- var field = new mxCell('+ field: type', new mxGeometry(0, 0, 100, 26), 'text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field.vertex = true;
-
- var divider = new mxCell('', new mxGeometry(0, 0, 40, 8), 'line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;');
- divider.vertex = true;
-
- // Default tags
- var dt = 'uml static class ';
- this.setCurrentSearchEntryLibrary('uml');
-
- var fns = [
- this.createVertexTemplateEntry('html=1;', 110, 50, 'Object', 'Object', null, null, dt + 'object instance'),
- this.createVertexTemplateEntry('html=1;', 110, 50, '&laquo;interface&raquo;<br><b>Name</b>', 'Interface', null, null, dt + 'interface object instance annotated annotation'),
- this.addEntry(dt + 'object instance', function()
- {
- var cell = new mxCell('Classname', new mxGeometry(0, 0, 160, 90),
- 'swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;');
- cell.vertex = true;
- cell.insert(field.clone());
- cell.insert(divider.clone());
- cell.insert(sb.cloneCell(field, '+ method(type): type'));
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Class');
- }),
- this.addEntry(dt + 'section subsection', function()
- {
- var cell = new mxCell('Classname', new mxGeometry(0, 0, 140, 110),
- 'swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;');
- cell.vertex = true;
- cell.insert(field.clone());
- cell.insert(field.clone());
- cell.insert(field.clone());
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Class 2');
- }),
- this.addEntry(dt + 'item member method function variable field attribute label', function()
- {
- return sb.createVertexTemplateFromCells([sb.cloneCell(field, '+ item: attribute')], field.geometry.width, field.geometry.height, 'Item 1');
- }),
- this.addEntry(dt + 'item member method function variable field attribute label', function()
- {
- var cell = new mxCell('item: attribute', new mxGeometry(0, 0, 120, field.geometry.height), 'label;fontStyle=0;strokeColor=none;fillColor=none;align=left;verticalAlign=top;overflow=hidden;' +
- 'spacingLeft=28;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;imageWidth=16;imageHeight=16;image=' + sb.gearImage);
- cell.vertex = true;
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Item 2');
- }),
- this.addEntry(dt + 'divider hline line separator', function()
- {
- return sb.createVertexTemplateFromCells([divider.clone()], divider.geometry.width, divider.geometry.height, 'Divider');
- }),
- this.addEntry(dt + 'spacer space gap separator', function()
- {
- var cell = new mxCell('', new mxGeometry(0, 0, 20, 14), 'text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=4;spacingRight=4;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;');
- cell.vertex = true;
-
- return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Spacer');
- }),
- this.createVertexTemplateEntry('text;align=center;fontStyle=1;verticalAlign=middle;spacingLeft=3;spacingRight=3;strokeColor=none;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;',
- 80, 26, 'Title', 'Title', null, null, dt + 'title label'),
- this.addEntry(dt + 'component', function()
- {
- var cell = new mxCell('&laquo;Annotation&raquo;<br/><b>Component</b>', new mxGeometry(0, 0, 180, 90), 'html=1;dropTarget=0;');
- cell.vertex = true;
-
- var symbol = new mxCell('', new mxGeometry(1, 0, 20, 20), 'shape=module;jettyWidth=8;jettyHeight=4;');
- symbol.vertex = true;
- symbol.geometry.relative = true;
- symbol.geometry.offset = new mxPoint(-27, 7);
- cell.insert(symbol);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Component');
- }),
- this.addEntry(dt + 'component', function()
- {
- var cell = new mxCell('<p style="margin:0px;margin-top:6px;text-align:center;"><b>Component</b></p>' +
- '<hr/><p style="margin:0px;margin-left:8px;">+ Attribute1: Type<br/>+ Attribute2: Type</p>', new mxGeometry(0, 0, 180, 90),
- 'align=left;overflow=fill;html=1;dropTarget=0;');
- cell.vertex = true;
-
- var symbol = new mxCell('', new mxGeometry(1, 0, 20, 20), 'shape=component;jettyWidth=8;jettyHeight=4;');
- symbol.vertex = true;
- symbol.geometry.relative = true;
- symbol.geometry.offset = new mxPoint(-24, 4);
- cell.insert(symbol);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Component with Attributes');
- }),
- this.createVertexTemplateEntry('verticalAlign=top;align=left;spacingTop=8;spacingLeft=2;spacingRight=12;shape=cube;size=10;direction=south;fontStyle=4;html=1;',
- 180, 120, 'Block', 'Block', null, null, dt + 'block'),
- this.createVertexTemplateEntry('shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;', 100, 50, 'Module', 'Module', null, null, dt + 'module component'),
- this.createVertexTemplateEntry('shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;', 70, 50,
- 'package', 'Package', null, null, dt + 'package'),
- this.createVertexTemplateEntry('verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;',
- 160, 90, '<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>Object:Type</b></p><hr/>' +
- '<p style="margin:0px;margin-left:8px;">field1 = value1<br/>field2 = value2<br>field3 = value3</p>', 'Object',
- null, null, dt + 'object instance'),
- this.createVertexTemplateEntry('verticalAlign=top;align=left;overflow=fill;html=1;',180, 90,
- '<div style="box-sizing:border-box;width:100%;background:#e4e4e4;padding:2px;">Tablename</div>' +
- '<table style="width:100%;font-size:1em;" cellpadding="2" cellspacing="0">' +
- '<tr><td>PK</td><td>uniqueId</td></tr><tr><td>FK1</td><td>' +
- 'foreignKey</td></tr><tr><td></td><td>fieldname</td></tr></table>', 'Entity', null, null, 'er entity table'),
- this.addEntry(dt + 'object instance', function()
- {
- var cell = new mxCell('<p style="margin:0px;margin-top:4px;text-align:center;">' +
- '<b>Class</b></p>' +
- '<hr size="1"/><div style="height:2px;"></div>', new mxGeometry(0, 0, 140, 60),
- 'verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;');
- cell.vertex = true;
-
- return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Class 3');
- }),
- this.addEntry(dt + 'object instance', function()
- {
- var cell = new mxCell('<p style="margin:0px;margin-top:4px;text-align:center;">' +
- '<b>Class</b></p>' +
- '<hr size="1"/><div style="height:2px;"></div><hr size="1"/><div style="height:2px;"></div>', new mxGeometry(0, 0, 140, 60),
- 'verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;');
- cell.vertex = true;
-
- return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Class 4');
- }),
- this.addEntry(dt + 'object instance', function()
- {
- var cell = new mxCell('<p style="margin:0px;margin-top:4px;text-align:center;">' +
- '<b>Class</b></p>' +
- '<hr size="1"/><p style="margin:0px;margin-left:4px;">+ field: Type</p><hr size="1"/>' +
- '<p style="margin:0px;margin-left:4px;">+ method(): Type</p>', new mxGeometry(0, 0, 160, 90),
- 'verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;');
- cell.vertex = true;
-
- return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Class 5');
- }),
- this.addEntry(dt + 'object instance', function()
- {
- var cell = new mxCell('<p style="margin:0px;margin-top:4px;text-align:center;">' +
- '<i>&lt;&lt;Interface&gt;&gt;</i><br/><b>Interface</b></p>' +
- '<hr size="1"/><p style="margin:0px;margin-left:4px;">+ field1: Type<br/>' +
- '+ field2: Type</p>' +
- '<hr size="1"/><p style="margin:0px;margin-left:4px;">' +
- '+ method1(Type): Type<br/>' +
- '+ method2(Type, Type): Type</p>', new mxGeometry(0, 0, 190, 140),
- 'verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;');
- cell.vertex = true;
-
- return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Interface 2');
- }),
- this.createVertexTemplateEntry('shape=providedRequiredInterface;html=1;verticalLabelPosition=bottom;', 20, 20, '', 'Provided/Required Interface', null, null, 'uml provided required interface lollipop notation'),
- this.createVertexTemplateEntry('shape=requiredInterface;html=1;verticalLabelPosition=bottom;', 10, 20, '', 'Required Interface', null, null, 'uml required interface lollipop notation'),
- this.addEntry('uml lollipop notation provided required interface', function()
- {
- return sb.createVertexTemplateFromData('zVTBrptADPyavVYEkt4b0uQd3pMq5dD2uAUD27dgZJwE8vX1spsQlETtpVWRIjFjex3PmFVJWvc70m31hjlYlXxWSUqI7N/qPgVrVRyZXCUbFceR/FS8fRJdjNGo1QQN/0lB7AuO2h7AM57oeLCBIDw0Obj8SCVrJK6wxEbbV8RWyIWQP4F52Juzq9AHRqEqrm2IQpN/IsKTwAYb8MzWWBuO9B0hL2E2BGsqIQyxvJ9rzApD7QBrYBokhcBqNsf5UbrzsLzmXUu/oJET42jwGat5QYcHyiDkTDLKy03TiRrFfSx08m+FrrQtUkOZvZdbFKThmwMfVhf4fQ43/W3uZriiPPT+KKhjwnf4anKuQv//wsg+NPJ7/9d9Xf7eVykwbeeMOFWGYd/qzEVO8tHP/Suw4a2ujXV/+gXsEdhkOgSC8os44BQt0tggicZHeG1N2QiXibhAV48epRayEDd8MT7Ct06TUaXVWq027tCuhcx5VZjebeeaoDNn/WMcb/p+j0AM/dNr6InLl4Lgzylsk6OCgRWYsuI592gNZh5OhgmcblPv7+1l+ws=',
- 40, 10, 'Lollipop Notation');
- }),
- this.createVertexTemplateEntry('shape=umlBoundary;whiteSpace=wrap;html=1;', 100, 80, 'Boundary Object', 'Boundary Object', null, null, 'uml boundary object'),
- this.createVertexTemplateEntry('ellipse;shape=umlEntity;whiteSpace=wrap;html=1;', 80, 80, 'Entity Object', 'Entity Object', null, null, 'uml entity object'),
- this.createVertexTemplateEntry('ellipse;shape=umlControl;whiteSpace=wrap;html=1;', 70, 80, 'Control Object', 'Control Object', null, null, 'uml control object'),
- this.createVertexTemplateEntry('shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;', 30, 60, 'Actor', 'Actor', false, null, 'uml actor'),
- this.createVertexTemplateEntry('ellipse;whiteSpace=wrap;html=1;', 140, 70, 'Use Case', 'Use Case', null, null, 'uml use case usecase'),
- this.addEntry('uml activity state start', function()
- {
- var cell = new mxCell('', new mxGeometry(0, 0, 30, 30),
- 'ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;');
- cell.vertex = true;
-
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;');
- edge.geometry.setTerminalPoint(new mxPoint(15, 90), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- cell.insertEdge(edge, true);
-
- return sb.createVertexTemplateFromCells([cell, edge], 30, 90, 'Start');
- }),
- this.addEntry('uml activity state', function()
- {
- var cell = new mxCell('Activity', new mxGeometry(0, 0, 120, 40),
- 'rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;');
- cell.vertex = true;
-
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;');
- edge.geometry.setTerminalPoint(new mxPoint(60, 100), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- cell.insertEdge(edge, true);
-
- return sb.createVertexTemplateFromCells([cell, edge], 120, 100, 'Activity');
- }),
- this.addEntry('uml activity composite state', function()
- {
- var cell = new mxCell('Composite State', new mxGeometry(0, 0, 160, 60),
- 'swimlane;html=1;fontStyle=1;align=center;verticalAlign=middle;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=0;resizeLast=1;container=0;fontColor=#000000;collapsible=0;rounded=1;arcSize=30;strokeColor=#ff0000;fillColor=#ffffc0;swimlaneFillColor=#ffffc0;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('Subtitle', new mxGeometry(0, 0, 200, 26), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;fontColor=#000000;');
- cell1.vertex = true;
- cell.insert(cell1);
-
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;');
- edge.geometry.setTerminalPoint(new mxPoint(80, 120), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- cell.insertEdge(edge, true);
-
- return sb.createVertexTemplateFromCells([cell, edge], 160, 120, 'Composite State');
- }),
- this.addEntry('uml activity condition', function()
- {
- var cell = new mxCell('Condition', new mxGeometry(0, 0, 80, 40), 'rhombus;whiteSpace=wrap;html=1;fillColor=#ffffc0;strokeColor=#ff0000;');
- cell.vertex = true;
-
- var edge1 = new mxCell('no', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;align=left;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;');
- edge1.geometry.setTerminalPoint(new mxPoint(180, 20), false);
- edge1.geometry.relative = true;
- edge1.geometry.x = -1;
- edge1.edge = true;
-
- cell.insertEdge(edge1, true);
-
- var edge2 = new mxCell('yes', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;align=left;verticalAlign=top;endArrow=open;endSize=8;strokeColor=#ff0000;');
- edge2.geometry.setTerminalPoint(new mxPoint(40, 100), false);
- edge2.geometry.relative = true;
- edge2.geometry.x = -1;
- edge2.edge = true;
-
- cell.insertEdge(edge2, true);
-
- return sb.createVertexTemplateFromCells([cell, edge1, edge2], 180, 100, 'Condition');
- }),
- this.addEntry('uml activity fork join', function()
- {
- var cell = new mxCell('', new mxGeometry(0, 0, 200, 10), 'shape=line;html=1;strokeWidth=6;strokeColor=#ff0000;');
- cell.vertex = true;
-
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;');
- edge.geometry.setTerminalPoint(new mxPoint(100, 80), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- cell.insertEdge(edge, true);
-
- return sb.createVertexTemplateFromCells([cell, edge], 200, 80, 'Fork/Join');
- }),
- this.createVertexTemplateEntry('ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#ff0000;', 30, 30, '', 'End', null, null, 'uml activity state end'),
- this.createVertexTemplateEntry('shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;outlineConnect=0;', 100, 300, ':Object', 'Lifeline', null, null, 'uml sequence participant lifeline'),
- this.createVertexTemplateEntry('shape=umlLifeline;participant=umlActor;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;outlineConnect=0;',
- 20, 300, '', 'Actor Lifeline', null, null, 'uml sequence participant lifeline actor'),
- this.createVertexTemplateEntry('shape=umlLifeline;participant=umlBoundary;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;outlineConnect=0;',
- 50, 300, '', 'Boundary Lifeline', null, null, 'uml sequence participant lifeline boundary'),
- this.createVertexTemplateEntry('shape=umlLifeline;participant=umlEntity;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;outlineConnect=0;',
- 40, 300, '', 'Entity Lifeline', null, null, 'uml sequence participant lifeline entity'),
- this.createVertexTemplateEntry('shape=umlLifeline;participant=umlControl;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;outlineConnect=0;',
- 40, 300, '', 'Control Lifeline', null, null, 'uml sequence participant lifeline control'),
- this.createVertexTemplateEntry('shape=umlFrame;whiteSpace=wrap;html=1;', 300, 200, 'frame', 'Frame', null, null, 'uml sequence frame'),
- this.createVertexTemplateEntry('shape=umlDestroy;whiteSpace=wrap;html=1;strokeWidth=3;', 30, 30, '', 'Destruction', null, null, 'uml sequence destruction destroy'),
- this.addEntry('uml sequence invoke invocation call activation', function()
- {
- var cell = new mxCell('', new mxGeometry(0, 0, 10, 80), 'html=1;points=[];perimeter=orthogonalPerimeter;');
- cell.vertex = true;
-
- var edge = new mxCell('dispatch', new mxGeometry(0, 0, 0, 0), 'html=1;verticalAlign=bottom;startArrow=oval;endArrow=block;startSize=8;');
- edge.geometry.setTerminalPoint(new mxPoint(-60, 0), true);
- edge.geometry.relative = true;
- edge.edge = true;
-
- cell.insertEdge(edge, false);
-
- return sb.createVertexTemplateFromCells([cell, edge], 10, 80, 'Found Message');
- }),
- this.addEntry('uml sequence invoke call delegation synchronous invocation activation', function()
- {
- var cell = new mxCell('', new mxGeometry(0, 0, 10, 80), 'html=1;points=[];perimeter=orthogonalPerimeter;');
- cell.vertex = true;
-
- var edge1 = new mxCell('dispatch', new mxGeometry(0, 0, 0, 0), 'html=1;verticalAlign=bottom;endArrow=block;entryX=0;entryY=0;');
- edge1.geometry.setTerminalPoint(new mxPoint(-70, 0), true);
- edge1.geometry.relative = true;
- edge1.edge = true;
-
- cell.insertEdge(edge1, false);
-
- var edge2 = new mxCell('return', new mxGeometry(0, 0, 0, 0), 'html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;exitX=0;exitY=0.95;');
- edge2.geometry.setTerminalPoint(new mxPoint(-70, 76), false);
- edge2.geometry.relative = true;
- edge2.edge = true;
-
- cell.insertEdge(edge2, true);
-
- return sb.createVertexTemplateFromCells([cell, edge1, edge2], 10, 80, 'Synchronous Invocation');
- }),
- this.addEntry('uml sequence self call recursion delegation activation', function()
- {
- var cell = new mxCell('', new mxGeometry(0, 20, 10, 40), 'html=1;points=[];perimeter=orthogonalPerimeter;');
- cell.vertex = true;
-
- var edge = new mxCell('self call', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;align=left;spacingLeft=2;endArrow=block;rounded=0;entryX=1;entryY=0;');
- edge.geometry.setTerminalPoint(new mxPoint(5, 0), true);
- edge.geometry.points = [new mxPoint(30, 0)];
- edge.geometry.relative = true;
- edge.edge = true;
-
- cell.insertEdge(edge, false);
-
- return sb.createVertexTemplateFromCells([cell, edge], 10, 60, 'Self Call');
- }),
- this.addEntry('uml sequence invoke call delegation callback activation', function()
- {
- // TODO: Check if more entries should be converted to compressed XML
- return sb.createVertexTemplateFromData('xZRNT8MwDIZ/Ta6oaymD47rBTkiTuMAxW6wmIm0q19s6fj1OE3V0Y2iCA4dK8euP2I+riGxedUuUjX52CqzIHkU2R+conKpuDtaKNDFKZAuRpgl/In264J303qSRCDVdk5CGhJ20WwhKEFo62ChoqritxURkReNMTa2X80LkC68AmgoIkEWHpF3pamlXR7WIFwASdBeb7KXY4RIc5+KBQ/ZGkY4RYY5Egyl1zLqLmmyDXQ6Zx4n5EIf+HkB2BmAjrV3LzftPIPw4hgNn1pQ1a2tH5Cp2QK1miG7vNeu4iJe4pdeY2BtvbCQDGlAljMCQxBJotJ8rWCFYSWY3LvUdmZi68rvkkLiU6QnL1m1xAzHoBOdw61WEb88II9AW67/ydQ2wq1Cy1aAGvOrFfPh6997qDA3g+dxzv3nIL6MPU/8T+kMw8+m4QPgdfrEJNo8PSQj/+s58Ag==',
- 10, 60, 'Callback');
- }),
- this.createVertexTemplateEntry('html=1;points=[];perimeter=orthogonalPerimeter;', 10, 80, '', 'Activation', null, null, 'uml sequence activation'),
-
- // new 2.5.1 shapes ******************************************************************************
-
- this.createVertexTemplateEntry('shape=partialRectangle;html=1;top=1;align=left;dashed=1;', 200, 20, 'Template1 signature', 'Template signature', null, null, 'template signature'),
- this.createVertexTemplateEntry('shape=partialRectangle;html=1;top=1;align=left;dashed=1;', 200, 50, 'Template parameter 1\nTemplate parameter 2', 'Template signature', null, null, 'template signature'),
- this.createVertexTemplateEntry('shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;', 120, 60, 'Comment1 body', 'Note', null, null, 'uml note'),
-
- this.addEntry('uml sequence self call recursion delegation activation', function()
- {
- var cell = new mxCell('Constraint1 specification', new mxGeometry(0, 0, 160, 60), 'shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;');
- cell.vertex = true;
- var label = new mxCell('<<keyword>>', new mxGeometry(0, 0, cell.geometry.width, 25), 'resizeWidth=1;part=1;strokeColor=none;fillColor=none;align=left;spacingLeft=5;');
- label.geometry.relative = true;
- label.vertex = true;
- cell.insert(label);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Note');
- }),
-
- this.addEntry(dt + 'classifier', function()
- {
- var cell1 = new mxCell('&lt;&lt;keyword&gt;&gt;<br><b>Classifier1</b><br>{abstract}', new mxGeometry(0, 0, 140, 183),
- 'swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;');
- cell1.vertex = true;
- var field1 = new mxCell('attributes',
- new mxGeometry(0, 0, 140, 20), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field1.vertex = true;
- cell1.insert(field1);
- var field2 = new mxCell('attribute1',
- new mxGeometry(0, 0, 140, 20), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field2.vertex = true;
- cell1.insert(field2);
- var field3 = new mxCell('inherited attribute2',
- new mxGeometry(0, 0, 140, 20), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#808080;');
- field3.vertex = true;
- cell1.insert(field3);
- var field4 = new mxCell('...',
- new mxGeometry(0, 0, 140, 20), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field4.vertex = true;
- cell1.insert(field4);
- cell1.insert(divider.clone());
- var field5 = new mxCell('operations',
- new mxGeometry(0, 0, 140, 20), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field5.vertex = true;
- cell1.insert(field5);
- var field6 = new mxCell('operation1',
- new mxGeometry(0, 0, 140, 20), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field6.vertex = true;
- cell1.insert(field6);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Classifier');
- }),
-
- this.createVertexTemplateEntry('shape=process;fixedSize=1;size=5;fontStyle=1;', 140, 40, 'Classifier1', 'Classifier', null, null, 'classifier'),
-
- this.addEntry(dt + 'classifier', function()
- {
- var cell1 = new mxCell('Classifier1', new mxGeometry(0, 0, 140, 183),
- 'swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;');
- cell1.vertex = true;
- var field1 = new mxCell('internal structure',
- new mxGeometry(0, 0, 140, 30), 'html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];resizeWidth=1;');
- field1.vertex = true;
- cell1.insert(field1);
-
- var cell2 = new mxCell('', new mxGeometry(0, 0, 140, 140),
- 'strokeColor=none;fillColor=none;');
- cell2.vertex = true;
- cell1.insert(cell2);
-
- var field2 = new mxCell('property1',
- new mxGeometry(0, 0, 100, 30), 'html=1;align=center;verticalAlign=middle;rotatable=0;');
- field2.geometry.relative = true;
- field2.geometry.offset = new mxPoint(20, 20);
- field2.vertex = true;
- cell2.insert(field2);
-
- var field3 = new mxCell('property2',
- new mxGeometry(0, 0, 100, 30), 'html=1;align=center;verticalAlign=middle;rotatable=0;');
- field3.geometry.relative = true;
- field3.geometry.offset = new mxPoint(20, 90);
- field3.vertex = true;
- cell2.insert(field3);
-
- var assoc1 = new mxCell('connector1', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;endArrow=none;verticalAlign=middle;labelBackgroundColor=none;endSize=12;html=1;align=left;endFill=0;exitX=0.15;exitY=1;entryX=0.15;entryY=0;spacingLeft=4;');
- assoc1.geometry.relative = true;
- assoc1.edge = true;
- field2.insertEdge(assoc1, true);
- field3.insertEdge(assoc1, false);
- cell2.insert(assoc1);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Classifier');
- }),
-
- this.createVertexTemplateEntry('fontStyle=1;', 140, 30, 'Association1', 'Association', null, null, 'association'),
-
- this.addEntry(dt + 'classifier', function()
- {
- var cell1 = new mxCell('Instance1', new mxGeometry(0, 0, 140, 138),
- 'swimlane;fontStyle=4;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;');
- cell1.vertex = true;
- var field1 = new mxCell('slot1',
- new mxGeometry(0, 0, 140, 30), 'html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];resizeWidth=1;');
- field1.vertex = true;
- cell1.insert(field1);
-
- cell1.insert(divider.clone());
-
- var field2 = new mxCell('internal structure',
- new mxGeometry(0, 0, 140, 20), 'html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];resizeWidth=1;');
- field2.vertex = true;
- cell1.insert(field2);
-
- var cell2 = new mxCell('', new mxGeometry(0, 0, 140, 50),
- 'strokeColor=none;fillColor=none;');
- cell2.vertex = true;
- cell1.insert(cell2);
-
- var field3 = new mxCell('instance2',
- new mxGeometry(0, 0, 80, 30), 'html=1;align=center;verticalAlign=middle;rotatable=0;');
- field3.geometry.relative = true;
- field3.geometry.offset = new mxPoint(30, 10);
- field3.vertex = true;
- cell2.insert(field3);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Classifier');
- }),
-
- this.createVertexTemplateEntry('fontStyle=0;', 120, 40, 'Instance1 value', 'Instance', null, null, 'instance'),
-
- this.addEntry(dt + 'classifier', function()
- {
- var cell1 = new mxCell('&lt;&lt;enumeration&gt;&gt;<br><b>Enum1</b>', new mxGeometry(0, 0, 140, 70),
- 'swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;');
- cell1.vertex = true;
- var field1 = new mxCell('literal1',
- new mxGeometry(0, 0, 140, 30), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field1.vertex = true;
- cell1.insert(field1);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Classifier');
- }),
-
- this.addEntry(dt + 'classifier', function()
- {
- var cell1 = new mxCell('0..1', new mxGeometry(0, 0, 120, 50),
- 'align=right;verticalAlign=top;spacingRight=2;');
- cell1.vertex = true;
- var field1 = new mxCell('Property1',
- new mxGeometry(0, 1, 120, 30), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;resizeWidth=1;');
- field1.geometry.relative = true;
- field1.geometry.offset = new mxPoint(0, -30);
- field1.vertex = true;
-
- cell1.insert(field1);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Classifier');
- }),
-
- this.createVertexTemplateEntry('fontStyle=0;dashed=1;', 140, 30, 'Property1', 'Property', null, null, 'property'),
- this.createVertexTemplateEntry('fontStyle=0;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=2;', 30, 30, 'port1', 'Port', null, null, 'port'),
-
- this.addEntry(dt + 'component', function()
- {
- var cell1 = new mxCell('', new mxGeometry(0, 0, 140, 200), 'fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;marginBottom=0;');
- cell1.vertex = true;
-
- var cell2 = new mxCell('Component', new mxGeometry(0, 0, 140, 40), 'html=1;align=left;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;');
- cell2.vertex = true;
- cell1.insert(cell2);
-
- var symbol = new mxCell('', new mxGeometry(1, 0, 16, 20), 'shape=module;jettyWidth=10;jettyHeight=4;');
- symbol.vertex = true;
- symbol.geometry.relative = true;
- symbol.geometry.offset = new mxPoint(-25, 9);
- cell2.insert(symbol);
-
- cell1.insert(divider.clone());
-
- var cell3 = new mxCell('provided interfaces', new mxGeometry(0, 0, 140, 25), 'html=1;align=center;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;');
- cell3.vertex = true;
- cell1.insert(cell3);
-
- var cell4 = new mxCell('Interface1', new mxGeometry(0, 0, 140, 25), 'html=1;align=left;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;');
- cell4.vertex = true;
- cell1.insert(cell4);
-
- cell1.insert(divider.clone());
-
- var cell5 = new mxCell('required interfaces', new mxGeometry(0, 0, 140, 25), 'html=1;align=center;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;');
- cell5.vertex = true;
- cell1.insert(cell5);
-
- var cell6 = new mxCell('Interface2', new mxGeometry(0, 0, 140, 30), 'html=1;align=left;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;');
- cell6.vertex = true;
- cell1.insert(cell6);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Component');
- }),
-
- this.addEntry(dt + 'classifier', function()
- {
- var cell1 = new mxCell('', new mxGeometry(0, 0, 270, 230),
- 'shape=ellipse;container=1;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;html=1;dashed=1;collapsible=0;');
- cell1.vertex = true;
-
- var field1 = new mxCell('Collaboration1',
- new mxGeometry(0, 0, 270, 30), 'html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];resizeWidth=1;');
- field1.vertex = true;
- cell1.insert(field1);
-
- var divider1 = new mxCell('', new mxGeometry(0.145, 0, 192, 8), 'line;strokeWidth=1;fillColor=none;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;dashed=1;resizeWidth=1;');
- divider1.geometry.relative = true;
- divider1.geometry.offset = new mxPoint(0, 30);
- divider1.vertex = true;
- cell1.insert(divider1);
-
- var field2 = new mxCell('Classifier1',
- new mxGeometry(0, 0, 100, 30), 'html=1;align=center;verticalAlign=middle;rotatable=0;');
- field2.geometry.relative = true;
- field2.geometry.offset = new mxPoint(85, 50);
- field2.vertex = true;
- cell1.insert(field2);
-
- var field3 = new mxCell('Collaboration use 1',
- new mxGeometry(0, 0, 140, 30), 'shape=ellipse;html=1;align=center;verticalAlign=middle;rotatable=0;dashed=1;');
- field3.geometry.relative = true;
- field3.geometry.offset = new mxPoint(65, 110);
- field3.vertex = true;
- cell1.insert(field3);
-
- var assoc1 = new mxCell('property1', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;endArrow=none;verticalAlign=middle;labelBackgroundColor=none;endSize=12;html=1;align=left;endFill=0;spacingLeft=4;');
- assoc1.geometry.relative = true;
- assoc1.edge = true;
- field2.insertEdge(assoc1, true);
- field3.insertEdge(assoc1, false);
- cell1.insert(assoc1);
-
- var field4 = new mxCell('Classifier2',
- new mxGeometry(0, 0, 100, 30), 'html=1;align=center;verticalAlign=middle;rotatable=0;');
- field4.geometry.relative = true;
- field4.geometry.offset = new mxPoint(85, 170);
- field4.vertex = true;
- cell1.insert(field4);
-
- var assoc2 = new mxCell('property1', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;endArrow=none;verticalAlign=middle;labelBackgroundColor=none;endSize=12;html=1;align=left;endFill=0;spacingLeft=4;');
- assoc2.geometry.relative = true;
- assoc2.edge = true;
- field3.insertEdge(assoc2, true);
- field4.insertEdge(assoc2, false);
- cell1.insert(assoc2);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Classifier');
- }),
-
- this.createVertexTemplateEntry('shape=folder;fontStyle=1;tabWidth=80;tabHeight=30;tabPosition=left;html=1;boundedLbl=1;', 150, 80,
- 'Package1', 'Package', null, null, dt + 'package'),
-
- this.addEntry(dt + 'package', function()
- {
- var cell1 = new mxCell('Package1', new mxGeometry(0, 0, 150, 100),
- 'shape=folder;fontStyle=1;tabWidth=110;tabHeight=30;tabPosition=left;html=1;boundedLbl=1;labelInHeader=1;');
- cell1.vertex = true;
-
- var field1 = new mxCell('Packaged element1',
- new mxGeometry(0, 0, 110, 30), 'html=1;');
- field1.geometry.relative = true;
- field1.geometry.offset = new mxPoint(20, 50);
- field1.vertex = true;
- cell1.insert(field1);
-
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Classifier');
- }),
-
- this.addEntry(dt + 'package', function()
- {
- var cell1 = new mxCell('Model1', new mxGeometry(0, 0, 150, 80),
- 'shape=folder;fontStyle=1;tabWidth=110;tabHeight=30;tabPosition=left;html=1;boundedLbl=1;folderSymbol=triangle;');
- cell1.vertex = true;
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Package');
- }),
-
- this.addEntry(dt + 'stereotype', function()
- {
- var cell1 = new mxCell('', new mxGeometry(0, 0, 160, 75),
- 'shape=note2;size=25;childLayout=stackLayout;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;container=1;');
- cell1.vertex = true;
- var field1 = new mxCell('&lt;&lt;stereotype1&gt;&gt;',
- new mxGeometry(0, 0, 160, 25), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field1.vertex = true;
- cell1.insert(field1);
- var field2 = new mxCell('stereotype property 1',
- new mxGeometry(0, 0, 160, 25), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field2.vertex = true;
- cell1.insert(field2);
- var field3 = new mxCell('stereotype property 2',
- new mxGeometry(0, 0, 160, 25), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field3.vertex = true;
- cell1.insert(field3);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Stereotype');
- }),
-
- this.addEntry(dt + 'class', function()
- {
- var cell1 = new mxCell('Class1', new mxGeometry(0, 0, 140, 79),
- 'swimlane;fontStyle=1;align=center;verticalAlign=middle;childLayout=stackLayout;horizontal=1;startSize=29;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;');
- cell1.vertex = true;
- var field1 = new mxCell('&lt;&lt;stereotype1&gt;&gt;',
- new mxGeometry(0, 0, 140, 25), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field1.vertex = true;
- cell1.insert(field1);
- var field2 = new mxCell('stereotype property 1',
- new mxGeometry(0, 0, 140, 25), 'text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
- field2.vertex = true;
- cell1.insert(field2);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'Class');
- }),
-
- this.createVertexTemplateEntry('text;html=1;align=center;', 200, 25,
- '&lt;&lt;stereotype1, stereotype2...&gt;&gt;', 'Label', null, null, dt + 'label'),
- this.createVertexTemplateEntry('ellipse;', 50, 25,
- 'icon', 'Icon', null, null, dt + 'icon'),
-
- this.addEntry(dt + 'region', function()
- {
- var cell1 = new mxCell('', new mxGeometry(60, 0, 10, 100),
- 'line;strokeWidth=1;direction=south;html=1;dashed=1;dashPattern=20 20;');
- cell1.vertex = true;
-
- var cell2 = new mxCell('Region 1', new mxGeometry(0, 40, 60, 20),
- 'text;align=right;');
- cell2.vertex = true;
-
- var cell3 = new mxCell('Region 2', new mxGeometry(70, 40, 60, 20),
- 'text;align=left;');
- cell3.vertex = true;
-
- return sb.createVertexTemplateFromCells([cell1, cell2, cell3], 130, cell1.geometry.height, 'Region');
- }),
-
- this.addEntry(dt + 'State', function()
- {
- var cell1 = new mxCell('State1<br>[invariant1]<br>&lt;&lt;extended/final&gt;&gt;', new mxGeometry(0, 0, 140, 176),
- 'swimlane;fontStyle=4;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=60;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;rounded=1;absoluteArcSize=1;arcSize=50;');
- cell1.vertex = true;
-
- var field1 = new mxCell('',
- new mxGeometry(0, 0, 140, 50), 'fillColor=none;strokeColor=none;container=1;collapsible=0;');
- field1.vertex = true;
- cell1.insert(field1);
-
- var field2 = new mxCell('State2',
- new mxGeometry(30, 10, 80, 30), 'html=1;align=center;verticalAlign=middle;rounded=1;absoluteArcSize=1;arcSize=10;');
- field2.vertex = true;
- field1.insert(field2);
-
- cell1.insert(divider.clone());
-
- var field3 = new mxCell('behavior1',
- new mxGeometry(0, 0, 140, 25), 'fillColor=none;strokeColor=none;align=left;verticalAlign=middle;spacingLeft=5;');
- field3.vertex = true;
- cell1.insert(field3);
-
- cell1.insert(divider.clone());
-
- var field4 = new mxCell('transition1',
- new mxGeometry(0, 0, 140, 25), 'fillColor=none;strokeColor=none;align=left;verticalAlign=middle;spacingLeft=5;');
- field4.vertex = true;
- cell1.insert(field4);
-
- return sb.createVertexTemplateFromCells([cell1], cell1.geometry.width, cell1.geometry.height, 'State');
- }),
-
- this.createVertexTemplateEntry('html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=1;', 140, 40,
- 'State1', 'State', null, null, dt + 'state'),
-
- this.createVertexTemplateEntry('html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;', 140, 40,
- 'State', 'State', null, null, dt + 'state'),
-
- this.createVertexTemplateEntry('shape=folder;align=center;verticalAlign=middle;fontStyle=0;tabWidth=100;tabHeight=30;tabPosition=left;html=1;boundedLbl=1;labelInHeader=1;rounded=1;absoluteArcSize=1;arcSize=10;', 140, 90,
- 'State1', 'State', null, null, dt + 'state'),
-
- this.createVertexTemplateEntry('html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;', 140, 40,
- 'State1, State2, ...', 'State', null, null, dt + 'state'),
-
- this.createVertexTemplateEntry('shape=umlState;rounded=1;verticalAlign=top;spacingTop=5;umlStateSymbol=collapseState;absoluteArcSize=1;arcSize=10;', 140, 60,
- 'State1', 'State', null, null, dt + 'state'),
-
- this.addEntry(dt + 'State', function()
- {
- var cell1 = new mxCell('State1', new mxGeometry(40, 0, 140, 50),
- 'shape=umlState;rounded=1;verticalAlign=middle;align=center;absoluteArcSize=1;arcSize=10;umlStateConnection=connPointRefEntry;boundedLbl=1;');
- cell1.vertex = true;
-
- var field1 = new mxCell('Entry1',
- new mxGeometry(0, 40, 50, 20), 'text;verticalAlign=middle;align=center;');
- field1.vertex = true;
- cell1.insert(field1);
-
- return sb.createVertexTemplateFromCells([cell1, field1], 180, 60, 'State');
- }),
-
- this.addEntry(dt + 'State', function()
- {
- var cell1 = new mxCell('State1', new mxGeometry(40, 0, 140, 50),
- 'shape=umlState;rounded=1;verticalAlign=middle;spacingTop=0;absoluteArcSize=1;arcSize=10;umlStateConnection=connPointRefExit;boundedLbl=1;');
- cell1.vertex = true;
-
- var field1 = new mxCell('Exit1',
- new mxGeometry(0, 40, 50, 20), 'text;verticalAlign=middle;align=center;');
- field1.vertex = true;
- cell1.insert(field1);
-
- return sb.createVertexTemplateFromCells([cell1, field1], 180, 60, 'State');
- }),
-
- this.createVertexTemplateEntry('ellipse;fillColor=#000000;strokeColor=none;', 30, 30,
- '', 'Initial state', null, null, dt + 'initial state'),
-
- this.createVertexTemplateEntry('ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#000000;', 30, 30,
- '', 'Final state', null, null, dt + 'final state'),
-
- this.createVertexTemplateEntry('ellipse;fillColor=#ffffff;strokeColor=#000000;', 30, 30,
- 'H', 'Shallow History', null, null, dt + 'shallow history'),
-
- this.createVertexTemplateEntry('ellipse;fillColor=#ffffff;strokeColor=#000000;', 30, 30,
- 'H*', 'Deep History', null, null, dt + 'deep history'),
-
- this.createVertexTemplateEntry('ellipse;fillColor=#ffffff;strokeColor=#000000;', 30, 30,
- '', 'Entry Point', null, null, dt + 'entry point'),
-
- this.createVertexTemplateEntry('shape=sumEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 30, 30,
- '', 'Exit Point', null, null, dt + 'exit point'),
-
- this.createVertexTemplateEntry('ellipse;fillColor=#000000;strokeColor=none;', 20, 20,
- '', 'Junction', null, null, dt + 'junction'),
-
- this.createVertexTemplateEntry('rhombus;', 30, 30,
- '', 'Choice', null, null, dt + 'choice'),
-
- this.createVertexTemplateEntry('shape=umlDestroy;', 30, 30,
- '', 'Terminate', null, null, dt + 'terminate'),
-
- this.createVertexTemplateEntry('html=1;points=[];perimeter=orthogonalPerimeter;fillColor=#000000;strokeColor=none;', 5, 80,
- '', 'Join/Fork', null, null, dt + 'join fork'),
-
- this.createVertexTemplateEntry('text;align=center;verticalAlign=middle;dashed=0;fillColor=#ffffff;strokeColor=#000000;', 140, 40,
- 'OpaqueAction1 spec.', 'Opaque Action', null, null, dt + 'opaque action'),
-
- // end of new shapes ******************************************************************************
-
- this.createEdgeTemplateEntry('html=1;verticalAlign=bottom;startArrow=oval;startFill=1;endArrow=block;startSize=8;', 60, 0, 'dispatch', 'Found Message 1', null, 'uml sequence message call invoke dispatch'),
- this.createEdgeTemplateEntry('html=1;verticalAlign=bottom;startArrow=circle;startFill=1;endArrow=open;startSize=6;endSize=8;', 80, 0, 'dispatch', 'Found Message 2', null, 'uml sequence message call invoke dispatch'),
- this.createEdgeTemplateEntry('html=1;verticalAlign=bottom;endArrow=block;', 80, 0, 'dispatch', 'Message', null, 'uml sequence message call invoke dispatch'),
- this.addEntry('uml sequence return message', function()
- {
- var edge = new mxCell('return', new mxGeometry(0, 0, 0, 0), 'html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;');
- edge.geometry.setTerminalPoint(new mxPoint(80, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- return sb.createEdgeTemplateFromCells([edge], 80, 0, 'Return');
- }),
- this.addEntry('uml relation', function()
- {
- var edge = new mxCell('name', new mxGeometry(0, 0, 0, 0), 'endArrow=block;endFill=1;html=1;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=top;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(160, 0), false);
- edge.geometry.relative = true;
- edge.geometry.x = -1;
- edge.edge = true;
-
- var cell = new mxCell('1', new mxGeometry(-1, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=left;verticalAlign=bottom;');
- cell.geometry.relative = true;
- cell.setConnectable(false);
- cell.vertex = true;
- edge.insert(cell);
-
- return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Relation 1');
- }),
- this.addEntry('uml association', function()
- {
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=none;html=1;edgeStyle=orthogonalEdgeStyle;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(160, 0), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- var cell1 = new mxCell('parent', new mxGeometry(-1, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=left;verticalAlign=bottom;');
- cell1.geometry.relative = true;
- cell1.setConnectable(false);
- cell1.vertex = true;
- edge.insert(cell1);
-
- var cell2 = new mxCell('child', new mxGeometry(1, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=right;verticalAlign=bottom;');
- cell2.geometry.relative = true;
- cell2.setConnectable(false);
- cell2.vertex = true;
- edge.insert(cell2);
-
- return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Association 1');
- }),
- this.addEntry('uml aggregation', function()
- {
- var edge = new mxCell('1', new mxGeometry(0, 0, 0, 0), 'endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=bottom;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(160, 0), false);
- edge.geometry.relative = true;
- edge.geometry.x = -1;
- edge.geometry.y = 3;
- edge.edge = true;
-
- return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Aggregation 1');
- }),
- this.addEntry('uml composition', function()
- {
- var edge = new mxCell('1', new mxGeometry(0, 0, 0, 0), 'endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=1;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=bottom;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(160, 0), false);
- edge.geometry.relative = true;
- edge.geometry.x = -1;
- edge.geometry.y = 3;
- edge.edge = true;
-
- return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Composition 1');
- }),
- this.addEntry('uml relation', function()
- {
- var edge = new mxCell('Relation', new mxGeometry(0, 0, 0, 0), 'endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(160, 0), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- var cell1 = new mxCell('0..n', new mxGeometry(-1, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;');
- cell1.geometry.relative = true;
- cell1.setConnectable(false);
- cell1.vertex = true;
- edge.insert(cell1);
-
- var cell2 = new mxCell('1', new mxGeometry(1, 0, 0, 0), 'edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;');
- cell2.geometry.relative = true;
- cell2.setConnectable(false);
- cell2.vertex = true;
- edge.insert(cell2);
-
- return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Relation 2');
- }),
- this.createEdgeTemplateEntry('endArrow=open;endSize=12;dashed=1;html=1;', 160, 0, 'Use', 'Dependency', null, 'uml dependency use'),
- this.createEdgeTemplateEntry('endArrow=block;endSize=16;endFill=0;html=1;', 160, 0, 'Extends', 'Generalization', null, 'uml generalization extend'),
- this.createEdgeTemplateEntry('endArrow=block;startArrow=block;endFill=1;startFill=1;html=1;', 160, 0, '', 'Association 2', null, 'uml association'),
- this.createEdgeTemplateEntry('endArrow=open;startArrow=circlePlus;endFill=0;startFill=0;endSize=8;html=1;', 160, 0, '', 'Inner Class', null, 'uml inner class'),
- this.createEdgeTemplateEntry('endArrow=open;startArrow=cross;endFill=0;startFill=0;endSize=8;startSize=10;html=1;', 160, 0, '', 'Terminate', null, 'uml terminate'),
- this.createEdgeTemplateEntry('endArrow=block;dashed=1;endFill=0;endSize=12;html=1;', 160, 0, '', 'Implementation', null, 'uml realization implementation'),
- this.createEdgeTemplateEntry('endArrow=diamondThin;endFill=0;endSize=24;html=1;', 160, 0, '', 'Aggregation 2', null, 'uml aggregation'),
- this.createEdgeTemplateEntry('endArrow=diamondThin;endFill=1;endSize=24;html=1;', 160, 0, '', 'Composition 2', null, 'uml composition'),
- this.createEdgeTemplateEntry('endArrow=open;endFill=1;endSize=12;html=1;', 160, 0, '', 'Association 3', null, 'uml association')
- ];
-
- this.addPaletteFunctions('uml', mxResources.get('uml'), expand || false, fns);
- this.setCurrentSearchEntryLibrary();
-};
-
-/**
- * Adds the BPMN library to the sidebar.
- */
-Sidebar.prototype.addBpmnPalette = function(dir, expand)
-{
- // Avoids having to bind all functions to "this"
- var sb = this;
- this.setCurrentSearchEntryLibrary('bpmn');
-
- var fns =
- [
- this.createVertexTemplateEntry('shape=ext;rounded=1;html=1;whiteSpace=wrap;', 120, 80, 'Task', 'Process', null, null, 'bpmn task process'),
- this.createVertexTemplateEntry('shape=ext;rounded=1;html=1;whiteSpace=wrap;double=1;', 120, 80, 'Transaction', 'Transaction', null, null, 'bpmn transaction'),
- this.createVertexTemplateEntry('shape=ext;rounded=1;html=1;whiteSpace=wrap;dashed=1;dashPattern=1 4;', 120, 80, 'Event\nSub-Process', 'Event Sub-Process', null, null, 'bpmn event subprocess sub process sub-process'),
- this.createVertexTemplateEntry('shape=ext;rounded=1;html=1;whiteSpace=wrap;strokeWidth=3;', 120, 80, 'Call Activity', 'Call Activity', null, null, 'bpmn call activity'),
- this.addEntry('bpmn subprocess sub process sub-process', function()
- {
- var cell = new mxCell('Sub-Process', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=plus;outlineConnect=0;');
- cell1.vertex = true;
- cell1.geometry.relative = true;
- cell1.geometry.offset = new mxPoint(-7, -14);
- cell.insert(cell1);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Sub-Process');
- }),
- this.addEntry(this.getTagsForStencil('mxgraph.bpmn', 'loop', 'subprocess sub process sub-process looped').join(' '), function()
- {
- var cell = new mxCell('Looped\nSub-Process', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=mxgraph.bpmn.loop;outlineConnect=0;');
- cell1.vertex = true;
- cell1.geometry.relative = true;
- cell1.geometry.offset = new mxPoint(-15, -14);
- cell.insert(cell1);
-
- var cell2 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=plus;');
- cell2.vertex = true;
- cell2.geometry.relative = true;
- cell2.geometry.offset = new mxPoint(1, -14);
- cell.insert(cell2);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Looped Sub-Process');
- }),
- this.addEntry('bpmn receive task', function()
- {
- var cell = new mxCell('Receive', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('', new mxGeometry(0, 0, 20, 14), 'html=1;shape=message;outlineConnect=0;');
- cell1.vertex = true;
- cell1.geometry.relative = true;
- cell1.geometry.offset = new mxPoint(7, 7);
- cell.insert(cell1);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Receive Task');
- }),
- this.addEntry(this.getTagsForStencil('mxgraph.bpmn', 'user_task').join(' '), function()
- {
- var cell = new mxCell('User', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('', new mxGeometry(0, 0, 14, 14), 'html=1;shape=mxgraph.bpmn.user_task;outlineConnect=0;');
- cell1.vertex = true;
- cell1.geometry.relative = true;
- cell1.geometry.offset = new mxPoint(7, 7);
- cell.insert(cell1);
-
- var cell2 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=plus;outlineConnect=0;');
- cell2.vertex = true;
- cell2.geometry.relative = true;
- cell2.geometry.offset = new mxPoint(-7, -14);
- cell.insert(cell2);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'User Task');
- }),
- this.addEntry(this.getTagsForStencil('mxgraph.bpmn', 'timer_start', 'attached').join(' '), function()
- {
- var cell = new mxCell('Process', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('', new mxGeometry(1, 1, 30, 30), 'shape=mxgraph.bpmn.timer_start;perimeter=ellipsePerimeter;html=1;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;');
- cell1.vertex = true;
- cell1.geometry.relative = true;
- cell1.geometry.offset = new mxPoint(-40, -15);
- cell.insert(cell1);
-
- return sb.createVertexTemplateFromCells([cell], 120, 95, 'Attached Timer Event 1');
- }),
- this.addEntry(this.getTagsForStencil('mxgraph.bpmn', 'timer_start', 'attached').join(' '), function()
- {
- var cell = new mxCell('Process', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('', new mxGeometry(1, 0, 30, 30), 'shape=mxgraph.bpmn.timer_start;perimeter=ellipsePerimeter;html=1;labelPosition=right;align=left;outlineConnect=0;');
- cell1.vertex = true;
- cell1.geometry.relative = true;
- cell1.geometry.offset = new mxPoint(-15, 10);
- cell.insert(cell1);
-
- return sb.createVertexTemplateFromCells([cell], 135, 80, 'Attached Timer Event 2');
- }),
- this.createVertexTemplateEntry('swimlane;html=1;horizontal=0;startSize=20;', 320, 240, 'Pool', 'Pool', null, null, 'bpmn pool'),
- this.createVertexTemplateEntry('swimlane;html=1;horizontal=0;swimlaneLine=0;', 300, 120, 'Lane', 'Lane', null, null, 'bpmn lane'),
- this.createVertexTemplateEntry('shape=hexagon;html=1;whiteSpace=wrap;perimeter=hexagonPerimeter;rounded=0;', 60, 50, '', 'Conversation', null, null, 'bpmn conversation'),
- this.createVertexTemplateEntry('shape=hexagon;html=1;whiteSpace=wrap;perimeter=hexagonPerimeter;strokeWidth=4;rounded=0;', 60, 50, '', 'Call Conversation', null, null, 'bpmn call conversation'),
- this.addEntry('bpmn subconversation sub conversation sub-conversation', function()
- {
- var cell = new mxCell('', new mxGeometry(0, 0, 60, 50), 'shape=hexagon;whiteSpace=wrap;html=1;perimeter=hexagonPerimeter;rounded=0;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=plus;');
- cell1.vertex = true;
- cell1.geometry.relative = true;
- cell1.geometry.offset = new mxPoint(-7, -14);
- cell.insert(cell1);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Sub-Conversation');
- }),
- this.addEntry('bpmn data object', function()
- {
- var cell = new mxCell('', new mxGeometry(0, 0, 40, 60), 'shape=note;whiteSpace=wrap;size=16;html=1;dropTarget=0;');
- cell.vertex = true;
-
- var cell1 = new mxCell('', new mxGeometry(0, 0, 14, 14), 'html=1;shape=singleArrow;arrowWidth=0.4;arrowSize=0.4;outlineConnect=0;');
- cell1.vertex = true;
- cell1.geometry.relative = true;
- cell1.geometry.offset = new mxPoint(2, 2);
- cell.insert(cell1);
-
- var cell2 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;whiteSpace=wrap;shape=parallelMarker;outlineConnect=0;');
- cell2.vertex = true;
- cell2.geometry.relative = true;
- cell2.geometry.offset = new mxPoint(-7, -14);
- cell.insert(cell2);
-
- return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Data Object');
- }),
- this.createVertexTemplateEntry('shape=datastore;whiteSpace=wrap;html=1;', 60, 60, '', 'Data Store', null, null, 'bpmn data store'),
- this.createVertexTemplateEntry('shape=plus;html=1;outlineConnect=0;', 14, 14, '', 'Sub-Process Marker', null, null, 'bpmn subprocess sub process sub-process marker'),
- this.createVertexTemplateEntry('shape=mxgraph.bpmn.loop;html=1;outlineConnect=0;', 14, 14, '', 'Loop Marker', null, null, 'bpmn loop marker'),
- this.createVertexTemplateEntry('shape=parallelMarker;html=1;outlineConnect=0;', 14, 14, '', 'Parallel MI Marker', null, null, 'bpmn parallel mi marker'),
- this.createVertexTemplateEntry('shape=parallelMarker;direction=south;html=1;outlineConnect=0;', 14, 14, '', 'Sequential MI Marker', null, null, 'bpmn sequential mi marker'),
- this.createVertexTemplateEntry('shape=mxgraph.bpmn.ad_hoc;fillColor=#000000;html=1;outlineConnect=0;', 14, 14, '', 'Ad Hoc Marker', null, null, 'bpmn ad hoc marker'),
- this.createVertexTemplateEntry('shape=mxgraph.bpmn.compensation;html=1;outlineConnect=0;', 14, 14, '', 'Compensation Marker', null, null, 'bpmn compensation marker'),
- this.createVertexTemplateEntry('shape=message;whiteSpace=wrap;html=1;outlineConnect=0;fillColor=#000000;strokeColor=#ffffff;strokeWidth=2;', 40, 30, '', 'Send Task', null, null, 'bpmn send task'),
- this.createVertexTemplateEntry('shape=message;whiteSpace=wrap;html=1;outlineConnect=0;', 40, 30, '', 'Receive Task', null, null, 'bpmn receive task'),
- this.createVertexTemplateEntry('shape=mxgraph.bpmn.user_task;html=1;outlineConnect=0;', 14, 14, '', 'User Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'user_task').join(' ')),
- this.createVertexTemplateEntry('shape=mxgraph.bpmn.manual_task;html=1;outlineConnect=0;', 14, 14, '', 'Manual Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'user_task').join(' ')),
- this.createVertexTemplateEntry('shape=mxgraph.bpmn.business_rule_task;html=1;outlineConnect=0;', 14, 14, '', 'Business Rule Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'business_rule_task').join(' ')),
- this.createVertexTemplateEntry('shape=mxgraph.bpmn.service_task;html=1;outlineConnect=0;', 14, 14, '', 'Service Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'service_task').join(' ')),
- this.createVertexTemplateEntry('shape=mxgraph.bpmn.script_task;html=1;outlineConnect=0;', 14, 14, '', 'Script Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'script_task').join(' ')),
- this.createVertexTemplateEntry('html=1;shape=mxgraph.flowchart.annotation_2;align=left;labelPosition=right;', 50, 100, '', 'Annotation', null, null, this.getTagsForStencil('bpmn', 'annotation_1', 'bpmn business process model ').join(' ')),
- this.addDataEntry('crossfunctional cross-functional cross functional flowchart swimlane table', 400, 400, 'Cross-Functional Flowchart', '7ZhRb5swEMc/DY+bMCRt97jQpi+tVC2fwINbbMnYyD4C6aefjaHpBrTRlNCoTALJPp9t+P25O5kgTvL6XtOCPaoMRBDfBXGilULfyusEhAiikGdBfBtEUWjvIFqPjJJmNCyoBonHTIj8hB0VJXiL3dyYL+tSpsiVpM55LVSVMqrROxvci9bZMFq4JtKfzrRKGRfZA92rEjtr11tpVT1wCcYOhM5ViTKXry0G7RYb/uwWXDgDw9wCuSW2WTGOsClo6gYri8uvIGhheLN1s4KGtNSG7+AHGL+Os0JdUJm1nUJxiaDvdhZQt/EvJXHTvpTbjAq+lbadgnO1hhYSaIR6FHRjainfg8oB9d66VDxD5j0WoRcjZMC3DP8yUuMN25e5B91so5VuWMa4J+P3FJW2JtLXrOK5oNLJxZTmz/blqXhNp3mO5cpe9smS8OsyWNp5ie2TQ99ezl1joqRBTXmDAajBCgxejprHKBcNK7fvBPIz3hOSRCcQctET8olRA+8JmSopIW2j8GOD6Sji8TDxepT4C9yTE1+OEo/mQ5xcTYn8ahR5PB/k0c2UyK9HC8SbX/mnLBAnqAlD8XK+onDTE+/fw+TiQF9fTin4Nl/O0xYAEs6X9LR5n5Ae6S7xv1lr/yf+4cQ/pN75Ej/pH88/UZyQkRPzR6R+0j9Bz4f0xMm/f8adD+qzZn/bPfw5bMb++LH4Gw=='),
- this.addDataEntry('container swimlane pool horizontal', 480, 380, 'Horizontal Pool 1',
- 'zZRLbsIwEIZP4709TlHXhJYNSEicwCIjbNWJkWNKwumZxA6IlrRUaisWlmb+eX8LM5mXzdyrnV66Ai2TL0zm3rkQrbLJ0VoG3BRMzhgAp8fgdSQq+ijfKY9VuKcAYsG7snuMyso5G8U6tDaJ9cGUVlXkTXUoacuZIHOjjS0WqnX7blYd1OZt8KYea3PE1bCI+CAtVUMq7/o5b46uCmroSn18WFMm+XCdse5GpLq0OPqAzejxvZQun6MrMfiWUg6mCDpmZM8RENdotjqVyUFUdRS259oLSzISztto5Se0i44gcHEn3i9A/IQB3GbQpmi69DskAn4BSTaGBB4Jicj+k8nTGBP5SExg8odMyL38eH3s6kM8AQ=='),
- this.addDataEntry('container swimlane pool horizontal', 480, 360, 'Horizontal Pool 2',
- 'zZTBbsIwDIafJvfU6dDOlI0LSEg8QUQtEi1tUBJGy9PPbcJQWTsxaZs4VLJ//07sT1WYKKpm6eRBrW2JhokXJgpnbYhR1RRoDAOuSyYWDIDTx+B1opr1VX6QDutwTwPEhndpjhiVjbUmij60Jon+pCsja8rmKlQ05SKjcKe0KVeytcfuLh/k7u2SzR16fcbNZZDsRlrLhlTenWedPts6SJMEOseFLTkph6Fj212RbGlwdAGbyeV7KW2+RFthcC1ZTroMKjry5wiIK9R7ldrELInSR2H/2XtlSUHCOY5WfEG76ggCz+7E+w2InzCAcQapIf0fAySzESQZ/AKSfAoJPCKS9mbzf0H0NIVIPDAiyP8QEaXX97CvDZ7LDw=='),
- this.createVertexTemplateEntry('swimlane;startSize=20;horizontal=0;', 320, 120, 'Lane', 'Horizontal Swimlane', null, null, 'swimlane lane pool'),
- this.addDataEntry('container swimlane pool horizontal', 360, 480, 'Vertical Pool 1',
- 'xZRBbsIwEEVP4709ThFrQssGJKSewCIjbNXGyDEl4fSdxKa0NJFQVTULSzP/e+T5b2EmS9esgjrqja/QMvnMZBm8j6lyTYnWMuCmYnLJADgdBi8jruhdflQBD/GRAUgD78qeMClb720S69jaLNZn46w6ULfQ0dGWS0HlThtbrVXrT91bdVS7t2u3CFibC26vi4g7aaMaUjmpNBbiKxnUQyfkjTBEbEZT9VKOtELvMIaWrpxNFXW6IWcpOddo9jqPFfMsqjoJ+8/ZGyQqMqdhZvIHs3WHBrh4kNvvIsNw5Da7OdgXAgKGCMz+gEAxRgCmINDcxZ2CyNMYETkhESj+jwi1t1+r9759ah8='),
- this.addDataEntry('container swimlane pool vertical', 380, 480, 'Vertical Pool 2',
- 'xZTPbsIwDMafJvf86dDOlI0LSEg8QUQtEi1pUBJGy9PPbdJ1G1TqhXGoZH/219g/RSGitM3ay5PaugoMEW9ElN65mCLblGAM4VRXRKwI5xQ/wt8nqqyv0pP0UMc5Bp4Mn9KcISk750wSQ2xNFsNFWyNrzJYqWpxyxTA8KG2qjWzduTsrRHn4GLKlh6CvsBsGYX+krWxQpaiizcc9FjDnnaCc11dXR2lyxyjsuyPy3/Lg4CM0k8v3Ut58Dc5C9C22XHQVVeoQrwkQVaCPKtuKQZQhCcdv78gSg4zzPlpxg3bTEeSUzcR7Q2bWyvz+ytmQr8NPAow/ikAxRYA/kQAr/hPByxQC8cxLsHggAkzH56uv/XrdvgA='),
- this.createVertexTemplateEntry('swimlane;startSize=20;', 120, 320, 'Lane', 'Vertical Swimlane', null, null, 'swimlane lane pool'),
- this.createVertexTemplateEntry('rounded=1;arcSize=10;dashed=1;strokeColor=#000000;fillColor=none;gradientColor=none;dashPattern=8 3 1 3;strokeWidth=2;',
- 200, 200, '', 'Group', null, null, this.getTagsForStencil('bpmn', 'group', 'bpmn business process model ').join(' ')),
- this.createEdgeTemplateEntry('endArrow=block;endFill=1;endSize=6;html=1;', 100, 0, '', 'Sequence Flow', null, 'bpmn sequence flow'),
- this.createEdgeTemplateEntry('startArrow=dash;startSize=8;endArrow=block;endFill=1;endSize=6;html=1;', 100, 0, '', 'Default Flow', null, 'bpmn default flow'),
- this.createEdgeTemplateEntry('startArrow=diamondThin;startFill=0;startSize=14;endArrow=block;endFill=1;endSize=6;html=1;', 100, 0, '', 'Conditional Flow', null, 'bpmn conditional flow'),
- this.createEdgeTemplateEntry('startArrow=oval;startFill=0;startSize=7;endArrow=block;endFill=0;endSize=10;dashed=1;html=1;', 100, 0, '', 'Message Flow 1', null, 'bpmn message flow'),
- this.addEntry('bpmn message flow', function()
- {
- var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'startArrow=oval;startFill=0;startSize=7;endArrow=block;endFill=0;endSize=10;dashed=1;html=1;');
- edge.geometry.setTerminalPoint(new mxPoint(0, 0), true);
- edge.geometry.setTerminalPoint(new mxPoint(100, 0), false);
- edge.geometry.relative = true;
- edge.edge = true;
-
- var cell = new mxCell('', new mxGeometry(0, 0, 20, 14), 'shape=message;html=1;outlineConnect=0;');
- cell.geometry.relative = true;
- cell.vertex = true;
- cell.geometry.offset = new mxPoint(-10, -7);
- edge.insert(cell);
-
- return sb.createEdgeTemplateFromCells([edge], 100, 0, 'Message Flow 2');
- }),
- this.createEdgeTemplateEntry('shape=link;html=1;', 100, 0, '', 'Link', null, 'bpmn link')
- ];
-
- this.addPaletteFunctions('bpmn', 'BPMN ' + mxResources.get('general'), false, fns);
- this.setCurrentSearchEntryLibrary();
-};
-
-/**
- * Creates and returns the given title element.
- */
-Sidebar.prototype.createTitle = function(label)
-{
- var elt = document.createElement('a');
- elt.setAttribute('title', mxResources.get('sidebarTooltip'));
- elt.className = 'geTitle';
- mxUtils.write(elt, label);
-
- return elt;
-};
-
-/**
- * Creates a thumbnail for the given cells.
- */
-Sidebar.prototype.createThumb = function(cells, width, height, parent, title, showLabel, showTitle, realWidth, realHeight)
-{
- this.graph.labelsVisible = (showLabel == null || showLabel);
- var fo = mxClient.NO_FO;
- mxClient.NO_FO = Editor.prototype.originalNoForeignObject;
- this.graph.view.scaleAndTranslate(1, 0, 0);
- this.graph.addCells(cells);
- var bounds = this.graph.getGraphBounds();
- var s = Math.floor(Math.min((width - 2 * this.thumbBorder) / bounds.width,
- (height - 2 * this.thumbBorder) / bounds.height) * 100) / 100;
- this.graph.view.scaleAndTranslate(s, Math.floor((width - bounds.width * s) / 2 / s - bounds.x),
- Math.floor((height - bounds.height * s) / 2 / s - bounds.y));
- var node = null;
-
- // For supporting HTML labels in IE9 standards mode the container is cloned instead
- if (this.graph.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO &&
- this.graph.view.getCanvas().ownerSVGElement != null)
- {
- node = this.graph.view.getCanvas().ownerSVGElement.cloneNode(true);
- }
- // LATER: Check if deep clone can be used for quirks if container in DOM
- else
- {
- node = this.graph.container.cloneNode(false);
- node.innerHTML = this.graph.container.innerHTML;
-
- // Workaround for clipping in older IE versions
- if (mxClient.IS_QUIRKS || document.documentMode == 8)
- {
- node.firstChild.style.overflow = 'visible';
- }
- }
-
- this.graph.getModel().clear();
- mxClient.NO_FO = fo;
-
- // Catch-all event handling
- if (mxClient.IS_IE6)
- {
- parent.style.backgroundImage = 'url(' + this.editorUi.editor.transparentImage + ')';
- }
-
- node.style.position = 'relative';
- node.style.overflow = 'hidden';
- node.style.left = this.thumbBorder + 'px';
- node.style.top = this.thumbBorder + 'px';
- node.style.width = width + 'px';
- node.style.height = height + 'px';
- node.style.visibility = '';
- node.style.minWidth = '';
- node.style.minHeight = '';
-
- parent.appendChild(node);
-
- // Adds title for sidebar entries
- if (this.sidebarTitles && title != null && showTitle != false)
- {
- var border = (mxClient.IS_QUIRKS) ? 2 * this.thumbPadding + 2: 0;
- parent.style.height = (this.thumbHeight + border + this.sidebarTitleSize + 8) + 'px';
-
- var div = document.createElement('div');
- div.style.fontSize = this.sidebarTitleSize + 'px';
- div.style.color = '#303030';
- div.style.textAlign = 'center';
- div.style.whiteSpace = 'nowrap';
-
- if (mxClient.IS_IE)
- {
- div.style.height = (this.sidebarTitleSize + 12) + 'px';
- }
-
- div.style.paddingTop = '4px';
- mxUtils.write(div, title);
- parent.appendChild(div);
- }
-
- return bounds;
-};
-
-/**
- * Creates and returns a new palette item for the given image.
- */
-Sidebar.prototype.createItem = function(cells, title, showLabel, showTitle, width, height, allowCellsInserted)
-{
- var elt = document.createElement('a');
- elt.className = 'geItem';
- elt.style.overflow = 'hidden';
- var border = (mxClient.IS_QUIRKS) ? 8 + 2 * this.thumbPadding : 2 * this.thumbBorder;
- elt.style.width = (this.thumbWidth + border) + 'px';
- elt.style.height = (this.thumbHeight + border) + 'px';
- elt.style.padding = this.thumbPadding + 'px';
-
- if (mxClient.IS_IE6)
- {
- elt.style.border = 'none';
- }
-
- // Blocks default click action
- mxEvent.addListener(elt, 'click', function(evt)
- {
- mxEvent.consume(evt);
- });
-
- this.createThumb(cells, this.thumbWidth, this.thumbHeight, elt, title, showLabel, showTitle, width, height);
- var bounds = new mxRectangle(0, 0, width, height);
-
- if (cells.length > 1 || cells[0].vertex)
- {
- var ds = this.createDragSource(elt, this.createDropHandler(cells, true, allowCellsInserted,
- bounds), this.createDragPreview(width, height), cells, bounds);
- this.addClickHandler(elt, ds, cells);
-
- // Uses guides for vertices only if enabled in graph
- ds.isGuidesEnabled = mxUtils.bind(this, function()
- {
- return this.editorUi.editor.graph.graphHandler.guidesEnabled;
- });
- }
- else if (cells[0] != null && cells[0].edge)
- {
- var ds = this.createDragSource(elt, this.createDropHandler(cells, false, allowCellsInserted,
- bounds), this.createDragPreview(width, height), cells, bounds);
- this.addClickHandler(elt, ds, cells);
- }
-
- // Shows a tooltip with the rendered cell
- if (!mxClient.IS_IOS)
- {
- mxEvent.addGestureListeners(elt, null, mxUtils.bind(this, function(evt)
- {
- if (mxEvent.isMouseEvent(evt))
- {
- this.showTooltip(elt, cells, bounds.width, bounds.height, title, showLabel);
- }
- }));
- }
-
- return elt;
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.updateShapes = function(source, targets)
-{
- var graph = this.editorUi.editor.graph;
- var sourceCellStyle = graph.getCellStyle(source);
- var result = [];
-
- graph.model.beginUpdate();
- try
- {
- var cellStyle = graph.getModel().getStyle(source);
-
- // Lists the styles to carry over from the existing shape
- var styles = ['shadow', 'dashed', 'dashPattern', 'fontFamily', 'fontSize', 'fontColor', 'align', 'startFill',
- 'startSize', 'endFill', 'endSize', 'strokeColor', 'strokeWidth', 'fillColor', 'gradientColor',
- 'html', 'part', 'noEdgeStyle', 'edgeStyle', 'elbow', 'childLayout', 'recursiveResize',
- 'container', 'collapsible', 'connectable', 'comic', 'sketch', 'fillWeight', 'hachureGap',
- 'hachureAngle', 'jiggle', 'disableMultiStroke', 'disableMultiStrokeFill',
- 'fillStyle', 'curveFitting', 'simplification', 'sketchStyle'];
-
- for (var i = 0; i < targets.length; i++)
- {
- var targetCell = targets[i];
-
- if ((graph.getModel().isVertex(targetCell) == graph.getModel().isVertex(source)) ||
- (graph.getModel().isEdge(targetCell) == graph.getModel().isEdge(source)))
- {
- var style = graph.getCurrentCellStyle(targets[i]);
- graph.getModel().setStyle(targetCell, cellStyle);
-
- // Removes all children of composite cells
- if (mxUtils.getValue(style, 'composite', '0') == '1')
- {
- var childCount = graph.model.getChildCount(targetCell);
-
- for (var j = childCount; j >= 0; j--)
- {
- graph.model.remove(graph.model.getChildAt(targetCell, j));
- }
- }
-
- // Replaces the participant style in the lifeline shape with the target shape
- if (style[mxConstants.STYLE_SHAPE] == 'umlLifeline' &&
- sourceCellStyle[mxConstants.STYLE_SHAPE] != 'umlLifeline')
- {
- graph.setCellStyles(mxConstants.STYLE_SHAPE, 'umlLifeline', [targetCell]);
- graph.setCellStyles('participant', sourceCellStyle[mxConstants.STYLE_SHAPE], [targetCell]);
- }
-
- for (var j = 0; j < styles.length; j++)
- {
- var value = style[styles[j]];
-
- if (value != null)
- {
- graph.setCellStyles(styles[j], value, [targetCell]);
- }
- }
-
- result.push(targetCell);
- }
- }
- }
- finally
- {
- graph.model.endUpdate();
- }
-
- return result;
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createDropHandler = function(cells, allowSplit, allowCellsInserted, bounds)
-{
- allowCellsInserted = (allowCellsInserted != null) ? allowCellsInserted : true;
-
- return mxUtils.bind(this, function(graph, evt, target, x, y, force)
- {
- var elt = (force) ? null : ((mxEvent.isTouchEvent(evt) || mxEvent.isPenEvent(evt)) ?
- document.elementFromPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)) :
- mxEvent.getSource(evt));
-
- while (elt != null && elt != this.container)
- {
- elt = elt.parentNode;
- }
-
- if (elt == null && graph.isEnabled())
- {
- cells = graph.getImportableCells(cells);
-
- if (cells.length > 0)
- {
- graph.stopEditing();
-
- // Holding alt while mouse is released ignores drop target
- var validDropTarget = (target != null && !mxEvent.isAltDown(evt)) ?
- graph.isValidDropTarget(target, cells, evt) : false;
-
- var select = null;
-
- if (target != null && !validDropTarget)
- {
- target = null;
- }
-
- if (!graph.isCellLocked(target || graph.getDefaultParent()))
- {
- graph.model.beginUpdate();
- try
- {
- x = Math.round(x);
- y = Math.round(y);
-
- // Splits the target edge or inserts into target group
- if (allowSplit && graph.isSplitTarget(target, cells, evt))
- {
- var s = graph.view.scale;
- var tr = graph.view.translate;
- var tx = (x + tr.x) * s;
- var ty = (y + tr.y) * s;
-
- var clones = graph.cloneCells(cells);
- graph.splitEdge(target, clones, null,
- x - bounds.width / 2, y - bounds.height / 2,
- tx, ty);
- select = clones;
- }
- else if (cells.length > 0)
- {
- select = graph.importCells(cells, x, y, target);
- }
-
- // Executes parent layout hooks for position/order
- if (graph.layoutManager != null)
- {
- var layout = graph.layoutManager.getLayout(target);
-
- if (layout != null)
- {
- var s = graph.view.scale;
- var tr = graph.view.translate;
- var tx = (x + tr.x) * s;
- var ty = (y + tr.y) * s;
-
- for (var i = 0; i < select.length; i++)
- {
- layout.moveCell(select[i], tx, ty);
- }
- }
- }
-
- if (allowCellsInserted && (evt == null || !mxEvent.isShiftDown(evt)))
- {
- graph.fireEvent(new mxEventObject('cellsInserted', 'cells', select));
- }
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- finally
- {
- graph.model.endUpdate();
- }
-
- if (select != null && select.length > 0)
- {
- graph.scrollCellToVisible(select[0]);
- graph.setSelectionCells(select);
- }
-
- if (graph.editAfterInsert && evt != null && mxEvent.isMouseEvent(evt) &&
- select != null && select.length == 1)
- {
- window.setTimeout(function()
- {
- graph.startEditing(select[0]);
- }, 0);
- }
- }
- }
-
- mxEvent.consume(evt);
- }
- });
-};
-
-/**
- * Creates and returns a preview element for the given width and height.
- */
-Sidebar.prototype.createDragPreview = function(width, height)
-{
- var elt = document.createElement('div');
- elt.style.border = this.dragPreviewBorder;
- elt.style.width = width + 'px';
- elt.style.height = height + 'px';
-
- return elt;
-};
-
-/**
- * Creates a drag source for the given element.
- */
-Sidebar.prototype.dropAndConnect = function(source, targets, direction, dropCellIndex, evt)
-{
- var geo = this.getDropAndConnectGeometry(source, targets[dropCellIndex], direction, targets);
-
- // Targets without the new edge for selection
- var tmp = [];
-
- if (geo != null)
- {
- var graph = this.editorUi.editor.graph;
- var editingCell = null;
-
- graph.model.beginUpdate();
- try
- {
- var sourceGeo = graph.getCellGeometry(source);
- var geo2 = graph.getCellGeometry(targets[dropCellIndex]);
-
- // Handles special case where target should be ignored for stack layouts
- var targetParent = graph.model.getParent(source);
- var validLayout = true;
-
- // Ignores parent if it has a stack layout or if it is a table or row
- if (graph.layoutManager != null)
- {
- var layout = graph.layoutManager.getLayout(targetParent);
-
- // LATER: Use parent of parent if valid layout
- if (layout != null && layout.constructor == mxStackLayout)
- {
- validLayout = false;
- }
- }
-
- // Checks if another container is at the drop location
- var tmp = (graph.model.isEdge(source)) ? null : graph.view.getState(targetParent);
- var dx = 0;
- var dy = 0;
-
- // Offsets by parent position
- if (tmp != null)
- {
- var offset = tmp.origin;
- dx = offset.x;
- dy = offset.y;
-
- var pt = geo.getTerminalPoint(false);
-
- if (pt != null)
- {
- pt.x += offset.x;
- pt.y += offset.y;
- }
- }
-
- var useParent = !graph.isTableRow(source) && !graph.isTableCell(source) &&
- (graph.model.isEdge(source) || (sourceGeo != null &&
- !sourceGeo.relative && validLayout));
-
- var tempTarget = graph.getCellAt((geo.x + dx + graph.view.translate.x) * graph.view.scale,
- (geo.y + dy + graph.view.translate.y) * graph.view.scale, null, null, null, function(state, x, y)
- {
- return !graph.isContainer(state.cell);
- });
-
- if (tempTarget != null && tempTarget != targetParent)
- {
- tmp = graph.view.getState(tempTarget);
-
- // Offsets by new parent position
- if (tmp != null)
- {
- var offset = tmp.origin;
- targetParent = tempTarget;
- useParent = true;
-
- if (!graph.model.isEdge(source))
- {
- geo.x -= offset.x - dx;
- geo.y -= offset.y - dy;
- }
- }
- }
- else if (!validLayout || graph.isTableRow(source) || graph.isTableCell(source))
- {
- geo.x += dx;
- geo.y += dy;
- }
-
- dx = geo2.x;
- dy = geo2.y;
-
- // Ignores geometry of edges
- if (graph.model.isEdge(targets[dropCellIndex]))
- {
- dx = 0;
- dy = 0;
- }
-
- targets = graph.importCells(targets, (geo.x - (useParent ? dx : 0)),
- (geo.y - (useParent ? dy : 0)), (useParent) ? targetParent : null);
- tmp = targets;
-
- if (graph.model.isEdge(source))
- {
- // Adds new terminal to edge
- // LATER: Push new terminal out radially from edge start point
- graph.model.setTerminal(source, targets[dropCellIndex],
- direction == mxConstants.DIRECTION_NORTH);
- }
- else if (graph.model.isEdge(targets[dropCellIndex]))
- {
- // Adds new outgoing connection to vertex and clears points
- graph.model.setTerminal(targets[dropCellIndex], source, true);
- var geo3 = graph.getCellGeometry(targets[dropCellIndex]);
- geo3.points = null;
-
- if (geo3.getTerminalPoint(false) != null)
- {
- geo3.setTerminalPoint(geo.getTerminalPoint(false), false);
- }
- else if (useParent && graph.model.isVertex(targetParent))
- {
- // Adds parent offset to other nodes
- var tmpState = graph.view.getState(targetParent);
- var offset = (tmpState.cell != graph.view.currentRoot) ?
- tmpState.origin : new mxPoint(0, 0);
-
- graph.cellsMoved(targets, offset.x, offset.y, null, null, true);
- }
- }
- else
- {
- geo2 = graph.getCellGeometry(targets[dropCellIndex]);
- dx = geo.x - Math.round(geo2.x);
- dy = geo.y - Math.round(geo2.y);
- geo.x = Math.round(geo2.x);
- geo.y = Math.round(geo2.y);
- graph.model.setGeometry(targets[dropCellIndex], geo);
- graph.cellsMoved(targets, dx, dy, null, null, true);
- tmp = targets.slice();
- editingCell = (tmp.length == 1) ? tmp[0] : null;
- targets.push(graph.insertEdge(null, null, '', source, targets[dropCellIndex],
- graph.createCurrentEdgeStyle()));
- }
-
- if (evt == null || !mxEvent.isShiftDown(evt))
- {
- graph.fireEvent(new mxEventObject('cellsInserted', 'cells', targets));
- }
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- finally
- {
- graph.model.endUpdate();
- }
-
- if (graph.editAfterInsert && evt != null && mxEvent.isMouseEvent(evt) &&
- editingCell != null)
- {
- window.setTimeout(function()
- {
- graph.startEditing(editingCell);
- }, 0);
- }
- }
-
- return tmp;
-};
-
-/**
- * Creates a drag source for the given element.
- */
-Sidebar.prototype.getDropAndConnectGeometry = function(source, target, direction, targets)
-{
- var graph = this.editorUi.editor.graph;
- var view = graph.view;
- var keepSize = targets.length > 1;
- var geo = graph.getCellGeometry(source);
- var geo2 = graph.getCellGeometry(target);
-
- if (geo != null && geo2 != null)
- {
- geo2 = geo2.clone();
-
- if (graph.model.isEdge(source))
- {
- var state = graph.view.getState(source);
- var pts = state.absolutePoints;
- var p0 = pts[0];
- var pe = pts[pts.length - 1];
-
- if (direction == mxConstants.DIRECTION_NORTH)
- {
- geo2.x = p0.x / view.scale - view.translate.x - geo2.width / 2;
- geo2.y = p0.y / view.scale - view.translate.y - geo2.height / 2;
- }
- else
- {
- geo2.x = pe.x / view.scale - view.translate.x - geo2.width / 2;
- geo2.y = pe.y / view.scale - view.translate.y - geo2.height / 2;
- }
- }
- else
- {
- if (geo.relative)
- {
- var state = graph.view.getState(source);
- geo = geo.clone();
- geo.x = (state.x - view.translate.x) / view.scale;
- geo.y = (state.y - view.translate.y) / view.scale;
- }
-
- var length = graph.defaultEdgeLength;
-
- // Maintains edge length
- if (graph.model.isEdge(target) && geo2.getTerminalPoint(true) != null &&
- geo2.getTerminalPoint(false) != null)
- {
- var p0 = geo2.getTerminalPoint(true);
- var pe = geo2.getTerminalPoint(false);
- var dx = pe.x - p0.x;
- var dy = pe.y - p0.y;
-
- length = Math.sqrt(dx * dx + dy * dy);
-
- geo2.x = geo.getCenterX();
- geo2.y = geo.getCenterY();
- geo2.width = 1;
- geo2.height = 1;
-
- if (direction == mxConstants.DIRECTION_NORTH)
- {
- geo2.height = length
- geo2.y = geo.y - length;
- geo2.setTerminalPoint(new mxPoint(geo2.x, geo2.y), false);
- }
- else if (direction == mxConstants.DIRECTION_EAST)
- {
- geo2.width = length
- geo2.x = geo.x + geo.width;
- geo2.setTerminalPoint(new mxPoint(geo2.x + geo2.width, geo2.y), false);
- }
- else if (direction == mxConstants.DIRECTION_SOUTH)
- {
- geo2.height = length
- geo2.y = geo.y + geo.height;
- geo2.setTerminalPoint(new mxPoint(geo2.x, geo2.y + geo2.height), false);
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- geo2.width = length
- geo2.x = geo.x - length;
- geo2.setTerminalPoint(new mxPoint(geo2.x, geo2.y), false);
- }
- }
- else
- {
- // Try match size or ignore if width or height < 45 which
- // is considered special enough to be ignored here
- if (!keepSize && geo2.width > 45 && geo2.height > 45 &&
- geo.width > 45 && geo.height > 45)
- {
- geo2.width = geo2.width * (geo.height / geo2.height);
- geo2.height = geo.height;
- }
-
- geo2.x = geo.x + geo.width / 2 - geo2.width / 2;
- geo2.y = geo.y + geo.height / 2 - geo2.height / 2;
-
- if (direction == mxConstants.DIRECTION_NORTH)
- {
- geo2.y = geo2.y - geo.height / 2 - geo2.height / 2 - length;
- }
- else if (direction == mxConstants.DIRECTION_EAST)
- {
- geo2.x = geo2.x + geo.width / 2 + geo2.width / 2 + length;
- }
- else if (direction == mxConstants.DIRECTION_SOUTH)
- {
- geo2.y = geo2.y + geo.height / 2 + geo2.height / 2 + length;
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- geo2.x = geo2.x - geo.width / 2 - geo2.width / 2 - length;
- }
-
- // Adds offset to match cells without connecting edge
- if (graph.model.isEdge(target) && geo2.getTerminalPoint(true) != null &&
- target.getTerminal(false) != null)
- {
- var targetGeo = graph.getCellGeometry(target.getTerminal(false));
-
- if (targetGeo != null)
- {
- if (direction == mxConstants.DIRECTION_NORTH)
- {
- geo2.x -= targetGeo.getCenterX();
- geo2.y -= targetGeo.getCenterY() + targetGeo.height / 2;
- }
- else if (direction == mxConstants.DIRECTION_EAST)
- {
- geo2.x -= targetGeo.getCenterX() - targetGeo.width / 2;
- geo2.y -= targetGeo.getCenterY();
- }
- else if (direction == mxConstants.DIRECTION_SOUTH)
- {
- geo2.x -= targetGeo.getCenterX();
- geo2.y -= targetGeo.getCenterY() - targetGeo.height / 2;
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- geo2.x -= targetGeo.getCenterX() + targetGeo.width / 2;
- geo2.y -= targetGeo.getCenterY();
- }
- }
- }
- }
- }
- }
-
- return geo2;
-};
-
-/**
- * Limits drop style to non-transparent source shapes.
- */
-Sidebar.prototype.isDropStyleEnabled = function(cells, firstVertex)
-{
- var result = true;
-
- if (firstVertex != null && cells.length == 1)
- {
- var vstyle = this.graph.getCellStyle(cells[firstVertex]);
-
- if (vstyle != null)
- {
- result = mxUtils.getValue(vstyle, mxConstants.STYLE_STROKECOLOR, mxConstants.NONE) != mxConstants.NONE ||
- mxUtils.getValue(vstyle, mxConstants.STYLE_FILLCOLOR, mxConstants.NONE) != mxConstants.NONE;
- }
- }
-
- return result;
-};
-
-/**
- * Ignores swimlanes as drop style targets.
- */
-Sidebar.prototype.isDropStyleTargetIgnored = function(state)
-{
- return this.graph.isSwimlane(state.cell) || this.graph.isTableCell(state.cell) ||
- this.graph.isTableRow(state.cell) || this.graph.isTable(state.cell);
-};
-
-/**
- * Creates a drag source for the given element.
- */
-Sidebar.prototype.createDragSource = function(elt, dropHandler, preview, cells, bounds)
-{
- // Checks if the cells contain any vertices
- var ui = this.editorUi;
- var graph = ui.editor.graph;
- var freeSourceEdge = null;
- var firstVertex = null;
- var sidebar = this;
-
- for (var i = 0; i < cells.length; i++)
- {
- if (firstVertex == null && graph.model.isVertex(cells[i]))
- {
- firstVertex = i;
- }
- else if (freeSourceEdge == null && graph.model.isEdge(cells[i]) &&
- graph.model.getTerminal(cells[i], true) == null)
- {
- freeSourceEdge = i;
- }
-
- if (firstVertex != null && freeSourceEdge != null)
- {
- break;
- }
- }
-
- var dropStyleEnabled = this.isDropStyleEnabled(cells, firstVertex);
-
- var dragSource = mxUtils.makeDraggable(elt, graph, mxUtils.bind(this, function(graph, evt, target, x, y)
- {
- if (this.updateThread != null)
- {
- window.clearTimeout(this.updateThread);
- }
-
- if (cells != null && currentStyleTarget != null && activeArrow == styleTarget)
- {
- var tmp = graph.isCellSelected(currentStyleTarget.cell) ? graph.getSelectionCells() : [currentStyleTarget.cell];
- var updatedCells = this.updateShapes((graph.model.isEdge(currentStyleTarget.cell)) ? cells[0] : cells[firstVertex], tmp);
- graph.setSelectionCells(updatedCells);
- }
- else if (cells != null && activeArrow != null && currentTargetState != null && activeArrow != styleTarget)
- {
- var index = (graph.model.isEdge(currentTargetState.cell) || freeSourceEdge == null) ? firstVertex : freeSourceEdge;
- graph.setSelectionCells(this.dropAndConnect(currentTargetState.cell, cells, direction, index, evt));
- }
- else
- {
- dropHandler.apply(this, arguments);
- }
-
- if (this.editorUi.hoverIcons != null)
- {
- this.editorUi.hoverIcons.update(graph.view.getState(graph.getSelectionCell()));
- }
- }), preview, 0, 0, graph.autoscroll, true, true);
-
- // Stops dragging if cancel is pressed
- graph.addListener(mxEvent.ESCAPE, function(sender, evt)
- {
- if (dragSource.isActive())
- {
- dragSource.reset();
- }
- });
-
- // Overrides mouseDown to ignore popup triggers
- var mouseDown = dragSource.mouseDown;
-
- dragSource.mouseDown = function(evt)
- {
- if (!mxEvent.isPopupTrigger(evt) && !mxEvent.isMultiTouchEvent(evt))
- {
- graph.stopEditing();
- mouseDown.apply(this, arguments);
- }
- };
-
- // Workaround for event redirection via image tag in quirks and IE8
- function createArrow(img, tooltip)
- {
- var arrow = null;
-
- if (mxClient.IS_IE && !mxClient.IS_SVG)
- {
- // Workaround for PNG images in IE6
- if (mxClient.IS_IE6 && document.compatMode != 'CSS1Compat')
- {
- arrow = document.createElement(mxClient.VML_PREFIX + ':image');
- arrow.setAttribute('src', img.src);
- arrow.style.borderStyle = 'none';
- }
- else
- {
- arrow = document.createElement('div');
- arrow.style.backgroundImage = 'url(' + img.src + ')';
- arrow.style.backgroundPosition = 'center';
- arrow.style.backgroundRepeat = 'no-repeat';
- }
-
- arrow.style.width = (img.width + 4) + 'px';
- arrow.style.height = (img.height + 4) + 'px';
- arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
- }
- else
- {
- arrow = mxUtils.createImage(img.src);
- arrow.style.width = img.width + 'px';
- arrow.style.height = img.height + 'px';
- }
-
- if (tooltip != null)
- {
- arrow.setAttribute('title', tooltip);
- }
-
- mxUtils.setOpacity(arrow, (img == this.refreshTarget) ? 30 : 20);
- arrow.style.position = 'absolute';
- arrow.style.cursor = 'crosshair';
-
- return arrow;
- };
-
- var currentTargetState = null;
- var currentStateHandle = null;
- var currentStyleTarget = null;
- var activeTarget = false;
-
- var arrowUp = createArrow(this.triangleUp, mxResources.get('connect'));
- var arrowRight = createArrow(this.triangleRight, mxResources.get('connect'));
- var arrowDown = createArrow(this.triangleDown, mxResources.get('connect'));
- var arrowLeft = createArrow(this.triangleLeft, mxResources.get('connect'));
- var styleTarget = createArrow(this.refreshTarget, mxResources.get('replace'));
- // Workaround for actual parentNode not being updated in old IE
- var styleTargetParent = null;
- var roundSource = createArrow(this.roundDrop);
- var roundTarget = createArrow(this.roundDrop);
- var direction = mxConstants.DIRECTION_NORTH;
- var activeArrow = null;
-
- function checkArrow(x, y, bounds, arrow)
- {
- if (arrow.parentNode != null)
- {
- if (mxUtils.contains(bounds, x, y))
- {
- mxUtils.setOpacity(arrow, 100);
- activeArrow = arrow;
- }
- else
- {
- mxUtils.setOpacity(arrow, (arrow == styleTarget) ? 30 : 20);
- }
- }
-
- return bounds;
- };
-
- // Hides guides and preview if target is active
- var dsCreatePreviewElement = dragSource.createPreviewElement;
-
- // Stores initial size of preview element
- dragSource.createPreviewElement = function(graph)
- {
- var elt = dsCreatePreviewElement.apply(this, arguments);
-
- // Pass-through events required to tooltip on replace shape
- if (mxClient.IS_SVG)
- {
- elt.style.pointerEvents = 'none';
- }
-
- this.previewElementWidth = elt.style.width;
- this.previewElementHeight = elt.style.height;
-
- return elt;
- };
-
- // Shows/hides hover icons
- var dragEnter = dragSource.dragEnter;
- dragSource.dragEnter = function(graph, evt)
- {
- if (ui.hoverIcons != null)
- {
- ui.hoverIcons.setDisplay('none');
- }
-
- dragEnter.apply(this, arguments);
- };
-
- var dragExit = dragSource.dragExit;
- dragSource.dragExit = function(graph, evt)
- {
- if (ui.hoverIcons != null)
- {
- ui.hoverIcons.setDisplay('');
- }
-
- dragExit.apply(this, arguments);
- };
-
- dragSource.dragOver = function(graph, evt)
- {
- mxDragSource.prototype.dragOver.apply(this, arguments);
-
- if (this.currentGuide != null && activeArrow != null)
- {
- this.currentGuide.hide();
- }
-
- if (this.previewElement != null)
- {
- var view = graph.view;
-
- if (currentStyleTarget != null && activeArrow == styleTarget)
- {
- this.previewElement.style.display = (graph.model.isEdge(currentStyleTarget.cell)) ? 'none' : '';
-
- this.previewElement.style.left = currentStyleTarget.x + 'px';
- this.previewElement.style.top = currentStyleTarget.y + 'px';
- this.previewElement.style.width = currentStyleTarget.width + 'px';
- this.previewElement.style.height = currentStyleTarget.height + 'px';
- }
- else if (currentTargetState != null && activeArrow != null)
- {
- if (dragSource.currentHighlight != null && dragSource.currentHighlight.state != null)
- {
- dragSource.currentHighlight.hide();
- }
-
- var index = (graph.model.isEdge(currentTargetState.cell) || freeSourceEdge == null) ? firstVertex : freeSourceEdge;
- var geo = sidebar.getDropAndConnectGeometry(currentTargetState.cell, cells[index], direction, cells);
- var geo2 = (!graph.model.isEdge(currentTargetState.cell)) ? graph.getCellGeometry(currentTargetState.cell) : null;
- var geo3 = graph.getCellGeometry(cells[index]);
- var parent = graph.model.getParent(currentTargetState.cell);
- var dx = view.translate.x * view.scale;
- var dy = view.translate.y * view.scale;
-
- if (geo2 != null && !geo2.relative && graph.model.isVertex(parent) && parent != view.currentRoot)
- {
- var pState = view.getState(parent);
-
- dx = pState.x;
- dy = pState.y;
- }
-
- var dx2 = geo3.x;
- var dy2 = geo3.y;
-
- // Ignores geometry of edges
- if (graph.model.isEdge(cells[index]))
- {
- dx2 = 0;
- dy2 = 0;
- }
-
- // Shows preview at drop location
- this.previewElement.style.left = ((geo.x - dx2) * view.scale + dx) + 'px';
- this.previewElement.style.top = ((geo.y - dy2) * view.scale + dy) + 'px';
-
- if (cells.length == 1)
- {
- this.previewElement.style.width = (geo.width * view.scale) + 'px';
- this.previewElement.style.height = (geo.height * view.scale) + 'px';
- }
-
- this.previewElement.style.display = '';
- }
- else if (dragSource.currentHighlight.state != null &&
- graph.model.isEdge(dragSource.currentHighlight.state.cell))
- {
- // Centers drop cells when splitting edges
- this.previewElement.style.left = Math.round(parseInt(this.previewElement.style.left) -
- bounds.width * view.scale / 2) + 'px';
- this.previewElement.style.top = Math.round(parseInt(this.previewElement.style.top) -
- bounds.height * view.scale / 2) + 'px';
- }
- else
- {
- this.previewElement.style.width = this.previewElementWidth;
- this.previewElement.style.height = this.previewElementHeight;
- this.previewElement.style.display = '';
- }
- }
- };
-
- var startTime = new Date().getTime();
- var timeOnTarget = 0;
- var prev = null;
-
- // Gets source cell style to compare shape below
- var sourceCellStyle = this.editorUi.editor.graph.getCellStyle(cells[0]);
-
- // Allows drop into cell only if target is a valid root
- dragSource.getDropTarget = mxUtils.bind(this, function(graph, x, y, evt)
- {
- // Alt means no targets at all
- // LATER: Show preview where result will go
- var cell = (!mxEvent.isAltDown(evt) && cells != null) ?
- graph.getCellAt(x, y, null, null, null, function(state, x, y)
- {
- return graph.isContainer(state.cell);
- }) : null;
-
- // Uses connectable parent vertex if one exists
- if (cell != null && !this.graph.isCellConnectable(cell) &&
- !this.graph.model.isEdge(cell))
- {
- var parent = this.graph.getModel().getParent(cell);
-
- if (this.graph.getModel().isVertex(parent) &&
- this.graph.isCellConnectable(parent))
- {
- cell = parent;
- }
- }
-
- // Ignores locked cells
- if (graph.isCellLocked(cell))
- {
- cell = null;
- }
-
- var state = graph.view.getState(cell);
- activeArrow = null;
- var bbox = null;
-
- // Time on target
- if (prev != state)
- {
- startTime = new Date().getTime();
- timeOnTarget = 0;
- prev = state;
-
- if (this.updateThread != null)
- {
- window.clearTimeout(this.updateThread);
- }
-
- if (state != null)
- {
- this.updateThread = window.setTimeout(function()
- {
- if (activeArrow == null)
- {
- prev = state;
- dragSource.getDropTarget(graph, x, y, evt);
- }
- }, this.dropTargetDelay + 10);
- }
- }
- else
- {
- timeOnTarget = new Date().getTime() - startTime;
- }
-
- // Shift means disabled, delayed on cells with children, shows after this.dropTargetDelay, hides after 2500ms
- if (dropStyleEnabled && (timeOnTarget < 2500) && state != null && !mxEvent.isShiftDown(evt) &&
- // If shape is equal or target has no stroke, fill and gradient then use longer delay except for images
- (((mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE) != mxUtils.getValue(sourceCellStyle, mxConstants.STYLE_SHAPE) &&
- (mxUtils.getValue(state.style, mxConstants.STYLE_STROKECOLOR, mxConstants.NONE) != mxConstants.NONE ||
- mxUtils.getValue(state.style, mxConstants.STYLE_FILLCOLOR, mxConstants.NONE) != mxConstants.NONE ||
- mxUtils.getValue(state.style, mxConstants.STYLE_GRADIENTCOLOR, mxConstants.NONE) != mxConstants.NONE)) ||
- mxUtils.getValue(sourceCellStyle, mxConstants.STYLE_SHAPE) == 'image') ||
- timeOnTarget > 1500 || graph.model.isEdge(state.cell)) && (timeOnTarget > this.dropTargetDelay) &&
- !this.isDropStyleTargetIgnored(state) && ((graph.model.isVertex(state.cell) && firstVertex != null) ||
- (graph.model.isEdge(state.cell) && graph.model.isEdge(cells[0]))))
- {
- currentStyleTarget = state;
- var tmp = (graph.model.isEdge(state.cell)) ? graph.view.getPoint(state) :
- new mxPoint(state.getCenterX(), state.getCenterY());
- tmp = new mxRectangle(tmp.x - this.refreshTarget.width / 2, tmp.y - this.refreshTarget.height / 2,
- this.refreshTarget.width, this.refreshTarget.height);
-
- styleTarget.style.left = Math.floor(tmp.x) + 'px';
- styleTarget.style.top = Math.floor(tmp.y) + 'px';
-
- if (styleTargetParent == null)
- {
- graph.container.appendChild(styleTarget);
- styleTargetParent = styleTarget.parentNode;
- }
-
- checkArrow(x, y, tmp, styleTarget);
- }
- // Does not reset on ignored edges
- else if (currentStyleTarget == null || !mxUtils.contains(currentStyleTarget, x, y) ||
- (timeOnTarget > 1500 && !mxEvent.isShiftDown(evt)))
- {
- currentStyleTarget = null;
-
- if (styleTargetParent != null)
- {
- styleTarget.parentNode.removeChild(styleTarget);
- styleTargetParent = null;
- }
- }
- else if (currentStyleTarget != null && styleTargetParent != null)
- {
- // Sets active Arrow as side effect
- var tmp = (graph.model.isEdge(currentStyleTarget.cell)) ? graph.view.getPoint(currentStyleTarget) : new mxPoint(currentStyleTarget.getCenterX(), currentStyleTarget.getCenterY());
- tmp = new mxRectangle(tmp.x - this.refreshTarget.width / 2, tmp.y - this.refreshTarget.height / 2,
- this.refreshTarget.width, this.refreshTarget.height);
- checkArrow(x, y, tmp, styleTarget);
- }
-
- // Checks if inside bounds
- if (activeTarget && currentTargetState != null && !mxEvent.isAltDown(evt) && activeArrow == null)
- {
- // LATER: Use hit-detection for edges
- bbox = mxRectangle.fromRectangle(currentTargetState);
-
- if (graph.model.isEdge(currentTargetState.cell))
- {
- var pts = currentTargetState.absolutePoints;
-
- if (roundSource.parentNode != null)
- {
- var p0 = pts[0];
- bbox.add(checkArrow(x, y, new mxRectangle(p0.x - this.roundDrop.width / 2,
- p0.y - this.roundDrop.height / 2, this.roundDrop.width, this.roundDrop.height), roundSource));
- }
-
- if (roundTarget.parentNode != null)
- {
- var pe = pts[pts.length - 1];
- bbox.add(checkArrow(x, y, new mxRectangle(pe.x - this.roundDrop.width / 2,
- pe.y - this.roundDrop.height / 2,
- this.roundDrop.width, this.roundDrop.height), roundTarget));
- }
- }
- else
- {
- var bds = mxRectangle.fromRectangle(currentTargetState);
-
- // Uses outer bounding box to take rotation into account
- if (currentTargetState.shape != null && currentTargetState.shape.boundingBox != null)
- {
- bds = mxRectangle.fromRectangle(currentTargetState.shape.boundingBox);
- }
-
- bds.grow(this.graph.tolerance);
- bds.grow(HoverIcons.prototype.arrowSpacing);
-
- var handler = this.graph.selectionCellsHandler.getHandler(currentTargetState.cell);
-
- if (handler != null)
- {
- bds.x -= handler.horizontalOffset / 2;
- bds.y -= handler.verticalOffset / 2;
- bds.width += handler.horizontalOffset;
- bds.height += handler.verticalOffset;
-
- // Adds bounding box of rotation handle to avoid overlap
- if (handler.rotationShape != null && handler.rotationShape.node != null &&
- handler.rotationShape.node.style.visibility != 'hidden' &&
- handler.rotationShape.node.style.display != 'none' &&
- handler.rotationShape.boundingBox != null)
- {
- bds.add(handler.rotationShape.boundingBox);
- }
- }
-
- bbox.add(checkArrow(x, y, new mxRectangle(currentTargetState.getCenterX() - this.triangleUp.width / 2,
- bds.y - this.triangleUp.height, this.triangleUp.width, this.triangleUp.height), arrowUp));
- bbox.add(checkArrow(x, y, new mxRectangle(bds.x + bds.width,
- currentTargetState.getCenterY() - this.triangleRight.height / 2,
- this.triangleRight.width, this.triangleRight.height), arrowRight));
- bbox.add(checkArrow(x, y, new mxRectangle(currentTargetState.getCenterX() - this.triangleDown.width / 2,
- bds.y + bds.height, this.triangleDown.width, this.triangleDown.height), arrowDown));
- bbox.add(checkArrow(x, y, new mxRectangle(bds.x - this.triangleLeft.width,
- currentTargetState.getCenterY() - this.triangleLeft.height / 2,
- this.triangleLeft.width, this.triangleLeft.height), arrowLeft));
- }
-
- // Adds tolerance
- if (bbox != null)
- {
- bbox.grow(10);
- }
- }
-
- direction = mxConstants.DIRECTION_NORTH;
-
- if (activeArrow == arrowRight)
- {
- direction = mxConstants.DIRECTION_EAST;
- }
- else if (activeArrow == arrowDown || activeArrow == roundTarget)
- {
- direction = mxConstants.DIRECTION_SOUTH;
- }
- else if (activeArrow == arrowLeft)
- {
- direction = mxConstants.DIRECTION_WEST;
- }
-
- if (currentStyleTarget != null && activeArrow == styleTarget)
- {
- state = currentStyleTarget;
- }
-
- var validTarget = (firstVertex == null || graph.isCellConnectable(cells[firstVertex])) &&
- ((graph.model.isEdge(cell) && firstVertex != null) ||
- (graph.model.isVertex(cell) && graph.isCellConnectable(cell)));
-
- // Drop arrows shown after this.dropTargetDelay, hidden after 5 secs, switches arrows after 500ms
- if ((currentTargetState != null && timeOnTarget >= 5000) ||
- (currentTargetState != state &&
- (bbox == null || !mxUtils.contains(bbox, x, y) ||
- (timeOnTarget > 500 && activeArrow == null && validTarget))))
- {
- activeTarget = false;
- currentTargetState = ((timeOnTarget < 5000 && timeOnTarget > this.dropTargetDelay) ||
- graph.model.isEdge(cell)) ? state : null;
-
- if (currentTargetState != null && validTarget)
- {
- var elts = [roundSource, roundTarget, arrowUp, arrowRight, arrowDown, arrowLeft];
-
- for (var i = 0; i < elts.length; i++)
- {
- if (elts[i].parentNode != null)
- {
- elts[i].parentNode.removeChild(elts[i]);
- }
- }
-
- if (graph.model.isEdge(cell))
- {
- var pts = state.absolutePoints;
-
- if (pts != null)
- {
- var p0 = pts[0];
- var pe = pts[pts.length - 1];
- var tol = graph.tolerance;
- var box = new mxRectangle(x - tol, y - tol, 2 * tol, 2 * tol);
-
- roundSource.style.left = Math.floor(p0.x - this.roundDrop.width / 2) + 'px';
- roundSource.style.top = Math.floor(p0.y - this.roundDrop.height / 2) + 'px';
-
- roundTarget.style.left = Math.floor(pe.x - this.roundDrop.width / 2) + 'px';
- roundTarget.style.top = Math.floor(pe.y - this.roundDrop.height / 2) + 'px';
-
- if (graph.model.getTerminal(cell, true) == null)
- {
- graph.container.appendChild(roundSource);
- }
-
- if (graph.model.getTerminal(cell, false) == null)
- {
- graph.container.appendChild(roundTarget);
- }
- }
- }
- else
- {
- var bds = mxRectangle.fromRectangle(state);
-
- // Uses outer bounding box to take rotation into account
- if (state.shape != null && state.shape.boundingBox != null)
- {
- bds = mxRectangle.fromRectangle(state.shape.boundingBox);
- }
-
- bds.grow(this.graph.tolerance);
- bds.grow(HoverIcons.prototype.arrowSpacing);
-
- var handler = this.graph.selectionCellsHandler.getHandler(state.cell);
-
- if (handler != null)
- {
- bds.x -= handler.horizontalOffset / 2;
- bds.y -= handler.verticalOffset / 2;
- bds.width += handler.horizontalOffset;
- bds.height += handler.verticalOffset;
-
- // Adds bounding box of rotation handle to avoid overlap
- if (handler.rotationShape != null && handler.rotationShape.node != null &&
- handler.rotationShape.node.style.visibility != 'hidden' &&
- handler.rotationShape.node.style.display != 'none' &&
- handler.rotationShape.boundingBox != null)
- {
- bds.add(handler.rotationShape.boundingBox);
- }
- }
-
- arrowUp.style.left = Math.floor(state.getCenterX() - this.triangleUp.width / 2) + 'px';
- arrowUp.style.top = Math.floor(bds.y - this.triangleUp.height) + 'px';
-
- arrowRight.style.left = Math.floor(bds.x + bds.width) + 'px';
- arrowRight.style.top = Math.floor(state.getCenterY() - this.triangleRight.height / 2) + 'px';
-
- arrowDown.style.left = arrowUp.style.left
- arrowDown.style.top = Math.floor(bds.y + bds.height) + 'px';
-
- arrowLeft.style.left = Math.floor(bds.x - this.triangleLeft.width) + 'px';
- arrowLeft.style.top = arrowRight.style.top;
-
- if (state.style['portConstraint'] != 'eastwest')
- {
- graph.container.appendChild(arrowUp);
- graph.container.appendChild(arrowDown);
- }
-
- graph.container.appendChild(arrowRight);
- graph.container.appendChild(arrowLeft);
- }
-
- // Hides handle for cell under mouse
- if (state != null)
- {
- currentStateHandle = graph.selectionCellsHandler.getHandler(state.cell);
-
- if (currentStateHandle != null && currentStateHandle.setHandlesVisible != null)
- {
- currentStateHandle.setHandlesVisible(false);
- }
- }
-
- activeTarget = true;
- }
- else
- {
- var elts = [roundSource, roundTarget, arrowUp, arrowRight, arrowDown, arrowLeft];
-
- for (var i = 0; i < elts.length; i++)
- {
- if (elts[i].parentNode != null)
- {
- elts[i].parentNode.removeChild(elts[i]);
- }
- }
- }
- }
-
- if (!activeTarget && currentStateHandle != null)
- {
- currentStateHandle.setHandlesVisible(true);
- }
-
- // Handles drop target
- var target = ((!mxEvent.isAltDown(evt) || mxEvent.isShiftDown(evt)) &&
- !(currentStyleTarget != null && activeArrow == styleTarget)) ?
- mxDragSource.prototype.getDropTarget.apply(this, arguments) : null;
- var model = graph.getModel();
-
- if (target != null)
- {
- if (activeArrow != null || !graph.isSplitTarget(target, cells, evt))
- {
- // Selects parent group as drop target
- while (target != null && !graph.isValidDropTarget(target, cells, evt) &&
- model.isVertex(model.getParent(target)))
- {
- target = model.getParent(target);
- }
-
- if (target != null && (graph.view.currentRoot == target ||
- (!graph.isValidRoot(target) &&
- graph.getModel().getChildCount(target) == 0) ||
- graph.isCellLocked(target) || model.isEdge(target) ||
- !graph.isValidDropTarget(target, cells, evt)))
- {
- target = null;
- }
- }
- }
-
- return target;
- });
-
- dragSource.stopDrag = function()
- {
- mxDragSource.prototype.stopDrag.apply(this, arguments);
-
- var elts = [roundSource, roundTarget, styleTarget, arrowUp, arrowRight, arrowDown, arrowLeft];
-
- for (var i = 0; i < elts.length; i++)
- {
- if (elts[i].parentNode != null)
- {
- elts[i].parentNode.removeChild(elts[i]);
- }
- }
-
- if (currentTargetState != null && currentStateHandle != null)
- {
- currentStateHandle.reset();
- }
-
- currentStateHandle = null;
- currentTargetState = null;
- currentStyleTarget = null;
- styleTargetParent = null;
- activeArrow = null;
- };
-
- return dragSource;
-};
-
-/**
- * Adds a handler for inserting the cell with a single click.
- */
-Sidebar.prototype.itemClicked = function(cells, ds, evt, elt)
-{
- var graph = this.editorUi.editor.graph;
- graph.container.focus();
-
- // Alt+Click inserts and connects
- if (mxEvent.isAltDown(evt) && graph.getSelectionCount() == 1 &&
- graph.model.isVertex(graph.getSelectionCell()))
- {
- var firstVertex = null;
-
- for (var i = 0; i < cells.length && firstVertex == null; i++)
- {
- if (graph.model.isVertex(cells[i]))
- {
- firstVertex = i;
- }
- }
-
- if (firstVertex != null)
- {
- graph.setSelectionCells(this.dropAndConnect(graph.getSelectionCell(), cells,
- (mxEvent.isMetaDown(evt) || mxEvent.isControlDown(evt)) ?
- (mxEvent.isShiftDown(evt) ? mxConstants.DIRECTION_WEST : mxConstants.DIRECTION_NORTH) :
- (mxEvent.isShiftDown(evt) ? mxConstants.DIRECTION_EAST : mxConstants.DIRECTION_SOUTH),
- firstVertex, evt));
- graph.scrollCellToVisible(graph.getSelectionCell());
- }
- }
- // Shift+Click updates shape
- else if (mxEvent.isShiftDown(evt) && !graph.isSelectionEmpty())
- {
- this.updateShapes(cells[0], graph.getSelectionCells());
- graph.scrollCellToVisible(graph.getSelectionCell());
- }
- else
- {
- var pt = (mxEvent.isAltDown(evt)) ? graph.getFreeInsertPoint() :
- graph.getCenterInsertPoint(graph.getBoundingBoxFromGeometry(cells, true));
- ds.drop(graph, evt, null, pt.x, pt.y, true);
- }
-};
-
-/**
- * Adds a handler for inserting the cell with a single click.
- */
-Sidebar.prototype.addClickHandler = function(elt, ds, cells)
-{
- var graph = this.editorUi.editor.graph;
- var oldMouseDown = ds.mouseDown;
- var oldMouseMove = ds.mouseMove;
- var oldMouseUp = ds.mouseUp;
- var tol = graph.tolerance;
- var first = null;
- var sb = this;
-
- ds.mouseDown =function(evt)
- {
- oldMouseDown.apply(this, arguments);
- first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-
- if (this.dragElement != null)
- {
- this.dragElement.style.display = 'none';
- mxUtils.setOpacity(elt, 50);
- }
- };
-
- ds.mouseMove = function(evt)
- {
- if (this.dragElement != null && this.dragElement.style.display == 'none' &&
- first != null && (Math.abs(first.x - mxEvent.getClientX(evt)) > tol ||
- Math.abs(first.y - mxEvent.getClientY(evt)) > tol))
- {
- this.dragElement.style.display = '';
- mxUtils.setOpacity(elt, 100);
- }
-
- oldMouseMove.apply(this, arguments);
- };
-
- ds.mouseUp = function(evt)
- {
- try
- {
- if (!mxEvent.isPopupTrigger(evt) && this.currentGraph == null &&
- this.dragElement != null && this.dragElement.style.display == 'none')
- {
- sb.itemClicked(cells, ds, evt, elt);
- }
-
- oldMouseUp.apply(ds, arguments);
- mxUtils.setOpacity(elt, 100);
- first = null;
-
- // Blocks tooltips on this element after single click
- sb.currentElt = elt;
- }
- catch (e)
- {
- ds.reset();
- sb.editorUi.handleError(e);
- }
- };
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createVertexTemplateEntry = function(style, width, height, value, title, showLabel, showTitle, tags)
-{
- tags = (tags != null && tags.length > 0) ? tags : ((title != null) ? title.toLowerCase() : '');
-
- return this.addEntry(tags, mxUtils.bind(this, function()
- {
- return this.createVertexTemplate(style, width, height, value, title, showLabel, showTitle);
- }));
-}
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createVertexTemplate = function(style, width, height, value, title, showLabel, showTitle, allowCellsInserted)
-{
- var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0, width, height), style)];
- cells[0].vertex = true;
-
- return this.createVertexTemplateFromCells(cells, width, height, title, showLabel, showTitle, allowCellsInserted);
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createVertexTemplateFromData = function(data, width, height, title, showLabel, showTitle, allowCellsInserted)
-{
- var doc = mxUtils.parseXml(Graph.decompress(data));
- var codec = new mxCodec(doc);
-
- var model = new mxGraphModel();
- codec.decode(doc.documentElement, model);
-
- var cells = this.graph.cloneCells(model.root.getChildAt(0).children);
-
- return this.createVertexTemplateFromCells(cells, width, height, title, showLabel, showTitle, allowCellsInserted);
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createVertexTemplateFromCells = function(cells, width, height, title, showLabel, showTitle, allowCellsInserted)
-{
- // Use this line to convert calls to this function with lots of boilerplate code for creating cells
- //console.trace('xml', Graph.compress(mxUtils.getXml(this.graph.encodeCells(cells))), cells);
- return this.createItem(cells, title, showLabel, showTitle, width, height, allowCellsInserted);
-};
-
-/**
- *
- */
-Sidebar.prototype.createEdgeTemplateEntry = function(style, width, height, value, title, showLabel, tags, allowCellsInserted)
-{
- tags = (tags != null && tags.length > 0) ? tags : title.toLowerCase();
-
- return this.addEntry(tags, mxUtils.bind(this, function()
- {
- return this.createEdgeTemplate(style, width, height, value, title, showLabel, allowCellsInserted);
- }));
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createEdgeTemplate = function(style, width, height, value, title, showLabel, allowCellsInserted)
-{
- var cell = new mxCell((value != null) ? value : '', new mxGeometry(0, 0, width, height), style);
- cell.geometry.setTerminalPoint(new mxPoint(0, height), true);
- cell.geometry.setTerminalPoint(new mxPoint(width, 0), false);
- cell.geometry.relative = true;
- cell.edge = true;
-
- return this.createEdgeTemplateFromCells([cell], width, height, title, showLabel, allowCellsInserted);
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createEdgeTemplateFromCells = function(cells, width, height, title, showLabel, allowCellsInserted)
-{
- return this.createItem(cells, title, showLabel, true, width, height, allowCellsInserted);
-};
-
-/**
- * Adds the given palette.
- */
-Sidebar.prototype.addPaletteFunctions = function(id, title, expanded, fns)
-{
- this.addPalette(id, title, expanded, mxUtils.bind(this, function(content)
- {
- for (var i = 0; i < fns.length; i++)
- {
- content.appendChild(fns[i](content));
- }
- }));
-};
-
-/**
- * Adds the given palette.
- */
-Sidebar.prototype.addPalette = function(id, title, expanded, onInit)
-{
- var elt = this.createTitle(title);
- this.container.appendChild(elt);
-
- var div = document.createElement('div');
- div.className = 'geSidebar';
-
- // Disables built-in pan and zoom in IE10 and later
- if (mxClient.IS_POINTER)
- {
- div.style.touchAction = 'none';
- }
-
- if (expanded)
- {
- onInit(div);
- onInit = null;
- }
- else
- {
- div.style.display = 'none';
- }
-
- this.addFoldingHandler(elt, div, onInit);
-
- var outer = document.createElement('div');
- outer.appendChild(div);
- this.container.appendChild(outer);
-
- // Keeps references to the DOM nodes
- if (id != null)
- {
- this.palettes[id] = [elt, outer];
- }
-
- return div;
-};
-
-/**
- * Create the given title element.
- */
-Sidebar.prototype.addFoldingHandler = function(title, content, funct)
-{
- var initialized = false;
-
- // Avoids mixed content warning in IE6-8
- if (!mxClient.IS_IE || document.documentMode >= 8)
- {
- title.style.backgroundImage = (content.style.display == 'none') ?
- 'url(\'' + this.collapsedImage + '\')' : 'url(\'' + this.expandedImage + '\')';
- }
-
- title.style.backgroundRepeat = 'no-repeat';
- title.style.backgroundPosition = '0% 50%';
-
- mxEvent.addListener(title, 'click', mxUtils.bind(this, function(evt)
- {
- if (content.style.display == 'none')
- {
- if (!initialized)
- {
- initialized = true;
-
- if (funct != null)
- {
- // Wait cursor does not show up on Mac
- title.style.cursor = 'wait';
- var prev = title.innerHTML;
- title.innerHTML = mxResources.get('loading') + '...';
-
- window.setTimeout(function()
- {
- content.style.display = 'block';
- title.style.cursor = '';
- title.innerHTML = prev;
-
- var fo = mxClient.NO_FO;
- mxClient.NO_FO = Editor.prototype.originalNoForeignObject;
- funct(content, title);
- mxClient.NO_FO = fo;
- }, (mxClient.IS_FF) ? 20 : 0);
- }
- else
- {
- content.style.display = 'block';
- }
- }
- else
- {
- content.style.display = 'block';
- }
-
- title.style.backgroundImage = 'url(\'' + this.expandedImage + '\')';
- }
- else
- {
- title.style.backgroundImage = 'url(\'' + this.collapsedImage + '\')';
- content.style.display = 'none';
- }
-
- mxEvent.consume(evt);
- }));
-
- // Prevents focus
- if (!mxClient.IS_QUIRKS)
- {
- mxEvent.addListener(title, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown',
- mxUtils.bind(this, function(evt)
- {
- evt.preventDefault();
- }));
- }
-};
-
-/**
- * Removes the palette for the given ID.
- */
-Sidebar.prototype.removePalette = function(id)
-{
- var elts = this.palettes[id];
-
- if (elts != null)
- {
- this.palettes[id] = null;
-
- for (var i = 0; i < elts.length; i++)
- {
- this.container.removeChild(elts[i]);
- }
-
- return true;
- }
-
- return false;
-};
-
-/**
- * Adds the given image palette.
- */
-Sidebar.prototype.addImagePalette = function(id, title, prefix, postfix, items, titles, tags)
-{
- var showTitles = titles != null;
- var fns = [];
-
- for (var i = 0; i < items.length; i++)
- {
- (mxUtils.bind(this, function(item, title, tmpTags)
- {
- if (tmpTags == null)
- {
- var slash = item.lastIndexOf('/');
- var dot = item.lastIndexOf('.');
- tmpTags = item.substring((slash >= 0) ? slash + 1 : 0, (dot >= 0) ? dot : item.length).replace(/[-_]/g, ' ');
- }
-
- fns.push(this.createVertexTemplateEntry('image;html=1;image=' + prefix + item + postfix,
- this.defaultImageWidth, this.defaultImageHeight, '', title, title != null, null, this.filterTags(tmpTags)));
- }))(items[i], (titles != null) ? titles[i] : null, (tags != null) ? tags[items[i]] : null);
- }
-
- this.addPaletteFunctions(id, title, false, fns);
-};
-
-/**
- * Creates the array of tags for the given stencil. Duplicates are allowed and will be filtered out later.
- */
-Sidebar.prototype.getTagsForStencil = function(packageName, stencilName, moreTags)
-{
- var tags = packageName.split('.');
-
- for (var i = 1; i < tags.length; i++)
- {
- tags[i] = tags[i].replace(/_/g, ' ')
- }
-
- tags.push(stencilName.replace(/_/g, ' '));
-
- if (moreTags != null)
- {
- tags.push(moreTags);
- }
-
- return tags.slice(1, tags.length);
-};
-
-/**
- * Adds the given stencil palette.
- */
-Sidebar.prototype.addStencilPalette = function(id, title, stencilFile, style, ignore, onInit, scale, tags, customFns, groupId)
-{
- scale = (scale != null) ? scale : 1;
-
- if (this.addStencilsToIndex)
- {
- // LATER: Handle asynchronous loading dependency
- var fns = [];
-
- if (customFns != null)
- {
- for (var i = 0; i < customFns.length; i++)
- {
- fns.push(customFns[i]);
- }
- }
-
- mxStencilRegistry.loadStencilSet(stencilFile, mxUtils.bind(this, function(packageName, stencilName, displayName, w, h)
- {
- if (ignore == null || mxUtils.indexOf(ignore, stencilName) < 0)
- {
- var tmp = this.getTagsForStencil(packageName, stencilName);
- var tmpTags = (tags != null) ? tags[stencilName] : null;
-
- if (tmpTags != null)
- {
- tmp.push(tmpTags);
- }
-
- fns.push(this.createVertexTemplateEntry('shape=' + packageName + stencilName.toLowerCase() + style,
- Math.round(w * scale), Math.round(h * scale), '', stencilName.replace(/_/g, ' '), null, null,
- this.filterTags(tmp.join(' '))));
- }
- }), true, true);
-
- this.addPaletteFunctions(id, title, false, fns);
- }
- else
- {
- this.addPalette(id, title, false, mxUtils.bind(this, function(content)
- {
- if (style == null)
- {
- style = '';
- }
-
- if (onInit != null)
- {
- onInit.call(this, content);
- }
-
- if (customFns != null)
- {
- for (var i = 0; i < customFns.length; i++)
- {
- customFns[i](content);
- }
- }
-
- mxStencilRegistry.loadStencilSet(stencilFile, mxUtils.bind(this, function(packageName, stencilName, displayName, w, h)
- {
- if (ignore == null || mxUtils.indexOf(ignore, stencilName) < 0)
- {
- content.appendChild(this.createVertexTemplate('shape=' + packageName + stencilName.toLowerCase() + style,
- Math.round(w * scale), Math.round(h * scale), '', stencilName.replace(/_/g, ' '), true));
- }
- }), true);
- }));
- }
-};
-
-/**
- * Adds the given stencil palette.
- */
-Sidebar.prototype.destroy = function()
-{
- if (this.graph != null)
- {
- if (this.graph.container != null && this.graph.container.parentNode != null)
- {
- this.graph.container.parentNode.removeChild(this.graph.container);
- }
-
- this.graph.destroy();
- this.graph = null;
- }
-
- if (this.pointerUpHandler != null)
- {
- mxEvent.removeListener(document, (mxClient.IS_POINTER) ? 'pointerup' : 'mouseup', this.pointerUpHandler);
- this.pointerUpHandler = null;
- }
-
- if (this.pointerDownHandler != null)
- {
- mxEvent.removeListener(document, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown', this.pointerDownHandler);
- this.pointerDownHandler = null;
- }
-
- if (this.pointerMoveHandler != null)
- {
- mxEvent.removeListener(document, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', this.pointerMoveHandler);
- this.pointerMoveHandler = null;
- }
-
- if (this.pointerOutHandler != null)
- {
- mxEvent.removeListener(document, (mxClient.IS_POINTER) ? 'pointerout' : 'mouseout', this.pointerOutHandler);
- this.pointerOutHandler = null;
- }
-};
diff --git a/src/main/webapp/js/mxgraph/Toolbar.js b/src/main/webapp/js/mxgraph/Toolbar.js
deleted file mode 100644
index 1cd33b0b..00000000
--- a/src/main/webapp/js/mxgraph/Toolbar.js
+++ /dev/null
@@ -1,1106 +0,0 @@
-/**
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Construcs a new toolbar for the given editor.
- */
-function Toolbar(editorUi, container)
-{
- this.editorUi = editorUi;
- this.container = container;
- this.staticElements = [];
- this.init();
-
- // Global handler to hide the current menu
- this.gestureHandler = mxUtils.bind(this, function(evt)
- {
- if (this.editorUi.currentMenu != null && mxEvent.getSource(evt) != this.editorUi.currentMenu.div)
- {
- this.hideMenu();
- }
- });
-
- mxEvent.addGestureListeners(document, this.gestureHandler);
-};
-
-/**
- * Image for the dropdown arrow.
- */
-Toolbar.prototype.dropdownImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/dropdown.gif' : 'data:image/gif;base64,R0lGODlhDQANAIABAHt7e////yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCREM1NkJFMjE0NEMxMUU1ODk1Q0M5MjQ0MTA4QjNDMSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCREM1NkJFMzE0NEMxMUU1ODk1Q0M5MjQ0MTA4QjNDMSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQzOUMzMjZCMTQ0QjExRTU4OTVDQzkyNDQxMDhCM0MxIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQzOUMzMjZDMTQ0QjExRTU4OTVDQzkyNDQxMDhCM0MxIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAQAsAAAAAA0ADQAAAhGMj6nL3QAjVHIu6azbvPtWAAA7';
-
-/**
- * Image element for the dropdown arrow.
- */
-Toolbar.prototype.dropdownImageHtml = '<img border="0" style="position:absolute;right:4px;top:' +
- ((!EditorUi.compactUi) ? 8 : 6) + 'px;" src="' + Toolbar.prototype.dropdownImage + '" valign="middle"/>';
-
-/**
- * Defines the background for selected buttons.
- */
-Toolbar.prototype.selectedBackground = '#d0d0d0';
-
-/**
- * Defines the background for selected buttons.
- */
-Toolbar.prototype.unselectedBackground = 'none';
-
-/**
- * Array that contains the DOM nodes that should never be removed.
- */
-Toolbar.prototype.staticElements = null;
-
-/**
- * Adds the toolbar elements.
- */
-Toolbar.prototype.init = function()
-{
- var sw = screen.width;
-
- // Takes into account initial compact mode
- sw -= (screen.height > 740) ? 56 : 0;
-
- if (sw >= 700)
- {
- var formatMenu = this.addMenu('', mxResources.get('view') + ' (' + mxResources.get('panTooltip') + ')', true, 'viewPanels', null, true);
- this.addDropDownArrow(formatMenu, 'geSprite-formatpanel', 38, 50, -4, -3, 36, -8);
- this.addSeparator();
- }
-
- var viewMenu = this.addMenu('', mxResources.get('zoom') + ' (Alt+Mousewheel)', true, 'viewZoom', null, true);
- viewMenu.showDisabled = true;
- viewMenu.style.whiteSpace = 'nowrap';
- viewMenu.style.position = 'relative';
- viewMenu.style.overflow = 'hidden';
-
- if (EditorUi.compactUi)
- {
- viewMenu.style.width = (mxClient.IS_QUIRKS) ? '58px' : '50px';
- }
- else
- {
- viewMenu.style.width = (mxClient.IS_QUIRKS) ? '62px' : '36px';
- }
-
- if (sw >= 420)
- {
- this.addSeparator();
- var elts = this.addItems(['zoomIn', 'zoomOut']);
- elts[0].setAttribute('title', mxResources.get('zoomIn') + ' (' + this.editorUi.actions.get('zoomIn').shortcut + ')');
- elts[1].setAttribute('title', mxResources.get('zoomOut') + ' (' + this.editorUi.actions.get('zoomOut').shortcut + ')');
- }
-
- // Updates the label if the scale changes
- this.updateZoom = mxUtils.bind(this, function()
- {
- viewMenu.innerHTML = Math.round(this.editorUi.editor.graph.view.scale * 100) + '%' +
- this.dropdownImageHtml;
-
- if (EditorUi.compactUi)
- {
- viewMenu.getElementsByTagName('img')[0].style.right = '1px';
- viewMenu.getElementsByTagName('img')[0].style.top = '5px';
- }
- });
-
- this.editorUi.editor.graph.view.addListener(mxEvent.EVENT_SCALE, this.updateZoom);
- this.editorUi.editor.addListener('resetGraphView', this.updateZoom);
-
- var elts = this.addItems(['-', 'undo', 'redo']);
- elts[1].setAttribute('title', mxResources.get('undo') + ' (' + this.editorUi.actions.get('undo').shortcut + ')');
- elts[2].setAttribute('title', mxResources.get('redo') + ' (' + this.editorUi.actions.get('redo').shortcut + ')');
-
- if (sw >= 320)
- {
- var elts = this.addItems(['-', 'delete']);
- elts[1].setAttribute('title', mxResources.get('delete') + ' (' + this.editorUi.actions.get('delete').shortcut + ')');
- }
-
- if (sw >= 550)
- {
- this.addItems(['-', 'toFront', 'toBack']);
- }
-
- if (sw >= 740)
- {
- this.addItems(['-', 'fillColor']);
-
- if (sw >= 780)
- {
- this.addItems(['strokeColor']);
-
- if (sw >= 820)
- {
- this.addItems(['shadow']);
- }
- }
- }
-
- if (sw >= 400)
- {
- this.addSeparator();
-
- if (sw >= 440)
- {
- this.edgeShapeMenu = this.addMenuFunction('', mxResources.get('connection'), false, mxUtils.bind(this, function(menu)
- {
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_SHAPE, 'width'], [null, null], 'geIcon geSprite geSprite-connection', null, true).setAttribute('title', mxResources.get('line'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_SHAPE, 'width'], ['link', null], 'geIcon geSprite geSprite-linkedge', null, true).setAttribute('title', mxResources.get('link'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_SHAPE, 'width'], ['flexArrow', null], 'geIcon geSprite geSprite-arrow', null, true).setAttribute('title', mxResources.get('arrow'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_SHAPE, 'width'], ['arrow', null], 'geIcon geSprite geSprite-simplearrow', null, true).setAttribute('title', mxResources.get('simpleArrow'));
- }));
-
- this.addDropDownArrow(this.edgeShapeMenu, 'geSprite-connection', 44, 50, 0, 0, 22, -4);
- }
-
- this.edgeStyleMenu = this.addMenuFunction('geSprite-orthogonal', mxResources.get('waypoints'), false, mxUtils.bind(this, function(menu)
- {
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], [null, null, null], 'geIcon geSprite geSprite-straight', null, true).setAttribute('title', mxResources.get('straight'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', null, null], 'geIcon geSprite geSprite-orthogonal', null, true).setAttribute('title', mxResources.get('orthogonal'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalelbow', null, true).setAttribute('title', mxResources.get('simple'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalelbow', null, true).setAttribute('title', mxResources.get('simple'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalisometric', null, true).setAttribute('title', mxResources.get('isometric'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalisometric', null, true).setAttribute('title', mxResources.get('isometric'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', '1', null], 'geIcon geSprite geSprite-curved', null, true).setAttribute('title', mxResources.get('curved'));
- this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['entityRelationEdgeStyle', null, null], 'geIcon geSprite geSprite-entity', null, true).setAttribute('title', mxResources.get('entityRelation'));
- }));
-
- this.addDropDownArrow(this.edgeStyleMenu, 'geSprite-orthogonal', 44, 50, 0, 0, 22, -4);
- }
-
- this.addSeparator();
- var insertMenu = this.addMenu('', mxResources.get('insert') + ' (' + mxResources.get('doubleClickTooltip') + ')', true, 'insert', null, true);
- this.addDropDownArrow(insertMenu, 'geSprite-plus', 38, 48, -4, -3, 36, -8);
- this.addTableDropDown();
-};
-
-/**
- * Adds the toolbar elements.
- */
-Toolbar.prototype.addTableDropDown = function()
-{
- this.addSeparator();
-
- // KNOWN: All table stuff does not work with undo/redo
- // KNOWN: Lost focus after click on submenu with text (not icon) in quirks and IE8. This is because the TD seems
- // to catch the focus on click in these browsers. NOTE: Workaround in mxPopupMenu for icon items (without text).
- var menuElt = this.addMenuFunction('geIcon geSprite geSprite-table', mxResources.get('table'), false, mxUtils.bind(this, function(menu)
- {
- var graph = this.editorUi.editor.graph;
- var cell = graph.getSelectionCell();
-
- if (!graph.isTableCell(cell) && !graph.isTableRow(cell) && !graph.isTable(cell))
- {
- this.editorUi.menus.addInsertTableCellItem(menu);
- }
- else
- {
- var elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.insertTableColumn(cell, true);
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-insertcolumnbefore');
- elt.setAttribute('title', mxResources.get('insertColumnBefore'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.insertTableColumn(cell, false);
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-insertcolumnafter');
- elt.setAttribute('title', mxResources.get('insertColumnAfter'));
-
- elt = menu.addItem('Delete column', null, mxUtils.bind(this, function()
- {
- if (cell != null)
- {
- try
- {
- graph.deleteTableColumn(cell);
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }
- }), null, 'geIcon geSprite geSprite-deletecolumn');
- elt.setAttribute('title', mxResources.get('deleteColumn'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.insertTableRow(cell, true);
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-insertrowbefore');
- elt.setAttribute('title', mxResources.get('insertRowBefore'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.insertTableRow(cell, false);
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-insertrowafter');
- elt.setAttribute('title', mxResources.get('insertRowAfter'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.deleteTableRow(cell);
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-deleterow');
- elt.setAttribute('title', mxResources.get('deleteRow'));
- }
- }));
-
- menuElt.style.position = 'relative';
- menuElt.style.whiteSpace = 'nowrap';
- menuElt.style.overflow = 'hidden';
- menuElt.innerHTML = '<div class="geSprite geSprite-table" style="margin-left:-2px;"></div>' + this.dropdownImageHtml;
- menuElt.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px';
-
- // Fix for item size in kennedy theme
- if (EditorUi.compactUi)
- {
- menuElt.getElementsByTagName('img')[0].style.left = '22px';
- menuElt.getElementsByTagName('img')[0].style.top = '5px';
- }
-
- // Connects to insert menu enabled state
- var menu = this.editorUi.menus.get('insert');
-
- // Workaround for possible not a function
- // when extending HTML objects
- if (menu != null && typeof menuElt.setEnabled === 'function')
- {
- menu.addListener('stateChanged', function()
- {
- menuElt.setEnabled(menu.enabled);
- });
- }
-
- return menuElt;
-};
-
-/**
- * Adds the toolbar elements.
- */
-Toolbar.prototype.addDropDownArrow = function(menu, sprite, width, atlasWidth, left, top, atlasDelta, atlasLeft)
-{
- atlasDelta = (atlasDelta != null) ? atlasDelta : 32;
- left = (EditorUi.compactUi) ? left : atlasLeft;
-
- menu.style.whiteSpace = 'nowrap';
- menu.style.overflow = 'hidden';
- menu.style.position = 'relative';
- menu.innerHTML = '<div class="geSprite ' + sprite + '" style="margin-left:' + left + 'px;margin-top:' + top + 'px;"></div>' +
- this.dropdownImageHtml;
- menu.style.width = (mxClient.IS_QUIRKS) ? atlasWidth + 'px' : (atlasWidth - atlasDelta) + 'px';
-
- if (mxClient.IS_QUIRKS)
- {
- menu.style.height = (EditorUi.compactUi) ? '24px' : '26px';
- }
-
- // Fix for item size in kennedy theme
- if (EditorUi.compactUi)
- {
- menu.getElementsByTagName('img')[0].style.left = '24px';
- menu.getElementsByTagName('img')[0].style.top = '5px';
- menu.style.width = (mxClient.IS_QUIRKS) ? width + 'px' : (width - 10) + 'px';
- }
-};
-
-/**
- * Sets the current font name.
- */
-Toolbar.prototype.setFontName = function(value)
-{
- if (this.fontMenu != null)
- {
- this.fontMenu.innerHTML = '<div style="width:60px;overflow:hidden;display:inline-block;">' +
- mxUtils.htmlEntities(value) + '</div>' + this.dropdownImageHtml;
- }
-};
-
-/**
- * Sets the current font name.
- */
-Toolbar.prototype.setFontSize = function(value)
-{
- if (this.sizeMenu != null)
- {
- this.sizeMenu.innerHTML = '<div style="width:24px;overflow:hidden;display:inline-block;">' +
- mxUtils.htmlEntities(value) + '</div>' + this.dropdownImageHtml;
- }
-};
-
-/**
- * Hides the current menu.
- */
-Toolbar.prototype.createTextToolbar = function()
-{
- var graph = this.editorUi.editor.graph;
-
- var styleElt = this.addMenu('', mxResources.get('style'), true, 'formatBlock');
- styleElt.style.position = 'relative';
- styleElt.style.whiteSpace = 'nowrap';
- styleElt.style.overflow = 'hidden';
- styleElt.innerHTML = mxResources.get('style') + this.dropdownImageHtml;
-
- if (EditorUi.compactUi)
- {
- styleElt.style.paddingRight = '18px';
- styleElt.getElementsByTagName('img')[0].style.right = '1px';
- styleElt.getElementsByTagName('img')[0].style.top = '5px';
- }
-
- this.addSeparator();
-
- this.fontMenu = this.addMenu('', mxResources.get('fontFamily'), true, 'fontFamily');
- this.fontMenu.style.position = 'relative';
- this.fontMenu.style.whiteSpace = 'nowrap';
- this.fontMenu.style.overflow = 'hidden';
- this.fontMenu.style.width = (mxClient.IS_QUIRKS) ? '80px' : '60px';
-
- this.setFontName(Menus.prototype.defaultFont);
-
- if (EditorUi.compactUi)
- {
- this.fontMenu.style.paddingRight = '18px';
- this.fontMenu.getElementsByTagName('img')[0].style.right = '1px';
- this.fontMenu.getElementsByTagName('img')[0].style.top = '5px';
- }
-
- this.addSeparator();
-
- this.sizeMenu = this.addMenu(Menus.prototype.defaultFontSize, mxResources.get('fontSize'), true, 'fontSize');
- this.sizeMenu.style.position = 'relative';
- this.sizeMenu.style.whiteSpace = 'nowrap';
- this.sizeMenu.style.overflow = 'hidden';
- this.sizeMenu.style.width = (mxClient.IS_QUIRKS) ? '44px' : '24px';
-
- this.setFontSize(Menus.prototype.defaultFontSize);
-
- if (EditorUi.compactUi)
- {
- this.sizeMenu.style.paddingRight = '18px';
- this.sizeMenu.getElementsByTagName('img')[0].style.right = '1px';
- this.sizeMenu.getElementsByTagName('img')[0].style.top = '5px';
- }
-
- var elts = this.addItems(['-', 'undo', 'redo','-', 'bold', 'italic', 'underline']);
- elts[1].setAttribute('title', mxResources.get('undo') + ' (' + this.editorUi.actions.get('undo').shortcut + ')');
- elts[2].setAttribute('title', mxResources.get('redo') + ' (' + this.editorUi.actions.get('redo').shortcut + ')');
- elts[4].setAttribute('title', mxResources.get('bold') + ' (' + this.editorUi.actions.get('bold').shortcut + ')');
- elts[5].setAttribute('title', mxResources.get('italic') + ' (' + this.editorUi.actions.get('italic').shortcut + ')');
- elts[6].setAttribute('title', mxResources.get('underline') + ' (' + this.editorUi.actions.get('underline').shortcut + ')');
-
- // KNOWN: Lost focus after click on submenu with text (not icon) in quirks and IE8. This is because the TD seems
- // to catch the focus on click in these browsers. NOTE: Workaround in mxPopupMenu for icon items (without text).
- var alignMenu = this.addMenuFunction('', mxResources.get('align'), false, mxUtils.bind(this, function(menu)
- {
- elt = menu.addItem('', null, mxUtils.bind(this, function(evt)
- {
- graph.cellEditor.alignText(mxConstants.ALIGN_LEFT, evt);
- }), null, 'geIcon geSprite geSprite-left');
- elt.setAttribute('title', mxResources.get('left'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function(evt)
- {
- graph.cellEditor.alignText(mxConstants.ALIGN_CENTER, evt);
- }), null, 'geIcon geSprite geSprite-center');
- elt.setAttribute('title', mxResources.get('center'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function(evt)
- {
- graph.cellEditor.alignText(mxConstants.ALIGN_RIGHT, evt);
- }), null, 'geIcon geSprite geSprite-right');
- elt.setAttribute('title', mxResources.get('right'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- document.execCommand('justifyfull', false, null);
- }), null, 'geIcon geSprite geSprite-justifyfull');
- elt.setAttribute('title', mxResources.get('justifyfull'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- document.execCommand('insertorderedlist', false, null);
- }), null, 'geIcon geSprite geSprite-orderedlist');
- elt.setAttribute('title', mxResources.get('numberedList'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- document.execCommand('insertunorderedlist', false, null);
- }), null, 'geIcon geSprite geSprite-unorderedlist');
- elt.setAttribute('title', mxResources.get('bulletedList'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- document.execCommand('outdent', false, null);
- }), null, 'geIcon geSprite geSprite-outdent');
- elt.setAttribute('title', mxResources.get('decreaseIndent'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- document.execCommand('indent', false, null);
- }), null, 'geIcon geSprite geSprite-indent');
- elt.setAttribute('title', mxResources.get('increaseIndent'));
- }));
-
- alignMenu.style.position = 'relative';
- alignMenu.style.whiteSpace = 'nowrap';
- alignMenu.style.overflow = 'hidden';
- alignMenu.innerHTML = '<div class="geSprite geSprite-left" style="margin-left:-2px;"></div>' + this.dropdownImageHtml;
- alignMenu.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px';
-
- if (EditorUi.compactUi)
- {
- alignMenu.getElementsByTagName('img')[0].style.left = '22px';
- alignMenu.getElementsByTagName('img')[0].style.top = '5px';
- }
-
- var formatMenu = this.addMenuFunction('', mxResources.get('format'), false, mxUtils.bind(this, function(menu)
- {
- elt = menu.addItem('', null, this.editorUi.actions.get('subscript').funct,
- null, 'geIcon geSprite geSprite-subscript');
- elt.setAttribute('title', mxResources.get('subscript') + ' (' + Editor.ctrlKey + '+,)');
-
- elt = menu.addItem('', null, this.editorUi.actions.get('superscript').funct,
- null, 'geIcon geSprite geSprite-superscript');
- elt.setAttribute('title', mxResources.get('superscript') + ' (' + Editor.ctrlKey + '+.)');
-
- // KNOWN: IE+FF don't return keyboard focus after color dialog (calling focus doesn't help)
- elt = menu.addItem('', null, this.editorUi.actions.get('fontColor').funct,
- null, 'geIcon geSprite geSprite-fontcolor');
- elt.setAttribute('title', mxResources.get('fontColor'));
-
- elt = menu.addItem('', null, this.editorUi.actions.get('backgroundColor').funct,
- null, 'geIcon geSprite geSprite-fontbackground');
- elt.setAttribute('title', mxResources.get('backgroundColor'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- document.execCommand('removeformat', false, null);
- }), null, 'geIcon geSprite geSprite-removeformat');
- elt.setAttribute('title', mxResources.get('removeFormat'));
- }));
-
- formatMenu.style.position = 'relative';
- formatMenu.style.whiteSpace = 'nowrap';
- formatMenu.style.overflow = 'hidden';
- formatMenu.innerHTML = '<div class="geSprite geSprite-dots" style="margin-left:-2px;"></div>' +
- this.dropdownImageHtml;
- formatMenu.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px';
-
- if (EditorUi.compactUi)
- {
- formatMenu.getElementsByTagName('img')[0].style.left = '22px';
- formatMenu.getElementsByTagName('img')[0].style.top = '5px';
- }
-
- this.addSeparator();
-
- this.addButton('geIcon geSprite geSprite-code', mxResources.get('html'), function()
- {
- graph.cellEditor.toggleViewMode();
-
- if (graph.cellEditor.textarea.innerHTML.length > 0 && (graph.cellEditor.textarea.innerHTML != '&nbsp;' || !graph.cellEditor.clearOnChange))
- {
- window.setTimeout(function()
- {
- document.execCommand('selectAll', false, null);
- });
- }
- });
-
- this.addSeparator();
-
- var insertMenu = this.addMenuFunction('', mxResources.get('insert'), true, mxUtils.bind(this, function(menu)
- {
- menu.addItem(mxResources.get('insertLink'), null, mxUtils.bind(this, function()
- {
- this.editorUi.actions.get('link').funct();
- }));
-
- menu.addItem(mxResources.get('insertImage'), null, mxUtils.bind(this, function()
- {
- this.editorUi.actions.get('image').funct();
- }));
-
- menu.addItem(mxResources.get('insertHorizontalRule'), null, mxUtils.bind(this, function()
- {
- document.execCommand('inserthorizontalrule', false, null);
- }));
- }));
-
- insertMenu.style.whiteSpace = 'nowrap';
- insertMenu.style.overflow = 'hidden';
- insertMenu.style.position = 'relative';
- insertMenu.innerHTML = '<div class="geSprite geSprite-plus" style="margin-left:-4px;margin-top:-3px;"></div>' +
- this.dropdownImageHtml;
- insertMenu.style.width = (mxClient.IS_QUIRKS) ? '36px' : '16px';
-
- // Fix for item size in kennedy theme
- if (EditorUi.compactUi)
- {
- insertMenu.getElementsByTagName('img')[0].style.left = '24px';
- insertMenu.getElementsByTagName('img')[0].style.top = '5px';
- insertMenu.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px';
- }
-
- this.addSeparator();
-
- // KNOWN: All table stuff does not work with undo/redo
- // KNOWN: Lost focus after click on submenu with text (not icon) in quirks and IE8. This is because the TD seems
- // to catch the focus on click in these browsers. NOTE: Workaround in mxPopupMenu for icon items (without text).
- var elt = this.addMenuFunction('geIcon geSprite geSprite-table', mxResources.get('table'), false, mxUtils.bind(this, function(menu)
- {
- var elt = graph.getSelectedElement();
- var cell = graph.getParentByNames(elt, ['TD', 'TH'], graph.cellEditor.text2);
- var row = graph.getParentByName(elt, 'TR', graph.cellEditor.text2);
-
- if (row == null)
- {
- function createTable(rows, cols)
- {
- var html = ['<table>'];
-
- for (var i = 0; i < rows; i++)
- {
- html.push('<tr>');
-
- for (var j = 0; j < cols; j++)
- {
- html.push('<td><br></td>');
- }
-
- html.push('</tr>');
- }
-
- html.push('</table>');
-
- return html.join('');
- };
-
- this.editorUi.menus.addInsertTableItem(menu);
- }
- else
- {
- var table = graph.getParentByName(row, 'TABLE', graph.cellEditor.text2);
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.selectNode(graph.insertColumn(table, (cell != null) ? cell.cellIndex : 0));
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-insertcolumnbefore');
- elt.setAttribute('title', mxResources.get('insertColumnBefore'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.selectNode(graph.insertColumn(table, (cell != null) ? cell.cellIndex + 1 : -1));
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-insertcolumnafter');
- elt.setAttribute('title', mxResources.get('insertColumnAfter'));
-
- elt = menu.addItem('Delete column', null, mxUtils.bind(this, function()
- {
- if (cell != null)
- {
- try
- {
- graph.deleteColumn(table, cell.cellIndex);
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }
- }), null, 'geIcon geSprite geSprite-deletecolumn');
- elt.setAttribute('title', mxResources.get('deleteColumn'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.selectNode(graph.insertRow(table, row.sectionRowIndex));
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-insertrowbefore');
- elt.setAttribute('title', mxResources.get('insertRowBefore'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.selectNode(graph.insertRow(table, row.sectionRowIndex + 1));
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-insertrowafter');
- elt.setAttribute('title', mxResources.get('insertRowAfter'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- try
- {
- graph.deleteRow(table, row.sectionRowIndex);
- }
- catch (e)
- {
- this.editorUi.handleError(e);
- }
- }), null, 'geIcon geSprite geSprite-deleterow');
- elt.setAttribute('title', mxResources.get('deleteRow'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- // Converts rgb(r,g,b) values
- var color = table.style.borderColor.replace(
- /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,
- function($0, $1, $2, $3) {
- return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2);
- });
- this.editorUi.pickColor(color, function(newColor)
- {
- if (newColor == null || newColor == mxConstants.NONE)
- {
- table.removeAttribute('border');
- table.style.border = '';
- table.style.borderCollapse = '';
- }
- else
- {
- table.setAttribute('border', '1');
- table.style.border = '1px solid ' + newColor;
- table.style.borderCollapse = 'collapse';
- }
- });
- }), null, 'geIcon geSprite geSprite-strokecolor');
- elt.setAttribute('title', mxResources.get('borderColor'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- // Converts rgb(r,g,b) values
- var color = table.style.backgroundColor.replace(
- /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,
- function($0, $1, $2, $3) {
- return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2);
- });
- this.editorUi.pickColor(color, function(newColor)
- {
- if (newColor == null || newColor == mxConstants.NONE)
- {
- table.style.backgroundColor = '';
- }
- else
- {
- table.style.backgroundColor = newColor;
- }
- });
- }), null, 'geIcon geSprite geSprite-fillcolor');
- elt.setAttribute('title', mxResources.get('backgroundColor'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- var value = table.getAttribute('cellPadding') || 0;
-
- var dlg = new FilenameDialog(this.editorUi, value, mxResources.get('apply'), mxUtils.bind(this, function(newValue)
- {
- if (newValue != null && newValue.length > 0)
- {
- table.setAttribute('cellPadding', newValue);
- }
- else
- {
- table.removeAttribute('cellPadding');
- }
- }), mxResources.get('spacing'));
- this.editorUi.showDialog(dlg.container, 300, 80, true, true);
- dlg.init();
- }), null, 'geIcon geSprite geSprite-fit');
- elt.setAttribute('title', mxResources.get('spacing'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- table.setAttribute('align', 'left');
- }), null, 'geIcon geSprite geSprite-left');
- elt.setAttribute('title', mxResources.get('left'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- table.setAttribute('align', 'center');
- }), null, 'geIcon geSprite geSprite-center');
- elt.setAttribute('title', mxResources.get('center'));
-
- elt = menu.addItem('', null, mxUtils.bind(this, function()
- {
- table.setAttribute('align', 'right');
- }), null, 'geIcon geSprite geSprite-right');
- elt.setAttribute('title', mxResources.get('right'));
- }
- }));
-
- elt.style.position = 'relative';
- elt.style.whiteSpace = 'nowrap';
- elt.style.overflow = 'hidden';
- elt.innerHTML = '<div class="geSprite geSprite-table" style="margin-left:-2px;"></div>' + this.dropdownImageHtml;
- elt.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px';
-
- // Fix for item size in kennedy theme
- if (EditorUi.compactUi)
- {
- elt.getElementsByTagName('img')[0].style.left = '22px';
- elt.getElementsByTagName('img')[0].style.top = '5px';
- }
-};
-
-/**
- * Hides the current menu.
- */
-Toolbar.prototype.hideMenu = function()
-{
- this.editorUi.hideCurrentMenu();
-};
-
-/**
- * Adds a label to the toolbar.
- */
-Toolbar.prototype.addMenu = function(label, tooltip, showLabels, name, c, showAll, ignoreState)
-{
- var menu = this.editorUi.menus.get(name);
- var elt = this.addMenuFunction(label, tooltip, showLabels, function()
- {
- menu.funct.apply(menu, arguments);
- }, c, showAll);
-
- // Workaround for possible not a function
- // when extending HTML objects
- if (!ignoreState && typeof elt.setEnabled === 'function')
- {
- menu.addListener('stateChanged', function()
- {
- elt.setEnabled(menu.enabled);
- });
- }
-
- return elt;
-};
-
-/**
- * Adds a label to the toolbar.
- */
-Toolbar.prototype.addMenuFunction = function(label, tooltip, showLabels, funct, c, showAll)
-{
- return this.addMenuFunctionInContainer((c != null) ? c : this.container, label, tooltip, showLabels, funct, showAll);
-};
-
-/**
- * Adds a label to the toolbar.
- */
-Toolbar.prototype.addMenuFunctionInContainer = function(container, label, tooltip, showLabels, funct, showAll)
-{
- var elt = (showLabels) ? this.createLabel(label) : this.createButton(label);
- this.initElement(elt, tooltip);
- this.addMenuHandler(elt, showLabels, funct, showAll);
- container.appendChild(elt);
-
- return elt;
-};
-
-/**
- * Adds a separator to the separator.
- */
-Toolbar.prototype.addSeparator = function(c)
-{
- c = (c != null) ? c : this.container;
- var elt = document.createElement('div');
- elt.className = 'geSeparator';
- c.appendChild(elt);
-
- return elt;
-};
-
-/**
- * Adds given action item
- */
-Toolbar.prototype.addItems = function(keys, c, ignoreDisabled)
-{
- var items = [];
-
- for (var i = 0; i < keys.length; i++)
- {
- var key = keys[i];
-
- if (key == '-')
- {
- items.push(this.addSeparator(c));
- }
- else
- {
- items.push(this.addItem('geSprite-' + key.toLowerCase(), key, c, ignoreDisabled));
- }
- }
-
- return items;
-};
-
-/**
- * Adds given action item
- */
-Toolbar.prototype.addItem = function(sprite, key, c, ignoreDisabled)
-{
- var action = this.editorUi.actions.get(key);
- var elt = null;
-
- if (action != null)
- {
- var tooltip = action.label;
-
- if (action.shortcut != null)
- {
- tooltip += ' (' + action.shortcut + ')';
- }
-
- elt = this.addButton(sprite, tooltip, action.funct, c);
-
- // Workaround for possible not a function
- // when extending HTML objects
- if (!ignoreDisabled && typeof elt.setEnabled === 'function')
- {
- elt.setEnabled(action.enabled);
-
- action.addListener('stateChanged', function()
- {
- elt.setEnabled(action.enabled);
- });
- }
- }
-
- return elt;
-};
-
-/**
- * Adds a button to the toolbar.
- */
-Toolbar.prototype.addButton = function(classname, tooltip, funct, c)
-{
- var elt = this.createButton(classname);
- c = (c != null) ? c : this.container;
-
- this.initElement(elt, tooltip);
- this.addClickHandler(elt, funct);
- c.appendChild(elt);
-
- return elt;
-};
-
-/**
- * Initializes the given toolbar element.
- */
-Toolbar.prototype.initElement = function(elt, tooltip)
-{
- // Adds tooltip
- if (tooltip != null)
- {
- elt.setAttribute('title', tooltip);
- }
-
- this.addEnabledState(elt);
-};
-
-/**
- * Adds enabled state with setter to DOM node (avoids JS wrapper).
- */
-Toolbar.prototype.addEnabledState = function(elt)
-{
- var classname = elt.className;
-
- elt.setEnabled = function(value)
- {
- elt.enabled = value;
-
- if (value)
- {
- elt.className = classname;
- }
- else
- {
- elt.className = classname + ' mxDisabled';
- }
- };
-
- elt.setEnabled(true);
-};
-
-/**
- * Adds enabled state with setter to DOM node (avoids JS wrapper).
- */
-Toolbar.prototype.addClickHandler = function(elt, funct)
-{
- if (funct != null)
- {
- mxEvent.addListener(elt, 'click', function(evt)
- {
- if (elt.enabled)
- {
- funct(evt);
- }
-
- mxEvent.consume(evt);
- });
-
- // Prevents focus
- mxEvent.addListener(elt, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown',
- mxUtils.bind(this, function(evt)
- {
- evt.preventDefault();
- }));
- }
-};
-
-/**
- * Creates and returns a new button.
- */
-Toolbar.prototype.createButton = function(classname)
-{
- var elt = document.createElement('a');
- elt.className = 'geButton';
-
- var inner = document.createElement('div');
-
- if (classname != null)
- {
- inner.className = 'geSprite ' + classname;
- }
-
- elt.appendChild(inner);
-
- return elt;
-};
-
-/**
- * Creates and returns a new button.
- */
-Toolbar.prototype.createLabel = function(label, tooltip)
-{
- var elt = document.createElement('a');
- elt.className = 'geLabel';
- mxUtils.write(elt, label);
-
- return elt;
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Toolbar.prototype.addMenuHandler = function(elt, showLabels, funct, showAll)
-{
- if (funct != null)
- {
- var graph = this.editorUi.editor.graph;
- var menu = null;
- var show = true;
-
- mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt)
- {
- if (show && (elt.enabled == null || elt.enabled))
- {
- graph.popupMenuHandler.hideMenu();
- menu = new mxPopupMenu(funct);
- menu.div.className += ' geToolbarMenu';
- menu.showDisabled = showAll;
- menu.labels = showLabels;
- menu.autoExpand = true;
-
- var offset = mxUtils.getOffset(elt);
- menu.popup(offset.x, offset.y + elt.offsetHeight, null, evt);
- this.editorUi.setCurrentMenu(menu, elt);
-
- // Workaround for scrollbar hiding menu items
- if (!showLabels && menu.div.scrollHeight > menu.div.clientHeight)
- {
- menu.div.style.width = '40px';
- }
-
- menu.hideMenu = mxUtils.bind(this, function()
- {
- mxPopupMenu.prototype.hideMenu.apply(menu, arguments);
- this.editorUi.resetCurrentMenu();
- menu.destroy();
- });
-
- // Extends destroy to reset global state
- menu.addListener(mxEvent.EVENT_HIDE, mxUtils.bind(this, function()
- {
- this.currentElt = null;
- }));
- }
-
- show = true;
- mxEvent.consume(evt);
- }));
-
- // Hides menu if already showing and prevents focus
- mxEvent.addListener(elt, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown',
- mxUtils.bind(this, function(evt)
- {
- show = this.currentElt != elt;
- evt.preventDefault();
- }));
- }
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Toolbar.prototype.destroy = function()
-{
- if (this.gestureHandler != null)
- {
- mxEvent.removeGestureListeners(document, this.gestureHandler);
- this.gestureHandler = null;
- }
-};
diff --git a/src/main/webapp/js/orgchart/mxOrgChart.js b/src/main/webapp/js/orgchart/mxOrgChart.js
deleted file mode 100644
index 47fbb075..00000000
--- a/src/main/webapp/js/orgchart/mxOrgChart.js
+++ /dev/null
@@ -1,568 +0,0 @@
-function mxOrgChart(editorUi)
-{
- Bridge.define('ChartApp',
- {
- statics: {
- config: {
- init: function() {
-
- }
- },
- main: function (editorUi) {
- Bridge.Console.log = console.log;
- Bridge.Console.error = console.error;
- Bridge.Console.debug = console.debug;
-
- ChartApp.editorUi = editorUi;
- ChartApp.buildChart(true);
- },
-
- diagram: {},
- dataSource: {},
- //suppressRootBox: false,
- //totalBoxCount: 20,
- //percentAssistants: 10,
-
- /*boxClick: function(boxId) {
- var box = ChartApp.diagram.getBoxes().getBoxesById().getItem(boxId);
- box.IsCollapsed = !box.IsCollapsed;
- ChartApp.positionBoxes();
- },*/
-
- buildChart: function (initData) {
- if (initData) {
- ChartApp.initDiagram();
- }
- ChartApp.positionBoxes();
- },
-
- collapseAllBoxes: function(boxContainer, isCollapsed) {
- var en = boxContainer.getBoxesById().getValues().getEnumerator();
- while (en.moveNext()) {
- var box = en.getCurrent();
- if (!box.IsSpecial) {
- box.IsCollapsed = isCollapsed;
- }
- }
- },
-
- generateData: function () {
-
-
- /*var count = ChartApp.totalBoxCount;
- var percentAssistants = ChartApp.percentAssistants;
-
- var dataSource = new OrgChart.Test.TestDataSource();
- (new OrgChart.Test.TestDataGen()).GenerateDataItems(dataSource, count, percentAssistants);
-
- if (ChartApp.suppressRootBox) {
- dataSource.Items.remove('0');
- var en = dataSource.Items.getValues().getEnumerator();
- while (en.moveNext()) {
- var dataItem = en.getCurrent();
- if (dataItem.ParentId === "0") {
- dataItem.ParentId = null;
- }
- }
- }*/
-
- var dataSource = new OrgChart.Test.TestDataSource();
-
- var graph = ChartApp.editorUi.editor.graph;
- var cells = graph.model.cells;
- var defParent = graph.getDefaultParent();
- //var dataSource = {"Items": {"comparer": {}, "entries": {}}};
-
- for (var id in cells)
- {
- var cell = cells[id];
-
- if (cell.geometry != null && cell.vertex && cell.parent == defParent) //TODO First level only?
- {
- // Find cell parent. If it has more than one parent, take first parent (should be an error?)
- var parentId = null;
-
- var incomingEdge = graph.getIncomingEdges(cell)[0];
-
- if (incomingEdge != null && incomingEdge.source != null)
- {
- parentId = incomingEdge.source.id;
- }
-
- var item = new OrgChart.Test.TestDataItem();
- item.Id = id;
- item.ParentId = parentId;
- dataSource.Items.add(item.getId(), item);
-// dataSource.Items.entries[id] = [{
-// "key": id,
-// "value": {
-// "Id": id
-// },
-// "ParentId": parentId
-// }];
- }
- }
-
- return dataSource;
- },
-
- initDiagram: function () {
- // $("#myDiagramDiv").html('');
- // $("#myDiagramDiv").append('<div id="myConnectors" class="chartConnectorsPlane"/>')
-
- var dataSource = ChartApp.generateData();
-
- ChartApp.dataSource = dataSource;
-
- var boxContainer = new OrgChart.Layout.BoxContainer.$ctor1(dataSource);
- //OrgChart.Test.TestDataGen.GenerateBoxSizes(boxContainer);
-
- /* if ($("#CollapseAllOnRebuild")[0].checked) {
- ChartApp.collapseAllBoxes(boxContainer, true);
- }*/
-
- ChartApp.diagram = new OrgChart.Layout.Diagram();
-
- var diagram = ChartApp.diagram;
- diagram.setBoxes(boxContainer);
-
- var linearLayoutStrategy = new OrgChart.Layout.LinearLayoutStrategy();
- linearLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.Center;
- diagram.LayoutSettings.LayoutStrategies.add("linear", linearLayoutStrategy);
-
- var multiLineHangerLayoutStrategy = new OrgChart.Layout.MultiLineHangerLayoutStrategy();
- multiLineHangerLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.Center;
- multiLineHangerLayoutStrategy.MaxSiblingsPerRow = 2;
- diagram.LayoutSettings.LayoutStrategies.add("hanger2", multiLineHangerLayoutStrategy);
-
- multiLineHangerLayoutStrategy = new OrgChart.Layout.MultiLineHangerLayoutStrategy();
- multiLineHangerLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.Center;
- multiLineHangerLayoutStrategy.MaxSiblingsPerRow = 4;
- diagram.LayoutSettings.LayoutStrategies.add("hanger4", multiLineHangerLayoutStrategy);
-
- var singleColumnLayoutStrategy = new OrgChart.Layout.SingleColumnLayoutStrategy();
- singleColumnLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.Right;
- diagram.LayoutSettings.LayoutStrategies.add("singleColumnRight", singleColumnLayoutStrategy);
-
- singleColumnLayoutStrategy = new OrgChart.Layout.SingleColumnLayoutStrategy();
- singleColumnLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.Left;
- diagram.LayoutSettings.LayoutStrategies.add("singleColumnLeft", singleColumnLayoutStrategy);
-
- var fishboneLayoutStrategy = new OrgChart.Layout.MultiLineFishboneLayoutStrategy();
- fishboneLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.Center;
- fishboneLayoutStrategy.MaxGroups = 1;
- diagram.LayoutSettings.LayoutStrategies.add("fishbone1", fishboneLayoutStrategy);
-
- fishboneLayoutStrategy = new OrgChart.Layout.MultiLineFishboneLayoutStrategy();
- fishboneLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.Center;
- fishboneLayoutStrategy.MaxGroups = 2;
- diagram.LayoutSettings.LayoutStrategies.add("fishbone2", fishboneLayoutStrategy);
-
- var hstackLayoutStrategy = new OrgChart.Layout.StackingLayoutStrategy();
- hstackLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.InvalidValue;
- hstackLayoutStrategy.Orientation = OrgChart.Layout.StackOrientation.SingleRowHorizontal;
- hstackLayoutStrategy.ParentChildSpacing = 10;
- diagram.LayoutSettings.LayoutStrategies.add("hstack", hstackLayoutStrategy);
-
- var vstackLayoutStrategy = new OrgChart.Layout.StackingLayoutStrategy();
- vstackLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.InvalidValue;
- vstackLayoutStrategy.Orientation = OrgChart.Layout.StackOrientation.SingleColumnVertical;
- vstackLayoutStrategy.ParentChildSpacing = 10;
- diagram.LayoutSettings.LayoutStrategies.add("vstack", vstackLayoutStrategy);
-
- vstackLayoutStrategy = new OrgChart.Layout.StackingLayoutStrategy();
- vstackLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.InvalidValue;
- vstackLayoutStrategy.Orientation = OrgChart.Layout.StackOrientation.SingleColumnVertical;
- vstackLayoutStrategy.SiblingSpacing = 20;
- diagram.LayoutSettings.LayoutStrategies.add("vstackMiddle", vstackLayoutStrategy);
-
- vstackLayoutStrategy = new OrgChart.Layout.StackingLayoutStrategy();
- vstackLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.InvalidValue;
- vstackLayoutStrategy.Orientation = OrgChart.Layout.StackOrientation.SingleColumnVertical;
- vstackLayoutStrategy.SiblingSpacing = 50;
- diagram.LayoutSettings.LayoutStrategies.add("vstackTop", vstackLayoutStrategy);
-
- var assistantsLayoutStrategy = new OrgChart.Layout.FishboneAssistantsLayoutStrategy();
- assistantsLayoutStrategy.ParentAlignment = OrgChart.Layout.BranchParentAlignment.Center;
- diagram.LayoutSettings.LayoutStrategies.add("assistants", assistantsLayoutStrategy);
-
- diagram.LayoutSettings.DefaultLayoutStrategyId = "vstack";
- diagram.LayoutSettings.DefaultAssistantLayoutStrategyId = "assistants";
- //diagram.LayoutSettings.setBranchSpacing(5);
- },
-
- getBoxLevel: function(boxContainer, box) {
- var level = 0;
- var obj = {};
- while (box.ParentId > 0) {
- if (!boxContainer.getBoxesById().tryGetValue(box.ParentId, obj)) {
- break;
- }
- box = obj.v;
- level++;
- }
-
- return level;
- },
-
- onLayoutStateChanged: function (sender, args) {
- if (args.State.getCurrentOperation() === OrgChart.Layout.LayoutState.Operation.PreprocessVisualTree) {
- // When layout algorithm is ready to preprocess the tree,
- // we need to have box sizes ready -> hence have to render visible boxes in HTML.
- // Rendering can happen at earlier time, but it's just more convenient to do it here,
- // to utilize some readily available information about visual tree.
- ChartApp.renderBoxes();
- }
- },
-
- renderBoxes: function () {
- //var boxContainer = ChartApp.diagram.getBoxes();
- //var dataSource = ChartApp.dataSource;
-
- //var expanderHtml = '<div id="exp{0}" class="expander" onclick="ChartApp.boxClick({0})">?</div>';
- //var boxHtml = '<div id="box{0}" class="{2}" style="width: 150px; height: auto;" onclick="ChartApp.boxClick({0})"><p><b>{3}</b></p>Box #{0}, Data #{1}, Asst: {4}</div>';
-
- var visitorFunc = function (node) {
- var box = node.Element;
-
- if (box.getIsDataBound()) {
- // we're being run when nodes have already been marked as visible or hidden,
- // based on IsCollapsed attribute of each Box
- // so use this knowledge to prevent unnecessary rendering of invisible branches
- /*var existing = $('#box' + box.Id);
- if (existing.length > 0) {
- var exp = $('#exp' + box.Id);
- if (node.State.IsHidden) {
- existing.hide();
- if (exp.length > 0) exp.hide();
- } else {
- existing.show();
- if (exp.length > 0) exp.show();
- }
- return true;
- } else */
- if (node.State.IsHidden) {
- return true;
- }
-
- //var level = ChartApp.getBoxLevel(boxContainer, box);
- //var dataItem = dataSource.GetDataItem(box.DataId);
-
- // level 0 is always for the BoxContainer.SystemRoot
- // normal boxes are under it, so they start at level 1
- /* if (level === 1) {
- $("#myDiagramDiv")
- .append(boxHtml.format(box.Id, box.DataId, "chartBoxTop", "Top", box.IsAssistant));
- } else if (level === 2) {
- $("#myDiagramDiv")
- .append(boxHtml.format(box.Id, box.DataId, "chartBoxMiddle", "Middle", box.IsAssistant));
- } else if (level === 3) {
- $("#myDiagramDiv")
- .append(boxHtml.format(box.Id, box.DataId, "chartBoxLower", "Lower", box.IsAssistant));
- } else {
- $("#myDiagramDiv")
- .append(boxHtml.format(box.Id, box.DataId, "chartBoxLowest", "Lowest ({0})".format(level), box.IsAssistant));
- }
-
- if (node.getChildCount() > 0 || node.AssistantsRoot != null) {
- $("#myDiagramDiv")
- .append(expanderHtml.format(box.Id));
- } */
-
- // now store element size, as rendered by browser
- box.Size = ChartApp.getBoxElementSize(box.DataId);
- }
-
- return true;
- }
-
- ChartApp.diagram.getVisualTree().IterateParentFirst(visitorFunc);
- },
-
- //TODO implement this
- getBranchOptimizerFunc: function () {
-// var value = $("input[name='SelectBranchOptimizer']:checked").val();
- var func = ChartApp['branchOptimizer' + 'AllHanger4'];
- return func;
- },
-
- branchOptimizerAllLinear: function(node) {
- return node.getIsAssistantRoot() ? null : "linear";
- },
-
- branchOptimizerAllHanger2: function(node) {
- return node.getIsAssistantRoot() ? null : "hanger2";
- },
-
- branchOptimizerAllHanger4: function(node) {
- return node.getIsAssistantRoot() ? null : "hanger4";
- },
-
- branchOptimizerAllFishbone1: function(node) {
- return node.getIsAssistantRoot() ? null : "fishbone1";
- },
-
- branchOptimizerAllFishbone2: function (node) {
- return node.getIsAssistantRoot() ? null : "fishbone2";
- },
-
- branchOptimizerAllSingleColumnLeft: function (node) {
- return node.getIsAssistantRoot() ? null : "singleColumnRight";
- },
-
- branchOptimizerAllSingleColumnRight: function (node) {
- return node.getIsAssistantRoot() ? null : "singleColumnLeft";
- },
-
- branchOptimizerStackers: function(node) {
- if (node.getIsAssistantRoot()) {
- return null;
- }
- return node.Level === 0 // this is Node for boxContainer.SystemRoot, which is not visible itself
- ? "vstackTop"
- : node.Level === 1 // this is children of SystemRoot - they appear as roots in the diagram
- ? "vstackMiddle"
- : "hstack";
-
- },
-
- branchOptimizerSmart: function(node) {
- if (node.getIsAssistantRoot()) {
- return null;
- }
-
- var childCount = node.getChildCount();
-
- if (childCount <= 1) {
- return "vstack";
- }
-
- var nonLeafChildren = 0;
- for (var i = 0; i < childCount; i++) {
- if (node.Children.getItem(i).getChildCount() > 0) {
- nonLeafChildren++;
- }
- }
-
- if (nonLeafChildren <= 1) {
- if (childCount <= 4) {
- return "vstack";
- }
- if (childCount <= 8) {
- return "fishbone1";
- }
- return "fishbone2";
- }
-
- return "hanger4";
- },
-
- boxSizeFunc: function (dataId) {
- // ChartLayoutAlgorithm requires this function to accept data ID
- // so have to convert it to Box ID first, to get rendered visual element
- var boxId = ChartApp.diagram.getBoxes().getBoxesByDataId().getItem(dataId).Id;
- return ChartApp.diagram.getBoxes().getBoxesById().getItem(boxId).Size;
- },
-
- getBoxElementSize: function (boxId) {
- /* var div = $('#box' + boxId);
- if (div.length > 0) {
- return new OrgChart.Layout.Size.$ctor1(div.outerWidth(), div.outerHeight());
- } else { */
- var geo = ChartApp.editorUi.editor.graph.model.cells[boxId].geometry;
- return new OrgChart.Layout.Size.$ctor1(geo.width, geo.height);
- //}
- },
-
- positionBoxes: function () {
- //$('#myConnectors').html('');
-
- //var boxContainer = ChartApp.diagram.getBoxes();
- //var dataSource = ChartApp.dataSource;
- var diagram = ChartApp.diagram;
-
- var state = new OrgChart.Layout.LayoutState(diagram);
-
- state.addOperationChanged(ChartApp.onLayoutStateChanged);
- state.BoxSizeFunc = Bridge.fn.bind(this, ChartApp.boxSizeFunc, null, true);
- state.LayoutOptimizerFunc = Bridge.fn.bind(this, ChartApp.getBranchOptimizerFunc(), null, true);
-
- OrgChart.Layout.LayoutAlgorithm.Apply(state);
-
- var diagramBoundary = OrgChart.Layout.LayoutAlgorithm.ComputeBranchVisualBoundingRect(diagram.getVisualTree());
-console.log(diagramBoundary)
- //$("#myDiagramDiv").width(diagramBoundary.Size.Width);
- //$("#myDiagramDiv").height(diagramBoundary.Size.Height);
-
-// var viewPort = $("#myDiagramDiv").offset();
- var offsetx = -diagramBoundary.getLeft() + diagramBoundary.getTop(); //-diagramBoundary.getLeft() + viewPort.left;
-// var offsety = -diagramBoundary.getTop() + viewPort.top;
-
- var graph = ChartApp.editorUi.editor.graph;
- var cells = graph.model.cells;
-
- var visitorFunc = function (node) {
- if (node.State.IsHidden) {
- return false;
- }
-
- var box = node.Element;
-
- if (box.getIsDataBound()) {
- var cell = cells[box.DataId];
- cell.geometry.x = node.State.TopLeft.X + offsetx;
- cell.geometry.y = node.State.TopLeft.Y;
-// // All boxes have already been rendered before the chart layout,
-// // to have all box sizes available before layout.
-// // So now we only have to position them.
-// // Connectors, however, are not rendered until layout is complete (see next block).
-// console.log(node.State.TopLeft, node.State);
-// /* var div = $('#box' + box.Id);
-// if (div.length > 0) {*/
-//
-// var x = node.State.TopLeft.X + offsetx;
-// var y = node.State.TopLeft.Y + offsety;
-//
-// /* div.offset({ left: x, top: y });
-// div.css("width", node.State.Size.Width);
-// div.css("height", node.State.Size.Height);*/
-//
-// if (node.getChildCount() > 0 || node.AssistantsRoot != null) {
-// // var exp = $('#exp' + box.Id);
-// // if (exp.length > 0) {
-// x = node.State.getRight() + offsetx - 15;
-// y = node.State.getBottom() + offsety - 15;
-// // exp.offset({ left: x, top: y });
-//
-// /* if (box.IsCollapsed) {
-// exp.text('â–¼');
-// } else {
-// exp.text('â–³');
-// }
-// }*/
-// }
-// //}
- }
-
- //TODO apply to draw.io edges
- // Render connectors
- if (node.State.Connector != null) {
- var incomingEdge = graph.getIncomingEdges(cell)[0];
- var outgoingEdge = graph.getOutgoingEdges(cell);
- for (var j = 0; j < outgoingEdge.length; j++)
- {
- outgoingEdge[j].geometry.points = null;
- }
-
- for (var ix = 0; ix < node.State.Connector.Segments.length; ix++) {
- var edge = node.State.Connector.Segments[ix];
- var edgeType;
- var topLeft;
- var width;
- var height;
- console.log(edge, edge.From, edge.To, node.State.Connector.Segments.length, outgoingEdge.length);
- if (edge.From.Y === edge.To.Y) {
- edgeType = "chartHLine";
- height = 1;
- if (edge.From.X < edge.To.X) {
- topLeft = edge.From;
- width = edge.To.X - edge.From.X;
- } else {
- topLeft = edge.To;
- width = edge.From.X - edge.To.X;
- }
- } else {
- edgeType = "chartVLine";
- if (edge.From.Y < edge.To.Y) {
- topLeft = edge.From;
- height = edge.To.Y - edge.From.Y;
- } else {
- topLeft = edge.To;
- height = edge.From.Y - edge.To.Y;
- }
- }
-
- if (node.getIsAssistantRoot()) {
- edgeType = edgeType + "Dotted";
- }
-
-// $("#myConnectors")
-// .append('<div class="' +
-// edgeType +
-// '" style="top:' +
-// (topLeft.Y + offsety) +
-// 'px; left:' +
-// (topLeft.X + offsetx) +
-// 'px; width:' +
-// width +
-// 'px; height:' +
-// height +
-// 'px;"/>');
- }
- }
-
- return true;
- }
-
- diagram.getVisualTree().IterateParentFirst(visitorFunc);
- }
-
- }
- });
-
- // First, checks if it isn't implemented yet.
-// if (!String.prototype.format) {
-// String.prototype.format = String.prototype.f = function () {
-// var s = this,
-// i = arguments.length;
-//
-// while (i--) {
-// s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
-// }
-// return s;
-// };
-// }
-
- Bridge.init();
- ChartApp.main(editorUi);
-
-// function changedSuppressRootBox(cb) {
-// ChartApp.suppressRootBox = cb.checked;
-// ChartApp.buildChart(true);
-// }
-//
-// function clickCollapseAll(bt) {
-// ChartApp.collapseAllBoxes(ChartApp.diagram.getBoxes(), true);
-// ChartApp.buildChart(false);
-// }
-//
-// function clickExpandAll(bt) {
-// ChartApp.collapseAllBoxes(ChartApp.diagram.getBoxes(), false);
-// ChartApp.buildChart(false);
-// }
-//
-// function clickOptimizer(rd) {
-// ChartApp.buildChart(false);
-// }
-
-// function clickDataCounts(rd) {
-// var value = rd.value;
-// if (value === "small") {
-// ChartApp.totalBoxCount = 20;
-// ChartApp.percentAssistants = 0;
-// } else if (value === "small-a") {
-// ChartApp.totalBoxCount = 20;
-// ChartApp.percentAssistants = 10;
-// } else if (value === "large") {
-// ChartApp.totalBoxCount = 200;
-// ChartApp.percentAssistants = 0;
-// } else if (value === "large-a") {
-// ChartApp.totalBoxCount = 200;
-// ChartApp.percentAssistants = 10;
-// } else if (value === "huge-a") {
-// ChartApp.totalBoxCount = 1000;
-// ChartApp.percentAssistants = 5;
-// }
-// ChartApp.buildChart(true);
-// }
-}; \ No newline at end of file
diff --git a/src/main/webapp/math/.npmignore b/src/main/webapp/math/.npmignore
deleted file mode 100644
index 5caebfb7..00000000
--- a/src/main/webapp/math/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.DS_Store
-docs/build/html-mathjax-site
-config/local/*.js
-!config/local/local.js
-unpacked/config/local/*.js
-!unpacked/config/local/local.js
-fonts/HTML-CSS/TeX/png
diff --git a/src/main/webapp/math/CONTRIBUTING.md b/src/main/webapp/math/CONTRIBUTING.md
deleted file mode 100644
index a803fc9e..00000000
--- a/src/main/webapp/math/CONTRIBUTING.md
+++ /dev/null
@@ -1,259 +0,0 @@
-# Contributing to MathJax
-
-You are interested in giving us a hand? That's awesome! We've put together some brief guidelines that should help you get started quickly and easily.
-
-There are lots and lots of ways to get involved, this document covers:
-
-* [reporting an issue](#reporting-an-issue)
- * [bug reports](#bug-reports)
- * [feature requests](#feature-requests)
- * [change requests](#change-requests)
-* [working on MathJax core](#working-on-mathjax-core)
- * [key branches and tags](#key-branches--tags)
- * [submitting pull requests](#submitting-pull-requests)
- * [testing and quality assurance](#testing-and-quality-assurance)
- * [writing documentation](#writing-documentation)
- * [translation](#translation)
-* [Conduct](#conduct)
-
-
-## Reporting An Issue
-
-If you're about to raise an issue because you think you've found a
-problem with MathJax, or you'd like to make a request for a new
-feature in the codebase, or any other reason… please read this first.
-
-The GitHub issue tracker is the preferred channel for [bug reports](#bug-reports),
-[feature requests](#feature-requests), [change requests](#change-requests) and [submitting pull
-requests](#submitting-pull-requests), but please respect the following restrictions:
-
-* Please **search for existing issues**. Help us keep duplicate issues
- to a minimum by checking to see if someone has already reported your
- problem or requested your idea.
-
-* Please **do not** use the issue tracker for personal support
- requests (use [the MathJax User Group](https://groups.google.com/forum/#!forum/mathjax-users)).
-
-* Please **be civil**. Keep the discussion on topic and respect the
- opinions of others. See also our [Conduct Guidelines](#conduct)
-
-### Bug Reports
-
-A bug is a _demonstrable problem_ that is caused by the code in the repository.
-Good bug reports are extremely helpful - thank you!
-
-Guidelines for bug reports:
-
-1. **Use the GitHub issue search** &mdash; check if the issue has already been
- reported.
-
-2. **Check if the issue has been fixed** &mdash; look for [closed issues in the
- current milestone](https://github.com/MathJax/MathJax/issues?&page=1&state=closed) or try to reproduce it
- using the latest `develop` branch. Please note that we only pack MathJax for releases, so on the `develop` branch you have to use `/unpacked/MathJax.js` etc. to test.
-
-3. **Share a live sample of the problem** &mdash; without a live page it is usually impossible to debug problems; see also the Bug Report Template below.
-
-4. **Isolate the problem** &mdash; a live sample is a starting point but if you want to speed things up create a [reduced test
- case](http://css-tricks.com/6263-reduced-test-cases/). Be specific about your setup (browser, OS versions etc). Use services like [jsbin](http://jsbin.com), [CodePen](http://codepen.io), [JSfiddle](http://jsfiddle.com) to make collaboration on minimal test cases easier for everyone. Use the unpacked copy of MathJax (`[...]/unpacked/MathJax.js` etc.) for better debugging.
-
-5. **Include a screenshot/cast as a last resort** &mdash; Is your issue about a layout
- or design feature / bug but hard to reproduce or isolate? Then please provide a screenshot or screencast. Tools like [LICEcap](http://www.cockos.com/licecap/) or [SauceLabs](http://www.saucelabs.com) allow you to quickly and easily record a screencasts. Make it an animated gif, embed it directly into your GitHub issue -- kapow!
-
-6. Use the Bug Report template below or [click this
- link](https://github.com/MathJax/MathJax/issues/new?title=Bug%3A&body=%23%23%23%20Issue%20Summary%0A%0A%23%23%23%20Steps%20to%20Reproduce%0A%0A1.%20This%20is%20the%20first%20step%0A%0AThis%20is%20a%20bug%20because...%0A%0A%23%23%23%20Technical%20details%0A%0A*%20MathJax%20Version%3A%20master%20-%20latest%20commit%3A%20%20INSERT%20COMMIT%20REF%0A*%20Client%20OS%3A%20%0A*%20Browser%3A%20%0A*%20)
- to start creating a bug report with the template automatically.
-
-A good bug report shouldn't leave others needing to chase you up for
-more information. Be sure to include the details of your environment.
-
-Here is a [real example](https://github.com/mathjax/MathJax/issues/820)
-
-Template Example ([click to use](https://github.com/MathJax/MathJax/issues/new?title=Bug%3A&body=%23%23%23%20Issue%20Summary%0A%0A%23%23%23%20Steps%20to%20Reproduce%0A%0A1.%20This%20is%20the%20first%20step%0A%0AThis%20is%20a%20bug%20because...%0A%0A%23%23%23%20Technical%20details%0A%0A*%20MathJax%20Version%3A%20master%20-%20latest%20commit%3A%20%20INSERT%20COMMIT%20REF%0A*%20Client%20OS%3A%20%0A*%20Browser%3A%20%0A*%20)):
-```
-Short and descriptive example bug report title
-
-### Issue Summary
-
-A summary of the issue and the browser/OS environment in which it occurs. If
-suitable, include the steps required to reproduce the bug.
-
-### Steps to Reproduce
-
-1. This is the first step
-2. This is the second step
-3. Further steps, etc.
-
-Any other information you want to share that is relevant to the issue
-being reported. Especially, why do you consider this to be a bug? What
-do you expect to happen instead?
-
-### Technical details:
-
-* MathJax Version: 2.3 (latest commit: f3aaf3a2a3e964df2770dc4aaaa9c87ce5f47e2c)
-* Client OS: Mac OS X 10.8.4
-* Browser: Chrome 29.0.1547.57
-```
-
-
-### Feature Requests
-
-Feature requests are welcome. Before you submit one be sure to have:
-
-1. Read the
- [Roadmaps](https://github.com/mathjax/MathJax/wiki/Mathjax-roadmap),
- **use the GitHub search** and check the feature hasn't already been
- requested.
-2. Take a moment to think about whether your idea fits with the scope
- and aims of the project, or if it might better fit being a [custom
- extension](https://github.com/mathjax/MathJax-third-party-extensions).
-3. Remember, it's up to *you* to make a strong case to convince the
- project's leaders of the merits of this feature. Please provide as
- much detail and context as possible, this means explaining the use
- case and why it is likely to be common.
-4. Clearly indicate whether this is a feature request for MathJax
- core, input & output jax, or extensions.
-
-
-### Change Requests
-
-Change requests cover both architectural and functional changes to how
-MathJax works. If you have an idea for a new or different dependency,
-a refactor, or an improvement to a feature, etc - please be sure to:
-
-1. **Use the GitHub search** and check someone else didn't get there first
-2. Take a moment to think about the best way to make a case for, and
- explain what you're thinking. Are you sure this shouldn't really be
- a [bug report](#bug-reports) or a [feature
- request](#feature-requests)? Is it really one idea or is it many?
- What's the context? What problem are you solving? Why is what you
- are suggesting better than what's already there? Does it fit with
- the Roadmap?
-
-## Working on MathJax core
-
-You want to contribute code? Fantastic! Let's get you started.
-
-### Key Branches & Tags
-
-To get it out of the way:
-
-- **[develop](https://github.com/MathJax/MathJax/tree/develop)** is
- the development branch. All work on the next release happens here so
- you should generally branch off `develop`. Do **NOT** use this branch
- for a production site.
-- **[master](https://github.com/MathJax/MathJax)** contains the latest
- release of MathJax. This branch may be used in production. Do
- **NOT** use this branch to work on MathJax's source.
-
-### Submitting Pull Requests
-
-Pull requests are awesome. If you're looking to raise a PR for
-something which doesn't have an open issue, please think carefully
-about [raising an issue](#reporting-an-issue) which your PR can close,
-especially if you're fixing a bug. This makes it more likely that
-there will be enough information available for your PR to be properly
-tested and merged.
-
-##### Need Help?
-
-If you're not completely clear on how to submit / update / *do* Pull
-Requests, please check out our [source control
-policies](https://github.com/mathjax/MathJax/wiki/Source-control-policies). For
-more insights, chech the excellent in depth [Git Workflow
-guide](https://github.com/TryGhost/Ghost/wiki/Git-Workflow) from
-Ghost, in particular
-
-* [Ghost Workflow guide: commit messages](https://github.com/TryGhost/Ghost/wiki/Git-workflow#commit-messages)
-
-### Testing and Quality Assurance
-
-Never underestimate just how useful quality assurance is. If you're
-looking to get involved with the code base and don't know where to
-start, checking out and testing a pull request is one of the most
-useful things you could do.
-
-If you want to get involved with testing MathJax, there is a set of QA
-Documentation [in our testing
-framework](https://github.com/MathJax/MathJax-test).
-
-Essentially though, [check out the latest develop
-branch](#working-on-mathJax-core), take it for a spin, and if you find
-anything odd, please follow the [bug report guidelines](#bug-reports)
-and let us know!
-
-#### Checking out a Pull Request
-
-These are some [excellent
-instructions](https://gist.github.com/piscisaureus/3342247) on
-configuring your GitHub repository to allow you to checkout pull
-requests in the same way as branches:
-<https://gist.github.com/piscisaureus/3342247>.
-
-
-### Writing documentation
-
-MathJax's main documentation can be found at [docs.mathjax.org](http://docs.mathjax.org).
-The source of the docs is hosted in the
-[mathjax/mathjax-docs](http://github.com/mathjax/mathjax-docs) repo here on GitHub.
-
-The documentation is generated using [Sphinx-doc](http://sphinx-doc.org/) and hosted on
-[Read the docs](http://readthedocs.org).
-You can clone the repo and submit pull requests following the
-[pull-request](#submitting-pull-requests) guidelines.
-
-
-### Translation
-
-If you wish to add or update translations of MathJax, please do it on
-[TranslateWiki.net](https://translatewiki.net/w/i.php?title=Special:Translate&group=out-mathjax-0-all)
-(and while you're there you can help other open source projects,
-too, because you're awesome!).
-
-For bug reports and other questions that don't fit on
-TranslateWiki.net, head over to the
-[mathjax/mathjax-i18n](https://github.com/mathjax/MathJax-i18n)
-repository.
-
-## Conduct
-
-We are committed to providing a friendly, safe and welcoming environment for
-all, regardless of gender, sexual orientation, disability, ethnicity, religion,
-or similar personal characteristic.
-
-Please be kind and courteous. There's no need to be mean or rude.
-Respect that people have differences of opinion and that every design or
-implementation choice carries a trade-off and numerous costs. There is seldom
-a right answer, merely an optimal answer given a set of values and
-circumstances.
-
-Please keep unstructured critique to a minimum. If you have solid ideas you
-want to experiment with, make a fork and see how it works.
-
-We will exclude you from interaction if you insult, demean or harass anyone.
-That is not welcome behaviour. We interpret the term "harassment" as
-including the definition in the
-[Citizen Code of Conduct](http://citizencodeofconduct.org/);
-if you have any lack of clarity about what might be included in that concept,
-please read their definition. In particular, we don't tolerate behavior that
-excludes people in socially marginalized groups.
-
-Private harassment is also unacceptable. No matter who you are, if you feel
-you have been or are being harassed or made uncomfortable by a community
-member, please contact one of the channel ops or any of the
-[MathJax](https://github.com/MathJax/MathJax) core team
-immediately. Whether you're a regular contributor or a newcomer, we care about
-making this community a safe place for you and we've got your back.
-
-Likewise any spamming, trolling, flaming, baiting or other attention-stealing
-behaviour is not welcome.
-
-We also suggest to read [discourse's
-rules](http://blog.discourse.org/2013/03/the-universal-rules-of-civilized-discourse/)
-
-## References
-
-* We heavily borrowed from Mozilla and Ghost -- thank you!
- * https://github.com/TryGhost/Ghost/blob/master/CONTRIBUTING.md
- * https://github.com/mozilla/rust/wiki/Note-development-policy
-* https://github.com/jden/CONTRIBUTING.md/blob/master/CONTRIBUTING.md
-* http://blog.discourse.org/2013/03/the-universal-rules-of-civilized-discourse/
diff --git a/src/main/webapp/math/README.md b/src/main/webapp/math/README.md
deleted file mode 100644
index 7ca6f7e4..00000000
--- a/src/main/webapp/math/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# MathJax
-
-## Beautiful math in all browsers
-
-MathJax is an open-source JavaScript display engine for LaTeX, MathML, and
-AsciiMath notation that works in all modern browsers. It was designed with
-the goal of consolidating the recent advances in web technologies into a
-single, definitive, math-on-the-web platform supporting the major browsers
-and operating systems. It requires no setup on the part of the user (no
-plugins to download or software to install), so the page author can write
-web documents that include mathematics and be confident that users will be
-able to view it naturally and easily. Simply include MathJax and some
-mathematics in a web page, and MathJax does the rest.
-
-Some of the main features of MathJax include:
-
-- High-quality display of LaTeX, MathML, and AsciiMath notation in HTML pages
-
-- Supported in most browsers with no plug-ins, extra fonts, or special
- setup for the reader
-
-- Easy for authors, flexible for publishers, extensible for developers
-
-- Supports math accessibility, cut-and-paste interoperability, and other
- advanced functionality
-
-- Powerful API for integration with other web applications
-
-See <http://www.mathjax.org/> for additional details.
-
-
-## Installation and Usage
-
-The MathJax installation and usage documentation is available in a
-separate GitHub repository at <https://github.com/mathjax/mathjax-docs>.
-The HTML versions can now be viewed at <http://docs.mathjax.org/>,
-where it is possible for you to submit corrections and modifications
-directly to the documentation on line.
-
-
-## Community
-
-The main MathJax website is <http://www.mathjax.org>, and it includes
-announcements and other important information. MathJax is maintained and
-distributed on GitHub at <http://github.com/mathjax/MathJax>. A user forum
-for asking questions and getting assistance is hosted at Google, and the
-bug tracker is hosted at GitHub:
-
-Bug tracker: <https://github.com/mathjax/MathJax/issues>
-MathJax-Users Group: <http://groups.google.com/group/mathjax-users>
-
-Before reporting a bug, please check that it has not already been reported.
-Also, please use the bug tracker for reporting bugs rather than the help forum.
diff --git a/src/main/webapp/math/bower.json b/src/main/webapp/math/bower.json
deleted file mode 100644
index 6b214b93..00000000
--- a/src/main/webapp/math/bower.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "name": "MathJax",
- "main": "./MathJax.js",
- "homepage": "http://www.mathjax.org/",
- "ignore": [
- "**/.*",
- "node_modules",
- "components"
- ],
- "keywords": ["math", "js", "LaTeX", "MathML", "AsciiMath"]
-}
diff --git a/src/main/webapp/math/composer.json b/src/main/webapp/math/composer.json
deleted file mode 100644
index b1b9d27a..00000000
--- a/src/main/webapp/math/composer.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "name": "mathjax/mathjax",
- "type": "library",
- "description": "MathJax is an open-source JavaScript display engine for LaTeX, MathML, and AsciiMath notation that works in all modern browsers.",
- "keywords": ["math", "js", "LaTeX", "MathML", "AsciiMath"],
- "homepage": "http://www.mathjax.org/",
- "license": "Apache-2.0",
- "authors": [
- {
- "name": "MathJax Consortium",
- "homepage": "https://github.com/mathjax"
- }
- ]
-}
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/algebra.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/algebra.js
deleted file mode 100644
index a4583170..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/algebra.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Algebra","mappings":{"default":{"default":"degree"}},"key":"deg","names":["deg"]},{"category":"Algebra","mappings":{"default":{"default":"determinant","short":"det"}},"key":"det","names":["det"]},{"category":"Algebra","mappings":{"default":{"default":"dimension"}},"key":"dim","names":["dim"]},{"category":"Algebra","mappings":{"default":{"default":"homomorphism","short":"hom"}},"key":"hom","names":["hom","Hom"]},{"category":"Algebra","mappings":{"default":{"default":"kernel"}},"key":"ker","names":["ker"]},{"category":"Algebra","mappings":{"default":{"default":"trace"}},"key":"Tr","names":["Tr","tr"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/elementary.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/elementary.js
deleted file mode 100644
index 8751c76b..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/elementary.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Elementary","mappings":{"default":{"default":"logarithm","alternative":"logarithm function","short":"log"}},"key":"log","names":["log"]},{"category":"Elementary","mappings":{"default":{"default":"natural logarithm","alternative":"natural logarithm function","short":"natural log"},"mathspeak":{"default":"ln"}},"key":"ln","names":["ln"]},{"category":"Elementary","mappings":{"default":{"default":"logarithm base 10","short":"log base 10"}},"key":"lg","names":["lg"]},{"category":"Elementary","mappings":{"default":{"default":"exponential","alternative":"exponential function","short":"exp"}},"key":"exp","names":["exp","expt"]},{"category":"Elementary","mappings":{"default":{"default":"greatest common divisor","short":"gcd"}},"key":"gcd","names":["gcd"]},{"category":"Elementary","mappings":{"default":{"default":"least common multiple","short":"lcm"}},"key":"lcm","names":["lcm"]},{"category":"Complex","mappings":{"default":{"default":"argument","short":"arg"}},"key":"arg","names":["arg"]},{"category":"Complex","mappings":{"default":{"default":"imaginary part","short":"imaginary"},"mathspeak":{"default":"im"}},"key":"im","names":["im"]},{"category":"Complex","mappings":{"default":{"default":"real part","short":"real"},"mathspeak":{"default":"re"}},"key":"re","names":["re"]},{"category":"Limits","mappings":{"default":{"default":"infimum","short":"inf"}},"key":"inf","names":["inf"]},{"category":"Limits","mappings":{"default":{"default":"limit","short":"lim"},"mathspeak":{"default":"limit"}},"key":"lim","names":["lim"]},{"category":"Limits","mappings":{"default":{"default":"infimum default","alternative":"inferior limit","short":"liminf"}},"key":"liminf","names":["lim inf","liminf"]},{"category":"Limits","mappings":{"default":{"default":"supremum limit","alternative":"superior limit","short":"limsup"}},"key":"limsup","names":["lim sup","limsup"]},{"category":"Limits","mappings":{"default":{"default":"maximum","short":"max"}},"key":"max","names":["max"]},{"category":"Limits","mappings":{"default":{"default":"minimum","short":"min"}},"key":"min","names":["min"]},{"category":"Limits","mappings":{"default":{"default":"supremum","short":"sup"}},"key":"sup","names":["sup"]},{"category":"Limits","mappings":{"default":{"default":"injective limit","alternative":"direct limit","short":"colimit"}},"key":"injlim","names":["injlim","inj lim"]},{"category":"Limits","mappings":{"default":{"default":"projective limit","alternative":"inverse limit","short":"limit"}},"key":"projlim","names":["projlim","proj lim"]},{"category":"Elementary","mappings":{"default":{"default":"modulo","short":"mod"}},"key":"mod","names":["mod"]},{"category":"Probability","mappings":{"default":{"default":"probability"}},"key":"Pr","names":["Pr"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/hyperbolic.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/hyperbolic.js
deleted file mode 100644
index cd9f3d36..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/hyperbolic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Hyperbolic","mappings":{"default":{"default":"hyperbolic cosine function","short":"hyperbolic cosine"}},"key":"cosh","names":["cosh"]},{"category":"Hyperbolic","mappings":{"default":{"default":"hyperbolic cotangent function","short":"hyperbolic cotangent"}},"key":"coth","names":["coth"]},{"category":"Hyperbolic","mappings":{"default":{"default":"hyperbolic cosecant function","short":"hyperbolic cosecant"}},"key":"csch","names":["csch"]},{"category":"Hyperbolic","mappings":{"default":{"default":"hyperbolic secant function","short":"hyperbolic secant"}},"key":"sech","names":["sech"]},{"category":"Hyperbolic","mappings":{"default":{"default":"hyperbolic sine function","short":"hyperbolic sine"}},"key":"sinh","names":["sinh"]},{"category":"Hyperbolic","mappings":{"default":{"default":"hyperbolic tangent function","short":"hyperbolic tangent"}},"key":"tanh","names":["tanh"]},{"category":"Area","mappings":{"default":{"default":"inverse hyperbolic cosine function","alternative":"area hyperbolic cosine function","short":"area hyperbolic cosine"}},"key":"arcosh","names":["arcosh","arccosh"]},{"category":"Area","mappings":{"default":{"default":"inverse hyperbolic cotangent function","alternative":"area hyperbolic cotangent function","short":"area hyperbolic cotangent"}},"key":"arcoth","names":["arcoth","arccoth"]},{"category":"Area","mappings":{"default":{"default":"inverse hyperbolic cosecant function","alternative":"area hyperbolic cosecant function","short":"area hyperbolic cosecant"}},"key":"arcsch","names":["arcsch","arccsch"]},{"category":"Area","mappings":{"default":{"default":"inverse hyperbolic secant function","alternative":"area hyperbolic secant function","short":"area hyperbolic secant"}},"key":"arsech","names":["arsech","arcsech"]},{"category":"Area","mappings":{"default":{"default":"inverse hyperbolic sine function","alternative":"area hyperbolic sine function","short":"area hyperbolic sine"}},"key":"arsinh","names":["arsinh","arcsinh"]},{"category":"Area","mappings":{"default":{"default":"inverse hyperbolic tangent function","alternative":"area hyperbolic tangent function","short":"area hyperbolic tangent"}},"key":"artanh","names":["artanh","arctanh"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/trigonometry.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/trigonometry.js
deleted file mode 100644
index be6b3dd9..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/functions/trigonometry.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Trigonometric","mappings":{"default":{"default":"cosine function","short":"cosine"}},"key":"cos","names":["cos","cosine"]},{"category":"Trigonometric","mappings":{"default":{"default":"cotangent function","short":"cotangent"}},"key":"cot","names":["cot"]},{"category":"Trigonometric","mappings":{"default":{"default":"cosecant function","short":"cosecant"}},"key":"csc","names":["csc"]},{"category":"Trigonometric","mappings":{"default":{"default":"secant function","short":"secant"}},"key":"sec","names":["sec"]},{"category":"Trigonometric","mappings":{"default":{"default":"sine function","alternative":"sine function","short":"sine"}},"key":"sin","names":["sin","sine"]},{"category":"Trigonometric","mappings":{"default":{"default":"tangent function","short":"tangent"}},"key":"tan","names":["tan"]},{"category":"Cyclometric","mappings":{"default":{"default":"inverse cosine function","alternative":"arc cosine function","short":"arc cosine"}},"key":"arccos","names":["arccos"]},{"category":"Cyclometric","mappings":{"default":{"default":"inverse cotangent function","alternative":"arc cotangent function","short":"arc cotangent"}},"key":"arccot","names":["arccot"]},{"category":"Cyclometric","mappings":{"default":{"default":"inverse cosecant function","alternative":"arc cosecant function","short":"arc cosecant"}},"key":"arccsc","names":["arccsc"]},{"category":"Cyclometric","mappings":{"default":{"default":"inverse secant function","alternative":"arc secant function","short":"arc secant"}},"key":"arcsec","names":["arcsec"]},{"category":"Cyclometric","mappings":{"default":{"default":"inverse sine function","alternative":"arc sine function","short":"arc sine"}},"key":"arcsin","names":["arcsin"]},{"category":"Cyclometric","mappings":{"default":{"default":"inverse tangent function","alternative":"arc tangent function","short":"arc tangent"}},"key":"arctan","names":["arctan"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-capital.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-capital.js
deleted file mode 100644
index d85e8630..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-capital.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","key":"0391","mappings":{"default":{"default":"greek capital letter alpha","short":"cap alpha"},"mathspeak":{"default":"upper Alpha"}}},{"category":"Lu","key":"0392","mappings":{"default":{"default":"greek capital letter beta","short":"cap beta"},"mathspeak":{"default":"upper Beta"}}},{"category":"Lu","key":"0393","mappings":{"default":{"default":"greek capital letter gamma","short":"cap gamma"},"mathspeak":{"default":"upper Gamma"}}},{"category":"Lu","key":"0394","mappings":{"default":{"default":"greek capital letter delta","short":"cap delta"},"mathspeak":{"default":"upper Delta"}}},{"category":"Lu","key":"0395","mappings":{"default":{"default":"greek capital letter epsilon","short":"cap epsilon"},"mathspeak":{"default":"upper Epsilon"}}},{"category":"Lu","key":"0396","mappings":{"default":{"default":"greek capital letter zeta","short":"cap zeta"},"mathspeak":{"default":"upper Zeta"}}},{"category":"Lu","key":"0397","mappings":{"default":{"default":"greek capital letter eta","short":"cap eta"},"mathspeak":{"default":"upper Eta"}}},{"category":"Lu","key":"0398","mappings":{"default":{"default":"greek capital letter theta","short":"cap theta"},"mathspeak":{"default":"upper Theta"}}},{"category":"Lu","key":"0399","mappings":{"default":{"default":"greek capital letter iota","short":"cap iota"},"mathspeak":{"default":"upper Iota"}}},{"category":"Lu","key":"039A","mappings":{"default":{"default":"greek capital letter kappa","short":"cap kappa"},"mathspeak":{"default":"upper Kappa"}}},{"category":"Lu","key":"039B","mappings":{"default":{"default":"greek capital letter lamda","alternative":"greek capital letter lambda","short":"cap lamda"},"mathspeak":{"default":"upper Lamda"}}},{"category":"Lu","key":"039C","mappings":{"default":{"default":"greek capital letter mu","short":"cap mu"},"mathspeak":{"default":"upper Mu"}}},{"category":"Lu","key":"039D","mappings":{"default":{"default":"greek capital letter nu","short":"cap nu"},"mathspeak":{"default":"upper Nu"}}},{"category":"Lu","key":"039E","mappings":{"default":{"default":"greek capital letter xi","short":"cap xi"},"mathspeak":{"default":"upper Xi"}}},{"category":"Lu","key":"039F","mappings":{"default":{"default":"greek capital letter omicron","short":"cap omicron"},"mathspeak":{"default":"upper Omicron"}}},{"category":"Lu","key":"03A0","mappings":{"default":{"default":"greek capital letter pi","short":"cap pi"},"mathspeak":{"default":"upper Pi"}}},{"category":"Lu","key":"03A1","mappings":{"default":{"default":"greek capital letter rho","short":"cap rho"},"mathspeak":{"default":"upper Rho"}}},{"category":"Lu","key":"03A3","mappings":{"default":{"default":"greek capital letter sigma","short":"cap sigma"},"mathspeak":{"default":"upper Sigma"}}},{"category":"Lu","key":"03A4","mappings":{"default":{"default":"greek capital letter tau","short":"cap tau"},"mathspeak":{"default":"upper Tau"}}},{"category":"Lu","key":"03A5","mappings":{"default":{"default":"greek capital letter upsilon","short":"cap upsilon"},"mathspeak":{"default":"upper Upsilon"}}},{"category":"Lu","key":"03A6","mappings":{"default":{"default":"greek capital letter phi","short":"cap phi"},"mathspeak":{"default":"upper Phi"}}},{"category":"Lu","key":"03A7","mappings":{"default":{"default":"greek capital letter chi","short":"cap chi"},"mathspeak":{"default":"upper Chi"}}},{"category":"Lu","key":"03A8","mappings":{"default":{"default":"greek capital letter psi","short":"cap psi"},"mathspeak":{"default":"upper Psi"}}},{"category":"Lu","key":"03A9","mappings":{"default":{"default":"greek capital letter omega","short":"cap omega"},"mathspeak":{"default":"upper Omega"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-bold.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-bold.js
deleted file mode 100644
index 8dd48e1e..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-bold.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital alpha","alternative":"bold capital alpha","short":"bold cap alpha"},"mathspeak":{"default":"bold upper Alpha"}},"key":"1D6A8"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital beta","alternative":"bold capital beta","short":"bold cap beta"},"mathspeak":{"default":"bold upper Beta"}},"key":"1D6A9"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital gamma","alternative":"bold capital gamma","short":"bold cap gamma"},"mathspeak":{"default":"bold upper Gamma"}},"key":"1D6AA"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital delta","alternative":"bold capital delta","short":"bold cap delta"},"mathspeak":{"default":"bold upper Delta"}},"key":"1D6AB"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital epsilon","alternative":"bold capital epsilon","short":"bold cap epsilon"},"mathspeak":{"default":"bold upper Epsilon"}},"key":"1D6AC"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital zeta","alternative":"bold capital zeta","short":"bold cap zeta"},"mathspeak":{"default":"bold upper Zeta"}},"key":"1D6AD"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital eta","alternative":"bold capital eta","short":"bold cap eta"},"mathspeak":{"default":"bold upper Eta"}},"key":"1D6AE"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital theta","alternative":"bold capital theta","short":"bold cap theta"},"mathspeak":{"default":"bold upper Theta"}},"key":"1D6AF"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital iota","alternative":"bold capital iota","short":"bold cap iota"},"mathspeak":{"default":"bold upper Iota"}},"key":"1D6B0"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital kappa","alternative":"bold capital kappa","short":"bold cap kappa"},"mathspeak":{"default":"bold upper Kappa"}},"key":"1D6B1"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital lamda","alternative":"bold capital lamda","short":"bold cap lamda"},"mathspeak":{"default":"bold upper Lamda"}},"key":"1D6B2"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital mu","alternative":"bold capital mu","short":"bold cap mu"},"mathspeak":{"default":"bold upper Mu"}},"key":"1D6B3"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital nu","alternative":"bold capital nu","short":"bold cap nu"},"mathspeak":{"default":"bold upper Nu"}},"key":"1D6B4"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital xi","alternative":"bold capital xi","short":"bold cap xi"},"mathspeak":{"default":"bold upper Xi"}},"key":"1D6B5"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital omicron","alternative":"bold capital omicron","short":"bold cap omicron"},"mathspeak":{"default":"bold upper Omicron"}},"key":"1D6B6"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital pi","alternative":"bold capital pi","short":"bold cap pi"},"mathspeak":{"default":"bold upper Pi"}},"key":"1D6B7"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital rho","alternative":"bold capital rho","short":"bold cap rho"},"mathspeak":{"default":"bold upper Rho"}},"key":"1D6B8"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital sigma","alternative":"bold capital sigma","short":"bold cap sigma"},"mathspeak":{"default":"bold upper Sigma"}},"key":"1D6BA"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital tau","alternative":"bold capital tau","short":"bold cap tau"},"mathspeak":{"default":"bold upper Tau"}},"key":"1D6BB"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital upsilon","alternative":"bold capital upsilon","short":"bold cap upsilon"},"mathspeak":{"default":"bold upper Upsilon"}},"key":"1D6BC"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital phi","alternative":"bold capital phi","short":"bold cap phi"},"mathspeak":{"default":"bold upper Phi"}},"key":"1D6BD"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital chi","alternative":"bold capital chi","short":"bold cap chi"},"mathspeak":{"default":"bold upper Chi"}},"key":"1D6BE"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital psi","alternative":"bold capital psi","short":"bold cap psi"},"mathspeak":{"default":"bold upper Psi"}},"key":"1D6BF"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital omega","alternative":"bold capital omega","short":"bold cap omega"},"mathspeak":{"default":"bold upper Omega"}},"key":"1D6C0"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small alpha","alternative":"bold small alpha","short":"bold alpha"}},"key":"1D6C2"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small beta","alternative":"bold small beta","short":"bold beta"}},"key":"1D6C3"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small gamma","alternative":"bold small gamma","short":"bold gamma"}},"key":"1D6C4"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small delta","alternative":"bold small delta","short":"bold delta"}},"key":"1D6C5"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small epsilon","alternative":"bold small epsilon","short":"bold epsilon"}},"key":"1D6C6"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small zeta","alternative":"bold small zeta","short":"bold zeta"}},"key":"1D6C7"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small eta","alternative":"bold small eta","short":"bold eta"}},"key":"1D6C8"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small theta","alternative":"bold small theta","short":"bold theta"}},"key":"1D6C9"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small iota","alternative":"bold small iota","short":"bold iota"}},"key":"1D6CA"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small kappa","alternative":"bold small kappa","short":"bold kappa"}},"key":"1D6CB"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small lamda","alternative":"bold small lamda","short":"bold lamda"}},"key":"1D6CC"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small mu","alternative":"bold small mu","short":"bold mu"}},"key":"1D6CD"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small nu","alternative":"bold small nu","short":"bold nu"}},"key":"1D6CE"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small xi","alternative":"bold small xi","short":"bold xi"}},"key":"1D6CF"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small omicron","alternative":"bold small omicron","short":"bold omicron"}},"key":"1D6D0"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small pi","alternative":"bold small pi","short":"bold pi"}},"key":"1D6D1"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small rho","alternative":"bold small rho","short":"bold rho"}},"key":"1D6D2"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small final sigma","alternative":"bold small final sigma","short":"bold final sigma"}},"key":"1D6D3"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small sigma","alternative":"bold small sigma","short":"bold sigma"}},"key":"1D6D4"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small tau","alternative":"bold small tau","short":"bold tau"}},"key":"1D6D5"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small upsilon","alternative":"bold small upsilon","short":"bold upsilon"}},"key":"1D6D6"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small phi","alternative":"bold small phi","short":"bold phi"}},"key":"1D6D7"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small chi","alternative":"bold small chi","short":"bold chi"}},"key":"1D6D8"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small psi","alternative":"bold small psi","short":"bold psi"}},"key":"1D6D9"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small omega","alternative":"bold small omega","short":"bold omega"}},"key":"1D6DA"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-italic.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-italic.js
deleted file mode 100644
index 6bbe6445..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-italic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital alpha","alternative":"italic capital alpha","short":"italic cap alpha"},"mathspeak":{"default":"italic upper Alpha"}},"key":"1D6E2"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital beta","alternative":"italic capital beta","short":"italic cap beta"},"mathspeak":{"default":"italic upper Beta"}},"key":"1D6E3"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital gamma","alternative":"italic capital gamma","short":"italic cap gamma"},"mathspeak":{"default":"italic upper Gamma"}},"key":"1D6E4"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital delta","alternative":"italic capital delta","short":"italic cap delta"},"mathspeak":{"default":"italic upper Delta"}},"key":"1D6E5"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital epsilon","alternative":"italic capital epsilon","short":"italic cap epsilon"},"mathspeak":{"default":"italic upper Epsilon"}},"key":"1D6E6"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital zeta","alternative":"italic capital zeta","short":"italic cap zeta"},"mathspeak":{"default":"italic upper Zeta"}},"key":"1D6E7"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital eta","alternative":"italic capital eta","short":"italic cap eta"},"mathspeak":{"default":"italic upper Eta"}},"key":"1D6E8"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital theta","alternative":"italic capital theta","short":"italic cap theta"},"mathspeak":{"default":"italic upper Theta"}},"key":"1D6E9"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital iota","alternative":"italic capital iota","short":"italic cap iota"},"mathspeak":{"default":"italic upper Iota"}},"key":"1D6EA"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital kappa","alternative":"italic capital kappa","short":"italic cap kappa"},"mathspeak":{"default":"italic upper Kappa"}},"key":"1D6EB"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital lamda","alternative":"italic capital lamda","short":"italic cap lamda"},"mathspeak":{"default":"italic upper Lamda"}},"key":"1D6EC"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital mu","alternative":"italic capital mu","short":"italic cap mu"},"mathspeak":{"default":"italic upper Mu"}},"key":"1D6ED"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital nu","alternative":"italic capital nu","short":"italic cap nu"},"mathspeak":{"default":"italic upper Nu"}},"key":"1D6EE"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital xi","alternative":"italic capital xi","short":"italic cap xi"},"mathspeak":{"default":"italic upper Xi"}},"key":"1D6EF"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital omicron","alternative":"italic capital omicron","short":"italic cap omicron"},"mathspeak":{"default":"italic upper Omicron"}},"key":"1D6F0"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital pi","alternative":"italic capital pi","short":"italic cap pi"},"mathspeak":{"default":"italic upper Pi"}},"key":"1D6F1"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital rho","alternative":"italic capital rho","short":"italic cap rho"},"mathspeak":{"default":"italic upper Rho"}},"key":"1D6F2"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital sigma","alternative":"italic capital sigma","short":"italic cap sigma"},"mathspeak":{"default":"italic upper Sigma"}},"key":"1D6F4"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital tau","alternative":"italic capital tau","short":"italic cap tau"},"mathspeak":{"default":"italic upper Tau"}},"key":"1D6F5"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital upsilon","alternative":"italic capital upsilon","short":"italic cap upsilon"},"mathspeak":{"default":"italic upper Upsilon"}},"key":"1D6F6"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital phi","alternative":"italic capital phi","short":"italic cap phi"},"mathspeak":{"default":"italic upper Phi"}},"key":"1D6F7"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital chi","alternative":"italic capital chi","short":"italic cap chi"},"mathspeak":{"default":"italic upper Chi"}},"key":"1D6F8"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital psi","alternative":"italic capital psi","short":"italic cap psi"},"mathspeak":{"default":"italic upper Psi"}},"key":"1D6F9"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital omega","alternative":"italic capital omega","short":"italic cap omega"},"mathspeak":{"default":"italic upper Omega"}},"key":"1D6FA"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small alpha","alternative":"italic small alpha","short":"italic alpha"}},"key":"1D6FC"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small beta","alternative":"italic small beta","short":"italic beta"}},"key":"1D6FD"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small gamma","alternative":"italic small gamma","short":"italic gamma"}},"key":"1D6FE"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small delta","alternative":"italic small delta","short":"italic delta"}},"key":"1D6FF"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small epsilon","alternative":"italic small epsilon","short":"italic epsilon"}},"key":"1D700"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small zeta","alternative":"italic small zeta","short":"italic zeta"}},"key":"1D701"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small eta","alternative":"italic small eta","short":"italic eta"}},"key":"1D702"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small theta","alternative":"italic small theta","short":"italic theta"}},"key":"1D703"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small iota","alternative":"italic small iota","short":"italic iota"}},"key":"1D704"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small kappa","alternative":"italic small kappa","short":"italic kappa"}},"key":"1D705"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small lamda","alternative":"italic small lamda","short":"italic lamda"}},"key":"1D706"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small mu","alternative":"italic small mu","short":"italic mu"}},"key":"1D707"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small nu","alternative":"italic small nu","short":"italic nu"}},"key":"1D708"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small xi","alternative":"italic small xi","short":"italic xi"}},"key":"1D709"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small omicron","alternative":"italic small omicron","short":"italic omicron"}},"key":"1D70A"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small pi","alternative":"italic small pi","short":"italic pi"}},"key":"1D70B"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small rho","alternative":"italic small rho","short":"italic rho"}},"key":"1D70C"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small final sigma","alternative":"italic small final sigma","short":"italic final sigma"}},"key":"1D70D"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small sigma","alternative":"italic small sigma","short":"italic sigma"}},"key":"1D70E"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small tau","alternative":"italic small tau","short":"italic tau"}},"key":"1D70F"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small upsilon","alternative":"italic small upsilon","short":"italic upsilon"}},"key":"1D710"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small phi","alternative":"italic small phi","short":"italic phi"}},"key":"1D711"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small chi","alternative":"italic small chi","short":"italic chi"}},"key":"1D712"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small psi","alternative":"italic small psi","short":"italic psi"}},"key":"1D713"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small omega","alternative":"italic small omega","short":"italic omega"}},"key":"1D714"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-sans-serif-bold.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-sans-serif-bold.js
deleted file mode 100644
index aeca8bf0..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-mathfonts-sans-serif-bold.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital alpha","alternative":"sans serif bold capital alpha","short":"sans serif bold cap alpha"},"mathspeak":{"default":"sans serif bold upper Alpha"}},"key":"1D756"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital beta","alternative":"sans serif bold capital beta","short":"sans serif bold cap beta"},"mathspeak":{"default":"sans serif bold upper Beta"}},"key":"1D757"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital gamma","alternative":"sans serif bold capital gamma","short":"sans serif bold cap gamma"},"mathspeak":{"default":"sans serif bold upper Gamma"}},"key":"1D758"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital delta","alternative":"sans serif bold capital delta","short":"sans serif bold cap delta"},"mathspeak":{"default":"sans serif bold upper Delta"}},"key":"1D759"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital epsilon","alternative":"sans serif bold capital epsilon","short":"sans serif bold cap epsilon"},"mathspeak":{"default":"sans serif bold upper Epsilon"}},"key":"1D75A"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital zeta","alternative":"sans serif bold capital zeta","short":"sans serif bold cap zeta"},"mathspeak":{"default":"sans serif bold upper Zeta"}},"key":"1D75B"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital eta","alternative":"sans serif bold capital eta","short":"sans serif bold cap eta"},"mathspeak":{"default":"sans serif bold upper Eta"}},"key":"1D75C"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital theta","alternative":"sans serif bold capital theta","short":"sans serif bold cap theta"},"mathspeak":{"default":"sans serif bold upper Theta"}},"key":"1D75D"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital iota","alternative":"sans serif bold capital iota","short":"sans serif bold cap iota"},"mathspeak":{"default":"sans serif bold upper Iota"}},"key":"1D75E"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital kappa","alternative":"sans serif bold capital kappa","short":"sans serif bold cap kappa"},"mathspeak":{"default":"sans serif bold upper Kappa"}},"key":"1D75F"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital lamda","alternative":"sans serif bold capital lamda","short":"sans serif bold cap lamda"},"mathspeak":{"default":"sans serif bold upper Lamda"}},"key":"1D760"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital mu","alternative":"sans serif bold capital mu","short":"sans serif bold cap mu"},"mathspeak":{"default":"sans serif bold upper Mu"}},"key":"1D761"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital nu","alternative":"sans serif bold capital nu","short":"sans serif bold cap nu"},"mathspeak":{"default":"sans serif bold upper Nu"}},"key":"1D762"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital xi","alternative":"sans serif bold capital xi","short":"sans serif bold cap xi"},"mathspeak":{"default":"sans serif bold upper Xi"}},"key":"1D763"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital omicron","alternative":"sans serif bold capital omicron","short":"sans serif bold cap omicron"},"mathspeak":{"default":"sans serif bold upper Omicron"}},"key":"1D764"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital pi","alternative":"sans serif bold capital pi","short":"sans serif bold cap pi"},"mathspeak":{"default":"sans serif bold upper Pi"}},"key":"1D765"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital rho","alternative":"sans serif bold capital rho","short":"sans serif bold cap rho"},"mathspeak":{"default":"sans serif bold upper Rho"}},"key":"1D766"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital sigma","alternative":"sans serif bold capital sigma","short":"sans serif bold cap sigma"},"mathspeak":{"default":"sans serif bold upper Sigma"}},"key":"1D768"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital tau","alternative":"sans serif bold capital tau","short":"sans serif bold cap tau"},"mathspeak":{"default":"sans serif bold upper Tau"}},"key":"1D769"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital upsilon","alternative":"sans serif bold capital upsilon","short":"sans serif bold cap upsilon"},"mathspeak":{"default":"sans serif bold upper Upsilon"}},"key":"1D76A"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital phi","alternative":"sans serif bold capital phi","short":"sans serif bold cap phi"},"mathspeak":{"default":"sans serif bold upper Phi"}},"key":"1D76B"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital chi","alternative":"sans serif bold capital chi","short":"sans serif bold cap chi"},"mathspeak":{"default":"sans serif bold upper Chi"}},"key":"1D76C"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital psi","alternative":"sans serif bold capital psi","short":"sans serif bold cap psi"},"mathspeak":{"default":"sans serif bold upper Psi"}},"key":"1D76D"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital omega","alternative":"sans serif bold capital omega","short":"sans serif bold cap omega"},"mathspeak":{"default":"sans serif bold upper Omega"}},"key":"1D76E"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small alpha","alternative":"sans serif bold small alpha","short":"sans serif bold alpha"}},"key":"1D770"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small beta","alternative":"sans serif bold small beta","short":"sans serif bold beta"}},"key":"1D771"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small gamma","alternative":"sans serif bold small gamma","short":"sans serif bold gamma"}},"key":"1D772"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small delta","alternative":"sans serif bold small delta","short":"sans serif bold delta"}},"key":"1D773"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small epsilon","alternative":"sans serif bold small epsilon","short":"sans serif bold epsilon"}},"key":"1D774"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small zeta","alternative":"sans serif bold small zeta","short":"sans serif bold zeta"}},"key":"1D775"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small eta","alternative":"sans serif bold small eta","short":"sans serif bold eta"}},"key":"1D776"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small theta","alternative":"sans serif bold small theta","short":"sans serif bold theta"}},"key":"1D777"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small iota","alternative":"sans serif bold small iota","short":"sans serif bold iota"}},"key":"1D778"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small kappa","alternative":"sans serif bold small kappa","short":"sans serif bold kappa"}},"key":"1D779"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small lamda","alternative":"sans serif bold small lamda","short":"sans serif bold lamda"}},"key":"1D77A"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small mu","alternative":"sans serif bold small mu","short":"sans serif bold mu"}},"key":"1D77B"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small nu","alternative":"sans serif bold small nu","short":"sans serif bold nu"}},"key":"1D77C"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small xi","alternative":"sans serif bold small xi","short":"sans serif bold xi"}},"key":"1D77D"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small omicron","alternative":"sans serif bold small omicron","short":"sans serif bold omicron"}},"key":"1D77E"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small pi","alternative":"sans serif bold small pi","short":"sans serif bold pi"}},"key":"1D77F"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small rho","alternative":"sans serif bold small rho","short":"sans serif bold rho"}},"key":"1D780"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small final sigma","alternative":"sans serif bold small final sigma","short":"sans serif bold final sigma"}},"key":"1D781"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small sigma","alternative":"sans serif bold small sigma","short":"sans serif bold sigma"}},"key":"1D782"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small tau","alternative":"sans serif bold small tau","short":"sans serif bold tau"}},"key":"1D783"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small upsilon","alternative":"sans serif bold small upsilon","short":"sans serif bold upsilon"}},"key":"1D784"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small phi","alternative":"sans serif bold small phi","short":"sans serif bold phi"}},"key":"1D785"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small chi","alternative":"sans serif bold small chi","short":"sans serif bold chi"}},"key":"1D786"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small psi","alternative":"sans serif bold small psi","short":"sans serif bold psi"}},"key":"1D787"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold small omega","alternative":"sans serif bold small omega","short":"sans serif bold omega"}},"key":"1D788"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-scripts.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-scripts.js
deleted file mode 100644
index e7022979..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-scripts.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","key":"1D26","mappings":{"default":{"default":"greek letter small capital gamma","alternative":"greek letter gamma","short":"small cap gamma"},"mathspeak":{"default":"small upper Gamma"}}},{"category":"Ll","key":"1D27","mappings":{"default":{"default":"greek letter small capital lamda","alternative":"greek letter lamda","short":"small cap lamda"},"mathspeak":{"default":"small upper Lamda"}}},{"category":"Ll","key":"1D28","mappings":{"default":{"default":"greek letter small capital pi","alternative":"greek letter pi","short":"small cap pi"},"mathspeak":{"default":"small upper Pi"}}},{"category":"Ll","key":"1D29","mappings":{"default":{"default":"greek letter small capital rho","alternative":"greek letter rho","short":"small cap rho"},"mathspeak":{"default":"small upper Rho"}}},{"category":"Ll","key":"1D2A","mappings":{"default":{"default":"greek letter small capital psi","alternative":"greek letter psi","short":"small cap psi"},"mathspeak":{"default":"small upper Psi"}}},{"category":"Lm","key":"1D5E","mappings":{"default":{"default":"modifier letter small greek gamma","alternative":"greek letter superscript gamma","short":"superscript gamma"}}},{"category":"Lm","key":"1D60","mappings":{"default":{"default":"modifier letter small greek phi","alternative":"greek letter superscript phi","short":"superscript phi"}}},{"category":"Lm","key":"1D66","mappings":{"default":{"default":"greek subscript small letter beta","short":"subscript beta"}}},{"category":"Lm","key":"1D67","mappings":{"default":{"default":"greek subscript small letter gamma","alternative":"greek letter gamma","short":"subscript gamma"}}},{"category":"Lm","key":"1D68","mappings":{"default":{"default":"greek subscript small letter rho","alternative":"greek letter rho","short":"subscript rho"}}},{"category":"Lm","key":"1D69","mappings":{"default":{"default":"greek subscript small letter phi","alternative":"greek letter phi","short":"subscript phi"}}},{"category":"Lm","key":"1D6A","mappings":{"default":{"default":"greek subscript small letter chi","alternative":"greek letter chi","short":"subscript chi"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-small.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-small.js
deleted file mode 100644
index 75843538..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-small.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","key":"03B1","mappings":{"default":{"default":"greek small letter alpha","short":"alpha"}}},{"category":"Ll","key":"03B2","mappings":{"default":{"default":"greek small letter beta","short":"beta"}}},{"category":"Ll","key":"03B3","mappings":{"default":{"default":"greek small letter gamma","short":"gamma"}}},{"category":"Ll","key":"03B4","mappings":{"default":{"default":"greek small letter delta","short":"delta"}}},{"category":"Ll","key":"03B5","mappings":{"default":{"default":"greek small letter epsilon","short":"epsilon"}}},{"category":"Ll","key":"03B6","mappings":{"default":{"default":"greek small letter zeta","short":"zeta"}}},{"category":"Ll","key":"03B7","mappings":{"default":{"default":"greek small letter eta","short":"eta"}}},{"category":"Ll","key":"03B8","mappings":{"default":{"default":"greek small letter theta","short":"theta"}}},{"category":"Ll","key":"03B9","mappings":{"default":{"default":"greek small letter iota","short":"iota"}}},{"category":"Ll","key":"03BA","mappings":{"default":{"default":"greek small letter kappa","short":"kappa"}}},{"category":"Ll","key":"03BB","mappings":{"default":{"default":"greek small letter lamda","alternative":"greek small letter lambda","short":"lamda"}}},{"category":"Ll","key":"03BC","mappings":{"default":{"default":"greek small letter mu","short":"mu"}}},{"category":"Ll","key":"03BD","mappings":{"default":{"default":"greek small letter nu","short":"nu"}}},{"category":"Ll","key":"03BE","mappings":{"default":{"default":"greek small letter xi","short":"xi"}}},{"category":"Ll","key":"03BF","mappings":{"default":{"default":"greek small letter omicron","short":"omicron"}}},{"category":"Ll","key":"03C0","mappings":{"default":{"default":"greek small letter pi","short":"pi"}}},{"category":"Ll","key":"03C1","mappings":{"default":{"default":"greek small letter rho","short":"rho"}}},{"category":"Ll","key":"03C2","mappings":{"default":{"default":"greek small letter final sigma","short":"final sigma"}}},{"category":"Ll","key":"03C3","mappings":{"default":{"default":"greek small letter sigma","short":"sigma"}}},{"category":"Ll","key":"03C4","mappings":{"default":{"default":"greek small letter tau","short":"tau"}}},{"category":"Ll","key":"03C5","mappings":{"default":{"default":"greek small letter upsilon","short":"upsilon"}}},{"category":"Ll","key":"03C6","mappings":{"default":{"default":"greek small letter phi","short":"phi"}}},{"category":"Ll","key":"03C7","mappings":{"default":{"default":"greek small letter chi","short":"chi"}}},{"category":"Ll","key":"03C8","mappings":{"default":{"default":"greek small letter psi","short":"psi"}}},{"category":"Ll","key":"03C9","mappings":{"default":{"default":"greek small letter omega","short":"omega"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-symbols.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-symbols.js
deleted file mode 100644
index 6c1b569e..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/greek-symbols.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","mappings":{"default":{"default":"greek beta symbol","alternative":"greek small letter curled beta","short":"beta"}},"key":"03D0"},{"category":"Ll","mappings":{"default":{"default":"greek theta symbol","alternative":"greek small letter script theta","short":"theta"}},"key":"03D1"},{"category":"Ll","mappings":{"default":{"default":"greek phi symbol","alternative":"greek small letter script phi","short":"phi"}},"key":"03D5"},{"category":"Ll","mappings":{"default":{"default":"greek pi symbol","alternative":"greek small letter omega pi","short":"pi"}},"key":"03D6"},{"category":"Ll","mappings":{"default":{"default":"greek kai symbol","short":"kai"}},"key":"03D7"},{"category":"Ll","mappings":{"default":{"default":"greek kappa symbol","alternative":"greek small letter script kappa","short":"kappa"}},"key":"03F0"},{"category":"Ll","mappings":{"default":{"default":"greek rho symbol","alternative":"greek small letter tailed rho","short":"rho"}},"key":"03F1"},{"category":"Ll","mappings":{"default":{"default":"greek lunate epsilon symbol","short":"epsilon"}},"key":"03F5"},{"category":"Sm","mappings":{"default":{"default":"greek reversed lunate epsilon symbol","short":"reversed epsilon"}},"key":"03F6"},{"category":"Lu","mappings":{"default":{"default":"greek capital theta symbol","short":"cap theta"},"mathspeak":{"default":"upper Theta"}},"key":"03F4"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital theta symbol","alternative":"bold capital theta","short":"bold cap theta"},"mathspeak":{"default":"bold upper Theta"}},"key":"1D6B9"},{"category":"Lu","mappings":{"default":{"default":"mathematical italic capital theta symbol","alternative":"italic capital theta","short":"italic cap theta"},"mathspeak":{"default":"italic upper Theta"}},"key":"1D6F3"},{"category":"Lu","mappings":{"default":{"default":"mathematical sans serif bold capital theta symbol","alternative":"sans serif bold capital theta","short":"sans serif bold cap theta"},"mathspeak":{"default":"sans serif bold upper Theta"}},"key":"1D767"},{"category":"Sm","mappings":{"default":{"default":"mathematical bold nabla","alternative":"bold nabla"}},"key":"1D6C1"},{"category":"Sm","mappings":{"default":{"default":"mathematical bold partial differential","alternative":"bold partial differential","short":"bold partial differential"}},"key":"1D6DB"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold epsilon symbol","alternative":"bold epsilon","short":"bold epsilon"}},"key":"1D6DC"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold theta symbol","alternative":"bold theta","short":"bold theta"}},"key":"1D6DD"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold kappa symbol","alternative":"bold kappa","short":"bold kappa"}},"key":"1D6DE"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold phi symbol","alternative":"bold phi","short":"bold phi"}},"key":"1D6DF"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold rho symbol","alternative":"bold rho","short":"bold rho"}},"key":"1D6E0"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold pi symbol","alternative":"bold pi","short":"bold pi"}},"key":"1D6E1"},{"category":"Sm","mappings":{"default":{"default":"mathematical italic nabla","alternative":"italic nabla","short":"italic nabla"}},"key":"1D6FB"},{"category":"Sm","mappings":{"default":{"default":"mathematical italic partial differential","alternative":"italic partial differential","short":"italic partial differential"}},"key":"1D715"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic epsilon symbol","alternative":"italic epsilon","short":"italic epsilon"}},"key":"1D716"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic theta symbol","alternative":"italic theta","short":"italic theta"}},"key":"1D717"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic kappa symbol","alternative":"italic kappa","short":"italic kappa"}},"key":"1D718"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic phi symbol","alternative":"italic phi","short":"italic phi"}},"key":"1D719"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic rho symbol","alternative":"italic rho","short":"italic rho"}},"key":"1D71A"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic pi symbol","alternative":"italic pi","short":"italic pi"}},"key":"1D71B"},{"category":"Sm","mappings":{"default":{"default":"mathematical sans serif bold nabla","alternative":"sans serif bold nabla","short":"sans serif bold nabla"}},"key":"1D76F"},{"category":"Sm","mappings":{"default":{"default":"mathematical sans serif bold partial differential","alternative":"sans serif bold partial differential","short":"sans serif bold partial differential"}},"key":"1D789"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold epsilon symbol","alternative":"sans serif bold epsilon","short":"sans serif bold epsilon"}},"key":"1D78A"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold theta symbol","alternative":"sans serif bold theta","short":"sans serif bold theta"}},"key":"1D78B"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold kappa symbol","alternative":"sans serif bold kappa","short":"sans serif bold kappa"}},"key":"1D78C"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold phi symbol","alternative":"sans serif bold phi","short":"sans serif bold phi"}},"key":"1D78D"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold rho symbol","alternative":"sans serif bold rho","short":"sans serif bold rho"}},"key":"1D78E"},{"category":"Ll","mappings":{"default":{"default":"mathematical sans serif bold pi symbol","alternative":"sans serif bold pi","short":"sans serif bold pi"}},"key":"1D78F"},{"category":"Lu","mappings":{"default":{"default":"mathematical bold capital digamma","alternative":"bold capital digamma","short":"bold cap digamma"},"mathspeak":{"default":"bold upper Digamma"}},"key":"1D7CA"},{"category":"Ll","mappings":{"default":{"default":"mathematical bold small digamma","alternative":"bold small digamma","short":"bold digamma"}},"key":"1D7CB"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/hebrew_letters.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/hebrew_letters.js
deleted file mode 100644
index 7805a7da..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/hebrew_letters.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lo","mappings":{"default":{"default":"alef symbol","alternative":"first transfinite cardinal","short":"alef"}},"key":"2135"},{"category":"Lo","mappings":{"default":{"default":"bet symbol","alternative":"second transfinite cardinal","short":"bet"}},"key":"2136"},{"category":"Lo","mappings":{"default":{"default":"gimel symbol","alternative":"third transfinite cardinal","short":"gimel"}},"key":"2137"},{"category":"Lo","mappings":{"default":{"default":"dalet symbol","alternative":"fourth transfinite cardinal","short":"dalet"}},"key":"2138"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-double-accent.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-double-accent.js
deleted file mode 100644
index e547c4a6..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-double-accent.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","key":"01D6","mappings":{"default":{"default":"latin small letter u with diaeresis and macron","alternative":"latin small letter u double overdot overbar","short":"u double overdot overbar"}}},{"category":"Ll","key":"01D8","mappings":{"default":{"default":"latin small letter u with diaeresis and acute","alternative":"latin small letter u double overdot acute","short":"u double overdot acute"}}},{"category":"Ll","key":"01DA","mappings":{"default":{"default":"latin small letter u with diaeresis and caron","alternative":"latin small letter u double overdot hacek","short":"u double overdot caron"}}},{"category":"Ll","key":"01DC","mappings":{"default":{"default":"latin small letter u with diaeresis and grave","alternative":"latin small letter u double overdot grave","short":"u double overdot grave"}}},{"category":"Ll","key":"01DF","mappings":{"default":{"default":"latin small letter a with diaeresis and macron","alternative":"latin small letter a double overdot overbar","short":"a double overdot overbar"}}},{"category":"Ll","key":"01E1","mappings":{"default":{"default":"latin small letter a with dot above and macron","alternative":"latin small letter a dot overbar","short":"a overdot overbar"}}},{"category":"Ll","key":"01ED","mappings":{"default":{"default":"latin small letter o with ogonek and macron","alternative":"latin small letter o ogonek overbar","short":"o ogonek overbar"}}},{"category":"Ll","key":"01FB","mappings":{"default":{"default":"latin small letter a with ring above and acute","alternative":"latin small letter a ring above acute","short":"a ring above acute"}}},{"category":"Ll","key":"022B","mappings":{"default":{"default":"latin small letter o with diaeresis and macron","alternative":"latin small letter o double overdot overbar","short":"o double overdot overbar"}}},{"category":"Ll","key":"022D","mappings":{"default":{"default":"latin small letter o with tilde and macron","alternative":"latin small letter o tilde overbar","short":"o tilde overbar"}}},{"category":"Ll","key":"0231","mappings":{"default":{"default":"latin small letter o with dot above and macron","alternative":"latin small letter o overdot overbar","short":"o overdot overbar"}}},{"category":"Ll","key":"1E09","mappings":{"default":{"default":"latin small letter c with cedilla and acute","alternative":"latin small letter c cedilla acute","short":"c cedilla acute"}}},{"category":"Ll","key":"1E15","mappings":{"default":{"default":"latin small letter e with macron and grave","alternative":"latin small letter e overbar grave","short":"e overbar grave"}}},{"category":"Ll","key":"1E17","mappings":{"default":{"default":"latin small letter e with macron and acute","alternative":"latin small letter e overbar acute","short":"e overbar acute"}}},{"category":"Ll","key":"1E1D","mappings":{"default":{"default":"latin small letter e with cedilla and breve","alternative":"latin small letter e cedilla breve","short":"e cedilla breve"}}},{"category":"Ll","key":"1E2F","mappings":{"default":{"default":"latin small letter i with diaeresis and acute","alternative":"latin small letter i double overdot acute","short":"i double overdot acute"}}},{"category":"Ll","key":"1E39","mappings":{"default":{"default":"latin small letter l with dot below and macron","alternative":"latin small letter l underdot overbar","short":"l underdot overbar"}}},{"category":"Ll","key":"1E4D","mappings":{"default":{"default":"latin small letter o with tilde and acute","alternative":"latin small letter o tilde acute","short":"o tilde acute"}}},{"category":"Ll","key":"1E4F","mappings":{"default":{"default":"latin small letter o with tilde and diaeresis","alternative":"latin small letter o tilde double overdot","short":"o tilde double overdot"}}},{"category":"Ll","key":"1E51","mappings":{"default":{"default":"latin small letter o with macron and grave","alternative":"latin small letter o overbar grave","short":"o overbar grave"}}},{"category":"Ll","key":"1E53","mappings":{"default":{"default":"latin small letter o with macron and acute","alternative":"latin small letter o overbar acute","short":"o overbar acute"}}},{"category":"Ll","key":"1E5D","mappings":{"default":{"default":"latin small letter r with dot below and macron","alternative":"latin small letter r underdot overbar","short":"r underdot overbar"}}},{"category":"Ll","key":"1E65","mappings":{"default":{"default":"latin small letter s with acute and dot above","alternative":"latin small letter s acute overdot","short":"s acute overdot"}}},{"category":"Ll","key":"1E67","mappings":{"default":{"default":"latin small letter s with caron and dot above","alternative":"latin small letter s caron overdot","short":"s caron overdot"}}},{"category":"Ll","key":"1E69","mappings":{"default":{"default":"latin small letter s with dot below and dot above","alternative":"latin small letter s underdot overdot","short":"s underdot overdot"}}},{"category":"Ll","key":"1E79","mappings":{"default":{"default":"latin small letter u with tilde and acute","alternative":"latin small letter u tilde acute","short":"u tilde acute"}}},{"category":"Ll","key":"1E7B","mappings":{"default":{"default":"latin small letter u with macron and diaeresis","alternative":"latin small letter u overbar double overdot","short":"u overbar double overdot"}}},{"category":"Ll","key":"1EA5","mappings":{"default":{"default":"latin small letter a with circumflex and acute","alternative":"latin small letter a hat acute","short":"a hat acute"}}},{"category":"Ll","key":"1EA7","mappings":{"default":{"default":"latin small letter a with circumflex and grave","alternative":"latin small letter a hat grave","short":"a hat grave"}}},{"category":"Ll","key":"1EA9","mappings":{"default":{"default":"latin small letter a with circumflex and hook above","alternative":"latin small letter a hat hook above","short":"a hat hook above"}}},{"category":"Ll","key":"1EAB","mappings":{"default":{"default":"latin small letter a with circumflex and tilde","alternative":"latin small letter a hat tilde","short":"a hat tilde"}}},{"category":"Ll","key":"1EAD","mappings":{"default":{"default":"latin small letter a with circumflex and dot below","alternative":"latin small letter a hat underdot","short":"a hat underdot"}}},{"category":"Ll","key":"1EAF","mappings":{"default":{"default":"latin small letter a with breve and acute","alternative":"latin small letter a breve acute","short":"a breve acute"}}},{"category":"Ll","key":"1EB1","mappings":{"default":{"default":"latin small letter a with breve and grave","alternative":"latin small letter a breve grave","short":"a breve grave"}}},{"category":"Ll","key":"1EB3","mappings":{"default":{"default":"latin small letter a with breve and hook above","alternative":"latin small letter a breve hook above","short":"a breve hook above"}}},{"category":"Ll","key":"1EB5","mappings":{"default":{"default":"latin small letter a with breve and tilde","alternative":"latin small letter a breve tilde","short":"a breve tilde"}}},{"category":"Ll","key":"1EB7","mappings":{"default":{"default":"latin small letter a with breve and dot below","alternative":"latin small letter a breve underdot","short":"a breve underdot"}}},{"category":"Ll","key":"1EBF","mappings":{"default":{"default":"latin small letter e with circumflex and acute","alternative":"latin small letter e hat acute","short":"e hat acute"}}},{"category":"Ll","key":"1EC1","mappings":{"default":{"default":"latin small letter e with circumflex and grave","alternative":"latin small letter e hat grave","short":"e hat grave"}}},{"category":"Ll","key":"1EC3","mappings":{"default":{"default":"latin small letter e with circumflex and hook above","alternative":"latin small letter e hat hook above","short":"e hat hook above"}}},{"category":"Ll","key":"1EC5","mappings":{"default":{"default":"latin small letter e with circumflex and tilde","alternative":"latin small letter e hat tilde","short":"e hat tilde"}}},{"category":"Ll","key":"1EC7","mappings":{"default":{"default":"latin small letter e with circumflex and dot below","alternative":"latin small letter e hat underdot","short":"e hat underdot"}}},{"category":"Ll","key":"1ED1","mappings":{"default":{"default":"latin small letter o with circumflex and acute","alternative":"latin small letter o hat acute","short":"o hat acute"}}},{"category":"Ll","key":"1ED3","mappings":{"default":{"default":"latin small letter o with circumflex and grave","alternative":"latin small letter o hat grave","short":"o hat grave"}}},{"category":"Ll","key":"1ED5","mappings":{"default":{"default":"latin small letter o with circumflex and hook above","alternative":"latin small letter o hat hook above","short":"o hat hook above"}}},{"category":"Ll","key":"1ED7","mappings":{"default":{"default":"latin small letter o with circumflex and tilde","alternative":"latin small letter o hat tilde","short":"o hat tilde"}}},{"category":"Ll","key":"1ED9","mappings":{"default":{"default":"latin small letter o with circumflex and dot below","alternative":"latin small letter o hat underdot","short":"o hat underdot"}}},{"category":"Ll","key":"1EDB","mappings":{"default":{"default":"latin small letter o with horn and acute","alternative":"latin small letter o acute prime","short":"o acute prime"}}},{"category":"Ll","key":"1EDD","mappings":{"default":{"default":"latin small letter o with horn and grave","alternative":"latin small letter o grave prime","short":"o grave prime"}}},{"category":"Ll","key":"1EDF","mappings":{"default":{"default":"latin small letter o with horn and hook above","alternative":"latin small letter o hook above prime","short":"o hook above prime"}}},{"category":"Ll","key":"1EE1","mappings":{"default":{"default":"latin small letter o with horn and tilde","alternative":"latin small letter o tilde prime","short":"o tilde prime"}}},{"category":"Ll","key":"1EE3","mappings":{"default":{"default":"latin small letter o with horn and dot below","alternative":"latin small letter o underdot prime","short":"o underdot prime"}}},{"category":"Ll","key":"1EE9","mappings":{"default":{"default":"latin small letter u with horn and acute","alternative":"latin small letter u acute prime","short":"u acute prime"}}},{"category":"Ll","key":"1EEB","mappings":{"default":{"default":"latin small letter u with horn and grave","alternative":"latin small letter u grave prime","short":"u grave prime"}}},{"category":"Ll","key":"1EED","mappings":{"default":{"default":"latin small letter u with horn and hook above","alternative":"latin small letter u hook above prime","short":"u hook above prime"}}},{"category":"Ll","key":"1EEF","mappings":{"default":{"default":"latin small letter u with horn and tilde","alternative":"latin small letter u tilde prime","short":"u tilde prime"}}},{"category":"Ll","key":"1EF1","mappings":{"default":{"default":"latin small letter u with horn and dot below","alternative":"latin small letter u underdot prime","short":"u underdot prime"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-normal.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-normal.js
deleted file mode 100644
index 22eb1733..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-normal.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","key":"0061","mappings":{"default":{"default":"latin small letter a","short":"a"}}},{"category":"Ll","key":"0062","mappings":{"default":{"default":"latin small letter b","short":"b"}}},{"category":"Ll","key":"0063","mappings":{"default":{"default":"latin small letter c","short":"c"}}},{"category":"Ll","key":"0064","mappings":{"default":{"default":"latin small letter d","short":"d"}}},{"category":"Ll","key":"0065","mappings":{"default":{"default":"latin small letter e","short":"e"}}},{"category":"Ll","key":"0066","mappings":{"default":{"default":"latin small letter f","short":"f"}}},{"category":"Ll","key":"0067","mappings":{"default":{"default":"latin small letter g","short":"g"}}},{"category":"Ll","key":"0068","mappings":{"default":{"default":"latin small letter h","short":"h"}}},{"category":"Ll","key":"0069","mappings":{"default":{"default":"latin small letter i","short":"i"}}},{"category":"Ll","key":"006A","mappings":{"default":{"default":"latin small letter j","short":"j"}}},{"category":"Ll","key":"006B","mappings":{"default":{"default":"latin small letter k","short":"k"}}},{"category":"Ll","key":"006C","mappings":{"default":{"default":"latin small letter l","short":"l"}}},{"category":"Ll","key":"006D","mappings":{"default":{"default":"latin small letter m","short":"m"}}},{"category":"Ll","key":"006E","mappings":{"default":{"default":"latin small letter n","short":"n"}}},{"category":"Ll","key":"006F","mappings":{"default":{"default":"latin small letter o","short":"o"}}},{"category":"Ll","key":"0070","mappings":{"default":{"default":"latin small letter p","short":"p"}}},{"category":"Ll","key":"0071","mappings":{"default":{"default":"latin small letter q","short":"q"}}},{"category":"Ll","key":"0072","mappings":{"default":{"default":"latin small letter r","short":"r"}}},{"category":"Ll","key":"0073","mappings":{"default":{"default":"latin small letter s","short":"s"}}},{"category":"Ll","key":"0074","mappings":{"default":{"default":"latin small letter t","short":"t"}}},{"category":"Ll","key":"0075","mappings":{"default":{"default":"latin small letter u","short":"u"}}},{"category":"Ll","key":"0076","mappings":{"default":{"default":"latin small letter v","short":"v"}}},{"category":"Ll","key":"0077","mappings":{"default":{"default":"latin small letter w","short":"w"}}},{"category":"Ll","key":"0078","mappings":{"default":{"default":"latin small letter x","short":"x"}}},{"category":"Ll","key":"0079","mappings":{"default":{"default":"latin small letter y","short":"y"}}},{"category":"Ll","key":"007A","mappings":{"default":{"default":"latin small letter z","short":"z"}}},{"category":"Ll","key":"FF41","mappings":{"default":{"default":"fullwidth latin small letter a","short":"a"}}},{"category":"Ll","key":"FF42","mappings":{"default":{"default":"fullwidth latin small letter b","short":"b"}}},{"category":"Ll","key":"FF43","mappings":{"default":{"default":"fullwidth latin small letter c","short":"c"}}},{"category":"Ll","key":"FF44","mappings":{"default":{"default":"fullwidth latin small letter d","short":"d"}}},{"category":"Ll","key":"FF45","mappings":{"default":{"default":"fullwidth latin small letter e","short":"e"}}},{"category":"Ll","key":"FF46","mappings":{"default":{"default":"fullwidth latin small letter f","short":"f"}}},{"category":"Ll","key":"FF47","mappings":{"default":{"default":"fullwidth latin small letter g","short":"g"}}},{"category":"Ll","key":"FF48","mappings":{"default":{"default":"fullwidth latin small letter h","short":"h"}}},{"category":"Ll","key":"FF49","mappings":{"default":{"default":"fullwidth latin small letter i","short":"i"}}},{"category":"Ll","key":"FF4A","mappings":{"default":{"default":"fullwidth latin small letter j","short":"j"}}},{"category":"Ll","key":"FF4B","mappings":{"default":{"default":"fullwidth latin small letter k","short":"k"}}},{"category":"Ll","key":"FF4C","mappings":{"default":{"default":"fullwidth latin small letter l","short":"l"}}},{"category":"Ll","key":"FF4D","mappings":{"default":{"default":"fullwidth latin small letter m","short":"m"}}},{"category":"Ll","key":"FF4E","mappings":{"default":{"default":"fullwidth latin small letter n","short":"n"}}},{"category":"Ll","key":"FF4F","mappings":{"default":{"default":"fullwidth latin small letter o","short":"o"}}},{"category":"Ll","key":"FF50","mappings":{"default":{"default":"fullwidth latin small letter p","short":"p"}}},{"category":"Ll","key":"FF51","mappings":{"default":{"default":"fullwidth latin small letter q","short":"q"}}},{"category":"Ll","key":"FF52","mappings":{"default":{"default":"fullwidth latin small letter r","short":"r"}}},{"category":"Ll","key":"FF53","mappings":{"default":{"default":"fullwidth latin small letter s","short":"s"}}},{"category":"Ll","key":"FF54","mappings":{"default":{"default":"fullwidth latin small letter t","short":"t"}}},{"category":"Ll","key":"FF55","mappings":{"default":{"default":"fullwidth latin small letter u","short":"u"}}},{"category":"Ll","key":"FF56","mappings":{"default":{"default":"fullwidth latin small letter v","short":"v"}}},{"category":"Ll","key":"FF57","mappings":{"default":{"default":"fullwidth latin small letter w","short":"w"}}},{"category":"Ll","key":"FF58","mappings":{"default":{"default":"fullwidth latin small letter x","short":"x"}}},{"category":"Ll","key":"FF59","mappings":{"default":{"default":"fullwidth latin small letter y","short":"y"}}},{"category":"Ll","key":"FF5A","mappings":{"default":{"default":"fullwidth latin small letter z","short":"z"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-phonetic.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-phonetic.js
deleted file mode 100644
index 17e8e55b..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-phonetic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","key":"00F8","mappings":{"default":{"default":"latin small letter o with stroke","alternative":"latin small letter o slash","short":"o with stroke"}}},{"category":"Ll","key":"0111","mappings":{"default":{"default":"latin small letter d with stroke","alternative":"latin small letter d bar","short":"d with stroke"}}},{"category":"Ll","key":"0127","mappings":{"default":{"default":"latin small letter h with stroke","alternative":"latin small letter h bar","short":"h with stroke"}}},{"category":"Ll","key":"0142","mappings":{"default":{"default":"latin small letter l with stroke","alternative":"latin small letter l slash","short":"l with stroke"}}},{"category":"Ll","key":"0167","mappings":{"default":{"default":"latin small letter t with stroke","alternative":"latin small letter t bar","short":"t with stroke"}}},{"category":"Ll","key":"0180","mappings":{"default":{"default":"latin small letter b with stroke","alternative":"latin small letter b bar","short":"b with stroke"}}},{"category":"Ll","key":"019B","mappings":{"default":{"default":"latin small letter lambda with stroke","alternative":"latin small letter barred lambda","short":"lambda with stroke"}}},{"category":"Ll","key":"01B6","mappings":{"default":{"default":"latin small letter z with stroke","alternative":"latin small letter z bar","short":"z with stroke"}}},{"category":"Ll","key":"01BE","mappings":{"default":{"default":"latin letter inverted glottal stop with stroke","alternative":"latin letter inverted glottal stop bar","short":"latin letter inverted glottal stop with stroke"}}},{"category":"Ll","key":"01E5","mappings":{"default":{"default":"latin small letter g with stroke","alternative":"latin small letter g bar","short":"g with stroke"}}},{"category":"Ll","key":"01FF","mappings":{"default":{"default":"latin small letter o with stroke and acute","short":"o with stroke and acute"}}},{"category":"Ll","key":"023C","mappings":{"default":{"default":"latin small letter c with stroke","short":"c with stroke"}}},{"category":"Ll","key":"0247","mappings":{"default":{"default":"latin small letter e with stroke","short":"e with stroke"}}},{"category":"Ll","key":"0249","mappings":{"default":{"default":"latin small letter j with stroke","short":"j with stroke"}}},{"category":"Ll","key":"024D","mappings":{"default":{"default":"latin small letter r with stroke","short":"r with stroke"}}},{"category":"Ll","key":"024F","mappings":{"default":{"default":"latin small letter y with stroke","short":"y with stroke"}}},{"category":"Ll","key":"025F","mappings":{"default":{"default":"latin small letter dotless j with stroke","alternative":"latin small letter dotless j bar","short":"dotless j with stroke"}}},{"category":"Ll","key":"0268","mappings":{"default":{"default":"latin small letter i with stroke","alternative":"latin small letter barred i","short":"i with stroke"}}},{"category":"Ll","key":"0284","mappings":{"default":{"default":"latin small letter dotless j with stroke and hook","alternative":"latin small letter dotless j bar hook","short":"dotless j with stroke and hook"}}},{"category":"Ll","key":"02A1","mappings":{"default":{"default":"latin letter glottal stop with stroke","alternative":"latin letter glottal stop bar","short":"latin letter glottal stop with stroke"}}},{"category":"Ll","key":"02A2","mappings":{"default":{"default":"latin letter reversed glottal stop with stroke","alternative":"latin letter reversed glottal stop bar","short":"latin letter reversed glottal stop with stroke"}}},{"category":"Ll","key":"1D13","mappings":{"default":{"default":"latin small letter sideways o with stroke","short":"sideways o with stroke"}}},{"category":"Ll","key":"1D7C","mappings":{"default":{"default":"latin small letter iota with stroke","short":"iota with stroke"}}},{"category":"Ll","key":"1D7D","mappings":{"default":{"default":"latin small letter p with stroke","short":"p with stroke"}}},{"category":"Ll","key":"1D7F","mappings":{"default":{"default":"latin small letter upsilon with stroke","short":"upsilon with stroke"}}},{"category":"Ll","key":"1E9C","mappings":{"default":{"default":"latin small letter long s with diagonal stroke","short":"long s with diagonal stroke"}}},{"category":"Ll","key":"1E9D","mappings":{"default":{"default":"latin small letter long s with high stroke","short":"long s with high stroke"}}},{"category":"Ll","key":"018D","mappings":{"default":{"default":"latin small letter turned delta","short":"turned delta"}}},{"category":"Ll","key":"1E9B","mappings":{"default":{"default":"latin small letter long s with dot above","short":"long s with dot above"}}},{"category":"Ll","key":"1E9F","mappings":{"default":{"default":"latin small letter delta","short":"delta"}}},{"category":"Ll","key":"0138","mappings":{"default":{"default":"latin small letter kra","short":"kra"}}},{"category":"Ll","key":"017F","mappings":{"default":{"default":"latin small letter long s","short":"long s"}}},{"category":"Ll","key":"0183","mappings":{"default":{"default":"latin small letter b with topbar","alternative":"latin small letter b topbar","short":"b with topbar"}}},{"category":"Ll","key":"0185","mappings":{"default":{"default":"latin small letter tone six","short":"tone six"}}},{"category":"Ll","key":"0188","mappings":{"default":{"default":"latin small letter c with hook","alternative":"latin small letter c hook","short":"c with hook"}}},{"category":"Ll","key":"018C","mappings":{"default":{"default":"latin small letter d with topbar","alternative":"latin small letter d topbar","short":"d with topbar"}}},{"category":"Ll","key":"0192","mappings":{"default":{"default":"latin small letter f with hook","alternative":"latin small letter script f","short":"f with hook"}}},{"category":"Ll","key":"0195","mappings":{"default":{"default":"latin small letter hv","alternative":"latin small letter h v","short":"hv"}}},{"category":"Ll","key":"0199","mappings":{"default":{"default":"latin small letter k with hook","alternative":"latin small letter k hook","short":"k with hook"}}},{"category":"Ll","key":"019A","mappings":{"default":{"default":"latin small letter l with bar","alternative":"latin small letter barred l","short":"l with bar"}}},{"category":"Ll","key":"019E","mappings":{"default":{"default":"latin small letter n with long right leg","short":"n with long right leg"}}},{"category":"Ll","key":"01A1","mappings":{"default":{"default":"latin small letter o with horn","alternative":"latin small letter o horn","short":"o with horn"}}},{"category":"Ll","key":"01A3","mappings":{"default":{"default":"latin small letter oi","alternative":"latin small letter o i","short":"oi"}}},{"category":"Ll","key":"01A5","mappings":{"default":{"default":"latin small letter p with hook","alternative":"latin small letter p hook","short":"p with hook"}}},{"category":"Ll","key":"01A8","mappings":{"default":{"default":"latin small letter tone two","short":"tone two"}}},{"category":"Ll","key":"01AA","mappings":{"default":{"default":"latin letter reversed esh loop","short":"latin letter reversed esh loop"}}},{"category":"Ll","key":"01AB","mappings":{"default":{"default":"latin small letter t with palatal hook","alternative":"latin small letter t palatal hook","short":"t with palatal hook"}}},{"category":"Ll","key":"01AD","mappings":{"default":{"default":"latin small letter t with hook","alternative":"latin small letter t hook","short":"t with hook"}}},{"category":"Ll","key":"01B0","mappings":{"default":{"default":"latin small letter u with horn","alternative":"latin small letter u horn","short":"u with horn"}}},{"category":"Ll","key":"01B4","mappings":{"default":{"default":"latin small letter y with hook","alternative":"latin small letter y hook","short":"y with hook"}}},{"category":"Ll","key":"01B9","mappings":{"default":{"default":"latin small letter ezh reversed","alternative":"latin small letter reversed yogh","short":"ezh reversed"}}},{"category":"Ll","key":"01BA","mappings":{"default":{"default":"latin small letter ezh with tail","alternative":"latin small letter yogh with tail","short":"ezh with tail"}}},{"category":"Ll","key":"01BD","mappings":{"default":{"default":"latin small letter tone five","short":"tone five"}}},{"category":"Ll","key":"01BF","mappings":{"default":{"default":"latin letter wynn","short":"latin letter wynn"}}},{"category":"Ll","key":"01C6","mappings":{"default":{"default":"latin small letter dz with caron","alternative":"latin small letter d z hacek","short":"dz with caron"}}},{"category":"Ll","key":"01C9","mappings":{"default":{"default":"latin small letter lj","alternative":"latin small letter l j","short":"lj"}}},{"category":"Ll","key":"01CC","mappings":{"default":{"default":"latin small letter nj","alternative":"latin small letter n j","short":"nj"}}},{"category":"Ll","key":"01E3","mappings":{"default":{"default":"latin small letter ae with macron","alternative":"latin small letter a e macron","short":"ae with macron"}}},{"category":"Ll","key":"01EF","mappings":{"default":{"default":"latin small letter ezh with caron","alternative":"latin small letter yogh hacek","short":"ezh with caron"}}},{"category":"Ll","key":"01F3","mappings":{"default":{"default":"latin small letter dz","short":"dz"}}},{"category":"Ll","key":"021D","mappings":{"default":{"default":"latin small letter yogh","short":"yogh"}}},{"category":"Ll","key":"026E","mappings":{"default":{"default":"latin small letter lezh","alternative":"latin small letter l yogh","short":"lezh"}}},{"category":"Ll","key":"0292","mappings":{"default":{"default":"latin small letter ezh","alternative":"latin small letter yogh","short":"ezh"}}},{"category":"Ll","key":"0293","mappings":{"default":{"default":"latin small letter ezh with curl","alternative":"latin small letter yogh curl","short":"ezh with curl"}}},{"category":"Ll","key":"02A4","mappings":{"default":{"default":"latin small letter dezh digraph","alternative":"latin small letter d yogh","short":"dezh digraph"}}},{"category":"Ll","key":"01DD","mappings":{"default":{"default":"latin small letter turned e","short":"turned e"}}},{"category":"Ll","key":"01FD","mappings":{"default":{"default":"latin small letter ae with acute","short":"ae with acute"}}},{"category":"Ll","key":"021D","mappings":{"default":{"default":"latin small letter yogh","short":"yogh"}}},{"category":"Ll","key":"0221","mappings":{"default":{"default":"latin small letter d with curl","short":"d with curl"}}},{"category":"Ll","key":"0223","mappings":{"default":{"default":"latin small letter ou","short":"ou"}}},{"category":"Ll","key":"0225","mappings":{"default":{"default":"latin small letter z with hook","short":"z with hook"}}},{"category":"Ll","key":"0234","mappings":{"default":{"default":"latin small letter l with curl","short":"l with curl"}}},{"category":"Ll","key":"0235","mappings":{"default":{"default":"latin small letter n with curl","short":"n with curl"}}},{"category":"Ll","key":"0236","mappings":{"default":{"default":"latin small letter t with curl","short":"t with curl"}}},{"category":"Ll","key":"0238","mappings":{"default":{"default":"latin small letter db digraph","short":"db digraph"}}},{"category":"Ll","key":"0239","mappings":{"default":{"default":"latin small letter qp digraph","short":"qp digraph"}}},{"category":"Ll","key":"023F","mappings":{"default":{"default":"latin small letter s with swash tail","short":"s with swash tail"}}},{"category":"Ll","key":"0240","mappings":{"default":{"default":"latin small letter z with swash tail","short":"z with swash tail"}}},{"category":"Ll","key":"0242","mappings":{"default":{"default":"latin small letter glottal stop","short":"glottal stop"}}},{"category":"Ll","key":"024B","mappings":{"default":{"default":"latin small letter q with hook tail","short":"q with hook tail"}}},{"category":"Ll","key":"0250","mappings":{"default":{"default":"latin small letter turned a","short":"turned a"}}},{"category":"Ll","key":"0251","mappings":{"default":{"default":"latin small letter alpha","alternative":"latin small letter script a","short":"alpha"}}},{"category":"Ll","key":"0252","mappings":{"default":{"default":"latin small letter turned alpha","alternative":"latin small letter turned script a","short":"turned alpha"}}},{"category":"Ll","key":"0253","mappings":{"default":{"default":"latin small letter b with hook","alternative":"latin small letter b hook","short":"b with hook"}}},{"category":"Ll","key":"0254","mappings":{"default":{"default":"latin small letter open o","short":"open o"}}},{"category":"Ll","key":"0255","mappings":{"default":{"default":"latin small letter c with curl","alternative":"latin small letter c curl","short":"c with curl"}}},{"category":"Ll","key":"0256","mappings":{"default":{"default":"latin small letter d with tail","alternative":"latin small letter d retroflex hook","short":"d with tail"}}},{"category":"Ll","key":"0257","mappings":{"default":{"default":"latin small letter d with hook","alternative":"latin small letter d hook","short":"d with hook"}}},{"category":"Ll","key":"0258","mappings":{"default":{"default":"latin small letter reversed e","short":"reversed e"}}},{"category":"Ll","key":"0259","mappings":{"default":{"default":"latin small letter schwa","short":"schwa"}}},{"category":"Ll","key":"025A","mappings":{"default":{"default":"latin small letter schwa with hook","alternative":"latin small letter schwa hook","short":"schwa with hook"}}},{"category":"Ll","key":"025B","mappings":{"default":{"default":"latin small letter open e","alternative":"latin small letter epsilon","short":"open e"}}},{"category":"Ll","key":"025C","mappings":{"default":{"default":"latin small letter reversed open e","alternative":"latin small letter reversed epsilon","short":"reversed open e"}}},{"category":"Ll","key":"025D","mappings":{"default":{"default":"latin small letter reversed open e with hook","alternative":"latin small letter reversed epsilon hook","short":"reversed open e with hook"}}},{"category":"Ll","key":"025E","mappings":{"default":{"default":"latin small letter closed reversed open e","alternative":"latin small letter closed reversed epsilon","short":"closed reversed open e"}}},{"category":"Ll","key":"0260","mappings":{"default":{"default":"latin small letter g with hook","alternative":"latin small letter g hook","short":"g with hook"}}},{"category":"Ll","key":"0261","mappings":{"default":{"default":"latin small letter script g","short":"script g"}}},{"category":"Ll","key":"0263","mappings":{"default":{"default":"latin small letter gamma","short":"gamma"}}},{"category":"Ll","key":"0264","mappings":{"default":{"default":"latin small letter rams horn","alternative":"latin small letter baby gamma","short":"rams horn"}}},{"category":"Ll","key":"0265","mappings":{"default":{"default":"latin small letter turned h","short":"turned h"}}},{"category":"Ll","key":"0266","mappings":{"default":{"default":"latin small letter h with hook","alternative":"latin small letter h hook","short":"h with hook"}}},{"category":"Ll","key":"0267","mappings":{"default":{"default":"latin small letter heng with hook","alternative":"latin small letter heng hook","short":"heng with hook"}}},{"category":"Ll","key":"0269","mappings":{"default":{"default":"latin small letter iota","short":"iota"}}},{"category":"Ll","key":"026B","mappings":{"default":{"default":"latin small letter l with middle tilde","short":"l with middle tilde"}}},{"category":"Ll","key":"026C","mappings":{"default":{"default":"latin small letter l with belt","alternative":"latin small letter l belt","short":"l with belt"}}},{"category":"Ll","key":"026D","mappings":{"default":{"default":"latin small letter l with retroflex hook","alternative":"latin small letter l retroflex hook","short":"l with retroflex hook"}}},{"category":"Ll","key":"026E","mappings":{"default":{"default":"latin small letter lezh","alternative":"latin small letter l yogh","short":"lezh"}}},{"category":"Ll","key":"026F","mappings":{"default":{"default":"latin small letter turned m","short":"turned m"}}},{"category":"Ll","key":"0270","mappings":{"default":{"default":"latin small letter turned m with long leg","short":"turned m with long leg"}}},{"category":"Ll","key":"0271","mappings":{"default":{"default":"latin small letter m with hook","alternative":"latin small letter m hook","short":"m with hook"}}},{"category":"Ll","key":"0272","mappings":{"default":{"default":"latin small letter n with left hook","alternative":"latin small letter n hook","short":"n with left hook"}}},{"category":"Ll","key":"0273","mappings":{"default":{"default":"latin small letter n with retroflex hook","alternative":"latin small letter n retroflex hook","short":"n with retroflex hook"}}},{"category":"Ll","key":"0275","mappings":{"default":{"default":"latin small letter barred o","short":"barred o"}}},{"category":"Ll","key":"0277","mappings":{"default":{"default":"latin small letter closed omega","short":"closed omega"}}},{"category":"Ll","key":"0278","mappings":{"default":{"default":"latin small letter phi","short":"phi"}}},{"category":"Ll","key":"0279","mappings":{"default":{"default":"latin small letter turned r","short":"turned r"}}},{"category":"Ll","key":"027A","mappings":{"default":{"default":"latin small letter turned r with long leg","short":"turned r with long leg"}}},{"category":"Ll","key":"027B","mappings":{"default":{"default":"latin small letter turned r with hook","alternative":"latin small letter turned r hook","short":"turned r with hook"}}},{"category":"Ll","key":"027C","mappings":{"default":{"default":"latin small letter r with long leg","short":"r with long leg"}}},{"category":"Ll","key":"027D","mappings":{"default":{"default":"latin small letter r with tail","alternative":"latin small letter r hook","short":"r with tail"}}},{"category":"Ll","key":"027E","mappings":{"default":{"default":"latin small letter r with fishhook","alternative":"latin small letter fishhook r","short":"r with fishhook"}}},{"category":"Ll","key":"027F","mappings":{"default":{"default":"latin small letter reversed r with fishhook","alternative":"latin small letter reversed fishhook r","short":"reversed r with fishhook"}}},{"category":"Ll","key":"0282","mappings":{"default":{"default":"latin small letter s with hook","alternative":"latin small letter s hook","short":"s with hook"}}},{"category":"Ll","key":"0283","mappings":{"default":{"default":"latin small letter esh","short":"esh"}}},{"category":"Ll","key":"0285","mappings":{"default":{"default":"latin small letter squat reversed esh","short":"squat reversed esh"}}},{"category":"Ll","key":"0286","mappings":{"default":{"default":"latin small letter esh with curl","alternative":"latin small letter esh curl","short":"esh with curl"}}},{"category":"Ll","key":"0287","mappings":{"default":{"default":"latin small letter turned t","short":"turned t"}}},{"category":"Ll","key":"0288","mappings":{"default":{"default":"latin small letter t with retroflex hook","alternative":"latin small letter t retroflex hook","short":"t with retroflex hook"}}},{"category":"Ll","key":"0289","mappings":{"default":{"default":"latin small letter u bar","short":"u bar"}}},{"category":"Ll","key":"028A","mappings":{"default":{"default":"latin small letter upsilon","short":"upsilon"}}},{"category":"Ll","key":"028B","mappings":{"default":{"default":"latin small letter v with hook","alternative":"latin small letter script v","short":"v with hook"}}},{"category":"Ll","key":"028C","mappings":{"default":{"default":"latin small letter turned v","short":"turned v"}}},{"category":"Ll","key":"028D","mappings":{"default":{"default":"latin small letter turned w","short":"turned w"}}},{"category":"Ll","key":"028E","mappings":{"default":{"default":"latin small letter turned y","short":"turned y"}}},{"category":"Ll","key":"0290","mappings":{"default":{"default":"latin small letter z with retroflex hook","alternative":"latin small letter z retroflex hook","short":"z with retroflex hook"}}},{"category":"Ll","key":"0291","mappings":{"default":{"default":"latin small letter z with curl","alternative":"latin small letter z curl","short":"z with curl"}}},{"category":"Ll","key":"0292","mappings":{"default":{"default":"latin small letter ezh","alternative":"latin small letter yogh","short":"ezh"}}},{"category":"Ll","key":"0293","mappings":{"default":{"default":"latin small letter ezh with curl","alternative":"latin small letter yogh curl","short":"ezh with curl"}}},{"category":"Ll","key":"0295","mappings":{"default":{"default":"latin letter pharyngeal voiced fricative","alternative":"latin letter reversed glottal stop","short":"latin letter pharyngeal voiced fricative"}}},{"category":"Ll","key":"0296","mappings":{"default":{"default":"latin letter inverted glottal stop","short":"latin letter inverted glottal stop"}}},{"category":"Ll","key":"0297","mappings":{"default":{"default":"latin letter stretched c","short":"latin letter stretched c"}}},{"category":"Ll","key":"0298","mappings":{"default":{"default":"latin letter bilabial click","alternative":"latin letter bullseye","short":"latin letter bilabial click"}}},{"category":"Ll","key":"029A","mappings":{"default":{"default":"latin small letter closed open e","alternative":"latin small letter closed epsilon","short":"closed open e"}}},{"category":"Ll","key":"029E","mappings":{"default":{"default":"latin small letter turned k","short":"turned k"}}},{"category":"Ll","key":"02A0","mappings":{"default":{"default":"latin small letter q with hook","alternative":"latin small letter q hook","short":"q with hook"}}},{"category":"Ll","key":"02A3","mappings":{"default":{"default":"latin small letter dz digraph","alternative":"latin small letter d z","short":"dz digraph"}}},{"category":"Ll","key":"02A4","mappings":{"default":{"default":"latin small letter dezh digraph","alternative":"latin small letter d yogh","short":"dezh digraph"}}},{"category":"Ll","key":"02A5","mappings":{"default":{"default":"latin small letter dz digraph with curl","alternative":"latin small letter d z curl","short":"dz digraph with curl"}}},{"category":"Ll","key":"02A6","mappings":{"default":{"default":"latin small letter ts digraph","alternative":"latin small letter t s","short":"ts digraph"}}},{"category":"Ll","key":"02A7","mappings":{"default":{"default":"latin small letter tesh digraph","alternative":"latin small letter t esh","short":"tesh digraph"}}},{"category":"Ll","key":"02A8","mappings":{"default":{"default":"latin small letter tc digraph with curl","alternative":"latin small letter t c curl","short":"tc digraph with curl"}}},{"category":"Ll","key":"02A9","mappings":{"default":{"default":"latin small letter feng digraph","short":"feng digraph"}}},{"category":"Ll","key":"02AA","mappings":{"default":{"default":"latin small letter ls digraph","short":"ls digraph"}}},{"category":"Ll","key":"02AB","mappings":{"default":{"default":"latin small letter lz digraph","short":"lz digraph"}}},{"category":"Ll","key":"02AC","mappings":{"default":{"default":"latin letter bilabial percussive","short":"latin letter bilabial percussive"}}},{"category":"Ll","key":"02AD","mappings":{"default":{"default":"latin letter bidental percussive","short":"latin letter bidental percussive"}}},{"category":"Ll","key":"02AE","mappings":{"default":{"default":"latin small letter turned h with fishhook","short":"turned h with fishhook"}}},{"category":"Ll","key":"02AF","mappings":{"default":{"default":"latin small letter turned h with fishhook and tail","short":"turned h with fishhook and tail"}}},{"category":"Ll","key":"1D02","mappings":{"default":{"default":"latin small letter turned ae","short":"turned ae"}}},{"category":"Ll","key":"1D08","mappings":{"default":{"default":"latin small letter turned open e","short":"turned open e"}}},{"category":"Ll","key":"1D09","mappings":{"default":{"default":"latin small letter turned i","short":"turned i"}}},{"category":"Ll","key":"1D11","mappings":{"default":{"default":"latin small letter sideways o","short":"sideways o"}}},{"category":"Ll","key":"1D12","mappings":{"default":{"default":"latin small letter sideways open o","short":"sideways open o"}}},{"category":"Ll","key":"1D14","mappings":{"default":{"default":"latin small letter turned oe","short":"turned oe"}}},{"category":"Ll","key":"1D16","mappings":{"default":{"default":"latin small letter top half o","short":"top half o"}}},{"category":"Ll","key":"1D17","mappings":{"default":{"default":"latin small letter bottom half o","short":"bottom half o"}}},{"category":"Ll","key":"1D1D","mappings":{"default":{"default":"latin small letter sideways u","short":"sideways u"}}},{"category":"Ll","key":"1D1E","mappings":{"default":{"default":"latin small letter sideways diaeresized u","short":"sideways diaeresized u"}}},{"category":"Ll","key":"1D1F","mappings":{"default":{"default":"latin small letter sideways turned m","short":"sideways turned m"}}},{"category":"Ll","key":"1D24","mappings":{"default":{"default":"latin letter voiced laryngeal spirant","short":"latin letter voiced laryngeal spirant"}}},{"category":"Ll","key":"1D25","mappings":{"default":{"default":"latin letter ain","short":"latin letter ain"}}},{"category":"Ll","key":"1D6B","mappings":{"default":{"default":"latin small letter ue","short":"ue"}}},{"category":"Ll","key":"1D6C","mappings":{"default":{"default":"latin small letter b with middle tilde","short":"b with middle tilde"}}},{"category":"Ll","key":"1D6D","mappings":{"default":{"default":"latin small letter d with middle tilde","short":"d with middle tilde"}}},{"category":"Ll","key":"1D6E","mappings":{"default":{"default":"latin small letter f with middle tilde","short":"f with middle tilde"}}},{"category":"Ll","key":"1D6F","mappings":{"default":{"default":"latin small letter m with middle tilde","short":"m with middle tilde"}}},{"category":"Ll","key":"1D70","mappings":{"default":{"default":"latin small letter n with middle tilde","short":"n with middle tilde"}}},{"category":"Ll","key":"1D71","mappings":{"default":{"default":"latin small letter p with middle tilde","short":"p with middle tilde"}}},{"category":"Ll","key":"1D72","mappings":{"default":{"default":"latin small letter r with middle tilde","short":"r with middle tilde"}}},{"category":"Ll","key":"1D73","mappings":{"default":{"default":"latin small letter r with fishhook and middle tilde","short":"r with fishhook and middle tilde"}}},{"category":"Ll","key":"1D74","mappings":{"default":{"default":"latin small letter s with middle tilde","short":"s with middle tilde"}}},{"category":"Ll","key":"1D75","mappings":{"default":{"default":"latin small letter t with middle tilde","short":"t with middle tilde"}}},{"category":"Ll","key":"1D76","mappings":{"default":{"default":"latin small letter z with middle tilde","short":"z with middle tilde"}}},{"category":"Ll","key":"1D77","mappings":{"default":{"default":"latin small letter turned g","short":"turned g"}}},{"category":"Ll","key":"1D79","mappings":{"default":{"default":"latin small letter insular g","short":"insular g"}}},{"category":"Ll","key":"1D7A","mappings":{"default":{"default":"latin small letter th with strikethrough","short":"th with strikethrough"}}},{"category":"Ll","key":"1D80","mappings":{"default":{"default":"latin small letter b with palatal hook","short":"b with palatal hook"}}},{"category":"Ll","key":"1D81","mappings":{"default":{"default":"latin small letter d with palatal hook","short":"d with palatal hook"}}},{"category":"Ll","key":"1D82","mappings":{"default":{"default":"latin small letter f with palatal hook","short":"f with palatal hook"}}},{"category":"Ll","key":"1D83","mappings":{"default":{"default":"latin small letter g with palatal hook","short":"g with palatal hook"}}},{"category":"Ll","key":"1D84","mappings":{"default":{"default":"latin small letter k with palatal hook","short":"k with palatal hook"}}},{"category":"Ll","key":"1D85","mappings":{"default":{"default":"latin small letter l with palatal hook","short":"l with palatal hook"}}},{"category":"Ll","key":"1D86","mappings":{"default":{"default":"latin small letter m with palatal hook","short":"m with palatal hook"}}},{"category":"Ll","key":"1D87","mappings":{"default":{"default":"latin small letter n with palatal hook","short":"n with palatal hook"}}},{"category":"Ll","key":"1D88","mappings":{"default":{"default":"latin small letter p with palatal hook","short":"p with palatal hook"}}},{"category":"Ll","key":"1D89","mappings":{"default":{"default":"latin small letter r with palatal hook","short":"r with palatal hook"}}},{"category":"Ll","key":"1D8A","mappings":{"default":{"default":"latin small letter s with palatal hook","short":"s with palatal hook"}}},{"category":"Ll","key":"1D8B","mappings":{"default":{"default":"latin small letter esh with palatal hook","short":"esh with palatal hook"}}},{"category":"Ll","key":"1D8C","mappings":{"default":{"default":"latin small letter v with palatal hook","short":"v with palatal hook"}}},{"category":"Ll","key":"1D8D","mappings":{"default":{"default":"latin small letter x with palatal hook","short":"x with palatal hook"}}},{"category":"Ll","key":"1D8E","mappings":{"default":{"default":"latin small letter z with palatal hook","short":"z with palatal hook"}}},{"category":"Ll","key":"1D8F","mappings":{"default":{"default":"latin small letter a with retroflex hook","short":"a with retroflex hook"}}},{"category":"Ll","key":"1D90","mappings":{"default":{"default":"latin small letter alpha with retroflex hook","short":"alpha with retroflex hook"}}},{"category":"Ll","key":"1D91","mappings":{"default":{"default":"latin small letter d with hook and tail","short":"d with hook and tail"}}},{"category":"Ll","key":"1D92","mappings":{"default":{"default":"latin small letter e with retroflex hook","short":"e with retroflex hook"}}},{"category":"Ll","key":"1D93","mappings":{"default":{"default":"latin small letter open e with retroflex hook","short":"open e with retroflex hook"}}},{"category":"Ll","key":"1D94","mappings":{"default":{"default":"latin small letter reversed open e with retroflex hook","short":"reversed open e with retroflex hook"}}},{"category":"Ll","key":"1D95","mappings":{"default":{"default":"latin small letter schwa with retroflex hook","short":"schwa with retroflex hook"}}},{"category":"Ll","key":"1D96","mappings":{"default":{"default":"latin small letter i with retroflex hook","short":"i with retroflex hook"}}},{"category":"Ll","key":"1D97","mappings":{"default":{"default":"latin small letter open o with retroflex hook","short":"open o with retroflex hook"}}},{"category":"Ll","key":"1D98","mappings":{"default":{"default":"latin small letter esh with retroflex hook","short":"esh with retroflex hook"}}},{"category":"Ll","key":"1D99","mappings":{"default":{"default":"latin small letter u with retroflex hook","short":"u with retroflex hook"}}},{"category":"Ll","key":"1D9A","mappings":{"default":{"default":"latin small letter ezh with retroflex hook","short":"ezh with retroflex hook"}}},{"category":"Ll","key":"0149","mappings":{"default":{"default":"latin small letter n preceded by apostrophe","alternative":"latin small letter apostrophe n","short":"n preceded by apostrophe"}}},{"category":"Ll","key":"014B","mappings":{"default":{"default":"latin small letter eng","short":"eng"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-single-accent.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-single-accent.js
deleted file mode 100644
index 2630b677..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-lower-single-accent.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","key":"00E0","mappings":{"default":{"default":"latin small letter a with grave","alternative":"latin small letter a grave","short":"a grave"},"mathspeak":{"default":"modifying above a with grave","brief":"mod above a with grave","sbrief":"mod above a with grave"}}},{"category":"Ll","key":"00E1","mappings":{"default":{"default":"latin small letter a with acute","alternative":"latin small letter a acute","short":"a acute"},"mathspeak":{"default":"modifying above a with acute","brief":"mod above a with acute","sbrief":"mod above a with acute"}}},{"category":"Ll","key":"00E2","mappings":{"default":{"default":"latin small letter a with circumflex","alternative":"latin small letter a hat","short":"a hat"},"mathspeak":{"default":"modifying above a with caret","brief":"mod above a with caret","sbrief":"mod above a with caret"}}},{"category":"Ll","key":"00E3","mappings":{"default":{"default":"latin small letter a with tilde","alternative":"latin small letter a tilde","short":"a tilde"},"mathspeak":{"default":"a overtilde","brief":"a overtilde","sbrief":"a overtilde"}}},{"category":"Ll","key":"00E4","mappings":{"default":{"default":"latin small letter a with diaeresis","alternative":"latin small letter a double overdot","short":"a double overdot"},"mathspeak":{"default":"modifying above a with double dot","brief":"mod above a with double dot","sbrief":"mod above a with double dot"}}},{"category":"Ll","key":"00E5","mappings":{"default":{"default":"latin small letter a with ring above","alternative":"latin small letter a ring","short":"a ring"},"mathspeak":{"default":"modifying above a with ring","brief":"mod above a with ring","sbrief":"mod above a with ring"}}},{"category":"Ll","key":"00E7","mappings":{"default":{"default":"latin small letter c with cedilla","alternative":"latin small letter c cedilla","short":"c cedilla"},"mathspeak":{"default":"modifying above c with cedilla","brief":"mod above c with cedilla","sbrief":"mod above c with cedilla"}}},{"category":"Ll","key":"00E8","mappings":{"default":{"default":"latin small letter e with grave","alternative":"latin small letter e grave","short":"e grave"},"mathspeak":{"default":"modifying above e with grave","brief":"mod above e with grave","sbrief":"mod above e with grave"}}},{"category":"Ll","key":"00E9","mappings":{"default":{"default":"latin small letter e with acute","alternative":"latin small letter e acute","short":"e acute"},"mathspeak":{"default":"modifying above e with acute","brief":"mod above e with acute","sbrief":"mod above e with acute"}}},{"category":"Ll","key":"00EA","mappings":{"default":{"default":"latin small letter e with circumflex","alternative":"latin small letter e hat","short":"e hat"},"mathspeak":{"default":"modifying above e with caret","brief":"mod above e with caret","sbrief":"mod above e with caret"}}},{"category":"Ll","key":"00EB","mappings":{"default":{"default":"latin small letter e with diaeresis","alternative":"latin small letter e double overdot","short":"e double overdot"},"mathspeak":{"default":"modifying above e with double dot","brief":"mod above e with double dot","sbrief":"mod above e with double dot"}}},{"category":"Ll","key":"00EC","mappings":{"default":{"default":"latin small letter i with grave","alternative":"latin small letter i grave","short":"i grave"},"mathspeak":{"default":"modifying above i with grave","brief":"mod above i with grave","sbrief":"mod above i with grave"}}},{"category":"Ll","key":"00ED","mappings":{"default":{"default":"latin small letter i with acute","alternative":"latin small letter i acute","short":"i acute"},"mathspeak":{"default":"modifying above i with acute","brief":"mod above i with acute","sbrief":"mod above i with acute"}}},{"category":"Ll","key":"00EE","mappings":{"default":{"default":"latin small letter i with circumflex","alternative":"latin small letter i hat","short":"i hat"},"mathspeak":{"default":"modifying above i with caret","brief":"mod above i with caret","sbrief":"mod above i with caret"}}},{"category":"Ll","key":"00EF","mappings":{"default":{"default":"latin small letter i with diaeresis","alternative":"latin small letter i double overdot","short":"i double overdot"},"mathspeak":{"default":"modifying above i with double dot","brief":"mod above i with double dot","sbrief":"mod above i with double dot"}}},{"category":"Ll","key":"00F1","mappings":{"default":{"default":"latin small letter n with tilde","alternative":"latin small letter n tilde","short":"n tilde"},"mathspeak":{"default":"n overtilde","brief":"n overtilde","sbrief":"n overtilde"}}},{"category":"Ll","key":"00F2","mappings":{"default":{"default":"latin small letter o with grave","alternative":"latin small letter o grave","short":"o grave"},"mathspeak":{"default":"modifying above o with grave","brief":"mod above o with grave","sbrief":"mod above o with grave"}}},{"category":"Ll","key":"00F3","mappings":{"default":{"default":"latin small letter o with acute","alternative":"latin small letter o acute","short":"o acute"},"mathspeak":{"default":"modifying above o with acute","brief":"mod above o with acute","sbrief":"mod above o with acute"}}},{"category":"Ll","key":"00F4","mappings":{"default":{"default":"latin small letter o with circumflex","alternative":"latin small letter o hat","short":"o hat"},"mathspeak":{"default":"modifying above o with caret","brief":"mod above o with caret","sbrief":"mod above o with caret"}}},{"category":"Ll","key":"00F5","mappings":{"default":{"default":"latin small letter o with tilde","alternative":"latin small letter o tilde","short":"o tilde"},"mathspeak":{"default":"o overtilde","brief":"o overtilde","sbrief":"o overtilde"}}},{"category":"Ll","key":"00F6","mappings":{"default":{"default":"latin small letter o with diaeresis","alternative":"latin small letter o double overdot","short":"o double overdot"},"mathspeak":{"default":"modifying above o with double dot","brief":"mod above o with double dot","sbrief":"mod above o with double dot"}}},{"category":"Ll","key":"00F9","mappings":{"default":{"default":"latin small letter u with grave","alternative":"latin small letter u grave","short":"u grave"},"mathspeak":{"default":"modifying above u with grave","brief":"mod above u with grave","sbrief":"mod above u with grave"}}},{"category":"Ll","key":"00FA","mappings":{"default":{"default":"latin small letter u with acute","alternative":"latin small letter u acute","short":"u acute"},"mathspeak":{"default":"modifying above u with acute","brief":"mod above u with acute","sbrief":"mod above u with acute"}}},{"category":"Ll","key":"00FB","mappings":{"default":{"default":"latin small letter u with circumflex","alternative":"latin small letter u hat","short":"u hat"},"mathspeak":{"default":"modifying above u with caret","brief":"mod above u with caret","sbrief":"mod above u with caret"}}},{"category":"Ll","key":"00FC","mappings":{"default":{"default":"latin small letter u with diaeresis","alternative":"latin small letter u double overdot","short":"u double overdot"},"mathspeak":{"default":"modifying above u with double dot","brief":"mod above u with double dot","sbrief":"mod above u with double dot"}}},{"category":"Ll","key":"00FD","mappings":{"default":{"default":"latin small letter y with acute","alternative":"latin small letter y acute","short":"y acute"},"mathspeak":{"default":"modifying above y with acute","brief":"mod above y with acute","sbrief":"mod above y with acute"}}},{"category":"Ll","key":"00FF","mappings":{"default":{"default":"latin small letter y with diaeresis","alternative":"latin small letter y double overdot","short":"y double overdot"},"mathspeak":{"default":"modifying above y with double dot","brief":"mod above y with double dot","sbrief":"mod above y with double dot"}}},{"category":"Ll","key":"0101","mappings":{"default":{"default":"latin small letter a with macron","alternative":"latin small letter a overbar","short":"a overbar"},"mathspeak":{"default":"a overbar","brief":"a overbar","sbrief":"a overbar"}}},{"category":"Ll","key":"0103","mappings":{"default":{"default":"latin small letter a with breve","alternative":"latin small letter a breve","short":"a breve"},"mathspeak":{"default":"modifying above a with breve","brief":"mod above a with breve","sbrief":"mod above a with breve"}}},{"category":"Ll","key":"0105","mappings":{"default":{"default":"latin small letter a with ogonek","alternative":"latin small letter a ogonek","short":"a ogonek"},"mathspeak":{"default":"modifying above a with ogonek","brief":"mod above a with ogonek","sbrief":"mod above a with ogonek"}}},{"category":"Ll","key":"0107","mappings":{"default":{"default":"latin small letter c with acute","alternative":"latin small letter c acute","short":"c acute"},"mathspeak":{"default":"modifying above c with acute","brief":"mod above c with acute","sbrief":"mod above c with acute"}}},{"category":"Ll","key":"0109","mappings":{"default":{"default":"latin small letter c with circumflex","alternative":"latin small letter c hat","short":"c hat"},"mathspeak":{"default":"modifying above c with caret","brief":"mod above c with caret","sbrief":"mod above c with caret"}}},{"category":"Ll","key":"010B","mappings":{"default":{"default":"latin small letter c with dot above","alternative":"latin small letter c dot","short":"c overdot"},"mathspeak":{"default":"modifying above c with dot","brief":"mod above c with dot","sbrief":"mod above c with dot"}}},{"category":"Ll","key":"010D","mappings":{"default":{"default":"latin small letter c with caron","alternative":"latin small letter c hacek","short":"c caron"},"mathspeak":{"default":"modifying above c with caron","brief":"mod above c with caron","sbrief":"mod above c with caron"}}},{"category":"Ll","key":"010F","mappings":{"default":{"default":"latin small letter d with caron","alternative":"latin small letter d hacek","short":"d caron"},"mathspeak":{"default":"modifying above d with caron","brief":"mod above d with caron","sbrief":"mod above d with caron"}}},{"category":"Ll","key":"0113","mappings":{"default":{"default":"latin small letter e with macron","alternative":"latin small letter e overbar","short":"e overbar"},"mathspeak":{"default":"e overbar","brief":"e overbar","sbrief":"e overbar"}}},{"category":"Ll","key":"0115","mappings":{"default":{"default":"latin small letter e with breve","alternative":"latin small letter e breve","short":"e breve"},"mathspeak":{"default":"modifying above e with breve","brief":"mod above e with breve","sbrief":"mod above e with breve"}}},{"category":"Ll","key":"0117","mappings":{"default":{"default":"latin small letter e with dot above","alternative":"latin small letter e dot","short":"e overdot"},"mathspeak":{"default":"modifying above e with dot","brief":"mod above e with dot","sbrief":"mod above e with dot"}}},{"category":"Ll","key":"0119","mappings":{"default":{"default":"latin small letter e with ogonek","alternative":"latin small letter e ogonek","short":"e ogonek"},"mathspeak":{"default":"modifying above e with ogonek","brief":"mod above e with ogonek","sbrief":"mod above e with ogonek"}}},{"category":"Ll","key":"011B","mappings":{"default":{"default":"latin small letter e with caron","alternative":"latin small letter e hacek","short":"e caron"},"mathspeak":{"default":"modifying above e with caron","brief":"mod above e with caron","sbrief":"mod above e with caron"}}},{"category":"Ll","key":"011D","mappings":{"default":{"default":"latin small letter g with circumflex","alternative":"latin small letter g hat","short":"g hat"},"mathspeak":{"default":"modifying above g with caret","brief":"mod above g with caret","sbrief":"mod above g with caret"}}},{"category":"Ll","key":"011F","mappings":{"default":{"default":"latin small letter g with breve","alternative":"latin small letter g breve","short":"g breve"},"mathspeak":{"default":"modifying above g with breve","brief":"mod above g with breve","sbrief":"mod above g with breve"}}},{"category":"Ll","key":"0121","mappings":{"default":{"default":"latin small letter g with dot above","alternative":"latin small letter g dot","short":"g overdot"},"mathspeak":{"default":"modifying above g with dot","brief":"mod above g with dot","sbrief":"mod above g with dot"}}},{"category":"Ll","key":"0123","mappings":{"default":{"default":"latin small letter g with cedilla","alternative":"latin small letter g cedilla","short":"g cedilla"},"mathspeak":{"default":"modifying above g with cedilla","brief":"mod above g with cedilla","sbrief":"mod above g with cedilla"}}},{"category":"Ll","key":"0125","mappings":{"default":{"default":"latin small letter h with circumflex","alternative":"latin small letter h hat","short":"h hat"},"mathspeak":{"default":"modifying above h with caret","brief":"mod above h with caret","sbrief":"mod above h with caret"}}},{"category":"Ll","key":"0129","mappings":{"default":{"default":"latin small letter i with tilde","alternative":"latin small letter i tilde","short":"i tilde"},"mathspeak":{"default":"i overtilde","brief":"i overtilde","sbrief":"i overtilde"}}},{"category":"Ll","key":"012B","mappings":{"default":{"default":"latin small letter i with macron","alternative":"latin small letter i overbar","short":"i overbar"},"mathspeak":{"default":"i overbar","brief":"i overbar","sbrief":"i overbar"}}},{"category":"Ll","key":"012D","mappings":{"default":{"default":"latin small letter i with breve","alternative":"latin small letter i breve","short":"i breve"},"mathspeak":{"default":"modifying above i with breve","brief":"mod above i with breve","sbrief":"mod above i with breve"}}},{"category":"Ll","key":"012F","mappings":{"default":{"default":"latin small letter i with ogonek","alternative":"latin small letter i ogonek","short":"i ogonek"},"mathspeak":{"default":"modifying above i with ogonek","brief":"mod above i with ogonek","sbrief":"mod above i with ogonek"}}},{"category":"Ll","key":"0131","mappings":{"default":{"default":"latin small letter dotless i","alternative":"latin small letter dotless i","short":"dotless i"},"mathspeak":{"default":"modifying above d with tless i","brief":"mod above d with tless i","sbrief":"mod above d with tless i"}}},{"category":"Ll","key":"0135","mappings":{"default":{"default":"latin small letter j circumflex","alternative":"latin small letter j hat","short":"j hat"},"mathspeak":{"default":"modifying above j with caret","brief":"mod above j with caret","sbrief":"mod above j with caret"}}},{"category":"Ll","key":"0137","mappings":{"default":{"default":"latin small letter k with cedilla","alternative":"latin small letter k cedilla","short":"k cedilla"},"mathspeak":{"default":"modifying above k with cedilla","brief":"mod above k with cedilla","sbrief":"mod above k with cedilla"}}},{"category":"Ll","key":"013A","mappings":{"default":{"default":"latin small letter l with acute","alternative":"latin small letter l acute","short":"l acute"},"mathspeak":{"default":"modifying above l with acute","brief":"mod above l with acute","sbrief":"mod above l with acute"}}},{"category":"Ll","key":"013C","mappings":{"default":{"default":"latin small letter l with cedilla","alternative":"latin small letter l cedilla","short":"l cedilla"},"mathspeak":{"default":"modifying above l with cedilla","brief":"mod above l with cedilla","sbrief":"mod above l with cedilla"}}},{"category":"Ll","key":"013E","mappings":{"default":{"default":"latin small letter l with caron","alternative":"latin small letter l hacek","short":"l caron"},"mathspeak":{"default":"modifying above l with caron","brief":"mod above l with caron","sbrief":"mod above l with caron"}}},{"category":"Ll","key":"0140","mappings":{"default":{"default":"latin small letter l with middle dot","alternative":"latin small letter l middle dot","short":"l middle dot"},"mathspeak":{"default":"modifying above l with middle dot","brief":"mod above l with middle dot","sbrief":"mod above l with middle dot"}}},{"category":"Ll","key":"0144","mappings":{"default":{"default":"latin small letter n with acute","alternative":"latin small letter n acute","short":"n acute"},"mathspeak":{"default":"modifying above n with acute","brief":"mod above n with acute","sbrief":"mod above n with acute"}}},{"category":"Ll","key":"0146","mappings":{"default":{"default":"latin small letter n with cedilla","alternative":"latin small letter n cedilla","short":"n cedilla"},"mathspeak":{"default":"modifying above n with cedilla","brief":"mod above n with cedilla","sbrief":"mod above n with cedilla"}}},{"category":"Ll","key":"0148","mappings":{"default":{"default":"latin small letter n with caron","alternative":"latin small letter n hacek","short":"n caron"},"mathspeak":{"default":"modifying above n with caron","brief":"mod above n with caron","sbrief":"mod above n with caron"}}},{"category":"Ll","key":"014D","mappings":{"default":{"default":"latin small letter o macron","alternative":"latin small letter o overbar","short":"o overbar"},"mathspeak":{"default":"o overbar","brief":"o overbar","sbrief":"o overbar"}}},{"category":"Ll","key":"014F","mappings":{"default":{"default":"latin small letter o with breve","alternative":"latin small letter o breve","short":"o breve"},"mathspeak":{"default":"modifying above o with breve","brief":"mod above o with breve","sbrief":"mod above o with breve"}}},{"category":"Ll","key":"0151","mappings":{"default":{"default":"latin small letter o with double acute","alternative":"latin small letter o double acute","short":"o double acute"},"mathspeak":{"default":"modifying above o with double acute","brief":"mod above o with double acute","sbrief":"mod above o with double acute"}}},{"category":"Ll","key":"0155","mappings":{"default":{"default":"latin small letter r with acute","alternative":"latin small letter r acute","short":"r acute"},"mathspeak":{"default":"modifying above r with acute","brief":"mod above r with acute","sbrief":"mod above r with acute"}}},{"category":"Ll","key":"0157","mappings":{"default":{"default":"latin small letter r with cedilla","alternative":"latin small letter r cedilla","short":"r cedilla"},"mathspeak":{"default":"modifying above r with cedilla","brief":"mod above r with cedilla","sbrief":"mod above r with cedilla"}}},{"category":"Ll","key":"0159","mappings":{"default":{"default":"latin small letter r with caron","alternative":"latin small letter r hacek","short":"r caron"},"mathspeak":{"default":"modifying above r with caron","brief":"mod above r with caron","sbrief":"mod above r with caron"}}},{"category":"Ll","key":"015B","mappings":{"default":{"default":"latin small letter s with acute","alternative":"latin small letter s acute","short":"s acute"},"mathspeak":{"default":"modifying above s with acute","brief":"mod above s with acute","sbrief":"mod above s with acute"}}},{"category":"Ll","key":"015D","mappings":{"default":{"default":"latin small letter s with circumflex","alternative":"latin small letter s hat","short":"s hat"},"mathspeak":{"default":"modifying above s with caret","brief":"mod above s with caret","sbrief":"mod above s with caret"}}},{"category":"Ll","key":"015F","mappings":{"default":{"default":"latin small letter s with cedilla","alternative":"latin small letter s cedilla","short":"s cedilla"},"mathspeak":{"default":"modifying above s with cedilla","brief":"mod above s with cedilla","sbrief":"mod above s with cedilla"}}},{"category":"Ll","key":"0161","mappings":{"default":{"default":"latin small letter s with caron","alternative":"latin small letter s hacek","short":"s caron"},"mathspeak":{"default":"modifying above s with caron","brief":"mod above s with caron","sbrief":"mod above s with caron"}}},{"category":"Ll","key":"0163","mappings":{"default":{"default":"latin small letter t with cedilla","alternative":"latin small letter t cedilla","short":"t cedilla"},"mathspeak":{"default":"modifying above t with cedilla","brief":"mod above t with cedilla","sbrief":"mod above t with cedilla"}}},{"category":"Ll","key":"0165","mappings":{"default":{"default":"latin small letter t with caron","alternative":"latin small letter t hacek","short":"t caron"},"mathspeak":{"default":"modifying above t with caron","brief":"mod above t with caron","sbrief":"mod above t with caron"}}},{"category":"Ll","key":"0169","mappings":{"default":{"default":"latin small letter u with tilde","alternative":"latin small letter u tilde","short":"u tilde"},"mathspeak":{"default":"u overtilde","brief":"u overtilde","sbrief":"u overtilde"}}},{"category":"Ll","key":"016B","mappings":{"default":{"default":"latin small letter u with macron","alternative":"latin small letter u overbar","short":"u overbar"},"mathspeak":{"default":"u overbar","brief":"u overbar","sbrief":"u overbar"}}},{"category":"Ll","key":"016D","mappings":{"default":{"default":"latin small letter u with breve","alternative":"latin small letter u breve","short":"u breve"},"mathspeak":{"default":"modifying above u with breve","brief":"mod above u with breve","sbrief":"mod above u with breve"}}},{"category":"Ll","key":"016F","mappings":{"default":{"default":"latin small letter u with ring above","alternative":"latin small letter u ring","short":"u ring"},"mathspeak":{"default":"modifying above u with ring","brief":"mod above u with ring","sbrief":"mod above u with ring"}}},{"category":"Ll","key":"0171","mappings":{"default":{"default":"latin small letter u with double acute","alternative":"latin small letter u double acute","short":"u double acute"},"mathspeak":{"default":"modifying above u with double acute","brief":"mod above u with double acute","sbrief":"mod above u with double acute"}}},{"category":"Ll","key":"0173","mappings":{"default":{"default":"latin small letter u with ogonek","alternative":"latin small letter u ogonek","short":"u ogonek"},"mathspeak":{"default":"modifying above u with ogonek","brief":"mod above u with ogonek","sbrief":"mod above u with ogonek"}}},{"category":"Ll","key":"0175","mappings":{"default":{"default":"latin small letter w with circumflex","alternative":"latin small letter w hat","short":"w hat"},"mathspeak":{"default":"modifying above w with caret","brief":"mod above w with caret","sbrief":"mod above w with caret"}}},{"category":"Ll","key":"0177","mappings":{"default":{"default":"latin small letter y with circumflex","alternative":"latin small letter y hat","short":"y hat"},"mathspeak":{"default":"modifying above y with caret","brief":"mod above y with caret","sbrief":"mod above y with caret"}}},{"category":"Ll","key":"017A","mappings":{"default":{"default":"latin small letter z with acute","alternative":"latin small letter z acute","short":"z acute"},"mathspeak":{"default":"modifying above z with acute","brief":"mod above z with acute","sbrief":"mod above z with acute"}}},{"category":"Ll","key":"017C","mappings":{"default":{"default":"latin small letter z with dot above","alternative":"latin small letter z dot","short":"z overdot"},"mathspeak":{"default":"modifying above z with dot","brief":"mod above z with dot","sbrief":"mod above z with dot"}}},{"category":"Ll","key":"017E","mappings":{"default":{"default":"latin small letter z with caron","alternative":"latin small letter z hacek","short":"z caron"},"mathspeak":{"default":"modifying above z with caron","brief":"mod above z with caron","sbrief":"mod above z with caron"}}},{"category":"Ll","key":"01CE","mappings":{"default":{"default":"latin small letter a with caron","alternative":"latin small letter a hacek","short":"a caron"},"mathspeak":{"default":"modifying above a with caron","brief":"mod above a with caron","sbrief":"mod above a with caron"}}},{"category":"Ll","key":"01D0","mappings":{"default":{"default":"latin small letter i with caron","alternative":"latin small letter i hacek","short":"i caron"},"mathspeak":{"default":"modifying above i with caron","brief":"mod above i with caron","sbrief":"mod above i with caron"}}},{"category":"Ll","key":"01D2","mappings":{"default":{"default":"latin small letter o with caron","alternative":"latin small letter o hacek","short":"o caron"},"mathspeak":{"default":"modifying above o with caron","brief":"mod above o with caron","sbrief":"mod above o with caron"}}},{"category":"Ll","key":"01D4","mappings":{"default":{"default":"latin small letter u with caron","alternative":"latin small letter u hacek","short":"u caron"},"mathspeak":{"default":"modifying above u with caron","brief":"mod above u with caron","sbrief":"mod above u with caron"}}},{"category":"Ll","key":"01E7","mappings":{"default":{"default":"latin small letter g with caron","alternative":"latin small letter g hacek","short":"g caron"},"mathspeak":{"default":"modifying above g with caron","brief":"mod above g with caron","sbrief":"mod above g with caron"}}},{"category":"Ll","key":"01E9","mappings":{"default":{"default":"latin small letter k with caron","alternative":"latin small letter k hacek","short":"k caron"},"mathspeak":{"default":"modifying above k with caron","brief":"mod above k with caron","sbrief":"mod above k with caron"}}},{"category":"Ll","key":"01EB","mappings":{"default":{"default":"latin small letter o with ogonek","alternative":"latin small letter o ogonek","short":"o ogonek"},"mathspeak":{"default":"modifying above o with ogonek","brief":"mod above o with ogonek","sbrief":"mod above o with ogonek"}}},{"category":"Ll","key":"01F0","mappings":{"default":{"default":"latin small letter j with caron","alternative":"latin small letter j hacek","short":"j caron"},"mathspeak":{"default":"modifying above j with caron","brief":"mod above j with caron","sbrief":"mod above j with caron"}}},{"category":"Ll","key":"01F5","mappings":{"default":{"default":"latin small letter g with acute","alternative":"latin small letter g acute","short":"g acute"},"mathspeak":{"default":"modifying above g with acute","brief":"mod above g with acute","sbrief":"mod above g with acute"}}},{"category":"Ll","key":"01F9","mappings":{"default":{"default":"latin small letter n with grave","alternative":"latin small letter n grave","short":"n grave"},"mathspeak":{"default":"modifying above n with grave","brief":"mod above n with grave","sbrief":"mod above n with grave"}}},{"category":"Ll","key":"0201","mappings":{"default":{"default":"latin small letter a with double grave","alternative":"latin small letter a double grave","short":"a double grave"},"mathspeak":{"default":"modifying above a with double grave","brief":"mod above a with double grave","sbrief":"mod above a with double grave"}}},{"category":"Ll","key":"0203","mappings":{"default":{"default":"latin small letter a with inverted breve","alternative":"latin small letter a inverted breve","short":"a inverted breve"},"mathspeak":{"default":"modifying above a with inverted breve","brief":"mod above a with inverted breve","sbrief":"mod above a with inverted breve"}}},{"category":"Ll","key":"0205","mappings":{"default":{"default":"latin small letter e with double grave","alternative":"latin small letter e double grave","short":"e double grave"},"mathspeak":{"default":"modifying above e with double grave","brief":"mod above e with double grave","sbrief":"mod above e with double grave"}}},{"category":"Ll","key":"0207","mappings":{"default":{"default":"latin small letter e with inverted breve","alternative":"latin small letter e inverted breve","short":"e inverted breve"},"mathspeak":{"default":"modifying above e with inverted breve","brief":"mod above e with inverted breve","sbrief":"mod above e with inverted breve"}}},{"category":"Ll","key":"0209","mappings":{"default":{"default":"latin small letter i with double grave","alternative":"latin small letter i double grave","short":"i double grave"},"mathspeak":{"default":"modifying above i with double grave","brief":"mod above i with double grave","sbrief":"mod above i with double grave"}}},{"category":"Ll","key":"020B","mappings":{"default":{"default":"latin small letter i with inverted breve","alternative":"latin small letter i inverted breve","short":"i inverted breve"},"mathspeak":{"default":"modifying above i with inverted breve","brief":"mod above i with inverted breve","sbrief":"mod above i with inverted breve"}}},{"category":"Ll","key":"020D","mappings":{"default":{"default":"latin small letter o with double grave","alternative":"latin small letter o double grave","short":"o double grave"},"mathspeak":{"default":"modifying above o with double grave","brief":"mod above o with double grave","sbrief":"mod above o with double grave"}}},{"category":"Ll","key":"020F","mappings":{"default":{"default":"latin small letter o with inverted breve","alternative":"latin small letter o inverted breve","short":"o inverted breve"},"mathspeak":{"default":"modifying above o with inverted breve","brief":"mod above o with inverted breve","sbrief":"mod above o with inverted breve"}}},{"category":"Ll","key":"0211","mappings":{"default":{"default":"latin small letter r with double grave","alternative":"latin small letter r double grave","short":"r double grave"},"mathspeak":{"default":"modifying above r with double grave","brief":"mod above r with double grave","sbrief":"mod above r with double grave"}}},{"category":"Ll","key":"0213","mappings":{"default":{"default":"latin small letter r with inverted breve","alternative":"latin small letter r inverted breve","short":"r inverted breve"},"mathspeak":{"default":"modifying above r with inverted breve","brief":"mod above r with inverted breve","sbrief":"mod above r with inverted breve"}}},{"category":"Ll","key":"0215","mappings":{"default":{"default":"latin small letter u with double grave","alternative":"latin small letter u double grave","short":"u double grave"},"mathspeak":{"default":"modifying above u with double grave","brief":"mod above u with double grave","sbrief":"mod above u with double grave"}}},{"category":"Ll","key":"0217","mappings":{"default":{"default":"latin small letter u with inverted breve","alternative":"latin small letter u inverted breve","short":"u inverted breve"},"mathspeak":{"default":"modifying above u with inverted breve","brief":"mod above u with inverted breve","sbrief":"mod above u with inverted breve"}}},{"category":"Ll","key":"0219","mappings":{"default":{"default":"latin small letter s with comma below","alternative":"latin small letter s comma below","short":"s comma below"},"mathspeak":{"default":"modifying below s with comma below","brief":"mod below s with comma below","sbrief":"mod below s with comma below"}}},{"category":"Ll","key":"021B","mappings":{"default":{"default":"latin small letter t with comma below","alternative":"latin small letter t comma below","short":"t comma below"},"mathspeak":{"default":"modifying below t with comma below","brief":"mod below t with comma below","sbrief":"mod below t with comma below"}}},{"category":"Ll","key":"021F","mappings":{"default":{"default":"latin small letter h with caron","alternative":"latin small letter h caron","short":"h caron"},"mathspeak":{"default":"modifying above h with caron","brief":"mod above h with caron","sbrief":"mod above h with caron"}}},{"category":"Ll","key":"0227","mappings":{"default":{"default":"latin small letter a with dot above","alternative":"latin small letter a overdot","short":"a overdot"},"mathspeak":{"default":"modifying above a with dot","brief":"mod above a with dot","sbrief":"mod above a with dot"}}},{"category":"Ll","key":"0229","mappings":{"default":{"default":"latin small letter e with cedilla","alternative":"latin small letter e cedilla","short":"e cedilla"},"mathspeak":{"default":"modifying above e with cedilla","brief":"mod above e with cedilla","sbrief":"mod above e with cedilla"}}},{"category":"Ll","key":"022F","mappings":{"default":{"default":"latin small letter o with dot above","alternative":"latin small letter o overdot","short":"o overdot"},"mathspeak":{"default":"modifying above o with dot","brief":"mod above o with dot","sbrief":"mod above o with dot"}}},{"category":"Ll","key":"0233","mappings":{"default":{"default":"latin small letter y with macron","alternative":"latin small letter y overbar","short":"y overbar"},"mathspeak":{"default":"y overbar","brief":"y overbar","sbrief":"y overbar"}}},{"category":"Ll","key":"0237","mappings":{"default":{"default":"latin small letter dotless j","alternative":"latin small letter dotless j","short":"dotless j"},"mathspeak":{"default":"modifying above d with tless j","brief":"mod above d with tless j","sbrief":"mod above d with tless j"}}},{"category":"Ll","key":"1E01","mappings":{"default":{"default":"latin small letter a ring below","alternative":"latin small letter a ring below","short":"a ring below"},"mathspeak":{"default":"modifying below a with ring below","brief":"mod below a with ring below","sbrief":"mod below a with ring below"}}},{"category":"Ll","key":"1E03","mappings":{"default":{"default":"latin small letter b with dot above","alternative":"latin small letter b overdot","short":"b overdot"},"mathspeak":{"default":"modifying above b with dot","brief":"mod above b with dot","sbrief":"mod above b with dot"}}},{"category":"Ll","key":"1E05","mappings":{"default":{"default":"latin small letter b with dot below","alternative":"latin small letter b underdot","short":"b underdot"},"mathspeak":{"default":"modifying below b with dot","brief":"mod below b with dot","sbrief":"mod below b with dot"}}},{"category":"Ll","key":"1E07","mappings":{"default":{"default":"latin small letter b with line below","alternative":"latin small letter b underbar","short":"b underbar"},"mathspeak":{"default":"b underbar","brief":"b underbar","sbrief":"b underbar"}}},{"category":"Ll","key":"1E0B","mappings":{"default":{"default":"latin small letter d with dot above","alternative":"latin small letter d overdot","short":"d overdot"},"mathspeak":{"default":"modifying above d with dot","brief":"mod above d with dot","sbrief":"mod above d with dot"}}},{"category":"Ll","key":"1E0D","mappings":{"default":{"default":"latin small letter d with dot below","alternative":"latin small letter d underdot","short":"d underdot"},"mathspeak":{"default":"modifying below d with dot","brief":"mod below d with dot","sbrief":"mod below d with dot"}}},{"category":"Ll","key":"1E0F","mappings":{"default":{"default":"latin small letter d with line below","alternative":"latin small letter d underbar","short":"d underbar"},"mathspeak":{"default":"d underbar","brief":"d underbar","sbrief":"d underbar"}}},{"category":"Ll","key":"1E11","mappings":{"default":{"default":"latin small letter d with cedilla","alternative":"latin small letter d cedilla","short":"d cedilla"},"mathspeak":{"default":"modifying above d with cedilla","brief":"mod above d with cedilla","sbrief":"mod above d with cedilla"}}},{"category":"Ll","key":"1E13","mappings":{"default":{"default":"latin small letter d with circumflex below","alternative":"latin small letter d underhat","short":"d underhat"},"mathspeak":{"default":"modifying below d with caret","brief":"mod below d with caret","sbrief":"mod below d with caret"}}},{"category":"Ll","key":"1E19","mappings":{"default":{"default":"latin small letter e with circumflex below","alternative":"latin small letter e underhat","short":"e underhat"},"mathspeak":{"default":"modifying below e with caret","brief":"mod below e with caret","sbrief":"mod below e with caret"}}},{"category":"Ll","key":"1E1B","mappings":{"default":{"default":"latin small letter e with tilde below","alternative":"latin small letter e tilde below","short":"e tilde below"},"mathspeak":{"default":"e undertilde","brief":"e undertilde","sbrief":"e undertilde"}}},{"category":"Ll","key":"1E1F","mappings":{"default":{"default":"latin small letter f with dot above","alternative":"latin small letter f overdot","short":"f overdot"},"mathspeak":{"default":"modifying above f with dot","brief":"mod above f with dot","sbrief":"mod above f with dot"}}},{"category":"Ll","key":"1E21","mappings":{"default":{"default":"latin small letter g with macron","alternative":"latin small letter g overbar","short":"g overbar"},"mathspeak":{"default":"g overbar","brief":"g overbar","sbrief":"g overbar"}}},{"category":"Ll","key":"1E23","mappings":{"default":{"default":"latin small letter h with dot above","alternative":"latin small letter h overdot","short":"h overdot"},"mathspeak":{"default":"modifying above h with dot","brief":"mod above h with dot","sbrief":"mod above h with dot"}}},{"category":"Ll","key":"1E25","mappings":{"default":{"default":"latin small letter h with dot below","alternative":"latin small letter h underdot","short":"h underdot"},"mathspeak":{"default":"modifying below h with dot","brief":"mod below h with dot","sbrief":"mod below h with dot"}}},{"category":"Ll","key":"1E27","mappings":{"default":{"default":"latin small letter h with diaeresis","alternative":"latin small letter h double overdot","short":"h double overdot"},"mathspeak":{"default":"modifying above h with double dot","brief":"mod above h with double dot","sbrief":"mod above h with double dot"}}},{"category":"Ll","key":"1E29","mappings":{"default":{"default":"latin small letter h with cedilla","alternative":"latin small letter h cedilla","short":"h cedilla"},"mathspeak":{"default":"modifying above h with cedilla","brief":"mod above h with cedilla","sbrief":"mod above h with cedilla"}}},{"category":"Ll","key":"1E2B","mappings":{"default":{"default":"latin small letter h with breve below","alternative":"latin small letter h breve below","short":"h breve below"},"mathspeak":{"default":"modifying below h with breve below","brief":"mod below h with breve below","sbrief":"mod below h with breve below"}}},{"category":"Ll","key":"1E2D","mappings":{"default":{"default":"latin small letter i with tilde below","alternative":"latin small letter i tilde below","short":"i tilde below"},"mathspeak":{"default":"i undertilde","brief":"i undertilde","sbrief":"i undertilde"}}},{"category":"Ll","key":"1E31","mappings":{"default":{"default":"latin small letter k with acute","alternative":"latin small letter k acute","short":"k acute"},"mathspeak":{"default":"modifying above k with acute","brief":"mod above k with acute","sbrief":"mod above k with acute"}}},{"category":"Ll","key":"1E33","mappings":{"default":{"default":"latin small letter k with dot below","alternative":"latin small letter k underdot","short":"k underdot"},"mathspeak":{"default":"modifying below k with dot","brief":"mod below k with dot","sbrief":"mod below k with dot"}}},{"category":"Ll","key":"1E35","mappings":{"default":{"default":"latin small letter k with line below","alternative":"latin small letter k underbar","short":"k underbar"},"mathspeak":{"default":"k underbar","brief":"k underbar","sbrief":"k underbar"}}},{"category":"Ll","key":"1E37","mappings":{"default":{"default":"latin small letter l with dot below","alternative":"latin small letter l underdot","short":"l underdot"},"mathspeak":{"default":"modifying below l with dot","brief":"mod below l with dot","sbrief":"mod below l with dot"}}},{"category":"Ll","key":"1E3B","mappings":{"default":{"default":"latin small letter l with line below","alternative":"latin small letter l underbar","short":"l underbar"},"mathspeak":{"default":"l underbar","brief":"l underbar","sbrief":"l underbar"}}},{"category":"Ll","key":"1E3D","mappings":{"default":{"default":"latin small letter l with circumflex below","alternative":"latin small letter l underhat","short":"l underhat"},"mathspeak":{"default":"modifying below l with caret","brief":"mod below l with caret","sbrief":"mod below l with caret"}}},{"category":"Ll","key":"1E3F","mappings":{"default":{"default":"latin small letter m with acute","alternative":"latin small letter m acute","short":"m acute"},"mathspeak":{"default":"modifying above m with acute","brief":"mod above m with acute","sbrief":"mod above m with acute"}}},{"category":"Ll","key":"1E41","mappings":{"default":{"default":"latin small letter m with dot above","alternative":"latin small letter m overdot","short":"m overdot"},"mathspeak":{"default":"modifying above m with dot","brief":"mod above m with dot","sbrief":"mod above m with dot"}}},{"category":"Ll","key":"1E43","mappings":{"default":{"default":"latin small letter m with dot below","alternative":"latin small letter m underdot","short":"m underdot"},"mathspeak":{"default":"modifying below m with dot","brief":"mod below m with dot","sbrief":"mod below m with dot"}}},{"category":"Ll","key":"1E45","mappings":{"default":{"default":"latin small letter n with dot above","alternative":"latin small letter n overdot","short":"n overdot"},"mathspeak":{"default":"modifying above n with dot","brief":"mod above n with dot","sbrief":"mod above n with dot"}}},{"category":"Ll","key":"1E47","mappings":{"default":{"default":"latin small letter n with dot below","alternative":"latin small letter n underdot","short":"n underdot"},"mathspeak":{"default":"modifying below n with dot","brief":"mod below n with dot","sbrief":"mod below n with dot"}}},{"category":"Ll","key":"1E49","mappings":{"default":{"default":"latin small letter n with line below","alternative":"latin small letter n underbar","short":"n underbar"},"mathspeak":{"default":"n underbar","brief":"n underbar","sbrief":"n underbar"}}},{"category":"Ll","key":"1E4B","mappings":{"default":{"default":"latin small letter n with circumflex below","alternative":"latin small letter n underhat","short":"n underhat"},"mathspeak":{"default":"modifying below n with caret","brief":"mod below n with caret","sbrief":"mod below n with caret"}}},{"category":"Ll","key":"1E55","mappings":{"default":{"default":"latin small letter p with acute","alternative":"latin small letter p acute","short":"p acute"},"mathspeak":{"default":"modifying above p with acute","brief":"mod above p with acute","sbrief":"mod above p with acute"}}},{"category":"Ll","key":"1E57","mappings":{"default":{"default":"latin small letter p with dot above","alternative":"latin small letter p overdot","short":"p overdot"},"mathspeak":{"default":"modifying above p with dot","brief":"mod above p with dot","sbrief":"mod above p with dot"}}},{"category":"Ll","key":"1E59","mappings":{"default":{"default":"latin small letter r with dot above","alternative":"latin small letter r overdot","short":"r overdot"},"mathspeak":{"default":"modifying above r with dot","brief":"mod above r with dot","sbrief":"mod above r with dot"}}},{"category":"Ll","key":"1E5B","mappings":{"default":{"default":"latin small letter r with dot below","alternative":"latin small letter r underdot","short":"r underdot"},"mathspeak":{"default":"modifying below r with dot","brief":"mod below r with dot","sbrief":"mod below r with dot"}}},{"category":"Ll","key":"1E5F","mappings":{"default":{"default":"latin small letter r with line below","alternative":"latin small letter r underbar","short":"r underbar"},"mathspeak":{"default":"r underbar","brief":"r underbar","sbrief":"r underbar"}}},{"category":"Ll","key":"1E61","mappings":{"default":{"default":"latin small letter s with dot above","alternative":"latin small letter s overdot","short":"s overdot"},"mathspeak":{"default":"modifying above s with dot","brief":"mod above s with dot","sbrief":"mod above s with dot"}}},{"category":"Ll","key":"1E63","mappings":{"default":{"default":"latin small letter s with dot below","alternative":"latin small letter s underdot","short":"s underdot"},"mathspeak":{"default":"modifying below s with dot","brief":"mod below s with dot","sbrief":"mod below s with dot"}}},{"category":"Ll","key":"1E6B","mappings":{"default":{"default":"latin small letter t with dot above","alternative":"latin small letter t overdot","short":"t overdot"},"mathspeak":{"default":"modifying above t with dot","brief":"mod above t with dot","sbrief":"mod above t with dot"}}},{"category":"Ll","key":"1E6D","mappings":{"default":{"default":"latin small letter t with dot below","alternative":"latin small letter t underdot","short":"t underdot"},"mathspeak":{"default":"modifying below t with dot","brief":"mod below t with dot","sbrief":"mod below t with dot"}}},{"category":"Ll","key":"1E6F","mappings":{"default":{"default":"latin small letter t with line below","alternative":"latin small letter t underbar","short":"t underbar"},"mathspeak":{"default":"t underbar","brief":"t underbar","sbrief":"t underbar"}}},{"category":"Ll","key":"1E71","mappings":{"default":{"default":"latin small letter t with circumflex below","alternative":"latin small letter t underhat","short":"t underhat"},"mathspeak":{"default":"modifying below t with caret","brief":"mod below t with caret","sbrief":"mod below t with caret"}}},{"category":"Ll","key":"1E73","mappings":{"default":{"default":"latin small letter u with diaeresis below","alternative":"latin small letter u double underdot","short":"u double underdot"},"mathspeak":{"default":"modifying below u with double dot","brief":"mod below u with double dot","sbrief":"mod below u with double dot"}}},{"category":"Ll","key":"1E75","mappings":{"default":{"default":"latin small letter u with tilde below","alternative":"latin small letter u tilde below","short":"u tilde below"},"mathspeak":{"default":"u undertilde","brief":"u undertilde","sbrief":"u undertilde"}}},{"category":"Ll","key":"1E77","mappings":{"default":{"default":"latin small letter u with circumflex below","alternative":"latin small letter u underhat","short":"u underhat"},"mathspeak":{"default":"modifying below u with caret","brief":"mod below u with caret","sbrief":"mod below u with caret"}}},{"category":"Ll","key":"1E7D","mappings":{"default":{"default":"latin small letter v with tilde","alternative":"latin small letter v tilde","short":"v tilde"},"mathspeak":{"default":"v overtilde","brief":"v overtilde","sbrief":"v overtilde"}}},{"category":"Ll","key":"1E7F","mappings":{"default":{"default":"latin small letter v with dot below","alternative":"latin small letter v underdot","short":"v underdot"},"mathspeak":{"default":"modifying below v with dot","brief":"mod below v with dot","sbrief":"mod below v with dot"}}},{"category":"Ll","key":"1E81","mappings":{"default":{"default":"latin small letter w with grave","alternative":"latin small letter w grave","short":"w grave"},"mathspeak":{"default":"modifying above w with grave","brief":"mod above w with grave","sbrief":"mod above w with grave"}}},{"category":"Ll","key":"1E83","mappings":{"default":{"default":"latin small letter w with acute","alternative":"latin small letter w acute","short":"w acute"},"mathspeak":{"default":"modifying above w with acute","brief":"mod above w with acute","sbrief":"mod above w with acute"}}},{"category":"Ll","key":"1E85","mappings":{"default":{"default":"latin small letter w with diaeresis","alternative":"latin small letter w double overdot","short":"w double overdot"},"mathspeak":{"default":"modifying above w with double dot","brief":"mod above w with double dot","sbrief":"mod above w with double dot"}}},{"category":"Ll","key":"1E87","mappings":{"default":{"default":"latin small letter w with dot above","alternative":"latin small letter w overdot","short":"w overdot"},"mathspeak":{"default":"modifying above w with dot","brief":"mod above w with dot","sbrief":"mod above w with dot"}}},{"category":"Ll","key":"1E89","mappings":{"default":{"default":"latin small letter w with dot below","alternative":"latin small letter w underdot","short":"w underdot"},"mathspeak":{"default":"modifying below w with dot","brief":"mod below w with dot","sbrief":"mod below w with dot"}}},{"category":"Ll","key":"1E8B","mappings":{"default":{"default":"latin small letter x with dot above","alternative":"latin small letter x overdot","short":"x overdot"},"mathspeak":{"default":"modifying above x with dot","brief":"mod above x with dot","sbrief":"mod above x with dot"}}},{"category":"Ll","key":"1E8D","mappings":{"default":{"default":"latin small letter x with diaeresis","alternative":"latin small letter x double overdot","short":"x double overdot"},"mathspeak":{"default":"modifying above x with double dot","brief":"mod above x with double dot","sbrief":"mod above x with double dot"}}},{"category":"Ll","key":"1E8F","mappings":{"default":{"default":"latin small letter y with dot above","alternative":"latin small letter y overdot","short":"y overdot"},"mathspeak":{"default":"modifying above y with dot","brief":"mod above y with dot","sbrief":"mod above y with dot"}}},{"category":"Ll","key":"1E91","mappings":{"default":{"default":"latin small letter z with circumflex","alternative":"latin small letter z hat","short":"z hat"},"mathspeak":{"default":"modifying above z with caret","brief":"mod above z with caret","sbrief":"mod above z with caret"}}},{"category":"Ll","key":"1E93","mappings":{"default":{"default":"latin small letter z with dot below","alternative":"latin small letter z underdot","short":"z underdot"},"mathspeak":{"default":"modifying below z with dot","brief":"mod below z with dot","sbrief":"mod below z with dot"}}},{"category":"Ll","key":"1E95","mappings":{"default":{"default":"latin small letter z with line below","alternative":"latin small letter z underbar","short":"z underbar"},"mathspeak":{"default":"z underbar","brief":"z underbar","sbrief":"z underbar"}}},{"category":"Ll","key":"1E96","mappings":{"default":{"default":"latin small letter h with line below","alternative":"latin small letter h underbar","short":"h underbar"},"mathspeak":{"default":"h underbar","brief":"h underbar","sbrief":"h underbar"}}},{"category":"Ll","key":"1E97","mappings":{"default":{"default":"latin small letter t with diaeresis","alternative":"latin small letter t double overdot","short":"t double overdot"},"mathspeak":{"default":"modifying above t with double dot","brief":"mod above t with double dot","sbrief":"mod above t with double dot"}}},{"category":"Ll","key":"1E98","mappings":{"default":{"default":"latin small letter w with ring above","alternative":"latin small letter w ring","short":"w ring"},"mathspeak":{"default":"modifying above w with ring","brief":"mod above w with ring","sbrief":"mod above w with ring"}}},{"category":"Ll","key":"1E99","mappings":{"default":{"default":"latin small letter y with ring above","alternative":"latin small letter y ring","short":"y ring"},"mathspeak":{"default":"modifying above y with ring","brief":"mod above y with ring","sbrief":"mod above y with ring"}}},{"category":"Ll","key":"1E9A","mappings":{"default":{"default":"latin small letter a with right half ring","alternative":"latin small letter a right half ring","short":"a right half ring"},"mathspeak":{"default":"modifying above a with right half ring","brief":"mod above a with right half ring","sbrief":"mod above a with right half ring"}}},{"category":"Ll","key":"1EA1","mappings":{"default":{"default":"latin small letter a with dot below","alternative":"latin small letter a underdot","short":"a underdot"},"mathspeak":{"default":"modifying below a with dot","brief":"mod below a with dot","sbrief":"mod below a with dot"}}},{"category":"Ll","key":"1EA3","mappings":{"default":{"default":"latin small letter a with hook above","alternative":"latin small letter a hook","short":"a hook"},"mathspeak":{"default":"modifying above a with hook","brief":"mod above a with hook","sbrief":"mod above a with hook"}}},{"category":"Ll","key":"1EB9","mappings":{"default":{"default":"latin small letter e with dot below","alternative":"latin small letter e underdot","short":"e underdot"},"mathspeak":{"default":"modifying below e with dot","brief":"mod below e with dot","sbrief":"mod below e with dot"}}},{"category":"Ll","key":"1EBB","mappings":{"default":{"default":"latin small letter e with hook above","alternative":"latin small letter e hook","short":"e hook"},"mathspeak":{"default":"modifying above e with hook","brief":"mod above e with hook","sbrief":"mod above e with hook"}}},{"category":"Ll","key":"1EBD","mappings":{"default":{"default":"latin small letter e with tilde","alternative":"latin small letter e tilde","short":"e tilde"},"mathspeak":{"default":"e overtilde","brief":"e overtilde","sbrief":"e overtilde"}}},{"category":"Ll","key":"1EC9","mappings":{"default":{"default":"latin small letter i with hook above","alternative":"latin small letter i hook","short":"i hook"},"mathspeak":{"default":"modifying above i with hook","brief":"mod above i with hook","sbrief":"mod above i with hook"}}},{"category":"Ll","key":"1ECB","mappings":{"default":{"default":"latin small letter i with dot below","alternative":"latin small letter i underdot","short":"i underdot"},"mathspeak":{"default":"modifying below i with dot","brief":"mod below i with dot","sbrief":"mod below i with dot"}}},{"category":"Ll","key":"1ECD","mappings":{"default":{"default":"latin small letter o with dot below","alternative":"latin small letter o underdot","short":"o underdot"},"mathspeak":{"default":"modifying below o with dot","brief":"mod below o with dot","sbrief":"mod below o with dot"}}},{"category":"Ll","key":"1ECF","mappings":{"default":{"default":"latin small letter o with hook above","alternative":"latin small letter o hook","short":"o hook"},"mathspeak":{"default":"modifying above o with hook","brief":"mod above o with hook","sbrief":"mod above o with hook"}}},{"category":"Ll","key":"1EE5","mappings":{"default":{"default":"latin small letter u with dot below","alternative":"latin small letter u underdot","short":"u underdot"},"mathspeak":{"default":"modifying below u with dot","brief":"mod below u with dot","sbrief":"mod below u with dot"}}},{"category":"Ll","key":"1EE7","mappings":{"default":{"default":"latin small letter u with hook above","alternative":"latin small letter u hook","short":"u hook"},"mathspeak":{"default":"modifying above u with hook","brief":"mod above u with hook","sbrief":"mod above u with hook"}}},{"category":"Ll","key":"1EF3","mappings":{"default":{"default":"latin small letter y with grave","alternative":"latin small letter y grave","short":"y grave"},"mathspeak":{"default":"modifying above y with grave","brief":"mod above y with grave","sbrief":"mod above y with grave"}}},{"category":"Ll","key":"1EF5","mappings":{"default":{"default":"latin small letter y with dot below","alternative":"latin small letter y underdot","short":"y underdot"},"mathspeak":{"default":"modifying below y with dot","brief":"mod below y with dot","sbrief":"mod below y with dot"}}},{"category":"Ll","key":"1EF7","mappings":{"default":{"default":"latin small letter y with hook above","alternative":"latin small letter y hook","short":"y hook"},"mathspeak":{"default":"modifying above y with hook","brief":"mod above y with hook","sbrief":"mod above y with hook"}}},{"category":"Ll","key":"1EF9","mappings":{"default":{"default":"latin small letter y with tilde","alternative":"latin small letter y tilde","short":"y tilde"},"mathspeak":{"default":"y overtilde","brief":"y overtilde","sbrief":"y overtilde"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold-fraktur.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold-fraktur.js
deleted file mode 100644
index 4de56831..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold-fraktur.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital a","short":"bold fraktur cap a"},"mathspeak":{"default":"bold fraktur upper A"}},"key":"1D56C"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital b","short":"bold fraktur cap b"},"mathspeak":{"default":"bold fraktur upper B"}},"key":"1D56D"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital c","short":"bold fraktur cap c"},"mathspeak":{"default":"bold fraktur upper C"}},"key":"1D56E"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital d","short":"bold fraktur cap d"},"mathspeak":{"default":"bold fraktur upper D"}},"key":"1D56F"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital e","short":"bold fraktur cap e"},"mathspeak":{"default":"bold fraktur upper E"}},"key":"1D570"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital f","short":"bold fraktur cap f"},"mathspeak":{"default":"bold fraktur upper F"}},"key":"1D571"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital g","short":"bold fraktur cap g"},"mathspeak":{"default":"bold fraktur upper G"}},"key":"1D572"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital h","short":"bold fraktur cap h"},"mathspeak":{"default":"bold fraktur upper H"}},"key":"1D573"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital i","short":"bold fraktur cap i"},"mathspeak":{"default":"bold fraktur upper I"}},"key":"1D574"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital j","short":"bold fraktur cap j"},"mathspeak":{"default":"bold fraktur upper J"}},"key":"1D575"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital k","short":"bold fraktur cap k"},"mathspeak":{"default":"bold fraktur upper K"}},"key":"1D576"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital l","short":"bold fraktur cap l"},"mathspeak":{"default":"bold fraktur upper L"}},"key":"1D577"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital m","short":"bold fraktur cap m"},"mathspeak":{"default":"bold fraktur upper M"}},"key":"1D578"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital n","short":"bold fraktur cap n"},"mathspeak":{"default":"bold fraktur upper N"}},"key":"1D579"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital o","short":"bold fraktur cap o"},"mathspeak":{"default":"bold fraktur upper O"}},"key":"1D57A"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital p","short":"bold fraktur cap p"},"mathspeak":{"default":"bold fraktur upper P"}},"key":"1D57B"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital q","short":"bold fraktur cap q"},"mathspeak":{"default":"bold fraktur upper Q"}},"key":"1D57C"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital r","short":"bold fraktur cap r"},"mathspeak":{"default":"bold fraktur upper R"}},"key":"1D57D"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital s","short":"bold fraktur cap s"},"mathspeak":{"default":"bold fraktur upper S"}},"key":"1D57E"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital t","short":"bold fraktur cap t"},"mathspeak":{"default":"bold fraktur upper T"}},"key":"1D57F"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital u","short":"bold fraktur cap u"},"mathspeak":{"default":"bold fraktur upper U"}},"key":"1D580"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital v","short":"bold fraktur cap v"},"mathspeak":{"default":"bold fraktur upper V"}},"key":"1D581"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital w","short":"bold fraktur cap w"},"mathspeak":{"default":"bold fraktur upper W"}},"key":"1D582"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital x","short":"bold fraktur cap x"},"mathspeak":{"default":"bold fraktur upper X"}},"key":"1D583"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital y","short":"bold fraktur cap y"},"mathspeak":{"default":"bold fraktur upper Y"}},"key":"1D584"},{"category":"Lu","mappings":{"default":{"default":"bold fraktur capital z","short":"bold fraktur cap z"},"mathspeak":{"default":"bold fraktur upper Z"}},"key":"1D585"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small a","short":"bold fraktur a"}},"key":"1D586"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small b","short":"bold fraktur b"}},"key":"1D587"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small c","short":"bold fraktur c"}},"key":"1D588"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small d","short":"bold fraktur d"}},"key":"1D589"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small e","short":"bold fraktur e"}},"key":"1D58A"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small f","short":"bold fraktur f"}},"key":"1D58B"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small g","short":"bold fraktur g"}},"key":"1D58C"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small h","short":"bold fraktur h"}},"key":"1D58D"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small i","short":"bold fraktur i"}},"key":"1D58E"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small j","short":"bold fraktur j"}},"key":"1D58F"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small k","short":"bold fraktur k"}},"key":"1D590"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small l","short":"bold fraktur l"}},"key":"1D591"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small m","short":"bold fraktur m"}},"key":"1D592"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small n","short":"bold fraktur n"}},"key":"1D593"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small o","short":"bold fraktur o"}},"key":"1D594"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small p","short":"bold fraktur p"}},"key":"1D595"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small q","short":"bold fraktur q"}},"key":"1D596"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small r","short":"bold fraktur r"}},"key":"1D597"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small s","short":"bold fraktur s"}},"key":"1D598"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small t","short":"bold fraktur t"}},"key":"1D599"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small u","short":"bold fraktur u"}},"key":"1D59A"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small v","short":"bold fraktur v"}},"key":"1D59B"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small w","short":"bold fraktur w"}},"key":"1D59C"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small x","short":"bold fraktur x"}},"key":"1D59D"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small y","short":"bold fraktur y"}},"key":"1D59E"},{"category":"Ll","mappings":{"default":{"default":"bold fraktur small z","short":"bold fraktur z"}},"key":"1D59F"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold-script.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold-script.js
deleted file mode 100644
index 5f818c2d..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold-script.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"bold script capital a","short":"bold script cap a"},"mathspeak":{"default":"bold script upper A"}},"key":"1D4D0"},{"category":"Lu","mappings":{"default":{"default":"bold script capital b","short":"bold script cap b"},"mathspeak":{"default":"bold script upper B"}},"key":"1D4D1"},{"category":"Lu","mappings":{"default":{"default":"bold script capital c","short":"bold script cap c"},"mathspeak":{"default":"bold script upper C"}},"key":"1D4D2"},{"category":"Lu","mappings":{"default":{"default":"bold script capital d","short":"bold script cap d"},"mathspeak":{"default":"bold script upper D"}},"key":"1D4D3"},{"category":"Lu","mappings":{"default":{"default":"bold script capital e","short":"bold script cap e"},"mathspeak":{"default":"bold script upper E"}},"key":"1D4D4"},{"category":"Lu","mappings":{"default":{"default":"bold script capital f","short":"bold script cap f"},"mathspeak":{"default":"bold script upper F"}},"key":"1D4D5"},{"category":"Lu","mappings":{"default":{"default":"bold script capital g","short":"bold script cap g"},"mathspeak":{"default":"bold script upper G"}},"key":"1D4D6"},{"category":"Lu","mappings":{"default":{"default":"bold script capital h","short":"bold script cap h"},"mathspeak":{"default":"bold script upper H"}},"key":"1D4D7"},{"category":"Lu","mappings":{"default":{"default":"bold script capital i","short":"bold script cap i"},"mathspeak":{"default":"bold script upper I"}},"key":"1D4D8"},{"category":"Lu","mappings":{"default":{"default":"bold script capital j","short":"bold script cap j"},"mathspeak":{"default":"bold script upper J"}},"key":"1D4D9"},{"category":"Lu","mappings":{"default":{"default":"bold script capital k","short":"bold script cap k"},"mathspeak":{"default":"bold script upper K"}},"key":"1D4DA"},{"category":"Lu","mappings":{"default":{"default":"bold script capital l","short":"bold script cap l"},"mathspeak":{"default":"bold script upper L"}},"key":"1D4DB"},{"category":"Lu","mappings":{"default":{"default":"bold script capital m","short":"bold script cap m"},"mathspeak":{"default":"bold script upper M"}},"key":"1D4DC"},{"category":"Lu","mappings":{"default":{"default":"bold script capital n","short":"bold script cap n"},"mathspeak":{"default":"bold script upper N"}},"key":"1D4DD"},{"category":"Lu","mappings":{"default":{"default":"bold script capital o","short":"bold script cap o"},"mathspeak":{"default":"bold script upper O"}},"key":"1D4DE"},{"category":"Lu","mappings":{"default":{"default":"bold script capital p","short":"bold script cap p"},"mathspeak":{"default":"bold script upper P"}},"key":"1D4DF"},{"category":"Lu","mappings":{"default":{"default":"bold script capital q","short":"bold script cap q"},"mathspeak":{"default":"bold script upper Q"}},"key":"1D4E0"},{"category":"Lu","mappings":{"default":{"default":"bold script capital r","short":"bold script cap r"},"mathspeak":{"default":"bold script upper R"}},"key":"1D4E1"},{"category":"Lu","mappings":{"default":{"default":"bold script capital s","short":"bold script cap s"},"mathspeak":{"default":"bold script upper S"}},"key":"1D4E2"},{"category":"Lu","mappings":{"default":{"default":"bold script capital t","short":"bold script cap t"},"mathspeak":{"default":"bold script upper T"}},"key":"1D4E3"},{"category":"Lu","mappings":{"default":{"default":"bold script capital u","short":"bold script cap u"},"mathspeak":{"default":"bold script upper U"}},"key":"1D4E4"},{"category":"Lu","mappings":{"default":{"default":"bold script capital v","short":"bold script cap v"},"mathspeak":{"default":"bold script upper V"}},"key":"1D4E5"},{"category":"Lu","mappings":{"default":{"default":"bold script capital w","short":"bold script cap w"},"mathspeak":{"default":"bold script upper W"}},"key":"1D4E6"},{"category":"Lu","mappings":{"default":{"default":"bold script capital x","short":"bold script cap x"},"mathspeak":{"default":"bold script upper X"}},"key":"1D4E7"},{"category":"Lu","mappings":{"default":{"default":"bold script capital y","short":"bold script cap y"},"mathspeak":{"default":"bold script upper Y"}},"key":"1D4E8"},{"category":"Lu","mappings":{"default":{"default":"bold script capital z","short":"bold script cap z"},"mathspeak":{"default":"bold script upper Z"}},"key":"1D4E9"},{"category":"Ll","mappings":{"default":{"default":"bold script small a","short":"bold script a"}},"key":"1D4EA"},{"category":"Ll","mappings":{"default":{"default":"bold script small b","short":"bold script b"}},"key":"1D4EB"},{"category":"Ll","mappings":{"default":{"default":"bold script small c","short":"bold script c"}},"key":"1D4EC"},{"category":"Ll","mappings":{"default":{"default":"bold script small d","short":"bold script d"}},"key":"1D4ED"},{"category":"Ll","mappings":{"default":{"default":"bold script small e","short":"bold script e"}},"key":"1D4EE"},{"category":"Ll","mappings":{"default":{"default":"bold script small f","short":"bold script f"}},"key":"1D4EF"},{"category":"Ll","mappings":{"default":{"default":"bold script small g","short":"bold script g"}},"key":"1D4F0"},{"category":"Ll","mappings":{"default":{"default":"bold script small h","short":"bold script h"}},"key":"1D4F1"},{"category":"Ll","mappings":{"default":{"default":"bold script small i","short":"bold script i"}},"key":"1D4F2"},{"category":"Ll","mappings":{"default":{"default":"bold script small j","short":"bold script j"}},"key":"1D4F3"},{"category":"Ll","mappings":{"default":{"default":"bold script small k","short":"bold script k"}},"key":"1D4F4"},{"category":"Ll","mappings":{"default":{"default":"bold script small l","short":"bold script l"}},"key":"1D4F5"},{"category":"Ll","mappings":{"default":{"default":"bold script small m","short":"bold script m"}},"key":"1D4F6"},{"category":"Ll","mappings":{"default":{"default":"bold script small n","short":"bold script n"}},"key":"1D4F7"},{"category":"Ll","mappings":{"default":{"default":"bold script small o","short":"bold script o"}},"key":"1D4F8"},{"category":"Ll","mappings":{"default":{"default":"bold script small p","short":"bold script p"}},"key":"1D4F9"},{"category":"Ll","mappings":{"default":{"default":"bold script small q","short":"bold script q"}},"key":"1D4FA"},{"category":"Ll","mappings":{"default":{"default":"bold script small r","short":"bold script r"}},"key":"1D4FB"},{"category":"Ll","mappings":{"default":{"default":"bold script small s","short":"bold script s"}},"key":"1D4FC"},{"category":"Ll","mappings":{"default":{"default":"bold script small t","short":"bold script t"}},"key":"1D4FD"},{"category":"Ll","mappings":{"default":{"default":"bold script small u","short":"bold script u"}},"key":"1D4FE"},{"category":"Ll","mappings":{"default":{"default":"bold script small v","short":"bold script v"}},"key":"1D4FF"},{"category":"Ll","mappings":{"default":{"default":"bold script small w","short":"bold script w"}},"key":"1D500"},{"category":"Ll","mappings":{"default":{"default":"bold script small x","short":"bold script x"}},"key":"1D501"},{"category":"Ll","mappings":{"default":{"default":"bold script small y","short":"bold script y"}},"key":"1D502"},{"category":"Ll","mappings":{"default":{"default":"bold script small z","short":"bold script z"}},"key":"1D503"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold.js
deleted file mode 100644
index 37992baa..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-bold.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"bold capital a","short":"bold cap a"},"mathspeak":{"default":"bold upper A"}},"key":"1D400"},{"category":"Lu","mappings":{"default":{"default":"bold capital b","short":"bold cap b"},"mathspeak":{"default":"bold upper B"}},"key":"1D401"},{"category":"Lu","mappings":{"default":{"default":"bold capital c","short":"bold cap c"},"mathspeak":{"default":"bold upper C"}},"key":"1D402"},{"category":"Lu","mappings":{"default":{"default":"bold capital d","short":"bold cap d"},"mathspeak":{"default":"bold upper D"}},"key":"1D403"},{"category":"Lu","mappings":{"default":{"default":"bold capital e","short":"bold cap e"},"mathspeak":{"default":"bold upper E"}},"key":"1D404"},{"category":"Lu","mappings":{"default":{"default":"bold capital f","short":"bold cap f"},"mathspeak":{"default":"bold upper F"}},"key":"1D405"},{"category":"Lu","mappings":{"default":{"default":"bold capital g","short":"bold cap g"},"mathspeak":{"default":"bold upper G"}},"key":"1D406"},{"category":"Lu","mappings":{"default":{"default":"bold capital h","short":"bold cap h"},"mathspeak":{"default":"bold upper H"}},"key":"1D407"},{"category":"Lu","mappings":{"default":{"default":"bold capital i","short":"bold cap i"},"mathspeak":{"default":"bold upper I"}},"key":"1D408"},{"category":"Lu","mappings":{"default":{"default":"bold capital j","short":"bold cap j"},"mathspeak":{"default":"bold upper J"}},"key":"1D409"},{"category":"Lu","mappings":{"default":{"default":"bold capital k","short":"bold cap k"},"mathspeak":{"default":"bold upper K"}},"key":"1D40A"},{"category":"Lu","mappings":{"default":{"default":"bold capital l","short":"bold cap l"},"mathspeak":{"default":"bold upper L"}},"key":"1D40B"},{"category":"Lu","mappings":{"default":{"default":"bold capital m","short":"bold cap m"},"mathspeak":{"default":"bold upper M"}},"key":"1D40C"},{"category":"Lu","mappings":{"default":{"default":"bold capital n","short":"bold cap n"},"mathspeak":{"default":"bold upper N"}},"key":"1D40D"},{"category":"Lu","mappings":{"default":{"default":"bold capital o","short":"bold cap o"},"mathspeak":{"default":"bold upper O"}},"key":"1D40E"},{"category":"Lu","mappings":{"default":{"default":"bold capital p","short":"bold cap p"},"mathspeak":{"default":"bold upper P"}},"key":"1D40F"},{"category":"Lu","mappings":{"default":{"default":"bold capital q","short":"bold cap q"},"mathspeak":{"default":"bold upper Q"}},"key":"1D410"},{"category":"Lu","mappings":{"default":{"default":"bold capital r","short":"bold cap r"},"mathspeak":{"default":"bold upper R"}},"key":"1D411"},{"category":"Lu","mappings":{"default":{"default":"bold capital s","short":"bold cap s"},"mathspeak":{"default":"bold upper S"}},"key":"1D412"},{"category":"Lu","mappings":{"default":{"default":"bold capital t","short":"bold cap t"},"mathspeak":{"default":"bold upper T"}},"key":"1D413"},{"category":"Lu","mappings":{"default":{"default":"bold capital u","short":"bold cap u"},"mathspeak":{"default":"bold upper U"}},"key":"1D414"},{"category":"Lu","mappings":{"default":{"default":"bold capital v","short":"bold cap v"},"mathspeak":{"default":"bold upper V"}},"key":"1D415"},{"category":"Lu","mappings":{"default":{"default":"bold capital w","short":"bold cap w"},"mathspeak":{"default":"bold upper W"}},"key":"1D416"},{"category":"Lu","mappings":{"default":{"default":"bold capital x","short":"bold cap x"},"mathspeak":{"default":"bold upper X"}},"key":"1D417"},{"category":"Lu","mappings":{"default":{"default":"bold capital y","short":"bold cap y"},"mathspeak":{"default":"bold upper Y"}},"key":"1D418"},{"category":"Lu","mappings":{"default":{"default":"bold capital z","short":"bold cap z"},"mathspeak":{"default":"bold upper Z"}},"key":"1D419"},{"category":"Ll","mappings":{"default":{"default":"bold small a","short":"bold a"}},"key":"1D41A"},{"category":"Ll","mappings":{"default":{"default":"bold small b","short":"bold b"}},"key":"1D41B"},{"category":"Ll","mappings":{"default":{"default":"bold small c","short":"bold c"}},"key":"1D41C"},{"category":"Ll","mappings":{"default":{"default":"bold small d","short":"bold d"}},"key":"1D41D"},{"category":"Ll","mappings":{"default":{"default":"bold small e","short":"bold e"}},"key":"1D41E"},{"category":"Ll","mappings":{"default":{"default":"bold small f","short":"bold f"}},"key":"1D41F"},{"category":"Ll","mappings":{"default":{"default":"bold small g","short":"bold g"}},"key":"1D420"},{"category":"Ll","mappings":{"default":{"default":"bold small h","short":"bold h"}},"key":"1D421"},{"category":"Ll","mappings":{"default":{"default":"bold small i","short":"bold i"}},"key":"1D422"},{"category":"Ll","mappings":{"default":{"default":"bold small j","short":"bold j"}},"key":"1D423"},{"category":"Ll","mappings":{"default":{"default":"bold small k","short":"bold k"}},"key":"1D424"},{"category":"Ll","mappings":{"default":{"default":"bold small l","short":"bold l"}},"key":"1D425"},{"category":"Ll","mappings":{"default":{"default":"bold small m","short":"bold m"}},"key":"1D426"},{"category":"Ll","mappings":{"default":{"default":"bold small n","short":"bold n"}},"key":"1D427"},{"category":"Ll","mappings":{"default":{"default":"bold small o","short":"bold o"}},"key":"1D428"},{"category":"Ll","mappings":{"default":{"default":"bold small p","short":"bold p"}},"key":"1D429"},{"category":"Ll","mappings":{"default":{"default":"bold small q","short":"bold q"}},"key":"1D42A"},{"category":"Ll","mappings":{"default":{"default":"bold small r","short":"bold r"}},"key":"1D42B"},{"category":"Ll","mappings":{"default":{"default":"bold small s","short":"bold s"}},"key":"1D42C"},{"category":"Ll","mappings":{"default":{"default":"bold small t","short":"bold t"}},"key":"1D42D"},{"category":"Ll","mappings":{"default":{"default":"bold small u","short":"bold u"}},"key":"1D42E"},{"category":"Ll","mappings":{"default":{"default":"bold small v","short":"bold v"}},"key":"1D42F"},{"category":"Ll","mappings":{"default":{"default":"bold small w","short":"bold w"}},"key":"1D430"},{"category":"Ll","mappings":{"default":{"default":"bold small x","short":"bold x"}},"key":"1D431"},{"category":"Ll","mappings":{"default":{"default":"bold small y","short":"bold y"}},"key":"1D432"},{"category":"Ll","mappings":{"default":{"default":"bold small z","short":"bold z"}},"key":"1D433"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-double-struck.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-double-struck.js
deleted file mode 100644
index a7d12386..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-double-struck.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"double struck capital a","short":"double struck cap a"},"mathspeak":{"default":"double struck upper A"}},"key":"1D538"},{"category":"Lu","mappings":{"default":{"default":"double struck capital b","short":"double struck cap b"},"mathspeak":{"default":"double struck upper B"}},"key":"1D539"},{"category":"Lu","mappings":{"default":{"default":"double struck capital c","short":"double struck cap c"},"mathspeak":{"default":"double struck upper C"}},"key":"2102"},{"category":"Lu","mappings":{"default":{"default":"double struck capital d","short":"double struck cap d"},"mathspeak":{"default":"double struck upper D"}},"key":"1D53B"},{"category":"Lu","mappings":{"default":{"default":"double struck capital e","short":"double struck cap e"},"mathspeak":{"default":"double struck upper E"}},"key":"1D53C"},{"category":"Lu","mappings":{"default":{"default":"double struck capital f","short":"double struck cap f"},"mathspeak":{"default":"double struck upper F"}},"key":"1D53D"},{"category":"Lu","mappings":{"default":{"default":"double struck capital g","short":"double struck cap g"},"mathspeak":{"default":"double struck upper G"}},"key":"1D53E"},{"category":"Lu","mappings":{"default":{"default":"double struck capital h","short":"double struck cap h"},"mathspeak":{"default":"double struck upper H"}},"key":"210D"},{"category":"Lu","mappings":{"default":{"default":"double struck capital i","short":"double struck cap i"},"mathspeak":{"default":"double struck upper I"}},"key":"1D540"},{"category":"Lu","mappings":{"default":{"default":"double struck capital j","short":"double struck cap j"},"mathspeak":{"default":"double struck upper J"}},"key":"1D541"},{"category":"Lu","mappings":{"default":{"default":"double struck capital k","short":"double struck cap k"},"mathspeak":{"default":"double struck upper K"}},"key":"1D542"},{"category":"Lu","mappings":{"default":{"default":"double struck capital l","short":"double struck cap l"},"mathspeak":{"default":"double struck upper L"}},"key":"1D543"},{"category":"Lu","mappings":{"default":{"default":"double struck capital m","short":"double struck cap m"},"mathspeak":{"default":"double struck upper M"}},"key":"1D544"},{"category":"Lu","mappings":{"default":{"default":"double struck capital n","short":"double struck cap n"},"mathspeak":{"default":"double struck upper N"}},"key":"2115"},{"category":"Lu","mappings":{"default":{"default":"double struck capital o","short":"double struck cap o"},"mathspeak":{"default":"double struck upper O"}},"key":"1D546"},{"category":"Lu","mappings":{"default":{"default":"double struck capital p","short":"double struck cap p"},"mathspeak":{"default":"double struck upper P"}},"key":"2119"},{"category":"Lu","mappings":{"default":{"default":"double struck capital q","short":"double struck cap q"},"mathspeak":{"default":"double struck upper Q"}},"key":"211A"},{"category":"Lu","mappings":{"default":{"default":"double struck capital r","short":"double struck cap r"},"mathspeak":{"default":"double struck upper R"}},"key":"211D"},{"category":"Lu","mappings":{"default":{"default":"double struck capital s","short":"double struck cap s"},"mathspeak":{"default":"double struck upper S"}},"key":"1D54A"},{"category":"Lu","mappings":{"default":{"default":"double struck capital t","short":"double struck cap t"},"mathspeak":{"default":"double struck upper T"}},"key":"1D54B"},{"category":"Lu","mappings":{"default":{"default":"double struck capital u","short":"double struck cap u"},"mathspeak":{"default":"double struck upper U"}},"key":"1D54C"},{"category":"Lu","mappings":{"default":{"default":"double struck capital v","short":"double struck cap v"},"mathspeak":{"default":"double struck upper V"}},"key":"1D54D"},{"category":"Lu","mappings":{"default":{"default":"double struck capital w","short":"double struck cap w"},"mathspeak":{"default":"double struck upper W"}},"key":"1D54E"},{"category":"Lu","mappings":{"default":{"default":"double struck capital x","short":"double struck cap x"},"mathspeak":{"default":"double struck upper X"}},"key":"1D54F"},{"category":"Lu","mappings":{"default":{"default":"double struck capital y","short":"double struck cap y"},"mathspeak":{"default":"double struck upper Y"}},"key":"1D550"},{"category":"Lu","mappings":{"default":{"default":"double struck capital z","short":"double struck cap z"},"mathspeak":{"default":"double struck upper Z"}},"key":"2124"},{"category":"Ll","mappings":{"default":{"default":"double struck small a","short":"double struck a"}},"key":"1D552"},{"category":"Ll","mappings":{"default":{"default":"double struck small b","short":"double struck b"}},"key":"1D553"},{"category":"Ll","mappings":{"default":{"default":"double struck small c","short":"double struck c"}},"key":"1D554"},{"category":"Ll","mappings":{"default":{"default":"double struck small d","short":"double struck d"}},"key":"1D555"},{"category":"Ll","mappings":{"default":{"default":"double struck small e","short":"double struck e"}},"key":"1D556"},{"category":"Ll","mappings":{"default":{"default":"double struck small f","short":"double struck f"}},"key":"1D557"},{"category":"Ll","mappings":{"default":{"default":"double struck small g","short":"double struck g"}},"key":"1D558"},{"category":"Ll","mappings":{"default":{"default":"double struck small h","short":"double struck h"}},"key":"1D559"},{"category":"Ll","mappings":{"default":{"default":"double struck small i","short":"double struck i"}},"key":"1D55A"},{"category":"Ll","mappings":{"default":{"default":"double struck small j","short":"double struck j"}},"key":"1D55B"},{"category":"Ll","mappings":{"default":{"default":"double struck small k","short":"double struck k"}},"key":"1D55C"},{"category":"Ll","mappings":{"default":{"default":"double struck small l","short":"double struck l"}},"key":"1D55D"},{"category":"Ll","mappings":{"default":{"default":"double struck small m","short":"double struck m"}},"key":"1D55E"},{"category":"Ll","mappings":{"default":{"default":"double struck small n","short":"double struck n"}},"key":"1D55F"},{"category":"Ll","mappings":{"default":{"default":"double struck small o","short":"double struck o"}},"key":"1D560"},{"category":"Ll","mappings":{"default":{"default":"double struck small p","short":"double struck p"}},"key":"1D561"},{"category":"Ll","mappings":{"default":{"default":"double struck small q","short":"double struck q"}},"key":"1D562"},{"category":"Ll","mappings":{"default":{"default":"double struck small r","short":"double struck r"}},"key":"1D563"},{"category":"Ll","mappings":{"default":{"default":"double struck small s","short":"double struck s"}},"key":"1D564"},{"category":"Ll","mappings":{"default":{"default":"double struck small t","short":"double struck t"}},"key":"1D565"},{"category":"Ll","mappings":{"default":{"default":"double struck small u","short":"double struck u"}},"key":"1D566"},{"category":"Ll","mappings":{"default":{"default":"double struck small v","short":"double struck v"}},"key":"1D567"},{"category":"Ll","mappings":{"default":{"default":"double struck small w","short":"double struck w"}},"key":"1D568"},{"category":"Ll","mappings":{"default":{"default":"double struck small x","short":"double struck x"}},"key":"1D569"},{"category":"Ll","mappings":{"default":{"default":"double struck small y","short":"double struck y"}},"key":"1D56A"},{"category":"Ll","mappings":{"default":{"default":"double struck small z","short":"double struck z"}},"key":"1D56B"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-fraktur.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-fraktur.js
deleted file mode 100644
index 6cef78aa..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-fraktur.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital a","short":"fraktur cap a"},"mathspeak":{"default":"fraktur upper A"}},"key":"1D504"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital b","short":"fraktur cap b"},"mathspeak":{"default":"fraktur upper B"}},"key":"1D505"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital c","short":"fraktur cap c"},"mathspeak":{"default":"fraktur upper C"}},"key":"212D"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital d","short":"fraktur cap d"},"mathspeak":{"default":"fraktur upper D"}},"key":"1D507"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital e","short":"fraktur cap e"},"mathspeak":{"default":"fraktur upper E"}},"key":"1D508"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital f","short":"fraktur cap f"},"mathspeak":{"default":"fraktur upper F"}},"key":"1D509"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital g","short":"fraktur cap g"},"mathspeak":{"default":"fraktur upper G"}},"key":"1D50A"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital h","short":"fraktur cap h"},"mathspeak":{"default":"fraktur upper H"}},"key":"210C"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital i","short":"fraktur cap i"},"mathspeak":{"default":"fraktur upper I"}},"key":"2111"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital j","short":"fraktur cap j"},"mathspeak":{"default":"fraktur upper J"}},"key":"1D50D"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital k","short":"fraktur cap k"},"mathspeak":{"default":"fraktur upper K"}},"key":"1D50E"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital l","short":"fraktur cap l"},"mathspeak":{"default":"fraktur upper L"}},"key":"1D50F"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital m","short":"fraktur cap m"},"mathspeak":{"default":"fraktur upper M"}},"key":"1D510"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital n","short":"fraktur cap n"},"mathspeak":{"default":"fraktur upper N"}},"key":"1D511"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital o","short":"fraktur cap o"},"mathspeak":{"default":"fraktur upper O"}},"key":"1D512"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital p","short":"fraktur cap p"},"mathspeak":{"default":"fraktur upper P"}},"key":"1D513"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital q","short":"fraktur cap q"},"mathspeak":{"default":"fraktur upper Q"}},"key":"1D514"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital r","short":"fraktur cap r"},"mathspeak":{"default":"fraktur upper R"}},"key":"211C"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital s","short":"fraktur cap s"},"mathspeak":{"default":"fraktur upper S"}},"key":"1D516"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital t","short":"fraktur cap t"},"mathspeak":{"default":"fraktur upper T"}},"key":"1D517"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital u","short":"fraktur cap u"},"mathspeak":{"default":"fraktur upper U"}},"key":"1D518"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital v","short":"fraktur cap v"},"mathspeak":{"default":"fraktur upper V"}},"key":"1D519"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital w","short":"fraktur cap w"},"mathspeak":{"default":"fraktur upper W"}},"key":"1D51A"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital x","short":"fraktur cap x"},"mathspeak":{"default":"fraktur upper X"}},"key":"1D51B"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital y","short":"fraktur cap y"},"mathspeak":{"default":"fraktur upper Y"}},"key":"1D51C"},{"category":"Lu","mappings":{"default":{"default":"fraktur capital z","short":"fraktur cap z"},"mathspeak":{"default":"fraktur upper Z"}},"key":"2128"},{"category":"Ll","mappings":{"default":{"default":"fraktur small a","short":"fraktur a"}},"key":"1D51E"},{"category":"Ll","mappings":{"default":{"default":"fraktur small b","short":"fraktur b"}},"key":"1D51F"},{"category":"Ll","mappings":{"default":{"default":"fraktur small c","short":"fraktur c"}},"key":"1D520"},{"category":"Ll","mappings":{"default":{"default":"fraktur small d","short":"fraktur d"}},"key":"1D521"},{"category":"Ll","mappings":{"default":{"default":"fraktur small e","short":"fraktur e"}},"key":"1D522"},{"category":"Ll","mappings":{"default":{"default":"fraktur small f","short":"fraktur f"}},"key":"1D523"},{"category":"Ll","mappings":{"default":{"default":"fraktur small g","short":"fraktur g"}},"key":"1D524"},{"category":"Ll","mappings":{"default":{"default":"fraktur small h","short":"fraktur h"}},"key":"1D525"},{"category":"Ll","mappings":{"default":{"default":"fraktur small i","short":"fraktur i"}},"key":"1D526"},{"category":"Ll","mappings":{"default":{"default":"fraktur small j","short":"fraktur j"}},"key":"1D527"},{"category":"Ll","mappings":{"default":{"default":"fraktur small k","short":"fraktur k"}},"key":"1D528"},{"category":"Ll","mappings":{"default":{"default":"fraktur small l","short":"fraktur l"}},"key":"1D529"},{"category":"Ll","mappings":{"default":{"default":"fraktur small m","short":"fraktur m"}},"key":"1D52A"},{"category":"Ll","mappings":{"default":{"default":"fraktur small n","short":"fraktur n"}},"key":"1D52B"},{"category":"Ll","mappings":{"default":{"default":"fraktur small o","short":"fraktur o"}},"key":"1D52C"},{"category":"Ll","mappings":{"default":{"default":"fraktur small p","short":"fraktur p"}},"key":"1D52D"},{"category":"Ll","mappings":{"default":{"default":"fraktur small q","short":"fraktur q"}},"key":"1D52E"},{"category":"Ll","mappings":{"default":{"default":"fraktur small r","short":"fraktur r"}},"key":"1D52F"},{"category":"Ll","mappings":{"default":{"default":"fraktur small s","short":"fraktur s"}},"key":"1D530"},{"category":"Ll","mappings":{"default":{"default":"fraktur small t","short":"fraktur t"}},"key":"1D531"},{"category":"Ll","mappings":{"default":{"default":"fraktur small u","short":"fraktur u"}},"key":"1D532"},{"category":"Ll","mappings":{"default":{"default":"fraktur small v","short":"fraktur v"}},"key":"1D533"},{"category":"Ll","mappings":{"default":{"default":"fraktur small w","short":"fraktur w"}},"key":"1D534"},{"category":"Ll","mappings":{"default":{"default":"fraktur small x","short":"fraktur x"}},"key":"1D535"},{"category":"Ll","mappings":{"default":{"default":"fraktur small y","short":"fraktur y"}},"key":"1D536"},{"category":"Ll","mappings":{"default":{"default":"fraktur small z","short":"fraktur z"}},"key":"1D537"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-italic.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-italic.js
deleted file mode 100644
index 944b57ee..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-italic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"italic capital a","short":"italic cap a"},"mathspeak":{"default":"italic upper A"}},"key":"1D434"},{"category":"Lu","mappings":{"default":{"default":"italic capital b","short":"italic cap b"},"mathspeak":{"default":"italic upper B"}},"key":"1D435"},{"category":"Lu","mappings":{"default":{"default":"italic capital c","short":"italic cap c"},"mathspeak":{"default":"italic upper C"}},"key":"1D436"},{"category":"Lu","mappings":{"default":{"default":"italic capital d","short":"italic cap d"},"mathspeak":{"default":"italic upper D"}},"key":"1D437"},{"category":"Lu","mappings":{"default":{"default":"italic capital e","short":"italic cap e"},"mathspeak":{"default":"italic upper E"}},"key":"1D438"},{"category":"Lu","mappings":{"default":{"default":"italic capital f","short":"italic cap f"},"mathspeak":{"default":"italic upper F"}},"key":"1D439"},{"category":"Lu","mappings":{"default":{"default":"italic capital g","short":"italic cap g"},"mathspeak":{"default":"italic upper G"}},"key":"1D43A"},{"category":"Lu","mappings":{"default":{"default":"italic capital h","short":"italic cap h"},"mathspeak":{"default":"italic upper H"}},"key":"1D43B"},{"category":"Lu","mappings":{"default":{"default":"italic capital i","short":"italic cap i"},"mathspeak":{"default":"italic upper I"}},"key":"1D43C"},{"category":"Lu","mappings":{"default":{"default":"italic capital j","short":"italic cap j"},"mathspeak":{"default":"italic upper J"}},"key":"1D43D"},{"category":"Lu","mappings":{"default":{"default":"italic capital k","short":"italic cap k"},"mathspeak":{"default":"italic upper K"}},"key":"1D43E"},{"category":"Lu","mappings":{"default":{"default":"italic capital l","short":"italic cap l"},"mathspeak":{"default":"italic upper L"}},"key":"1D43F"},{"category":"Lu","mappings":{"default":{"default":"italic capital m","short":"italic cap m"},"mathspeak":{"default":"italic upper M"}},"key":"1D440"},{"category":"Lu","mappings":{"default":{"default":"italic capital n","short":"italic cap n"},"mathspeak":{"default":"italic upper N"}},"key":"1D441"},{"category":"Lu","mappings":{"default":{"default":"italic capital o","short":"italic cap o"},"mathspeak":{"default":"italic upper O"}},"key":"1D442"},{"category":"Lu","mappings":{"default":{"default":"italic capital p","short":"italic cap p"},"mathspeak":{"default":"italic upper P"}},"key":"1D443"},{"category":"Lu","mappings":{"default":{"default":"italic capital q","short":"italic cap q"},"mathspeak":{"default":"italic upper Q"}},"key":"1D444"},{"category":"Lu","mappings":{"default":{"default":"italic capital r","short":"italic cap r"},"mathspeak":{"default":"italic upper R"}},"key":"1D445"},{"category":"Lu","mappings":{"default":{"default":"italic capital s","short":"italic cap s"},"mathspeak":{"default":"italic upper S"}},"key":"1D446"},{"category":"Lu","mappings":{"default":{"default":"italic capital t","short":"italic cap t"},"mathspeak":{"default":"italic upper T"}},"key":"1D447"},{"category":"Lu","mappings":{"default":{"default":"italic capital u","short":"italic cap u"},"mathspeak":{"default":"italic upper U"}},"key":"1D448"},{"category":"Lu","mappings":{"default":{"default":"italic capital v","short":"italic cap v"},"mathspeak":{"default":"italic upper V"}},"key":"1D449"},{"category":"Lu","mappings":{"default":{"default":"italic capital w","short":"italic cap w"},"mathspeak":{"default":"italic upper W"}},"key":"1D44A"},{"category":"Lu","mappings":{"default":{"default":"italic capital x","short":"italic cap x"},"mathspeak":{"default":"italic upper X"}},"key":"1D44B"},{"category":"Lu","mappings":{"default":{"default":"italic capital y","short":"italic cap y"},"mathspeak":{"default":"italic upper Y"}},"key":"1D44C"},{"category":"Lu","mappings":{"default":{"default":"italic capital z","short":"italic cap z"},"mathspeak":{"default":"italic upper Z"}},"key":"1D44D"},{"category":"Ll","mappings":{"default":{"default":"italic small a","short":"italic a"}},"key":"1D44E"},{"category":"Ll","mappings":{"default":{"default":"italic small b","short":"italic b"}},"key":"1D44F"},{"category":"Ll","mappings":{"default":{"default":"italic small c","short":"italic c"}},"key":"1D450"},{"category":"Ll","mappings":{"default":{"default":"italic small d","short":"italic d"}},"key":"1D451"},{"category":"Ll","mappings":{"default":{"default":"italic small e","short":"italic e"}},"key":"1D452"},{"category":"Ll","mappings":{"default":{"default":"italic small f","short":"italic f"}},"key":"1D453"},{"category":"Ll","mappings":{"default":{"default":"italic small g","short":"italic g"}},"key":"1D454"},{"category":"Ll","mappings":{"default":{"default":"italic small h","short":"italic h"},"physics":{"default":"planck constant"}},"key":"210E"},{"category":"Ll","mappings":{"default":{"default":"italic small i","short":"italic i"}},"key":"1D456"},{"category":"Ll","mappings":{"default":{"default":"italic small j","short":"italic j"}},"key":"1D457"},{"category":"Ll","mappings":{"default":{"default":"italic small k","short":"italic k"}},"key":"1D458"},{"category":"Ll","mappings":{"default":{"default":"italic small l","short":"italic l"}},"key":"1D459"},{"category":"Ll","mappings":{"default":{"default":"italic small m","short":"italic m"}},"key":"1D45A"},{"category":"Ll","mappings":{"default":{"default":"italic small n","short":"italic n"}},"key":"1D45B"},{"category":"Ll","mappings":{"default":{"default":"italic small o","short":"italic o"}},"key":"1D45C"},{"category":"Ll","mappings":{"default":{"default":"italic small p","short":"italic p"}},"key":"1D45D"},{"category":"Ll","mappings":{"default":{"default":"italic small q","short":"italic q"}},"key":"1D45E"},{"category":"Ll","mappings":{"default":{"default":"italic small r","short":"italic r"}},"key":"1D45F"},{"category":"Ll","mappings":{"default":{"default":"italic small s","short":"italic s"}},"key":"1D460"},{"category":"Ll","mappings":{"default":{"default":"italic small t","short":"italic t"}},"key":"1D461"},{"category":"Ll","mappings":{"default":{"default":"italic small u","short":"italic u"}},"key":"1D462"},{"category":"Ll","mappings":{"default":{"default":"italic small v","short":"italic v"}},"key":"1D463"},{"category":"Ll","mappings":{"default":{"default":"italic small w","short":"italic w"}},"key":"1D464"},{"category":"Ll","mappings":{"default":{"default":"italic small x","short":"italic x"}},"key":"1D465"},{"category":"Ll","mappings":{"default":{"default":"italic small y","short":"italic y"}},"key":"1D466"},{"category":"Ll","mappings":{"default":{"default":"italic small z","short":"italic z"}},"key":"1D467"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-monospace.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-monospace.js
deleted file mode 100644
index 1be5eb2c..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-monospace.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"monospace capital a","short":"monospace cap a"},"mathspeak":{"default":"monospace upper A"}},"key":"1D670"},{"category":"Lu","mappings":{"default":{"default":"monospace capital b","short":"monospace cap b"},"mathspeak":{"default":"monospace upper B"}},"key":"1D671"},{"category":"Lu","mappings":{"default":{"default":"monospace capital c","short":"monospace cap c"},"mathspeak":{"default":"monospace upper C"}},"key":"1D672"},{"category":"Lu","mappings":{"default":{"default":"monospace capital d","short":"monospace cap d"},"mathspeak":{"default":"monospace upper D"}},"key":"1D673"},{"category":"Lu","mappings":{"default":{"default":"monospace capital e","short":"monospace cap e"},"mathspeak":{"default":"monospace upper E"}},"key":"1D674"},{"category":"Lu","mappings":{"default":{"default":"monospace capital f","short":"monospace cap f"},"mathspeak":{"default":"monospace upper F"}},"key":"1D675"},{"category":"Lu","mappings":{"default":{"default":"monospace capital g","short":"monospace cap g"},"mathspeak":{"default":"monospace upper G"}},"key":"1D676"},{"category":"Lu","mappings":{"default":{"default":"monospace capital h","short":"monospace cap h"},"mathspeak":{"default":"monospace upper H"}},"key":"1D677"},{"category":"Lu","mappings":{"default":{"default":"monospace capital i","short":"monospace cap i"},"mathspeak":{"default":"monospace upper I"}},"key":"1D678"},{"category":"Lu","mappings":{"default":{"default":"monospace capital j","short":"monospace cap j"},"mathspeak":{"default":"monospace upper J"}},"key":"1D679"},{"category":"Lu","mappings":{"default":{"default":"monospace capital k","short":"monospace cap k"},"mathspeak":{"default":"monospace upper K"}},"key":"1D67A"},{"category":"Lu","mappings":{"default":{"default":"monospace capital l","short":"monospace cap l"},"mathspeak":{"default":"monospace upper L"}},"key":"1D67B"},{"category":"Lu","mappings":{"default":{"default":"monospace capital m","short":"monospace cap m"},"mathspeak":{"default":"monospace upper M"}},"key":"1D67C"},{"category":"Lu","mappings":{"default":{"default":"monospace capital n","short":"monospace cap n"},"mathspeak":{"default":"monospace upper N"}},"key":"1D67D"},{"category":"Lu","mappings":{"default":{"default":"monospace capital o","short":"monospace cap o"},"mathspeak":{"default":"monospace upper O"}},"key":"1D67E"},{"category":"Lu","mappings":{"default":{"default":"monospace capital p","short":"monospace cap p"},"mathspeak":{"default":"monospace upper P"}},"key":"1D67F"},{"category":"Lu","mappings":{"default":{"default":"monospace capital q","short":"monospace cap q"},"mathspeak":{"default":"monospace upper Q"}},"key":"1D680"},{"category":"Lu","mappings":{"default":{"default":"monospace capital r","short":"monospace cap r"},"mathspeak":{"default":"monospace upper R"}},"key":"1D681"},{"category":"Lu","mappings":{"default":{"default":"monospace capital s","short":"monospace cap s"},"mathspeak":{"default":"monospace upper S"}},"key":"1D682"},{"category":"Lu","mappings":{"default":{"default":"monospace capital t","short":"monospace cap t"},"mathspeak":{"default":"monospace upper T"}},"key":"1D683"},{"category":"Lu","mappings":{"default":{"default":"monospace capital u","short":"monospace cap u"},"mathspeak":{"default":"monospace upper U"}},"key":"1D684"},{"category":"Lu","mappings":{"default":{"default":"monospace capital v","short":"monospace cap v"},"mathspeak":{"default":"monospace upper V"}},"key":"1D685"},{"category":"Lu","mappings":{"default":{"default":"monospace capital w","short":"monospace cap w"},"mathspeak":{"default":"monospace upper W"}},"key":"1D686"},{"category":"Lu","mappings":{"default":{"default":"monospace capital x","short":"monospace cap x"},"mathspeak":{"default":"monospace upper X"}},"key":"1D687"},{"category":"Lu","mappings":{"default":{"default":"monospace capital y","short":"monospace cap y"},"mathspeak":{"default":"monospace upper Y"}},"key":"1D688"},{"category":"Lu","mappings":{"default":{"default":"monospace capital z","short":"monospace cap z"},"mathspeak":{"default":"monospace upper Z"}},"key":"1D689"},{"category":"Ll","mappings":{"default":{"default":"monospace small a","short":"monospace a"}},"key":"1D68A"},{"category":"Ll","mappings":{"default":{"default":"monospace small b","short":"monospace b"}},"key":"1D68B"},{"category":"Ll","mappings":{"default":{"default":"monospace small c","short":"monospace c"}},"key":"1D68C"},{"category":"Ll","mappings":{"default":{"default":"monospace small d","short":"monospace d"}},"key":"1D68D"},{"category":"Ll","mappings":{"default":{"default":"monospace small e","short":"monospace e"}},"key":"1D68E"},{"category":"Ll","mappings":{"default":{"default":"monospace small f","short":"monospace f"}},"key":"1D68F"},{"category":"Ll","mappings":{"default":{"default":"monospace small g","short":"monospace g"}},"key":"1D690"},{"category":"Ll","mappings":{"default":{"default":"monospace small h","short":"monospace h"}},"key":"1D691"},{"category":"Ll","mappings":{"default":{"default":"monospace small i","short":"monospace i"}},"key":"1D692"},{"category":"Ll","mappings":{"default":{"default":"monospace small j","short":"monospace j"}},"key":"1D693"},{"category":"Ll","mappings":{"default":{"default":"monospace small k","short":"monospace k"}},"key":"1D694"},{"category":"Ll","mappings":{"default":{"default":"monospace small l","short":"monospace l"}},"key":"1D695"},{"category":"Ll","mappings":{"default":{"default":"monospace small m","short":"monospace m"}},"key":"1D696"},{"category":"Ll","mappings":{"default":{"default":"monospace small n","short":"monospace n"}},"key":"1D697"},{"category":"Ll","mappings":{"default":{"default":"monospace small o","short":"monospace o"}},"key":"1D698"},{"category":"Ll","mappings":{"default":{"default":"monospace small p","short":"monospace p"}},"key":"1D699"},{"category":"Ll","mappings":{"default":{"default":"monospace small q","short":"monospace q"}},"key":"1D69A"},{"category":"Ll","mappings":{"default":{"default":"monospace small r","short":"monospace r"}},"key":"1D69B"},{"category":"Ll","mappings":{"default":{"default":"monospace small s","short":"monospace s"}},"key":"1D69C"},{"category":"Ll","mappings":{"default":{"default":"monospace small t","short":"monospace t"}},"key":"1D69D"},{"category":"Ll","mappings":{"default":{"default":"monospace small u","short":"monospace u"}},"key":"1D69E"},{"category":"Ll","mappings":{"default":{"default":"monospace small v","short":"monospace v"}},"key":"1D69F"},{"category":"Ll","mappings":{"default":{"default":"monospace small w","short":"monospace w"}},"key":"1D6A0"},{"category":"Ll","mappings":{"default":{"default":"monospace small x","short":"monospace x"}},"key":"1D6A1"},{"category":"Ll","mappings":{"default":{"default":"monospace small y","short":"monospace y"}},"key":"1D6A2"},{"category":"Ll","mappings":{"default":{"default":"monospace small z","short":"monospace z"}},"key":"1D6A3"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif-bold.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif-bold.js
deleted file mode 100644
index d5b39fc7..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif-bold.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital a","short":"sans serif bold cap a"},"mathspeak":{"default":"sans serif bold upper A"}},"key":"1D5D4"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital b","short":"sans serif bold cap b"},"mathspeak":{"default":"sans serif bold upper B"}},"key":"1D5D5"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital c","short":"sans serif bold cap c"},"mathspeak":{"default":"sans serif bold upper C"}},"key":"1D5D6"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital d","short":"sans serif bold cap d"},"mathspeak":{"default":"sans serif bold upper D"}},"key":"1D5D7"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital e","short":"sans serif bold cap e"},"mathspeak":{"default":"sans serif bold upper E"}},"key":"1D5D8"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital f","short":"sans serif bold cap f"},"mathspeak":{"default":"sans serif bold upper F"}},"key":"1D5D9"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital g","short":"sans serif bold cap g"},"mathspeak":{"default":"sans serif bold upper G"}},"key":"1D5DA"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital h","short":"sans serif bold cap h"},"mathspeak":{"default":"sans serif bold upper H"}},"key":"1D5DB"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital i","short":"sans serif bold cap i"},"mathspeak":{"default":"sans serif bold upper I"}},"key":"1D5DC"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital j","short":"sans serif bold cap j"},"mathspeak":{"default":"sans serif bold upper J"}},"key":"1D5DD"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital k","short":"sans serif bold cap k"},"mathspeak":{"default":"sans serif bold upper K"}},"key":"1D5DE"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital l","short":"sans serif bold cap l"},"mathspeak":{"default":"sans serif bold upper L"}},"key":"1D5DF"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital m","short":"sans serif bold cap m"},"mathspeak":{"default":"sans serif bold upper M"}},"key":"1D5E0"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital n","short":"sans serif bold cap n"},"mathspeak":{"default":"sans serif bold upper N"}},"key":"1D5E1"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital o","short":"sans serif bold cap o"},"mathspeak":{"default":"sans serif bold upper O"}},"key":"1D5E2"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital p","short":"sans serif bold cap p"},"mathspeak":{"default":"sans serif bold upper P"}},"key":"1D5E3"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital q","short":"sans serif bold cap q"},"mathspeak":{"default":"sans serif bold upper Q"}},"key":"1D5E4"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital r","short":"sans serif bold cap r"},"mathspeak":{"default":"sans serif bold upper R"}},"key":"1D5E5"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital s","short":"sans serif bold cap s"},"mathspeak":{"default":"sans serif bold upper S"}},"key":"1D5E6"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital t","short":"sans serif bold cap t"},"mathspeak":{"default":"sans serif bold upper T"}},"key":"1D5E7"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital u","short":"sans serif bold cap u"},"mathspeak":{"default":"sans serif bold upper U"}},"key":"1D5E8"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital v","short":"sans serif bold cap v"},"mathspeak":{"default":"sans serif bold upper V"}},"key":"1D5E9"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital w","short":"sans serif bold cap w"},"mathspeak":{"default":"sans serif bold upper W"}},"key":"1D5EA"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital x","short":"sans serif bold cap x"},"mathspeak":{"default":"sans serif bold upper X"}},"key":"1D5EB"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital y","short":"sans serif bold cap y"},"mathspeak":{"default":"sans serif bold upper Y"}},"key":"1D5EC"},{"category":"Lu","mappings":{"default":{"default":"sans serif bold capital z","short":"sans serif bold cap z"},"mathspeak":{"default":"sans serif bold upper Z"}},"key":"1D5ED"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small a","short":"sans serif bold a"}},"key":"1D5EE"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small b","short":"sans serif bold b"}},"key":"1D5EF"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small c","short":"sans serif bold c"}},"key":"1D5F0"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small d","short":"sans serif bold d"}},"key":"1D5F1"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small e","short":"sans serif bold e"}},"key":"1D5F2"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small f","short":"sans serif bold f"}},"key":"1D5F3"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small g","short":"sans serif bold g"}},"key":"1D5F4"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small h","short":"sans serif bold h"}},"key":"1D5F5"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small i","short":"sans serif bold i"}},"key":"1D5F6"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small j","short":"sans serif bold j"}},"key":"1D5F7"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small k","short":"sans serif bold k"}},"key":"1D5F8"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small l","short":"sans serif bold l"}},"key":"1D5F9"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small m","short":"sans serif bold m"}},"key":"1D5FA"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small n","short":"sans serif bold n"}},"key":"1D5FB"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small o","short":"sans serif bold o"}},"key":"1D5FC"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small p","short":"sans serif bold p"}},"key":"1D5FD"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small q","short":"sans serif bold q"}},"key":"1D5FE"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small r","short":"sans serif bold r"}},"key":"1D5FF"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small s","short":"sans serif bold s"}},"key":"1D600"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small t","short":"sans serif bold t"}},"key":"1D601"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small u","short":"sans serif bold u"}},"key":"1D602"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small v","short":"sans serif bold v"}},"key":"1D603"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small w","short":"sans serif bold w"}},"key":"1D604"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small x","short":"sans serif bold x"}},"key":"1D605"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small y","short":"sans serif bold y"}},"key":"1D606"},{"category":"Ll","mappings":{"default":{"default":"sans serif bold small z","short":"sans serif bold z"}},"key":"1D607"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif-italic.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif-italic.js
deleted file mode 100644
index c12c5c14..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif-italic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital a","short":"sans serif italic cap a"},"mathspeak":{"default":"sans serif italic upper A"}},"key":"1D608"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital b","short":"sans serif italic cap b"},"mathspeak":{"default":"sans serif italic upper B"}},"key":"1D609"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital c","short":"sans serif italic cap c"},"mathspeak":{"default":"sans serif italic upper C"}},"key":"1D60A"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital d","short":"sans serif italic cap d"},"mathspeak":{"default":"sans serif italic upper D"}},"key":"1D60B"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital e","short":"sans serif italic cap e"},"mathspeak":{"default":"sans serif italic upper E"}},"key":"1D60C"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital f","short":"sans serif italic cap f"},"mathspeak":{"default":"sans serif italic upper F"}},"key":"1D60D"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital g","short":"sans serif italic cap g"},"mathspeak":{"default":"sans serif italic upper G"}},"key":"1D60E"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital h","short":"sans serif italic cap h"},"mathspeak":{"default":"sans serif italic upper H"}},"key":"1D60F"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital i","short":"sans serif italic cap i"},"mathspeak":{"default":"sans serif italic upper I"}},"key":"1D610"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital j","short":"sans serif italic cap j"},"mathspeak":{"default":"sans serif italic upper J"}},"key":"1D611"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital k","short":"sans serif italic cap k"},"mathspeak":{"default":"sans serif italic upper K"}},"key":"1D612"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital l","short":"sans serif italic cap l"},"mathspeak":{"default":"sans serif italic upper L"}},"key":"1D613"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital m","short":"sans serif italic cap m"},"mathspeak":{"default":"sans serif italic upper M"}},"key":"1D614"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital n","short":"sans serif italic cap n"},"mathspeak":{"default":"sans serif italic upper N"}},"key":"1D615"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital o","short":"sans serif italic cap o"},"mathspeak":{"default":"sans serif italic upper O"}},"key":"1D616"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital p","short":"sans serif italic cap p"},"mathspeak":{"default":"sans serif italic upper P"}},"key":"1D617"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital q","short":"sans serif italic cap q"},"mathspeak":{"default":"sans serif italic upper Q"}},"key":"1D618"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital r","short":"sans serif italic cap r"},"mathspeak":{"default":"sans serif italic upper R"}},"key":"1D619"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital s","short":"sans serif italic cap s"},"mathspeak":{"default":"sans serif italic upper S"}},"key":"1D61A"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital t","short":"sans serif italic cap t"},"mathspeak":{"default":"sans serif italic upper T"}},"key":"1D61B"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital u","short":"sans serif italic cap u"},"mathspeak":{"default":"sans serif italic upper U"}},"key":"1D61C"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital v","short":"sans serif italic cap v"},"mathspeak":{"default":"sans serif italic upper V"}},"key":"1D61D"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital w","short":"sans serif italic cap w"},"mathspeak":{"default":"sans serif italic upper W"}},"key":"1D61E"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital x","short":"sans serif italic cap x"},"mathspeak":{"default":"sans serif italic upper X"}},"key":"1D61F"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital y","short":"sans serif italic cap y"},"mathspeak":{"default":"sans serif italic upper Y"}},"key":"1D620"},{"category":"Lu","mappings":{"default":{"default":"sans serif italic capital z","short":"sans serif italic cap z"},"mathspeak":{"default":"sans serif italic upper Z"}},"key":"1D621"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small a","short":"sans serif italic a"}},"key":"1D622"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small b","short":"sans serif italic b"}},"key":"1D623"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small c","short":"sans serif italic c"}},"key":"1D624"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small d","short":"sans serif italic d"}},"key":"1D625"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small e","short":"sans serif italic e"}},"key":"1D626"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small f","short":"sans serif italic f"}},"key":"1D627"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small g","short":"sans serif italic g"}},"key":"1D628"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small h","short":"sans serif italic h"}},"key":"1D629"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small i","short":"sans serif italic i"}},"key":"1D62A"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small j","short":"sans serif italic j"}},"key":"1D62B"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small k","short":"sans serif italic k"}},"key":"1D62C"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small l","short":"sans serif italic l"}},"key":"1D62D"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small m","short":"sans serif italic m"}},"key":"1D62E"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small n","short":"sans serif italic n"}},"key":"1D62F"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small o","short":"sans serif italic o"}},"key":"1D630"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small p","short":"sans serif italic p"}},"key":"1D631"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small q","short":"sans serif italic q"}},"key":"1D632"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small r","short":"sans serif italic r"}},"key":"1D633"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small s","short":"sans serif italic s"}},"key":"1D634"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small t","short":"sans serif italic t"}},"key":"1D635"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small u","short":"sans serif italic u"}},"key":"1D636"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small v","short":"sans serif italic v"}},"key":"1D637"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small w","short":"sans serif italic w"}},"key":"1D638"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small x","short":"sans serif italic x"}},"key":"1D639"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small y","short":"sans serif italic y"}},"key":"1D63A"},{"category":"Ll","mappings":{"default":{"default":"sans serif italic small z","short":"sans serif italic z"}},"key":"1D63B"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif.js
deleted file mode 100644
index f3b69ce8..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-sans-serif.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital a","short":"sans serif cap a"},"mathspeak":{"default":"sans serif upper A"}},"key":"1D5A0"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital b","short":"sans serif cap b"},"mathspeak":{"default":"sans serif upper B"}},"key":"1D5A1"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital c","short":"sans serif cap c"},"mathspeak":{"default":"sans serif upper C"}},"key":"1D5A2"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital d","short":"sans serif cap d"},"mathspeak":{"default":"sans serif upper D"}},"key":"1D5A3"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital e","short":"sans serif cap e"},"mathspeak":{"default":"sans serif upper E"}},"key":"1D5A4"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital f","short":"sans serif cap f"},"mathspeak":{"default":"sans serif upper F"}},"key":"1D5A5"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital g","short":"sans serif cap g"},"mathspeak":{"default":"sans serif upper G"}},"key":"1D5A6"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital h","short":"sans serif cap h"},"mathspeak":{"default":"sans serif upper H"}},"key":"1D5A7"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital i","short":"sans serif cap i"},"mathspeak":{"default":"sans serif upper I"}},"key":"1D5A8"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital j","short":"sans serif cap j"},"mathspeak":{"default":"sans serif upper J"}},"key":"1D5A9"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital k","short":"sans serif cap k"},"mathspeak":{"default":"sans serif upper K"}},"key":"1D5AA"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital l","short":"sans serif cap l"},"mathspeak":{"default":"sans serif upper L"}},"key":"1D5AB"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital m","short":"sans serif cap m"},"mathspeak":{"default":"sans serif upper M"}},"key":"1D5AC"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital n","short":"sans serif cap n"},"mathspeak":{"default":"sans serif upper N"}},"key":"1D5AD"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital o","short":"sans serif cap o"},"mathspeak":{"default":"sans serif upper O"}},"key":"1D5AE"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital p","short":"sans serif cap p"},"mathspeak":{"default":"sans serif upper P"}},"key":"1D5AF"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital q","short":"sans serif cap q"},"mathspeak":{"default":"sans serif upper Q"}},"key":"1D5B0"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital r","short":"sans serif cap r"},"mathspeak":{"default":"sans serif upper R"}},"key":"1D5B1"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital s","short":"sans serif cap s"},"mathspeak":{"default":"sans serif upper S"}},"key":"1D5B2"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital t","short":"sans serif cap t"},"mathspeak":{"default":"sans serif upper T"}},"key":"1D5B3"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital u","short":"sans serif cap u"},"mathspeak":{"default":"sans serif upper U"}},"key":"1D5B4"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital v","short":"sans serif cap v"},"mathspeak":{"default":"sans serif upper V"}},"key":"1D5B5"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital w","short":"sans serif cap w"},"mathspeak":{"default":"sans serif upper W"}},"key":"1D5B6"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital x","short":"sans serif cap x"},"mathspeak":{"default":"sans serif upper X"}},"key":"1D5B7"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital y","short":"sans serif cap y"},"mathspeak":{"default":"sans serif upper Y"}},"key":"1D5B8"},{"category":"Lu","mappings":{"default":{"default":"sans serif capital z","short":"sans serif cap z"},"mathspeak":{"default":"sans serif upper Z"}},"key":"1D5B9"},{"category":"Ll","mappings":{"default":{"default":"sans serif small a","short":"sans serif a"}},"key":"1D5BA"},{"category":"Ll","mappings":{"default":{"default":"sans serif small b","short":"sans serif b"}},"key":"1D5BB"},{"category":"Ll","mappings":{"default":{"default":"sans serif small c","short":"sans serif c"}},"key":"1D5BC"},{"category":"Ll","mappings":{"default":{"default":"sans serif small d","short":"sans serif d"}},"key":"1D5BD"},{"category":"Ll","mappings":{"default":{"default":"sans serif small e","short":"sans serif e"}},"key":"1D5BE"},{"category":"Ll","mappings":{"default":{"default":"sans serif small f","short":"sans serif f"}},"key":"1D5BF"},{"category":"Ll","mappings":{"default":{"default":"sans serif small g","short":"sans serif g"}},"key":"1D5C0"},{"category":"Ll","mappings":{"default":{"default":"sans serif small h","short":"sans serif h"}},"key":"1D5C1"},{"category":"Ll","mappings":{"default":{"default":"sans serif small i","short":"sans serif i"}},"key":"1D5C2"},{"category":"Ll","mappings":{"default":{"default":"sans serif small j","short":"sans serif j"}},"key":"1D5C3"},{"category":"Ll","mappings":{"default":{"default":"sans serif small k","short":"sans serif k"}},"key":"1D5C4"},{"category":"Ll","mappings":{"default":{"default":"sans serif small l","short":"sans serif l"}},"key":"1D5C5"},{"category":"Ll","mappings":{"default":{"default":"sans serif small m","short":"sans serif m"}},"key":"1D5C6"},{"category":"Ll","mappings":{"default":{"default":"sans serif small n","short":"sans serif n"}},"key":"1D5C7"},{"category":"Ll","mappings":{"default":{"default":"sans serif small o","short":"sans serif o"}},"key":"1D5C8"},{"category":"Ll","mappings":{"default":{"default":"sans serif small p","short":"sans serif p"}},"key":"1D5C9"},{"category":"Ll","mappings":{"default":{"default":"sans serif small q","short":"sans serif q"}},"key":"1D5CA"},{"category":"Ll","mappings":{"default":{"default":"sans serif small r","short":"sans serif r"}},"key":"1D5CB"},{"category":"Ll","mappings":{"default":{"default":"sans serif small s","short":"sans serif s"}},"key":"1D5CC"},{"category":"Ll","mappings":{"default":{"default":"sans serif small t","short":"sans serif t"}},"key":"1D5CD"},{"category":"Ll","mappings":{"default":{"default":"sans serif small u","short":"sans serif u"}},"key":"1D5CE"},{"category":"Ll","mappings":{"default":{"default":"sans serif small v","short":"sans serif v"}},"key":"1D5CF"},{"category":"Ll","mappings":{"default":{"default":"sans serif small w","short":"sans serif w"}},"key":"1D5D0"},{"category":"Ll","mappings":{"default":{"default":"sans serif small x","short":"sans serif x"}},"key":"1D5D1"},{"category":"Ll","mappings":{"default":{"default":"sans serif small y","short":"sans serif y"}},"key":"1D5D2"},{"category":"Ll","mappings":{"default":{"default":"sans serif small z","short":"sans serif z"}},"key":"1D5D3"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-script.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-script.js
deleted file mode 100644
index 277aae7a..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-mathfonts-script.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","mappings":{"default":{"default":"script capital a","short":"script cap a"},"mathspeak":{"default":"script upper A"}},"key":"1D49C"},{"category":"Lu","mappings":{"default":{"default":"script capital b","short":"script cap b"},"mathspeak":{"default":"script upper B"}},"key":"212C"},{"category":"Lu","mappings":{"default":{"default":"script capital c","short":"script cap c"},"mathspeak":{"default":"script upper C"}},"key":"1D49E"},{"category":"Lu","mappings":{"default":{"default":"script capital d","short":"script cap d"},"mathspeak":{"default":"script upper D"}},"key":"1D49F"},{"category":"Lu","mappings":{"default":{"default":"script capital e","short":"script cap e"},"mathspeak":{"default":"script upper E"}},"key":"2130"},{"category":"Lu","mappings":{"default":{"default":"script capital f","short":"script cap f"},"mathspeak":{"default":"script upper F"}},"key":"2131"},{"category":"Lu","mappings":{"default":{"default":"script capital g","short":"script cap g"},"mathspeak":{"default":"script upper G"}},"key":"1D4A2"},{"category":"Lu","mappings":{"default":{"default":"script capital h","short":"script cap h"},"mathspeak":{"default":"script upper H"}},"key":"210B"},{"category":"Lu","mappings":{"default":{"default":"script capital i","short":"script cap i"},"mathspeak":{"default":"script upper I"}},"key":"2110"},{"category":"Lu","mappings":{"default":{"default":"script capital j","short":"script cap j"},"mathspeak":{"default":"script upper J"}},"key":"1D4A5"},{"category":"Lu","mappings":{"default":{"default":"script capital k","short":"script cap k"},"mathspeak":{"default":"script upper K"}},"key":"1D4A6"},{"category":"Lu","mappings":{"default":{"default":"script capital l","short":"script cap l"},"mathspeak":{"default":"script upper L"}},"key":"2112"},{"category":"Lu","mappings":{"default":{"default":"script capital m","short":"script cap m"},"mathspeak":{"default":"script upper M"}},"key":"2133"},{"category":"Lu","mappings":{"default":{"default":"script capital n","short":"script cap n"},"mathspeak":{"default":"script upper N"}},"key":"1D4A9"},{"category":"Lu","mappings":{"default":{"default":"script capital o","short":"script cap o"},"mathspeak":{"default":"script upper O"}},"key":"1D4AA"},{"category":"Lu","mappings":{"default":{"default":"script capital p","short":"script cap p"},"mathspeak":{"default":"script upper P"}},"key":"1D4AB"},{"category":"Lu","mappings":{"default":{"default":"script capital q","short":"script cap q"},"mathspeak":{"default":"script upper Q"}},"key":"1D4AC"},{"category":"Lu","mappings":{"default":{"default":"script capital r","short":"script cap r"},"mathspeak":{"default":"script upper R"}},"key":"211B"},{"category":"Lu","mappings":{"default":{"default":"script capital s","short":"script cap s"},"mathspeak":{"default":"script upper S"}},"key":"1D4AE"},{"category":"Lu","mappings":{"default":{"default":"script capital t","short":"script cap t"},"mathspeak":{"default":"script upper T"}},"key":"1D4AF"},{"category":"Lu","mappings":{"default":{"default":"script capital u","short":"script cap u"},"mathspeak":{"default":"script upper U"}},"key":"1D4B0"},{"category":"Lu","mappings":{"default":{"default":"script capital v","short":"script cap v"},"mathspeak":{"default":"script upper V"}},"key":"1D4B1"},{"category":"Lu","mappings":{"default":{"default":"script capital w","short":"script cap w"},"mathspeak":{"default":"script upper W"}},"key":"1D4B2"},{"category":"Lu","mappings":{"default":{"default":"script capital x","short":"script cap x"},"mathspeak":{"default":"script upper X"}},"key":"1D4B3"},{"category":"Lu","mappings":{"default":{"default":"script capital y","short":"script cap y"},"mathspeak":{"default":"script upper Y"}},"key":"1D4B4"},{"category":"Lu","mappings":{"default":{"default":"script capital z","short":"script cap z"},"mathspeak":{"default":"script upper Z"}},"key":"1D4B5"},{"category":"Ll","mappings":{"default":{"default":"script small a","short":"script a"}},"key":"1D4B6"},{"category":"Ll","mappings":{"default":{"default":"script small b","short":"script b"}},"key":"1D4B7"},{"category":"Ll","mappings":{"default":{"default":"script small c","short":"script c"}},"key":"1D4B8"},{"category":"Ll","mappings":{"default":{"default":"script small d","short":"script d"}},"key":"1D4B9"},{"category":"Ll","mappings":{"default":{"default":"script small e","short":"script e"}},"key":"212F"},{"category":"Ll","mappings":{"default":{"default":"script small f","short":"script f"}},"key":"1D4BB"},{"category":"Ll","mappings":{"default":{"default":"script small g","short":"script g"}},"key":"210A"},{"category":"Ll","mappings":{"default":{"default":"script small h","short":"script h"}},"key":"1D4BD"},{"category":"Ll","mappings":{"default":{"default":"script small i","short":"script i"}},"key":"1D4BE"},{"category":"Ll","mappings":{"default":{"default":"script small j","short":"script j"}},"key":"1D4BF"},{"category":"Ll","mappings":{"default":{"default":"script small k","short":"script k"}},"key":"1D4C0"},{"category":"Ll","mappings":{"default":{"default":"script small l","short":"script l"}},"key":"1D4C1"},{"category":"Ll","mappings":{"default":{"default":"script small m","short":"script m"}},"key":"1D4C2"},{"category":"Ll","mappings":{"default":{"default":"script small n","short":"script n"}},"key":"1D4C3"},{"category":"Ll","mappings":{"default":{"default":"script small o","short":"script o"}},"key":"2134"},{"category":"Ll","mappings":{"default":{"default":"script small p","short":"script p"}},"key":"1D4C5"},{"category":"Ll","mappings":{"default":{"default":"script small q","short":"script q"}},"key":"1D4C6"},{"category":"Ll","mappings":{"default":{"default":"script small r","short":"script r"}},"key":"1D4C7"},{"category":"Ll","mappings":{"default":{"default":"script small s","short":"script s"}},"key":"1D4C8"},{"category":"Ll","mappings":{"default":{"default":"script small t","short":"script t"}},"key":"1D4C9"},{"category":"Ll","mappings":{"default":{"default":"script small u","short":"script u"}},"key":"1D4CA"},{"category":"Ll","mappings":{"default":{"default":"script small v","short":"script v"}},"key":"1D4CB"},{"category":"Ll","mappings":{"default":{"default":"script small w","short":"script w"}},"key":"1D4CC"},{"category":"Ll","mappings":{"default":{"default":"script small x","short":"script x"}},"key":"1D4CD"},{"category":"Ll","mappings":{"default":{"default":"script small y","short":"script y"}},"key":"1D4CE"},{"category":"Ll","mappings":{"default":{"default":"script small z","short":"script z"}},"key":"1D4CF"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-rest.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-rest.js
deleted file mode 100644
index a1f47f6a..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-rest.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Mn","key":"0363","mappings":{"default":{"default":"combining latin small letter a","short":"combining a"}}},{"category":"Mn","key":"0364","mappings":{"default":{"default":"combining latin small letter e","short":"combining e"}}},{"category":"Mn","key":"0365","mappings":{"default":{"default":"combining latin small letter i","short":"combining i"}}},{"category":"Mn","key":"0366","mappings":{"default":{"default":"combining latin small letter o","short":"combining o"}}},{"category":"Mn","key":"0367","mappings":{"default":{"default":"combining latin small letter u","short":"combining u"}}},{"category":"Mn","key":"0368","mappings":{"default":{"default":"combining latin small letter c","short":"combining c"}}},{"category":"Mn","key":"0369","mappings":{"default":{"default":"combining latin small letter d","short":"combining d"}}},{"category":"Mn","key":"036A","mappings":{"default":{"default":"combining latin small letter h","short":"combining h"}}},{"category":"Mn","key":"036B","mappings":{"default":{"default":"combining latin small letter m","short":"combining m"}}},{"category":"Mn","key":"036C","mappings":{"default":{"default":"combining latin small letter r","short":"combining r"}}},{"category":"Mn","key":"036D","mappings":{"default":{"default":"combining latin small letter t","short":"combining t"}}},{"category":"Mn","key":"036E","mappings":{"default":{"default":"combining latin small letter v","short":"combining v"}}},{"category":"Mn","key":"036F","mappings":{"default":{"default":"combining latin small letter x","short":"combining x"}}},{"category":"Lm","key":"1D62","mappings":{"default":{"default":"latin subscript small letter i","short":"subscript i"}}},{"category":"Lm","key":"1D63","mappings":{"default":{"default":"latin subscript small letter r","short":"subscript r"}}},{"category":"Lm","key":"1D64","mappings":{"default":{"default":"latin subscript small letter u","short":"subscript u"}}},{"category":"Lm","key":"1D65","mappings":{"default":{"default":"latin subscript small letter v","short":"subscript v"}}},{"category":"Mn","key":"1DCA","mappings":{"default":{"default":"combining latin small letter r below","short":"combining r below"}}},{"category":"Mn","key":"1DD3","mappings":{"default":{"default":"combining latin small letter flattened open a above","short":"combining flattened open a above"}}},{"category":"Mn","key":"1DD4","mappings":{"default":{"default":"combining latin small letter ae","short":"combining ae"}}},{"category":"Mn","key":"1DD5","mappings":{"default":{"default":"combining latin small letter ao","short":"combining ao"}}},{"category":"Mn","key":"1DD6","mappings":{"default":{"default":"combining latin small letter av","short":"combining av"}}},{"category":"Mn","key":"1DD7","mappings":{"default":{"default":"combining latin small letter c cedilla","short":"combining c cedilla"}}},{"category":"Mn","key":"1DD8","mappings":{"default":{"default":"combining latin small letter insular d","short":"combining insular d"}}},{"category":"Mn","key":"1DD9","mappings":{"default":{"default":"combining latin small letter eth","short":"combining eth"}}},{"category":"Mn","key":"1DDA","mappings":{"default":{"default":"combining latin small letter g","short":"combining g"}}},{"category":"Mn","key":"1DDB","mappings":{"default":{"default":"combining latin letter small capital g","short":"combining small cap g"},"mathspeak":{"default":"combining small upper G"}}},{"category":"Mn","key":"1DDC","mappings":{"default":{"default":"combining latin small letter k","short":"combining k"}}},{"category":"Mn","key":"1DDD","mappings":{"default":{"default":"combining latin small letter l","short":"combining l"}}},{"category":"Mn","key":"1DDE","mappings":{"default":{"default":"combining latin letter small capital l","short":"combining small cap l"},"mathspeak":{"default":"combining small upper L"}}},{"category":"Mn","key":"1DDF","mappings":{"default":{"default":"combining latin letter small capital m","short":"combining small cap m"},"mathspeak":{"default":"combining small upper M"}}},{"category":"Mn","key":"1DE0","mappings":{"default":{"default":"combining latin small letter n","short":"combining n"}}},{"category":"Mn","key":"1DE1","mappings":{"default":{"default":"combining latin letter small capital n","short":"combining small cap n"},"mathspeak":{"default":"combining small upper N"}}},{"category":"Mn","key":"1DE2","mappings":{"default":{"default":"combining latin letter small capital r","short":"combining small cap r"},"mathspeak":{"default":"combining small upper R"}}},{"category":"Mn","key":"1DE3","mappings":{"default":{"default":"combining latin small letter r rotunda","short":"combining r rotunda"}}},{"category":"Mn","key":"1DE4","mappings":{"default":{"default":"combining latin small letter s","short":"combining s"}}},{"category":"Mn","key":"1DE5","mappings":{"default":{"default":"combining latin small letter long s","short":"combining long s"}}},{"category":"Mn","key":"1DE6","mappings":{"default":{"default":"combining latin small letter z","short":"combining z"}}},{"category":"Lm","key":"2071","mappings":{"default":{"default":"superscript latin small letter i","short":"superscript i"}}},{"category":"Lm","key":"207F","mappings":{"default":{"default":"superscript latin small letter n","short":"superscript n"}}},{"category":"Lm","key":"2090","mappings":{"default":{"default":"latin subscript small letter a","short":"subscript a"}}},{"category":"Lm","key":"2091","mappings":{"default":{"default":"latin subscript small letter e","short":"subscript e"}}},{"category":"Lm","key":"2092","mappings":{"default":{"default":"latin subscript small letter o","short":"subscript o"}}},{"category":"Lm","key":"2093","mappings":{"default":{"default":"latin subscript small letter x","short":"subscript x"}}},{"category":"Lm","key":"2094","mappings":{"default":{"default":"latin subscript small letter schwa","short":"subscript schwa"}}},{"category":"Lm","key":"2095","mappings":{"default":{"default":"latin subscript small letter h","short":"subscript h"}}},{"category":"Lm","key":"2096","mappings":{"default":{"default":"latin subscript small letter k","short":"subscript k"}}},{"category":"Lm","key":"2097","mappings":{"default":{"default":"latin subscript small letter l","short":"subscript l"}}},{"category":"Lm","key":"2098","mappings":{"default":{"default":"latin subscript small letter m","short":"subscript m"}}},{"category":"Lm","key":"2099","mappings":{"default":{"default":"latin subscript small letter n","short":"subscript n"}}},{"category":"Lm","key":"209A","mappings":{"default":{"default":"latin subscript small letter p","short":"subscript p"}}},{"category":"Lm","key":"209B","mappings":{"default":{"default":"latin subscript small letter s","short":"subscript s"}}},{"category":"Lm","key":"209C","mappings":{"default":{"default":"latin subscript small letter t","short":"subscript t"}}},{"category":"So","key":"249C","mappings":{"default":{"default":"parenthesized latin small letter a","short":"parenthesized a"}}},{"category":"So","key":"249D","mappings":{"default":{"default":"parenthesized latin small letter b","short":"parenthesized b"}}},{"category":"So","key":"249E","mappings":{"default":{"default":"parenthesized latin small letter c","short":"parenthesized c"}}},{"category":"So","key":"249F","mappings":{"default":{"default":"parenthesized latin small letter d","short":"parenthesized d"}}},{"category":"So","key":"24A0","mappings":{"default":{"default":"parenthesized latin small letter e","short":"parenthesized e"}}},{"category":"So","key":"24A1","mappings":{"default":{"default":"parenthesized latin small letter f","short":"parenthesized f"}}},{"category":"So","key":"24A2","mappings":{"default":{"default":"parenthesized latin small letter g","short":"parenthesized g"}}},{"category":"So","key":"24A3","mappings":{"default":{"default":"parenthesized latin small letter h","short":"parenthesized h"}}},{"category":"So","key":"24A4","mappings":{"default":{"default":"parenthesized latin small letter i","short":"parenthesized i"}}},{"category":"So","key":"24A5","mappings":{"default":{"default":"parenthesized latin small letter j","short":"parenthesized j"}}},{"category":"So","key":"24A6","mappings":{"default":{"default":"parenthesized latin small letter k","short":"parenthesized k"}}},{"category":"So","key":"24A7","mappings":{"default":{"default":"parenthesized latin small letter l","short":"parenthesized l"}}},{"category":"So","key":"24A8","mappings":{"default":{"default":"parenthesized latin small letter m","short":"parenthesized m"}}},{"category":"So","key":"24A9","mappings":{"default":{"default":"parenthesized latin small letter n","short":"parenthesized n"}}},{"category":"So","key":"24AA","mappings":{"default":{"default":"parenthesized latin small letter o","short":"parenthesized o"}}},{"category":"So","key":"24AB","mappings":{"default":{"default":"parenthesized latin small letter p","short":"parenthesized p"}}},{"category":"So","key":"24AC","mappings":{"default":{"default":"parenthesized latin small letter q","short":"parenthesized q"}}},{"category":"So","key":"24AD","mappings":{"default":{"default":"parenthesized latin small letter r","short":"parenthesized r"}}},{"category":"So","key":"24AE","mappings":{"default":{"default":"parenthesized latin small letter s","short":"parenthesized s"}}},{"category":"So","key":"24AF","mappings":{"default":{"default":"parenthesized latin small letter t","short":"parenthesized t"}}},{"category":"So","key":"24B0","mappings":{"default":{"default":"parenthesized latin small letter u","short":"parenthesized u"}}},{"category":"So","key":"24B1","mappings":{"default":{"default":"parenthesized latin small letter v","short":"parenthesized v"}}},{"category":"So","key":"24B2","mappings":{"default":{"default":"parenthesized latin small letter w","short":"parenthesized w"}}},{"category":"So","key":"24B3","mappings":{"default":{"default":"parenthesized latin small letter x","short":"parenthesized x"}}},{"category":"So","key":"24B4","mappings":{"default":{"default":"parenthesized latin small letter y","short":"parenthesized y"}}},{"category":"So","key":"24B5","mappings":{"default":{"default":"parenthesized latin small letter z","short":"parenthesized z"}}},{"category":"So","key":"24B6","mappings":{"default":{"default":"circled latin capital letter a","short":"circled cap a"},"mathspeak":{"default":"circled upper A"}}},{"category":"So","key":"24B7","mappings":{"default":{"default":"circled latin capital letter b","short":"circled cap b"},"mathspeak":{"default":"circled upper B"}}},{"category":"So","key":"24B8","mappings":{"default":{"default":"circled latin capital letter c","short":"circled cap c"},"mathspeak":{"default":"circled upper C"}}},{"category":"So","key":"24B9","mappings":{"default":{"default":"circled latin capital letter d","short":"circled cap d"},"mathspeak":{"default":"circled upper D"}}},{"category":"So","key":"24BA","mappings":{"default":{"default":"circled latin capital letter e","short":"circled cap e"},"mathspeak":{"default":"circled upper E"}}},{"category":"So","key":"24BB","mappings":{"default":{"default":"circled latin capital letter f","short":"circled cap f"},"mathspeak":{"default":"circled upper F"}}},{"category":"So","key":"24BC","mappings":{"default":{"default":"circled latin capital letter g","short":"circled cap g"},"mathspeak":{"default":"circled upper G"}}},{"category":"So","key":"24BD","mappings":{"default":{"default":"circled latin capital letter h","short":"circled cap h"},"mathspeak":{"default":"circled upper H"}}},{"category":"So","key":"24BE","mappings":{"default":{"default":"circled latin capital letter i","short":"circled cap i"},"mathspeak":{"default":"circled upper I"}}},{"category":"So","key":"24BF","mappings":{"default":{"default":"circled latin capital letter j","short":"circled cap j"},"mathspeak":{"default":"circled upper J"}}},{"category":"So","key":"24C0","mappings":{"default":{"default":"circled latin capital letter k","short":"circled cap k"},"mathspeak":{"default":"circled upper K"}}},{"category":"So","key":"24C1","mappings":{"default":{"default":"circled latin capital letter l","short":"circled cap l"},"mathspeak":{"default":"circled upper L"}}},{"category":"So","key":"24C2","mappings":{"default":{"default":"circled latin capital letter m","short":"circled cap m"},"mathspeak":{"default":"circled upper M"}}},{"category":"So","key":"24C3","mappings":{"default":{"default":"circled latin capital letter n","short":"circled cap n"},"mathspeak":{"default":"circled upper N"}}},{"category":"So","key":"24C4","mappings":{"default":{"default":"circled latin capital letter o","short":"circled cap o"},"mathspeak":{"default":"circled upper O"}}},{"category":"So","key":"24C5","mappings":{"default":{"default":"circled latin capital letter p","short":"circled cap p"},"mathspeak":{"default":"circled upper P"}}},{"category":"So","key":"24C6","mappings":{"default":{"default":"circled latin capital letter q","short":"circled cap q"},"mathspeak":{"default":"circled upper Q"}}},{"category":"So","key":"24C7","mappings":{"default":{"default":"circled latin capital letter r","short":"circled cap r"},"mathspeak":{"default":"circled upper R"}}},{"category":"So","key":"24C8","mappings":{"default":{"default":"circled latin capital letter s","short":"circled cap s"},"mathspeak":{"default":"circled upper S"}}},{"category":"So","key":"24C9","mappings":{"default":{"default":"circled latin capital letter t","short":"circled cap t"},"mathspeak":{"default":"circled upper T"}}},{"category":"So","key":"24CA","mappings":{"default":{"default":"circled latin capital letter u","short":"circled cap u"},"mathspeak":{"default":"circled upper U"}}},{"category":"So","key":"24CB","mappings":{"default":{"default":"circled latin capital letter v","short":"circled cap v"},"mathspeak":{"default":"circled upper V"}}},{"category":"So","key":"24CC","mappings":{"default":{"default":"circled latin capital letter w","short":"circled cap w"},"mathspeak":{"default":"circled upper W"}}},{"category":"So","key":"24CD","mappings":{"default":{"default":"circled latin capital letter x","short":"circled cap x"},"mathspeak":{"default":"circled upper X"}}},{"category":"So","key":"24CE","mappings":{"default":{"default":"circled latin capital letter y","short":"circled cap y"},"mathspeak":{"default":"circled upper Y"}}},{"category":"So","key":"24CF","mappings":{"default":{"default":"circled latin capital letter z","short":"circled cap z"},"mathspeak":{"default":"circled upper Z"}}},{"category":"So","key":"24D0","mappings":{"default":{"default":"circled latin small letter a","short":"circled a"}}},{"category":"So","key":"24D1","mappings":{"default":{"default":"circled latin small letter b","short":"circled b"}}},{"category":"So","key":"24D2","mappings":{"default":{"default":"circled latin small letter c","short":"circled c"}}},{"category":"So","key":"24D3","mappings":{"default":{"default":"circled latin small letter d","short":"circled d"}}},{"category":"So","key":"24D4","mappings":{"default":{"default":"circled latin small letter e","short":"circled e"}}},{"category":"So","key":"24D5","mappings":{"default":{"default":"circled latin small letter f","short":"circled f"}}},{"category":"So","key":"24D6","mappings":{"default":{"default":"circled latin small letter g","short":"circled g"}}},{"category":"So","key":"24D7","mappings":{"default":{"default":"circled latin small letter h","short":"circled h"}}},{"category":"So","key":"24D8","mappings":{"default":{"default":"circled latin small letter i","short":"circled i"}}},{"category":"So","key":"24D9","mappings":{"default":{"default":"circled latin small letter j","short":"circled j"}}},{"category":"So","key":"24DA","mappings":{"default":{"default":"circled latin small letter k","short":"circled k"}}},{"category":"So","key":"24DB","mappings":{"default":{"default":"circled latin small letter l","short":"circled l"}}},{"category":"So","key":"24DC","mappings":{"default":{"default":"circled latin small letter m","short":"circled m"}}},{"category":"So","key":"24DD","mappings":{"default":{"default":"circled latin small letter n","short":"circled n"}}},{"category":"So","key":"24DE","mappings":{"default":{"default":"circled latin small letter o","short":"circled o"}}},{"category":"So","key":"24DF","mappings":{"default":{"default":"circled latin small letter p","short":"circled p"}}},{"category":"So","key":"24E0","mappings":{"default":{"default":"circled latin small letter q","short":"circled q"}}},{"category":"So","key":"24E1","mappings":{"default":{"default":"circled latin small letter r","short":"circled r"}}},{"category":"So","key":"24E2","mappings":{"default":{"default":"circled latin small letter s","short":"circled s"}}},{"category":"So","key":"24E3","mappings":{"default":{"default":"circled latin small letter t","short":"circled t"}}},{"category":"So","key":"24E4","mappings":{"default":{"default":"circled latin small letter u","short":"circled u"}}},{"category":"So","key":"24E5","mappings":{"default":{"default":"circled latin small letter v","short":"circled v"}}},{"category":"So","key":"24E6","mappings":{"default":{"default":"circled latin small letter w","short":"circled w"}}},{"category":"So","key":"24E7","mappings":{"default":{"default":"circled latin small letter x","short":"circled x"}}},{"category":"So","key":"24E8","mappings":{"default":{"default":"circled latin small letter y","short":"circled y"}}},{"category":"So","key":"24E9","mappings":{"default":{"default":"circled latin small letter z","short":"circled z"}}},{"category":"Lm","key":"2C7C","mappings":{"default":{"default":"latin subscript small letter j","short":"subscript j"}}},{"category":"So","key":"1F110","mappings":{"default":{"default":"parenthesized latin capital letter a","short":"parenthesized cap a"},"mathspeak":{"default":"parenthesized upper A"}}},{"category":"So","key":"1F111","mappings":{"default":{"default":"parenthesized latin capital letter b","short":"parenthesized cap b"},"mathspeak":{"default":"parenthesized upper B"}}},{"category":"So","key":"1F112","mappings":{"default":{"default":"parenthesized latin capital letter c","short":"parenthesized cap c"},"mathspeak":{"default":"parenthesized upper C"}}},{"category":"So","key":"1F113","mappings":{"default":{"default":"parenthesized latin capital letter d","short":"parenthesized cap d"},"mathspeak":{"default":"parenthesized upper D"}}},{"category":"So","key":"1F114","mappings":{"default":{"default":"parenthesized latin capital letter e","short":"parenthesized cap e"},"mathspeak":{"default":"parenthesized upper E"}}},{"category":"So","key":"1F115","mappings":{"default":{"default":"parenthesized latin capital letter f","short":"parenthesized cap f"},"mathspeak":{"default":"parenthesized upper F"}}},{"category":"So","key":"1F116","mappings":{"default":{"default":"parenthesized latin capital letter g","short":"parenthesized cap g"},"mathspeak":{"default":"parenthesized upper G"}}},{"category":"So","key":"1F117","mappings":{"default":{"default":"parenthesized latin capital letter h","short":"parenthesized cap h"},"mathspeak":{"default":"parenthesized upper H"}}},{"category":"So","key":"1F118","mappings":{"default":{"default":"parenthesized latin capital letter i","short":"parenthesized cap i"},"mathspeak":{"default":"parenthesized upper I"}}},{"category":"So","key":"1F119","mappings":{"default":{"default":"parenthesized latin capital letter j","short":"parenthesized cap j"},"mathspeak":{"default":"parenthesized upper J"}}},{"category":"So","key":"1F11A","mappings":{"default":{"default":"parenthesized latin capital letter k","short":"parenthesized cap k"},"mathspeak":{"default":"parenthesized upper K"}}},{"category":"So","key":"1F11B","mappings":{"default":{"default":"parenthesized latin capital letter l","short":"parenthesized cap l"},"mathspeak":{"default":"parenthesized upper L"}}},{"category":"So","key":"1F11C","mappings":{"default":{"default":"parenthesized latin capital letter m","short":"parenthesized cap m"},"mathspeak":{"default":"parenthesized upper M"}}},{"category":"So","key":"1F11D","mappings":{"default":{"default":"parenthesized latin capital letter n","short":"parenthesized cap n"},"mathspeak":{"default":"parenthesized upper N"}}},{"category":"So","key":"1F11E","mappings":{"default":{"default":"parenthesized latin capital letter o","short":"parenthesized cap o"},"mathspeak":{"default":"parenthesized upper O"}}},{"category":"So","key":"1F11F","mappings":{"default":{"default":"parenthesized latin capital letter p","short":"parenthesized cap p"},"mathspeak":{"default":"parenthesized upper P"}}},{"category":"So","key":"1F120","mappings":{"default":{"default":"parenthesized latin capital letter q","short":"parenthesized cap q"},"mathspeak":{"default":"parenthesized upper Q"}}},{"category":"So","key":"1F121","mappings":{"default":{"default":"parenthesized latin capital letter r","short":"parenthesized cap r"},"mathspeak":{"default":"parenthesized upper R"}}},{"category":"So","key":"1F122","mappings":{"default":{"default":"parenthesized latin capital letter s","short":"parenthesized cap s"},"mathspeak":{"default":"parenthesized upper S"}}},{"category":"So","key":"1F123","mappings":{"default":{"default":"parenthesized latin capital letter t","short":"parenthesized cap t"},"mathspeak":{"default":"parenthesized upper T"}}},{"category":"So","key":"1F124","mappings":{"default":{"default":"parenthesized latin capital letter u","short":"parenthesized cap u"},"mathspeak":{"default":"parenthesized upper U"}}},{"category":"So","key":"1F125","mappings":{"default":{"default":"parenthesized latin capital letter v","short":"parenthesized cap v"},"mathspeak":{"default":"parenthesized upper V"}}},{"category":"So","key":"1F126","mappings":{"default":{"default":"parenthesized latin capital letter w","short":"parenthesized cap w"},"mathspeak":{"default":"parenthesized upper W"}}},{"category":"So","key":"1F127","mappings":{"default":{"default":"parenthesized latin capital letter x","short":"parenthesized cap x"},"mathspeak":{"default":"parenthesized upper X"}}},{"category":"So","key":"1F128","mappings":{"default":{"default":"parenthesized latin capital letter y","short":"parenthesized cap y"},"mathspeak":{"default":"parenthesized upper Y"}}},{"category":"So","key":"1F129","mappings":{"default":{"default":"parenthesized latin capital letter z","short":"parenthesized cap z"},"mathspeak":{"default":"parenthesized upper Z"}}},{"category":"So","key":"1F12A","mappings":{"default":{"default":"tortoise shell bracketed latin capital letter s","short":"tortoise shell bracketed cap s"},"mathspeak":{"default":"tortoise shell bracketed upper S"}}},{"category":"So","key":"1F12B","mappings":{"default":{"default":"circled italic latin capital letter c","short":"circled italic cap c"},"mathspeak":{"default":"circled italic upper C"}}},{"category":"So","key":"1F12C","mappings":{"default":{"default":"circled italic latin capital letter r","short":"circled italic cap r"},"mathspeak":{"default":"circled italic upper R"}}},{"category":"So","key":"1F130","mappings":{"default":{"default":"squared latin capital letter a","short":"squared cap a"},"mathspeak":{"default":"squared upper A"}}},{"category":"So","key":"1F131","mappings":{"default":{"default":"squared latin capital letter b","short":"squared cap b"},"mathspeak":{"default":"squared upper B"}}},{"category":"So","key":"1F132","mappings":{"default":{"default":"squared latin capital letter c","short":"squared cap c"},"mathspeak":{"default":"squared upper C"}}},{"category":"So","key":"1F133","mappings":{"default":{"default":"squared latin capital letter d","short":"squared cap d"},"mathspeak":{"default":"squared upper D"}}},{"category":"So","key":"1F134","mappings":{"default":{"default":"squared latin capital letter e","short":"squared cap e"},"mathspeak":{"default":"squared upper E"}}},{"category":"So","key":"1F135","mappings":{"default":{"default":"squared latin capital letter f","short":"squared cap f"},"mathspeak":{"default":"squared upper F"}}},{"category":"So","key":"1F136","mappings":{"default":{"default":"squared latin capital letter g","short":"squared cap g"},"mathspeak":{"default":"squared upper G"}}},{"category":"So","key":"1F137","mappings":{"default":{"default":"squared latin capital letter h","short":"squared cap h"},"mathspeak":{"default":"squared upper H"}}},{"category":"So","key":"1F138","mappings":{"default":{"default":"squared latin capital letter i","short":"squared cap i"},"mathspeak":{"default":"squared upper I"}}},{"category":"So","key":"1F139","mappings":{"default":{"default":"squared latin capital letter j","short":"squared cap j"},"mathspeak":{"default":"squared upper J"}}},{"category":"So","key":"1F13A","mappings":{"default":{"default":"squared latin capital letter k","short":"squared cap k"},"mathspeak":{"default":"squared upper K"}}},{"category":"So","key":"1F13B","mappings":{"default":{"default":"squared latin capital letter l","short":"squared cap l"},"mathspeak":{"default":"squared upper L"}}},{"category":"So","key":"1F13C","mappings":{"default":{"default":"squared latin capital letter m","short":"squared cap m"},"mathspeak":{"default":"squared upper M"}}},{"category":"So","key":"1F13D","mappings":{"default":{"default":"squared latin capital letter n","short":"squared cap n"},"mathspeak":{"default":"squared upper N"}}},{"category":"So","key":"1F13E","mappings":{"default":{"default":"squared latin capital letter o","short":"squared cap o"},"mathspeak":{"default":"squared upper O"}}},{"category":"So","key":"1F13F","mappings":{"default":{"default":"squared latin capital letter p","short":"squared cap p"},"mathspeak":{"default":"squared upper P"}}},{"category":"So","key":"1F140","mappings":{"default":{"default":"squared latin capital letter q","short":"squared cap q"},"mathspeak":{"default":"squared upper Q"}}},{"category":"So","key":"1F141","mappings":{"default":{"default":"squared latin capital letter r","short":"squared cap r"},"mathspeak":{"default":"squared upper R"}}},{"category":"So","key":"1F142","mappings":{"default":{"default":"squared latin capital letter s","short":"squared cap s"},"mathspeak":{"default":"squared upper S"}}},{"category":"So","key":"1F143","mappings":{"default":{"default":"squared latin capital letter t","short":"squared cap t"},"mathspeak":{"default":"squared upper T"}}},{"category":"So","key":"1F144","mappings":{"default":{"default":"squared latin capital letter u","short":"squared cap u"},"mathspeak":{"default":"squared upper U"}}},{"category":"So","key":"1F145","mappings":{"default":{"default":"squared latin capital letter v","short":"squared cap v"},"mathspeak":{"default":"squared upper V"}}},{"category":"So","key":"1F146","mappings":{"default":{"default":"squared latin capital letter w","short":"squared cap w"},"mathspeak":{"default":"squared upper W"}}},{"category":"So","key":"1F147","mappings":{"default":{"default":"squared latin capital letter x","short":"squared cap x"},"mathspeak":{"default":"squared upper X"}}},{"category":"So","key":"1F148","mappings":{"default":{"default":"squared latin capital letter y","short":"squared cap y"},"mathspeak":{"default":"squared upper Y"}}},{"category":"So","key":"1F149","mappings":{"default":{"default":"squared latin capital letter z","short":"squared cap z"},"mathspeak":{"default":"squared upper Z"}}},{"category":"So","key":"1F150","mappings":{"default":{"default":"negative circled latin capital letter a","short":"negative circled cap a"},"mathspeak":{"default":"negative circled upper A"}}},{"category":"So","key":"1F151","mappings":{"default":{"default":"negative circled latin capital letter b","short":"negative circled cap b"},"mathspeak":{"default":"negative circled upper B"}}},{"category":"So","key":"1F152","mappings":{"default":{"default":"negative circled latin capital letter c","short":"negative circled cap c"},"mathspeak":{"default":"negative circled upper C"}}},{"category":"So","key":"1F153","mappings":{"default":{"default":"negative circled latin capital letter d","short":"negative circled cap d"},"mathspeak":{"default":"negative circled upper D"}}},{"category":"So","key":"1F154","mappings":{"default":{"default":"negative circled latin capital letter e","short":"negative circled cap e"},"mathspeak":{"default":"negative circled upper E"}}},{"category":"So","key":"1F155","mappings":{"default":{"default":"negative circled latin capital letter f","short":"negative circled cap f"},"mathspeak":{"default":"negative circled upper F"}}},{"category":"So","key":"1F156","mappings":{"default":{"default":"negative circled latin capital letter g","short":"negative circled cap g"},"mathspeak":{"default":"negative circled upper G"}}},{"category":"So","key":"1F157","mappings":{"default":{"default":"negative circled latin capital letter h","short":"negative circled cap h"},"mathspeak":{"default":"negative circled upper H"}}},{"category":"So","key":"1F158","mappings":{"default":{"default":"negative circled latin capital letter i","short":"negative circled cap i"},"mathspeak":{"default":"negative circled upper I"}}},{"category":"So","key":"1F159","mappings":{"default":{"default":"negative circled latin capital letter j","short":"negative circled cap j"},"mathspeak":{"default":"negative circled upper J"}}},{"category":"So","key":"1F15A","mappings":{"default":{"default":"negative circled latin capital letter k","short":"negative circled cap k"},"mathspeak":{"default":"negative circled upper K"}}},{"category":"So","key":"1F15B","mappings":{"default":{"default":"negative circled latin capital letter l","short":"negative circled cap l"},"mathspeak":{"default":"negative circled upper L"}}},{"category":"So","key":"1F15C","mappings":{"default":{"default":"negative circled latin capital letter m","short":"negative circled cap m"},"mathspeak":{"default":"negative circled upper M"}}},{"category":"So","key":"1F15D","mappings":{"default":{"default":"negative circled latin capital letter n","short":"negative circled cap n"},"mathspeak":{"default":"negative circled upper N"}}},{"category":"So","key":"1F15E","mappings":{"default":{"default":"negative circled latin capital letter o","short":"negative circled cap o"},"mathspeak":{"default":"negative circled upper O"}}},{"category":"So","key":"1F15F","mappings":{"default":{"default":"negative circled latin capital letter p","short":"negative circled cap p"},"mathspeak":{"default":"negative circled upper P"}}},{"category":"So","key":"1F160","mappings":{"default":{"default":"negative circled latin capital letter q","short":"negative circled cap q"},"mathspeak":{"default":"negative circled upper Q"}}},{"category":"So","key":"1F161","mappings":{"default":{"default":"negative circled latin capital letter r","short":"negative circled cap r"},"mathspeak":{"default":"negative circled upper R"}}},{"category":"So","key":"1F162","mappings":{"default":{"default":"negative circled latin capital letter s","short":"negative circled cap s"},"mathspeak":{"default":"negative circled upper S"}}},{"category":"So","key":"1F163","mappings":{"default":{"default":"negative circled latin capital letter t","short":"negative circled cap t"},"mathspeak":{"default":"negative circled upper T"}}},{"category":"So","key":"1F164","mappings":{"default":{"default":"negative circled latin capital letter u","short":"negative circled cap u"},"mathspeak":{"default":"negative circled upper U"}}},{"category":"So","key":"1F165","mappings":{"default":{"default":"negative circled latin capital letter v","short":"negative circled cap v"},"mathspeak":{"default":"negative circled upper V"}}},{"category":"So","key":"1F166","mappings":{"default":{"default":"negative circled latin capital letter w","short":"negative circled cap w"},"mathspeak":{"default":"negative circled upper W"}}},{"category":"So","key":"1F167","mappings":{"default":{"default":"negative circled latin capital letter x","short":"negative circled cap x"},"mathspeak":{"default":"negative circled upper X"}}},{"category":"So","key":"1F168","mappings":{"default":{"default":"negative circled latin capital letter y","short":"negative circled cap y"},"mathspeak":{"default":"negative circled upper Y"}}},{"category":"So","key":"1F169","mappings":{"default":{"default":"negative circled latin capital letter z","short":"negative circled cap z"},"mathspeak":{"default":"negative circled upper Z"}}},{"category":"So","key":"1F170","mappings":{"default":{"default":"negative squared latin capital letter a","short":"negative squared cap a"},"mathspeak":{"default":"negative squared upper A"}}},{"category":"So","key":"1F171","mappings":{"default":{"default":"negative squared latin capital letter b","short":"negative squared cap b"},"mathspeak":{"default":"negative squared upper B"}}},{"category":"So","key":"1F172","mappings":{"default":{"default":"negative squared latin capital letter c","short":"negative squared cap c"},"mathspeak":{"default":"negative squared upper C"}}},{"category":"So","key":"1F173","mappings":{"default":{"default":"negative squared latin capital letter d","short":"negative squared cap d"},"mathspeak":{"default":"negative squared upper D"}}},{"category":"So","key":"1F174","mappings":{"default":{"default":"negative squared latin capital letter e","short":"negative squared cap e"},"mathspeak":{"default":"negative squared upper E"}}},{"category":"So","key":"1F175","mappings":{"default":{"default":"negative squared latin capital letter f","short":"negative squared cap f"},"mathspeak":{"default":"negative squared upper F"}}},{"category":"So","key":"1F176","mappings":{"default":{"default":"negative squared latin capital letter g","short":"negative squared cap g"},"mathspeak":{"default":"negative squared upper G"}}},{"category":"So","key":"1F177","mappings":{"default":{"default":"negative squared latin capital letter h","short":"negative squared cap h"},"mathspeak":{"default":"negative squared upper H"}}},{"category":"So","key":"1F178","mappings":{"default":{"default":"negative squared latin capital letter i","short":"negative squared cap i"},"mathspeak":{"default":"negative squared upper I"}}},{"category":"So","key":"1F179","mappings":{"default":{"default":"negative squared latin capital letter j","short":"negative squared cap j"},"mathspeak":{"default":"negative squared upper J"}}},{"category":"So","key":"1F17A","mappings":{"default":{"default":"negative squared latin capital letter k","short":"negative squared cap k"},"mathspeak":{"default":"negative squared upper K"}}},{"category":"So","key":"1F17B","mappings":{"default":{"default":"negative squared latin capital letter l","short":"negative squared cap l"},"mathspeak":{"default":"negative squared upper L"}}},{"category":"So","key":"1F17C","mappings":{"default":{"default":"negative squared latin capital letter m","short":"negative squared cap m"},"mathspeak":{"default":"negative squared upper M"}}},{"category":"So","key":"1F17D","mappings":{"default":{"default":"negative squared latin capital letter n","short":"negative squared cap n"},"mathspeak":{"default":"negative squared upper N"}}},{"category":"So","key":"1F17E","mappings":{"default":{"default":"negative squared latin capital letter o","short":"negative squared cap o"},"mathspeak":{"default":"negative squared upper O"}}},{"category":"So","key":"1F17F","mappings":{"default":{"default":"negative squared latin capital letter p","short":"negative squared cap p"},"mathspeak":{"default":"negative squared upper P"}}},{"category":"So","key":"1F180","mappings":{"default":{"default":"negative squared latin capital letter q","short":"negative squared cap q"},"mathspeak":{"default":"negative squared upper Q"}}},{"category":"So","key":"1F181","mappings":{"default":{"default":"negative squared latin capital letter r","short":"negative squared cap r"},"mathspeak":{"default":"negative squared upper R"}}},{"category":"So","key":"1F182","mappings":{"default":{"default":"negative squared latin capital letter s","short":"negative squared cap s"},"mathspeak":{"default":"negative squared upper S"}}},{"category":"So","key":"1F183","mappings":{"default":{"default":"negative squared latin capital letter t","short":"negative squared cap t"},"mathspeak":{"default":"negative squared upper T"}}},{"category":"So","key":"1F184","mappings":{"default":{"default":"negative squared latin capital letter u","short":"negative squared cap u"},"mathspeak":{"default":"negative squared upper U"}}},{"category":"So","key":"1F185","mappings":{"default":{"default":"negative squared latin capital letter v","short":"negative squared cap v"},"mathspeak":{"default":"negative squared upper V"}}},{"category":"So","key":"1F186","mappings":{"default":{"default":"negative squared latin capital letter w","short":"negative squared cap w"},"mathspeak":{"default":"negative squared upper W"}}},{"category":"So","key":"1F187","mappings":{"default":{"default":"negative squared latin capital letter x","short":"negative squared cap x"},"mathspeak":{"default":"negative squared upper X"}}},{"category":"So","key":"1F188","mappings":{"default":{"default":"negative squared latin capital letter y","short":"negative squared cap y"},"mathspeak":{"default":"negative squared upper Y"}}},{"category":"So","key":"1F189","mappings":{"default":{"default":"negative squared latin capital letter z","short":"negative squared cap z"},"mathspeak":{"default":"negative squared upper Z"}}},{"category":"So","key":"1F18A","mappings":{"default":{"default":"crossed negative squared latin capital letter p","short":"crossed negative squared cap p"},"mathspeak":{"default":"crossed negative squared upper P"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-double-accent.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-double-accent.js
deleted file mode 100644
index f145bd03..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-double-accent.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","key":"01D5","mappings":{"default":{"default":"latin capital letter u with diaeresis and macron","alternative":"latin capital letter u double overdot overbar","short":"cap u double overdot overbar"},"mathspeak":{"default":"upper U double overdot overbar"}}},{"category":"Lu","key":"01D7","mappings":{"default":{"default":"latin capital letter u with diaeresis and acute","alternative":"latin capital letter u double overdot acute","short":"cap u double overdot acute"},"mathspeak":{"default":"upper U double overdot acute"}}},{"category":"Lu","key":"01D9","mappings":{"default":{"default":"latin capital letter u with diaeresis and caron","alternative":"latin capital letter u double overdot hacek","short":"cap u double overdot caron"},"mathspeak":{"default":"upper U double overdot caron"}}},{"category":"Lu","key":"01DB","mappings":{"default":{"default":"latin capital letter u with diaeresis and grave","alternative":"latin capital letter u double overdot grave","short":"cap u double overdot grave"},"mathspeak":{"default":"upper U double overdot grave"}}},{"category":"Lu","key":"01DE","mappings":{"default":{"default":"latin capital letter a with diaeresis and macron","alternative":"latin capital letter a double overdot overbar","short":"cap a double overdot overbar"},"mathspeak":{"default":"upper A double overdot overbar"}}},{"category":"Lu","key":"01E0","mappings":{"default":{"default":"latin capital letter a with dot above and macron","alternative":"latin capital letter a dot overbar","short":"cap a overdot overbar"},"mathspeak":{"default":"upper A overdot overbar"}}},{"category":"Lu","key":"01EC","mappings":{"default":{"default":"latin capital letter o with ogonek and macron","alternative":"latin capital letter o ogonek overbar","short":"cap o ogonek overbar"},"mathspeak":{"default":"upper O ogonek overbar"}}},{"category":"Lu","key":"01FA","mappings":{"default":{"default":"latin capital letter a with ring above and acute","alternative":"latin capital letter a ring acute","short":"cap a ring acute"},"mathspeak":{"default":"upper A ring acute"}}},{"category":"Lu","key":"022A","mappings":{"default":{"default":"latin capital letter o with diaeresis and macron","alternative":"latin capital letter o double overdot overbar","short":"cap o double overdot overbar"},"mathspeak":{"default":"upper O double overdot overbar"}}},{"category":"Lu","key":"022C","mappings":{"default":{"default":"latin capital letter o with tilde and macron","alternative":"latin capital letter o tilde overbar","short":"cap o tilde overbar"},"mathspeak":{"default":"upper O tilde overbar"}}},{"category":"Lu","key":"0230","mappings":{"default":{"default":"latin capital letter o with dot above and macron","alternative":"latin capital letter o overdot overbar","short":"cap o overdot overbar"},"mathspeak":{"default":"upper O overdot overbar"}}},{"category":"Lu","key":"1E08","mappings":{"default":{"default":"latin capital letter c with cedilla and acute","alternative":"latin capital letter c cedilla acute","short":"cap c cedilla acute"},"mathspeak":{"default":"upper C cedilla acute"}}},{"category":"Lu","key":"1E14","mappings":{"default":{"default":"latin capital letter e with macron and grave","alternative":"latin capital letter e overbar grave","short":"cap e overbar grave"},"mathspeak":{"default":"upper E overbar grave"}}},{"category":"Lu","key":"1E16","mappings":{"default":{"default":"latin capital letter e with macron and acute","alternative":"latin capital letter e overbar acute","short":"cap e overbar acute"},"mathspeak":{"default":"upper E overbar acute"}}},{"category":"Lu","key":"1E1C","mappings":{"default":{"default":"latin capital letter e with cedilla and breve","alternative":"latin capital letter e cedilla breve","short":"cap e cedilla breve"},"mathspeak":{"default":"upper E cedilla breve"}}},{"category":"Lu","key":"1E2E","mappings":{"default":{"default":"latin capital letter i with diaeresis and acute","alternative":"latin capital letter i double overdot acute","short":"cap i double overdot acute"},"mathspeak":{"default":"upper I double overdot acute"}}},{"category":"Lu","key":"1E38","mappings":{"default":{"default":"latin capital letter l with dot below and macron","alternative":"latin capital letter l underdot overbar","short":"cap l underdot overbar"},"mathspeak":{"default":"upper L underdot overbar"}}},{"category":"Lu","key":"1E4C","mappings":{"default":{"default":"latin capital letter o with tilde and acute","alternative":"latin capital letter o tilde acute","short":"cap o tilde acute"},"mathspeak":{"default":"upper O tilde acute"}}},{"category":"Lu","key":"1E4E","mappings":{"default":{"default":"latin capital letter o with tilde and diaeresis","alternative":"latin capital letter o tilde double overdot","short":"cap o tilde double overdot"},"mathspeak":{"default":"upper O tilde double overdot"}}},{"category":"Lu","key":"1E50","mappings":{"default":{"default":"latin capital letter o with macron and grave","alternative":"latin capital letter o overbar grave","short":"cap o overbar grave"},"mathspeak":{"default":"upper O overbar grave"}}},{"category":"Lu","key":"1E52","mappings":{"default":{"default":"latin capital letter o with macron and acute","alternative":"latin capital letter o overbar acute","short":"cap o overbar acute"},"mathspeak":{"default":"upper O overbar acute"}}},{"category":"Lu","key":"1E5C","mappings":{"default":{"default":"latin capital letter r with dot below and macron","alternative":"cap r underdot and overbar","short":"cap r overbar underdot"},"mathspeak":{"default":"upper R overbar underdot"}}},{"category":"Lu","key":"1E64","mappings":{"default":{"default":"latin capital letter s with acute dot above","alternative":"latin capital letter s acute overdot","short":"cap s acute overdot"},"mathspeak":{"default":"upper S acute overdot"}}},{"category":"Lu","key":"1E66","mappings":{"default":{"default":"latin capital letter s with caron and dot above","alternative":"latin capital letter s caron overdot","short":"cap s caron overdot"},"mathspeak":{"default":"upper S caron overdot"}}},{"category":"Lu","key":"1E68","mappings":{"default":{"default":"latin capital letter s with dot below and dot above","alternative":"latin capital letter s underdot overdot","short":"cap s underdot overdot"},"mathspeak":{"default":"upper S underdot overdot"}}},{"category":"Lu","key":"1E78","mappings":{"default":{"default":"latin capital letter u with tilde and acute","alternative":"latin capital letter u tilde acute","short":"cap u tilde acute"},"mathspeak":{"default":"upper U tilde acute"}}},{"category":"Lu","key":"1E7A","mappings":{"default":{"default":"latin capital letter u with macron and diaeresis","alternative":"latin capital letter u overbar double overdot","short":"cap u overbar double overdot"},"mathspeak":{"default":"upper U overbar double overdot"}}},{"category":"Lu","key":"1EA4","mappings":{"default":{"default":"latin capital letter a with circumflex and acute","alternative":"latin capital letter a hat acute","short":"cap a hat acute"},"mathspeak":{"default":"upper A hat acute"}}},{"category":"Lu","key":"1EA6","mappings":{"default":{"default":"latin capital letter a with circumflex and grave","alternative":"latin capital letter a hat grave","short":"cap a hat grave"},"mathspeak":{"default":"upper A hat grave"}}},{"category":"Lu","key":"1EA8","mappings":{"default":{"default":"latin capital letter a with circumflex and hook above","alternative":"latin capital letter a hat hook","short":"cap a hat hook"},"mathspeak":{"default":"upper A hat hook"}}},{"category":"Lu","key":"1EAA","mappings":{"default":{"default":"latin capital letter a with circumflex and tilde","alternative":"latin capital letter a hat tilde","short":"cap a hat tilde"},"mathspeak":{"default":"upper A hat tilde"}}},{"category":"Lu","key":"1EAC","mappings":{"default":{"default":"latin capital letter a with circumflex and dot below","alternative":"latin capital letter a hat underdot","short":"cap a hat underdot"},"mathspeak":{"default":"upper A hat underdot"}}},{"category":"Lu","key":"1EAE","mappings":{"default":{"default":"latin capital letter a with breve and acute","alternative":"latin capital letter a breve acute","short":"cap a breve acute"},"mathspeak":{"default":"upper A breve acute"}}},{"category":"Lu","key":"1EB0","mappings":{"default":{"default":"latin capital letter a with breve and grave","alternative":"latin capital letter a breve grave","short":"cap a breve grave"},"mathspeak":{"default":"upper A breve grave"}}},{"category":"Lu","key":"1EB2","mappings":{"default":{"default":"latin capital letter a with breve and hook above","alternative":"latin capital letter a breve hook","short":"cap a breve hook"},"mathspeak":{"default":"upper A breve hook"}}},{"category":"Lu","key":"1EB4","mappings":{"default":{"default":"latin capital letter a with breve and tilde","alternative":"latin capital letter a breve tilde","short":"cap a breve tilde"},"mathspeak":{"default":"upper A breve tilde"}}},{"category":"Lu","key":"1EB6","mappings":{"default":{"default":"latin capital letter a with breve and dot below","alternative":"latin capital letter a breve underdot","short":"cap a breve underdot"},"mathspeak":{"default":"upper A breve underdot"}}},{"category":"Lu","key":"1EBE","mappings":{"default":{"default":"latin capital letter e with circumflex and acute","alternative":"latin capital letter e hat acute","short":"cap e hat acute"},"mathspeak":{"default":"upper E hat acute"}}},{"category":"Lu","key":"1EC0","mappings":{"default":{"default":"latin capital letter e with circumflex and grave","alternative":"latin capital letter e hat grave","short":"cap e hat grave"},"mathspeak":{"default":"upper E hat grave"}}},{"category":"Lu","key":"1EC2","mappings":{"default":{"default":"latin capital letter e with circumflex and hook above","alternative":"latin capital letter e hat hook","short":"cap e hat hook"},"mathspeak":{"default":"upper E hat hook"}}},{"category":"Lu","key":"1EC4","mappings":{"default":{"default":"latin capital letter e with circumflex and tilde","alternative":"latin capital letter e hat tilde","short":"cap e hat tilde"},"mathspeak":{"default":"upper E hat tilde"}}},{"category":"Lu","key":"1EC6","mappings":{"default":{"default":"latin capital letter e with circumflex and dot below","alternative":"latin capital letter e hat underdot","short":"cap e hat underdot"},"mathspeak":{"default":"upper E hat underdot"}}},{"category":"Lu","key":"1ED0","mappings":{"default":{"default":"latin capital letter o with circumflex and acute","alternative":"latin capital letter o hat acute","short":"cap o hat acute"},"mathspeak":{"default":"upper O hat acute"}}},{"category":"Lu","key":"1ED2","mappings":{"default":{"default":"latin capital letter o with circumflex and grave","alternative":"latin capital letter o hat grave","short":"cap o hat grave"},"mathspeak":{"default":"upper O hat grave"}}},{"category":"Lu","key":"1ED4","mappings":{"default":{"default":"latin capital letter o with circumflex and hook above","alternative":"latin capital letter o hat hook","short":"cap o hat hook"},"mathspeak":{"default":"upper O hat hook"}}},{"category":"Lu","key":"1ED6","mappings":{"default":{"default":"latin capital letter o with circumflex and tilde","alternative":"latin capital letter o hat tilde","short":"cap o hat tilde"},"mathspeak":{"default":"upper O hat tilde"}}},{"category":"Lu","key":"1ED8","mappings":{"default":{"default":"latin capital letter o with circumflex and dot below","alternative":"latin capital letter o hat underdot","short":"cap o hat underdot"},"mathspeak":{"default":"upper O hat underdot"}}},{"category":"Lu","key":"1EDA","mappings":{"default":{"default":"latin capital letter o with horn and acute","alternative":"latin capital letter o acute prime","short":"cap o acute prime"},"mathspeak":{"default":"upper O acute prime"}}},{"category":"Lu","key":"1EDC","mappings":{"default":{"default":"latin capital letter o with horn and grave","alternative":"latin capital letter o grave prime","short":"cap o grave prime"},"mathspeak":{"default":"upper O grave prime"}}},{"category":"Lu","key":"1EDE","mappings":{"default":{"default":"latin capital letter o with horn and hook above","alternative":"latin capital letter o hook prime","short":"cap o hook prime"},"mathspeak":{"default":"upper O hook prime"}}},{"category":"Lu","key":"1EE0","mappings":{"default":{"default":"latin capital letter o with horn and tilde","alternative":"latin capital letter o tilde prime","short":"cap o tilde prime"},"mathspeak":{"default":"upper O tilde prime"}}},{"category":"Lu","key":"1EE2","mappings":{"default":{"default":"latin capital letter o with horn and dot below","alternative":"latin capital letter o underdot prime","short":"cap o underdot prime"},"mathspeak":{"default":"upper O underdot prime"}}},{"category":"Lu","key":"1EE8","mappings":{"default":{"default":"latin capital letter u with horn and acute","alternative":"latin capital letter u acute prime","short":"cap u acute prime"},"mathspeak":{"default":"upper U acute prime"}}},{"category":"Lu","key":"1EEA","mappings":{"default":{"default":"latin capital letter u with horn and grave","alternative":"latin capital letter u grave prime","short":"cap u grave prime"},"mathspeak":{"default":"upper U grave prime"}}},{"category":"Lu","key":"1EEC","mappings":{"default":{"default":"latin capital letter u with horn and hook above","alternative":"latin capital letter u hook prime","short":"cap u hook prime"},"mathspeak":{"default":"upper U hook prime"}}},{"category":"Lu","key":"1EEE","mappings":{"default":{"default":"latin capital letter u with horn and tilde","alternative":"latin capital letter u tilde prime","short":"cap u tilde prime"},"mathspeak":{"default":"upper U tilde prime"}}},{"category":"Lu","key":"1EF0","mappings":{"default":{"default":"latin capital letter u with horn and dot below","alternative":"latin capital letter u underdot prime","short":"cap u underdot prime"},"mathspeak":{"default":"upper U underdot prime"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-normal.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-normal.js
deleted file mode 100644
index d628a6ad..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-normal.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","key":"0041","mappings":{"default":{"default":"latin capital letter a","short":"cap a"},"mathspeak":{"default":"upper A"}}},{"category":"Lu","key":"0042","mappings":{"default":{"default":"latin capital letter b","short":"cap b"},"mathspeak":{"default":"upper B"}}},{"category":"Lu","key":"0043","mappings":{"default":{"default":"latin capital letter c","short":"cap c"},"mathspeak":{"default":"upper C"}}},{"category":"Lu","key":"0044","mappings":{"default":{"default":"latin capital letter d","short":"cap d"},"mathspeak":{"default":"upper D"}}},{"category":"Lu","key":"0045","mappings":{"default":{"default":"latin capital letter e","short":"cap e"},"mathspeak":{"default":"upper E"}}},{"category":"Lu","key":"0046","mappings":{"default":{"default":"latin capital letter f","short":"cap f"},"mathspeak":{"default":"upper F"}}},{"category":"Lu","key":"0047","mappings":{"default":{"default":"latin capital letter g","short":"cap g"},"mathspeak":{"default":"upper G"}}},{"category":"Lu","key":"0048","mappings":{"default":{"default":"latin capital letter h","short":"cap h"},"mathspeak":{"default":"upper H"}}},{"category":"Lu","key":"0049","mappings":{"default":{"default":"latin capital letter i","short":"cap i"},"mathspeak":{"default":"upper I"}}},{"category":"Lu","key":"004A","mappings":{"default":{"default":"latin capital letter j","short":"cap j"},"mathspeak":{"default":"upper J"}}},{"category":"Lu","key":"004B","mappings":{"default":{"default":"latin capital letter k","short":"cap k"},"mathspeak":{"default":"upper K"}}},{"category":"Lu","key":"004C","mappings":{"default":{"default":"latin capital letter l","short":"cap l"},"mathspeak":{"default":"upper L"}}},{"category":"Lu","key":"004D","mappings":{"default":{"default":"latin capital letter m","short":"cap m"},"mathspeak":{"default":"upper M"}}},{"category":"Lu","key":"004E","mappings":{"default":{"default":"latin capital letter n","short":"cap n"},"mathspeak":{"default":"upper N"}}},{"category":"Lu","key":"004F","mappings":{"default":{"default":"latin capital letter o","short":"cap o"},"mathspeak":{"default":"upper O"}}},{"category":"Lu","key":"0050","mappings":{"default":{"default":"latin capital letter p","short":"cap p"},"mathspeak":{"default":"upper P"}}},{"category":"Lu","key":"0051","mappings":{"default":{"default":"latin capital letter q","short":"cap q"},"mathspeak":{"default":"upper Q"}}},{"category":"Lu","key":"0052","mappings":{"default":{"default":"latin capital letter r","short":"cap r"},"mathspeak":{"default":"upper R"}}},{"category":"Lu","key":"0053","mappings":{"default":{"default":"latin capital letter s","short":"cap s"},"mathspeak":{"default":"upper S"}}},{"category":"Lu","key":"0054","mappings":{"default":{"default":"latin capital letter t","short":"cap t"},"mathspeak":{"default":"upper T"}}},{"category":"Lu","key":"0055","mappings":{"default":{"default":"latin capital letter u","short":"cap u"},"mathspeak":{"default":"upper U"}}},{"category":"Lu","key":"0056","mappings":{"default":{"default":"latin capital letter v","short":"cap v"},"mathspeak":{"default":"upper V"}}},{"category":"Lu","key":"0057","mappings":{"default":{"default":"latin capital letter w","short":"cap w"},"mathspeak":{"default":"upper W"}}},{"category":"Lu","key":"0058","mappings":{"default":{"default":"latin capital letter x","short":"cap x"},"mathspeak":{"default":"upper X"}}},{"category":"Lu","key":"0059","mappings":{"default":{"default":"latin capital letter y","short":"cap y"},"mathspeak":{"default":"upper Y"}}},{"category":"Lu","key":"005A","mappings":{"default":{"default":"latin capital letter z","short":"cap z"},"mathspeak":{"default":"upper Z"}}},{"category":"Lu","key":"FF21","mappings":{"default":{"default":"fullwidth latin capital letter a","alternative":"fullwidth latin cap a","short":"cap a"},"mathspeak":{"default":"upper A"}}},{"category":"Lu","key":"FF22","mappings":{"default":{"default":"fullwidth latin capital letter b","alternative":"fullwidth latin cap b","short":"cap b"},"mathspeak":{"default":"upper B"}}},{"category":"Lu","key":"FF23","mappings":{"default":{"default":"fullwidth latin capital letter c","alternative":"fullwidth latin cap c","short":"cap c"},"mathspeak":{"default":"upper C"}}},{"category":"Lu","key":"FF24","mappings":{"default":{"default":"fullwidth latin capital letter d","alternative":"fullwidth latin cap d","short":"cap d"},"mathspeak":{"default":"upper D"}}},{"category":"Lu","key":"FF25","mappings":{"default":{"default":"fullwidth latin capital letter e","alternative":"fullwidth latin cap e","short":"cap e"},"mathspeak":{"default":"upper E"}}},{"category":"Lu","key":"FF26","mappings":{"default":{"default":"fullwidth latin capital letter f","alternative":"fullwidth latin cap f","short":"cap f"},"mathspeak":{"default":"upper F"}}},{"category":"Lu","key":"FF27","mappings":{"default":{"default":"fullwidth latin capital letter g","alternative":"fullwidth latin cap g","short":"cap g"},"mathspeak":{"default":"upper G"}}},{"category":"Lu","key":"FF28","mappings":{"default":{"default":"fullwidth latin capital letter h","alternative":"fullwidth latin cap h","short":"cap h"},"mathspeak":{"default":"upper H"}}},{"category":"Lu","key":"FF29","mappings":{"default":{"default":"fullwidth latin capital letter i","alternative":"fullwidth latin cap i","short":"cap i"},"mathspeak":{"default":"upper I"}}},{"category":"Lu","key":"FF2A","mappings":{"default":{"default":"fullwidth latin capital letter j","alternative":"fullwidth latin cap j","short":"cap j"},"mathspeak":{"default":"upper J"}}},{"category":"Lu","key":"FF2B","mappings":{"default":{"default":"fullwidth latin capital letter k","alternative":"fullwidth latin cap k","short":"cap k"},"mathspeak":{"default":"upper K"}}},{"category":"Lu","key":"FF2C","mappings":{"default":{"default":"fullwidth latin capital letter l","alternative":"fullwidth latin cap l","short":"cap l"},"mathspeak":{"default":"upper L"}}},{"category":"Lu","key":"FF2D","mappings":{"default":{"default":"fullwidth latin capital letter m","alternative":"fullwidth latin cap m","short":"cap m"},"mathspeak":{"default":"upper M"}}},{"category":"Lu","key":"FF2E","mappings":{"default":{"default":"fullwidth latin capital letter n","alternative":"fullwidth latin cap n","short":"cap n"},"mathspeak":{"default":"upper N"}}},{"category":"Lu","key":"FF2F","mappings":{"default":{"default":"fullwidth latin capital letter o","alternative":"fullwidth latin cap o","short":"cap o"},"mathspeak":{"default":"upper O"}}},{"category":"Lu","key":"FF30","mappings":{"default":{"default":"fullwidth latin capital letter p","alternative":"fullwidth latin cap p","short":"cap p"},"mathspeak":{"default":"upper P"}}},{"category":"Lu","key":"FF31","mappings":{"default":{"default":"fullwidth latin capital letter q","alternative":"fullwidth latin cap q","short":"cap q"},"mathspeak":{"default":"upper Q"}}},{"category":"Lu","key":"FF32","mappings":{"default":{"default":"fullwidth latin capital letter r","alternative":"fullwidth latin cap r","short":"cap r"},"mathspeak":{"default":"upper R"}}},{"category":"Lu","key":"FF33","mappings":{"default":{"default":"fullwidth latin capital letter s","alternative":"fullwidth latin cap s","short":"cap s"},"mathspeak":{"default":"upper S"}}},{"category":"Lu","key":"FF34","mappings":{"default":{"default":"fullwidth latin capital letter t","alternative":"fullwidth latin cap t","short":"cap t"},"mathspeak":{"default":"upper T"}}},{"category":"Lu","key":"FF35","mappings":{"default":{"default":"fullwidth latin capital letter u","alternative":"fullwidth latin cap u","short":"cap u"},"mathspeak":{"default":"upper U"}}},{"category":"Lu","key":"FF36","mappings":{"default":{"default":"fullwidth latin capital letter v","alternative":"fullwidth latin cap v","short":"cap v"},"mathspeak":{"default":"upper V"}}},{"category":"Lu","key":"FF37","mappings":{"default":{"default":"fullwidth latin capital letter w","alternative":"fullwidth latin cap w","short":"cap w"},"mathspeak":{"default":"upper W"}}},{"category":"Lu","key":"FF38","mappings":{"default":{"default":"fullwidth latin capital letter x","alternative":"fullwidth latin cap x","short":"cap x"},"mathspeak":{"default":"upper X"}}},{"category":"Lu","key":"FF39","mappings":{"default":{"default":"fullwidth latin capital letter y","alternative":"fullwidth latin cap y","short":"cap y"},"mathspeak":{"default":"upper Y"}}},{"category":"Lu","key":"FF3A","mappings":{"default":{"default":"fullwidth latin capital letter z","alternative":"fullwidth latin cap z","short":"cap z"},"mathspeak":{"default":"upper Z"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-single-accent.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-single-accent.js
deleted file mode 100644
index a9b58747..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/latin-upper-single-accent.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Lu","key":"00C0","mappings":{"default":{"default":"latin capital letter a with grave","alternative":"latin capital letter a grave","short":"cap a grave"},"mathspeak":{"default":"modifying above upper A with grave","brief":"mod above upper A with grave","sbrief":"mod above upper A with grave"}}},{"category":"Lu","key":"00C1","mappings":{"default":{"default":"latin capital letter a with acute","alternative":"latin capital letter a acute","short":"cap a acute"},"mathspeak":{"default":"modifying above upper A with acute","brief":"mod above upper A with acute","sbrief":"mod above upper A with acute"}}},{"category":"Lu","key":"00C2","mappings":{"default":{"default":"latin capital letter a with circumflex","alternative":"latin capital letter a hat","short":"cap a hat"},"mathspeak":{"default":"modifying above upper A with caret","brief":"mod above upper A with caret","sbrief":"mod above upper A with caret"}}},{"category":"Lu","key":"00C3","mappings":{"default":{"default":"latin capital letter a with tilde","alternative":"latin capital letter a tilde","short":"cap a tilde"},"mathspeak":{"default":"upper A overtilde","brief":"upper A overtilde","sbrief":"upper A overtilde"}}},{"category":"Lu","key":"00C4","mappings":{"default":{"default":"latin capital letter a with diaeresis","alternative":"latin capital letter a double overdot","short":"cap a double overdot"},"mathspeak":{"default":"modifying above upper A with double dot","brief":"mod above upper A with double dot","sbrief":"mod above upper A with double dot"}}},{"category":"Lu","key":"00C5","mappings":{"default":{"default":"latin capital letter a with ring above","alternative":"latin capital letter a ring","short":"cap a ring"},"mathspeak":{"default":"modifying above upper A with ring","brief":"mod above upper A with ring","sbrief":"mod above upper A with ring"}}},{"category":"Lu","key":"00C7","mappings":{"default":{"default":"latin capital letter c cedilla","alternative":"latin capital letter c cedilla","short":"cap c cedilla"},"mathspeak":{"default":"modifying above upper C with cedilla","brief":"mod above upper C with cedilla","sbrief":"mod above upper C with cedilla"}}},{"category":"Lu","key":"00C8","mappings":{"default":{"default":"latin capital letter e with grave","alternative":"latin capital letter e grave","short":"cap e grave"},"mathspeak":{"default":"modifying above upper E with grave","brief":"mod above upper E with grave","sbrief":"mod above upper E with grave"}}},{"category":"Lu","key":"00C9","mappings":{"default":{"default":"latin capital letter e with acute","alternative":"latin capital letter e acute","short":"cap e acute"},"mathspeak":{"default":"modifying above upper E with acute","brief":"mod above upper E with acute","sbrief":"mod above upper E with acute"}}},{"category":"Lu","key":"00CA","mappings":{"default":{"default":"latin capital letter e with circumflex","alternative":"latin capital letter e hat","short":"cap e hat"},"mathspeak":{"default":"modifying above upper E with caret","brief":"mod above upper E with caret","sbrief":"mod above upper E with caret"}}},{"category":"Lu","key":"00CB","mappings":{"default":{"default":"latin capital letter e with diaeresis","alternative":"latin capital letter e double overdot","short":"cap e double overdot"},"mathspeak":{"default":"modifying above upper E with double dot","brief":"mod above upper E with double dot","sbrief":"mod above upper E with double dot"}}},{"category":"Lu","key":"00CC","mappings":{"default":{"default":"latin capital letter i with grave","alternative":"latin capital letter i grave","short":"cap i grave"},"mathspeak":{"default":"modifying above upper I with grave","brief":"mod above upper I with grave","sbrief":"mod above upper I with grave"}}},{"category":"Lu","key":"00CD","mappings":{"default":{"default":"latin capital letter i with acute","alternative":"latin capital letter i acute","short":"cap i acute"},"mathspeak":{"default":"modifying above upper I with acute","brief":"mod above upper I with acute","sbrief":"mod above upper I with acute"}}},{"category":"Lu","key":"00CE","mappings":{"default":{"default":"latin capital letter i with circumflex","alternative":"latin capital letter i hat","short":"cap i hat"},"mathspeak":{"default":"modifying above upper I with caret","brief":"mod above upper I with caret","sbrief":"mod above upper I with caret"}}},{"category":"Lu","key":"00CF","mappings":{"default":{"default":"latin capital letter i with diaeresis","alternative":"latin capital letter i double overdot","short":"cap i double overdot"},"mathspeak":{"default":"modifying above upper I with double dot","brief":"mod above upper I with double dot","sbrief":"mod above upper I with double dot"}}},{"category":"Lu","key":"00D1","mappings":{"default":{"default":"latin capital letter n tilde","alternative":"latin capital letter n tilde","short":"cap n tilde"},"mathspeak":{"default":"upper N overtilde","brief":"upper N overtilde","sbrief":"upper N overtilde"}}},{"category":"Lu","key":"00D2","mappings":{"default":{"default":"latin capital letter o with grave","alternative":"latin capital letter o grave","short":"cap o grave"},"mathspeak":{"default":"modifying above upper O with grave","brief":"mod above upper O with grave","sbrief":"mod above upper O with grave"}}},{"category":"Lu","key":"00D3","mappings":{"default":{"default":"latin capital letter o with acute","alternative":"latin capital letter o acute","short":"cap o acute"},"mathspeak":{"default":"modifying above upper O with acute","brief":"mod above upper O with acute","sbrief":"mod above upper O with acute"}}},{"category":"Lu","key":"00D4","mappings":{"default":{"default":"latin capital letter o with circumflex","alternative":"latin capital letter o hat","short":"cap o hat"},"mathspeak":{"default":"modifying above upper O with caret","brief":"mod above upper O with caret","sbrief":"mod above upper O with caret"}}},{"category":"Lu","key":"00D5","mappings":{"default":{"default":"latin capital letter o with tilde","alternative":"latin capital letter o tilde","short":"cap o tilde"},"mathspeak":{"default":"upper O overtilde","brief":"upper O overtilde","sbrief":"upper O overtilde"}}},{"category":"Lu","key":"00D6","mappings":{"default":{"default":"latin capital letter o with diaeresis","alternative":"latin capital letter o double overdot","short":"cap o double overdot"},"mathspeak":{"default":"modifying above upper O with double dot","brief":"mod above upper O with double dot","sbrief":"mod above upper O with double dot"}}},{"category":"Lu","key":"00D9","mappings":{"default":{"default":"latin capital letter u with grave","alternative":"latin capital letter u grave","short":"cap u grave"},"mathspeak":{"default":"modifying above upper U with grave","brief":"mod above upper U with grave","sbrief":"mod above upper U with grave"}}},{"category":"Lu","key":"00DA","mappings":{"default":{"default":"latin capital letter u with acute","alternative":"latin capital letter u acute","short":"cap u acute"},"mathspeak":{"default":"modifying above upper U with acute","brief":"mod above upper U with acute","sbrief":"mod above upper U with acute"}}},{"category":"Lu","key":"00DB","mappings":{"default":{"default":"latin capital letter u with circumflex","alternative":"latin capital letter u hat","short":"cap u hat"},"mathspeak":{"default":"modifying above upper U with caret","brief":"mod above upper U with caret","sbrief":"mod above upper U with caret"}}},{"category":"Lu","key":"00DC","mappings":{"default":{"default":"latin capital letter u with diaeresis","alternative":"latin capital letter u double overdot","short":"cap u double overdot"},"mathspeak":{"default":"modifying above upper U with double dot","brief":"mod above upper U with double dot","sbrief":"mod above upper U with double dot"}}},{"category":"Lu","key":"00DD","mappings":{"default":{"default":"latin capital letter y with acute","alternative":"latin capital letter y acute","short":"cap y acute"},"mathspeak":{"default":"modifying above upper Y with acute","brief":"mod above upper Y with acute","sbrief":"mod above upper Y with acute"}}},{"category":"Lu","key":"0100","mappings":{"default":{"default":"latin capital letter a macron","alternative":"latin capital letter a overbar","short":"cap a overbar"},"mathspeak":{"default":"upper A overbar","brief":"upper A overbar","sbrief":"upper A overbar"}}},{"category":"Lu","key":"0102","mappings":{"default":{"default":"latin capital letter a with breve","alternative":"latin capital letter a breve","short":"cap a breve"},"mathspeak":{"default":"modifying above upper A with breve","brief":"mod above upper A with breve","sbrief":"mod above upper A with breve"}}},{"category":"Lu","key":"0104","mappings":{"default":{"default":"latin capital letter a with ogonek","alternative":"latin capital letter a ogonek","short":"cap a ogonek"},"mathspeak":{"default":"modifying above upper A with ogonek","brief":"mod above upper A with ogonek","sbrief":"mod above upper A with ogonek"}}},{"category":"Lu","key":"0106","mappings":{"default":{"default":"latin capital letter c with acute","alternative":"latin capital letter c acute","short":"cap c acute"},"mathspeak":{"default":"modifying above upper C with acute","brief":"mod above upper C with acute","sbrief":"mod above upper C with acute"}}},{"category":"Lu","key":"0108","mappings":{"default":{"default":"latin capital letter c with circumflex","alternative":"latin capital letter c hat","short":"cap c hat"},"mathspeak":{"default":"modifying above upper C with caret","brief":"mod above upper C with caret","sbrief":"mod above upper C with caret"}}},{"category":"Lu","key":"010A","mappings":{"default":{"default":"latin capital letter c with dot above","alternative":"latin capital letter c overdot","short":"cap c overdot"},"mathspeak":{"default":"modifying above upper C with dot","brief":"mod above upper C with dot","sbrief":"mod above upper C with dot"}}},{"category":"Lu","key":"010C","mappings":{"default":{"default":"latin capital letter c with caron","alternative":"latin capital letter c hacek","short":"cap c caron"},"mathspeak":{"default":"modifying above upper C with caron","brief":"mod above upper C with caron","sbrief":"mod above upper C with caron"}}},{"category":"Lu","key":"010E","mappings":{"default":{"default":"latin capital letter d with caron","alternative":"latin capital letter d hacek","short":"cap d caron"},"mathspeak":{"default":"modifying above upper D with caron","brief":"mod above upper D with caron","sbrief":"mod above upper D with caron"}}},{"category":"Lu","key":"0112","mappings":{"default":{"default":"latin capital letter e with macron","alternative":"latin capital letter e overbar","short":"cap e overbar"},"mathspeak":{"default":"upper E overbar","brief":"upper E overbar","sbrief":"upper E overbar"}}},{"category":"Lu","key":"0114","mappings":{"default":{"default":"latin capital letter e with breve","alternative":"latin capital letter e breve","short":"cap e breve"},"mathspeak":{"default":"modifying above upper E with breve","brief":"mod above upper E with breve","sbrief":"mod above upper E with breve"}}},{"category":"Lu","key":"0116","mappings":{"default":{"default":"latin capital letter e with dot above","alternative":"latin capital letter e overdot","short":"cap e overdot"},"mathspeak":{"default":"modifying above upper E with dot","brief":"mod above upper E with dot","sbrief":"mod above upper E with dot"}}},{"category":"Lu","key":"0118","mappings":{"default":{"default":"latin capital letter e with ogonek","alternative":"latin capital letter e ogonek","short":"cap e ogonek"},"mathspeak":{"default":"modifying above upper E with ogonek","brief":"mod above upper E with ogonek","sbrief":"mod above upper E with ogonek"}}},{"category":"Lu","key":"011A","mappings":{"default":{"default":"latin capital letter e with caron","alternative":"latin capital letter e hacek","short":"cap e caron"},"mathspeak":{"default":"modifying above upper E with caron","brief":"mod above upper E with caron","sbrief":"mod above upper E with caron"}}},{"category":"Lu","key":"011C","mappings":{"default":{"default":"latin capital letter g with circumflex","alternative":"latin capital letter g hat","short":"cap g hat"},"mathspeak":{"default":"modifying above upper G with caret","brief":"mod above upper G with caret","sbrief":"mod above upper G with caret"}}},{"category":"Lu","key":"011E","mappings":{"default":{"default":"latin capital letter g with breve","alternative":"latin capital letter g breve","short":"cap g breve"},"mathspeak":{"default":"modifying above upper G with breve","brief":"mod above upper G with breve","sbrief":"mod above upper G with breve"}}},{"category":"Lu","key":"0120","mappings":{"default":{"default":"latin capital letter g with dot above","alternative":"latin capital letter g overdot","short":"cap g overdot"},"mathspeak":{"default":"modifying above upper G with dot","brief":"mod above upper G with dot","sbrief":"mod above upper G with dot"}}},{"category":"Lu","key":"0122","mappings":{"default":{"default":"latin capital letter g with cedilla","alternative":"latin capital letter g cedilla","short":"cap g cedilla"},"mathspeak":{"default":"modifying above upper G with cedilla","brief":"mod above upper G with cedilla","sbrief":"mod above upper G with cedilla"}}},{"category":"Lu","key":"0124","mappings":{"default":{"default":"latin capital letter h with circumflex","alternative":"latin capital letter h hat","short":"cap h hat"},"mathspeak":{"default":"modifying above upper H with caret","brief":"mod above upper H with caret","sbrief":"mod above upper H with caret"}}},{"category":"Lu","key":"0128","mappings":{"default":{"default":"latin capital letter i with tilde","alternative":"latin capital letter i tilde","short":"cap i tilde"},"mathspeak":{"default":"upper I overtilde","brief":"upper I overtilde","sbrief":"upper I overtilde"}}},{"category":"Lu","key":"012A","mappings":{"default":{"default":"latin capital letter i with macron","alternative":"latin capital letter i overbar","short":"cap i overbar"},"mathspeak":{"default":"upper I overbar","brief":"upper I overbar","sbrief":"upper I overbar"}}},{"category":"Lu","key":"012C","mappings":{"default":{"default":"latin capital letter i with breve","alternative":"latin capital letter i breve","short":"cap i breve"},"mathspeak":{"default":"modifying above upper I with breve","brief":"mod above upper I with breve","sbrief":"mod above upper I with breve"}}},{"category":"Lu","key":"012E","mappings":{"default":{"default":"latin capital letter i with ogonek","alternative":"latin capital letter i ogonek","short":"cap i ogonek"},"mathspeak":{"default":"modifying above upper I with ogonek","brief":"mod above upper I with ogonek","sbrief":"mod above upper I with ogonek"}}},{"category":"Lu","key":"0130","mappings":{"default":{"default":"latin capital letter i with dot above","alternative":"latin capital letter i overdot","short":"cap i overdot"},"mathspeak":{"default":"modifying above upper I with dot","brief":"mod above upper I with dot","sbrief":"mod above upper I with dot"}}},{"category":"Lu","key":"0134","mappings":{"default":{"default":"latin capital letter j circumflex","alternative":"latin capital letter j hat","short":"cap j hat"},"mathspeak":{"default":"modifying above upper J with caret","brief":"mod above upper J with caret","sbrief":"mod above upper J with caret"}}},{"category":"Lu","key":"0136","mappings":{"default":{"default":"latin capital letter k with cedilla","alternative":"latin capital letter k cedilla","short":"cap k cedilla"},"mathspeak":{"default":"modifying above upper K with cedilla","brief":"mod above upper K with cedilla","sbrief":"mod above upper K with cedilla"}}},{"category":"Lu","key":"0139","mappings":{"default":{"default":"latin capital letter l with acute","alternative":"latin capital letter l acute","short":"cap l acute"},"mathspeak":{"default":"modifying above upper L with acute","brief":"mod above upper L with acute","sbrief":"mod above upper L with acute"}}},{"category":"Lu","key":"013B","mappings":{"default":{"default":"latin capital letter l with cedilla","alternative":"latin capital letter l cedilla","short":"cap l cedilla"},"mathspeak":{"default":"modifying above upper L with cedilla","brief":"mod above upper L with cedilla","sbrief":"mod above upper L with cedilla"}}},{"category":"Lu","key":"013D","mappings":{"default":{"default":"latin capital letter l with caron","alternative":"latin capital letter l hacek","short":"cap l caron"},"mathspeak":{"default":"modifying above upper L with caron","brief":"mod above upper L with caron","sbrief":"mod above upper L with caron"}}},{"category":"Lu","key":"013F","mappings":{"default":{"default":"latin capital letter l with middle dot","alternative":"latin capital letter l middle dot","short":"cap l middle dot"},"mathspeak":{"default":"modifying above upper L with middle dot","brief":"mod above upper L with middle dot","sbrief":"mod above upper L with middle dot"}}},{"category":"Lu","key":"0143","mappings":{"default":{"default":"latin capital letter n with acute","alternative":"latin capital letter n acute","short":"cap n acute"},"mathspeak":{"default":"modifying above upper N with acute","brief":"mod above upper N with acute","sbrief":"mod above upper N with acute"}}},{"category":"Lu","key":"0145","mappings":{"default":{"default":"latin capital letter n with cedilla","alternative":"latin capital letter n cedilla","short":"cap n cedilla"},"mathspeak":{"default":"modifying above upper N with cedilla","brief":"mod above upper N with cedilla","sbrief":"mod above upper N with cedilla"}}},{"category":"Lu","key":"0147","mappings":{"default":{"default":"latin capital letter n with caron","alternative":"latin capital letter n hacek","short":"cap n caron"},"mathspeak":{"default":"modifying above upper N with caron","brief":"mod above upper N with caron","sbrief":"mod above upper N with caron"}}},{"category":"Lu","key":"014C","mappings":{"default":{"default":"latin capital letter o macron","alternative":"latin capital letter o overbar","short":"cap o overbar"},"mathspeak":{"default":"upper O overbar","brief":"upper O overbar","sbrief":"upper O overbar"}}},{"category":"Lu","key":"014E","mappings":{"default":{"default":"latin capital letter o with breve","alternative":"latin capital letter o breve","short":"cap o breve"},"mathspeak":{"default":"modifying above upper O with breve","brief":"mod above upper O with breve","sbrief":"mod above upper O with breve"}}},{"category":"Lu","key":"0150","mappings":{"default":{"default":"latin capital letter o with double acute","alternative":"latin capital letter o double acute","short":"cap o double acute"},"mathspeak":{"default":"modifying above upper O with double acute","brief":"mod above upper O with double acute","sbrief":"mod above upper O with double acute"}}},{"category":"Lu","key":"0154","mappings":{"default":{"default":"latin capital letter r acute","alternative":"latin capital letter r acute","short":"cap r acute"},"mathspeak":{"default":"modifying above upper R with acute","brief":"mod above upper R with acute","sbrief":"mod above upper R with acute"}}},{"category":"Lu","key":"0156","mappings":{"default":{"default":"latin capital letter r with cedilla","alternative":"latin capital letter r cedilla","short":"cap r cedilla"},"mathspeak":{"default":"modifying above upper R with cedilla","brief":"mod above upper R with cedilla","sbrief":"mod above upper R with cedilla"}}},{"category":"Lu","key":"0158","mappings":{"default":{"default":"latin capital letter r with caron","alternative":"latin capital letter r hacek","short":"cap r caron"},"mathspeak":{"default":"modifying above upper R with caron","brief":"mod above upper R with caron","sbrief":"mod above upper R with caron"}}},{"category":"Lu","key":"015A","mappings":{"default":{"default":"latin capital letter s with acute","alternative":"latin capital letter s acute","short":"cap s acute"},"mathspeak":{"default":"modifying above upper S with acute","brief":"mod above upper S with acute","sbrief":"mod above upper S with acute"}}},{"category":"Lu","key":"015C","mappings":{"default":{"default":"latin capital letter s with circumflex","alternative":"latin capital letter s hat","short":"cap s hat"},"mathspeak":{"default":"modifying above upper S with caret","brief":"mod above upper S with caret","sbrief":"mod above upper S with caret"}}},{"category":"Lu","key":"015E","mappings":{"default":{"default":"latin capital letter s with cedilla","alternative":"latin capital letter s cedilla","short":"cap s cedilla"},"mathspeak":{"default":"modifying above upper S with cedilla","brief":"mod above upper S with cedilla","sbrief":"mod above upper S with cedilla"}}},{"category":"Lu","key":"0160","mappings":{"default":{"default":"latin capital letter s with caron","alternative":"latin capital letter s hacek","short":"cap s caron"},"mathspeak":{"default":"modifying above upper S with caron","brief":"mod above upper S with caron","sbrief":"mod above upper S with caron"}}},{"category":"Lu","key":"0162","mappings":{"default":{"default":"latin capital letter t with cedilla","alternative":"latin capital letter t cedilla","short":"cap t cedilla"},"mathspeak":{"default":"modifying above upper T with cedilla","brief":"mod above upper T with cedilla","sbrief":"mod above upper T with cedilla"}}},{"category":"Lu","key":"0164","mappings":{"default":{"default":"latin capital letter t with caron","alternative":"latin capital letter t hacek","short":"cap t caron"},"mathspeak":{"default":"modifying above upper T with caron","brief":"mod above upper T with caron","sbrief":"mod above upper T with caron"}}},{"category":"Lu","key":"0168","mappings":{"default":{"default":"latin capital letter u with tilde","alternative":"latin capital letter u tilde","short":"cap u tilde"},"mathspeak":{"default":"upper U overtilde","brief":"upper U overtilde","sbrief":"upper U overtilde"}}},{"category":"Lu","key":"016A","mappings":{"default":{"default":"latin capital letter u with macron","alternative":"latin capital letter u overbar","short":"cap u overbar"},"mathspeak":{"default":"upper U overbar","brief":"upper U overbar","sbrief":"upper U overbar"}}},{"category":"Lu","key":"016C","mappings":{"default":{"default":"latin capital letter u with breve","alternative":"latin capital letter u breve","short":"cap u breve"},"mathspeak":{"default":"modifying above upper U with breve","brief":"mod above upper U with breve","sbrief":"mod above upper U with breve"}}},{"category":"Lu","key":"016E","mappings":{"default":{"default":"latin capital letter u with ring above","alternative":"latin capital letter u ring","short":"cap u ring"},"mathspeak":{"default":"modifying above upper U with ring","brief":"mod above upper U with ring","sbrief":"mod above upper U with ring"}}},{"category":"Lu","key":"0170","mappings":{"default":{"default":"latin capital letter u with double acute","alternative":"latin capital letter u double acute","short":"cap u double acute"},"mathspeak":{"default":"modifying above upper U with double acute","brief":"mod above upper U with double acute","sbrief":"mod above upper U with double acute"}}},{"category":"Lu","key":"0172","mappings":{"default":{"default":"latin capital letter u with ogonek","alternative":"latin capital letter u ogonek","short":"cap u ogonek"},"mathspeak":{"default":"modifying above upper U with ogonek","brief":"mod above upper U with ogonek","sbrief":"mod above upper U with ogonek"}}},{"category":"Lu","key":"0174","mappings":{"default":{"default":"latin capital letter w with circumflex","alternative":"latin capital letter w hat","short":"cap w hat"},"mathspeak":{"default":"modifying above upper W with caret","brief":"mod above upper W with caret","sbrief":"mod above upper W with caret"}}},{"category":"Lu","key":"0176","mappings":{"default":{"default":"latin capital letter y with circumflex","alternative":"latin capital letter y hat","short":"cap y hat"},"mathspeak":{"default":"modifying above upper Y with caret","brief":"mod above upper Y with caret","sbrief":"mod above upper Y with caret"}}},{"category":"Lu","key":"0178","mappings":{"default":{"default":"latin capital letter y with diaeresis","alternative":"latin capital letter y double overdot","short":"cap y double overdot"},"mathspeak":{"default":"modifying above upper Y with double dot","brief":"mod above upper Y with double dot","sbrief":"mod above upper Y with double dot"}}},{"category":"Lu","key":"0179","mappings":{"default":{"default":"latin capital letter z with acute","alternative":"latin capital letter z acute","short":"cap z acute"},"mathspeak":{"default":"modifying above upper Z with acute","brief":"mod above upper Z with acute","sbrief":"mod above upper Z with acute"}}},{"category":"Lu","key":"017B","mappings":{"default":{"default":"latin capital letter z with dot above","alternative":"latin capital letter z overdot","short":"cap z overdot"},"mathspeak":{"default":"modifying above upper Z with dot","brief":"mod above upper Z with dot","sbrief":"mod above upper Z with dot"}}},{"category":"Lu","key":"017D","mappings":{"default":{"default":"latin capital letter z with caron","alternative":"latin capital letter z hacek","short":"cap z caron"},"mathspeak":{"default":"modifying above upper Z with caron","brief":"mod above upper Z with caron","sbrief":"mod above upper Z with caron"}}},{"category":"Lu","key":"01CD","mappings":{"default":{"default":"latin capital letter a with caron","alternative":"latin capital letter a hacek","short":"cap a caron"},"mathspeak":{"default":"modifying above upper A with caron","brief":"mod above upper A with caron","sbrief":"mod above upper A with caron"}}},{"category":"Lu","key":"01CF","mappings":{"default":{"default":"latin capital letter i with caron","alternative":"latin capital letter i hacek","short":"cap i caron"},"mathspeak":{"default":"modifying above upper I with caron","brief":"mod above upper I with caron","sbrief":"mod above upper I with caron"}}},{"category":"Lu","key":"01D1","mappings":{"default":{"default":"latin capital letter o with caron","alternative":"latin capital letter o hacek","short":"cap o caron"},"mathspeak":{"default":"modifying above upper O with caron","brief":"mod above upper O with caron","sbrief":"mod above upper O with caron"}}},{"category":"Lu","key":"01D3","mappings":{"default":{"default":"latin capital letter u with caron","alternative":"latin capital letter u hacek","short":"cap u caron"},"mathspeak":{"default":"modifying above upper U with caron","brief":"mod above upper U with caron","sbrief":"mod above upper U with caron"}}},{"category":"Lu","key":"01E6","mappings":{"default":{"default":"latin capital letter g with caron","alternative":"latin capital letter g hacek","short":"cap g caron"},"mathspeak":{"default":"modifying above upper G with caron","brief":"mod above upper G with caron","sbrief":"mod above upper G with caron"}}},{"category":"Lu","key":"01E8","mappings":{"default":{"default":"latin capital letter k with caron","alternative":"latin capital letter k hacek","short":"cap k caron"},"mathspeak":{"default":"modifying above upper K with caron","brief":"mod above upper K with caron","sbrief":"mod above upper K with caron"}}},{"category":"Lu","key":"01EA","mappings":{"default":{"default":"latin capital letter o with ogonek","alternative":"latin capital letter o ogonek","short":"cap o ogonek"},"mathspeak":{"default":"modifying above upper O with ogonek","brief":"mod above upper O with ogonek","sbrief":"mod above upper O with ogonek"}}},{"category":"Lu","key":"01F4","mappings":{"default":{"default":"latin capital letter g with acute","alternative":"latin capital letter g acute","short":"cap g acute"},"mathspeak":{"default":"modifying above upper G with acute","brief":"mod above upper G with acute","sbrief":"mod above upper G with acute"}}},{"category":"Lu","key":"01F8","mappings":{"default":{"default":"latin capital letter n with grave","alternative":"latin capital letter n grave","short":"cap n grave"},"mathspeak":{"default":"modifying above upper N with grave","brief":"mod above upper N with grave","sbrief":"mod above upper N with grave"}}},{"category":"Lu","key":"0200","mappings":{"default":{"default":"latin capital letter a with double grave","alternative":"latin capital letter a double grave","short":"cap a double grave"},"mathspeak":{"default":"modifying above upper A with double grave","brief":"mod above upper A with double grave","sbrief":"mod above upper A with double grave"}}},{"category":"Lu","key":"0202","mappings":{"default":{"default":"latin capital letter a with inverted breve","alternative":"latin capital letter a inverted breve","short":"cap a inverted breve"},"mathspeak":{"default":"modifying above upper A with inverted breve","brief":"mod above upper A with inverted breve","sbrief":"mod above upper A with inverted breve"}}},{"category":"Lu","key":"0204","mappings":{"default":{"default":"latin capital letter e with double grave","alternative":"latin capital letter e double grave","short":"cap e double grave"},"mathspeak":{"default":"modifying above upper E with double grave","brief":"mod above upper E with double grave","sbrief":"mod above upper E with double grave"}}},{"category":"Lu","key":"0206","mappings":{"default":{"default":"latin capital letter e with inverted breve","alternative":"latin capital letter e inverted breve","short":"cap e inverted breve"},"mathspeak":{"default":"modifying above upper E with inverted breve","brief":"mod above upper E with inverted breve","sbrief":"mod above upper E with inverted breve"}}},{"category":"Lu","key":"0208","mappings":{"default":{"default":"latin capital letter i with double grave","alternative":"latin capital letter i double grave","short":"cap i double grave"},"mathspeak":{"default":"modifying above upper I with double grave","brief":"mod above upper I with double grave","sbrief":"mod above upper I with double grave"}}},{"category":"Lu","key":"020A","mappings":{"default":{"default":"latin capital letter i with inverted breve","alternative":"latin capital letter i inverted breve","short":"cap i inverted breve"},"mathspeak":{"default":"modifying above upper I with inverted breve","brief":"mod above upper I with inverted breve","sbrief":"mod above upper I with inverted breve"}}},{"category":"Lu","key":"020C","mappings":{"default":{"default":"latin capital letter o with double grave","alternative":"latin capital letter o double grave","short":"cap o double grave"},"mathspeak":{"default":"modifying above upper O with double grave","brief":"mod above upper O with double grave","sbrief":"mod above upper O with double grave"}}},{"category":"Lu","key":"020E","mappings":{"default":{"default":"latin capital letter o with inverted breve","alternative":"latin capital letter o inverted breve","short":"cap o inverted breve"},"mathspeak":{"default":"modifying above upper O with inverted breve","brief":"mod above upper O with inverted breve","sbrief":"mod above upper O with inverted breve"}}},{"category":"Lu","key":"0210","mappings":{"default":{"default":"latin capital letter r with double grave","alternative":"latin capital letter r double grave","short":"cap r double grave"},"mathspeak":{"default":"modifying above upper R with double grave","brief":"mod above upper R with double grave","sbrief":"mod above upper R with double grave"}}},{"category":"Lu","key":"0212","mappings":{"default":{"default":"latin capital letter r with inverted breve","alternative":"latin capital letter r inverted breve","short":"cap r inverted breve"},"mathspeak":{"default":"modifying above upper R with inverted breve","brief":"mod above upper R with inverted breve","sbrief":"mod above upper R with inverted breve"}}},{"category":"Lu","key":"0214","mappings":{"default":{"default":"latin capital letter u with double grave","alternative":"latin capital letter u double grave","short":"cap u double grave"},"mathspeak":{"default":"modifying above upper U with double grave","brief":"mod above upper U with double grave","sbrief":"mod above upper U with double grave"}}},{"category":"Lu","key":"0216","mappings":{"default":{"default":"latin capital letter u with inverted breve","alternative":"latin capital letter u inverted breve","short":"cap u inverted breve"},"mathspeak":{"default":"modifying above upper U with inverted breve","brief":"mod above upper U with inverted breve","sbrief":"mod above upper U with inverted breve"}}},{"category":"Lu","key":"0218","mappings":{"default":{"default":"latin capital letter s with comma below","alternative":"latin capital letter s comma below","short":"cap s comma below"},"mathspeak":{"default":"modifying below upper S with comma below","brief":"mod below upper S with comma below","sbrief":"mod below upper S with comma below"}}},{"category":"Lu","key":"021A","mappings":{"default":{"default":"latin capital letter t with comma below","alternative":"latin capital letter t comma below","short":"cap t comma below"},"mathspeak":{"default":"modifying below upper T with comma below","brief":"mod below upper T with comma below","sbrief":"mod below upper T with comma below"}}},{"category":"Lu","key":"021E","mappings":{"default":{"default":"latin capital letter h caron","short":"cap h caron"},"mathspeak":{"default":"modifying above upper H with caron","brief":"mod above upper H with caron","sbrief":"mod above upper H with caron"}}},{"category":"Lu","key":"0226","mappings":{"default":{"default":"latin capital letter a with dot above","alternative":"latin capital letter a overdot","short":"cap a overdot"},"mathspeak":{"default":"modifying above upper A with dot","brief":"mod above upper A with dot","sbrief":"mod above upper A with dot"}}},{"category":"Lu","key":"0228","mappings":{"default":{"default":"latin capital letter e with cedilla","alternative":"latin capital letter e cedilla","short":"cap e cedilla"},"mathspeak":{"default":"modifying above upper E with cedilla","brief":"mod above upper E with cedilla","sbrief":"mod above upper E with cedilla"}}},{"category":"Lu","key":"022E","mappings":{"default":{"default":"latin capital letter o with dot above","alternative":"latin capital letter o overdot","short":"cap o overdot"},"mathspeak":{"default":"modifying above upper O with dot","brief":"mod above upper O with dot","sbrief":"mod above upper O with dot"}}},{"category":"Lu","key":"0232","mappings":{"default":{"default":"latin capital letter y with macron","alternative":"latin capital letter y overbar","short":"cap y overbar"},"mathspeak":{"default":"upper Y overbar","brief":"upper Y overbar","sbrief":"upper Y overbar"}}},{"category":"Lu","key":"1E00","mappings":{"default":{"default":"latin capital letter a with ring below","alternative":"latin capital letter a ring below","short":"cap a ring below"},"mathspeak":{"default":"modifying below upper A with ring below","brief":"mod below upper A with ring below","sbrief":"mod below upper A with ring below"}}},{"category":"Lu","key":"1E02","mappings":{"default":{"default":"latin capital letter b with dot above","alternative":"latin capital letter b overdot","short":"cap b overdot"},"mathspeak":{"default":"modifying above upper B with dot","brief":"mod above upper B with dot","sbrief":"mod above upper B with dot"}}},{"category":"Lu","key":"1E04","mappings":{"default":{"default":"latin capital letter b with dot below","alternative":"latin capital letter b underdot","short":"cap b underdot"},"mathspeak":{"default":"modifying below upper B with dot","brief":"mod below upper B with dot","sbrief":"mod below upper B with dot"}}},{"category":"Lu","key":"1E06","mappings":{"default":{"default":"latin capital letter b with line below","alternative":"latin capital letter b underbar","short":"cap b underbar"},"mathspeak":{"default":"upper B underbar","brief":"upper B underbar","sbrief":"upper B underbar"}}},{"category":"Lu","key":"1E0A","mappings":{"default":{"default":"latin capital letter d with dot above","alternative":"latin capital letter d overdot","short":"cap d overdot"},"mathspeak":{"default":"modifying above upper D with dot","brief":"mod above upper D with dot","sbrief":"mod above upper D with dot"}}},{"category":"Lu","key":"1E0C","mappings":{"default":{"default":"latin capital letter d with dot below","alternative":"latin capital letter d underdot","short":"cap d underdot"},"mathspeak":{"default":"modifying below upper D with dot","brief":"mod below upper D with dot","sbrief":"mod below upper D with dot"}}},{"category":"Lu","key":"1E0E","mappings":{"default":{"default":"latin capital letter d with line below","alternative":"latin capital letter d underbar","short":"cap d underbar"},"mathspeak":{"default":"upper D underbar","brief":"upper D underbar","sbrief":"upper D underbar"}}},{"category":"Lu","key":"1E10","mappings":{"default":{"default":"latin capital letter d with cedilla","alternative":"latin capital letter d cedilla","short":"cap d cedilla"},"mathspeak":{"default":"modifying above upper D with cedilla","brief":"mod above upper D with cedilla","sbrief":"mod above upper D with cedilla"}}},{"category":"Lu","key":"1E12","mappings":{"default":{"default":"latin capital letter d with circumflex below","alternative":"latin capital letter d underhat","short":"cap d underhat"},"mathspeak":{"default":"modifying below upper D with caret","brief":"mod below upper D with caret","sbrief":"mod below upper D with caret"}}},{"category":"Lu","key":"1E18","mappings":{"default":{"default":"latin capital letter e with circumflex below","alternative":"latin capital letter e underhat","short":"cap e underhat"},"mathspeak":{"default":"modifying below upper E with caret","brief":"mod below upper E with caret","sbrief":"mod below upper E with caret"}}},{"category":"Lu","key":"1E1A","mappings":{"default":{"default":"latin capital letter e with tilde below","alternative":"latin capital letter e tilde below","short":"cap e tilde below"},"mathspeak":{"default":"upper E undertilde","brief":"upper E undertilde","sbrief":"upper E undertilde"}}},{"category":"Lu","key":"1E1E","mappings":{"default":{"default":"latin capital letter f with dot above","alternative":"latin capital letter f overdot","short":"cap f overdot"},"mathspeak":{"default":"modifying above upper F with dot","brief":"mod above upper F with dot","sbrief":"mod above upper F with dot"}}},{"category":"Lu","key":"1E20","mappings":{"default":{"default":"latin capital letter g with macron","alternative":"latin capital letter g overbar","short":"cap g overbar"},"mathspeak":{"default":"upper G overbar","brief":"upper G overbar","sbrief":"upper G overbar"}}},{"category":"Lu","key":"1E22","mappings":{"default":{"default":"latin capital letter h with dot above","alternative":"latin capital letter h overdot","short":"cap h overdot"},"mathspeak":{"default":"modifying above upper H with dot","brief":"mod above upper H with dot","sbrief":"mod above upper H with dot"}}},{"category":"Lu","key":"1E24","mappings":{"default":{"default":"latin capital letter h with dot below","alternative":"latin capital letter h underdot","short":"cap h underdot"},"mathspeak":{"default":"modifying below upper H with dot","brief":"mod below upper H with dot","sbrief":"mod below upper H with dot"}}},{"category":"Lu","key":"1E26","mappings":{"default":{"default":"latin capital letter h with diaeresis","alternative":"latin capital letter h double overdot","short":"cap h double overdot"},"mathspeak":{"default":"modifying above upper H with double dot","brief":"mod above upper H with double dot","sbrief":"mod above upper H with double dot"}}},{"category":"Lu","key":"1E28","mappings":{"default":{"default":"latin capital letter h with cedilla","alternative":"latin capital letter h cedilla","short":"cap h cedilla"},"mathspeak":{"default":"modifying above upper H with cedilla","brief":"mod above upper H with cedilla","sbrief":"mod above upper H with cedilla"}}},{"category":"Lu","key":"1E2A","mappings":{"default":{"default":"latin capital letter h with breve below","alternative":"latin capital letter h breve below","short":"cap h breve below"},"mathspeak":{"default":"modifying below upper H with breve below","brief":"mod below upper H with breve below","sbrief":"mod below upper H with breve below"}}},{"category":"Lu","key":"1E2C","mappings":{"default":{"default":"latin capital letter i with tilde below","alternative":"latin capital letter i tilde below","short":"cap i tilde below"},"mathspeak":{"default":"upper I undertilde","brief":"upper I undertilde","sbrief":"upper I undertilde"}}},{"category":"Lu","key":"1E30","mappings":{"default":{"default":"latin capital letter k with acute","alternative":"latin capital letter k acute","short":"cap k acute"},"mathspeak":{"default":"modifying above upper K with acute","brief":"mod above upper K with acute","sbrief":"mod above upper K with acute"}}},{"category":"Lu","key":"1E32","mappings":{"default":{"default":"latin capital letter k with dot below","alternative":"latin capital letter k underdot","short":"cap k underdot"},"mathspeak":{"default":"modifying below upper K with dot","brief":"mod below upper K with dot","sbrief":"mod below upper K with dot"}}},{"category":"Lu","key":"1E34","mappings":{"default":{"default":"latin capital letter k with line below","alternative":"latin capital letter k underbar","short":"cap k underbar"},"mathspeak":{"default":"upper K underbar","brief":"upper K underbar","sbrief":"upper K underbar"}}},{"category":"Lu","key":"1E36","mappings":{"default":{"default":"latin capital letter l with dot below","alternative":"latin capital letter l underdot","short":"cap l underdot"},"mathspeak":{"default":"modifying below upper L with dot","brief":"mod below upper L with dot","sbrief":"mod below upper L with dot"}}},{"category":"Lu","key":"1E3A","mappings":{"default":{"default":"latin capital letter l with line below","alternative":"latin capital letter l underbar","short":"cap l underbar"},"mathspeak":{"default":"upper L underbar","brief":"upper L underbar","sbrief":"upper L underbar"}}},{"category":"Lu","key":"1E3C","mappings":{"default":{"default":"latin capital letter l with circumflex below","alternative":"latin capital letter l underhat","short":"cap l underhat"},"mathspeak":{"default":"modifying below upper L with caret","brief":"mod below upper L with caret","sbrief":"mod below upper L with caret"}}},{"category":"Lu","key":"1E3E","mappings":{"default":{"default":"latin capital letter m with acute","alternative":"latin capital letter m acute","short":"cap m acute"},"mathspeak":{"default":"modifying above upper M with acute","brief":"mod above upper M with acute","sbrief":"mod above upper M with acute"}}},{"category":"Lu","key":"1E40","mappings":{"default":{"default":"latin capital letter m with dot above","alternative":"latin capital letter m overdot","short":"cap m overdot"},"mathspeak":{"default":"modifying above upper M with dot","brief":"mod above upper M with dot","sbrief":"mod above upper M with dot"}}},{"category":"Lu","key":"1E42","mappings":{"default":{"default":"latin capital letter m with dot below","alternative":"latin capital letter m underdot","short":"cap m underdot"},"mathspeak":{"default":"modifying below upper M with dot","brief":"mod below upper M with dot","sbrief":"mod below upper M with dot"}}},{"category":"Lu","key":"1E44","mappings":{"default":{"default":"latin capital letter n with dot above","alternative":"latin capital letter n overdot","short":"cap n overdot"},"mathspeak":{"default":"modifying above upper N with dot","brief":"mod above upper N with dot","sbrief":"mod above upper N with dot"}}},{"category":"Lu","key":"1E46","mappings":{"default":{"default":"latin capital letter n with dot below","alternative":"latin capital letter n underdot","short":"cap n underdot"},"mathspeak":{"default":"modifying below upper N with dot","brief":"mod below upper N with dot","sbrief":"mod below upper N with dot"}}},{"category":"Lu","key":"1E48","mappings":{"default":{"default":"latin capital letter n with line below","alternative":"latin capital letter n underbar","short":"cap n underbar"},"mathspeak":{"default":"upper N underbar","brief":"upper N underbar","sbrief":"upper N underbar"}}},{"category":"Lu","key":"1E4A","mappings":{"default":{"default":"latin capital letter n with circumflex below","alternative":"latin capital letter n underhat","short":"cap n underhat"},"mathspeak":{"default":"modifying below upper N with caret","brief":"mod below upper N with caret","sbrief":"mod below upper N with caret"}}},{"category":"Lu","key":"1E54","mappings":{"default":{"default":"latin capital letter p with acute","alternative":"latin capital letter p acute","short":"cap p acute"},"mathspeak":{"default":"modifying above upper P with acute","brief":"mod above upper P with acute","sbrief":"mod above upper P with acute"}}},{"category":"Lu","key":"1E56","mappings":{"default":{"default":"latin capital letter p with dot above","alternative":"latin capital letter p overdot","short":"cap p overdot"},"mathspeak":{"default":"modifying above upper P with dot","brief":"mod above upper P with dot","sbrief":"mod above upper P with dot"}}},{"category":"Lu","key":"1E58","mappings":{"default":{"default":"latin capital letter r with dot above","alternative":"latin capital letter r overdot","short":"cap r overdot"},"mathspeak":{"default":"modifying above upper R with dot","brief":"mod above upper R with dot","sbrief":"mod above upper R with dot"}}},{"category":"Lu","key":"1E5A","mappings":{"default":{"default":"latin capital letter r with dot below","alternative":"latin capital letter r underdot","short":"cap r underdot"},"mathspeak":{"default":"modifying below upper R with dot","brief":"mod below upper R with dot","sbrief":"mod below upper R with dot"}}},{"category":"Lu","key":"1E5E","mappings":{"default":{"default":"latin capital letter r with line below","alternative":"latin capital letter r underbar","short":"cap r underbar"},"mathspeak":{"default":"upper R underbar","brief":"upper R underbar","sbrief":"upper R underbar"}}},{"category":"Lu","key":"1E60","mappings":{"default":{"default":"latin capital letter s with dot above","alternative":"latin capital letter s overdot","short":"cap s overdot"},"mathspeak":{"default":"modifying above upper S with dot","brief":"mod above upper S with dot","sbrief":"mod above upper S with dot"}}},{"category":"Lu","key":"1E62","mappings":{"default":{"default":"latin capital letter s with dot below","alternative":"latin capital letter s underdot","short":"cap s underdot"},"mathspeak":{"default":"modifying below upper S with dot","brief":"mod below upper S with dot","sbrief":"mod below upper S with dot"}}},{"category":"Lu","key":"1E6A","mappings":{"default":{"default":"latin capital letter t with dot above","alternative":"latin capital letter t overdot","short":"cap t overdot"},"mathspeak":{"default":"modifying above upper T with dot","brief":"mod above upper T with dot","sbrief":"mod above upper T with dot"}}},{"category":"Lu","key":"1E6C","mappings":{"default":{"default":"latin capital letter t with dot below","alternative":"latin capital letter t underdot","short":"cap t underdot"},"mathspeak":{"default":"modifying below upper T with dot","brief":"mod below upper T with dot","sbrief":"mod below upper T with dot"}}},{"category":"Lu","key":"1E6E","mappings":{"default":{"default":"latin capital letter t with line below","alternative":"latin capital letter t underbar","short":"cap t underbar"},"mathspeak":{"default":"upper T underbar","brief":"upper T underbar","sbrief":"upper T underbar"}}},{"category":"Lu","key":"1E70","mappings":{"default":{"default":"latin capital letter t with circumflex below","alternative":"latin capital letter t underhat","short":"cap t underhat"},"mathspeak":{"default":"modifying below upper T with caret","brief":"mod below upper T with caret","sbrief":"mod below upper T with caret"}}},{"category":"Lu","key":"1E72","mappings":{"default":{"default":"latin capital letter u with diaeresis below","alternative":"latin capital letter u double underdot","short":"cap u double underdot"},"mathspeak":{"default":"modifying below upper U with double dot","brief":"mod below upper U with double dot","sbrief":"mod below upper U with double dot"}}},{"category":"Lu","key":"1E74","mappings":{"default":{"default":"latin capital letter u with tilde below","alternative":"latin capital letter u tilde below","short":"cap u tilde below"},"mathspeak":{"default":"upper U undertilde","brief":"upper U undertilde","sbrief":"upper U undertilde"}}},{"category":"Lu","key":"1E76","mappings":{"default":{"default":"latin capital letter u with circumflex below","alternative":"latin capital letter u underhat","short":"cap u underhat"},"mathspeak":{"default":"modifying below upper U with caret","brief":"mod below upper U with caret","sbrief":"mod below upper U with caret"}}},{"category":"Lu","key":"1E7C","mappings":{"default":{"default":"latin capital letter v with tilde","alternative":"latin capital letter v tilde","short":"cap v tilde"},"mathspeak":{"default":"upper V overtilde","brief":"upper V overtilde","sbrief":"upper V overtilde"}}},{"category":"Lu","key":"1E7E","mappings":{"default":{"default":"latin capital letter v with dot below","alternative":"latin capital letter v underdot","short":"cap v underdot"},"mathspeak":{"default":"modifying below upper V with dot","brief":"mod below upper V with dot","sbrief":"mod below upper V with dot"}}},{"category":"Lu","key":"1E80","mappings":{"default":{"default":"latin capital letter w with grave","alternative":"latin capital letter w grave","short":"cap w grave"},"mathspeak":{"default":"modifying above upper W with grave","brief":"mod above upper W with grave","sbrief":"mod above upper W with grave"}}},{"category":"Lu","key":"1E82","mappings":{"default":{"default":"latin capital letter w with acute","alternative":"latin capital letter w acute","short":"cap w acute"},"mathspeak":{"default":"modifying above upper W with acute","brief":"mod above upper W with acute","sbrief":"mod above upper W with acute"}}},{"category":"Lu","key":"1E84","mappings":{"default":{"default":"latin capital letter w with diaeresis","alternative":"latin capital letter w double overdot","short":"cap w double overdot"},"mathspeak":{"default":"modifying above upper W with double dot","brief":"mod above upper W with double dot","sbrief":"mod above upper W with double dot"}}},{"category":"Lu","key":"1E86","mappings":{"default":{"default":"latin capital letter w with dot above","alternative":"latin capital letter w overdot","short":"cap w overdot"},"mathspeak":{"default":"modifying above upper W with dot","brief":"mod above upper W with dot","sbrief":"mod above upper W with dot"}}},{"category":"Lu","key":"1E88","mappings":{"default":{"default":"latin capital letter w with dot below","alternative":"latin capital letter w underdot","short":"cap w underdot"},"mathspeak":{"default":"modifying below upper W with dot","brief":"mod below upper W with dot","sbrief":"mod below upper W with dot"}}},{"category":"Lu","key":"1E8A","mappings":{"default":{"default":"latin capital letter x with dot above","alternative":"latin capital letter x overdot","short":"cap x overdot"},"mathspeak":{"default":"modifying above upper X with dot","brief":"mod above upper X with dot","sbrief":"mod above upper X with dot"}}},{"category":"Lu","key":"1E8C","mappings":{"default":{"default":"latin capital letter x with diaeresis","alternative":"latin capital letter x double overdot","short":"cap x double overdot"},"mathspeak":{"default":"modifying above upper X with double dot","brief":"mod above upper X with double dot","sbrief":"mod above upper X with double dot"}}},{"category":"Lu","key":"1E8E","mappings":{"default":{"default":"latin capital letter y with dot above","alternative":"latin capital letter y overdot","short":"cap y overdot"},"mathspeak":{"default":"modifying above upper Y with dot","brief":"mod above upper Y with dot","sbrief":"mod above upper Y with dot"}}},{"category":"Lu","key":"1E90","mappings":{"default":{"default":"latin capital letter z with circumflex","alternative":"latin capital letter z circumflex","short":"cap z circumflex"},"mathspeak":{"default":"modifying above upper Z with circumflex","brief":"mod above upper Z with circumflex","sbrief":"mod above upper Z with circumflex"}}},{"category":"Lu","key":"1E92","mappings":{"default":{"default":"latin capital letter z with dot below","alternative":"latin capital letter z underdot","short":"cap z underdot"},"mathspeak":{"default":"modifying below upper Z with dot","brief":"mod below upper Z with dot","sbrief":"mod below upper Z with dot"}}},{"category":"Lu","key":"1E94","mappings":{"default":{"default":"latin capital letter z with line below","alternative":"latin capital letter z underbar","short":"cap z underbar"},"mathspeak":{"default":"upper Z underbar","brief":"upper Z underbar","sbrief":"upper Z underbar"}}},{"category":"Lu","key":"1EA0","mappings":{"default":{"default":"latin capital letter with a dot below","alternative":"latin capital letter with a underdot","short":"cap a underdot"},"mathspeak":{"default":"modifying below upper A with dot","brief":"mod below upper A with dot","sbrief":"mod below upper A with dot"}}},{"category":"Lu","key":"1EA2","mappings":{"default":{"default":"latin capital letter a with hook above","alternative":"latin capital letter a hook","short":"cap a hook"},"mathspeak":{"default":"modifying above upper A with hook","brief":"mod above upper A with hook","sbrief":"mod above upper A with hook"}}},{"category":"Lu","key":"1EB8","mappings":{"default":{"default":"latin capital letter e with dot below","alternative":"latin capital letter e underdot","short":"cap e underdot"},"mathspeak":{"default":"modifying below upper E with dot","brief":"mod below upper E with dot","sbrief":"mod below upper E with dot"}}},{"category":"Lu","key":"1EBA","mappings":{"default":{"default":"latin capital letter e with hook above","alternative":"latin capital letter e hook","short":"cap e hook"},"mathspeak":{"default":"modifying above upper E with hook","brief":"mod above upper E with hook","sbrief":"mod above upper E with hook"}}},{"category":"Lu","key":"1EBC","mappings":{"default":{"default":"latin capital letter e with tilde","alternative":"latin capital letter e tilde","short":"cap e tilde"},"mathspeak":{"default":"upper E overtilde","brief":"upper E overtilde","sbrief":"upper E overtilde"}}},{"category":"Lu","key":"1EC8","mappings":{"default":{"default":"latin capital letter i with hook above","alternative":"latin capital letter i hook","short":"cap i hook"},"mathspeak":{"default":"modifying above upper I with hook","brief":"mod above upper I with hook","sbrief":"mod above upper I with hook"}}},{"category":"Lu","key":"1ECA","mappings":{"default":{"default":"latin capital letter i with dot below","alternative":"latin capital letter i underdot","short":"cap i underdot"},"mathspeak":{"default":"modifying below upper I with dot","brief":"mod below upper I with dot","sbrief":"mod below upper I with dot"}}},{"category":"Lu","key":"1ECC","mappings":{"default":{"default":"latin capital letter o with dot below","alternative":"latin capital letter o underdot","short":"cap o underdot"},"mathspeak":{"default":"modifying below upper O with dot","brief":"mod below upper O with dot","sbrief":"mod below upper O with dot"}}},{"category":"Lu","key":"1ECE","mappings":{"default":{"default":"latin capital letter o with hook above","alternative":"latin capital letter o hook","short":"cap o hook"},"mathspeak":{"default":"modifying above upper O with hook","brief":"mod above upper O with hook","sbrief":"mod above upper O with hook"}}},{"category":"Lu","key":"1EE4","mappings":{"default":{"default":"latin capital letter u with dot below","alternative":"latin capital letter u underdot","short":"cap u underdot"},"mathspeak":{"default":"modifying below upper U with dot","brief":"mod below upper U with dot","sbrief":"mod below upper U with dot"}}},{"category":"Lu","key":"1EE6","mappings":{"default":{"default":"latin capital letter u with hook above","alternative":"latin capital letter u hook","short":"cap u hook"},"mathspeak":{"default":"modifying above upper U with hook","brief":"mod above upper U with hook","sbrief":"mod above upper U with hook"}}},{"category":"Lu","key":"1EF2","mappings":{"default":{"default":"latin capital letter y with grave","alternative":"latin capital letter y grave","short":"cap y grave"},"mathspeak":{"default":"modifying above upper Y with grave","brief":"mod above upper Y with grave","sbrief":"mod above upper Y with grave"}}},{"category":"Lu","key":"1EF4","mappings":{"default":{"default":"latin capital letter y with dot below","alternative":"latin capital letter y underdot","short":"cap y underdot"},"mathspeak":{"default":"modifying below upper Y with dot","brief":"mod below upper Y with dot","sbrief":"mod below upper Y with dot"}}},{"category":"Lu","key":"1EF6","mappings":{"default":{"default":"latin capital letter y with hook above","alternative":"latin capital letter y hook","short":"cap y hook"},"mathspeak":{"default":"modifying above upper Y with hook","brief":"mod above upper Y with hook","sbrief":"mod above upper Y with hook"}}},{"category":"Lu","key":"1EF8","mappings":{"default":{"default":"latin capital letter y with tilde","alternative":"latin capital letter y tilde","short":"cap y tilde"},"mathspeak":{"default":"upper Y overtilde","brief":"upper Y overtilde","sbrief":"upper Y overtilde"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_angles.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_angles.js
deleted file mode 100644
index 047454fe..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_angles.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Sm","mappings":{"default":{"default":"right angle with arc"}},"key":"22BE"},{"category":"Sm","mappings":{"default":{"default":"right angle with downwards zigzag arrow"}},"key":"237C"},{"category":"Sm","mappings":{"default":{"default":"three dimensional angle"}},"key":"27C0"},{"category":"Sm","mappings":{"default":{"default":"measured angle opening left"}},"key":"299B"},{"category":"Sm","mappings":{"default":{"default":"right angle variant with square"}},"key":"299C"},{"category":"Sm","mappings":{"default":{"default":"measured right angle with dot"}},"key":"299D"},{"category":"Sm","mappings":{"default":{"default":"angle with s inside"}},"key":"299E"},{"category":"Sm","mappings":{"default":{"default":"acute angle"}},"key":"299F"},{"category":"Sm","mappings":{"default":{"default":"spherical angle opening left"}},"key":"29A0"},{"category":"Sm","mappings":{"default":{"default":"spherical angle opening up"}},"key":"29A1"},{"category":"Sm","mappings":{"default":{"default":"turned angle"}},"key":"29A2"},{"category":"Sm","mappings":{"default":{"default":"reversed angle"}},"key":"29A3"},{"category":"Sm","mappings":{"default":{"default":"angle with underbar"}},"key":"29A4"},{"category":"Sm","mappings":{"default":{"default":"reversed angle with underbar"}},"key":"29A5"},{"category":"Sm","mappings":{"default":{"default":"oblique angle opening up"}},"key":"29A6"},{"category":"Sm","mappings":{"default":{"default":"oblique angle opening down"}},"key":"29A7"},{"category":"Sm","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing up and right"}},"key":"29A8"},{"category":"Sm","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing up and left"}},"key":"29A9"},{"category":"Sm","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing down and right"}},"key":"29AA"},{"category":"Sm","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing down and left"}},"key":"29AB"},{"category":"Sm","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing right and up"}},"key":"29AC"},{"category":"Sm","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing left and up"}},"key":"29AD"},{"category":"Sm","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing right and down"}},"key":"29AE"},{"category":"Sm","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing left and down"}},"key":"29AF"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_arrows.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_arrows.js
deleted file mode 100644
index 4199c960..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_arrows.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow","short":"left arrow"},"mathspeak":{"default":"left-arrow","sbrief":"L arrow"}},"key":"2190"},{"category":"Sm","mappings":{"default":{"default":"upwards arrow","short":"up arrow"},"mathspeak":{"default":"up-arrow","sbrief":"U arrow"}},"key":"2191"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow","short":"right arrow"},"mathspeak":{"default":"right-arrow","sbrief":"R arrow"}},"key":"2192"},{"category":"Sm","mappings":{"default":{"default":"downwards arrow","short":"down arrow"},"mathspeak":{"default":"down-arrow","sbrief":"D arrow"}},"key":"2193"},{"category":"Sm","mappings":{"default":{"default":"left right arrow"},"mathspeak":{"default":"left-right-arrow","sbrief":"L R arrow"}},"key":"2194"},{"category":"So","mappings":{"default":{"default":"up down arrow"},"mathspeak":{"default":"up down-arrow","sbrief":"U D arrow"}},"key":"2195"},{"category":"So","mappings":{"default":{"default":"north west arrow","short":"up left arrow"},"mathspeak":{"default":"up left-arrow","sbrief":"U L arrow"}},"key":"2196"},{"category":"So","mappings":{"default":{"default":"north east arrow","short":"up right arrow"},"mathspeak":{"default":"up right-arrow","sbrief":"U R arrow"}},"key":"2197"},{"category":"So","mappings":{"default":{"default":"south east arrow","short":"down right arrow"},"mathspeak":{"default":"down right-arrow","sbrief":"D R arrow"}},"key":"2198"},{"category":"So","mappings":{"default":{"default":"south west arrow","short":"down left arrow"},"mathspeak":{"default":"down left-arrow","sbrief":"D L arrow"}},"key":"2199"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow with stroke","short":"left arrow with stroke"},"mathspeak":{"default":"left-arrow with stroke","sbrief":"L arrow with stroke"}},"key":"219A"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow with stroke","short":"right arrow with stroke"},"mathspeak":{"default":"right-arrow with stroke","sbrief":"R arrow with stroke"}},"key":"219B"},{"category":"So","mappings":{"default":{"default":"leftwards wave arrow","short":"left wave arrow"},"mathspeak":{"sbrief":"L wave arrow"}},"key":"219C"},{"category":"So","mappings":{"default":{"default":"rightwards wave arrow","short":"right wave arrow"},"mathspeak":{"sbrief":"R wave arrow"}},"key":"219D"},{"category":"So","mappings":{"default":{"default":"leftwards two headed arrow","alternative":"left two headed arrow","short":"two headed left arrow"},"mathspeak":{"default":"two headed left-arrow","sbrief":"two headed L arrow"}},"key":"219E"},{"category":"So","mappings":{"default":{"default":"upwards two headed arrow","alternative":"up two headed arrow","short":"two headed up arrow"},"mathspeak":{"default":"two headed up-arrow","sbrief":"two headed U arrow"}},"key":"219F"},{"category":"Sm","mappings":{"default":{"default":"rightwards two headed arrow","alternative":"right two headed arrow","short":"two headed right arrow"},"mathspeak":{"default":"two headed right-arrow","sbrief":"two headed R arrow"}},"key":"21A0"},{"category":"So","mappings":{"default":{"default":"downwards two headed arrow","alternative":"down two headed arrow","short":"two headed down arrow"},"mathspeak":{"default":"two headed down-arrow","sbrief":"two headed D arrow"}},"key":"21A1"},{"category":"So","mappings":{"default":{"default":"leftwards arrow with tail","short":"left arrow with tail"},"mathspeak":{"default":"left-arrow with tail","sbrief":"L arrow with tail"}},"key":"21A2"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow with tail","short":"right arrow with tail"},"mathspeak":{"default":"right-arrow with tail","sbrief":"R arrow with tail"}},"key":"21A3"},{"category":"So","mappings":{"default":{"default":"leftwards arrow from bar","short":"left arrow from bar"},"mathspeak":{"default":"left-arrow from bar","sbrief":"L arrow from bar"}},"key":"21A4"},{"category":"So","mappings":{"default":{"default":"upwards arrow from bar","short":"up arrow from bar"},"mathspeak":{"default":"up-arrow from bar","sbrief":"U arrow from bar"}},"key":"21A5"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow from bar","short":"right arrow from bar"},"mathspeak":{"default":"right-arrow from bar","sbrief":"R arrow from bar"}},"key":"21A6"},{"category":"So","mappings":{"default":{"default":"downwards arrow from bar","short":"down arrow from bar"},"mathspeak":{"default":"down-arrow from bar","sbrief":"D arrow from bar"}},"key":"21A7"},{"category":"So","mappings":{"default":{"default":"up down arrow with base"},"mathspeak":{"default":"up down-arrow with base","sbrief":"U D arrow with base"}},"key":"21A8"},{"category":"So","mappings":{"default":{"default":"leftwards arrow with hook","short":"left arrow with hook"},"mathspeak":{"default":"left-arrow with hook","sbrief":"L arrow with hook"}},"key":"21A9"},{"category":"So","mappings":{"default":{"default":"rightwards arrow with hook","short":"right arrow with hook"},"mathspeak":{"default":"right-arrow with hook","sbrief":"R arrow with hook"}},"key":"21AA"},{"category":"So","mappings":{"default":{"default":"leftwards arrow with loop","short":"left arrow with loop"},"mathspeak":{"default":"left-arrow with loop","sbrief":"L arrow with loop"}},"key":"21AB"},{"category":"So","mappings":{"default":{"default":"rightwards arrow with loop","short":"right arrow with loop"},"mathspeak":{"default":"right-arrow with loop","sbrief":"R arrow with loop"}},"key":"21AC"},{"category":"So","mappings":{"default":{"default":"left right wave arrow"},"mathspeak":{"sbrief":"L R wave arrow"}},"key":"21AD"},{"category":"Sm","mappings":{"default":{"default":"left right arrow with stroke"},"mathspeak":{"default":"left-right-arrow with stroke","sbrief":"L R arrow with stroke"}},"key":"21AE"},{"category":"So","mappings":{"default":{"default":"downwards zigzag arrow","short":"down zigzag arrow"},"mathspeak":{"sbrief":"d zigzag arrow"}},"key":"21AF"},{"category":"So","mappings":{"default":{"default":"upwards arrow with tip leftwards","short":"up arrow with tip left"},"mathspeak":{"default":"up-arrow with tip left","sbrief":"U arrow with tip left"}},"key":"21B0"},{"category":"So","mappings":{"default":{"default":"upwards arrow with tip rightwards","short":"up arrow with tip right"},"mathspeak":{"default":"up-arrow with tip right","sbrief":"U arrow with tip right"}},"key":"21B1"},{"category":"So","mappings":{"default":{"default":"downwards arrow with tip leftwards","short":"down arrow with tip left"},"mathspeak":{"default":"down-arrow with tip left","sbrief":"D arrow with tip left"}},"key":"21B2"},{"category":"So","mappings":{"default":{"default":"downwards arrow with tip rightwards","short":"down arrow with tip right"},"mathspeak":{"default":"down-arrow with tip right","sbrief":"D arrow with tip right"}},"key":"21B3"},{"category":"So","mappings":{"default":{"default":"rightwards arrow with corner downwards","short":"right arrow with corner down"},"mathspeak":{"default":"right-arrow with corner down","sbrief":"R arrow with corner down"}},"key":"21B4"},{"category":"So","mappings":{"default":{"default":"downwards arrow with corner leftwards","short":"down arrow with corner left"},"mathspeak":{"default":"down-arrow with corner left","sbrief":"D arrow with corner left"}},"key":"21B5"},{"category":"So","mappings":{"default":{"default":"anticlockwise top semicircle arrow"}},"key":"21B6"},{"category":"So","mappings":{"default":{"default":"clockwise top semicircle arrow"}},"key":"21B7"},{"category":"So","mappings":{"default":{"default":"north west arrow to long bar","short":"up left arrow to long bar"},"mathspeak":{"default":"up left-arrow to long bar","sbrief":"U L arrow to long bar"}},"key":"21B8"},{"category":"So","mappings":{"default":{"default":"leftwards arrow to bar over rightwards arrow to bar","short":"left arrow to bar over right arrow to bar"},"mathspeak":{"default":"left-arrow to bar over right-arrow to bar","sbrief":"L arrow to bar over R arrow to bar"}},"key":"21B9"},{"category":"So","mappings":{"default":{"default":"anticlockwise open circle arrow"}},"key":"21BA"},{"category":"So","mappings":{"default":{"default":"clockwise open circle arrow"}},"key":"21BB"},{"category":"So","mappings":{"default":{"default":"rightwards arrow over leftwards arrow","short":"right arrow over left arrow"},"mathspeak":{"default":"right-arrow over left-arrow","sbrief":"R arrow over L arrow"}},"key":"21C4"},{"category":"So","mappings":{"default":{"default":"upwards arrow leftwards of downwards arrow","short":"up arrow left of down arrow"},"mathspeak":{"default":"up-arrow left of down-arrow","sbrief":"U arrow L of D arrow"}},"key":"21C5"},{"category":"So","mappings":{"default":{"default":"leftwards arrow over rightwards arrow","short":"left arrow over right arrow"},"mathspeak":{"default":"left-arrow over right-arrow","sbrief":"L arrow over R arrow"}},"key":"21C6"},{"category":"So","mappings":{"default":{"default":"leftwards paired arrows","short":"left paired arrows"},"mathspeak":{"sbrief":"L paired arrows"}},"key":"21C7"},{"category":"So","mappings":{"default":{"default":"upwards paired arrows","short":"up paired arrows"},"mathspeak":{"sbrief":"U paired arrows"}},"key":"21C8"},{"category":"So","mappings":{"default":{"default":"rightwards paired arrows","short":"right paired arrows"},"mathspeak":{"sbrief":"R paired arrows"}},"key":"21C9"},{"category":"So","mappings":{"default":{"default":"downwards paired arrows","short":"down paired arrows"},"mathspeak":{"sbrief":"D paired arrows"}},"key":"21CA"},{"category":"So","mappings":{"default":{"default":"leftwards double arrow with stroke","short":"left double arrow with stroke"},"mathspeak":{"sbrief":"L double arrow with stroke"}},"key":"21CD"},{"category":"Sm","mappings":{"default":{"default":"left right double arrow with stroke"},"mathspeak":{"sbrief":"L R double arrow with stroke"}},"key":"21CE"},{"category":"Sm","mappings":{"default":{"default":"rightwards double arrow with stroke","short":"right double arrow with stroke"},"mathspeak":{"sbrief":"R double arrow with stroke"}},"key":"21CF"},{"category":"So","mappings":{"default":{"default":"leftwards double arrow","short":"left double arrow"},"mathspeak":{"sbrief":"L double arrow"}},"key":"21D0"},{"category":"So","mappings":{"default":{"default":"upwards double arrow","short":"up double arrow"},"mathspeak":{"sbrief":"U double arrow"}},"key":"21D1"},{"category":"Sm","mappings":{"default":{"default":"rightwards double arrow","short":"right double arrow"},"mathspeak":{"sbrief":"R double arrow"}},"key":"21D2"},{"category":"So","mappings":{"default":{"default":"downwards double arrow","short":"down double arrow"},"mathspeak":{"sbrief":"d double arrow"}},"key":"21D3"},{"category":"Sm","mappings":{"default":{"default":"left right double arrow"},"mathspeak":{"sbrief":"L R double arrow"}},"key":"21D4"},{"category":"So","mappings":{"default":{"default":"up down double arrow"},"mathspeak":{"sbrief":"U d double arrow"}},"key":"21D5"},{"category":"So","mappings":{"default":{"default":"north west double arrow","short":"up left double arrow"},"mathspeak":{"sbrief":"U L double arrow"}},"key":"21D6"},{"category":"So","mappings":{"default":{"default":"north east double arrow","short":"up right double arrow"},"mathspeak":{"sbrief":"U R double arrow"}},"key":"21D7"},{"category":"So","mappings":{"default":{"default":"south east double arrow","short":"down right double arrow"},"mathspeak":{"sbrief":"d R double arrow"}},"key":"21D8"},{"category":"So","mappings":{"default":{"default":"south west double arrow","short":"down left double arrow"},"mathspeak":{"sbrief":"d L double arrow"}},"key":"21D9"},{"category":"So","mappings":{"default":{"default":"leftwards triple arrow","short":"left triple arrow"},"mathspeak":{"sbrief":"L triple arrow"}},"key":"21DA"},{"category":"So","mappings":{"default":{"default":"rightwards triple arrow","short":"right triple arrow"},"mathspeak":{"sbrief":"r triple arrow"}},"key":"21DB"},{"category":"So","mappings":{"default":{"default":"leftwards squiggle arrow","short":"left squiggle arrow"},"mathspeak":{"sbrief":"L squiggle arrow"}},"key":"21DC"},{"category":"So","mappings":{"default":{"default":"rightwards squiggle arrow","short":"right squiggle arrow"},"mathspeak":{"sbrief":"r squiggle arrow"}},"key":"21DD"},{"category":"So","mappings":{"default":{"default":"upwards arrow with double stroke","short":"up arrow with double stroke"},"mathspeak":{"default":"up-arrow with double stroke","sbrief":"U arrow with double stroke"}},"key":"21DE"},{"category":"So","mappings":{"default":{"default":"downwards arrow with double stroke","short":"down arrow with double stroke"},"mathspeak":{"default":"down-arrow with double stroke","sbrief":"D arrow with double stroke"}},"key":"21DF"},{"category":"So","mappings":{"default":{"default":"leftwards dasheD arrow","short":"left dasheD arrow"},"mathspeak":{"sbrief":"L dasheD arrow"}},"key":"21E0"},{"category":"So","mappings":{"default":{"default":"upwards dasheD arrow","short":"up dasheD arrow"},"mathspeak":{"sbrief":"U dasheD arrow"}},"key":"21E1"},{"category":"So","mappings":{"default":{"default":"rightwards dasheD arrow","short":"right dasheD arrow"},"mathspeak":{"sbrief":"r dasheD arrow"}},"key":"21E2"},{"category":"So","mappings":{"default":{"default":"downwards dasheD arrow","short":"down dasheD arrow"},"mathspeak":{"sbrief":"d dasheD arrow"}},"key":"21E3"},{"category":"So","mappings":{"default":{"default":"leftwards arrow to bar","short":"left arrow to bar"},"mathspeak":{"default":"left-arrow to bar","sbrief":"L arrow to bar"}},"key":"21E4"},{"category":"So","mappings":{"default":{"default":"rightwards arrow to bar","short":"right arrow to bar"},"mathspeak":{"default":"right-arrow to bar","sbrief":"R arrow to bar"}},"key":"21E5"},{"category":"So","mappings":{"default":{"default":"leftwards white arrow","short":"white left arrow"},"mathspeak":{"default":"white left-arrow","sbrief":"white L arrow"}},"key":"21E6"},{"category":"So","mappings":{"default":{"default":"upwards white arrow","short":"white up arrow"},"mathspeak":{"default":"white up-arrow","sbrief":"white U arrow"}},"key":"21E7"},{"category":"So","mappings":{"default":{"default":"rightwards white arrow","short":"white right arrow"},"mathspeak":{"default":"white right-arrow","sbrief":"white R arrow"}},"key":"21E8"},{"category":"So","mappings":{"default":{"default":"downwards white arrow","short":"white down arrow"},"mathspeak":{"default":"white down-arrow","sbrief":"white D arrow"}},"key":"21E9"},{"category":"So","mappings":{"default":{"default":"upwards white arrow from bar","short":"white up arrow from bar"},"mathspeak":{"default":"white up-arrow from bar","sbrief":"white U arrow from bar"}},"key":"21EA"},{"category":"So","mappings":{"default":{"default":"upwards white arrow on pedestal","alternative":"up white arrow on pedestal","short":"white up arrow on pedestal"},"mathspeak":{"default":"white up-arrow on pedestal","sbrief":"white U arrow on pedestal"}},"key":"21EB"},{"category":"So","mappings":{"default":{"default":"upwards white arrow on pedestal with horizontal bar","alternative":"up white arrow on pedestal with horizontal bar","short":"white up arrow on pedestal with horizontal bar"},"mathspeak":{"default":"white up-arrow on pedestal with horizontal bar","sbrief":"white U arrow on pedestal with horizontal bar"}},"key":"21EC"},{"category":"So","mappings":{"default":{"default":"upwards white arrow on pedestal with vertical bar","alternative":"up white arrow on pedestal with vertical bar","short":"white up arrow on pedestal with vertical bar"},"mathspeak":{"default":"white up-arrow on pedestal with vertical bar","sbrief":"white U arrow on pedestal with vertical bar"}},"key":"21ED"},{"category":"So","mappings":{"default":{"default":"upwards white double arrow","alternative":"up white double arrow","short":"white double up arrow"},"mathspeak":{"default":"white double up-arrow","sbrief":"white double U arrow"}},"key":"21EE"},{"category":"So","mappings":{"default":{"default":"upwards white double arrow on pedestal","alternative":"up white double arrow on pedestal","short":"white double up arrow on pedestal"},"mathspeak":{"default":"white double up-arrow on pedestal","sbrief":"white double U arrow on pedestal"}},"key":"21EF"},{"category":"So","mappings":{"default":{"default":"rightwards white arrow from wall","alternative":"right white arrow from wall","short":"white right arrow from wall"},"mathspeak":{"default":"white right-arrow from wall","sbrief":"white R arrow from wall"}},"key":"21F0"},{"category":"So","mappings":{"default":{"default":"north west arrow to corner"}},"key":"21F1"},{"category":"So","mappings":{"default":{"default":"south east arrow to corner"}},"key":"21F2"},{"category":"So","mappings":{"default":{"default":"up down white arrow"},"mathspeak":{"sbrief":"U d white arrow"}},"key":"21F3"},{"category":"Sm","mappings":{"default":{"default":"right arrow with small circle"},"mathspeak":{"default":"right-arrow with small circle","sbrief":"R arrow with small circle"}},"key":"21F4"},{"category":"Sm","mappings":{"default":{"default":"down arrow leftwards of upwards arrow","short":"down arrow left of up arrow"},"mathspeak":{"default":"down-arrow left of up-arrow","sbrief":"D arrow l of U arrow"}},"key":"21F5"},{"category":"Sm","mappings":{"default":{"default":"three rightwards arrows","short":"three right arrows"},"mathspeak":{"default":"three right-arrows","sbrief":"three R arrows"}},"key":"21F6"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow with vertical stroke","short":"left arrow with vertical stroke"},"mathspeak":{"default":"left-arrow with vertical stroke","sbrief":"L arrow with vertical stroke"}},"key":"21F7"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow with vertical stroke","short":"right arrow with vertical stroke"},"mathspeak":{"default":"right-arrow with vertical stroke","sbrief":"R arrow with vertical stroke"}},"key":"21F8"},{"category":"Sm","mappings":{"default":{"default":"left right arrow with vertical stroke"},"mathspeak":{"default":"left-right-arrow with vertical stroke","sbrief":"L R arrow with vertical stroke"}},"key":"21F9"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow with double vertical stroke","short":"left arrow with double vertical stroke"},"mathspeak":{"default":"left-arrow with double vertical stroke","sbrief":"L arrow with double vertical stroke"}},"key":"21FA"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow with double vertical stroke","short":"right arrow with double vertical stroke"},"mathspeak":{"default":"right-arrow with double vertical stroke","sbrief":"R arrow with double vertical stroke"}},"key":"21FB"},{"category":"Sm","mappings":{"default":{"default":"left right arrow with double vertical stroke"},"mathspeak":{"default":"left-right-arrow with double vertical stroke","sbrief":"L R arrow with double vertical stroke"}},"key":"21FC"},{"category":"Sm","mappings":{"default":{"default":"leftwards open headed arrow","short":"left open headed arrow"},"mathspeak":{"sbrief":"l open headed arrow"}},"key":"21FD"},{"category":"Sm","mappings":{"default":{"default":"rightwards open headed arrow","short":"right open headed arrow"},"mathspeak":{"sbrief":"r open headed arrow"}},"key":"21FE"},{"category":"Sm","mappings":{"default":{"default":"left right open headed arrow"},"mathspeak":{"sbrief":"L R open headed arrow"}},"key":"21FF"},{"category":"So","mappings":{"default":{"default":"electric arrow"}},"key":"2301"},{"category":"So","mappings":{"default":{"default":"up arrowhead"},"mathspeak":{"default":"up-arrowhead","sbrief":"U arrowhead"}},"key":"2303"},{"category":"So","mappings":{"default":{"default":"down arrowhead"},"mathspeak":{"default":"down-arrowhead","sbrief":"D arrowhead"}},"key":"2304"},{"category":"So","mappings":{"default":{"default":"up arrowhead between two horizontal bars","alternative":"enter key"},"mathspeak":{"default":"up-arrowhead between two horizontal bars","sbrief":"U arrowhead between two horizontal bars"}},"key":"2324"},{"category":"So","mappings":{"default":{"default":"broken circle with northwest arrow"}},"key":"238B"},{"category":"So","mappings":{"default":{"default":"heavy wide headed rightwards arrow","short":"heavy wide headed right arrow"},"mathspeak":{"default":"heavy wide headed right-arrow","sbrief":"heavy wide headed R arrow"}},"key":"2794"},{"category":"So","mappings":{"default":{"default":"heavy south east arrow","short":"heavy down right arrow"},"mathspeak":{"default":"heavy down right-arrow","sbrief":"heavy d R arrow"}},"key":"2798"},{"category":"So","mappings":{"default":{"default":"heavy rightwards arrow","short":"heavy right arrow"},"mathspeak":{"default":"heavy right-arrow","sbrief":"heavy R arrow"}},"key":"2799"},{"category":"So","mappings":{"default":{"default":"heavy north east arrow","short":"heavy up right arrow"},"mathspeak":{"default":"heavy up right-arrow","sbrief":"heavy U R arrow"}},"key":"279A"},{"category":"So","mappings":{"default":{"default":"drafting point rightwards arrow","short":"drafting point right arrow"},"mathspeak":{"default":"drafting point right-arrow","sbrief":"drafting point R arrow"}},"key":"279B"},{"category":"So","mappings":{"default":{"default":"heavy round tipped rightwards arrow","short":"heavy round tipped right arrow"},"mathspeak":{"default":"heavy round tipped right-arrow","sbrief":"heavy round tipped R arrow"}},"key":"279C"},{"category":"So","mappings":{"default":{"default":"triangle headed rightwards arrow","short":"triangle headed right arrow"},"mathspeak":{"default":"triangle headed right-arrow","sbrief":"triangle headed R arrow"}},"key":"279D"},{"category":"So","mappings":{"default":{"default":"heavy triangle headed rightwards arrow","short":"heavy triangle headed right arrow"},"mathspeak":{"default":"heavy triangle headed right-arrow","sbrief":"heavy triangle headed R arrow"}},"key":"279E"},{"category":"So","mappings":{"default":{"default":"dashed triangle headed rightwards arrow","short":"dashed triangle headed right arrow"},"mathspeak":{"default":"dashed triangle headed right-arrow","sbrief":"dashed triangle headed R arrow"}},"key":"279F"},{"category":"So","mappings":{"default":{"default":"heavy dashed triangle headed rightwards arrow","short":"heavy dashed triangle headed right arrow"},"mathspeak":{"default":"heavy dashed triangle headed right-arrow","sbrief":"heavy dashed triangle headed R arrow"}},"key":"27A0"},{"category":"So","mappings":{"default":{"default":"black rightwards arrow","short":"black right arrow"},"mathspeak":{"default":"black right-arrow","sbrief":"black R arrow"}},"key":"27A1"},{"category":"So","mappings":{"default":{"default":"three d top lighted rightwards arrowhead","short":"three d top lighted right arrowhead"},"mathspeak":{"default":"three d top lighted right-arrowhead","sbrief":"three d top lighted R arrowhead"}},"key":"27A2"},{"category":"So","mappings":{"default":{"default":"three d bottom lighted rightwards arrowhead","short":"three d bottom lighted right arrowhead"},"mathspeak":{"default":"three d bottom lighted right-arrowhead","sbrief":"three d bottom lighted R arrowhead"}},"key":"27A3"},{"category":"So","mappings":{"default":{"default":"black rightwards arrowhead","short":"black right arrowhead"},"mathspeak":{"default":"black right-arrowhead","sbrief":"black R arrowhead"}},"key":"27A4"},{"category":"So","mappings":{"default":{"default":"heavy black curved downwards and rightwards arrow","short":"heavy black curved down and right arrow"},"mathspeak":{"default":"heavy black curved down and right-arrow","sbrief":"heavy black curved d and R arrow"}},"key":"27A5"},{"category":"So","mappings":{"default":{"default":"heavy black curved upwards and rightwards arrow","short":"heavy black curved up and right arrow"},"mathspeak":{"default":"heavy black curved up and right-arrow","sbrief":"heavy black curved U and R arrow"}},"key":"27A6"},{"category":"So","mappings":{"default":{"default":"squat black rightwards arrow","short":"squat black right arrow"},"mathspeak":{"default":"squat black right-arrow","sbrief":"squat black R arrow"}},"key":"27A7"},{"category":"So","mappings":{"default":{"default":"heavy concave pointed black rightwards arrow","short":"heavy concave pointed black right arrow"},"mathspeak":{"default":"heavy concave pointed black right-arrow","sbrief":"heavy concave pointed black R arrow"}},"key":"27A8"},{"category":"So","mappings":{"default":{"default":"right shaded white rightwards arrow","short":"right shaded white right arrow"},"mathspeak":{"default":"right shaded white right-arrow","sbrief":"right shaded white R arrow"}},"key":"27A9"},{"category":"So","mappings":{"default":{"default":"left shaded white rightwards arrow","short":"left shaded white right arrow"},"mathspeak":{"default":"left shaded white right-arrow","sbrief":"left shaded white R arrow"}},"key":"27AA"},{"category":"So","mappings":{"default":{"default":"back tilted shadowed white rightwards arrow","short":"back tilted shadowed white right arrow"},"mathspeak":{"default":"back tilted shadowed white right-arrow","sbrief":"back tilted shadowed white R arrow"}},"key":"27AB"},{"category":"So","mappings":{"default":{"default":"front tilted shadowed white rightwards arrow","short":"front tilted shadowed white right arrow"},"mathspeak":{"default":"front tilted shadowed white right-arrow","sbrief":"front tilted shadowed white R arrow"}},"key":"27AC"},{"category":"So","mappings":{"default":{"default":"heavy lower right shadowed white rightwards arrow","short":"heavy lower right shadowed white right arrow"},"mathspeak":{"default":"heavy lower right shadowed white right-arrow","sbrief":"heavy lower right shadowed white R arrow"}},"key":"27AD"},{"category":"So","mappings":{"default":{"default":"heavy upper right shadowed white rightwards arrow","short":"heavy upper right shadowed white right arrow"},"mathspeak":{"default":"heavy upper right shadowed white right-arrow","sbrief":"heavy upper right shadowed white R arrow"}},"key":"27AE"},{"category":"So","mappings":{"default":{"default":"notched lower right shadowed white rightwards arrow","short":"notched lower right shadowed white right arrow"},"mathspeak":{"default":"notched lower right shadowed white right-arrow","sbrief":"notched lower right shadowed white R arrow"}},"key":"27AF"},{"category":"So","mappings":{"default":{"default":"notched upper right shadowed white rightwards arrow","short":"notched upper right shadowed white right arrow"},"mathspeak":{"default":"notched upper right shadowed white right-arrow","sbrief":"notched upper right shadowed white R arrow"}},"key":"27B1"},{"category":"So","mappings":{"default":{"default":"circled heavy white rightwards arrow","short":"circled heavy white right arrow"},"mathspeak":{"default":"circled heavy white right-arrow","sbrief":"circled heavy white R arrow"}},"key":"27B2"},{"category":"So","mappings":{"default":{"default":"white feathered rightwards arrow","short":"white feathered right arrow"},"mathspeak":{"default":"white feathered right-arrow","sbrief":"white feathered R arrow"}},"key":"27B3"},{"category":"So","mappings":{"default":{"default":"black feathered south east arrow","short":"black feathered down right arrow"},"mathspeak":{"default":"black feathered down right-arrow","sbrief":"black feathered d R arrow"}},"key":"27B4"},{"category":"So","mappings":{"default":{"default":"black feathered rightwards arrow","short":"black feathered right arrow"},"mathspeak":{"default":"black feathered right-arrow","sbrief":"black feathered R arrow"}},"key":"27B5"},{"category":"So","mappings":{"default":{"default":"black feathered north east arrow","short":"black feathered up right arrow"},"mathspeak":{"default":"black feathered up right-arrow","sbrief":"black feathered U R arrow"}},"key":"27B6"},{"category":"So","mappings":{"default":{"default":"heavy black feathered south east arrow","short":"heavy black feathered down right arrow"},"mathspeak":{"default":"heavy black feathered down right-arrow","sbrief":"heavy black feathered d R arrow"}},"key":"27B7"},{"category":"So","mappings":{"default":{"default":"heavy black feathered rightwards arrow","short":"heavy black feathered right arrow"},"mathspeak":{"default":"heavy black feathered right-arrow","sbrief":"heavy black feathered R arrow"}},"key":"27B8"},{"category":"So","mappings":{"default":{"default":"heavy black feathered north east arrow","short":"heavy black feathered up right arrow"},"mathspeak":{"default":"heavy black feathered up right-arrow","sbrief":"heavy black feathered U R arrow"}},"key":"27B9"},{"category":"So","mappings":{"default":{"default":"teardrop barbed rightwards arrow","short":"teardrop barbed right arrow"},"mathspeak":{"default":"teardrop barbed right-arrow","sbrief":"teardrop barbed R arrow"}},"key":"27BA"},{"category":"So","mappings":{"default":{"default":"heavy teardrop shanked rightwards arrow","short":"heavy teardrop shanked right arrow"},"mathspeak":{"default":"heavy teardrop shanked right-arrow","sbrief":"heavy teardrop shanked R arrow"}},"key":"27BB"},{"category":"So","mappings":{"default":{"default":"wedge tailed rightwards arrow","short":"wedge tailed right arrow"},"mathspeak":{"default":"wedge tailed right-arrow","sbrief":"wedge tailed R arrow"}},"key":"27BC"},{"category":"So","mappings":{"default":{"default":"heavy wedge tailed rightwards arrow","short":"heavy wedge tailed right arrow"},"mathspeak":{"default":"heavy wedge tailed right-arrow","sbrief":"heavy wedge tailed R arrow"}},"key":"27BD"},{"category":"So","mappings":{"default":{"default":"open outlined rightwards arrow","short":"open outlined right arrow"},"mathspeak":{"default":"open outlined right-arrow","sbrief":"open outlined R arrow"}},"key":"27BE"},{"category":"Sm","mappings":{"default":{"default":"upwards quadruple arrow","short":"up quadruple arrow"},"mathspeak":{"sbrief":"U quadruple arrow"}},"key":"27F0"},{"category":"Sm","mappings":{"default":{"default":"downwards quadruple arrow","short":"down quadruple arrow"},"mathspeak":{"sbrief":"d quadrule arrow"}},"key":"27F1"},{"category":"Sm","mappings":{"default":{"default":"anticlockwise gapped circle arrow"}},"key":"27F2"},{"category":"Sm","mappings":{"default":{"default":"clockwise gapped circle arrow"}},"key":"27F3"},{"category":"Sm","mappings":{"default":{"default":"right arrow with circled plus"},"mathspeak":{"default":"right-arrow with circled plus","sbrief":"R arrow with circled plus"}},"key":"27F4"},{"category":"Sm","mappings":{"default":{"default":"long leftwards arrow","short":"long left arrow"},"mathspeak":{"default":"long left-arrow","sbrief":"long L arrow"}},"key":"27F5"},{"category":"Sm","mappings":{"default":{"default":"long rightwards arrow","short":"long right arrow"},"mathspeak":{"default":"long right-arrow","sbrief":"long R arrow"}},"key":"27F6"},{"category":"Sm","mappings":{"default":{"default":"long left right arrow"},"mathspeak":{"default":"long left-right-arrow","sbrief":"long L R arrow"}},"key":"27F7"},{"category":"Sm","mappings":{"default":{"default":"long leftwards double arrow","short":"long left double arrow"},"mathspeak":{"sbrief":"long l double arrow"}},"key":"27F8"},{"category":"Sm","mappings":{"default":{"default":"long rightwards double arrow","short":"long right double arrow"},"mathspeak":{"sbrief":"long R double arrow"}},"key":"27F9"},{"category":"Sm","mappings":{"default":{"default":"long left right double arrow"},"mathspeak":{"sbrief":"long L R double arrow"}},"key":"27FA"},{"category":"Sm","mappings":{"default":{"default":"long leftwards arrow from bar","short":"long left arrow from bar"},"mathspeak":{"default":"long left-arrow from bar","sbrief":"long L arrow from bar"}},"key":"27FB"},{"category":"Sm","mappings":{"default":{"default":"long rightwards arrow from bar","short":"long right arrow from bar"},"mathspeak":{"default":"long right-arrow from bar","sbrief":"long R arrow from bar"}},"key":"27FC"},{"category":"Sm","mappings":{"default":{"default":"long leftwards double arrow from bar","short":"long left double arrow from bar"},"mathspeak":{"sbrief":"long l double arrow from bar"}},"key":"27FD"},{"category":"Sm","mappings":{"default":{"default":"long rightwards double arrow from bar","short":"long right double arrow from bar"},"mathspeak":{"sbrief":"long R double arrow from bar"}},"key":"27FE"},{"category":"Sm","mappings":{"default":{"default":"long rightwards squiggle arrow","short":"long right squiggle arrow"},"mathspeak":{"sbrief":"long r squiggle arrow"}},"key":"27FF"},{"category":"Sm","mappings":{"default":{"default":"rightwards two headed arrow with vertical stroke","alternative":"right two headed arrow with vertical stroke","short":"two headed right arrow with vertical stroke"},"mathspeak":{"default":"two headed right-arrow with vertical stroke","sbrief":"two headed R arrow with vertical stroke"}},"key":"2900"},{"category":"Sm","mappings":{"default":{"default":"rightwards two headed arrow with double vertical stroke","alternative":"right two headed arrow with double vertical stroke","short":"two headed right arrow with double vertical stroke"},"mathspeak":{"default":"two headed right-arrow with double vertical stroke","sbrief":"two headed R arrow with double vertical stroke"}},"key":"2901"},{"category":"Sm","mappings":{"default":{"default":"leftwards double arrow with vertical stroke","alternative":"left double arrow with vertical stroke","short":"double left arrow with vertical stroke"},"mathspeak":{"default":"double left-arrow with vertical stroke","sbrief":"double L arrow with vertical stroke"}},"key":"2902"},{"category":"Sm","mappings":{"default":{"default":"rightwards double arrow with vertical stroke","alternative":"right double arrow with vertical stroke","short":"double right arrow with vertical stroke"},"mathspeak":{"default":"double right-arrow with vertical stroke","sbrief":"double R arrow with vertical stroke"}},"key":"2903"},{"category":"Sm","mappings":{"default":{"default":"left right double arrow with vertical stroke","short":"double left right arrow with vertical stroke"},"mathspeak":{"default":"double left-right-arrow with vertical stroke","sbrief":"double L R arrow with vertical stroke"}},"key":"2904"},{"category":"Sm","mappings":{"default":{"default":"rightwards two headed arrow from bar","alternative":"right two headed arrow from bar","short":"two headed right arrow from bar"},"mathspeak":{"default":"two headed right-arrow from bar","sbrief":"two headed R arrow from bar"}},"key":"2905"},{"category":"Sm","mappings":{"default":{"default":"leftwards double arrow from bar","alternative":"left double arrow from bar","short":"double left arrow from bar"},"mathspeak":{"default":"double left-arrow from bar","sbrief":"double L arrow from bar"}},"key":"2906"},{"category":"Sm","mappings":{"default":{"default":"rightwards double arrow from bar","alternative":"right double arrow from bar","short":"double right arrow from bar"},"mathspeak":{"default":"double right-arrow from bar","sbrief":"double R arrow from bar"}},"key":"2907"},{"category":"Sm","mappings":{"default":{"default":"downwards arrow with horizontal stroke","alternative":"down arrow with horizontal stroke","short":"arrow down with horizontal stroke"}},"key":"2908"},{"category":"Sm","mappings":{"default":{"default":"upwards arrow with horizontal stroke","short":"up arrow with horizontal stroke"},"mathspeak":{"default":"up-arrow with horizontal stroke","sbrief":"U arrow with horizontal stroke"}},"key":"2909"},{"category":"Sm","mappings":{"default":{"default":"upwards triple arrow","short":"up triple arrow"},"mathspeak":{"sbrief":"U triple arrow"}},"key":"290A"},{"category":"Sm","mappings":{"default":{"default":"downwards triple arrow","short":"down triple arrow"},"mathspeak":{"sbrief":"d triple arrow"}},"key":"290B"},{"category":"Sm","mappings":{"default":{"default":"leftwards double dash arrow","short":"left double dash arrow"},"mathspeak":{"sbrief":"l double dash arrow"}},"key":"290C"},{"category":"Sm","mappings":{"default":{"default":"rightwards double dash arrow","short":"right double dash arrow"},"mathspeak":{"sbrief":"R double dash arrow"}},"key":"290D"},{"category":"Sm","mappings":{"default":{"default":"leftwards triple dash arrow","short":"left triple dash arrow"},"mathspeak":{"sbrief":"l triple dash arrow"}},"key":"290E"},{"category":"Sm","mappings":{"default":{"default":"rightwards triple dash arrow","short":"right triple dash arrow"},"mathspeak":{"sbrief":"r triple dash arrow"}},"key":"290F"},{"category":"Sm","mappings":{"default":{"default":"rightwards two headed triple dash arrow","short":"right two headed triple dash arrow"},"mathspeak":{"sbrief":"r two headed triple dash arrow"}},"key":"2910"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow with dotted stem","short":"right arrow with dotted stem"},"mathspeak":{"default":"right-arrow with dotted stem","sbrief":"R arrow with dotted stem"}},"key":"2911"},{"category":"Sm","mappings":{"default":{"default":"upwards arrow to bar","short":"up arrow to bar"},"mathspeak":{"default":"up-arrow to bar","sbrief":"U arrow to bar"}},"key":"2912"},{"category":"Sm","mappings":{"default":{"default":"downwards arrow to bar","short":"down arrow to bar"},"mathspeak":{"default":"down-arrow to bar","sbrief":"D arrow to bar"}},"key":"2913"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow with tail with vertical stroke","short":"right arrow with tail with vertical stroke"},"mathspeak":{"default":"right-arrow with tail with vertical stroke","sbrief":"R arrow with tail with vertical stroke"}},"key":"2914"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow with tail with double vertical stroke","short":"right arrow with tail with double vertical stroke"},"mathspeak":{"default":"right-arrow with tail with double vertical stroke","sbrief":"R arrow with tail with double vertical stroke"}},"key":"2915"},{"category":"Sm","mappings":{"default":{"default":"rightwards two headed arrow with tail","short":"right two headed arrow with tail"},"mathspeak":{"sbrief":"r two headed arrow with tail"}},"key":"2916"},{"category":"Sm","mappings":{"default":{"default":"rightwards two headed arrow with tail with vertical stroke","short":"right two headed arrow with tail with vertical stroke"},"mathspeak":{"sbrief":"r two headed arrow with tail with vertical stroke"}},"key":"2917"},{"category":"Sm","mappings":{"default":{"default":"rightwards two headed arrow with tail with double vertical stroke","short":"right two headed arrow with tail with double vertical stroke"},"mathspeak":{"sbrief":"r two headed arrow with tail with double vertical stroke"}},"key":"2918"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow tail","short":"left arrow tail"},"mathspeak":{"default":"left-arrow tail","sbrief":"L arrow tail"}},"key":"2919"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow tail","short":"right arrow tail"},"mathspeak":{"default":"right-arrow tail","sbrief":"R arrow tail"}},"key":"291A"},{"category":"Sm","mappings":{"default":{"default":"leftwards double arrow tail","short":"left double arrow tail"},"mathspeak":{"sbrief":"l double arrow tail"}},"key":"291B"},{"category":"Sm","mappings":{"default":{"default":"rightwards double arrow tail","short":"right double arrow tail"},"mathspeak":{"sbrief":"R double arrow tail"}},"key":"291C"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow to black diamond","short":"left arrow to black diamond"},"mathspeak":{"default":"left-arrow to black diamond","sbrief":"L arrow to black diamond"}},"key":"291D"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow to black diamond","short":"right arrow to black diamond"},"mathspeak":{"default":"right-arrow to black diamond","sbrief":"R arrow to black diamond"}},"key":"291E"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow from bar to black diamond","short":"left arrow from bar to black diamond"},"mathspeak":{"default":"left-arrow from bar to black diamond","sbrief":"L arrow from bar to black diamond"}},"key":"291F"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow from bar to black diamond","short":"right arrow from bar to black diamond"},"mathspeak":{"default":"right-arrow from bar to black diamond","sbrief":"R arrow from bar to black diamond"}},"key":"2920"},{"category":"Sm","mappings":{"default":{"default":"north west and south east arrow"}},"key":"2921"},{"category":"Sm","mappings":{"default":{"default":"north east and south west arrow"}},"key":"2922"},{"category":"Sm","mappings":{"default":{"default":"north west arrow with hook"}},"key":"2923"},{"category":"Sm","mappings":{"default":{"default":"north east arrow with hook"}},"key":"2924"},{"category":"Sm","mappings":{"default":{"default":"south east arrow with hook"}},"key":"2925"},{"category":"Sm","mappings":{"default":{"default":"south west arrow with hook"}},"key":"2926"},{"category":"Sm","mappings":{"default":{"default":"north west arrow and north east arrow"}},"key":"2927"},{"category":"Sm","mappings":{"default":{"default":"north east arrow and south east arrow"}},"key":"2928"},{"category":"Sm","mappings":{"default":{"default":"south east arrow and south west arrow"}},"key":"2929"},{"category":"Sm","mappings":{"default":{"default":"south west arrow and north west arrow"}},"key":"292A"},{"category":"Sm","mappings":{"default":{"default":"south east arrow crossing north east arrow"}},"key":"292D"},{"category":"Sm","mappings":{"default":{"default":"north east arrow crossing south east arrow"}},"key":"292E"},{"category":"Sm","mappings":{"default":{"default":"falling diagonal crossing north east arrow"}},"key":"292F"},{"category":"Sm","mappings":{"default":{"default":"rising diagonal crossing south east arrow"}},"key":"2930"},{"category":"Sm","mappings":{"default":{"default":"north east arrow crossing north west arrow"}},"key":"2931"},{"category":"Sm","mappings":{"default":{"default":"north west arrow crossing north east arrow"}},"key":"2932"},{"category":"Sm","mappings":{"default":{"default":"wave arrow pointing directly right"}},"key":"2933"},{"category":"Sm","mappings":{"default":{"default":"arrow pointing rightwards then curving upwards","short":"arrow pointing right then curving up"}},"key":"2934"},{"category":"Sm","mappings":{"default":{"default":"arrow pointing rightwards then curving downwards","short":"arrow pointing right then curving down"}},"key":"2935"},{"category":"Sm","mappings":{"default":{"default":"arrow pointing downwards then curving leftwards","short":"arrow pointing down then curving left"}},"key":"2936"},{"category":"Sm","mappings":{"default":{"default":"arrow pointing downwards then curving rightwards","short":"arrow pointing down then curving right"}},"key":"2937"},{"category":"Sm","mappings":{"default":{"default":"right side arc clockwise arrow"},"mathspeak":{"sbrief":"r side arc clockwise arrow"}},"key":"2938"},{"category":"Sm","mappings":{"default":{"default":"left side arc anticlockwise arrow"},"mathspeak":{"sbrief":"l side arc anticlockwise arrow"}},"key":"2939"},{"category":"Sm","mappings":{"default":{"default":"top arc anticlockwise arrow"}},"key":"293A"},{"category":"Sm","mappings":{"default":{"default":"bottom arc anticlockwise arrow"}},"key":"293B"},{"category":"Sm","mappings":{"default":{"default":"top arc clockwise arrow with minus"}},"key":"293C"},{"category":"Sm","mappings":{"default":{"default":"top arc anticlockwise arrow with plus"}},"key":"293D"},{"category":"Sm","mappings":{"default":{"default":"lower right semicircular clockwise arrow","short":"down right semicircular clockwise arrow"},"mathspeak":{"sbrief":"d r semicircular clockwise arrow"}},"key":"293E"},{"category":"Sm","mappings":{"default":{"default":"lower left semicircular anticlockwise arrow","short":"down left semicircular anticlockwise arrow"},"mathspeak":{"sbrief":"d l semicircular anticlockwise arrow"}},"key":"293F"},{"category":"Sm","mappings":{"default":{"default":"anticlockwise closed circle arrow"}},"key":"2940"},{"category":"Sm","mappings":{"default":{"default":"clockwise closed circle arrow"}},"key":"2941"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow above short leftwards arrow","short":"right arrow above short left arrow"},"mathspeak":{"default":"right-arrow above short left-arrow","sbrief":"R arrow above short L arrow"}},"key":"2942"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow above short rightwards arrow","short":"left arrow above short right arrow"},"mathspeak":{"default":"left-arrow above short right-arrow","sbrief":"L arrow above short R arrow"}},"key":"2943"},{"category":"Sm","mappings":{"default":{"default":"short rightwards arrow above leftwards arrow","short":"short right arrow above left arrow"},"mathspeak":{"default":"short right-arrow above left-arrow","sbrief":"short R arrow above L arrow"}},"key":"2944"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow with plus below","short":"right arrow with plus below"},"mathspeak":{"default":"right-arrow with plus below","sbrief":"R arrow with plus below"}},"key":"2945"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow with plus below","short":"left arrow with plus below"},"mathspeak":{"default":"left-arrow with plus below","sbrief":"L arrow with plus below"}},"key":"2946"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow through x","short":"right arrow through x"},"mathspeak":{"default":"right-arrow through x","sbrief":"R arrow through x"}},"key":"2947"},{"category":"Sm","mappings":{"default":{"default":"left right arrow through small circle"},"mathspeak":{"default":"left-right-arrow through small circle","sbrief":"L R arrow through small circle"}},"key":"2948"},{"category":"Sm","mappings":{"default":{"default":"upwards two headed arrow from small circle","short":"up two headed arrow from small circle"},"mathspeak":{"sbrief":"U two headed arrow from small circle"}},"key":"2949"},{"category":"Sm","mappings":{"default":{"default":"right double arrow with rounded head"},"mathspeak":{"sbrief":"R double arrow with rounded head"}},"key":"2970"},{"category":"Sm","mappings":{"default":{"default":"equals sign above rightwards arrow","short":"equals sign above right arrow"},"mathspeak":{"default":"equals sign above right-arrow","sbrief":"equals sign above R arrow"}},"key":"2971"},{"category":"Sm","mappings":{"default":{"default":"tilde operator above rightwards arrow","short":"tilde operator above right arrow"},"mathspeak":{"default":"tilde operator above right-arrow","sbrief":"tilde operator above R arrow"}},"key":"2972"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow above tilde operator","short":"left arrow above tilde operator"},"mathspeak":{"default":"left-arrow above tilde operator","sbrief":"L arrow above tilde operator"}},"key":"2973"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow above tilde operator","short":"right arrow above tilde operator"},"mathspeak":{"default":"right-arrow above tilde operator","sbrief":"R arrow above tilde operator"}},"key":"2974"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow above almost equals","short":"right arrow above almost equals"},"mathspeak":{"default":"right-arrow above almost equals","sbrief":"R arrow above almost equals"}},"key":"2975"},{"category":"Sm","mappings":{"default":{"default":"less than above leftwards arrow","short":"less than above left arrow"},"mathspeak":{"default":"less than above left-arrow","sbrief":"less than above L arrow"}},"key":"2976"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow through less than","short":"left arrow through less than"},"mathspeak":{"default":"left-arrow through less than","sbrief":"L arrow through less than"}},"key":"2977"},{"category":"Sm","mappings":{"default":{"default":"greater than above rightwards arrow","short":"greater than above right arrow"},"mathspeak":{"default":"greater than above right-arrow","sbrief":"greater than above R arrow"}},"key":"2978"},{"category":"Sm","mappings":{"default":{"default":"subset above rightwards arrow","short":"subset above right arrow"},"mathspeak":{"default":"subset above right-arrow","sbrief":"subset above R arrow"}},"key":"2979"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow through subset","short":"left arrow through subset"},"mathspeak":{"default":"left-arrow through subset","sbrief":"L arrow through subset"}},"key":"297A"},{"category":"Sm","mappings":{"default":{"default":"superset above leftwards arrow","short":"superset above left arrow"},"mathspeak":{"default":"superset above left-arrow","sbrief":"suerset above L arrow"}},"key":"297B"},{"category":"Sm","mappings":{"default":{"default":"empty set with right arrow above"},"mathspeak":{"default":"empty set with right-arrow above","sbrief":"empty set with R arrow above"}},"key":"29B3"},{"category":"Sm","mappings":{"default":{"default":"empty set with left arrow above"},"mathspeak":{"default":"empty set with left-arrow above","sbrief":"empty set with L arrow above"}},"key":"29B4"},{"category":"Sm","mappings":{"default":{"default":"up arrow through circle"},"mathspeak":{"default":"up-arrow through circle","sbrief":"U arrow through circle"}},"key":"29BD"},{"category":"Sm","mappings":{"default":{"default":"black diamond with down arrow"},"mathspeak":{"default":"black diamond with down-arrow","sbrief":"black diamond with D arrow"}},"key":"29EA"},{"category":"Sm","mappings":{"default":{"default":"white circle with down arrow"},"mathspeak":{"default":"white circle with down-arrow","sbrief":"white circle with D arrow"}},"key":"29EC"},{"category":"Sm","mappings":{"default":{"default":"black circle with down arrow"},"mathspeak":{"default":"black circle with down-arrow","sbrief":"black circle with D arrow"}},"key":"29ED"},{"category":"Sm","mappings":{"default":{"default":"integral with leftwards arrow with hook","short":"integral with left arrow with hook"},"mathspeak":{"default":"integral with left-arrow with hook","sbrief":"integral with L arrow with hook"}},"key":"2A17"},{"category":"So","mappings":{"default":{"default":"north east white arrow"}},"key":"2B00"},{"category":"So","mappings":{"default":{"default":"north west white arrow"}},"key":"2B01"},{"category":"So","mappings":{"default":{"default":"south east white arrow"}},"key":"2B02"},{"category":"So","mappings":{"default":{"default":"south west white arrow"}},"key":"2B03"},{"category":"So","mappings":{"default":{"default":"left right white arrow"},"mathspeak":{"sbrief":"L R white arrow"}},"key":"2B04"},{"category":"So","mappings":{"default":{"default":"leftwards black arrow","short":"left black arrow"},"mathspeak":{"sbrief":"L black arrow"}},"key":"2B05"},{"category":"So","mappings":{"default":{"default":"upwards black arrow","short":"up black arrow"},"mathspeak":{"sbrief":"U black arrow"}},"key":"2B06"},{"category":"So","mappings":{"default":{"default":"downwards black arrow","short":"down black arrow"},"mathspeak":{"sbrief":"D black arrow"}},"key":"2B07"},{"category":"So","mappings":{"default":{"default":"north east black arrow"}},"key":"2B08"},{"category":"So","mappings":{"default":{"default":"north west black arrow"}},"key":"2B09"},{"category":"So","mappings":{"default":{"default":"south east black arrow"}},"key":"2B0A"},{"category":"So","mappings":{"default":{"default":"south west black arrow"}},"key":"2B0B"},{"category":"So","mappings":{"default":{"default":"left right black arrow"},"mathspeak":{"sbrief":"L R black arrow"}},"key":"2B0C"},{"category":"So","mappings":{"default":{"default":"up down black arrow"},"mathspeak":{"sbrief":"U D black arrow"}},"key":"2B0D"},{"category":"So","mappings":{"default":{"default":"rightwards arrow with tip downwards","short":"right arrow with tip down"},"mathspeak":{"default":"right-arrow with tip down","sbrief":"R arrow with tip down"}},"key":"2B0E"},{"category":"So","mappings":{"default":{"default":"rightwards arrow with tip upwards","short":"right arrow with tip up"},"mathspeak":{"default":"right-arrow with tip up","sbrief":"R arrow with tip up"}},"key":"2B0F"},{"category":"So","mappings":{"default":{"default":"leftwards arrow with tip downwards","short":"left arrow with tip down"},"mathspeak":{"default":"left-arrow with tip down","sbrief":"L arrow with tip down"}},"key":"2B10"},{"category":"So","mappings":{"default":{"default":"leftwards arrow with tip upwards","short":"left arrow with tip up"},"mathspeak":{"default":"left-arrow with tip up","sbrief":"L arrow with tip up"}},"key":"2B11"},{"category":"Sm","mappings":{"default":{"default":"left arrow with small circle"},"mathspeak":{"default":"left-arrow with small circle","sbrief":"L arrow with small circle"}},"key":"2B30"},{"category":"Sm","mappings":{"default":{"default":"three leftwards arrows","short":"three left arrows"},"mathspeak":{"default":"three left-arrows","sbrief":"three L arrows"}},"key":"2B31"},{"category":"Sm","mappings":{"default":{"default":"left arrow with circled plus"},"mathspeak":{"default":"left-arrow with circled plus","sbrief":"L arrow with circled plus"}},"key":"2B32"},{"category":"Sm","mappings":{"default":{"default":"long leftwards squiggle arrow","short":"long left squiggle arrow"},"mathspeak":{"sbrief":"long l squiggle arrow"}},"key":"2B33"},{"category":"Sm","mappings":{"default":{"default":"leftwards two headed arrow with vertical stroke","short":"left two headed arrow with vertical stroke"},"mathspeak":{"sbrief":"l two headed arrow with vertical stroke"}},"key":"2B34"},{"category":"Sm","mappings":{"default":{"default":"leftwards two headed arrow with double vertical stroke","short":"left two headed arrow with double vertical stroke"},"mathspeak":{"sbrief":"l two headed arrow with double vertical stroke"}},"key":"2B35"},{"category":"Sm","mappings":{"default":{"default":"leftwards two headed arrow from bar","short":"left two headed arrow from bar"},"mathspeak":{"sbrief":"l two headed arrow from bar"}},"key":"2B36"},{"category":"Sm","mappings":{"default":{"default":"leftwards two headed triple dash arrow","short":"left two headed triple dash arrow"},"mathspeak":{"sbrief":"l two headed triple dash arrow"}},"key":"2B37"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow with dotted stem","short":"left arrow with dotted stem"},"mathspeak":{"default":"left-arrow with dotted stem","sbrief":"L arrow with dotted stem"}},"key":"2B38"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow with tail with vertical stroke","short":"left arrow with tail with vertical stroke"},"mathspeak":{"default":"left-arrow with tail with vertical stroke","sbrief":"L arrow with tail with vertical stroke"}},"key":"2B39"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow with tail with double vertical stroke","short":"left arrow with tail with double vertical stroke"},"mathspeak":{"default":"left-arrow with tail with double vertical stroke","sbrief":"L arrow with tail with double vertical stroke"}},"key":"2B3A"},{"category":"Sm","mappings":{"default":{"default":"leftwards two headed arrow with tail","short":"left two headed arrow with tail"},"mathspeak":{"sbrief":"l two headed arrow with tail"}},"key":"2B3B"},{"category":"Sm","mappings":{"default":{"default":"leftwards two headed arrow with tail with vertical stroke","short":"left two headed arrow with tail with vertical stroke"},"mathspeak":{"sbrief":"l two headed arrow with tail with vertical stroke"}},"key":"2B3C"},{"category":"Sm","mappings":{"default":{"default":"leftwards two headed arrow with tail with double vertical stroke","short":"left two headed arrow with tail with double vertical stroke"},"mathspeak":{"sbrief":"l two headed arrow with tail with double vertical stroke"}},"key":"2B3D"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow through x","short":"left arrow through x"},"mathspeak":{"default":"left-arrow through x","sbrief":"L arrow through x"}},"key":"2B3E"},{"category":"Sm","mappings":{"default":{"default":"wave arrow pointing directly left"}},"key":"2B3F"},{"category":"Sm","mappings":{"default":{"default":"equals sign above leftwards arrow","short":"equals sign above left arrow"},"mathspeak":{"default":"equals sign above left-arrow","sbrief":"equals sign above L arrow"}},"key":"2B40"},{"category":"Sm","mappings":{"default":{"default":"reverse tilde operator above leftwards arrow","short":"reverse tilde operator above left arrow"},"mathspeak":{"default":"reverse tilde operator above left-arrow","sbrief":"reverse tilde operator above L arrow"}},"key":"2B41"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow above reverse almost equals","short":"left arrow above reverse almost equals"},"mathspeak":{"default":"left-arrow above reverse almost equals","sbrief":"L arrow above reverse almost equals"}},"key":"2B42"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow through greater than","short":"right arrow through greater than"},"mathspeak":{"default":"right-arrow through greater than","sbrief":"R arrow through greater than"}},"key":"2B43"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow through superset","short":"right arrow through superset"},"mathspeak":{"default":"right-arrow through superset","sbrief":"R arrow through superset"}},"key":"2B44"},{"category":"So","mappings":{"default":{"default":"leftwards quadruple arrow","short":"left quadruple arrow"},"mathspeak":{"sbrief":"l quadrule arrow"}},"key":"2B45"},{"category":"So","mappings":{"default":{"default":"rightwards quadruple arrow","short":"right quadruple arrow"},"mathspeak":{"sbrief":"r quadrule arrow"}},"key":"2B46"},{"category":"Sm","mappings":{"default":{"default":"reverse tilde operator above rightwards arrow","short":"reverse tilde operator above right arrow"},"mathspeak":{"default":"reverse tilde operator above right-arrow","sbrief":"reverse tilde operator above R arrow"}},"key":"2B47"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow above reverse almost equals","short":"right arrow above reverse almost equals"},"mathspeak":{"default":"right-arrow above reverse almost equals","sbrief":"R arrow above reverse almost equals"}},"key":"2B48"},{"category":"Sm","mappings":{"default":{"default":"tilde operator above leftwards arrow","short":"tilde operator above left arrow"},"mathspeak":{"default":"tilde operator above left-arrow","sbrief":"tilde operator above L arrow"}},"key":"2B49"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow above almost equals","short":"left arrow above almost equals"},"mathspeak":{"default":"left-arrow above almost equals","sbrief":"L arrow above almost equals"}},"key":"2B4A"},{"category":"Sm","mappings":{"default":{"default":"leftwards arrow above reverse tilde operator","short":"left arrow above reverse tilde operator"},"mathspeak":{"default":"left-arrow above reverse tilde operator","sbrief":"L arrow above reverse tilde operator"}},"key":"2B4B"},{"category":"Sm","mappings":{"default":{"default":"rightwards arrow above reverse tilde operator","short":"right arrow above reverse tilde operator"},"mathspeak":{"default":"right-arrow above reverse tilde operator","sbrief":"R arrow above reverse tilde operator"}},"key":"2B4C"},{"category":"Sm","mappings":{"default":{"default":"halfwidth leftwards arrow","short":"halfwidth left arrow"},"mathspeak":{"default":"halfwidth left-arrow","sbrief":"halfwidth L arrow"}},"key":"FFE9"},{"category":"Sm","mappings":{"default":{"default":"halfwidth upwards arrow","short":"halfwidth up arrow"},"mathspeak":{"default":"halfwidth up-arrow","sbrief":"halfwidth U arrow"}},"key":"FFEA"},{"category":"Sm","mappings":{"default":{"default":"halfwidth rightwards arrow","short":"halfwidth right arrow"},"mathspeak":{"default":"halfwidth right-arrow","sbrief":"halfwidth R arrow"}},"key":"FFEB"},{"category":"Sm","mappings":{"default":{"default":"halfwidth downwards arrow","short":"halfwidth down arrow"},"mathspeak":{"default":"halfwidth down-arrow","sbrief":"halfwidth D arrow"}},"key":"FFEC"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_characters.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_characters.js
deleted file mode 100644
index 29e8a5f5..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_characters.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","mappings":{"default":{"default":"script small l","short":"script l"}},"key":"2113"},{"category":"Sm","mappings":{"default":{"default":"script capital p","alternative":"script p","short":"script cap p"},"mathspeak":{"default":"script upper P"}},"key":"2118"},{"category":"Ll","mappings":{"default":{"default":"double struck small pi","short":"double struck pi"}},"key":"213C"},{"category":"Ll","mappings":{"default":{"default":"double struck small gamma","short":"double struck gamma"}},"key":"213D"},{"category":"Lu","mappings":{"default":{"default":"double struck capital gamma","short":"double struck cap gamma"},"mathspeak":{"default":"double struck upper Gamma"}},"key":"213E"},{"category":"Lu","mappings":{"default":{"default":"double struck capital pi","short":"double struck cap pi"},"mathspeak":{"default":"double struck upper Pi"}},"key":"213F"},{"category":"Sm","mappings":{"default":{"default":"double struck n ary summation"}},"key":"2140"},{"category":"Lu","mappings":{"default":{"default":"double struck italic capital d","short":"double struck italic cap d"},"mathspeak":{"default":"double struck italic upper D"}},"key":"2145"},{"category":"Ll","mappings":{"default":{"default":"double struck italic small d","short":"double struck italic d"}},"key":"2146"},{"category":"Ll","mappings":{"default":{"default":"double struck italic small e","short":"double struck italic e"}},"key":"2147"},{"category":"Ll","mappings":{"default":{"default":"double struck italic small i","short":"double struck italic i"}},"key":"2148"},{"category":"Ll","mappings":{"default":{"default":"double struck italic small j","short":"double struck italic j"}},"key":"2149"},{"category":"Ll","mappings":{"default":{"default":"italic small dotless i","short":"italic dotless i"}},"key":"1D6A4"},{"category":"Ll","mappings":{"default":{"default":"italic small dotless j","short":"italic dotless j"}},"key":"1D6A5"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_delimiters.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_delimiters.js
deleted file mode 100644
index 37824eac..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_delimiters.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ps","mappings":{"default":{"default":"left parenthesis","alternative":"opening parenthesis"},"mathspeak":{"default":"left-parenthesis","brief":"left-p'ren","sbrief":"L p'ren"}},"key":"0028"},{"category":"Pe","mappings":{"default":{"default":"right parenthesis","alternative":"closing parenthesis"},"mathspeak":{"default":"right-parenthesis","brief":"right-p'ren","sbrief":"R p'ren"}},"key":"0029"},{"category":"Ps","mappings":{"default":{"default":"left square bracket","alternative":"opening square bracket"},"mathspeak":{"default":"left-bracket","brief":"left-brack","sbrief":"L brack"}},"key":"005B"},{"category":"Pe","mappings":{"default":{"default":"right square bracket","alternative":"closing square bracket"},"mathspeak":{"default":"right-bracket","brief":"right-brack","sbrief":"R brack"}},"key":"005D"},{"category":"Ps","mappings":{"default":{"default":"left curly bracket","alternative":"opening curly bracket"},"mathspeak":{"default":"left-brace","sbrief":"L brace"}},"key":"007B"},{"category":"Pe","mappings":{"default":{"default":"right curly bracket","alternative":"closing curly bracket"},"mathspeak":{"default":"right-brace","sbrief":"R brace"}},"key":"007D"},{"category":"Ps","mappings":{"default":{"default":"left square bracket with quill"},"mathspeak":{"default":"left-bracket with quill","brief":"left-brack with quill","sbrief":"L brack with quill"}},"key":"2045"},{"category":"Pe","mappings":{"default":{"default":"right square bracket with quill"},"mathspeak":{"default":"right-bracket with quill","brief":"right-brack with quill","sbrief":"R brack with quill"}},"key":"2046"},{"category":"Sm","mappings":{"default":{"default":"left ceiling"}},"key":"2308"},{"category":"Sm","mappings":{"default":{"default":"right ceiling"}},"key":"2309"},{"category":"Sm","mappings":{"default":{"default":"left floor"}},"key":"230A"},{"category":"Sm","mappings":{"default":{"default":"right floor"}},"key":"230B"},{"category":"So","mappings":{"default":{"default":"bottom right crop"}},"key":"230C"},{"category":"So","mappings":{"default":{"default":"bottom left crop"}},"key":"230D"},{"category":"So","mappings":{"default":{"default":"top right crop"}},"key":"230E"},{"category":"So","mappings":{"default":{"default":"top left crop"}},"key":"230F"},{"category":"So","mappings":{"default":{"default":"top left corner"}},"key":"231C"},{"category":"So","mappings":{"default":{"default":"top right corner"}},"key":"231D"},{"category":"So","mappings":{"default":{"default":"bottom left corner"}},"key":"231E"},{"category":"So","mappings":{"default":{"default":"bottom right corner"}},"key":"231F"},{"category":"Sm","mappings":{"default":{"default":"top half integral"}},"key":"2320"},{"category":"Sm","mappings":{"default":{"default":"bottom half integral"}},"key":"2321"},{"category":"Ps","mappings":{"default":{"default":"left pointing angle bracket","alternative":"bra"},"mathspeak":{"default":"left pointing angle"}},"key":"2329"},{"category":"Pe","mappings":{"default":{"default":"right pointing angle bracket","alternative":"ket"},"mathspeak":{"default":"right pointing angle"}},"key":"232A"},{"category":"Sm","mappings":{"default":{"default":"left parenthesis upper hook"},"mathspeak":{"default":"left-parenthesis upper hook","brief":"left-p'ren upper hook","sbrief":"L p'ren upper hook"}},"key":"239B"},{"category":"Sm","mappings":{"default":{"default":"left parenthesis extension"},"mathspeak":{"default":"left-parenthesis extension","brief":"left-p'ren extension","sbrief":"L p'ren extension"}},"key":"239C"},{"category":"Sm","mappings":{"default":{"default":"left parenthesis lower hook"},"mathspeak":{"default":"left-parenthesis lower hook","brief":"left-p'ren lower hook","sbrief":"L p'ren lower hook"}},"key":"239D"},{"category":"Sm","mappings":{"default":{"default":"right parenthesis upper hook"},"mathspeak":{"default":"right-parenthesis upper hook","brief":"right-p'ren upper hook","sbrief":"R p'ren upper hook"}},"key":"239E"},{"category":"Sm","mappings":{"default":{"default":"right parenthesis extension"},"mathspeak":{"default":"right-parenthesis extension","brief":"right-p'ren extension","sbrief":"R p'ren extension"}},"key":"239F"},{"category":"Sm","mappings":{"default":{"default":"right parenthesis lower hook"},"mathspeak":{"default":"right-parenthesis lower hook","brief":"right-p'ren lower hook","sbrief":"R p'ren lower hook"}},"key":"23A0"},{"category":"Sm","mappings":{"default":{"default":"left square bracket upper corner"},"mathspeak":{"default":"left-bracket upper corner","brief":"left-brack upper corner","sbrief":"L brack upper corner"}},"key":"23A1"},{"category":"Sm","mappings":{"default":{"default":"left square bracket extension"},"mathspeak":{"default":"left-bracket extension","brief":"left-brack extension","sbrief":"L brack extension"}},"key":"23A2"},{"category":"Sm","mappings":{"default":{"default":"left square bracket lower corner"},"mathspeak":{"default":"left-bracket lower corner","brief":"left-brack lower corner","sbrief":"L brack lower corner"}},"key":"23A3"},{"category":"Sm","mappings":{"default":{"default":"right square bracket upper corner"},"mathspeak":{"default":"right-bracket upper corner","brief":"right-brack upper corner","sbrief":"R brack upper corner"}},"key":"23A4"},{"category":"Sm","mappings":{"default":{"default":"right square bracket extension"},"mathspeak":{"default":"right-bracket extension","brief":"right-brack extension","sbrief":"R brack extension"}},"key":"23A5"},{"category":"Sm","mappings":{"default":{"default":"right square bracket lower corner"},"mathspeak":{"default":"right-bracket lower corner","brief":"right-brack lower corner","sbrief":"R brack lower corner"}},"key":"23A6"},{"category":"Sm","mappings":{"default":{"default":"left curly bracket upper hook"},"mathspeak":{"default":"left-brace upper hook","sbrief":"L brace upper hook"}},"key":"23A7"},{"category":"Sm","mappings":{"default":{"default":"left curly bracket middle piece"},"mathspeak":{"default":"left-brace middle piece","sbrief":"L brace middle piece"}},"key":"23A8"},{"category":"Sm","mappings":{"default":{"default":"left curly bracket lower hook"},"mathspeak":{"default":"left-brace lower hook","sbrief":"L brace lower hook"}},"key":"23A9"},{"category":"Sm","mappings":{"default":{"default":"curly bracket extension"},"mathspeak":{"default":"brace extension"}},"key":"23AA"},{"category":"Sm","mappings":{"default":{"default":"right curly bracket upper hook"},"mathspeak":{"default":"right-brace upper hook","sbrief":"R brace upper hook"}},"key":"23AB"},{"category":"Sm","mappings":{"default":{"default":"right curly bracket middle piece"},"mathspeak":{"default":"right-brace middle piece","sbrief":"R brace middle piece"}},"key":"23AC"},{"category":"Sm","mappings":{"default":{"default":"right curly bracket lower hook"},"mathspeak":{"default":"right-brace lower hook","sbrief":"R brace lower hook"}},"key":"23AD"},{"category":"Sm","mappings":{"default":{"default":"integral extension"}},"key":"23AE"},{"category":"Sm","mappings":{"default":{"default":"horizontal line extension"}},"key":"23AF"},{"category":"Sm","mappings":{"default":{"default":"upper left or lower right curly bracket section"},"mathspeak":{"default":"upper left or lower right-brace section"}},"key":"23B0"},{"category":"Sm","mappings":{"default":{"default":"upper right or lower left curly bracket section"},"mathspeak":{"default":"upper right or lower left-brace section"}},"key":"23B1"},{"category":"Sm","mappings":{"default":{"default":"summation top"}},"key":"23B2"},{"category":"Sm","mappings":{"default":{"default":"summation bottom"}},"key":"23B3"},{"category":"So","mappings":{"default":{"default":"top square bracket"},"mathspeak":{"default":"top-bracket","brief":"top-brack","sbrief":"T brack"}},"key":"23B4"},{"category":"So","mappings":{"default":{"default":"bottom square bracket"},"mathspeak":{"default":"bottom-bracket","brief":"bottom-brack","sbrief":"B brack"}},"key":"23B5"},{"category":"So","mappings":{"default":{"default":"bottom square bracket over top square bracket"},"mathspeak":{"default":"bottom-bracket over top-bracket","brief":"bottom-brack over top-brack","sbrief":"B brack over T brack"}},"key":"23B6"},{"category":"So","mappings":{"default":{"default":"radical symbol bottom"}},"key":"23B7"},{"category":"So","mappings":{"default":{"default":"left vertical box line"}},"key":"23B8"},{"category":"So","mappings":{"default":{"default":"right vertical box line"}},"key":"23B9"},{"category":"Sm","mappings":{"default":{"default":"top parenthesis"},"mathspeak":{"default":"top-parenthesis","brief":"top-p'ren","sbrief":"t p'ren"}},"key":"23DC"},{"category":"Sm","mappings":{"default":{"default":"bottom parenthesis"},"mathspeak":{"default":"bottom-parenthesis","brief":"bottom-p'ren","sbrief":"b p'ren"}},"key":"23DD"},{"category":"Sm","mappings":{"default":{"default":"top curly bracket"},"mathspeak":{"default":"top-brace","sbrief":"T brace"}},"key":"23DE"},{"category":"Sm","mappings":{"default":{"default":"bottom curly bracket"},"mathspeak":{"default":"bottom-brace","sbrief":"B brace"}},"key":"23DF"},{"category":"Sm","mappings":{"default":{"default":"top tortoise shell bracket"}},"key":"23E0"},{"category":"Sm","mappings":{"default":{"default":"bottom tortoise shell bracket"}},"key":"23E1"},{"category":"Ps","mappings":{"default":{"default":"medium left parenthesis ornament"},"mathspeak":{"default":"medium left-parenthesis ornament","brief":"medium left-p'ren ornament","sbrief":"medium L p'ren ornament"}},"key":"2768"},{"category":"Pe","mappings":{"default":{"default":"medium right parenthesis ornament"},"mathspeak":{"default":"medium right-parenthesis ornament","brief":"medium right-p'ren ornament","sbrief":"medium R p'ren ornament"}},"key":"2769"},{"category":"Ps","mappings":{"default":{"default":"medium flattened left parenthesis ornament"},"mathspeak":{"default":"medium flattened left-parenthesis ornament","brief":"medium flattened left-p'ren ornament","sbrief":"medium flattened L p'ren ornament"}},"key":"276A"},{"category":"Pe","mappings":{"default":{"default":"medium flattened right parenthesis ornament"},"mathspeak":{"default":"medium flattened right-parenthesis ornament","brief":"medium flattened right-p'ren ornament","sbrief":"medium flattened R p'ren ornament"}},"key":"276B"},{"category":"Ps","mappings":{"default":{"default":"medium left pointing angle bracket ornament"},"mathspeak":{"default":"medium left pointing angle ornament"}},"key":"276C"},{"category":"Pe","mappings":{"default":{"default":"medium right pointing angle bracket ornament"},"mathspeak":{"default":"medium right pointing angle ornament"}},"key":"276D"},{"category":"Ps","mappings":{"default":{"default":"heavy left pointing angle quotation mark ornament"}},"key":"276E"},{"category":"Pe","mappings":{"default":{"default":"heavy right pointing angle quotation mark ornament"}},"key":"276F"},{"category":"Ps","mappings":{"default":{"default":"heavy left pointing angle bracket ornament"},"mathspeak":{"default":"heavy left pointing angle ornament"}},"key":"2770"},{"category":"Pe","mappings":{"default":{"default":"heavy right pointing angle bracket ornament"},"mathspeak":{"default":"heavy right pointing angle ornament"}},"key":"2771"},{"category":"Ps","mappings":{"default":{"default":"light left tortoise shell bracket ornament"}},"key":"2772"},{"category":"Pe","mappings":{"default":{"default":"light right tortoise shell bracket ornament"}},"key":"2773"},{"category":"Ps","mappings":{"default":{"default":"medium left curly bracket ornament"},"mathspeak":{"default":"medium left-brace ornament","sbrief":"medium L brace ornament"}},"key":"2774"},{"category":"Pe","mappings":{"default":{"default":"medium right curly bracket ornament"},"mathspeak":{"default":"medium right-brace ornament","sbrief":"medium R brace ornament"}},"key":"2775"},{"category":"Ps","mappings":{"default":{"default":"left s shaped bag delimiter"}},"key":"27C5"},{"category":"Pe","mappings":{"default":{"default":"right s shaped bag delimiter"}},"key":"27C6"},{"category":"Ps","mappings":{"default":{"default":"mathematical left white square bracket"},"mathspeak":{"default":"mathematical left white bracket"}},"key":"27E6"},{"category":"Pe","mappings":{"default":{"default":"mathematical right white square bracket"},"mathspeak":{"default":"mathematical right white bracket"}},"key":"27E7"},{"category":"Ps","mappings":{"default":{"default":"mathematical left angle bracket"},"mathspeak":{"default":"mathematical left-angle","sbrief":"mathematical l angle"}},"key":"27E8"},{"category":"Pe","mappings":{"default":{"default":"mathematical right angle bracket"},"mathspeak":{"default":"mathematical right-angle","sbrief":"mathematical r angle"}},"key":"27E9"},{"category":"Ps","mappings":{"default":{"default":"mathematical left double angle bracket"},"mathspeak":{"default":"mathematical left double angle"}},"key":"27EA"},{"category":"Pe","mappings":{"default":{"default":"mathematical right double angle bracket"},"mathspeak":{"default":"mathematical right double angle"}},"key":"27EB"},{"category":"Ps","mappings":{"default":{"default":"mathematical left white tortoise shell bracket"}},"key":"27EC"},{"category":"Pe","mappings":{"default":{"default":"mathematical right white tortoise shell bracket"}},"key":"27ED"},{"category":"Ps","mappings":{"default":{"default":"mathematical left flattened parenthesis"},"mathspeak":{"default":"mathematical flattened left-parenthesis","brief":"mathematical flattened left-p'ren","sbrief":"mathematical flattened L p'ren"}},"key":"27EE"},{"category":"Pe","mappings":{"default":{"default":"mathematical right flattened parenthesis"},"mathspeak":{"default":"mathematical flattened right-parenthesis","brief":"mathematical flattened right-p'ren","sbrief":"mathematical flattened R p'ren"}},"key":"27EF"},{"category":"Ps","mappings":{"default":{"default":"left white curly bracket"},"mathspeak":{"default":"left white brace"}},"key":"2983"},{"category":"Pe","mappings":{"default":{"default":"right white curly bracket"},"mathspeak":{"default":"right white brace"}},"key":"2984"},{"category":"Ps","mappings":{"default":{"default":"left white parenthesis"},"mathspeak":{"default":"white left-parenthesis","brief":"white left-p'ren","sbrief":"white L p'ren"}},"key":"2985"},{"category":"Pe","mappings":{"default":{"default":"right white parenthesis"},"mathspeak":{"default":"white right-parenthesis","brief":"white right-p'ren","sbrief":"white R p'ren"}},"key":"2986"},{"category":"Ps","mappings":{"default":{"default":"z notation left image bracket"}},"key":"2987"},{"category":"Pe","mappings":{"default":{"default":"z notation right image bracket"}},"key":"2988"},{"category":"Ps","mappings":{"default":{"default":"z notation left binding bracket"}},"key":"2989"},{"category":"Pe","mappings":{"default":{"default":"z notation right binding bracket"}},"key":"298A"},{"category":"Ps","mappings":{"default":{"default":"left square bracket with underbar"},"mathspeak":{"default":"left-bracket with underbar","brief":"left-brack with underbar","sbrief":"L brack with underbar"}},"key":"298B"},{"category":"Pe","mappings":{"default":{"default":"right square bracket with underbar"},"mathspeak":{"default":"right-bracket with underbar","brief":"right-brack with underbar","sbrief":"R brack with underbar"}},"key":"298C"},{"category":"Ps","mappings":{"default":{"default":"left square bracket with tick in top corner"},"mathspeak":{"default":"left-bracket with tick in top corner","brief":"left-brack with tick in top corner","sbrief":"L brack with tick in top corner"}},"key":"298D"},{"category":"Pe","mappings":{"default":{"default":"right square bracket with tick in bottom corner"},"mathspeak":{"default":"right-bracket with tick in bottom corner","brief":"right-brack with tick in bottom corner","sbrief":"R brack with tick in bottom corner"}},"key":"298E"},{"category":"Ps","mappings":{"default":{"default":"left square bracket with tick in bottom corner"},"mathspeak":{"default":"left-bracket with tick in bottom corner","brief":"left-brack with tick in bottom corner","sbrief":"L brack with tick in bottom corner"}},"key":"298F"},{"category":"Pe","mappings":{"default":{"default":"right square bracket with tick in top corner"},"mathspeak":{"default":"right-bracket with tick in top corner","brief":"right-brack with tick in top corner","sbrief":"R brack with tick in top corner"}},"key":"2990"},{"category":"Ps","mappings":{"default":{"default":"left angle bracket with dot"},"mathspeak":{"default":"left-angle with dot","sbrief":"l angle with dot"}},"key":"2991"},{"category":"Pe","mappings":{"default":{"default":"right angle bracket with dot"},"mathspeak":{"default":"right-angle with dot","sbrief":"r angle with dot"}},"key":"2992"},{"category":"Ps","mappings":{"default":{"default":"left arc less than bracket"}},"key":"2993"},{"category":"Pe","mappings":{"default":{"default":"right arc greater than bracket"}},"key":"2994"},{"category":"Ps","mappings":{"default":{"default":"double left arc greater than bracket"}},"key":"2995"},{"category":"Pe","mappings":{"default":{"default":"double right arc less than bracket"}},"key":"2996"},{"category":"Ps","mappings":{"default":{"default":"left black tortoise shell bracket"}},"key":"2997"},{"category":"Pe","mappings":{"default":{"default":"right black tortoise shell bracket"}},"key":"2998"},{"category":"Ps","mappings":{"default":{"default":"left wiggly fence"}},"key":"29D8"},{"category":"Pe","mappings":{"default":{"default":"right wiggly fence"}},"key":"29D9"},{"category":"Ps","mappings":{"default":{"default":"left double wiggly fence"}},"key":"29DA"},{"category":"Pe","mappings":{"default":{"default":"right double wiggly fence"}},"key":"29DB"},{"category":"Ps","mappings":{"default":{"default":"left pointing curved angle bracket"},"mathspeak":{"default":"left pointing curved angle"}},"key":"29FC"},{"category":"Pe","mappings":{"default":{"default":"right pointing curved angle bracket"},"mathspeak":{"default":"right pointing curved angle"}},"key":"29FD"},{"category":"Ps","mappings":{"default":{"default":"top left half bracket"},"mathspeak":{"default":"top half left-bracket","brief":"top half left-brack","sbrief":"top half L brack"}},"key":"2E22"},{"category":"Pe","mappings":{"default":{"default":"top right half bracket"},"mathspeak":{"default":"top half right-bracket","brief":"top half right-brack","sbrief":"top half R brack"}},"key":"2E23"},{"category":"Ps","mappings":{"default":{"default":"bottom left half bracket"},"mathspeak":{"default":"bottom half left-bracket","brief":"bottom half left-brack","sbrief":"bottom half L brack"}},"key":"2E24"},{"category":"Pe","mappings":{"default":{"default":"bottom right half bracket"},"mathspeak":{"default":"bottom half right-bracket","brief":"bottom half right-brack","sbrief":"bottom half R brack"}},"key":"2E25"},{"category":"Ps","mappings":{"default":{"default":"left sideways U bracket"}},"key":"2E26"},{"category":"Pe","mappings":{"default":{"default":"right sideways U bracket"}},"key":"2E27"},{"category":"Ps","mappings":{"default":{"default":"left double parenthesis"},"mathspeak":{"default":"double left-parenthesis","brief":"double left-p'ren","sbrief":"double L p'ren"}},"key":"2E28"},{"category":"Pe","mappings":{"default":{"default":"right double parenthesis"},"mathspeak":{"default":"double right-parenthesis","brief":"double right-p'ren","sbrief":"double R p'ren"}},"key":"2E29"},{"category":"Ps","mappings":{"default":{"default":"left angle bracket","alternative":"opening angle bracket"},"mathspeak":{"default":"left-angle","sbrief":"l angle"}},"key":"3008"},{"category":"Pe","mappings":{"default":{"default":"right angle bracket","alternative":"closing angle bracket"},"mathspeak":{"default":"right-angle","sbrief":"r angle"}},"key":"3009"},{"category":"Ps","mappings":{"default":{"default":"left double angle bracket","alternative":"opening double angle bracket"},"mathspeak":{"default":"left double angle"}},"key":"300A"},{"category":"Pe","mappings":{"default":{"default":"right double angle bracket","alternative":"closing double angle bracket"},"mathspeak":{"default":"right double angle"}},"key":"300B"},{"category":"Ps","mappings":{"default":{"default":"left corner bracket","alternative":"opening corner bracket"}},"key":"300C"},{"category":"Pe","mappings":{"default":{"default":"right corner bracket","alternative":"closing corner bracket"}},"key":"300D"},{"category":"Ps","mappings":{"default":{"default":"left white corner bracket","alternative":"opening white corner bracket"}},"key":"300E"},{"category":"Pe","mappings":{"default":{"default":"right white corner bracket","alternative":"closing white corner bracket"}},"key":"300F"},{"category":"Ps","mappings":{"default":{"default":"left black lenticular bracket","alternative":"opening black lenticular bracket"}},"key":"3010"},{"category":"Pe","mappings":{"default":{"default":"right black lenticular bracket","alternative":"closing black lenticular bracket"}},"key":"3011"},{"category":"Ps","mappings":{"default":{"default":"left tortoise shell bracket","alternative":"opening tortoise shell bracket"}},"key":"3014"},{"category":"Pe","mappings":{"default":{"default":"right tortoise shell bracket","alternative":"closing tortoise shell bracket"}},"key":"3015"},{"category":"Ps","mappings":{"default":{"default":"left white lenticular bracket","alternative":"opening white lenticular bracket"}},"key":"3016"},{"category":"Pe","mappings":{"default":{"default":"right white lenticular bracket","alternative":"closing white lenticular bracket"}},"key":"3017"},{"category":"Ps","mappings":{"default":{"default":"left white tortoise shell bracket","alternative":"opening white tortoise shell bracket"}},"key":"3018"},{"category":"Pe","mappings":{"default":{"default":"right white tortoise shell bracket","alternative":"closing white tortoise shell bracket"}},"key":"3019"},{"category":"Ps","mappings":{"default":{"default":"left white square bracket","alternative":"opening white square bracket"},"mathspeak":{"default":"left white bracket"}},"key":"301A"},{"category":"Pe","mappings":{"default":{"default":"right white square bracket","alternative":"closing white square bracket"},"mathspeak":{"default":"right white bracket"}},"key":"301B"},{"category":"Ps","mappings":{"default":{"default":"reversed double prime quotation mark"}},"key":"301D"},{"category":"Pe","mappings":{"default":{"default":"double prime quotation mark"}},"key":"301E"},{"category":"Pe","mappings":{"default":{"default":"low double prime quotation mark"}},"key":"301F"},{"category":"Ps","mappings":{"default":{"default":"ornate left parenthesis"},"mathspeak":{"default":"ornate left-parenthesis","brief":"ornate left-p'ren","sbrief":"ornate L p'ren"}},"key":"FD3E"},{"category":"Pe","mappings":{"default":{"default":"ornate right parenthesis"},"mathspeak":{"default":"ornate right-parenthesis","brief":"ornate right-p'ren","sbrief":"ornate R p'ren"}},"key":"FD3F"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left white lenticular bracket"}},"key":"FE17"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right white lenticular brakcet"}},"key":"FE18"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left parenthesis","alternative":"glyph for vertical opening parenthesis"},"mathspeak":{"default":"presentation form for vertical left-parenthesis","brief":"presentation form for vertical left-p'ren","sbrief":"presentation form for vertical L p'ren"}},"key":"FE35"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right parenthesis","alternative":"glyph for vertical closing parenthesis"},"mathspeak":{"default":"presentation form for vertical right-parenthesis","brief":"presentation form for vertical right-p'ren","sbrief":"presentation form for vertical R p'ren"}},"key":"FE36"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left curly bracket","alternative":"glyph for vertical opening curly bracket"},"mathspeak":{"default":"presentation form for vertical left-brace","sbrief":"presentation form for vertical L brace"}},"key":"FE37"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right curly bracket","alternative":"glyph for vertical closing curly bracket"},"mathspeak":{"default":"presentation form for vertical right-brace","sbrief":"presentation form for vertical r brace"}},"key":"FE38"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left tortoise shell bracket","alternative":"glyph for vertical opening tortoise shell bracket"}},"key":"FE39"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right tortoise shell bracket","alternative":"glyph for vertical closing tortoise shell bracket"}},"key":"FE3A"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left black lenticular bracket","alternative":"glyph for vertical opening black lenticular bracket"}},"key":"FE3B"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right black lenticular bracket","alternative":"glyph for vertical closing black lenticular bracket"}},"key":"FE3C"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left double angle bracket","alternative":"glyph for vertical opening double angle bracket"},"mathspeak":{"default":"presentation form for vertical left double angle"}},"key":"FE3D"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right double angle bracket","alternative":"glyph for vertical closing double angle bracket"},"mathspeak":{"default":"presentation form for vertical right double angle"}},"key":"FE3E"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left angle bracket","alternative":"glyph for vertical opening angle bracket"},"mathspeak":{"default":"presentation form for vertical left-angle","sbrief":"presentation form for vertical l angle"}},"key":"FE3F"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right angle bracket","alternative":"glyph for vertical closing angle bracket"},"mathspeak":{"default":"presentation form for vertical right-angle","sbrief":"presentation form for vertical r angle"}},"key":"FE40"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left corner bracket","alternative":"glyph for vertical opening corner bracket"}},"key":"FE41"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right corner bracket","alternative":"glyph for vertical closing corner bracket"}},"key":"FE42"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left white corner bracket","alternative":"glyph for vertical opening white corner bracket"}},"key":"FE43"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right white corner bracket","alternative":"glyph for vertical closing white corner bracket"}},"key":"FE44"},{"category":"Ps","mappings":{"default":{"default":"presentation form for vertical left square bracket"},"mathspeak":{"default":"presentation form for vertical left-bracket","brief":"presentation form for vertical left-brack","sbrief":"presentation form for vertical L brack"}},"key":"FE47"},{"category":"Pe","mappings":{"default":{"default":"presentation form for vertical right square bracket"},"mathspeak":{"default":"presentation form for vertical right-bracket","brief":"presentation form for vertical right-brack","sbrief":"presentation form for vertical r brack"}},"key":"FE48"},{"category":"Ps","mappings":{"default":{"default":"small left parenthesis","alternative":"small opening parenthesis"},"mathspeak":{"default":"small left-parenthesis","brief":"small left-p'ren","sbrief":"small L p'ren"}},"key":"FE59"},{"category":"Pe","mappings":{"default":{"default":"small right parenthesis","alternative":"small closing parenthesis"},"mathspeak":{"default":"small right-parenthesis","brief":"small right-p'ren","sbrief":"small R p'ren"}},"key":"FE5A"},{"category":"Ps","mappings":{"default":{"default":"small left curly bracket","alternative":"small opening curly bracket"},"mathspeak":{"default":"small left-brace","sbrief":"small L brace"}},"key":"FE5B"},{"category":"Pe","mappings":{"default":{"default":"small right curly bracket","alternative":"small closing curly bracket"},"mathspeak":{"default":"small right-brace","sbrief":"small r brace"}},"key":"FE5C"},{"category":"Ps","mappings":{"default":{"default":"small left tortoise shell bracket","alternative":"small opening tortoise shell bracket"}},"key":"FE5D"},{"category":"Pe","mappings":{"default":{"default":"small right tortoise shell bracket","alternative":"small closing tortoise shell bracket"}},"key":"FE5E"},{"category":"Ps","mappings":{"default":{"default":"fullwidth left parenthesis","alternative":"fullwidth opening parenthesis"},"mathspeak":{"default":"fullwidth left-parenthesis","brief":"fullwidth left-p'ren","sbrief":"fullwidth L p'ren"}},"key":"FF08"},{"category":"Pe","mappings":{"default":{"default":"fullwidth right parenthesis","alternative":"fullwidth closing parenthesis"},"mathspeak":{"default":"fullwidth right-parenthesis","brief":"fullwidth right-p'ren","sbrief":"fullwidth R p'ren"}},"key":"FF09"},{"category":"Ps","mappings":{"default":{"default":"fullwidth left square bracket","alternative":"fullwidth opening square bracket"},"mathspeak":{"default":"fullwidth left-bracket","brief":"fullwidth left-brack","sbrief":"fullwidth L brack"}},"key":"FF3B"},{"category":"Pe","mappings":{"default":{"default":"fullwidth right square bracket","alternative":"fullwidth closing square bracket"},"mathspeak":{"default":"fullwidth right-bracket","brief":"fullwidth right-brack","sbrief":"fullwidth r brack"}},"key":"FF3D"},{"category":"Ps","mappings":{"default":{"default":"fullwidth left curly bracket","alternative":"fullwidth opening curly bracket"},"mathspeak":{"default":"fullwidth left-brace","sbrief":"fullwidth L brace"}},"key":"FF5B"},{"category":"Pe","mappings":{"default":{"default":"fullwidth right curly bracket","alternative":"fullwidth closing curly bracket"},"mathspeak":{"default":"fullwidth right-brace","sbrief":"fullwidth r brace"}},"key":"FF5D"},{"category":"Ps","mappings":{"default":{"default":"fullwidth white left parenthesis"},"mathspeak":{"default":"fullwidth white left-parenthesis","brief":"fullwidth white left-p'ren","sbrief":"fullwidth white L p'ren"}},"key":"FF5F"},{"category":"Pe","mappings":{"default":{"default":"fullwidth white right parenthesis"},"mathspeak":{"default":"fullwidth white right-parenthesis","brief":"fullwidth white right-p'ren","sbrief":"fullwidth white R p'ren"}},"key":"FF60"},{"category":"Ps","mappings":{"default":{"default":"halfwidth left corner bracket","alternative":"halfwidth opening corner bracket"}},"key":"FF62"},{"category":"Pe","mappings":{"default":{"default":"halfwidth right corner bracket","alternative":"halfwidth closing corner bracket"}},"key":"FF63"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_digits.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_digits.js
deleted file mode 100644
index 771d54b6..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_digits.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Nd","mappings":{"default":{"default":"digit zero","short":"zero"},"mathspeak":{"default":"0"}},"key":"0030"},{"category":"Nd","mappings":{"default":{"default":"digit one","short":"one"},"mathspeak":{"default":"1"}},"key":"0031"},{"category":"Nd","mappings":{"default":{"default":"digit two","short":"two"},"mathspeak":{"default":"2"}},"key":"0032"},{"category":"Nd","mappings":{"default":{"default":"digit three","short":"three"},"mathspeak":{"default":"3"}},"key":"0033"},{"category":"Nd","mappings":{"default":{"default":"digit four","short":"four"},"mathspeak":{"default":"4"}},"key":"0034"},{"category":"Nd","mappings":{"default":{"default":"digit five","short":"five"},"mathspeak":{"default":"5"}},"key":"0035"},{"category":"Nd","mappings":{"default":{"default":"digit six","short":"six"},"mathspeak":{"default":"6"}},"key":"0036"},{"category":"Nd","mappings":{"default":{"default":"digit seven","short":"seven"},"mathspeak":{"default":"7"}},"key":"0037"},{"category":"Nd","mappings":{"default":{"default":"digit eight","short":"eight"},"mathspeak":{"default":"8"}},"key":"0038"},{"category":"Nd","mappings":{"default":{"default":"digit nine","short":"nine"},"mathspeak":{"default":"9"}},"key":"0039"},{"category":"No","mappings":{"default":{"default":"superscript digit two","alternative":"superscript two","short":"square"},"mathspeak":{"default":"9"}},"key":"00B2"},{"category":"No","mappings":{"default":{"default":"superscript digit three","alternative":"superscript three","short":"cube"}},"key":"00B3"},{"category":"No","mappings":{"default":{"default":"superscript digit one","alternative":"superscript one","short":"super one"}},"key":"00B9"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one quarter","alternative":"fraction one quarter","short":"one quarter"}},"key":"00BC"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one half","alternative":"fraction one half","short":"one half"}},"key":"00BD"},{"category":"No","mappings":{"default":{"default":"vulgar fraction three quarters","alternative":"fraction three quarters","short":"three quarters"}},"key":"00BE"},{"category":"No","mappings":{"default":{"default":"superscript zero","short":"super zero"}},"key":"2070"},{"category":"No","mappings":{"default":{"default":"superscript digit four","alternative":"superscript four","short":"super four"}},"key":"2074"},{"category":"No","mappings":{"default":{"default":"superscript digit five","alternative":"superscript five","short":"super five"}},"key":"2075"},{"category":"No","mappings":{"default":{"default":"superscript digit six","alternative":"superscript six","short":"super six"}},"key":"2076"},{"category":"No","mappings":{"default":{"default":"superscript digit seven","alternative":"superscript seven","short":"super seven"}},"key":"2077"},{"category":"No","mappings":{"default":{"default":"superscript digit eight","alternative":"superscript eight","short":"super eight"}},"key":"2078"},{"category":"No","mappings":{"default":{"default":"superscript digit nine","alternative":"superscript nine","short":"super nine"}},"key":"2079"},{"category":"No","mappings":{"default":{"default":"subscript digit zero","alternative":"subscript zero","short":"sub zero"}},"key":"2080"},{"category":"No","mappings":{"default":{"default":"subscript digit one","alternative":"subscript one","short":"sub one"}},"key":"2081"},{"category":"No","mappings":{"default":{"default":"subscript digit two","alternative":"subscript two","short":"sub two"}},"key":"2082"},{"category":"No","mappings":{"default":{"default":"subscript digit three","alternative":"subscript three","short":"sub three"}},"key":"2083"},{"category":"No","mappings":{"default":{"default":"subscript digit four","alternative":"subscript four","short":"sub four"}},"key":"2084"},{"category":"No","mappings":{"default":{"default":"subscript digit five","alternative":"subscript five","short":"sub five"}},"key":"2085"},{"category":"No","mappings":{"default":{"default":"subscript digit six","alternative":"subscript six","short":"sub six"}},"key":"2086"},{"category":"No","mappings":{"default":{"default":"subscript digit seven","alternative":"subscript seven","short":"sub seven"}},"key":"2087"},{"category":"No","mappings":{"default":{"default":"subscript digit eight","alternative":"subscript eight","short":"sub eight"}},"key":"2088"},{"category":"No","mappings":{"default":{"default":"subscript digit nine","alternative":"subscript nine","short":"sub nine"}},"key":"2089"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one seventh","short":"one seventh"}},"key":"2150"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one ninth","short":"one ninth"}},"key":"2151"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one tenth","short":"one tenth"}},"key":"2152"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one third","alternative":"fraction one third","short":"one third"}},"key":"2153"},{"category":"No","mappings":{"default":{"default":"vulgar fraction two thirds","alternative":"fraction two thirds","short":"two thirds"}},"key":"2154"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one fifth","alternative":"fraction one fifth","short":"one fifth"}},"key":"2155"},{"category":"No","mappings":{"default":{"default":"vulgar fraction two fifths","alternative":"fraction two fifths","short":"two fifths"}},"key":"2156"},{"category":"No","mappings":{"default":{"default":"vulgar fraction three fifths","alternative":"fraction three fifths","short":"three fifths"}},"key":"2157"},{"category":"No","mappings":{"default":{"default":"vulgar fraction four fifths","alternative":"fraction four fifths","short":"four fifths"}},"key":"2158"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one sixth","alternative":"fraction one sixth","short":"one sixth"}},"key":"2159"},{"category":"No","mappings":{"default":{"default":"vulgar fraction five sixths","alternative":"fraction five sixths","short":"five sixths"}},"key":"215A"},{"category":"No","mappings":{"default":{"default":"vulgar fraction one eighth","alternative":"fraction one eighth","short":"one eighth"}},"key":"215B"},{"category":"No","mappings":{"default":{"default":"vulgar fraction three eighths","alternative":"fraction three eighths","short":"three eighths"}},"key":"215C"},{"category":"No","mappings":{"default":{"default":"vulgar fraction five eighths","alternative":"fraction five eighths","short":"five eighths"}},"key":"215D"},{"category":"No","mappings":{"default":{"default":"vulgar fraction seven eighths","alternative":"fraction seven eighths","short":"seven eighths"}},"key":"215E"},{"category":"No","mappings":{"default":{"default":"fraction numerator one","short":"numerator one"}},"key":"215F"},{"category":"No","mappings":{"default":{"default":"vulgar fraction zero thirds","short":"zero thirds"}},"key":"2189"},{"category":"No","mappings":{"default":{"default":"circled digit one","short":"circled one"},"mathspeak":{"default":"circled 1"}},"key":"2460"},{"category":"No","mappings":{"default":{"default":"circled digit two","short":"circled two"},"mathspeak":{"default":"circled 2"}},"key":"2461"},{"category":"No","mappings":{"default":{"default":"circled digit three","short":"circled three"},"mathspeak":{"default":"circled 3"}},"key":"2462"},{"category":"No","mappings":{"default":{"default":"circled digit four","short":"circled four"},"mathspeak":{"default":"circled 4"}},"key":"2463"},{"category":"No","mappings":{"default":{"default":"circled digit five","short":"circled five"},"mathspeak":{"default":"circled 5"}},"key":"2464"},{"category":"No","mappings":{"default":{"default":"circled digit six","short":"circled six"},"mathspeak":{"default":"circled 6"}},"key":"2465"},{"category":"No","mappings":{"default":{"default":"circled digit seven","short":"circled seven"},"mathspeak":{"default":"circled 7"}},"key":"2466"},{"category":"No","mappings":{"default":{"default":"circled digit eight","short":"circled eight"},"mathspeak":{"default":"circled 8"}},"key":"2467"},{"category":"No","mappings":{"default":{"default":"circled digit nine","short":"circled nine"},"mathspeak":{"default":"circled 9"}},"key":"2468"},{"category":"No","mappings":{"default":{"default":"circled number ten","short":"circled ten"},"mathspeak":{"default":"circled 10"}},"key":"2469"},{"category":"No","mappings":{"default":{"default":"circled number eleven","short":"circled eleven"},"mathspeak":{"default":"circled 11"}},"key":"246A"},{"category":"No","mappings":{"default":{"default":"circled number twelve","short":"circled twelve"},"mathspeak":{"default":"circled 12"}},"key":"246B"},{"category":"No","mappings":{"default":{"default":"circled number thirteen","short":"circled thirteen"},"mathspeak":{"default":"circled 13"}},"key":"246C"},{"category":"No","mappings":{"default":{"default":"circled number fourteen","short":"circled fourteen"},"mathspeak":{"default":"circled 14"}},"key":"246D"},{"category":"No","mappings":{"default":{"default":"circled number fifteen","short":"circled fifteen"},"mathspeak":{"default":"circled 15"}},"key":"246E"},{"category":"No","mappings":{"default":{"default":"circled number sixteen","short":"circled sixteen"},"mathspeak":{"default":"circled 16"}},"key":"246F"},{"category":"No","mappings":{"default":{"default":"circled number seventeen","short":"circled seventeen"},"mathspeak":{"default":"circled 17"}},"key":"2470"},{"category":"No","mappings":{"default":{"default":"circled number eighteen","short":"circled eighteen"},"mathspeak":{"default":"circled 18"}},"key":"2471"},{"category":"No","mappings":{"default":{"default":"circled number nineteen","short":"circled nineteen"},"mathspeak":{"default":"circled 19"}},"key":"2472"},{"category":"No","mappings":{"default":{"default":"circled number twenty","short":"circled twenty"},"mathspeak":{"default":"circled 20"}},"key":"2473"},{"category":"No","mappings":{"default":{"default":"parenthesized digit one","short":"parenthesized one"},"mathspeak":{"default":"parenthesized 1"}},"key":"2474"},{"category":"No","mappings":{"default":{"default":"parenthesized digit two","short":"parenthesized two"},"mathspeak":{"default":"parenthesized 2"}},"key":"2475"},{"category":"No","mappings":{"default":{"default":"parenthesized digit three","short":"parenthesized three"},"mathspeak":{"default":"parenthesized 3"}},"key":"2476"},{"category":"No","mappings":{"default":{"default":"parenthesized digit four","short":"parenthesized four"},"mathspeak":{"default":"parenthesized 4"}},"key":"2477"},{"category":"No","mappings":{"default":{"default":"parenthesized digit five","short":"parenthesized five"},"mathspeak":{"default":"parenthesized 5"}},"key":"2478"},{"category":"No","mappings":{"default":{"default":"parenthesized digit six","short":"parenthesized six"},"mathspeak":{"default":"parenthesized 6"}},"key":"2479"},{"category":"No","mappings":{"default":{"default":"parenthesized digit seven","short":"parenthesized seven"},"mathspeak":{"default":"parenthesized 7"}},"key":"247A"},{"category":"No","mappings":{"default":{"default":"parenthesized digit eight","short":"parenthesized eight"},"mathspeak":{"default":"parenthesized 8"}},"key":"247B"},{"category":"No","mappings":{"default":{"default":"parenthesized digit nine","short":"parenthesized nine"},"mathspeak":{"default":"parenthesized 9"}},"key":"247C"},{"category":"No","mappings":{"default":{"default":"parenthesized number ten","short":"parenthesized ten"},"mathspeak":{"default":"parenthesized 10"}},"key":"247D"},{"category":"No","mappings":{"default":{"default":"parenthesized number eleven","short":"parenthesized eleven"},"mathspeak":{"default":"parenthesized 11"}},"key":"247E"},{"category":"No","mappings":{"default":{"default":"parenthesized number twelve","short":"parenthesized twelve"},"mathspeak":{"default":"parenthesized 12"}},"key":"247F"},{"category":"No","mappings":{"default":{"default":"parenthesized number thirteen","short":"parenthesized thirteen"},"mathspeak":{"default":"parenthesized 13"}},"key":"2480"},{"category":"No","mappings":{"default":{"default":"parenthesized number fourteen","short":"parenthesized fourteen"},"mathspeak":{"default":"parenthesized 14"}},"key":"2481"},{"category":"No","mappings":{"default":{"default":"parenthesized number fifteen","short":"parenthesized fifteen"},"mathspeak":{"default":"parenthesized 15"}},"key":"2482"},{"category":"No","mappings":{"default":{"default":"parenthesized number sixteen","short":"parenthesized sixteen"},"mathspeak":{"default":"parenthesized 16"}},"key":"2483"},{"category":"No","mappings":{"default":{"default":"parenthesized number seventeen","short":"parenthesized seventeen"},"mathspeak":{"default":"parenthesized 17"}},"key":"2484"},{"category":"No","mappings":{"default":{"default":"parenthesized number eighteen","short":"parenthesized eighteen"},"mathspeak":{"default":"parenthesized 18"}},"key":"2485"},{"category":"No","mappings":{"default":{"default":"parenthesized number nineteen","short":"parenthesized nineteen"},"mathspeak":{"default":"parenthesized 19"}},"key":"2486"},{"category":"No","mappings":{"default":{"default":"parenthesized number twenty","short":"parenthesized twenty"},"mathspeak":{"default":"parenthesized 20"}},"key":"2487"},{"category":"No","mappings":{"default":{"default":"digit one full stop","alternative":"digit one period","short":"one period"},"mathspeak":{"default":"1 period"}},"key":"2488"},{"category":"No","mappings":{"default":{"default":"digit two full stop","alternative":"digit two period","short":"two period"},"mathspeak":{"default":"2 period"}},"key":"2489"},{"category":"No","mappings":{"default":{"default":"digit three full stop","alternative":"digit three period","short":"three period"},"mathspeak":{"default":"3 period"}},"key":"248A"},{"category":"No","mappings":{"default":{"default":"digit four full stop","alternative":"digit four period","short":"four period"},"mathspeak":{"default":"4 period"}},"key":"248B"},{"category":"No","mappings":{"default":{"default":"digit five full stop","alternative":"digit five period","short":"five period"},"mathspeak":{"default":"5 period"}},"key":"248C"},{"category":"No","mappings":{"default":{"default":"digit six full stop","alternative":"digit six period","short":"six period"},"mathspeak":{"default":"6 period"}},"key":"248D"},{"category":"No","mappings":{"default":{"default":"digit seven full stop","alternative":"digit seven period","short":"seven period"},"mathspeak":{"default":"7 period"}},"key":"248E"},{"category":"No","mappings":{"default":{"default":"digit eight full stop","alternative":"digit eight period","short":"eight period"},"mathspeak":{"default":"8 period"}},"key":"248F"},{"category":"No","mappings":{"default":{"default":"digit nine full stop","alternative":"digit nine period","short":"nine period"},"mathspeak":{"default":"9 period"}},"key":"2490"},{"category":"No","mappings":{"default":{"default":"number ten full stop","alternative":"number ten period","short":"ten period"},"mathspeak":{"default":"10 period"}},"key":"2491"},{"category":"No","mappings":{"default":{"default":"number eleven full stop","alternative":"number eleven period","short":"eleven period"},"mathspeak":{"default":"11 period"}},"key":"2492"},{"category":"No","mappings":{"default":{"default":"number twelve full stop","alternative":"number twelve period","short":"twelve period"},"mathspeak":{"default":"12 period"}},"key":"2493"},{"category":"No","mappings":{"default":{"default":"number thirteen full stop","alternative":"number thirteen period","short":"thirteen period"},"mathspeak":{"default":"13 period"}},"key":"2494"},{"category":"No","mappings":{"default":{"default":"number fourteen full stop","alternative":"number fourteen period","short":"fourteen period"},"mathspeak":{"default":"14 period"}},"key":"2495"},{"category":"No","mappings":{"default":{"default":"number fifteen full stop","alternative":"number fifteen period","short":"fifteen period"},"mathspeak":{"default":"15 period"}},"key":"2496"},{"category":"No","mappings":{"default":{"default":"number sixteen full stop","alternative":"number sixteen period","short":"sixteen period"},"mathspeak":{"default":"16 period"}},"key":"2497"},{"category":"No","mappings":{"default":{"default":"number seventeen full stop","alternative":"number seventeen period","short":"seventeen period"},"mathspeak":{"default":"17 period"}},"key":"2498"},{"category":"No","mappings":{"default":{"default":"number eighteen full stop","alternative":"number eighteen period","short":"eighteen period"},"mathspeak":{"default":"18 period"}},"key":"2499"},{"category":"No","mappings":{"default":{"default":"number nineteen full stop","alternative":"number nineteen period","short":"nineteen period"},"mathspeak":{"default":"19 period"}},"key":"249A"},{"category":"No","mappings":{"default":{"default":"number twenty full stop","alternative":"number twenty period","short":"twenty period"},"mathspeak":{"default":"20 period"}},"key":"249B"},{"category":"No","mappings":{"default":{"default":"circled digit zero","short":"circled zero"},"mathspeak":{"default":"circled 0"}},"key":"24EA"},{"category":"No","mappings":{"default":{"default":"negative circled number eleven","short":"negative circled eleven"},"mathspeak":{"default":"negative circled 11"}},"key":"24EB"},{"category":"No","mappings":{"default":{"default":"negative circled number twelve","short":"negative circled twelve"},"mathspeak":{"default":"negative circled 12"}},"key":"24EC"},{"category":"No","mappings":{"default":{"default":"negative circled number thirteen","short":"negative circled thirteen"},"mathspeak":{"default":"negative circled 13"}},"key":"24ED"},{"category":"No","mappings":{"default":{"default":"negative circled number fourteen","short":"negative circled fourteen"},"mathspeak":{"default":"negative circled 14"}},"key":"24EE"},{"category":"No","mappings":{"default":{"default":"negative circled number fifteen","short":"negative circled fifteen"},"mathspeak":{"default":"negative circled 15"}},"key":"24EF"},{"category":"No","mappings":{"default":{"default":"negative circled number sixteen","short":"negative circled sixteen"},"mathspeak":{"default":"negative circled 16"}},"key":"24F0"},{"category":"No","mappings":{"default":{"default":"negative circled number seventeen","short":"negative circled seventeen"},"mathspeak":{"default":"negative circled 17"}},"key":"24F1"},{"category":"No","mappings":{"default":{"default":"negative circled number eighteen","short":"negative circled eighteen"},"mathspeak":{"default":"negative circled 18"}},"key":"24F2"},{"category":"No","mappings":{"default":{"default":"negative circled number nineteen","short":"negative circled nineteen"},"mathspeak":{"default":"negative circled 19"}},"key":"24F3"},{"category":"No","mappings":{"default":{"default":"negative circled number twenty","short":"negative circled twenty"},"mathspeak":{"default":"negative circled 20"}},"key":"24F4"},{"category":"No","mappings":{"default":{"default":"double circled digit one","short":"double circled one"},"mathspeak":{"default":"double circled 1"}},"key":"24F5"},{"category":"No","mappings":{"default":{"default":"double circled digit two","short":"double circled two"},"mathspeak":{"default":"double circled 2"}},"key":"24F6"},{"category":"No","mappings":{"default":{"default":"double circled digit three","short":"double circled three"},"mathspeak":{"default":"double circled 3"}},"key":"24F7"},{"category":"No","mappings":{"default":{"default":"double circled digit four","short":"double circled four"},"mathspeak":{"default":"double circled 4"}},"key":"24F8"},{"category":"No","mappings":{"default":{"default":"double circled digit five","short":"double circled five"},"mathspeak":{"default":"double circled 5"}},"key":"24F9"},{"category":"No","mappings":{"default":{"default":"double circled digit six","short":"double circled six"},"mathspeak":{"default":"double circled 6"}},"key":"24FA"},{"category":"No","mappings":{"default":{"default":"double circled digit seven","short":"double circled seven"},"mathspeak":{"default":"double circled 7"}},"key":"24FB"},{"category":"No","mappings":{"default":{"default":"double circled digit eight","short":"double circled eight"},"mathspeak":{"default":"double circled 8"}},"key":"24FC"},{"category":"No","mappings":{"default":{"default":"double circled digit nine","short":"double circled nine"},"mathspeak":{"default":"double circled 9"}},"key":"24FD"},{"category":"No","mappings":{"default":{"default":"double circled number ten","short":"double circled ten"},"mathspeak":{"default":"double circled 10"}},"key":"24FE"},{"category":"No","mappings":{"default":{"default":"negative circled digit zero","short":"negative circled zero"},"mathspeak":{"default":"negative circled 0"}},"key":"24FF"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit one","alternative":"inverse circled digit one","short":"inverse circled one"},"mathspeak":{"default":"inverse circled 1"}},"key":"2776"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit two","alternative":"inverse circled digit two","short":"inverse circled two"},"mathspeak":{"default":"inverse circled 2"}},"key":"2777"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit three","alternative":"inverse circled digit three","short":"inverse circled three"},"mathspeak":{"default":"inverse circled 3"}},"key":"2778"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit four","alternative":"inverse circled digit four","short":"inverse circled four"},"mathspeak":{"default":"inverse circled 4"}},"key":"2779"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit five","alternative":"inverse circled digit five","short":"inverse circled five"},"mathspeak":{"default":"inverse circled 5"}},"key":"277A"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit six","alternative":"inverse circled digit six","short":"inverse circled six"},"mathspeak":{"default":"inverse circled 6"}},"key":"277B"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit seven","alternative":"inverse circled digit seven","short":"inverse circled seven"},"mathspeak":{"default":"inverse circled 7"}},"key":"277C"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit eight","alternative":"inverse circled digit eight","short":"inverse circled eight"},"mathspeak":{"default":"inverse circled 8"}},"key":"277D"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled digit nine","alternative":"inverse circled digit nine","short":"inverse circled nine"},"mathspeak":{"default":"inverse circled 9"}},"key":"277E"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled number ten","alternative":"inverse circled number ten","short":"inverse circled ten"},"mathspeak":{"default":"inverse circled 10"}},"key":"277F"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit one","alternative":"circled sans serif digit one","short":"circled one"}},"key":"2780"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit two","alternative":"circled sans serif digit two","short":"circled two"}},"key":"2781"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit three","alternative":"circled sans serif digit three","short":"circled three"}},"key":"2782"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit four","alternative":"circled sans serif digit four","short":"circled four"}},"key":"2783"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit five","alternative":"circled sans serif digit five","short":"circled five"}},"key":"2784"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit six","alternative":"circled sans serif digit six","short":"circled six"}},"key":"2785"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit seven","alternative":"circled sans serif digit seven","short":"circled seven"}},"key":"2786"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit eight","alternative":"circled sans serif digit eight","short":"circled eight"}},"key":"2787"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif digit nine","alternative":"circled sans serif digit nine","short":"circled nine"}},"key":"2788"},{"category":"No","mappings":{"default":{"default":"dingbat circled sans serif number ten","alternative":"circled sans serif number ten","short":"circled ten"}},"key":"2789"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit one","alternative":"inverse circled sans serif digit one","short":"inverse circled one"},"mathspeak":{"default":"inverse circled 1"}},"key":"278A"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit two","alternative":"inverse circled sans serif digit two","short":"inverse circled two"},"mathspeak":{"default":"inverse circled 2"}},"key":"278B"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit three","alternative":"inverse circled sans serif digit three","short":"inverse circled three"},"mathspeak":{"default":"inverse circled 3"}},"key":"278C"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit four","alternative":"inverse circled sans serif digit four","short":"inverse circled four"},"mathspeak":{"default":"inverse circled 4"}},"key":"278D"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit five","alternative":"inverse circled sans serif digit five","short":"inverse circled five"},"mathspeak":{"default":"inverse circled 5"}},"key":"278E"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit six","alternative":"inverse circled sans serif digit six","short":"inverse circled six"},"mathspeak":{"default":"inverse circled 6"}},"key":"278F"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit seven","alternative":"inverse circled sans serif digit seven","short":"inverse circled seven"},"mathspeak":{"default":"inverse circled 7"}},"key":"2790"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit eight","alternative":"inverse circled sans serif digit eight","short":"inverse circled eight"},"mathspeak":{"default":"inverse circled 8"}},"key":"2791"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif digit nine","alternative":"inverse circled sans serif digit nine","short":"inverse circled nine"},"mathspeak":{"default":"inverse circled 9"}},"key":"2792"},{"category":"No","mappings":{"default":{"default":"dingbat negative circled sans serif number ten","alternative":"inverse circled sans serif number ten","short":"inverse circled ten"},"mathspeak":{"default":"inverse circled 10"}},"key":"2793"},{"category":"No","mappings":{"default":{"default":"circled number ten on black square","short":"circled ten on black square"}},"key":"3248"},{"category":"No","mappings":{"default":{"default":"circled number twenty on black square","short":"circled twenty on black square"}},"key":"3249"},{"category":"No","mappings":{"default":{"default":"circled number thirty on black square","short":"circled thirty on black square"}},"key":"324A"},{"category":"No","mappings":{"default":{"default":"circled number forty on black square","short":"circled forty on black square"}},"key":"324B"},{"category":"No","mappings":{"default":{"default":"circled number fifty on black square","short":"circled fifty on black square"}},"key":"324C"},{"category":"No","mappings":{"default":{"default":"circled number sixty on black square","short":"circled sixty on black square"}},"key":"324D"},{"category":"No","mappings":{"default":{"default":"circled number seventy on black square","short":"circled seventy on black square"}},"key":"324E"},{"category":"No","mappings":{"default":{"default":"circled number eighty on black square","short":"circled eighty on black square"}},"key":"324F"},{"category":"No","mappings":{"default":{"default":"circled number twenty one","short":"circled twenty one"}},"key":"3251"},{"category":"No","mappings":{"default":{"default":"circled number twenty two","short":"circled twenty two"}},"key":"3252"},{"category":"No","mappings":{"default":{"default":"circled number twenty three","short":"circled twenty three"}},"key":"3253"},{"category":"No","mappings":{"default":{"default":"circled number twenty four","short":"circled twenty four"}},"key":"3254"},{"category":"No","mappings":{"default":{"default":"circled number twenty five","short":"circled twenty five"}},"key":"3255"},{"category":"No","mappings":{"default":{"default":"circled number twenty six","short":"circled twenty six"}},"key":"3256"},{"category":"No","mappings":{"default":{"default":"circled number twenty seven","short":"circled twenty seven"}},"key":"3257"},{"category":"No","mappings":{"default":{"default":"circled number twenty eight","short":"circled twenty eight"}},"key":"3258"},{"category":"No","mappings":{"default":{"default":"circled number twenty nine","short":"circled twenty nine"}},"key":"3259"},{"category":"No","mappings":{"default":{"default":"circled number thirty","short":"circled thirty"}},"key":"325A"},{"category":"No","mappings":{"default":{"default":"circled number thirty one","short":"circled thirty one"}},"key":"325B"},{"category":"No","mappings":{"default":{"default":"circled number thirty two","short":"circled thirty two"}},"key":"325C"},{"category":"No","mappings":{"default":{"default":"circled number thirty three","short":"circled thirty three"}},"key":"325D"},{"category":"No","mappings":{"default":{"default":"circled number thirty four","short":"circled thirty four"}},"key":"325E"},{"category":"No","mappings":{"default":{"default":"circled number thirty five","short":"circled thirty five"}},"key":"325F"},{"category":"No","mappings":{"default":{"default":"circled number thirty six","short":"circled thirty six"}},"key":"32B1"},{"category":"No","mappings":{"default":{"default":"circled number thirty seven","short":"circled thirty seven"}},"key":"32B2"},{"category":"No","mappings":{"default":{"default":"circled number thirty eight","short":"circled thirty eight"}},"key":"32B3"},{"category":"No","mappings":{"default":{"default":"circled number thirty nine","short":"circled thirty nine"}},"key":"32B4"},{"category":"No","mappings":{"default":{"default":"circled number forty","short":"circled forty"}},"key":"32B5"},{"category":"No","mappings":{"default":{"default":"circled number forty one","short":"circled forty one"}},"key":"32B6"},{"category":"No","mappings":{"default":{"default":"circled number forty two","short":"circled forty two"}},"key":"32B7"},{"category":"No","mappings":{"default":{"default":"circled number forty three","short":"circled forty three"}},"key":"32B8"},{"category":"No","mappings":{"default":{"default":"circled number forty four","short":"circled forty four"}},"key":"32B9"},{"category":"No","mappings":{"default":{"default":"circled number forty five","short":"circled forty five"}},"key":"32BA"},{"category":"No","mappings":{"default":{"default":"circled number forty six","short":"circled forty six"}},"key":"32BB"},{"category":"No","mappings":{"default":{"default":"circled number forty seven","short":"circled forty seven"}},"key":"32BC"},{"category":"No","mappings":{"default":{"default":"circled number forty eight","short":"circled forty eight"}},"key":"32BD"},{"category":"No","mappings":{"default":{"default":"circled number forty nine","short":"circled forty nine"}},"key":"32BE"},{"category":"No","mappings":{"default":{"default":"circled number fifty","short":"circled fifty"}},"key":"32BF"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit zero","short":"zero"},"mathspeak":{"default":"0"}},"key":"FF10"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit one","short":"one"},"mathspeak":{"default":"1"}},"key":"FF11"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit two","short":"two"},"mathspeak":{"default":"2"}},"key":"FF12"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit three","short":"three"},"mathspeak":{"default":"3"}},"key":"FF13"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit four","short":"four"},"mathspeak":{"default":"4"}},"key":"FF14"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit five","short":"five"},"mathspeak":{"default":"5"}},"key":"FF15"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit six","short":"six"},"mathspeak":{"default":"6"}},"key":"FF16"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit seven","short":"seven"},"mathspeak":{"default":"7"}},"key":"FF17"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit eight","short":"eight"},"mathspeak":{"default":"8"}},"key":"FF18"},{"category":"Nd","mappings":{"default":{"default":"fullwidth digit nine","short":"nine"},"mathspeak":{"default":"9"}},"key":"FF19"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit zero","alternative":"bold digit zero","short":"bold zero"},"mathspeak":{"default":"bold 0"}},"key":"1D7CE"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit one","alternative":"bold digit one","short":"bold one"},"mathspeak":{"default":"bold 1"}},"key":"1D7CF"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit two","alternative":"bold digit two","short":"bold two"},"mathspeak":{"default":"bold 2"}},"key":"1D7D0"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit three","alternative":"bold digit three","short":"bold three"},"mathspeak":{"default":"bold 3"}},"key":"1D7D1"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit four","alternative":"bold digit four","short":"bold four"},"mathspeak":{"default":"bold 4"}},"key":"1D7D2"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit five","alternative":"bold digit five","short":"bold five"},"mathspeak":{"default":"bold 5"}},"key":"1D7D3"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit six","alternative":"bold digit six","short":"bold six"},"mathspeak":{"default":"bold 6"}},"key":"1D7D4"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit seven","alternative":"bold digit seven","short":"bold seven"},"mathspeak":{"default":"bold 7"}},"key":"1D7D5"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit eight","alternative":"bold digit eight","short":"bold eight"},"mathspeak":{"default":"bold 8"}},"key":"1D7D6"},{"category":"Nd","mappings":{"default":{"default":"mathematical bold digit nine","alternative":"bold digit nine","short":"bold nine"},"mathspeak":{"default":"bold 9"}},"key":"1D7D7"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit zero","alternative":"double struck zero","short":"blackboard zero"},"mathspeak":{"default":"blackboard 0"}},"key":"1D7D8"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit one","alternative":"double struck one","short":"blackboard one"},"mathspeak":{"default":"blackboard 1"}},"key":"1D7D9"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit two","alternative":"double struck two","short":"blackboard two"},"mathspeak":{"default":"blackboard 2"}},"key":"1D7DA"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit three","alternative":"double struck three","short":"blackboard three"},"mathspeak":{"default":"blackboard 3"}},"key":"1D7DB"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit four","alternative":"double struck four","short":"blackboard four"},"mathspeak":{"default":"blackboard 4"}},"key":"1D7DC"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit five","alternative":"double struck five","short":"blackboard five"},"mathspeak":{"default":"blackboard 5"}},"key":"1D7DD"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit six","alternative":"double struck six","short":"blackboard six"},"mathspeak":{"default":"blackboard 6"}},"key":"1D7DE"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit seven","alternative":"double struck seven","short":"blackboard seven"},"mathspeak":{"default":"blackboard 7"}},"key":"1D7DF"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit eight","alternative":"double struck eight","short":"blackboard eight"},"mathspeak":{"default":"blackboard 8"}},"key":"1D7E0"},{"category":"Nd","mappings":{"default":{"default":"mathematical double struck digit nine","alternative":"double struck nine","short":"blackboard nine"},"mathspeak":{"default":"blackboard 9"}},"key":"1D7E1"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit zero","alternative":"sans serif digit zero","short":"sans serif zero"},"mathspeak":{"default":"sans serif 0"}},"key":"1D7E2"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit one","alternative":"sans serif digit one","short":"sans serif one"},"mathspeak":{"default":"sans serif 1"}},"key":"1D7E3"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit two","alternative":"sans serif digit two","short":"sans serif two"},"mathspeak":{"default":"sans serif 2"}},"key":"1D7E4"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit three","alternative":"sans serif digit three","short":"sans serif three"},"mathspeak":{"default":"sans serif 3"}},"key":"1D7E5"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit four","alternative":"sans serif digit four","short":"sans serif four"},"mathspeak":{"default":"sans serif 4"}},"key":"1D7E6"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit five","alternative":"sans serif digit five","short":"sans serif five"},"mathspeak":{"default":"sans serif 5"}},"key":"1D7E7"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit six","alternative":"sans serif digit six","short":"sans serif six"},"mathspeak":{"default":"sans serif 6"}},"key":"1D7E8"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit seven","alternative":"sans serif digit seven","short":"sans serif seven"},"mathspeak":{"default":"sans serif 7"}},"key":"1D7E9"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit eight","alternative":"sans serif digit eight","short":"sans serif eight"},"mathspeak":{"default":"sans serif 8"}},"key":"1D7EA"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif digit nine","alternative":"sans serif digit nine","short":"sans serif nine"},"mathspeak":{"default":"sans serif 9"}},"key":"1D7EB"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit zero","alternative":"sans serif bold digit zero","short":"sans serif bold zero"},"mathspeak":{"default":"sans serif bold 0"}},"key":"1D7EC"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit one","alternative":"sans serif bold digit one","short":"sans serif bold one"},"mathspeak":{"default":"sans serif bold 1"}},"key":"1D7ED"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit two","alternative":"sans serif bold digit two","short":"sans serif bold two"},"mathspeak":{"default":"sans serif bold 2"}},"key":"1D7EE"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit three","alternative":"sans serif bold digit three","short":"sans serif bold three"},"mathspeak":{"default":"sans serif bold 3"}},"key":"1D7EF"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit four","alternative":"sans serif bold digit four","short":"sans serif bold four"},"mathspeak":{"default":"sans serif bold 4"}},"key":"1D7F0"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit five","alternative":"sans serif bold digit five","short":"sans serif bold five"},"mathspeak":{"default":"sans serif bold 5"}},"key":"1D7F1"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit six","alternative":"sans serif bold digit six","short":"sans serif bold six"},"mathspeak":{"default":"sans serif bold 6"}},"key":"1D7F2"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit seven","alternative":"sans serif bold digit seven","short":"sans serif bold seven"},"mathspeak":{"default":"sans serif bold 7"}},"key":"1D7F3"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit eight","alternative":"sans serif bold digit eight","short":"sans serif bold eight"},"mathspeak":{"default":"sans serif bold 8"}},"key":"1D7F4"},{"category":"Nd","mappings":{"default":{"default":"mathematical sans serif bold digit nine","alternative":"sans serif bold digit nine","short":"sans serif bold nine"},"mathspeak":{"default":"sans serif bold 9"}},"key":"1D7F5"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit zero","alternative":"monospace zero","short":"thin zero"},"mathspeak":{"default":"monospace 0"}},"key":"1D7F6"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit one","alternative":"monospace one","short":"thin one"},"mathspeak":{"default":"monospace 1"}},"key":"1D7F7"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit two","alternative":"monospace two","short":"thin two"},"mathspeak":{"default":"monospace 2"}},"key":"1D7F8"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit three","alternative":"monospace three","short":"thin three"},"mathspeak":{"default":"monospace 3"}},"key":"1D7F9"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit four","alternative":"monospace four","short":"thin four"},"mathspeak":{"default":"monospace 4"}},"key":"1D7FA"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit five","alternative":"monospace five","short":"thin five"},"mathspeak":{"default":"monospace 5"}},"key":"1D7FB"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit six","alternative":"monospace six","short":"thin six"},"mathspeak":{"default":"monospace 6"}},"key":"1D7FC"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit seven","alternative":"monospace seven","short":"thin seven"},"mathspeak":{"default":"monospace 7"}},"key":"1D7FD"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit eight","alternative":"monospace eight","short":"thin eight"},"mathspeak":{"default":"monospace 8"}},"key":"1D7FE"},{"category":"Nd","mappings":{"default":{"default":"mathematical monospace digit nine","alternative":"monospace nine","short":"thin nine"},"mathspeak":{"default":"monospace 9"}},"key":"1D7FF"},{"category":"No","mappings":{"default":{"default":"digit zero full stop","short":"zero period"},"mathspeak":{"default":"0 period"}},"key":"1F100"},{"category":"No","mappings":{"default":{"default":"digit zero comma","short":"zero comma"},"mathspeak":{"default":"0 comma"}},"key":"1F101"},{"category":"No","mappings":{"default":{"default":"digit one comma","short":"one comma"},"mathspeak":{"default":"1 comma"}},"key":"1F102"},{"category":"No","mappings":{"default":{"default":"digit two comma","short":"two comma"},"mathspeak":{"default":"2 comma"}},"key":"1F103"},{"category":"No","mappings":{"default":{"default":"digit three comma","short":"three comma"},"mathspeak":{"default":"3 comma"}},"key":"1F104"},{"category":"No","mappings":{"default":{"default":"digit four comma","short":"four comma"},"mathspeak":{"default":"4 comma"}},"key":"1F105"},{"category":"No","mappings":{"default":{"default":"digit five comma","short":"five comma"},"mathspeak":{"default":"5 comma"}},"key":"1F106"},{"category":"No","mappings":{"default":{"default":"digit six comma","short":"six comma"},"mathspeak":{"default":"6 comma"}},"key":"1F107"},{"category":"No","mappings":{"default":{"default":"digit seven comma","short":"seven comma"},"mathspeak":{"default":"7 comma"}},"key":"1F108"},{"category":"No","mappings":{"default":{"default":"digit eight comma","short":"eight comma"},"mathspeak":{"default":"8 comma"}},"key":"1F109"},{"category":"No","mappings":{"default":{"default":"digit nine comma","short":"nine comma"},"mathspeak":{"default":"9 comma"}},"key":"1F10A"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_geometry.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_geometry.js
deleted file mode 100644
index 80f77bf6..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_geometry.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"So","mappings":{"default":{"default":"box drawings light horizontal","alternative":"forms light horizontal"}},"key":"2500"},{"category":"So","mappings":{"default":{"default":"box drawings heavy horizontal","alternative":"forms heavy horizontal"}},"key":"2501"},{"category":"So","mappings":{"default":{"default":"box drawings light vertical","alternative":"forms light vertical"}},"key":"2502"},{"category":"So","mappings":{"default":{"default":"box drawings heavy vertical","alternative":"forms heavy vertical"}},"key":"2503"},{"category":"So","mappings":{"default":{"default":"box drawings light triple dash horizontal","alternative":"forms light triple dash horizontal"}},"key":"2504"},{"category":"So","mappings":{"default":{"default":"box drawings heavy triple dash horizontal","alternative":"forms heavy triple dash horizontal"}},"key":"2505"},{"category":"So","mappings":{"default":{"default":"box drawings light triple dash vertical","alternative":"forms light triple dash vertical"}},"key":"2506"},{"category":"So","mappings":{"default":{"default":"box drawings heavy triple dash vertical","alternative":"forms heavy triple dash vertical"}},"key":"2507"},{"category":"So","mappings":{"default":{"default":"box drawings light quadruple dash horizontal","alternative":"forms light quadruple dash horizontal"}},"key":"2508"},{"category":"So","mappings":{"default":{"default":"box drawings heavy quadruple dash horizontal","alternative":"forms heavy quadruple dash horizontal"}},"key":"2509"},{"category":"So","mappings":{"default":{"default":"box drawings light quadruple dash vertical","alternative":"forms light quadruple dash vertical"}},"key":"250A"},{"category":"So","mappings":{"default":{"default":"box drawings heavy quadruple dash vertical","alternative":"forms heavy quadruple dash vertical"}},"key":"250B"},{"category":"So","mappings":{"default":{"default":"box drawings light down and right","alternative":"forms light down and right"}},"key":"250C"},{"category":"So","mappings":{"default":{"default":"box drawings down light and right heavy","alternative":"forms down light and right heavy"}},"key":"250D"},{"category":"So","mappings":{"default":{"default":"box drawings down heavy and right light","alternative":"forms down heavy and right light"}},"key":"250E"},{"category":"So","mappings":{"default":{"default":"box drawings heavy down and right","alternative":"forms heavy down and right"}},"key":"250F"},{"category":"So","mappings":{"default":{"default":"box drawings light down and left","alternative":"forms light down and left"}},"key":"2510"},{"category":"So","mappings":{"default":{"default":"box drawings down light and left heavy","alternative":"forms down light and left heavy"}},"key":"2511"},{"category":"So","mappings":{"default":{"default":"box drawings down heavy and left light","alternative":"forms down heavy and left light"}},"key":"2512"},{"category":"So","mappings":{"default":{"default":"box drawings heavy down and left","alternative":"forms heavy down and left"}},"key":"2513"},{"category":"So","mappings":{"default":{"default":"box drawings light up and right","alternative":"forms light up and right"}},"key":"2514"},{"category":"So","mappings":{"default":{"default":"box drawings up light and right heavy","alternative":"forms up light and right heavy"}},"key":"2515"},{"category":"So","mappings":{"default":{"default":"box drawings up heavy and right light","alternative":"forms up heavy and right light"}},"key":"2516"},{"category":"So","mappings":{"default":{"default":"box drawings heavy up and right","alternative":"forms heavy up and right"}},"key":"2517"},{"category":"So","mappings":{"default":{"default":"box drawings light up and left","alternative":"forms light up and left"}},"key":"2518"},{"category":"So","mappings":{"default":{"default":"box drawings up light and left heavy","alternative":"forms up light and left heavy"}},"key":"2519"},{"category":"So","mappings":{"default":{"default":"box drawings up heavy and left light","alternative":"forms up heavy and left light"}},"key":"251A"},{"category":"So","mappings":{"default":{"default":"box drawings heavy up and left","alternative":"forms heavy up and left"}},"key":"251B"},{"category":"So","mappings":{"default":{"default":"box drawings light vertical and right","alternative":"forms light vertical and right"}},"key":"251C"},{"category":"So","mappings":{"default":{"default":"box drawings vertical light and right heavy","alternative":"forms vertical light and right heavy"}},"key":"251D"},{"category":"So","mappings":{"default":{"default":"box drawings up heavy and right down light","alternative":"forms up heavy and right down light"}},"key":"251E"},{"category":"So","mappings":{"default":{"default":"box drawings down heavy and right up light","alternative":"forms down heavy and right up light"}},"key":"251F"},{"category":"So","mappings":{"default":{"default":"box drawings vertical heavy and right light","alternative":"forms vertical heavy and right light"}},"key":"2520"},{"category":"So","mappings":{"default":{"default":"box drawings down light and right up heavy","alternative":"forms down light and right up heavy"}},"key":"2521"},{"category":"So","mappings":{"default":{"default":"box drawings up light and right down heavy","alternative":"forms up light and right down heavy"}},"key":"2522"},{"category":"So","mappings":{"default":{"default":"box drawings heavy vertical and right","alternative":"forms heavy vertical and right"}},"key":"2523"},{"category":"So","mappings":{"default":{"default":"box drawings light vertical and left","alternative":"forms light vertical and left"}},"key":"2524"},{"category":"So","mappings":{"default":{"default":"box drawings vertical light and left heavy","alternative":"forms vertical light and left heavy"}},"key":"2525"},{"category":"So","mappings":{"default":{"default":"box drawings up heavy and left down light","alternative":"forms up heavy and left down light"}},"key":"2526"},{"category":"So","mappings":{"default":{"default":"box drawings down heavy and left up light","alternative":"forms down heavy and left up light"}},"key":"2527"},{"category":"So","mappings":{"default":{"default":"box drawings vertical heavy and left light","alternative":"forms vertical heavy and left light"}},"key":"2528"},{"category":"So","mappings":{"default":{"default":"box drawings down light and left up heavy","alternative":"forms down light and left up heavy"}},"key":"2529"},{"category":"So","mappings":{"default":{"default":"box drawings up light and left down heavy","alternative":"forms up light and left down heavy"}},"key":"252A"},{"category":"So","mappings":{"default":{"default":"box drawings heavy vertical and left","alternative":"forms heavy vertical and left"}},"key":"252B"},{"category":"So","mappings":{"default":{"default":"box drawings light down and horizontal","alternative":"forms light down and horizontal"}},"key":"252C"},{"category":"So","mappings":{"default":{"default":"box drawings left heavy and right down light","alternative":"forms left heavy and right down light"}},"key":"252D"},{"category":"So","mappings":{"default":{"default":"box drawings right heavy and left down light","alternative":"forms right heavy and left down light"}},"key":"252E"},{"category":"So","mappings":{"default":{"default":"box drawings down light and horizontal heavy","alternative":"forms down light and horizontal heavy"}},"key":"252F"},{"category":"So","mappings":{"default":{"default":"box drawings down heavy and horizontal light","alternative":"forms down heavy and horizontal light"}},"key":"2530"},{"category":"So","mappings":{"default":{"default":"box drawings right light and left down heavy","alternative":"forms right light and left down heavy"}},"key":"2531"},{"category":"So","mappings":{"default":{"default":"box drawings left light and right down heavy","alternative":"forms left light and right down heavy"}},"key":"2532"},{"category":"So","mappings":{"default":{"default":"box drawings heavy down and horizontal","alternative":"forms heavy down and horizontal"}},"key":"2533"},{"category":"So","mappings":{"default":{"default":"box drawings light up and horizontal","alternative":"forms light up and horizontal"}},"key":"2534"},{"category":"So","mappings":{"default":{"default":"box drawings left heavy and right up light","alternative":"forms left heavy and right up light"}},"key":"2535"},{"category":"So","mappings":{"default":{"default":"box drawings right heavy and left up light","alternative":"forms right heavy and left up light"}},"key":"2536"},{"category":"So","mappings":{"default":{"default":"box drawings up light and horizontal heavy","alternative":"forms up light and horizontal heavy"}},"key":"2537"},{"category":"So","mappings":{"default":{"default":"box drawings up heavy and horizontal light","alternative":"forms up heavy and horizontal light"}},"key":"2538"},{"category":"So","mappings":{"default":{"default":"box drawings right light and left up heavy","alternative":"forms right light and left up heavy"}},"key":"2539"},{"category":"So","mappings":{"default":{"default":"box drawings left light and right up heavy","alternative":"forms left light and right up heavy"}},"key":"253A"},{"category":"So","mappings":{"default":{"default":"box drawings heavy up and horizontal","alternative":"forms heavy up and horizontal"}},"key":"253B"},{"category":"So","mappings":{"default":{"default":"box drawings light vertical and horizontal","alternative":"forms light vertical and horizontal"}},"key":"253C"},{"category":"So","mappings":{"default":{"default":"box drawings left heavy and right vertical light","alternative":"forms left heavy and right vertical light"}},"key":"253D"},{"category":"So","mappings":{"default":{"default":"box drawings right heavy and left vertical light","alternative":"forms right heavy and left vertical light"}},"key":"253E"},{"category":"So","mappings":{"default":{"default":"box drawings vertical light and horizontal heavy","alternative":"forms vertical light and horizontal heavy"}},"key":"253F"},{"category":"So","mappings":{"default":{"default":"box drawings up heavy and down horizontal light","alternative":"forms up heavy and down horizontal light"}},"key":"2540"},{"category":"So","mappings":{"default":{"default":"box drawings down heavy and up horizontal light","alternative":"forms down heavy and up horizontal light"}},"key":"2541"},{"category":"So","mappings":{"default":{"default":"box drawings vertical heavy and horizontal light","alternative":"forms vertical heavy and horizontal light"}},"key":"2542"},{"category":"So","mappings":{"default":{"default":"box drawings left up heavy and right down light","alternative":"forms left up heavy and right down light"}},"key":"2543"},{"category":"So","mappings":{"default":{"default":"box drawings right up heavy and left down light","alternative":"forms right up heavy and left down light"}},"key":"2544"},{"category":"So","mappings":{"default":{"default":"box drawings left down heavy and right up light","alternative":"forms left down heavy and right up light"}},"key":"2545"},{"category":"So","mappings":{"default":{"default":"box drawings right down heavy and left up light","alternative":"forms right down heavy and left up light"}},"key":"2546"},{"category":"So","mappings":{"default":{"default":"box drawings down light and up horizontal heavy","alternative":"forms down light and up horizontal heavy"}},"key":"2547"},{"category":"So","mappings":{"default":{"default":"box drawings up light and down horizontal heavy","alternative":"forms up light and down horizontal heavy"}},"key":"2548"},{"category":"So","mappings":{"default":{"default":"box drawings right light and left vertical heavy","alternative":"forms right light and left vertical heavy"}},"key":"2549"},{"category":"So","mappings":{"default":{"default":"box drawings left light and right vertical heavy","alternative":"forms left light and right vertical heavy"}},"key":"254A"},{"category":"So","mappings":{"default":{"default":"box drawings heavy vertical and horizontal","alternative":"forms heavy vertical and horizontal"}},"key":"254B"},{"category":"So","mappings":{"default":{"default":"box drawings light double dash horizontal","alternative":"forms light double dash horizontal"}},"key":"254C"},{"category":"So","mappings":{"default":{"default":"box drawings heavy double dash horizontal","alternative":"forms heavy double dash horizontal"}},"key":"254D"},{"category":"So","mappings":{"default":{"default":"box drawings light double dash vertical","alternative":"forms light double dash vertical"}},"key":"254E"},{"category":"So","mappings":{"default":{"default":"box drawings heavy double dash vertical","alternative":"forms heavy double dash vertical"}},"key":"254F"},{"category":"So","mappings":{"default":{"default":"box drawings double horizontal","alternative":"forms double horizontal"}},"key":"2550"},{"category":"So","mappings":{"default":{"default":"box drawings double vertical","alternative":"forms double vertical"}},"key":"2551"},{"category":"So","mappings":{"default":{"default":"box drawings down single and right double","alternative":"forms down single and right double"}},"key":"2552"},{"category":"So","mappings":{"default":{"default":"box drawings down double and right single","alternative":"forms down double and right single"}},"key":"2553"},{"category":"So","mappings":{"default":{"default":"box drawings double down and right","alternative":"forms double down and right"}},"key":"2554"},{"category":"So","mappings":{"default":{"default":"box drawings down single and left double","alternative":"forms down single and left double"}},"key":"2555"},{"category":"So","mappings":{"default":{"default":"box drawings down double and left single","alternative":"forms down double and left single"}},"key":"2556"},{"category":"So","mappings":{"default":{"default":"box drawings double down and left","alternative":"forms double down and left"}},"key":"2557"},{"category":"So","mappings":{"default":{"default":"box drawings up single and right double","alternative":"forms up single and right double"}},"key":"2558"},{"category":"So","mappings":{"default":{"default":"box drawings up double and right single","alternative":"forms up double and right single"}},"key":"2559"},{"category":"So","mappings":{"default":{"default":"box drawings double up and right","alternative":"forms double up and right"}},"key":"255A"},{"category":"So","mappings":{"default":{"default":"box drawings up single and left double","alternative":"forms up single and left double"}},"key":"255B"},{"category":"So","mappings":{"default":{"default":"box drawings up double and left single","alternative":"forms up double and left single"}},"key":"255C"},{"category":"So","mappings":{"default":{"default":"box drawings double up and left","alternative":"forms double up and left"}},"key":"255D"},{"category":"So","mappings":{"default":{"default":"box drawings vertical single and right double","alternative":"forms vertical single and right double"}},"key":"255E"},{"category":"So","mappings":{"default":{"default":"box drawings vertical double and right single","alternative":"forms vertical double and right single"}},"key":"255F"},{"category":"So","mappings":{"default":{"default":"box drawings double vertical and right","alternative":"forms double vertical and right"}},"key":"2560"},{"category":"So","mappings":{"default":{"default":"box drawings vertical single and left double","alternative":"forms vertical single and left double"}},"key":"2561"},{"category":"So","mappings":{"default":{"default":"box drawings vertical double and left single","alternative":"forms vertical double and left single"}},"key":"2562"},{"category":"So","mappings":{"default":{"default":"box drawings double vertical and left","alternative":"forms double vertical and left"}},"key":"2563"},{"category":"So","mappings":{"default":{"default":"box drawings down single and horizontal double","alternative":"forms down single and horizontal double"}},"key":"2564"},{"category":"So","mappings":{"default":{"default":"box drawings down double and horizontal single","alternative":"forms down double and horizontal single"}},"key":"2565"},{"category":"So","mappings":{"default":{"default":"box drawings double down and horizontal","alternative":"forms double down and horizontal"}},"key":"2566"},{"category":"So","mappings":{"default":{"default":"box drawings up single and horizontal double","alternative":"forms up single and horizontal double"}},"key":"2567"},{"category":"So","mappings":{"default":{"default":"box drawings up double and horizontal single","alternative":"forms up double and horizontal single"}},"key":"2568"},{"category":"So","mappings":{"default":{"default":"box drawings double up and horizontal","alternative":"forms double up and horizontal"}},"key":"2569"},{"category":"So","mappings":{"default":{"default":"box drawings vertical single and horizontal double","alternative":"forms vertical single and horizontal double"}},"key":"256A"},{"category":"So","mappings":{"default":{"default":"box drawings vertical double and horizontal single","alternative":"forms vertical double and horizontal single"}},"key":"256B"},{"category":"So","mappings":{"default":{"default":"box drawings double vertical and horizontal","alternative":"forms double vertical and horizontal"}},"key":"256C"},{"category":"So","mappings":{"default":{"default":"box drawings light arc down and right","alternative":"forms light arc down and right"}},"key":"256D"},{"category":"So","mappings":{"default":{"default":"box drawings light arc down and left","alternative":"forms light arc down and left"}},"key":"256E"},{"category":"So","mappings":{"default":{"default":"box drawings light arc up and left","alternative":"forms light arc up and left"}},"key":"256F"},{"category":"So","mappings":{"default":{"default":"box drawings light arc up and right","alternative":"forms light arc up and right"}},"key":"2570"},{"category":"So","mappings":{"default":{"default":"box drawings light diagonal upper right to lower left","alternative":"forms light diagonal upper right to lower left"}},"key":"2571"},{"category":"So","mappings":{"default":{"default":"box drawings light diagonal upper left to lower right","alternative":"forms light diagonal upper left to lower right"}},"key":"2572"},{"category":"So","mappings":{"default":{"default":"box drawings light diagonal cross","alternative":"forms light diagonal cross"}},"key":"2573"},{"category":"So","mappings":{"default":{"default":"box drawings light left","alternative":"forms light left"}},"key":"2574"},{"category":"So","mappings":{"default":{"default":"box drawings light up","alternative":"forms light up"}},"key":"2575"},{"category":"So","mappings":{"default":{"default":"box drawings light right","alternative":"forms light right"}},"key":"2576"},{"category":"So","mappings":{"default":{"default":"box drawings light down","alternative":"forms light down"}},"key":"2577"},{"category":"So","mappings":{"default":{"default":"box drawings heavy left","alternative":"forms heavy left"}},"key":"2578"},{"category":"So","mappings":{"default":{"default":"box drawings heavy up","alternative":"forms heavy up"}},"key":"2579"},{"category":"So","mappings":{"default":{"default":"box drawings heavy right","alternative":"forms heavy right"}},"key":"257A"},{"category":"So","mappings":{"default":{"default":"box drawings heavy down","alternative":"forms heavy down"}},"key":"257B"},{"category":"So","mappings":{"default":{"default":"box drawings light left and heavy right","alternative":"forms light left and heavy right"}},"key":"257C"},{"category":"So","mappings":{"default":{"default":"box drawings light up and heavy down","alternative":"forms light up and heavy down"}},"key":"257D"},{"category":"So","mappings":{"default":{"default":"box drawings heavy left and light right","alternative":"forms heavy left and light right"}},"key":"257E"},{"category":"So","mappings":{"default":{"default":"box drawings heavy up and light down","alternative":"forms heavy up and light down"}},"key":"257F"},{"category":"So","mappings":{"default":{"default":"upper half block"}},"key":"2580"},{"category":"So","mappings":{"default":{"default":"lower one eighth block"}},"key":"2581"},{"category":"So","mappings":{"default":{"default":"lower one quarter block"}},"key":"2582"},{"category":"So","mappings":{"default":{"default":"lower three eighths block"}},"key":"2583"},{"category":"So","mappings":{"default":{"default":"lower half block"}},"key":"2584"},{"category":"So","mappings":{"default":{"default":"lower five eighths block"}},"key":"2585"},{"category":"So","mappings":{"default":{"default":"lower three quarters block","alternative":"lower three quarter block"}},"key":"2586"},{"category":"So","mappings":{"default":{"default":"lower seven eighths block"}},"key":"2587"},{"category":"So","mappings":{"default":{"default":"full block"}},"key":"2588"},{"category":"So","mappings":{"default":{"default":"left seven eighths block"}},"key":"2589"},{"category":"So","mappings":{"default":{"default":"left three quarters block","alternative":"left three quarter block"}},"key":"258A"},{"category":"So","mappings":{"default":{"default":"left five eighths block"}},"key":"258B"},{"category":"So","mappings":{"default":{"default":"left half block"}},"key":"258C"},{"category":"So","mappings":{"default":{"default":"left three eighths block"}},"key":"258D"},{"category":"So","mappings":{"default":{"default":"left one quarter block"}},"key":"258E"},{"category":"So","mappings":{"default":{"default":"left one eighth block"}},"key":"258F"},{"category":"So","mappings":{"default":{"default":"right half block"}},"key":"2590"},{"category":"So","mappings":{"default":{"default":"light shade"}},"key":"2591"},{"category":"So","mappings":{"default":{"default":"medium shade"}},"key":"2592"},{"category":"So","mappings":{"default":{"default":"dark shade"}},"key":"2593"},{"category":"So","mappings":{"default":{"default":"upper one eighth block"}},"key":"2594"},{"category":"So","mappings":{"default":{"default":"right one eighth block"}},"key":"2595"},{"category":"So","mappings":{"default":{"default":"quadrant lower left"}},"key":"2596"},{"category":"So","mappings":{"default":{"default":"quadrant lower right"}},"key":"2597"},{"category":"So","mappings":{"default":{"default":"quadrant upper left"}},"key":"2598"},{"category":"So","mappings":{"default":{"default":"quadrant upper left and lower left and lower right"}},"key":"2599"},{"category":"So","mappings":{"default":{"default":"quadrant upper left and lower right"}},"key":"259A"},{"category":"So","mappings":{"default":{"default":"quadrant upper left and upper right and lower left"}},"key":"259B"},{"category":"So","mappings":{"default":{"default":"quadrant upper left and upper right and lower right"}},"key":"259C"},{"category":"So","mappings":{"default":{"default":"quadrant upper right"}},"key":"259D"},{"category":"So","mappings":{"default":{"default":"quadrant upper right and lower left"}},"key":"259E"},{"category":"So","mappings":{"default":{"default":"quadrant upper right and lower left and lower right"}},"key":"259F"},{"category":"So","mappings":{"default":{"default":"black square"}},"key":"25A0"},{"category":"So","mappings":{"default":{"default":"white square"}},"key":"25A1"},{"category":"So","mappings":{"default":{"default":"white square with rounded corners"}},"key":"25A2"},{"category":"So","mappings":{"default":{"default":"white square containing black small square"}},"key":"25A3"},{"category":"So","mappings":{"default":{"default":"square with horizontal fill"}},"key":"25A4"},{"category":"So","mappings":{"default":{"default":"square with vertical fill"}},"key":"25A5"},{"category":"So","mappings":{"default":{"default":"square with orthogonal crosshatch fill"}},"key":"25A6"},{"category":"So","mappings":{"default":{"default":"square with upper left to lower right fill"}},"key":"25A7"},{"category":"So","mappings":{"default":{"default":"square with upper right to lower left fill"}},"key":"25A8"},{"category":"So","mappings":{"default":{"default":"square with diagonal crosshatch fill"}},"key":"25A9"},{"category":"So","mappings":{"default":{"default":"black small square"}},"key":"25AA"},{"category":"So","mappings":{"default":{"default":"white small square"}},"key":"25AB"},{"category":"So","mappings":{"default":{"default":"black rectangle"}},"key":"25AC"},{"category":"So","mappings":{"default":{"default":"white rectangle"}},"key":"25AD"},{"category":"So","mappings":{"default":{"default":"black vertical rectangle"}},"key":"25AE"},{"category":"So","mappings":{"default":{"default":"white vertical rectangle"}},"key":"25AF"},{"category":"So","mappings":{"default":{"default":"black parallelogram"}},"key":"25B0"},{"category":"So","mappings":{"default":{"default":"white parallelogram"}},"key":"25B1"},{"category":"So","mappings":{"default":{"default":"black up pointing triangle","alternative":"black up pointing triangle"}},"key":"25B2"},{"category":"So","mappings":{"default":{"default":"white up pointing triangle","alternative":"white up pointing triangle"}},"key":"25B3"},{"category":"So","mappings":{"default":{"default":"black up pointing small triangle","alternative":"black up pointing small triangle"}},"key":"25B4"},{"category":"So","mappings":{"default":{"default":"white up pointing small triangle","alternative":"white up pointing small triangle"}},"key":"25B5"},{"category":"So","mappings":{"default":{"default":"black right pointing triangle","alternative":"black right pointing triangle"}},"key":"25B6"},{"category":"Sm","mappings":{"default":{"default":"white right pointing triangle","alternative":"white right pointing triangle"}},"key":"25B7"},{"category":"So","mappings":{"default":{"default":"black right pointing small triangle","alternative":"black right pointing small triangle"}},"key":"25B8"},{"category":"So","mappings":{"default":{"default":"white right pointing small triangle","alternative":"white right pointing small triangle"}},"key":"25B9"},{"category":"So","mappings":{"default":{"default":"black right pointing pointer","alternative":"black right pointing pointer"}},"key":"25BA"},{"category":"So","mappings":{"default":{"default":"white right pointing pointer","alternative":"white right pointing pointer"}},"key":"25BB"},{"category":"So","mappings":{"default":{"default":"black down pointing triangle","alternative":"black down pointing triangle"}},"key":"25BC"},{"category":"So","mappings":{"default":{"default":"white down pointing triangle","alternative":"white down pointing triangle"}},"key":"25BD"},{"category":"So","mappings":{"default":{"default":"black down pointing small triangle","alternative":"black down pointing small triangle"}},"key":"25BE"},{"category":"So","mappings":{"default":{"default":"white down pointing small triangle","alternative":"white down pointing small triangle"}},"key":"25BF"},{"category":"So","mappings":{"default":{"default":"black left pointing triangle","alternative":"black left pointing triangle"}},"key":"25C0"},{"category":"Sm","mappings":{"default":{"default":"white left pointing triangle","alternative":"white left pointing triangle"}},"key":"25C1"},{"category":"So","mappings":{"default":{"default":"black left pointing small triangle","alternative":"black left pointing small triangle"}},"key":"25C2"},{"category":"So","mappings":{"default":{"default":"white left pointing small triangle","alternative":"white left pointing small triangle"}},"key":"25C3"},{"category":"So","mappings":{"default":{"default":"black left pointing pointer","alternative":"black left pointing pointer"}},"key":"25C4"},{"category":"So","mappings":{"default":{"default":"white left pointing pointer","alternative":"white left pointing pointer"}},"key":"25C5"},{"category":"So","mappings":{"default":{"default":"black diamond"}},"key":"25C6"},{"category":"So","mappings":{"default":{"default":"white diamond"}},"key":"25C7"},{"category":"So","mappings":{"default":{"default":"white diamond containing black small diamond"}},"key":"25C8"},{"category":"So","mappings":{"default":{"default":"fisheye"}},"key":"25C9"},{"category":"So","mappings":{"default":{"default":"lozenge"}},"key":"25CA"},{"category":"So","mappings":{"default":{"default":"white circle"}},"key":"25CB"},{"category":"So","mappings":{"default":{"default":"dotted circle"}},"key":"25CC"},{"category":"So","mappings":{"default":{"default":"circle with vertical fill"}},"key":"25CD"},{"category":"So","mappings":{"default":{"default":"bullseye"}},"key":"25CE"},{"category":"So","mappings":{"default":{"default":"black circle"}},"key":"25CF"},{"category":"So","mappings":{"default":{"default":"circle with left half black"}},"key":"25D0"},{"category":"So","mappings":{"default":{"default":"circle with right half black"}},"key":"25D1"},{"category":"So","mappings":{"default":{"default":"circle with lower half black"}},"key":"25D2"},{"category":"So","mappings":{"default":{"default":"circle with upper half black"}},"key":"25D3"},{"category":"So","mappings":{"default":{"default":"circle with upper right quadrant black"}},"key":"25D4"},{"category":"So","mappings":{"default":{"default":"circle with all but upper left quadrant black"}},"key":"25D5"},{"category":"So","mappings":{"default":{"default":"left half black circle"}},"key":"25D6"},{"category":"So","mappings":{"default":{"default":"right half black circle"}},"key":"25D7"},{"category":"So","mappings":{"default":{"default":"inverse bullet"}},"key":"25D8"},{"category":"So","mappings":{"default":{"default":"inverse white circle"}},"key":"25D9"},{"category":"So","mappings":{"default":{"default":"upper half inverse white circle"}},"key":"25DA"},{"category":"So","mappings":{"default":{"default":"lower half inverse white circle"}},"key":"25DB"},{"category":"So","mappings":{"default":{"default":"upper left quadrant circular arc"}},"key":"25DC"},{"category":"So","mappings":{"default":{"default":"upper right quadrant circular arc"}},"key":"25DD"},{"category":"So","mappings":{"default":{"default":"lower right quadrant circular arc"}},"key":"25DE"},{"category":"So","mappings":{"default":{"default":"lower left quadrant circular arc"}},"key":"25DF"},{"category":"So","mappings":{"default":{"default":"upper half circle"}},"key":"25E0"},{"category":"So","mappings":{"default":{"default":"lower half circle"}},"key":"25E1"},{"category":"So","mappings":{"default":{"default":"black lower right triangle"}},"key":"25E2"},{"category":"So","mappings":{"default":{"default":"black lower left triangle"}},"key":"25E3"},{"category":"So","mappings":{"default":{"default":"black upper left triangle"}},"key":"25E4"},{"category":"So","mappings":{"default":{"default":"black upper right triangle"}},"key":"25E5"},{"category":"So","mappings":{"default":{"default":"white bullet"}},"key":"25E6"},{"category":"So","mappings":{"default":{"default":"square with left half black"}},"key":"25E7"},{"category":"So","mappings":{"default":{"default":"square with right half black"}},"key":"25E8"},{"category":"So","mappings":{"default":{"default":"square with upper left diagonal half black"}},"key":"25E9"},{"category":"So","mappings":{"default":{"default":"square with lower right diagonal half black"}},"key":"25EA"},{"category":"So","mappings":{"default":{"default":"white square with vertical bisecting line"}},"key":"25EB"},{"category":"So","mappings":{"default":{"default":"white up pointing triangle with dot","alternative":"white up pointing triangle with dot"}},"key":"25EC"},{"category":"So","mappings":{"default":{"default":"up pointing triangle with left half black","alternative":"up pointing triangle with left half black"}},"key":"25ED"},{"category":"So","mappings":{"default":{"default":"up pointing triangle with right half black","alternative":"up pointing triangle with right half black"}},"key":"25EE"},{"category":"So","mappings":{"default":{"default":"large circle"}},"key":"25EF"},{"category":"So","mappings":{"default":{"default":"white square with upper left quadrant"}},"key":"25F0"},{"category":"So","mappings":{"default":{"default":"white square with lower left quadrant"}},"key":"25F1"},{"category":"So","mappings":{"default":{"default":"white square with lower right quadrant"}},"key":"25F2"},{"category":"So","mappings":{"default":{"default":"white square with upper right quadrant"}},"key":"25F3"},{"category":"So","mappings":{"default":{"default":"white circle with upper left quadrant"}},"key":"25F4"},{"category":"So","mappings":{"default":{"default":"white circle with lower left quadrant"}},"key":"25F5"},{"category":"So","mappings":{"default":{"default":"white circle with lower right quadrant"}},"key":"25F6"},{"category":"So","mappings":{"default":{"default":"white circle with upper right quadrant"}},"key":"25F7"},{"category":"Sm","mappings":{"default":{"default":"upper left triangle"}},"key":"25F8"},{"category":"Sm","mappings":{"default":{"default":"upper right triangle"}},"key":"25F9"},{"category":"Sm","mappings":{"default":{"default":"lower left triangle"}},"key":"25FA"},{"category":"Sm","mappings":{"default":{"default":"white medium square"}},"key":"25FB"},{"category":"Sm","mappings":{"default":{"default":"black medium square"}},"key":"25FC"},{"category":"Sm","mappings":{"default":{"default":"white medium small square"}},"key":"25FD"},{"category":"Sm","mappings":{"default":{"default":"black medium small square"}},"key":"25FE"},{"category":"Sm","mappings":{"default":{"default":"lower right triangle"}},"key":"25FF"},{"category":"So","mappings":{"default":{"default":"square with top half black"}},"key":"2B12"},{"category":"So","mappings":{"default":{"default":"square with bottom half black"}},"key":"2B13"},{"category":"So","mappings":{"default":{"default":"square with upper right diagonal half black"}},"key":"2B14"},{"category":"So","mappings":{"default":{"default":"square with lower left diagonal half black"}},"key":"2B15"},{"category":"So","mappings":{"default":{"default":"diamond with left half black"}},"key":"2B16"},{"category":"So","mappings":{"default":{"default":"diamond with right half black"}},"key":"2B17"},{"category":"So","mappings":{"default":{"default":"diamond with top half black"}},"key":"2B18"},{"category":"So","mappings":{"default":{"default":"diamond with bottom half black"}},"key":"2B19"},{"category":"So","mappings":{"default":{"default":"dotted square"}},"key":"2B1A"},{"category":"So","mappings":{"default":{"default":"black large square"}},"key":"2B1B"},{"category":"So","mappings":{"default":{"default":"white large square"}},"key":"2B1C"},{"category":"So","mappings":{"default":{"default":"black very small square"}},"key":"2B1D"},{"category":"So","mappings":{"default":{"default":"white very small square"}},"key":"2B1E"},{"category":"So","mappings":{"default":{"default":"black pentagon"}},"key":"2B1F"},{"category":"So","mappings":{"default":{"default":"white pentagon"}},"key":"2B20"},{"category":"So","mappings":{"default":{"default":"white hexagon"}},"key":"2B21"},{"category":"So","mappings":{"default":{"default":"black hexagon"}},"key":"2B22"},{"category":"So","mappings":{"default":{"default":"horizontal black hexagon"}},"key":"2B23"},{"category":"So","mappings":{"default":{"default":"black large circle"}},"key":"2B24"},{"category":"So","mappings":{"default":{"default":"black medium diamond"}},"key":"2B25"},{"category":"So","mappings":{"default":{"default":"white medium diamond"}},"key":"2B26"},{"category":"So","mappings":{"default":{"default":"black medium lozenge"}},"key":"2B27"},{"category":"So","mappings":{"default":{"default":"white medium lozenge"}},"key":"2B28"},{"category":"So","mappings":{"default":{"default":"black small diamond"}},"key":"2B29"},{"category":"So","mappings":{"default":{"default":"black small lozenge"}},"key":"2B2A"},{"category":"So","mappings":{"default":{"default":"white small lozenge"}},"key":"2B2B"},{"category":"So","mappings":{"default":{"default":"black horizontal ellipse"}},"key":"2B2C"},{"category":"So","mappings":{"default":{"default":"white horizontal ellipse"}},"key":"2B2D"},{"category":"So","mappings":{"default":{"default":"black vertical ellipse"}},"key":"2B2E"},{"category":"So","mappings":{"default":{"default":"white vertical ellipse"}},"key":"2B2F"},{"category":"So","mappings":{"default":{"default":"white medium star"}},"key":"2B50"},{"category":"So","mappings":{"default":{"default":"black small star"}},"key":"2B51"},{"category":"So","mappings":{"default":{"default":"white small star"}},"key":"2B52"},{"category":"So","mappings":{"default":{"default":"black right pointing pentagon"}},"key":"2B53"},{"category":"So","mappings":{"default":{"default":"white right pointing pentagon"}},"key":"2B54"},{"category":"So","mappings":{"default":{"default":"heavy large circle"}},"key":"2B55"},{"category":"So","mappings":{"default":{"default":"heavy oval with oval inside"}},"key":"2B56"},{"category":"So","mappings":{"default":{"default":"heavy circle with circle inside"}},"key":"2B57"},{"category":"So","mappings":{"default":{"default":"heavy circle"}},"key":"2B58"},{"category":"So","mappings":{"default":{"default":"heavy circled saltire"}},"key":"2B59"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_harpoons.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_harpoons.js
deleted file mode 100644
index f74813a0..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_harpoons.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"So","mappings":{"default":{"default":"leftwards harpoon with barb upwards","short":"left harpoon with barb up"}},"key":"21BC"},{"category":"So","mappings":{"default":{"default":"leftwards harpoon with barb downwards","short":"left harpoon with barb down"}},"key":"21BD"},{"category":"So","mappings":{"default":{"default":"upwards harpoon with barb rightwards","short":"up harpoon with barb right"}},"key":"21BE"},{"category":"So","mappings":{"default":{"default":"upwards harpoon with barb leftwards","short":"up harpoon with barb left"}},"key":"21BF"},{"category":"So","mappings":{"default":{"default":"rightwards harpoon with barb upwards","short":"right harpoon with barb up"}},"key":"21C0"},{"category":"So","mappings":{"default":{"default":"rightwards harpoon with barb downwards","short":"right harpoon with barb down"}},"key":"21C1"},{"category":"So","mappings":{"default":{"default":"downwards harpoon with barb rightwards","short":"down harpoon with barb right"}},"key":"21C2"},{"category":"So","mappings":{"default":{"default":"downwards harpoon with barb leftwards","short":"down harpoon with barb left"}},"key":"21C3"},{"category":"So","mappings":{"default":{"default":"leftwards harpoon over rightwards harpoon","short":"left harpoon over right harpoon"}},"key":"21CB"},{"category":"So","mappings":{"default":{"default":"rightwards harpoon over leftwards harpoon","short":"right harpoon over left harpoon"}},"key":"21CC"},{"category":"Sm","mappings":{"default":{"default":"left barb up right barb down harpoon"}},"key":"294A"},{"category":"Sm","mappings":{"default":{"default":"left barb down right barb up harpoon"}},"key":"294B"},{"category":"Sm","mappings":{"default":{"default":"up barb right down barb left harpoon"}},"key":"294C"},{"category":"Sm","mappings":{"default":{"default":"up barb left down barb right harpoon"}},"key":"294D"},{"category":"Sm","mappings":{"default":{"default":"left barb up right barb up harpoon"}},"key":"294E"},{"category":"Sm","mappings":{"default":{"default":"up barb right down barb right harpoon"}},"key":"294F"},{"category":"Sm","mappings":{"default":{"default":"left barb down right barb down harpoon"}},"key":"2950"},{"category":"Sm","mappings":{"default":{"default":"up barb left down barb left harpoon"}},"key":"2951"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb up to bar","short":"left harpoon with barb up to bar"}},"key":"2952"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb up to bar","short":"right harpoon with barb up to bar"}},"key":"2953"},{"category":"Sm","mappings":{"default":{"default":"upwards harpoon with barb right to bar","short":"up harpoon with barb right to bar"}},"key":"2954"},{"category":"Sm","mappings":{"default":{"default":"downwards harpoon with barb right to bar","short":"down harpoon with barb right to bar"}},"key":"2955"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb down to bar","short":"left harpoon with barb down to bar"}},"key":"2956"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb down to bar","short":"right harpoon with barb down to bar"}},"key":"2957"},{"category":"Sm","mappings":{"default":{"default":"upwards harpoon with barb left to bar","short":"up harpoon with barb left to bar"}},"key":"2958"},{"category":"Sm","mappings":{"default":{"default":"downwards harpoon with barb left to bar","short":"down harpoon with barb left to bar"}},"key":"2959"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb up from bar","short":"left harpoon with barb up from bar"}},"key":"295A"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb up from bar","short":"right harpoon with barb up from bar"}},"key":"295B"},{"category":"Sm","mappings":{"default":{"default":"upwards harpoon with barb right from bar","short":"up harpoon with barb right from bar"}},"key":"295C"},{"category":"Sm","mappings":{"default":{"default":"downwards harpoon with barb right from bar","short":"down harpoon with barb right from bar"}},"key":"295D"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb down from bar","short":"left harpoon with barb down from bar"}},"key":"295E"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb down from bar","short":"right harpoon with barb down from bar"}},"key":"295F"},{"category":"Sm","mappings":{"default":{"default":"upwards harpoon with barb left from bar","short":"up harpoon with barb left from bar"}},"key":"2960"},{"category":"Sm","mappings":{"default":{"default":"downwards harpoon with barb left from bar","short":"down harpoon with barb left from bar"}},"key":"2961"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb up above leftwards harpoon with barb down","short":"left harpoon with barb up above left harpoon with barb down"}},"key":"2962"},{"category":"Sm","mappings":{"default":{"default":"upwards harpoon with barb left beside upwards harpoon with barb right","short":"up harpoon with barb left beside up harpoon with barb right"}},"key":"2963"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb up above rightwards harpoon with barb down","short":"right harpoon with barb up above right harpoon with barb down"}},"key":"2964"},{"category":"Sm","mappings":{"default":{"default":"downwards harpoon with barb left beside downwards harpoon with barb right","short":"down harpoon with barb left beside down harpoon with barb right"}},"key":"2965"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb up above rightwards harpoon with barb up","short":"left harpoon with barb up above right harpoon with barb up"}},"key":"2966"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb down above rightwards harpoon with barb down","short":"left harpoon with barb down above right harpoon with barb down"}},"key":"2967"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb up above leftwards harpoon with barb up","short":"right harpoon with barb up above left harpoon with barb up"}},"key":"2968"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb down above leftwards harpoon with barb down","short":"right harpoon with barb down above left harpoon with barb down"}},"key":"2969"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb up above long dash","short":"left harpoon with barb up above long dash"}},"key":"296A"},{"category":"Sm","mappings":{"default":{"default":"leftwards harpoon with barb down below long dash","short":"left harpoon with barb down below long dash"}},"key":"296B"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb up above long dash","short":"right harpoon with barb up above long dash"}},"key":"296C"},{"category":"Sm","mappings":{"default":{"default":"rightwards harpoon with barb down below long dash","short":"right harpoon with barb down below long dash"}},"key":"296D"},{"category":"Sm","mappings":{"default":{"default":"upwards harpoon with barb left beside downwards harpoon with barb right","short":"up harpoon with barb left beside down harpoon with barb right"}},"key":"296E"},{"category":"Sm","mappings":{"default":{"default":"downwards harpoon with barb left beside upwards harpoon with barb right","short":"down harpoon with barb left beside up harpoon with barb right"}},"key":"296F"},{"category":"Sm","mappings":{"default":{"default":"left fish tail"}},"key":"297C"},{"category":"Sm","mappings":{"default":{"default":"right fish tail"}},"key":"297D"},{"category":"Sm","mappings":{"default":{"default":"up fish tail"}},"key":"297E"},{"category":"Sm","mappings":{"default":{"default":"down fish tail"}},"key":"297F"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_non_characters.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_non_characters.js
deleted file mode 100644
index fa64c5f7..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_non_characters.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Ll","mappings":{"default":{"default":"mathematical italic small h over two time greek letter pi","alternative":"italic small h over two pi","short":"italic h over two pi"},"physics":{"default":"planck constant over two pi","alternative":"planck constant over 2 pi"}},"key":"210F"},{"category":"So","mappings":{"default":{"default":"l b bar symbol","short":"l b bar"}},"key":"2114"},{"category":"So","mappings":{"default":{"default":"numero sign","alternative":"numero","short":"numero"}},"key":"2116"},{"category":"So","mappings":{"default":{"default":"sound recording copyright"}},"key":"2117"},{"category":"So","mappings":{"default":{"default":"prescription take"}},"key":"211E"},{"category":"So","mappings":{"default":{"default":"response"}},"key":"211F"},{"category":"So","mappings":{"default":{"default":"service mark"}},"key":"2120"},{"category":"So","mappings":{"default":{"default":"telephone sign","alternative":"t e l symbol"}},"key":"2121"},{"category":"So","mappings":{"default":{"default":"trade mark sign","alternative":"trademark","short":"trade mark"}},"key":"2122"},{"category":"So","mappings":{"default":{"default":"versicle"}},"key":"2123"},{"category":"So","mappings":{"default":{"default":"ounce sign","alternative":"ounce","short":"ounce"}},"key":"2125"},{"category":"Lu","mappings":{"default":{"default":"ohm sign","alternative":"ohm","short":"ohm"}},"key":"2126"},{"category":"So","mappings":{"default":{"default":"inverted ohm sign","alternative":"mho","short":"inverted ohm"}},"key":"2127"},{"category":"Lu","mappings":{"default":{"default":"kelvin sign","alternative":"degrees kelvin","short":"kelvin"}},"key":"212A"},{"category":"Lu","mappings":{"default":{"default":"angstrom sign","alternative":"angstrom unit","short":"angstrom"}},"key":"212B"},{"category":"So","mappings":{"default":{"default":"estimated symbol","short":"estimated"}},"key":"212E"},{"category":"Lu","mappings":{"default":{"default":"turned capital f","alternative":"turned f","short":"turned cap f"},"mathspeak":{"default":"turned upper F"}},"key":"2132"},{"category":"Ll","mappings":{"default":{"default":"information source"}},"key":"2139"},{"category":"So","mappings":{"default":{"default":"rotated capital q","short":"rotated cap q"},"mathspeak":{"default":"rotated upper Q"}},"key":"213A"},{"category":"So","mappings":{"default":{"default":"facsimile sign"}},"key":"213B"},{"category":"Sm","mappings":{"default":{"default":"turned sans serif capital g","short":"turned sans serif cap g"},"mathspeak":{"default":"turned sans serif upper G"}},"key":"2141"},{"category":"Sm","mappings":{"default":{"default":"turned sans serif capital l","short":"turned sans serif cap l"},"mathspeak":{"default":"turned sans serif upper L"}},"key":"2142"},{"category":"Sm","mappings":{"default":{"default":"reversed sans serif capital l","short":"reversed sans serif cap l"},"mathspeak":{"default":"reversed sans serif upper L"}},"key":"2143"},{"category":"Sm","mappings":{"default":{"default":"turned sans serif capital y","short":"turned sans serif cap y"},"mathspeak":{"default":"turned sans serif upper Y"}},"key":"2144"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_symbols.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_symbols.js
deleted file mode 100644
index b52ead27..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_symbols.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Po","mappings":{"default":{"default":"factorial operator","alternative":"exclamation mark","short":"factorial"},"mathspeak":{"default":"exclamation-mark"}},"key":"0021"},{"category":"Po","mappings":{"default":{"default":"quotation mark"},"mathspeak":{"default":"quotation-mark"}},"key":"0022"},{"category":"Po","mappings":{"default":{"default":"number sign","alternative":"hash","short":"number"},"mathspeak":{"default":"number-sign","brief":"num-sign","sbrief":"num-sign"}},"key":"0023"},{"category":"Sc","mappings":{"default":{"default":"dollar sign","short":"dollar"},"mathspeak":{"default":"dollar-sign"}},"key":"0024"},{"category":"Po","mappings":{"default":{"default":"percent sign","short":"percent"},"mathspeak":{"default":"percent-sign"}},"key":"0025"},{"category":"Po","mappings":{"default":{"default":"ampersand"}},"key":"0026"},{"category":"Po","mappings":{"default":{"default":"apostrophe","alternative":"apostrophe quote"},"mathspeak":{"default":"prime"}},"key":"0027"},{"category":"Po","mappings":{"default":{"default":"asterisk"}},"key":"002A"},{"category":"Sm","mappings":{"default":{"default":"plus sign","short":"plus"}},"key":"002B"},{"category":"Po","mappings":{"default":{"default":"comma"}},"key":"002C"},{"category":"Pd","mappings":{"default":{"default":"hyphen minus","short":"minus"},"mathspeak":{"default":"hyphen"}},"key":"002D"},{"category":"Po","mappings":{"default":{"default":"full stop","alternative":"period"},"mathspeak":{"default":"period"}},"key":"002E"},{"category":"Po","mappings":{"default":{"default":"solidus","alternative":"slash"},"mathspeak":{"default":"slash"},"emacspeak":{"default":"slash"}},"key":"002F"},{"category":"Po","mappings":{"default":{"default":"colon"}},"key":"003A"},{"category":"Po","mappings":{"default":{"default":"semicolon"}},"key":"003B"},{"category":"Sm","mappings":{"default":{"default":"less than sign","short":"less than"},"mathspeak":{"default":"less-than"}},"key":"003C"},{"category":"Sm","mappings":{"default":{"default":"equals sign","short":"equals"}},"key":"003D"},{"category":"Sm","mappings":{"default":{"default":"greater than sign","short":"greater than"},"mathspeak":{"default":"greater-than"}},"key":"003E"},{"category":"Po","mappings":{"default":{"default":"question mark"},"mathspeak":{"default":"question-mark"}},"key":"003F"},{"category":"Po","mappings":{"default":{"default":"commercial at","short":"at"},"mathspeak":{"default":"commercial-at"}},"key":"0040"},{"category":"Po","mappings":{"default":{"default":"reverse solidus","alternative":"backslash"},"mathspeak":{"default":"reverse-solidus"}},"key":"005C"},{"category":"Sk","mappings":{"default":{"default":"circumflex accent","alternative":"spacing circumflex","short":"hat"},"mathspeak":{"default":"caret"}},"key":"005E"},{"category":"Pc","mappings":{"default":{"default":"low line","alternative":"spacing underscore"},"mathspeak":{"default":"bar"}},"key":"005F"},{"category":"Sk","mappings":{"default":{"default":"grave accent","alternative":"spacing grave","short":"grave"},"mathspeak":{"default":"grave"}},"key":"0060"},{"category":"Sm","mappings":{"default":{"default":"vertical line","alternative":"vertical bar"},"mathspeak":{"default":"vertical-bar"}},"key":"007C"},{"category":"Sm","mappings":{"default":{"default":"tilde"}},"key":"007E"},{"category":"Po","mappings":{"default":{"default":"inverted exclamation mark"},"mathspeak":{"default":"inverted-exclamation-mark"}},"key":"00A1"},{"category":"Sc","mappings":{"default":{"default":"cent sign","short":"cent"},"mathspeak":{"default":"cent-sign"}},"key":"00A2"},{"category":"Sc","mappings":{"default":{"default":"pound sign","short":"pound"},"mathspeak":{"default":"pound-sign"}},"key":"00A3"},{"category":"Sc","mappings":{"default":{"default":"currency sign","short":"currency"},"mathspeak":{"default":"currency-sign"}},"key":"00A4"},{"category":"Sc","mappings":{"default":{"default":"yen sign","short":"yen"},"mathspeak":{"default":"yen-sign"}},"key":"00A5"},{"category":"So","mappings":{"default":{"default":"broken bar","alternative":"broken vertical bar"},"mathspeak":{"default":"broken-vertical-bar"}},"key":"00A6"},{"category":"Po","mappings":{"default":{"default":"section sign","short":"section"},"mathspeak":{"default":"section-sign"}},"key":"00A7"},{"category":"Sk","mappings":{"default":{"default":"diaeresis","alternative":"spacing diaeresis","short":"double dot"},"mathspeak":{"default":"two-dots"}},"key":"00A8"},{"category":"So","mappings":{"default":{"default":"copyright sign","short":"copyright"},"mathspeak":{"default":"copyright-sign"}},"key":"00A9"},{"category":"Lo","mappings":{"default":{"default":"feminine ordinal indicator"},"mathspeak":{"default":"feminine-ordinal-indicator"}},"key":"00AA"},{"category":"Pi","mappings":{"default":{"default":"left pointing double angle quotation mark","alternative":"left pointing guillemet"},"mathspeak":{"default":"left-pointing-guillemet"}},"key":"00AB"},{"category":"Sm","mappings":{"default":{"default":"not sign","short":"not"},"mathspeak":{"default":"not-sign"}},"key":"00AC"},{"category":"So","mappings":{"default":{"default":"registered sign","alternative":"registered trade mark sign","short":"registered"},"mathspeak":{"default":"registered-trade-mark-sign"}},"key":"00AE"},{"category":"Sk","mappings":{"default":{"default":"macron","alternative":"spacing macron"},"mathspeak":{"default":"bar"}},"key":"00AF"},{"category":"So","mappings":{"default":{"default":"degree sign","short":"degree"},"mathspeak":{"default":"degree"}},"key":"00B0"},{"category":"Sm","mappings":{"default":{"default":"plus minus sign","alternative":"plus or minus sign","short":"plus minus"},"mathspeak":{"default":"plus-or-minus"}},"key":"00B1"},{"category":"Sk","mappings":{"default":{"default":"acute accent","alternative":"spacing acute","short":"acute"},"mathspeak":{"default":"acute"}},"key":"00B4"},{"category":"Ll","mappings":{"default":{"default":"micro sign","short":"micro"},"mathspeak":{"default":"micro-sign"}},"key":"00B5"},{"category":"Po","mappings":{"default":{"default":"pilcrow sign","alternative":"paragraph sign","short":"pilcrow"},"mathspeak":{"default":"paragraph-sign"}},"key":"00B6"},{"category":"Po","mappings":{"default":{"default":"middle dot"},"mathspeak":{"default":"dot"}},"key":"00B7"},{"category":"Sk","mappings":{"default":{"default":"cedilla","alternative":"spacing cedilla"},"mathspeak":{"default":"cedilla"}},"key":"00B8"},{"category":"Lo","mappings":{"default":{"default":"masculine ordinal indicator"},"mathspeak":{"default":"masculine-ordinal-indicator"}},"key":"00BA"},{"category":"Pf","mappings":{"default":{"default":"right pointing double angle quotation mark","alternative":"right pointing guillemet"},"mathspeak":{"default":"right-pointing-guillemet"}},"key":"00BB"},{"category":"Po","mappings":{"default":{"default":"inverted question mark"},"mathspeak":{"default":"inverted-question-mark"}},"key":"00BF"},{"category":"Sm","mappings":{"default":{"default":"multiplication sign","short":"multiplication"},"mathspeak":{"default":"times"}},"key":"00D7"},{"category":"Sm","mappings":{"default":{"default":"division sign","short":"division"},"mathspeak":{"default":"division-sign"}},"key":"00F7"},{"category":"Sk","mappings":{"default":{"default":"breve","alternative":"spacing breve"},"mathspeak":{"default":"breve"}},"key":"02D8"},{"category":"Sk","mappings":{"default":{"default":"dot above","alternative":"spacing dot above"},"mathspeak":{"default":"dot"}},"key":"02D9"},{"category":"Sk","mappings":{"default":{"default":"ring above","alternative":"spacing ring above"},"mathspeak":{"default":"ring-above"}},"key":"02DA"},{"category":"Sk","mappings":{"default":{"default":"ogonek","alternative":"spacing ogonek"},"mathspeak":{"default":"ogonek"}},"key":"02DB"},{"category":"Sk","mappings":{"default":{"default":"small tilde","alternative":"spacing tilde"},"mathspeak":{"default":"tilde"}},"key":"02DC"},{"category":"Sk","mappings":{"default":{"default":"double acute accent","alternative":"spacing double acute"},"mathspeak":{"default":"double-acute"}},"key":"02DD"},{"category":"Pd","mappings":{"default":{"default":"hyphen"}},"key":"2010"},{"category":"Pd","mappings":{"default":{"default":"non breaking hyphen"},"mathspeak":{"default":"non-breaking-hyphen"}},"key":"2011"},{"category":"Pd","mappings":{"default":{"default":"figure dash"},"mathspeak":{"default":"figure-dash"}},"key":"2012"},{"category":"Pd","mappings":{"default":{"default":"en dash"},"mathspeak":{"default":"en-dash"}},"key":"2013"},{"category":"Pd","mappings":{"default":{"default":"em dash"},"mathspeak":{"default":"em-dash"}},"key":"2014"},{"category":"Pd","mappings":{"default":{"default":"horizontal bar","alternative":"quotation dash"},"mathspeak":{"default":"quotation-dash"}},"key":"2015"},{"category":"Po","mappings":{"default":{"default":"double vertical line","alternative":"double vertical bar"},"mathspeak":{"default":"double-vertical-bar"}},"key":"2016"},{"category":"Po","mappings":{"default":{"default":"double low line","alternative":"spacing double underscore"},"mathspeak":{"default":"double-underscore"}},"key":"2017"},{"category":"Pi","mappings":{"default":{"default":"left single quotation mark","alternative":"single turned comma quotation mark"},"mathspeak":{"default":"single-turned-comma-quotation-mark"}},"key":"2018"},{"category":"Pf","mappings":{"default":{"default":"right single quotation mark","alternative":"single comma quotation mark"},"mathspeak":{"default":"single-comma-quotation-mark"}},"key":"2019"},{"category":"Ps","mappings":{"default":{"default":"single low 9 quotation mark","alternative":"low single comma quotation mark"},"mathspeak":{"default":"low-single-comma-quotation-mark"}},"key":"201A"},{"category":"Pi","mappings":{"default":{"default":"single high reversed 9 quotation mark","alternative":"single reversed comma quotation mark"},"mathspeak":{"default":"single-reversed-comma-quotation-mark"}},"key":"201B"},{"category":"Pi","mappings":{"default":{"default":"left double quotation mark","alternative":"double turned comma quotation mark"},"mathspeak":{"default":"double-turned-comma-quotation-mark"}},"key":"201C"},{"category":"Pf","mappings":{"default":{"default":"right double quotation mark","alternative":"double comma quotation mark"},"mathspeak":{"default":"double-comma-quotation-mark"}},"key":"201D"},{"category":"Ps","mappings":{"default":{"default":"double low 9 quotation mark","alternative":"low double comma quotation mark"},"mathspeak":{"default":"low-double-comma-quotation-mark"}},"key":"201E"},{"category":"Pi","mappings":{"default":{"default":"double high reversed 9 quotation mark","alternative":"double reversed comma quotation mark"},"mathspeak":{"default":"double-reversed-comma-quotation-mark"}},"key":"201F"},{"category":"Po","mappings":{"default":{"default":"dagger"}},"key":"2020"},{"category":"Po","mappings":{"default":{"default":"double dagger"},"mathspeak":{"default":"double-dagger"}},"key":"2021"},{"category":"Po","mappings":{"default":{"default":"bullet"}},"key":"2022"},{"category":"Po","mappings":{"default":{"default":"triangular bullet"},"mathspeak":{"default":"triangular-bullet"}},"key":"2023"},{"category":"Po","mappings":{"default":{"default":"one dot leader"},"mathspeak":{"default":"one-dot-leader"}},"key":"2024"},{"category":"Po","mappings":{"default":{"default":"two dot leader"},"mathspeak":{"default":"two-dot-leader"}},"key":"2025"},{"category":"Po","mappings":{"default":{"default":"horizontal ellipsis"},"mathspeak":{"default":"ellipsis"}},"key":"2026"},{"category":"Po","mappings":{"default":{"default":"hyphenation point"},"mathspeak":{"default":"hyphenation-point"}},"key":"2027"},{"category":"Po","mappings":{"default":{"default":"per mille sign","short":"per mille"},"mathspeak":{"default":"per-mille"}},"key":"2030"},{"category":"Po","mappings":{"default":{"default":"per ten thousand sign","short":"per ten thousand"},"mathspeak":{"default":"per-ten-thousand"}},"key":"2031"},{"category":"Po","mappings":{"default":{"default":"prime"}},"key":"2032"},{"category":"Po","mappings":{"default":{"default":"double prime"},"mathspeak":{"default":"double-prime"}},"key":"2033"},{"category":"Po","mappings":{"default":{"default":"triple prime"},"mathspeak":{"default":"triple-prime"}},"key":"2034"},{"category":"Po","mappings":{"default":{"default":"reversed prime"},"mathspeak":{"default":"reversed-prime"}},"key":"2035"},{"category":"Po","mappings":{"default":{"default":"reversed double prime"},"mathspeak":{"default":"reversed-double-prime"}},"key":"2036"},{"category":"Po","mappings":{"default":{"default":"reversed triple prime"},"mathspeak":{"default":"reversed-triple-prime"}},"key":"2037"},{"category":"Po","mappings":{"default":{"default":"caret"}},"key":"2038"},{"category":"Pi","mappings":{"default":{"default":"single left pointing angle quotation mark","alternative":"left pointing single guillemet"},"mathspeak":{"default":"left-pointing-single-guillemet"}},"key":"2039"},{"category":"Pf","mappings":{"default":{"default":"single right pointing angle quotation mark","alternative":"right pointing single guillemet"},"mathspeak":{"default":"right-pointing-single-guillemet"}},"key":"203A"},{"category":"Po","mappings":{"default":{"default":"reference mark"},"mathspeak":{"default":"reference-mark"}},"key":"203B"},{"category":"Po","mappings":{"default":{"default":"double exclamation mark"},"mathspeak":{"default":"double-exclamation-mark"}},"key":"203C"},{"category":"Po","mappings":{"default":{"default":"interrobang"}},"key":"203D"},{"category":"Po","mappings":{"default":{"default":"overline","alternative":"spacing overscore"},"mathspeak":{"default":"bar"}},"key":"203E"},{"category":"Pc","mappings":{"default":{"default":"undertie"}},"key":"203F"},{"category":"Pc","mappings":{"default":{"default":"character tie"},"mathspeak":{"default":"character-tie"}},"key":"2040"},{"category":"Po","mappings":{"default":{"default":"caret insertion point"},"mathspeak":{"default":"caret-insertion-point"}},"key":"2041"},{"category":"Po","mappings":{"default":{"default":"asterism"}},"key":"2042"},{"category":"Po","mappings":{"default":{"default":"hyphen bullet"},"mathspeak":{"default":"hyphen-bullet"}},"key":"2043"},{"category":"Sm","mappings":{"default":{"default":"fraction slash"},"mathspeak":{"default":"fraction-slash"}},"key":"2044"},{"category":"Po","mappings":{"default":{"default":"double question mark"},"mathspeak":{"default":"double-question-mark"}},"key":"2047"},{"category":"Po","mappings":{"default":{"default":"question exclamation mark"},"mathspeak":{"default":"question-exclamation-mark"}},"key":"2048"},{"category":"Po","mappings":{"default":{"default":"exclamation question mark"},"mathspeak":{"default":"exclamation-question-mark"}},"key":"2049"},{"category":"Po","mappings":{"default":{"default":"reversed pilcrow sign","short":"reversed pilcrow"},"mathspeak":{"default":"reversed-pilcrow"}},"key":"204B"},{"category":"Po","mappings":{"default":{"default":"black leftwards bullet"},"mathspeak":{"default":"black-leftwards-bullet"}},"key":"204C"},{"category":"Po","mappings":{"default":{"default":"black rightwards bullet"},"mathspeak":{"default":"black-rightwards-bullet"}},"key":"204D"},{"category":"Po","mappings":{"default":{"default":"low asterisk"},"mathspeak":{"default":"low-asterisk"}},"key":"204E"},{"category":"Po","mappings":{"default":{"default":"reversed semicolon"},"mathspeak":{"default":"reversed-semicolon"}},"key":"204F"},{"category":"Po","mappings":{"default":{"default":"close up"},"mathspeak":{"default":"close-up"}},"key":"2050"},{"category":"Po","mappings":{"default":{"default":"two asterisks aligned vertically"},"mathspeak":{"default":"two-asterisks-aligned-vertically"}},"key":"2051"},{"category":"Sm","mappings":{"default":{"default":"commercial minus sign","short":"commercial minus"},"mathspeak":{"default":"commercial-minus"}},"key":"2052"},{"category":"Po","mappings":{"default":{"default":"swung dash"},"mathspeak":{"default":"swung-dash"}},"key":"2053"},{"category":"Pc","mappings":{"default":{"default":"inverted undertie"},"mathspeak":{"default":"inverted-undertie"}},"key":"2054"},{"category":"Po","mappings":{"default":{"default":"flower punctuation mark"},"mathspeak":{"default":"flower-punctuation-mark"}},"key":"2055"},{"category":"Po","mappings":{"default":{"default":"three dot punctuation"},"mathspeak":{"default":"three-dot-punctuation"}},"key":"2056"},{"category":"Po","mappings":{"default":{"default":"quadruple prime"},"mathspeak":{"default":"quadruple-prime"}},"key":"2057"},{"category":"Po","mappings":{"default":{"default":"four dot punctuation"},"mathspeak":{"default":"four-dot-punctuation"}},"key":"2058"},{"category":"Po","mappings":{"default":{"default":"five dot punctuation"},"mathspeak":{"default":"five-dot-punctuation"}},"key":"2059"},{"category":"Po","mappings":{"default":{"default":"two dot punctuation"},"mathspeak":{"default":"two-dot-punctuation"}},"key":"205A"},{"category":"Po","mappings":{"default":{"default":"four dot mark"},"mathspeak":{"default":"four-dot-mark"}},"key":"205B"},{"category":"Po","mappings":{"default":{"default":"dotted cross"},"mathspeak":{"default":"dotted-cross"}},"key":"205C"},{"category":"Po","mappings":{"default":{"default":"tricolon"}},"key":"205D"},{"category":"Po","mappings":{"default":{"default":"vertical four dots"},"mathspeak":{"default":"vertical-four-dots"}},"key":"205E"},{"category":"Sm","mappings":{"default":{"default":"superscript plus sign","short":"superscript plus"},"mathspeak":{"default":"superscript-plus"}},"key":"207A"},{"category":"Sm","mappings":{"default":{"default":"superscript minus","alternative":"superscript hyphen minus"},"mathspeak":{"default":"superscript-hyphen-minus"}},"key":"207B"},{"category":"Sm","mappings":{"default":{"default":"superscript equals sign","short":"superscript equals"},"mathspeak":{"default":"superscript-equals"}},"key":"207C"},{"category":"Ps","mappings":{"default":{"default":"superscript left parenthesis","alternative":"superscript opening parenthesis"},"mathspeak":{"default":"superscript-opening-parenthesis"}},"key":"207D"},{"category":"Pe","mappings":{"default":{"default":"superscript right parenthesis","alternative":"superscript closing parenthesis"},"mathspeak":{"default":"superscript-closing-parenthesis"}},"key":"207E"},{"category":"Sm","mappings":{"default":{"default":"subscript plus sign","short":"subscript plus"},"mathspeak":{"default":"subscript-plus"}},"key":"208A"},{"category":"Sm","mappings":{"default":{"default":"subscript minus","alternative":"subscript hyphen minus"},"mathspeak":{"default":"subscript-hyphen-minus"}},"key":"208B"},{"category":"Sm","mappings":{"default":{"default":"subscript equals sign","short":"subscript equals"},"mathspeak":{"default":"subscript-equals"}},"key":"208C"},{"category":"Ps","mappings":{"default":{"default":"subscript left parenthesis","alternative":"subscript opening parenthesis"},"mathspeak":{"default":"subscript-opening-parenthesis"}},"key":"208D"},{"category":"Pe","mappings":{"default":{"default":"subscript right parenthesis","alternative":"subscript closing parenthesis"},"mathspeak":{"default":"subscript-closing-parenthesis"}},"key":"208E"},{"category":"So","mappings":{"default":{"default":"property line"},"mathspeak":{"default":"property-line"}},"key":"214A"},{"category":"Sm","mappings":{"default":{"default":"turned ampersand"},"mathspeak":{"default":"turned-ampersand"}},"key":"214B"},{"category":"So","mappings":{"default":{"default":"per sign","short":"per"},"mathspeak":{"default":"per-sign"}},"key":"214C"},{"category":"So","mappings":{"default":{"default":"aktieselskab"}},"key":"214D"},{"category":"Ll","mappings":{"default":{"default":"turned small f"},"mathspeak":{"default":"turned-small-f"}},"key":"214E"},{"category":"Sm","mappings":{"default":{"default":"for all"},"mathspeak":{"default":"for-all"}},"key":"2200"},{"category":"Sm","mappings":{"default":{"default":"complement"}},"key":"2201"},{"category":"Sm","mappings":{"default":{"default":"partial differential"},"mathspeak":{"default":"partial-differential"}},"key":"2202"},{"category":"Sm","mappings":{"default":{"default":"there exists"},"mathspeak":{"default":"there-exists"}},"key":"2203"},{"category":"Sm","mappings":{"default":{"default":"there does not exist"},"mathspeak":{"default":"there-does-not-exist"}},"key":"2204"},{"category":"Sm","mappings":{"default":{"default":"empty set"},"mathspeak":{"default":"empty-set"}},"key":"2205"},{"category":"Sm","mappings":{"default":{"default":"increment"}},"key":"2206"},{"category":"Sm","mappings":{"default":{"default":"nabla"}},"key":"2207"},{"category":"Sm","mappings":{"default":{"default":"element of"},"mathspeak":{"default":"element-of"}},"key":"2208"},{"category":"Sm","mappings":{"default":{"default":"not an element of"},"mathspeak":{"default":"not-an-element-of"}},"key":"2209"},{"category":"Sm","mappings":{"default":{"default":"small element of"},"mathspeak":{"default":"small-element-of"}},"key":"220A"},{"category":"Sm","mappings":{"default":{"default":"contains as member"},"mathspeak":{"default":"contains-as-member"}},"key":"220B"},{"category":"Sm","mappings":{"default":{"default":"does not contain as member"},"mathspeak":{"default":"does-not-contain-as-member"}},"key":"220C"},{"category":"Sm","mappings":{"default":{"default":"small contains as member"},"mathspeak":{"default":"small-contains-as-member"}},"key":"220D"},{"category":"Sm","mappings":{"default":{"default":"end of proof"},"mathspeak":{"default":"end-of-proof"}},"key":"220E"},{"category":"Sm","mappings":{"default":{"default":"n ary product"},"mathspeak":{"default":"product"}},"key":"220F"},{"category":"Sm","mappings":{"default":{"default":"n ary coproduct"},"mathspeak":{"default":"coproduct"}},"key":"2210"},{"category":"Sm","mappings":{"default":{"default":"n ary summation"},"mathspeak":{"default":"sigma-summation"}},"key":"2211"},{"category":"Sm","mappings":{"default":{"default":"minus sign","short":"minus"}},"key":"2212"},{"category":"Sm","mappings":{"default":{"default":"minus or plus sign","short":"minus or plus"},"mathspeak":{"default":"minus-or-plus"}},"key":"2213"},{"category":"Sm","mappings":{"default":{"default":"dot plus"},"mathspeak":{"default":"dot-plus"}},"key":"2214"},{"category":"Sm","mappings":{"default":{"default":"division slash"},"mathspeak":{"default":"division-slash"}},"key":"2215"},{"category":"Sm","mappings":{"default":{"default":"set minus"},"mathspeak":{"default":"set-minus"}},"key":"2216"},{"category":"Sm","mappings":{"default":{"default":"asterisk operator"},"mathspeak":{"default":"asterisk"}},"key":"2217"},{"category":"Sm","mappings":{"default":{"default":"ring operator"},"mathspeak":{"default":"ring"}},"key":"2218"},{"category":"Sm","mappings":{"default":{"default":"bullet operator"},"mathspeak":{"default":"bullet"}},"key":"2219"},{"category":"Sm","mappings":{"default":{"default":"square root"},"mathspeak":{"default":"square-root"}},"key":"221A"},{"category":"Sm","mappings":{"default":{"default":"cube root"},"mathspeak":{"default":"cube-root"}},"key":"221B"},{"category":"Sm","mappings":{"default":{"default":"fourth root"},"mathspeak":{"default":"fourth-root"}},"key":"221C"},{"category":"Sm","mappings":{"default":{"default":"proportional to"},"mathspeak":{"default":"proportional-to"}},"key":"221D"},{"category":"Sm","mappings":{"default":{"default":"infinity"}},"key":"221E"},{"category":"Sm","mappings":{"default":{"default":"right angle"},"mathspeak":{"default":"right-angle"}},"key":"221F"},{"category":"Sm","mappings":{"default":{"default":"angle"}},"key":"2220"},{"category":"Sm","mappings":{"default":{"default":"measured angle"},"mathspeak":{"default":"measured-angle"}},"key":"2221"},{"category":"Sm","mappings":{"default":{"default":"spherical angle"},"mathspeak":{"default":"spherical-angle"}},"key":"2222"},{"category":"Sm","mappings":{"default":{"default":"divides","short":"bar"}},"key":"2223"},{"category":"Sm","mappings":{"default":{"default":"does not divide"},"mathspeak":{"default":"does-not-divide"}},"key":"2224"},{"category":"Sm","mappings":{"default":{"default":"parallel to"},"mathspeak":{"default":"parallel-to"}},"key":"2225"},{"category":"Sm","mappings":{"default":{"default":"not parallel to"},"mathspeak":{"default":"not-parallel-to"}},"key":"2226"},{"category":"Sm","mappings":{"default":{"default":"logical and"},"mathspeak":{"default":"logical-and"}},"key":"2227"},{"category":"Sm","mappings":{"default":{"default":"logical or"},"mathspeak":{"default":"logical-or"}},"key":"2228"},{"category":"Sm","mappings":{"default":{"default":"intersection"}},"key":"2229"},{"category":"Sm","mappings":{"default":{"default":"union"}},"key":"222A"},{"category":"Sm","mappings":{"default":{"default":"integral"}},"key":"222B"},{"category":"Sm","mappings":{"default":{"default":"double integral"},"mathspeak":{"default":"double-integral"}},"key":"222C"},{"category":"Sm","mappings":{"default":{"default":"triple integral"},"mathspeak":{"default":"triple-integral"}},"key":"222D"},{"category":"Sm","mappings":{"default":{"default":"contour integral"},"mathspeak":{"default":"contour-integral"}},"key":"222E"},{"category":"Sm","mappings":{"default":{"default":"surface integral"},"mathspeak":{"default":"surface-integral"}},"key":"222F"},{"category":"Sm","mappings":{"default":{"default":"volume integral"},"mathspeak":{"default":"volume-integral"}},"key":"2230"},{"category":"Sm","mappings":{"default":{"default":"clockwise integral"},"mathspeak":{"default":"clockwise-integral"}},"key":"2231"},{"category":"Sm","mappings":{"default":{"default":"clockwise contour integral"},"mathspeak":{"default":"clockwise-contour-integral"}},"key":"2232"},{"category":"Sm","mappings":{"default":{"default":"anticlockwise contour integral"},"mathspeak":{"default":"anticlockwise-contour-integral"}},"key":"2233"},{"category":"Sm","mappings":{"default":{"default":"therefore"}},"key":"2234"},{"category":"Sm","mappings":{"default":{"default":"because"}},"key":"2235"},{"category":"Sm","mappings":{"default":{"default":"ratio"}},"key":"2236"},{"category":"Sm","mappings":{"default":{"default":"proportion"}},"key":"2237"},{"category":"Sm","mappings":{"default":{"default":"dot minus"},"mathspeak":{"default":"dot-minus"}},"key":"2238"},{"category":"Sm","mappings":{"default":{"default":"excess"}},"key":"2239"},{"category":"Sm","mappings":{"default":{"default":"geometric proportion"},"mathspeak":{"default":"geometric-proportion"}},"key":"223A"},{"category":"Sm","mappings":{"default":{"default":"homothetic"}},"key":"223B"},{"category":"Sm","mappings":{"default":{"default":"tilde operator"},"mathspeak":{"default":"tilde"}},"key":"223C"},{"category":"Sm","mappings":{"default":{"default":"reversed tilde"},"mathspeak":{"default":"reversed-tilde"}},"key":"223D"},{"category":"Sm","mappings":{"default":{"default":"inverted lazy s"},"mathspeak":{"default":"inverted-lazy-s"}},"key":"223E"},{"category":"Sm","mappings":{"default":{"default":"sine wave"},"mathspeak":{"default":"sine-wave"}},"key":"223F"},{"category":"Sm","mappings":{"default":{"default":"wreath product"},"mathspeak":{"default":"wreath-product"}},"key":"2240"},{"category":"Sm","mappings":{"default":{"default":"not tilde"},"mathspeak":{"default":"not-tilde"}},"key":"2241"},{"category":"Sm","mappings":{"default":{"default":"minus tilde"},"mathspeak":{"default":"minus-tilde"}},"key":"2242"},{"category":"Sm","mappings":{"default":{"default":"asymptotically equals"},"mathspeak":{"default":"asymptotically-equals"}},"key":"2243"},{"category":"Sm","mappings":{"default":{"default":"not asymptotically equals"},"mathspeak":{"default":"not-asymptotically-equals"}},"key":"2244"},{"category":"Sm","mappings":{"default":{"default":"approximately equals"},"mathspeak":{"default":"approximately-equals"}},"key":"2245"},{"category":"Sm","mappings":{"default":{"default":"approximately but not actually equals"},"mathspeak":{"default":"approximately-but-not-actually-equals"}},"key":"2246"},{"category":"Sm","mappings":{"default":{"default":"neither approximately nor actually equals"},"mathspeak":{"default":"neither-approximately-nor-actually-equals"}},"key":"2247"},{"category":"Sm","mappings":{"default":{"default":"almost equals"},"mathspeak":{"default":"almost-equals"}},"key":"2248"},{"category":"Sm","mappings":{"default":{"default":"not almost equals"},"mathspeak":{"default":"not-almost-equals"}},"key":"2249"},{"category":"Sm","mappings":{"default":{"default":"almost equal or equals"},"mathspeak":{"default":"almost-equal-or-equal-to"}},"key":"224A"},{"category":"Sm","mappings":{"default":{"default":"triple tilde"},"mathspeak":{"default":"triple-tilde"}},"key":"224B"},{"category":"Sm","mappings":{"default":{"default":"all equals"},"mathspeak":{"default":"all-equals"}},"key":"224C"},{"category":"Sm","mappings":{"default":{"default":"equivalent to"},"mathspeak":{"default":"equivalent-to"}},"key":"224D"},{"category":"Sm","mappings":{"default":{"default":"geometrically equivalent to"},"mathspeak":{"default":"geometrically-equivalent-to"}},"key":"224E"},{"category":"Sm","mappings":{"default":{"default":"difference between"},"mathspeak":{"default":"difference-between"}},"key":"224F"},{"category":"Sm","mappings":{"default":{"default":"approaches the limit"},"mathspeak":{"default":"approaches-the-limit"}},"key":"2250"},{"category":"Sm","mappings":{"default":{"default":"geometrically equals"},"mathspeak":{"default":"geometrically-equals"}},"key":"2251"},{"category":"Sm","mappings":{"default":{"default":"approximately equals or the image of"},"mathspeak":{"default":"approximately-equals-or-the-image-of"}},"key":"2252"},{"category":"Sm","mappings":{"default":{"default":"image of or approximately equals"},"mathspeak":{"default":"image-of-or-approximately-equals"}},"key":"2253"},{"category":"Sm","mappings":{"default":{"default":"colon equals","alternative":"colon equal"},"mathspeak":{"default":"colon-equal"}},"key":"2254"},{"category":"Sm","mappings":{"default":{"default":"equals colon","alternative":"equal colon"},"mathspeak":{"default":"equal-colon"}},"key":"2255"},{"category":"Sm","mappings":{"default":{"default":"ring in equals"},"mathspeak":{"default":"ring-in-equals"}},"key":"2256"},{"category":"Sm","mappings":{"default":{"default":"ring equals"},"mathspeak":{"default":"ring-equals"}},"key":"2257"},{"category":"Sm","mappings":{"default":{"default":"corresponds to"},"mathspeak":{"default":"corresponds-to"}},"key":"2258"},{"category":"Sm","mappings":{"default":{"default":"estimates"}},"key":"2259"},{"category":"Sm","mappings":{"default":{"default":"equiangular to"},"mathspeak":{"default":"equiangular-to"}},"key":"225A"},{"category":"Sm","mappings":{"default":{"default":"star equals"},"mathspeak":{"default":"star-equals"}},"key":"225B"},{"category":"Sm","mappings":{"default":{"default":"delta equals"},"mathspeak":{"default":"delta-equals"}},"key":"225C"},{"category":"Sm","mappings":{"default":{"default":"equals by definition"},"mathspeak":{"default":"equals-by-definition"}},"key":"225D"},{"category":"Sm","mappings":{"default":{"default":"measured by"},"mathspeak":{"default":"measured-by"}},"key":"225E"},{"category":"Sm","mappings":{"default":{"default":"questioned equals"},"mathspeak":{"default":"questioned-equals"}},"key":"225F"},{"category":"Sm","mappings":{"default":{"default":"not equals"},"mathspeak":{"default":"not-equals"}},"key":"2260"},{"category":"Sm","mappings":{"default":{"default":"identical to"},"mathspeak":{"default":"identical-to"}},"key":"2261"},{"category":"Sm","mappings":{"default":{"default":"not identical to"},"mathspeak":{"default":"not-identical-to"}},"key":"2262"},{"category":"Sm","mappings":{"default":{"default":"strictly equivalent to"},"mathspeak":{"default":"strictly-equivalent-to"}},"key":"2263"},{"category":"Sm","mappings":{"default":{"default":"less than or equals","alternative":"less than or equals"},"mathspeak":{"default":"less-than-or-equal-to"}},"key":"2264"},{"category":"Sm","mappings":{"default":{"default":"greater than or equals","alternative":"greater than or equals"},"mathspeak":{"default":"greater-than-or-equal-to"}},"key":"2265"},{"category":"Sm","mappings":{"default":{"default":"less than over equals","alternative":"less than over equals"},"mathspeak":{"default":"less-than-over-equals"}},"key":"2266"},{"category":"Sm","mappings":{"default":{"default":"greater than over equals","alternative":"greater than over equals"},"mathspeak":{"default":"greater-than-over-equals"}},"key":"2267"},{"category":"Sm","mappings":{"default":{"default":"less than but not equals","alternative":"less than but not equals"},"mathspeak":{"default":"less-than-but-not-equals"}},"key":"2268"},{"category":"Sm","mappings":{"default":{"default":"greater than but not equals","alternative":"greater than but not equals"},"mathspeak":{"default":"greater-than-but-not-equals"}},"key":"2269"},{"category":"Sm","mappings":{"default":{"default":"much less than","alternative":"much less than"},"mathspeak":{"default":"much-less-than"}},"key":"226A"},{"category":"Sm","mappings":{"default":{"default":"much greater than","alternative":"much greater than"},"mathspeak":{"default":"much-greater-than"}},"key":"226B"},{"category":"Sm","mappings":{"default":{"default":"between"}},"key":"226C"},{"category":"Sm","mappings":{"default":{"default":"not equivalent to"},"mathspeak":{"default":"not-equivalent-to"}},"key":"226D"},{"category":"Sm","mappings":{"default":{"default":"not less than","alternative":"not less than"},"mathspeak":{"default":"not-less-than"}},"key":"226E"},{"category":"Sm","mappings":{"default":{"default":"not greater than","alternative":"not greater than"},"mathspeak":{"default":"not-greater-than"}},"key":"226F"},{"category":"Sm","mappings":{"default":{"default":"neither less than nor equals","alternative":"neither less than nor equals"},"mathspeak":{"default":"neither-less-than-nor-equal-to"}},"key":"2270"},{"category":"Sm","mappings":{"default":{"default":"neither greater than nor equals","alternative":"neither greater than nor equals"},"mathspeak":{"default":"neither-greater-than-nor-equal-to"}},"key":"2271"},{"category":"Sm","mappings":{"default":{"default":"less than or equivalent to","alternative":"less than or equivalent to"},"mathspeak":{"default":"less-than-or-equivalent-to"}},"key":"2272"},{"category":"Sm","mappings":{"default":{"default":"greater than or equivalent to","alternative":"greater than or equivalent to"},"mathspeak":{"default":"greater-than-or-equivalent-to"}},"key":"2273"},{"category":"Sm","mappings":{"default":{"default":"neither less than nor equivalent to","alternative":"neither less than nor equivalent to"},"mathspeak":{"default":"neither-less-than-nor-equivalent-to"}},"key":"2274"},{"category":"Sm","mappings":{"default":{"default":"neither greater than nor equivalent to","alternative":"neither greater than nor equivalent to"},"mathspeak":{"default":"neither-greater-than-nor-equivalent-to"}},"key":"2275"},{"category":"Sm","mappings":{"default":{"default":"less than or greater than","alternative":"less than or greater than"},"mathspeak":{"default":"less-than-or-greater-than"}},"key":"2276"},{"category":"Sm","mappings":{"default":{"default":"greater than or less than","alternative":"greater than or less than"},"mathspeak":{"default":"greater-than-or-less-than"}},"key":"2277"},{"category":"Sm","mappings":{"default":{"default":"neither less than nor greater than","alternative":"neither less than nor greater than"},"mathspeak":{"default":"neither-less-than-nor-greater-than"}},"key":"2278"},{"category":"Sm","mappings":{"default":{"default":"neither greater than nor less than","alternative":"neither greater than nor less than"},"mathspeak":{"default":"neither-greater-than-nor-less-than"}},"key":"2279"},{"category":"Sm","mappings":{"default":{"default":"precedes"}},"key":"227A"},{"category":"Sm","mappings":{"default":{"default":"succeeds"}},"key":"227B"},{"category":"Sm","mappings":{"default":{"default":"precedes or equals"},"mathspeak":{"default":"precedes-or-equal-to"}},"key":"227C"},{"category":"Sm","mappings":{"default":{"default":"succeeds or equals"},"mathspeak":{"default":"succeeds-or-equal-to"}},"key":"227D"},{"category":"Sm","mappings":{"default":{"default":"precedes or equivalent to"},"mathspeak":{"default":"precedes-or-equivalent-to"}},"key":"227E"},{"category":"Sm","mappings":{"default":{"default":"succeeds or equivalent to"},"mathspeak":{"default":"succeeds-or-equivalent-to"}},"key":"227F"},{"category":"Sm","mappings":{"default":{"default":"does not precede"},"mathspeak":{"default":"does-not-precede"}},"key":"2280"},{"category":"Sm","mappings":{"default":{"default":"does not succeed"},"mathspeak":{"default":"does-not-succeed"}},"key":"2281"},{"category":"Sm","mappings":{"default":{"default":"subset of"},"mathspeak":{"default":"subset-of"}},"key":"2282"},{"category":"Sm","mappings":{"default":{"default":"superset of"},"mathspeak":{"default":"superset-of"}},"key":"2283"},{"category":"Sm","mappings":{"default":{"default":"not a subset of"},"mathspeak":{"default":"not-a-subset-of"}},"key":"2284"},{"category":"Sm","mappings":{"default":{"default":"not a superset of"},"mathspeak":{"default":"not-a-superset-of"}},"key":"2285"},{"category":"Sm","mappings":{"default":{"default":"subset of or equals"},"mathspeak":{"default":"subset-of-or-equal-to"}},"key":"2286"},{"category":"Sm","mappings":{"default":{"default":"superset of or equals"},"mathspeak":{"default":"superset-of-or-equal-to"}},"key":"2287"},{"category":"Sm","mappings":{"default":{"default":"neither a subset of nor equals"},"mathspeak":{"default":"neither-a-subset-of-nor-equal-to"}},"key":"2288"},{"category":"Sm","mappings":{"default":{"default":"neither a superset of nor equals"},"mathspeak":{"default":"neither-a-superset-of-nor-equal-to"}},"key":"2289"},{"category":"Sm","mappings":{"default":{"default":"subset of with not equals","alternative":"subset of or not equals","short":"subset of or not equals"},"mathspeak":{"default":"subset-of-or-not-equals"}},"key":"228A"},{"category":"Sm","mappings":{"default":{"default":"superset of with not equals","alternative":"superset of or not equals","short":"superset of or not equals"},"mathspeak":{"default":"superset-of-or-not-equals"}},"key":"228B"},{"category":"Sm","mappings":{"default":{"default":"multiset"}},"key":"228C"},{"category":"Sm","mappings":{"default":{"default":"multiset multiplication"},"mathspeak":{"default":"multiset-multiplication"}},"key":"228D"},{"category":"Sm","mappings":{"default":{"default":"multiset union"},"mathspeak":{"default":"multiset-union"}},"key":"228E"},{"category":"Sm","mappings":{"default":{"default":"square image of"},"mathspeak":{"default":"square-image-of"}},"key":"228F"},{"category":"Sm","mappings":{"default":{"default":"square original of"},"mathspeak":{"default":"square-original-of"}},"key":"2290"},{"category":"Sm","mappings":{"default":{"default":"square image of or equals"},"mathspeak":{"default":"square-image-of-or-equal-to"}},"key":"2291"},{"category":"Sm","mappings":{"default":{"default":"square original of or equals"},"mathspeak":{"default":"square-original-of-or-equal-to"}},"key":"2292"},{"category":"Sm","mappings":{"default":{"default":"square cap"},"mathspeak":{"default":"square-cap"}},"key":"2293"},{"category":"Sm","mappings":{"default":{"default":"square cup"},"mathspeak":{"default":"square-cup"}},"key":"2294"},{"category":"Sm","mappings":{"default":{"default":"circled plus"},"mathspeak":{"default":"circled-plus"}},"key":"2295"},{"category":"Sm","mappings":{"default":{"default":"circled minus"},"mathspeak":{"default":"circled-minus"}},"key":"2296"},{"category":"Sm","mappings":{"default":{"default":"circled times"},"mathspeak":{"default":"circled-times"}},"key":"2297"},{"category":"Sm","mappings":{"default":{"default":"circled division slash"},"mathspeak":{"default":"circled-division-slash"}},"key":"2298"},{"category":"Sm","mappings":{"default":{"default":"circled dot operator"},"mathspeak":{"default":"circled-dot"}},"key":"2299"},{"category":"Sm","mappings":{"default":{"default":"circled ring operator"},"mathspeak":{"default":"circled-ring"}},"key":"229A"},{"category":"Sm","mappings":{"default":{"default":"circled asterisk operator"},"mathspeak":{"default":"circled-asterisk"}},"key":"229B"},{"category":"Sm","mappings":{"default":{"default":"circled equals"},"mathspeak":{"default":"circled-equals"}},"key":"229C"},{"category":"Sm","mappings":{"default":{"default":"circled dash"},"mathspeak":{"default":"circled-dash"}},"key":"229D"},{"category":"Sm","mappings":{"default":{"default":"squared plus"},"mathspeak":{"default":"squared-plus"}},"key":"229E"},{"category":"Sm","mappings":{"default":{"default":"squared minus"},"mathspeak":{"default":"squared-minus"}},"key":"229F"},{"category":"Sm","mappings":{"default":{"default":"squared times"},"mathspeak":{"default":"squared-times"}},"key":"22A0"},{"category":"Sm","mappings":{"default":{"default":"squared dot operator"},"mathspeak":{"default":"squared-dot"}},"key":"22A1"},{"category":"Sm","mappings":{"default":{"default":"right tack"},"mathspeak":{"default":"right-tack"}},"key":"22A2"},{"category":"Sm","mappings":{"default":{"default":"left tack"},"mathspeak":{"default":"left-tack"}},"key":"22A3"},{"category":"Sm","mappings":{"default":{"default":"down tack"},"mathspeak":{"default":"down-tack"}},"key":"22A4"},{"category":"Sm","mappings":{"default":{"default":"up tack"},"mathspeak":{"default":"up-tack"}},"key":"22A5"},{"category":"Sm","mappings":{"default":{"default":"assertion"}},"key":"22A6"},{"category":"Sm","mappings":{"default":{"default":"models"}},"key":"22A7"},{"category":"Sm","mappings":{"default":{"default":"true"}},"key":"22A8"},{"category":"Sm","mappings":{"default":{"default":"forces"}},"key":"22A9"},{"category":"Sm","mappings":{"default":{"default":"triple vertical bar right turnstile"},"mathspeak":{"default":"triple-vertical-bar-right-turnstile"}},"key":"22AA"},{"category":"Sm","mappings":{"default":{"default":"double vertical bar double right turnstile"},"mathspeak":{"default":"double-vertical-bar-double-right-turnstile"}},"key":"22AB"},{"category":"Sm","mappings":{"default":{"default":"does not prove"},"mathspeak":{"default":"does-not-prove"}},"key":"22AC"},{"category":"Sm","mappings":{"default":{"default":"not true"},"mathspeak":{"default":"not-true"}},"key":"22AD"},{"category":"Sm","mappings":{"default":{"default":"does not force"},"mathspeak":{"default":"does-not-force"}},"key":"22AE"},{"category":"Sm","mappings":{"default":{"default":"negated double vertical bar double right turnstile"},"mathspeak":{"default":"negated-double-vertical-bar-double-right-turnstile"}},"key":"22AF"},{"category":"Sm","mappings":{"default":{"default":"precedes under relation"},"mathspeak":{"default":"precedes-under-relation"}},"key":"22B0"},{"category":"Sm","mappings":{"default":{"default":"succeeds under relation"},"mathspeak":{"default":"succeeds-under-relation"}},"key":"22B1"},{"category":"Sm","mappings":{"default":{"default":"normal subgroup of"},"mathspeak":{"default":"normal-subgroup-of"}},"key":"22B2"},{"category":"Sm","mappings":{"default":{"default":"contains as normal subgroup"},"mathspeak":{"default":"contains-as-normal-subgroup"}},"key":"22B3"},{"category":"Sm","mappings":{"default":{"default":"normal subgroup of or equals"},"mathspeak":{"default":"normal-subgroup-of-or-equal-to"}},"key":"22B4"},{"category":"Sm","mappings":{"default":{"default":"contains as normal subgroup or equals"},"mathspeak":{"default":"contains-as-normal-subgroup-or-equal-to"}},"key":"22B5"},{"category":"Sm","mappings":{"default":{"default":"original of"},"mathspeak":{"default":"original-of"}},"key":"22B6"},{"category":"Sm","mappings":{"default":{"default":"image of"},"mathspeak":{"default":"image-of"}},"key":"22B7"},{"category":"Sm","mappings":{"default":{"default":"multimap"}},"key":"22B8"},{"category":"Sm","mappings":{"default":{"default":"hermitian conjugate matrix"},"mathspeak":{"default":"hermitian-conjugate-matrix"}},"key":"22B9"},{"category":"Sm","mappings":{"default":{"default":"intercalate"}},"key":"22BA"},{"category":"Sm","mappings":{"default":{"default":"xor"}},"key":"22BB"},{"category":"Sm","mappings":{"default":{"default":"nand"}},"key":"22BC"},{"category":"Sm","mappings":{"default":{"default":"nor"}},"key":"22BD"},{"category":"Sm","mappings":{"default":{"default":"right triangle"},"mathspeak":{"default":"right-triangle"}},"key":"22BF"},{"category":"Sm","mappings":{"default":{"default":"n ary logical and"},"mathspeak":{"default":"logical-and"}},"key":"22C0"},{"category":"Sm","mappings":{"default":{"default":"n ary logical or"},"mathspeak":{"default":"logical-or"}},"key":"22C1"},{"category":"Sm","mappings":{"default":{"default":"n ary intersection"},"mathspeak":{"default":"intersection"}},"key":"22C2"},{"category":"Sm","mappings":{"default":{"default":"n ary union"},"mathspeak":{"default":"union"}},"key":"22C3"},{"category":"Sm","mappings":{"default":{"default":"diamond operator"},"mathspeak":{"default":"diamond"}},"key":"22C4"},{"category":"Sm","mappings":{"default":{"default":"dot operator"},"mathspeak":{"default":"dot"}},"key":"22C5"},{"category":"Sm","mappings":{"default":{"default":"star operator"},"mathspeak":{"default":"star"}},"key":"22C6"},{"category":"Sm","mappings":{"default":{"default":"division times"},"mathspeak":{"default":"division-times"}},"key":"22C7"},{"category":"Sm","mappings":{"default":{"default":"bowtie"}},"key":"22C8"},{"category":"Sm","mappings":{"default":{"default":"left normal factor semidirect product"},"mathspeak":{"default":"left-normal-factor-semidirect-product"}},"key":"22C9"},{"category":"Sm","mappings":{"default":{"default":"right normal factor semidirect product"},"mathspeak":{"default":"right-normal-factor-semidirect-product"}},"key":"22CA"},{"category":"Sm","mappings":{"default":{"default":"left semidirect product"},"mathspeak":{"default":"left-semidirect-product"}},"key":"22CB"},{"category":"Sm","mappings":{"default":{"default":"right semidirect product"},"mathspeak":{"default":"right-semidirect-product"}},"key":"22CC"},{"category":"Sm","mappings":{"default":{"default":"reversed tilde equals"},"mathspeak":{"default":"reversed-tilde-equals"}},"key":"22CD"},{"category":"Sm","mappings":{"default":{"default":"curly logical or"},"mathspeak":{"default":"curly-logical-or"}},"key":"22CE"},{"category":"Sm","mappings":{"default":{"default":"curly logical and"},"mathspeak":{"default":"curly-logical-and"}},"key":"22CF"},{"category":"Sm","mappings":{"default":{"default":"double subset"},"mathspeak":{"default":"double-subset"}},"key":"22D0"},{"category":"Sm","mappings":{"default":{"default":"double superset"},"mathspeak":{"default":"double-superset"}},"key":"22D1"},{"category":"Sm","mappings":{"default":{"default":"double intersection"},"mathspeak":{"default":"double-intersection"}},"key":"22D2"},{"category":"Sm","mappings":{"default":{"default":"double union"},"mathspeak":{"default":"double-union"}},"key":"22D3"},{"category":"Sm","mappings":{"default":{"default":"pitchfork"}},"key":"22D4"},{"category":"Sm","mappings":{"default":{"default":"equal and parallel to"},"mathspeak":{"default":"equal-and-parallel-to"}},"key":"22D5"},{"category":"Sm","mappings":{"default":{"default":"less than with dot","alternative":"less than with dot","short":"less than dot"},"mathspeak":{"default":"less-than-dot"}},"key":"22D6"},{"category":"Sm","mappings":{"default":{"default":"greater than with dot","alternative":"greater than with dot","short":"greater than dot"},"mathspeak":{"default":"greater-than-dot"}},"key":"22D7"},{"category":"Sm","mappings":{"default":{"default":"very much less than","alternative":"very much less than"},"mathspeak":{"default":"very-much-less-than"}},"key":"22D8"},{"category":"Sm","mappings":{"default":{"default":"very much greater than","alternative":"very much greater than"},"mathspeak":{"default":"very-much-greater-than"}},"key":"22D9"},{"category":"Sm","mappings":{"default":{"default":"less than equals or greater than","alternative":"less than equals or greater than"},"mathspeak":{"default":"less-than-equals-or-greater-than"}},"key":"22DA"},{"category":"Sm","mappings":{"default":{"default":"greater than equals or less than","alternative":"greater than equals or less than"},"mathspeak":{"default":"greater-than-equals-or-less-than"}},"key":"22DB"},{"category":"Sm","mappings":{"default":{"default":"equals or less than","alternative":"equals or less than"},"mathspeak":{"default":"equals-or-less-than"}},"key":"22DC"},{"category":"Sm","mappings":{"default":{"default":"equals or greater than","alternative":"equals or greater than"},"mathspeak":{"default":"equals-or-greater-than"}},"key":"22DD"},{"category":"Sm","mappings":{"default":{"default":"equals or precedes"},"mathspeak":{"default":"equals-or-precedes"}},"key":"22DE"},{"category":"Sm","mappings":{"default":{"default":"equals or succeeds"},"mathspeak":{"default":"equals-or-succeeds"}},"key":"22DF"},{"category":"Sm","mappings":{"default":{"default":"does not precede or equal"},"mathspeak":{"default":"does-not-precede-or-equal"}},"key":"22E0"},{"category":"Sm","mappings":{"default":{"default":"does not succeed or equal"},"mathspeak":{"default":"does-not-succeed-or-equal"}},"key":"22E1"},{"category":"Sm","mappings":{"default":{"default":"not square image of or equals"},"mathspeak":{"default":"not-square-image-of-or-equal-to"}},"key":"22E2"},{"category":"Sm","mappings":{"default":{"default":"not square original of or equals"},"mathspeak":{"default":"not-square-original-of-or-equal-to"}},"key":"22E3"},{"category":"Sm","mappings":{"default":{"default":"square image of or not equals"},"mathspeak":{"default":"square-image-of-or-not-equals"}},"key":"22E4"},{"category":"Sm","mappings":{"default":{"default":"square original of or not equals"},"mathspeak":{"default":"square-original-of-or-not-equals"}},"key":"22E5"},{"category":"Sm","mappings":{"default":{"default":"less than but not equivalent to","alternative":"less than but not equivalent to"},"mathspeak":{"default":"less-than-but-not-equivalent-to"}},"key":"22E6"},{"category":"Sm","mappings":{"default":{"default":"greater than but not equivalent to","alternative":"greater than but not equivalent to"},"mathspeak":{"default":"greater-than-but-not-equivalent-to"}},"key":"22E7"},{"category":"Sm","mappings":{"default":{"default":"precedes but not equivalent to"},"mathspeak":{"default":"precedes-but-not-equivalent-to"}},"key":"22E8"},{"category":"Sm","mappings":{"default":{"default":"succeeds but not equivalent to"},"mathspeak":{"default":"succeeds-but-not-equivalent-to"}},"key":"22E9"},{"category":"Sm","mappings":{"default":{"default":"not normal subgroup of"},"mathspeak":{"default":"not-normal-subgroup-of"}},"key":"22EA"},{"category":"Sm","mappings":{"default":{"default":"does not contain as normal subgroup"},"mathspeak":{"default":"does-not-contain-as-normal-subgroup"}},"key":"22EB"},{"category":"Sm","mappings":{"default":{"default":"not normal subgroup of or equals"},"mathspeak":{"default":"not-normal-subgroup-of-or-equal-to"}},"key":"22EC"},{"category":"Sm","mappings":{"default":{"default":"does not contain as normal subgroup or equal"},"mathspeak":{"default":"does-not-contain-as-normal-subgroup-or-equal"}},"key":"22ED"},{"category":"Sm","mappings":{"default":{"default":"vertical ellipsis"},"mathspeak":{"default":"vertical-ellipsis"}},"key":"22EE"},{"category":"Sm","mappings":{"default":{"default":"midline horizontal ellipsis"},"mathspeak":{"default":"midline-horizontal-ellipsis"}},"key":"22EF"},{"category":"Sm","mappings":{"default":{"default":"up right diagonal ellipsis"},"mathspeak":{"default":"up-right-diagonal-ellipsis"}},"key":"22F0"},{"category":"Sm","mappings":{"default":{"default":"down right diagonal ellipsis"},"mathspeak":{"default":"down-right-diagonal-ellipsis"}},"key":"22F1"},{"category":"Sm","mappings":{"default":{"default":"element of with long horizontal stroke"},"mathspeak":{"default":"element-of-with-long-horizontal-stroke"}},"key":"22F2"},{"category":"Sm","mappings":{"default":{"default":"element of with vertical bar at end of horizontal stroke"},"mathspeak":{"default":"element-of-with-vertical-bar-at-end-of-horizontal-stroke"}},"key":"22F3"},{"category":"Sm","mappings":{"default":{"default":"small element of with vertical bar at end of horizontal stroke"},"mathspeak":{"default":"small-element-of-with-vertical-bar-at-end-of-horizontal-stroke"}},"key":"22F4"},{"category":"Sm","mappings":{"default":{"default":"element of with dot above"},"mathspeak":{"default":"element-of-with-dot-above"}},"key":"22F5"},{"category":"Sm","mappings":{"default":{"default":"element of with overbar"},"mathspeak":{"default":"element-of-with-overbar"}},"key":"22F6"},{"category":"Sm","mappings":{"default":{"default":"small element of with overbar"},"mathspeak":{"default":"small-element-of-with-overbar"}},"key":"22F7"},{"category":"Sm","mappings":{"default":{"default":"element of with underbar"},"mathspeak":{"default":"element-of-with-underbar"}},"key":"22F8"},{"category":"Sm","mappings":{"default":{"default":"element of with two horizontal strokes"},"mathspeak":{"default":"element-of-with-two-horizontal-strokes"}},"key":"22F9"},{"category":"Sm","mappings":{"default":{"default":"contains with long horizontal stroke"},"mathspeak":{"default":"contains-with-long-horizontal-stroke"}},"key":"22FA"},{"category":"Sm","mappings":{"default":{"default":"contains with vertical bar at end of horizontal stroke"},"mathspeak":{"default":"contains-with-vertical-bar-at-end-of-horizontal-stroke"}},"key":"22FB"},{"category":"Sm","mappings":{"default":{"default":"small contains with vertical bar at end of horizontal stroke"},"mathspeak":{"default":"small-contains-with-vertical-bar-at-end-of-horizontal-stroke"}},"key":"22FC"},{"category":"Sm","mappings":{"default":{"default":"contains with overbar"},"mathspeak":{"default":"contains-with-overbar"}},"key":"22FD"},{"category":"Sm","mappings":{"default":{"default":"small contains with overbar"},"mathspeak":{"default":"small-contains-with-overbar"}},"key":"22FE"},{"category":"Sm","mappings":{"default":{"default":"z notation bag membership"},"mathspeak":{"default":"z-notation-bag-membership"}},"key":"22FF"},{"category":"So","mappings":{"default":{"default":"diameter sign","short":"diameter"},"mathspeak":{"default":"diameter-sign"}},"key":"2300"},{"category":"So","mappings":{"default":{"default":"house"}},"key":"2302"},{"category":"So","mappings":{"default":{"default":"projective"}},"key":"2305"},{"category":"So","mappings":{"default":{"default":"perspective"}},"key":"2306"},{"category":"So","mappings":{"default":{"default":"wavy line"},"mathspeak":{"default":"wavy-line"}},"key":"2307"},{"category":"So","mappings":{"default":{"default":"reversed not sign","short":"reversed not"},"mathspeak":{"default":"reversed-not"}},"key":"2310"},{"category":"So","mappings":{"default":{"default":"square lozenge"},"mathspeak":{"default":"square-lozenge"}},"key":"2311"},{"category":"So","mappings":{"default":{"default":"arc"}},"key":"2312"},{"category":"So","mappings":{"default":{"default":"segment"}},"key":"2313"},{"category":"So","mappings":{"default":{"default":"sector"}},"key":"2314"},{"category":"So","mappings":{"default":{"default":"heavy plus sign","alternative":"heavy plus","short":"bold plus"},"mathspeak":{"default":"bold-plus"}},"key":"2795"},{"category":"So","mappings":{"default":{"default":"heavy minus sign","alternative":"heavy minus","short":"bold minus"},"mathspeak":{"default":"bold-minus"}},"key":"2796"},{"category":"So","mappings":{"default":{"default":"heavy division sign","alternative":"heavy division","short":"bold division"},"mathspeak":{"default":"bold-division"}},"key":"2797"},{"category":"So","mappings":{"default":{"default":"curly loop"},"mathspeak":{"default":"curly-loop"}},"key":"27B0"},{"category":"So","mappings":{"default":{"default":"double curly loop"},"mathspeak":{"default":"double-curly-loop"}},"key":"27BF"},{"category":"Sm","mappings":{"default":{"default":"white triangle containing small white triangle"},"mathspeak":{"default":"white-triangle-containing-small-white-triangle"}},"key":"27C1"},{"category":"Sm","mappings":{"default":{"default":"perpendicular"}},"key":"27C2"},{"category":"Sm","mappings":{"default":{"default":"open subset"},"mathspeak":{"default":"open-subset"}},"key":"27C3"},{"category":"Sm","mappings":{"default":{"default":"open superset"},"mathspeak":{"default":"open-superset"}},"key":"27C4"},{"category":"Sm","mappings":{"default":{"default":"or with dot inside"},"mathspeak":{"default":"or-with-dot-inside"}},"key":"27C7"},{"category":"Sm","mappings":{"default":{"default":"reverse solidus preceding subset"},"mathspeak":{"default":"reverse-solidus-preceding-subset"}},"key":"27C8"},{"category":"Sm","mappings":{"default":{"default":"superset preceding solidus"},"mathspeak":{"default":"superset-preceding-solidus"}},"key":"27C9"},{"category":"Sm","mappings":{"default":{"default":"vertical bar with horizontal stroke"},"mathspeak":{"default":"vertical-bar-with-horizontal-stroke"}},"key":"27CA"},{"category":"Sm","mappings":{"default":{"default":"mathematical rising diagonal"},"mathspeak":{"default":"mathematical-rising-diagonal"}},"key":"27CB"},{"category":"Sm","mappings":{"default":{"default":"long division"},"mathspeak":{"default":"long-division"}},"key":"27CC"},{"category":"Sm","mappings":{"default":{"default":"mathematical falling diagonal"},"mathspeak":{"default":"mathematical-falling-diagonal"}},"key":"27CD"},{"category":"Sm","mappings":{"default":{"default":"squared logical and"},"mathspeak":{"default":"squared-logical-and"}},"key":"27CE"},{"category":"Sm","mappings":{"default":{"default":"squared logical or"},"mathspeak":{"default":"squared-logical-or"}},"key":"27CF"},{"category":"Sm","mappings":{"default":{"default":"white diamond with centered dot"},"mathspeak":{"default":"white-diamond-with-centered-dot"}},"key":"27D0"},{"category":"Sm","mappings":{"default":{"default":"and with dot"},"mathspeak":{"default":"and-with-dot"}},"key":"27D1"},{"category":"Sm","mappings":{"default":{"default":"element of opening upwards"},"mathspeak":{"default":"element-of-opening-upwards"}},"key":"27D2"},{"category":"Sm","mappings":{"default":{"default":"lower right corner with dot"},"mathspeak":{"default":"lower-right-corner-with-dot"}},"key":"27D3"},{"category":"Sm","mappings":{"default":{"default":"upper left corner with dot"},"mathspeak":{"default":"upper-left-corner-with-dot"}},"key":"27D4"},{"category":"Sm","mappings":{"default":{"default":"left outer join"},"mathspeak":{"default":"left-outer-join"}},"key":"27D5"},{"category":"Sm","mappings":{"default":{"default":"right outer join"},"mathspeak":{"default":"right-outer-join"}},"key":"27D6"},{"category":"Sm","mappings":{"default":{"default":"full outer join"},"mathspeak":{"default":"full-outer-join"}},"key":"27D7"},{"category":"Sm","mappings":{"default":{"default":"large up tack"},"mathspeak":{"default":"large-up-tack"}},"key":"27D8"},{"category":"Sm","mappings":{"default":{"default":"large down tack"},"mathspeak":{"default":"large-down-tack"}},"key":"27D9"},{"category":"Sm","mappings":{"default":{"default":"left and right double turnstile"},"mathspeak":{"default":"left-and-right-double-turnstile"}},"key":"27DA"},{"category":"Sm","mappings":{"default":{"default":"left and right tack"},"mathspeak":{"default":"left-and-right-tack"}},"key":"27DB"},{"category":"Sm","mappings":{"default":{"default":"left multimap"},"mathspeak":{"default":"left-multimap"}},"key":"27DC"},{"category":"Sm","mappings":{"default":{"default":"long right tack"},"mathspeak":{"default":"long-right-tack"}},"key":"27DD"},{"category":"Sm","mappings":{"default":{"default":"long left tack"},"mathspeak":{"default":"long-left-tack"}},"key":"27DE"},{"category":"Sm","mappings":{"default":{"default":"up tack with circle above"},"mathspeak":{"default":"up-tack-with-circle-above"}},"key":"27DF"},{"category":"Sm","mappings":{"default":{"default":"lozenge divided by horizontal rule"},"mathspeak":{"default":"lozenge-divided-by-horizontal-rule"}},"key":"27E0"},{"category":"Sm","mappings":{"default":{"default":"white concave sided diamond"},"mathspeak":{"default":"white-concave-sided-diamond"}},"key":"27E1"},{"category":"Sm","mappings":{"default":{"default":"white concave sided diamond with leftwards tick"},"mathspeak":{"default":"white-concave-sided-diamond-with-leftwards-tick"}},"key":"27E2"},{"category":"Sm","mappings":{"default":{"default":"white concave sided diamond with rightwards tick"},"mathspeak":{"default":"white-concave-sided-diamond-with-rightwards-tick"}},"key":"27E3"},{"category":"Sm","mappings":{"default":{"default":"white square with leftwards tick"},"mathspeak":{"default":"white-square-with-leftwards-tick"}},"key":"27E4"},{"category":"Sm","mappings":{"default":{"default":"white square with rightwards tick"},"mathspeak":{"default":"white-square-with-rightwards-tick"}},"key":"27E5"},{"category":"Sm","mappings":{"default":{"default":"rising diagonal crossing falling diagonal"},"mathspeak":{"default":"rising-diagonal-crossing-falling-diagonal"}},"key":"292B"},{"category":"Sm","mappings":{"default":{"default":"falling diagonal crossing rising diagonal"},"mathspeak":{"default":"falling-diagonal-crossing-rising-diagonal"}},"key":"292C"},{"category":"Sm","mappings":{"default":{"default":"triple vertical bar delimiter"},"mathspeak":{"default":"triple-vertical-bar-delimiter"}},"key":"2980"},{"category":"Sm","mappings":{"default":{"default":"z notation spot"},"mathspeak":{"default":"z-notation-spot"}},"key":"2981"},{"category":"Sm","mappings":{"default":{"default":"z notation type colon"},"mathspeak":{"default":"z-notation-type-colon"}},"key":"2982"},{"category":"Sm","mappings":{"default":{"default":"dotted fence"},"mathspeak":{"default":"dotted-fence"}},"key":"2999"},{"category":"Sm","mappings":{"default":{"default":"vertical zigzag line"},"mathspeak":{"default":"vertical-zigzag-line"}},"key":"299A"},{"category":"Sm","mappings":{"default":{"default":"reversed empty set"},"mathspeak":{"default":"reversed-empty-set"}},"key":"29B0"},{"category":"Sm","mappings":{"default":{"default":"empty set with overbar"},"mathspeak":{"default":"empty-set-with-overbar"}},"key":"29B1"},{"category":"Sm","mappings":{"default":{"default":"empty set with small circle above"},"mathspeak":{"default":"empty-set-with-small-circle-above"}},"key":"29B2"},{"category":"Sm","mappings":{"default":{"default":"circle with horizontal bar"},"mathspeak":{"default":"circle-with-horizontal-bar"}},"key":"29B5"},{"category":"Sm","mappings":{"default":{"default":"circled vertical bar"},"mathspeak":{"default":"circled-vertical-bar"}},"key":"29B6"},{"category":"Sm","mappings":{"default":{"default":"circled parallel"},"mathspeak":{"default":"circled-parallel"}},"key":"29B7"},{"category":"Sm","mappings":{"default":{"default":"circled reverse solidus"},"mathspeak":{"default":"circled-reverse-solidus"}},"key":"29B8"},{"category":"Sm","mappings":{"default":{"default":"circled perpendicular"},"mathspeak":{"default":"circled-perpendicular"}},"key":"29B9"},{"category":"Sm","mappings":{"default":{"default":"circle divided by horizontal bar and top half divided by vertical bar"},"mathspeak":{"default":"circle-divided-by-horizontal-bar-and-top-half-divided-by-vertical-bar"}},"key":"29BA"},{"category":"Sm","mappings":{"default":{"default":"circle with superimposed x"},"mathspeak":{"default":"circle-with-superimposed-x"}},"key":"29BB"},{"category":"Sm","mappings":{"default":{"default":"circled anticlockwise rotated division sign","short":"circled anticlockwise rotated division"},"mathspeak":{"default":"circled-anticlockwise-rotated-division"}},"key":"29BC"},{"category":"Sm","mappings":{"default":{"default":"circled white bullet"},"mathspeak":{"default":"circled-white-bullet"}},"key":"29BE"},{"category":"Sm","mappings":{"default":{"default":"circled bullet"},"mathspeak":{"default":"circled-bullet"}},"key":"29BF"},{"category":"Sm","mappings":{"default":{"default":"circled less than"},"mathspeak":{"default":"circled-less-than"}},"key":"29C0"},{"category":"Sm","mappings":{"default":{"default":"circled greater than"},"mathspeak":{"default":"circled-greater-than"}},"key":"29C1"},{"category":"Sm","mappings":{"default":{"default":"circle with small circle to the right"},"mathspeak":{"default":"circle-with-small-circle-to-the-right"}},"key":"29C2"},{"category":"Sm","mappings":{"default":{"default":"circle with two horizontal strokes to the right"},"mathspeak":{"default":"circle-with-two-horizontal-strokes-to-the-right"}},"key":"29C3"},{"category":"Sm","mappings":{"default":{"default":"squared rising diagonal slash"},"mathspeak":{"default":"squared-rising-diagonal-slash"}},"key":"29C4"},{"category":"Sm","mappings":{"default":{"default":"squared falling diagonal slash"},"mathspeak":{"default":"squared-falling-diagonal-slash"}},"key":"29C5"},{"category":"Sm","mappings":{"default":{"default":"squared asterisk"},"mathspeak":{"default":"squared-asterisk"}},"key":"29C6"},{"category":"Sm","mappings":{"default":{"default":"squared small circle"},"mathspeak":{"default":"squared-small-circle"}},"key":"29C7"},{"category":"Sm","mappings":{"default":{"default":"squared square"},"mathspeak":{"default":"squared-square"}},"key":"29C8"},{"category":"Sm","mappings":{"default":{"default":"two joined squares"},"mathspeak":{"default":"two-joined-squares"}},"key":"29C9"},{"category":"Sm","mappings":{"default":{"default":"triangle with dot above"},"mathspeak":{"default":"triangle-with-dot-above"}},"key":"29CA"},{"category":"Sm","mappings":{"default":{"default":"triangle with underbar"},"mathspeak":{"default":"triangle-with-underbar"}},"key":"29CB"},{"category":"Sm","mappings":{"default":{"default":"s in triangle"},"mathspeak":{"default":"s-in-triangle"}},"key":"29CC"},{"category":"Sm","mappings":{"default":{"default":"triangle with serifs at bottom"},"mathspeak":{"default":"triangle-with-serifs-at-bottom"}},"key":"29CD"},{"category":"Sm","mappings":{"default":{"default":"right triangle above left triangle"},"mathspeak":{"default":"right-triangle-above-left-triangle"}},"key":"29CE"},{"category":"Sm","mappings":{"default":{"default":"left triangle beside vertical bar"},"mathspeak":{"default":"left-triangle-beside-vertical-bar"}},"key":"29CF"},{"category":"Sm","mappings":{"default":{"default":"vertical bar beside right triangle"},"mathspeak":{"default":"vertical-bar-beside-right-triangle"}},"key":"29D0"},{"category":"Sm","mappings":{"default":{"default":"bowtie with left half black"},"mathspeak":{"default":"bowtie-with-left-half-black"}},"key":"29D1"},{"category":"Sm","mappings":{"default":{"default":"bowtie with right half black"},"mathspeak":{"default":"bowtie-with-right-half-black"}},"key":"29D2"},{"category":"Sm","mappings":{"default":{"default":"black bowtie"},"mathspeak":{"default":"black-bowtie"}},"key":"29D3"},{"category":"Sm","mappings":{"default":{"default":"times with left half black"},"mathspeak":{"default":"times-with-left-half-black"}},"key":"29D4"},{"category":"Sm","mappings":{"default":{"default":"times with right half black"},"mathspeak":{"default":"times-with-right-half-black"}},"key":"29D5"},{"category":"Sm","mappings":{"default":{"default":"white hourglass"},"mathspeak":{"default":"white-hourglass"}},"key":"29D6"},{"category":"Sm","mappings":{"default":{"default":"black hourglass"},"mathspeak":{"default":"black-hourglass"}},"key":"29D7"},{"category":"Sm","mappings":{"default":{"default":"incomplete infinity"},"mathspeak":{"default":"incomplete-infinity"}},"key":"29DC"},{"category":"Sm","mappings":{"default":{"default":"tie over infinity"},"mathspeak":{"default":"tie-over-infinity"}},"key":"29DD"},{"category":"Sm","mappings":{"default":{"default":"infinity negated with vertical bar"},"mathspeak":{"default":"infinity-negated-with-vertical-bar"}},"key":"29DE"},{"category":"Sm","mappings":{"default":{"default":"double ended multimap"},"mathspeak":{"default":"double-ended-multimap"}},"key":"29DF"},{"category":"Sm","mappings":{"default":{"default":"square with contoured outline"},"mathspeak":{"default":"square-with-contoured-outline"}},"key":"29E0"},{"category":"Sm","mappings":{"default":{"default":"increases as"},"mathspeak":{"default":"increases-as"}},"key":"29E1"},{"category":"Sm","mappings":{"default":{"default":"shuffle product"},"mathspeak":{"default":"shuffle-product"}},"key":"29E2"},{"category":"Sm","mappings":{"default":{"default":"equals sign and slanted parallel"},"mathspeak":{"default":"equals-and-slanted-parallel"}},"key":"29E3"},{"category":"Sm","mappings":{"default":{"default":"equals sign and slanted parallel with tilde above"},"mathspeak":{"default":"equals-and-slanted-parallel-with-tilde-above"}},"key":"29E4"},{"category":"Sm","mappings":{"default":{"default":"identical to and slanted parallel"},"mathspeak":{"default":"identical-to-and-slanted-parallel"}},"key":"29E5"},{"category":"Sm","mappings":{"default":{"default":"gleich stark"},"mathspeak":{"default":"gleich-stark"}},"key":"29E6"},{"category":"Sm","mappings":{"default":{"default":"thermodynamic"}},"key":"29E7"},{"category":"Sm","mappings":{"default":{"default":"down pointing triangle with left half black"},"mathspeak":{"default":"down-pointing-triangle-with-left-half-black"}},"key":"29E8"},{"category":"Sm","mappings":{"default":{"default":"down pointing triangle with right half black"},"mathspeak":{"default":"down-pointing-triangle-with-right-half-black"}},"key":"29E9"},{"category":"Sm","mappings":{"default":{"default":"black lozenge"},"mathspeak":{"default":"black-lozenge"}},"key":"29EB"},{"category":"Sm","mappings":{"default":{"default":"error barred white square"},"mathspeak":{"default":"error-barred-white-square"}},"key":"29EE"},{"category":"Sm","mappings":{"default":{"default":"error barred black square"},"mathspeak":{"default":"error-barred-black-square"}},"key":"29EF"},{"category":"Sm","mappings":{"default":{"default":"error barred white diamond"},"mathspeak":{"default":"error-barred-white-diamond"}},"key":"29F0"},{"category":"Sm","mappings":{"default":{"default":"error barred black diamond"},"mathspeak":{"default":"error-barred-black-diamond"}},"key":"29F1"},{"category":"Sm","mappings":{"default":{"default":"error barred white circle"},"mathspeak":{"default":"error-barred-white-circle"}},"key":"29F2"},{"category":"Sm","mappings":{"default":{"default":"error barred black circle"},"mathspeak":{"default":"error-barred-black-circle"}},"key":"29F3"},{"category":"Sm","mappings":{"default":{"default":"rule delayed"},"mathspeak":{"default":"rule-delayed"}},"key":"29F4"},{"category":"Sm","mappings":{"default":{"default":"reverse solidus operator"},"mathspeak":{"default":"reverse-solidus"}},"key":"29F5"},{"category":"Sm","mappings":{"default":{"default":"solidus with overbar"},"mathspeak":{"default":"solidus-with-overbar"}},"key":"29F6"},{"category":"Sm","mappings":{"default":{"default":"reverse solidus with horizontal stroke"},"mathspeak":{"default":"reverse-solidus-with-horizontal-stroke"}},"key":"29F7"},{"category":"Sm","mappings":{"default":{"default":"big solidus"},"mathspeak":{"default":"solidus"}},"key":"29F8"},{"category":"Sm","mappings":{"default":{"default":"big reverse solidus"},"mathspeak":{"default":"reverse-solidus"}},"key":"29F9"},{"category":"Sm","mappings":{"default":{"default":"double plus"},"mathspeak":{"default":"double-plus"}},"key":"29FA"},{"category":"Sm","mappings":{"default":{"default":"triple plus"},"mathspeak":{"default":"triple-plus"}},"key":"29FB"},{"category":"Sm","mappings":{"default":{"default":"tiny"}},"key":"29FE"},{"category":"Sm","mappings":{"default":{"default":"miny"}},"key":"29FF"},{"category":"Sm","mappings":{"default":{"default":"n ary circled dot operator"},"mathspeak":{"default":"circled-dot"}},"key":"2A00"},{"category":"Sm","mappings":{"default":{"default":"n ary circled plus operator"},"mathspeak":{"default":"circled-plus"}},"key":"2A01"},{"category":"Sm","mappings":{"default":{"default":"n ary circled times operator"},"mathspeak":{"default":"circled-times"}},"key":"2A02"},{"category":"Sm","mappings":{"default":{"default":"n ary union operator with dot"},"mathspeak":{"default":"union-with-dot"}},"key":"2A03"},{"category":"Sm","mappings":{"default":{"default":"n ary union operator with plus"},"mathspeak":{"default":"union-with-plus"}},"key":"2A04"},{"category":"Sm","mappings":{"default":{"default":"n ary square intersection operator"},"mathspeak":{"default":"square-intersection"}},"key":"2A05"},{"category":"Sm","mappings":{"default":{"default":"n ary square union operator"},"mathspeak":{"default":"square-union"}},"key":"2A06"},{"category":"Sm","mappings":{"default":{"default":"two logical and operator"},"mathspeak":{"default":"two-logical-and"}},"key":"2A07"},{"category":"Sm","mappings":{"default":{"default":"two logical or operator"},"mathspeak":{"default":"two-logical-or"}},"key":"2A08"},{"category":"Sm","mappings":{"default":{"default":"n ary times operator"},"mathspeak":{"default":"times"}},"key":"2A09"},{"category":"Sm","mappings":{"default":{"default":"modulo two sum"},"mathspeak":{"default":"modulo-two-sum"}},"key":"2A0A"},{"category":"Sm","mappings":{"default":{"default":"summation with integral"},"mathspeak":{"default":"summation-with-integral"}},"key":"2A0B"},{"category":"Sm","mappings":{"default":{"default":"quadruple integral operator"},"mathspeak":{"default":"quadruple-integral"}},"key":"2A0C"},{"category":"Sm","mappings":{"default":{"default":"finite part integral"},"mathspeak":{"default":"finite-part-integral"}},"key":"2A0D"},{"category":"Sm","mappings":{"default":{"default":"integral with double stroke"},"mathspeak":{"default":"integral-with-double-stroke"}},"key":"2A0E"},{"category":"Sm","mappings":{"default":{"default":"integral average with slash"},"mathspeak":{"default":"integral-average-with-slash"}},"key":"2A0F"},{"category":"Sm","mappings":{"default":{"default":"circulation function"},"mathspeak":{"default":"circulation-function"}},"key":"2A10"},{"category":"Sm","mappings":{"default":{"default":"anticlockwise integration"},"mathspeak":{"default":"anticlockwise-integration"}},"key":"2A11"},{"category":"Sm","mappings":{"default":{"default":"line integration with rectangular path around pole"},"mathspeak":{"default":"line-integration-with-rectangular-path-around-pole"}},"key":"2A12"},{"category":"Sm","mappings":{"default":{"default":"line integration with semicircular path around pole"},"mathspeak":{"default":"line-integration-with-semicircular-path-around-pole"}},"key":"2A13"},{"category":"Sm","mappings":{"default":{"default":"line integration not including the pole"},"mathspeak":{"default":"line-integration-not-including-the-pole"}},"key":"2A14"},{"category":"Sm","mappings":{"default":{"default":"integral around a point operator"},"mathspeak":{"default":"integral-around-a-point"}},"key":"2A15"},{"category":"Sm","mappings":{"default":{"default":"quaternion integral operator"},"mathspeak":{"default":"quaternion-integral"}},"key":"2A16"},{"category":"Sm","mappings":{"default":{"default":"integral with times sign","short":"integral with times"},"mathspeak":{"default":"integral-with-times"}},"key":"2A18"},{"category":"Sm","mappings":{"default":{"default":"integral with intersection"},"mathspeak":{"default":"integral-with-intersection"}},"key":"2A19"},{"category":"Sm","mappings":{"default":{"default":"integral with union"},"mathspeak":{"default":"integral-with-union"}},"key":"2A1A"},{"category":"Sm","mappings":{"default":{"default":"integral with overbar"},"mathspeak":{"default":"integral-with-overbar"}},"key":"2A1B"},{"category":"Sm","mappings":{"default":{"default":"integral with underbar"},"mathspeak":{"default":"integral-with-underbar"}},"key":"2A1C"},{"category":"Sm","mappings":{"default":{"default":"join"}},"key":"2A1D"},{"category":"Sm","mappings":{"default":{"default":"large left triangle operator"},"mathspeak":{"default":"large-left-triangle"}},"key":"2A1E"},{"category":"Sm","mappings":{"default":{"default":"z notation schema composition"},"mathspeak":{"default":"z-notation-schema-composition"}},"key":"2A1F"},{"category":"Sm","mappings":{"default":{"default":"z notation schema piping"},"mathspeak":{"default":"z-notation-schema-piping"}},"key":"2A20"},{"category":"Sm","mappings":{"default":{"default":"z notation schema projection"},"mathspeak":{"default":"z-notation-schema-projection"}},"key":"2A21"},{"category":"Sm","mappings":{"default":{"default":"plus sign with small circle above","short":"plus with circle above"},"mathspeak":{"default":"plus-with-circle-above"}},"key":"2A22"},{"category":"Sm","mappings":{"default":{"default":"plus sign with circumflex accent above","short":"plus hat"},"mathspeak":{"default":"plus-hat"}},"key":"2A23"},{"category":"Sm","mappings":{"default":{"default":"plus sign with tilde above","short":"plus tilde"},"mathspeak":{"default":"plus-tilde"}},"key":"2A24"},{"category":"Sm","mappings":{"default":{"default":"plus sign with dot below","short":"plus underdot"},"mathspeak":{"default":"plus-underdot"}},"key":"2A25"},{"category":"Sm","mappings":{"default":{"default":"plus sign with tilde below"},"mathspeak":{"default":"plus-sign-with-tilde-below"}},"key":"2A26"},{"category":"Sm","mappings":{"default":{"default":"plus sign with subscript two"},"mathspeak":{"default":"plus-sign-with-subscript-two"}},"key":"2A27"},{"category":"Sm","mappings":{"default":{"default":"plus sign with black triangle"},"mathspeak":{"default":"plus-sign-with-black-triangle"}},"key":"2A28"},{"category":"Sm","mappings":{"default":{"default":"minus sign with comma above"},"mathspeak":{"default":"minus-sign-with-comma-above"}},"key":"2A29"},{"category":"Sm","mappings":{"default":{"default":"minus sign with dot below"},"mathspeak":{"default":"minus-sign-with-dot-below"}},"key":"2A2A"},{"category":"Sm","mappings":{"default":{"default":"minus sign with falling dots"},"mathspeak":{"default":"minus-sign-with-falling-dots"}},"key":"2A2B"},{"category":"Sm","mappings":{"default":{"default":"minus sign with rising dots"},"mathspeak":{"default":"minus-sign-with-rising-dots"}},"key":"2A2C"},{"category":"Sm","mappings":{"default":{"default":"plus sign in left half circle"},"mathspeak":{"default":"plus-sign-in-left-half-circle"}},"key":"2A2D"},{"category":"Sm","mappings":{"default":{"default":"plus sign in right half circle"},"mathspeak":{"default":"plus-sign-in-right-half-circle"}},"key":"2A2E"},{"category":"Sm","mappings":{"default":{"default":"vector or cross product"},"mathspeak":{"default":"vector-or-cross-product"}},"key":"2A2F"},{"category":"Sm","mappings":{"default":{"default":"multiplication sign with dot above"},"mathspeak":{"default":"multiplication-sign-with-dot-above"}},"key":"2A30"},{"category":"Sm","mappings":{"default":{"default":"multiplication sign with underbar"},"mathspeak":{"default":"multiplication-sign-with-underbar"}},"key":"2A31"},{"category":"Sm","mappings":{"default":{"default":"semidirect product with bottom closed"},"mathspeak":{"default":"semidirect-product-with-bottom-closed"}},"key":"2A32"},{"category":"Sm","mappings":{"default":{"default":"smash product"},"mathspeak":{"default":"smash-product"}},"key":"2A33"},{"category":"Sm","mappings":{"default":{"default":"multiplication sign in left half circle"},"mathspeak":{"default":"multiplication-sign-in-left-half-circle"}},"key":"2A34"},{"category":"Sm","mappings":{"default":{"default":"multiplication sign in right half circle"},"mathspeak":{"default":"multiplication-sign-in-right-half-circle"}},"key":"2A35"},{"category":"Sm","mappings":{"default":{"default":"circled multiplication sign with circumflex accent"},"mathspeak":{"default":"circled-multiplication-sign-with-circumflex-accent"}},"key":"2A36"},{"category":"Sm","mappings":{"default":{"default":"multiplication sign in double circle"},"mathspeak":{"default":"multiplication-sign-in-double-circle"}},"key":"2A37"},{"category":"Sm","mappings":{"default":{"default":"circled division sign","short":"circled division"},"mathspeak":{"default":"circled-division"}},"key":"2A38"},{"category":"Sm","mappings":{"default":{"default":"plus sign in triangle"},"mathspeak":{"default":"plus-sign-in-triangle"}},"key":"2A39"},{"category":"Sm","mappings":{"default":{"default":"minus sign in triangle"},"mathspeak":{"default":"minus-sign-in-triangle"}},"key":"2A3A"},{"category":"Sm","mappings":{"default":{"default":"multiplication sign in triangle"},"mathspeak":{"default":"multiplication-sign-in-triangle"}},"key":"2A3B"},{"category":"Sm","mappings":{"default":{"default":"interior product"},"mathspeak":{"default":"interior-product"}},"key":"2A3C"},{"category":"Sm","mappings":{"default":{"default":"righthand interior product"},"mathspeak":{"default":"righthand-interior-product"}},"key":"2A3D"},{"category":"Sm","mappings":{"default":{"default":"z notation relational composition"},"mathspeak":{"default":"z-notation-relational-composition"}},"key":"2A3E"},{"category":"Sm","mappings":{"default":{"default":"amalgamation or coproduct"},"mathspeak":{"default":"amalgamation-or-coproduct"}},"key":"2A3F"},{"category":"Sm","mappings":{"default":{"default":"intersection with dot"},"mathspeak":{"default":"intersection-with-dot"}},"key":"2A40"},{"category":"Sm","mappings":{"default":{"default":"union with minus sign","short":"union with minus"},"mathspeak":{"default":"union-with-minus"}},"key":"2A41"},{"category":"Sm","mappings":{"default":{"default":"union with overbar"},"mathspeak":{"default":"union-with-overbar"}},"key":"2A42"},{"category":"Sm","mappings":{"default":{"default":"intersection with overbar"},"mathspeak":{"default":"intersection-with-overbar"}},"key":"2A43"},{"category":"Sm","mappings":{"default":{"default":"intersection with logical and"},"mathspeak":{"default":"intersection-with-logical-and"}},"key":"2A44"},{"category":"Sm","mappings":{"default":{"default":"union with logical or"},"mathspeak":{"default":"union-with-logical-or"}},"key":"2A45"},{"category":"Sm","mappings":{"default":{"default":"union above intersection"},"mathspeak":{"default":"union-above-intersection"}},"key":"2A46"},{"category":"Sm","mappings":{"default":{"default":"intersection above union"},"mathspeak":{"default":"intersection-above-union"}},"key":"2A47"},{"category":"Sm","mappings":{"default":{"default":"union above bar above intersection"},"mathspeak":{"default":"union-above-bar-above-intersection"}},"key":"2A48"},{"category":"Sm","mappings":{"default":{"default":"intersection above bar above union"},"mathspeak":{"default":"intersection-above-bar-above-union"}},"key":"2A49"},{"category":"Sm","mappings":{"default":{"default":"union beside and joined with union"},"mathspeak":{"default":"union-beside-and-joined-with-union"}},"key":"2A4A"},{"category":"Sm","mappings":{"default":{"default":"intersection beside and joined with intersection"},"mathspeak":{"default":"intersection-beside-and-joined-with-intersection"}},"key":"2A4B"},{"category":"Sm","mappings":{"default":{"default":"closed union with serifs"},"mathspeak":{"default":"closed-union-with-serifs"}},"key":"2A4C"},{"category":"Sm","mappings":{"default":{"default":"closed intersection with serifs"},"mathspeak":{"default":"closed-intersection-with-serifs"}},"key":"2A4D"},{"category":"Sm","mappings":{"default":{"default":"double square intersection"},"mathspeak":{"default":"double-square-intersection"}},"key":"2A4E"},{"category":"Sm","mappings":{"default":{"default":"double square union"},"mathspeak":{"default":"double-square-union"}},"key":"2A4F"},{"category":"Sm","mappings":{"default":{"default":"closed union with serifs and smash product"},"mathspeak":{"default":"closed-union-with-serifs-and-smash-product"}},"key":"2A50"},{"category":"Sm","mappings":{"default":{"default":"logical and with dot above"},"mathspeak":{"default":"logical-and-with-dot-above"}},"key":"2A51"},{"category":"Sm","mappings":{"default":{"default":"logical or with dot above"},"mathspeak":{"default":"logical-or-with-dot-above"}},"key":"2A52"},{"category":"Sm","mappings":{"default":{"default":"double logical and"},"mathspeak":{"default":"double-logical-and"}},"key":"2A53"},{"category":"Sm","mappings":{"default":{"default":"double logical or"},"mathspeak":{"default":"double-logical-or"}},"key":"2A54"},{"category":"Sm","mappings":{"default":{"default":"two intersecting logical and"},"mathspeak":{"default":"two-intersecting-logical-and"}},"key":"2A55"},{"category":"Sm","mappings":{"default":{"default":"two intersecting logical or"},"mathspeak":{"default":"two-intersecting-logical-or"}},"key":"2A56"},{"category":"Sm","mappings":{"default":{"default":"sloping large or"},"mathspeak":{"default":"sloping-large-or"}},"key":"2A57"},{"category":"Sm","mappings":{"default":{"default":"sloping large and"},"mathspeak":{"default":"sloping-large-and"}},"key":"2A58"},{"category":"Sm","mappings":{"default":{"default":"logical or overlapping logical and"},"mathspeak":{"default":"logical-or-overlapping-logical-and"}},"key":"2A59"},{"category":"Sm","mappings":{"default":{"default":"logical and with middle stem"},"mathspeak":{"default":"logical-and-with-middle-stem"}},"key":"2A5A"},{"category":"Sm","mappings":{"default":{"default":"logical or with middle stem"},"mathspeak":{"default":"logical-or-with-middle-stem"}},"key":"2A5B"},{"category":"Sm","mappings":{"default":{"default":"logical and with horizontal dash"},"mathspeak":{"default":"logical-and-with-horizontal-dash"}},"key":"2A5C"},{"category":"Sm","mappings":{"default":{"default":"logical or with horizontal dash"},"mathspeak":{"default":"logical-or-with-horizontal-dash"}},"key":"2A5D"},{"category":"Sm","mappings":{"default":{"default":"logical and with double overbar"},"mathspeak":{"default":"logical-and-with-double-overbar"}},"key":"2A5E"},{"category":"Sm","mappings":{"default":{"default":"logical and with underbar"},"mathspeak":{"default":"logical-and-with-underbar"}},"key":"2A5F"},{"category":"Sm","mappings":{"default":{"default":"logical and with double underbar"},"mathspeak":{"default":"logical-and-with-double-underbar"}},"key":"2A60"},{"category":"Sm","mappings":{"default":{"default":"small vee with underbar"},"mathspeak":{"default":"small-vee-with-underbar"}},"key":"2A61"},{"category":"Sm","mappings":{"default":{"default":"logical or with double overbar"},"mathspeak":{"default":"logical-or-with-double-overbar"}},"key":"2A62"},{"category":"Sm","mappings":{"default":{"default":"logical or with double underbar"},"mathspeak":{"default":"logical-or-with-double-underbar"}},"key":"2A63"},{"category":"Sm","mappings":{"default":{"default":"z notation domain antirestriction"},"mathspeak":{"default":"z-notation-domain-antirestriction"}},"key":"2A64"},{"category":"Sm","mappings":{"default":{"default":"z notation range antirestriction"},"mathspeak":{"default":"z-notation-range-antirestriction"}},"key":"2A65"},{"category":"Sm","mappings":{"default":{"default":"equals sign with dot below"},"mathspeak":{"default":"equals-with-dot-below"}},"key":"2A66"},{"category":"Sm","mappings":{"default":{"default":"identical with dot above"},"mathspeak":{"default":"identical-with-dot-above"}},"key":"2A67"},{"category":"Sm","mappings":{"default":{"default":"triple horizontal bar with double vertical stroke"},"mathspeak":{"default":"triple-horizontal-bar-with-double-vertical-stroke"}},"key":"2A68"},{"category":"Sm","mappings":{"default":{"default":"triple horizontal bar with triple vertical stroke"},"mathspeak":{"default":"triple-horizontal-bar-with-triple-vertical-stroke"}},"key":"2A69"},{"category":"Sm","mappings":{"default":{"default":"tilde operator with dot above"},"mathspeak":{"default":"tilde-with-dot-above"}},"key":"2A6A"},{"category":"Sm","mappings":{"default":{"default":"tilde operator with rising dots"},"mathspeak":{"default":"tilde-with-rising-dots"}},"key":"2A6B"},{"category":"Sm","mappings":{"default":{"default":"similar minus similar"},"mathspeak":{"default":"similar-minus-similar"}},"key":"2A6C"},{"category":"Sm","mappings":{"default":{"default":"congruent with dot above"},"mathspeak":{"default":"congruent-with-dot-above"}},"key":"2A6D"},{"category":"Sm","mappings":{"default":{"default":"equals with asterisk"},"mathspeak":{"default":"equals-with-asterisk"}},"key":"2A6E"},{"category":"Sm","mappings":{"default":{"default":"almost equals with circumflex accent","short":"almost equal hat"},"mathspeak":{"default":"almost-equal-hat"}},"key":"2A6F"},{"category":"Sm","mappings":{"default":{"default":"approximately equal or equals"},"mathspeak":{"default":"approximately-equal-or-equal-to"}},"key":"2A70"},{"category":"Sm","mappings":{"default":{"default":"equals sign above plus sign","short":"equals above plus"},"mathspeak":{"default":"equals-above-plus"}},"key":"2A71"},{"category":"Sm","mappings":{"default":{"default":"plus sign above equals sign","short":"plus above equals"},"mathspeak":{"default":"plus-above-equals"}},"key":"2A72"},{"category":"Sm","mappings":{"default":{"default":"equals sign above tilde operator","short":"equals above tilde operator"},"mathspeak":{"default":"equals-above-tilde"}},"key":"2A73"},{"category":"Sm","mappings":{"default":{"default":"double colon equal"},"mathspeak":{"default":"double-colon-equal"}},"key":"2A74"},{"category":"Sm","mappings":{"default":{"default":"two consecutive equals signs","short":"two consecutive equals"},"mathspeak":{"default":"two-consecutive-equals"}},"key":"2A75"},{"category":"Sm","mappings":{"default":{"default":"three consecutive equals signs","short":"three consecutive equals"},"mathspeak":{"default":"three-consecutive-equals"}},"key":"2A76"},{"category":"Sm","mappings":{"default":{"default":"equals sign with two dots above and two dots below"},"mathspeak":{"default":"equals-with-two-dots-above-and-two-dots-below"}},"key":"2A77"},{"category":"Sm","mappings":{"default":{"default":"equivalent with four dots above"},"mathspeak":{"default":"equivalent-with-four-dots-above"}},"key":"2A78"},{"category":"Sm","mappings":{"default":{"default":"less than with circle inside"},"mathspeak":{"default":"less-than-with-circle-inside"}},"key":"2A79"},{"category":"Sm","mappings":{"default":{"default":"greater than with circle inside"},"mathspeak":{"default":"greater-than-with-circle-inside"}},"key":"2A7A"},{"category":"Sm","mappings":{"default":{"default":"less than with question mark above"},"mathspeak":{"default":"less-than-with-question-mark-above"}},"key":"2A7B"},{"category":"Sm","mappings":{"default":{"default":"greater than with question mark above"},"mathspeak":{"default":"greater-than-with-question-mark-above"}},"key":"2A7C"},{"category":"Sm","mappings":{"default":{"default":"less than or slanted equals"},"mathspeak":{"default":"less-than-or-slanted-equals"}},"key":"2A7D"},{"category":"Sm","mappings":{"default":{"default":"greater than or slanted equals"},"mathspeak":{"default":"greater-than-or-slanted-equals"}},"key":"2A7E"},{"category":"Sm","mappings":{"default":{"default":"less than or slanted equals with dot inside"},"mathspeak":{"default":"less-than-or-slanted-equals-with-dot-inside"}},"key":"2A7F"},{"category":"Sm","mappings":{"default":{"default":"greater than or slanted equals with dot inside"},"mathspeak":{"default":"greater-than-or-slanted-equals-with-dot-inside"}},"key":"2A80"},{"category":"Sm","mappings":{"default":{"default":"less than or slanted equals with dot above"},"mathspeak":{"default":"less-than-or-slanted-equals-with-dot-above"}},"key":"2A81"},{"category":"Sm","mappings":{"default":{"default":"greater than or slanted equals with dot above"},"mathspeak":{"default":"greater-than-or-slanted-equals-with-dot-above"}},"key":"2A82"},{"category":"Sm","mappings":{"default":{"default":"less than or slanted equals with dot above right"},"mathspeak":{"default":"less-than-or-slanted-equals-with-dot-above-right"}},"key":"2A83"},{"category":"Sm","mappings":{"default":{"default":"greater than or slanted equals with dot above left"},"mathspeak":{"default":"greater-than-or-slanted-equals-with-dot-above-left"}},"key":"2A84"},{"category":"Sm","mappings":{"default":{"default":"less than or approximate"},"mathspeak":{"default":"less-than-or-approximate"}},"key":"2A85"},{"category":"Sm","mappings":{"default":{"default":"greater than or approximate"},"mathspeak":{"default":"greater-than-or-approximate"}},"key":"2A86"},{"category":"Sm","mappings":{"default":{"default":"less than and single line not equals"},"mathspeak":{"default":"less-than-and-single-line-not-equals"}},"key":"2A87"},{"category":"Sm","mappings":{"default":{"default":"greater than and single line not equals"},"mathspeak":{"default":"greater-than-and-single-line-not-equals"}},"key":"2A88"},{"category":"Sm","mappings":{"default":{"default":"less than and not approximate"},"mathspeak":{"default":"less-than-and-not-approximate"}},"key":"2A89"},{"category":"Sm","mappings":{"default":{"default":"greater than and not approximate"},"mathspeak":{"default":"greater-than-and-not-approximate"}},"key":"2A8A"},{"category":"Sm","mappings":{"default":{"default":"less than above double line equal above greater than"},"mathspeak":{"default":"less-than-above-double-line-equal-above-greater-than"}},"key":"2A8B"},{"category":"Sm","mappings":{"default":{"default":"greater than above double line equal above less than"},"mathspeak":{"default":"greater-than-above-double-line-equal-above-less-than"}},"key":"2A8C"},{"category":"Sm","mappings":{"default":{"default":"less than above similar or equal"},"mathspeak":{"default":"less-than-above-similar-or-equal"}},"key":"2A8D"},{"category":"Sm","mappings":{"default":{"default":"greater than above similar or equal"},"mathspeak":{"default":"greater-than-above-similar-or-equal"}},"key":"2A8E"},{"category":"Sm","mappings":{"default":{"default":"less than above similar above greater than"},"mathspeak":{"default":"less-than-above-similar-above-greater-than"}},"key":"2A8F"},{"category":"Sm","mappings":{"default":{"default":"greater than above similar above less than"},"mathspeak":{"default":"greater-than-above-similar-above-less-than"}},"key":"2A90"},{"category":"Sm","mappings":{"default":{"default":"less than above greater than above double line equal"},"mathspeak":{"default":"less-than-above-greater-than-above-double-line-equal"}},"key":"2A91"},{"category":"Sm","mappings":{"default":{"default":"greater than above less than above double line equal"},"mathspeak":{"default":"greater-than-above-less-than-above-double-line-equal"}},"key":"2A92"},{"category":"Sm","mappings":{"default":{"default":"less than above slanted equal above greater than above slanted equal"},"mathspeak":{"default":"less-than-above-slanted-equal-above-greater-than-above-slanted-equal"}},"key":"2A93"},{"category":"Sm","mappings":{"default":{"default":"greater than above slanted equal above less than above slanted equal"},"mathspeak":{"default":"greater-than-above-slanted-equal-above-less-than-above-slanted-equal"}},"key":"2A94"},{"category":"Sm","mappings":{"default":{"default":"slanted equals or less than"},"mathspeak":{"default":"slanted-equals-or-less-than"}},"key":"2A95"},{"category":"Sm","mappings":{"default":{"default":"slanted equals or greater than"},"mathspeak":{"default":"slanted-equals-or-greater-than"}},"key":"2A96"},{"category":"Sm","mappings":{"default":{"default":"slanted equals or less than with dot inside"},"mathspeak":{"default":"slanted-equals-or-less-than-with-dot-inside"}},"key":"2A97"},{"category":"Sm","mappings":{"default":{"default":"slanted equals or greater than with dot inside"},"mathspeak":{"default":"slanted-equals-or-greater-than-with-dot-inside"}},"key":"2A98"},{"category":"Sm","mappings":{"default":{"default":"double line equals or less than"},"mathspeak":{"default":"double-line-equals-or-less-than"}},"key":"2A99"},{"category":"Sm","mappings":{"default":{"default":"double line equals or greater than"},"mathspeak":{"default":"double-line-equals-or-greater-than"}},"key":"2A9A"},{"category":"Sm","mappings":{"default":{"default":"double line slanted equals or less than"},"mathspeak":{"default":"double-line-slanted-equals-or-less-than"}},"key":"2A9B"},{"category":"Sm","mappings":{"default":{"default":"double line slanted equals or greater than"},"mathspeak":{"default":"double-line-slanted-equals-or-greater-than"}},"key":"2A9C"},{"category":"Sm","mappings":{"default":{"default":"similar or less than"},"mathspeak":{"default":"similar-or-less-than"}},"key":"2A9D"},{"category":"Sm","mappings":{"default":{"default":"similar or greater than"},"mathspeak":{"default":"similar-or-greater-than"}},"key":"2A9E"},{"category":"Sm","mappings":{"default":{"default":"similar above less than above equals sign"},"mathspeak":{"default":"similar-above-less-than-above-equals"}},"key":"2A9F"},{"category":"Sm","mappings":{"default":{"default":"similar above greater than above equals sign"},"mathspeak":{"default":"similar-above-greater-than-above-equals"}},"key":"2AA0"},{"category":"Sm","mappings":{"default":{"default":"double nested less than"},"mathspeak":{"default":"double-nested-less-than"}},"key":"2AA1"},{"category":"Sm","mappings":{"default":{"default":"double nested greater than"},"mathspeak":{"default":"double-nested-greater-than"}},"key":"2AA2"},{"category":"Sm","mappings":{"default":{"default":"double nested less than with underbar"},"mathspeak":{"default":"double-nested-less-than-with-underbar"}},"key":"2AA3"},{"category":"Sm","mappings":{"default":{"default":"greater than overlapping less than"},"mathspeak":{"default":"greater-than-overlapping-less-than"}},"key":"2AA4"},{"category":"Sm","mappings":{"default":{"default":"greater than beside less than"},"mathspeak":{"default":"greater-than-beside-less-than"}},"key":"2AA5"},{"category":"Sm","mappings":{"default":{"default":"less than closed by curve"},"mathspeak":{"default":"less-than-closed-by-curve"}},"key":"2AA6"},{"category":"Sm","mappings":{"default":{"default":"greater than closed by curve"},"mathspeak":{"default":"greater-than-closed-by-curve"}},"key":"2AA7"},{"category":"Sm","mappings":{"default":{"default":"less than closed by curve above slanted equal"},"mathspeak":{"default":"less-than-closed-by-curve-above-slanted-equal"}},"key":"2AA8"},{"category":"Sm","mappings":{"default":{"default":"greater than closed by curve above slanted equal"},"mathspeak":{"default":"greater-than-closed-by-curve-above-slanted-equal"}},"key":"2AA9"},{"category":"Sm","mappings":{"default":{"default":"smaller than"},"mathspeak":{"default":"smaller-than"}},"key":"2AAA"},{"category":"Sm","mappings":{"default":{"default":"larger than"},"mathspeak":{"default":"larger-than"}},"key":"2AAB"},{"category":"Sm","mappings":{"default":{"default":"smaller than or equals"},"mathspeak":{"default":"smaller-than-or-equal-to"}},"key":"2AAC"},{"category":"Sm","mappings":{"default":{"default":"larger than or equals"},"mathspeak":{"default":"larger-than-or-equal-to"}},"key":"2AAD"},{"category":"Sm","mappings":{"default":{"default":"equals sign with bumpy above"},"mathspeak":{"default":"equals-with-bumpy-above"}},"key":"2AAE"},{"category":"Sm","mappings":{"default":{"default":"precedes above single line equals sign"},"mathspeak":{"default":"precedes-above-single-line-equals"}},"key":"2AAF"},{"category":"Sm","mappings":{"default":{"default":"succeeds above single line equals sign"},"mathspeak":{"default":"succeeds-above-single-line-equals"}},"key":"2AB0"},{"category":"Sm","mappings":{"default":{"default":"precedes above single line not equals"},"mathspeak":{"default":"precedes-above-single-line-not-equals"}},"key":"2AB1"},{"category":"Sm","mappings":{"default":{"default":"succeeds above single line not equals"},"mathspeak":{"default":"succeeds-above-single-line-not-equals"}},"key":"2AB2"},{"category":"Sm","mappings":{"default":{"default":"precedes above equals sign"},"mathspeak":{"default":"precedes-above-equals"}},"key":"2AB3"},{"category":"Sm","mappings":{"default":{"default":"succeeds above equals sign"},"mathspeak":{"default":"succeeds-above-equals"}},"key":"2AB4"},{"category":"Sm","mappings":{"default":{"default":"precedes above not equals"},"mathspeak":{"default":"precedes-above-not-equals"}},"key":"2AB5"},{"category":"Sm","mappings":{"default":{"default":"succeeds above not equals"},"mathspeak":{"default":"succeeds-above-not-equals"}},"key":"2AB6"},{"category":"Sm","mappings":{"default":{"default":"precedes above almost equals"},"mathspeak":{"default":"precedes-above-almost-equals"}},"key":"2AB7"},{"category":"Sm","mappings":{"default":{"default":"succeeds above almost equals"},"mathspeak":{"default":"succeeds-above-almost-equals"}},"key":"2AB8"},{"category":"Sm","mappings":{"default":{"default":"precedes above not almost equals"},"mathspeak":{"default":"precedes-above-not-almost-equals"}},"key":"2AB9"},{"category":"Sm","mappings":{"default":{"default":"succeeds above not almost equals"},"mathspeak":{"default":"succeeds-above-not-almost-equals"}},"key":"2ABA"},{"category":"Sm","mappings":{"default":{"default":"double precedes"},"mathspeak":{"default":"double-precedes"}},"key":"2ABB"},{"category":"Sm","mappings":{"default":{"default":"double succeeds"},"mathspeak":{"default":"double-succeeds"}},"key":"2ABC"},{"category":"Sm","mappings":{"default":{"default":"subset with dot"},"mathspeak":{"default":"subset-with-dot"}},"key":"2ABD"},{"category":"Sm","mappings":{"default":{"default":"superset with dot"},"mathspeak":{"default":"superset-with-dot"}},"key":"2ABE"},{"category":"Sm","mappings":{"default":{"default":"subset with plus sign below"},"mathspeak":{"default":"subset-with-plus-sign-below"}},"key":"2ABF"},{"category":"Sm","mappings":{"default":{"default":"superset with plus sign below"},"mathspeak":{"default":"superset-with-plus-sign-below"}},"key":"2AC0"},{"category":"Sm","mappings":{"default":{"default":"subset with multiplication sign below"},"mathspeak":{"default":"subset-with-multiplication-sign-below"}},"key":"2AC1"},{"category":"Sm","mappings":{"default":{"default":"superset with multiplication sign below"},"mathspeak":{"default":"superset-with-multiplication-sign-below"}},"key":"2AC2"},{"category":"Sm","mappings":{"default":{"default":"subset of or equals with dot above"},"mathspeak":{"default":"subset-of-or-equal-to-with-dot-above"}},"key":"2AC3"},{"category":"Sm","mappings":{"default":{"default":"superset of or equals with dot above"},"mathspeak":{"default":"superset-of-or-equal-to-with-dot-above"}},"key":"2AC4"},{"category":"Sm","mappings":{"default":{"default":"subset of above equals sign"},"mathspeak":{"default":"subset-of-above-equals"}},"key":"2AC5"},{"category":"Sm","mappings":{"default":{"default":"superset of above equals sign"},"mathspeak":{"default":"superset-of-above-equals"}},"key":"2AC6"},{"category":"Sm","mappings":{"default":{"default":"subset of above tilde operator"},"mathspeak":{"default":"subset-of-above-tilde"}},"key":"2AC7"},{"category":"Sm","mappings":{"default":{"default":"superset of above tilde operator"},"mathspeak":{"default":"superset-of-above-tilde"}},"key":"2AC8"},{"category":"Sm","mappings":{"default":{"default":"subset of above almost equals"},"mathspeak":{"default":"subset-of-above-almost-equals"}},"key":"2AC9"},{"category":"Sm","mappings":{"default":{"default":"superset of above almost equals"},"mathspeak":{"default":"superset-of-above-almost-equals"}},"key":"2ACA"},{"category":"Sm","mappings":{"default":{"default":"subset of above not equals"},"mathspeak":{"default":"subset-of-above-not-equals"}},"key":"2ACB"},{"category":"Sm","mappings":{"default":{"default":"superset of above not equals"},"mathspeak":{"default":"superset-of-above-not-equals"}},"key":"2ACC"},{"category":"Sm","mappings":{"default":{"default":"square left open box operator"},"mathspeak":{"default":"square-left-open-box"}},"key":"2ACD"},{"category":"Sm","mappings":{"default":{"default":"square right open box operator"},"mathspeak":{"default":"square-right-open-box"}},"key":"2ACE"},{"category":"Sm","mappings":{"default":{"default":"closed subset"},"mathspeak":{"default":"closed-subset"}},"key":"2ACF"},{"category":"Sm","mappings":{"default":{"default":"closed superset"},"mathspeak":{"default":"closed-superset"}},"key":"2AD0"},{"category":"Sm","mappings":{"default":{"default":"closed subset or equals"},"mathspeak":{"default":"closed-subset-or-equal-to"}},"key":"2AD1"},{"category":"Sm","mappings":{"default":{"default":"closed superset or equals"},"mathspeak":{"default":"closed-superset-or-equal-to"}},"key":"2AD2"},{"category":"Sm","mappings":{"default":{"default":"subset above superset"},"mathspeak":{"default":"subset-above-superset"}},"key":"2AD3"},{"category":"Sm","mappings":{"default":{"default":"superset above subset"},"mathspeak":{"default":"superset-above-subset"}},"key":"2AD4"},{"category":"Sm","mappings":{"default":{"default":"subset above subset"},"mathspeak":{"default":"subset-above-subset"}},"key":"2AD5"},{"category":"Sm","mappings":{"default":{"default":"superset above superset"},"mathspeak":{"default":"superset-above-superset"}},"key":"2AD6"},{"category":"Sm","mappings":{"default":{"default":"superset beside subset"},"mathspeak":{"default":"superset-beside-subset"}},"key":"2AD7"},{"category":"Sm","mappings":{"default":{"default":"superset beside and joined by dash with subset"},"mathspeak":{"default":"superset-beside-and-joined-by-dash-with-subset"}},"key":"2AD8"},{"category":"Sm","mappings":{"default":{"default":"element of opening downwards"},"mathspeak":{"default":"element-of-opening-downwards"}},"key":"2AD9"},{"category":"Sm","mappings":{"default":{"default":"pitchfork with tee top"},"mathspeak":{"default":"pitchfork-with-tee-top"}},"key":"2ADA"},{"category":"Sm","mappings":{"default":{"default":"transversal intersection"},"mathspeak":{"default":"transversal-intersection"}},"key":"2ADB"},{"category":"Sm","mappings":{"default":{"default":"forking"}},"key":"2ADC"},{"category":"Sm","mappings":{"default":{"default":"nonforking"}},"key":"2ADD"},{"category":"Sm","mappings":{"default":{"default":"short left tack"},"mathspeak":{"default":"short-left-tack"}},"key":"2ADE"},{"category":"Sm","mappings":{"default":{"default":"short down tack"},"mathspeak":{"default":"short-down-tack"}},"key":"2ADF"},{"category":"Sm","mappings":{"default":{"default":"short up tack"},"mathspeak":{"default":"short-up-tack"}},"key":"2AE0"},{"category":"Sm","mappings":{"default":{"default":"perpendicular with s"},"mathspeak":{"default":"perpendicular-with-s"}},"key":"2AE1"},{"category":"Sm","mappings":{"default":{"default":"vertical bar triple right turnstile"},"mathspeak":{"default":"vertical-bar-triple-right-turnstile"}},"key":"2AE2"},{"category":"Sm","mappings":{"default":{"default":"double vertical bar left turnstile"},"mathspeak":{"default":"double-vertical-bar-left-turnstile"}},"key":"2AE3"},{"category":"Sm","mappings":{"default":{"default":"vertical bar double left turnstile"},"mathspeak":{"default":"vertical-bar-double-left-turnstile"}},"key":"2AE4"},{"category":"Sm","mappings":{"default":{"default":"double vertical bar double left turnstile"},"mathspeak":{"default":"double-vertical-bar-double-left-turnstile"}},"key":"2AE5"},{"category":"Sm","mappings":{"default":{"default":"long dash from left member of double vertical"},"mathspeak":{"default":"long-dash-from-left-member-of-double-vertical"}},"key":"2AE6"},{"category":"Sm","mappings":{"default":{"default":"short down tack with overbar"},"mathspeak":{"default":"short-down-tack-with-overbar"}},"key":"2AE7"},{"category":"Sm","mappings":{"default":{"default":"short up tack with underbar"},"mathspeak":{"default":"short-up-tack-with-underbar"}},"key":"2AE8"},{"category":"Sm","mappings":{"default":{"default":"short up tack above short down tack"},"mathspeak":{"default":"short-up-tack-above-short-down-tack"}},"key":"2AE9"},{"category":"Sm","mappings":{"default":{"default":"double down tack"},"mathspeak":{"default":"double-down-tack"}},"key":"2AEA"},{"category":"Sm","mappings":{"default":{"default":"double up tack"},"mathspeak":{"default":"double-up-tack"}},"key":"2AEB"},{"category":"Sm","mappings":{"default":{"default":"double stroke not sign"},"mathspeak":{"default":"double-stroke-not-sign"}},"key":"2AEC"},{"category":"Sm","mappings":{"default":{"default":"reversed double stroke not sign"},"mathspeak":{"default":"reversed-double-stroke-not-sign"}},"key":"2AED"},{"category":"Sm","mappings":{"default":{"default":"does not divide with reversed negation slash"},"mathspeak":{"default":"does-not-divide-with-reversed-negation-slash"}},"key":"2AEE"},{"category":"Sm","mappings":{"default":{"default":"vertical line with circle above"},"mathspeak":{"default":"vertical-line-with-circle-above"}},"key":"2AEF"},{"category":"Sm","mappings":{"default":{"default":"vertical line with circle below"},"mathspeak":{"default":"vertical-line-with-circle-below"}},"key":"2AF0"},{"category":"Sm","mappings":{"default":{"default":"down tack with circle below"},"mathspeak":{"default":"down-tack-with-circle-below"}},"key":"2AF1"},{"category":"Sm","mappings":{"default":{"default":"parallel with horizontal stroke"},"mathspeak":{"default":"parallel-with-horizontal-stroke"}},"key":"2AF2"},{"category":"Sm","mappings":{"default":{"default":"parallel with tilde operator"},"mathspeak":{"default":"parallel-with-tilde"}},"key":"2AF3"},{"category":"Sm","mappings":{"default":{"default":"triple vertical bar binary relation"},"mathspeak":{"default":"triple-vertical-bar-binary-relation"}},"key":"2AF4"},{"category":"Sm","mappings":{"default":{"default":"triple vertical bar with horizontal stroke"},"mathspeak":{"default":"triple-vertical-bar-with-horizontal-stroke"}},"key":"2AF5"},{"category":"Sm","mappings":{"default":{"default":"triple colon operator"},"mathspeak":{"default":"triple-colon"}},"key":"2AF6"},{"category":"Sm","mappings":{"default":{"default":"triple nested less than"},"mathspeak":{"default":"triple-nested-less-than"}},"key":"2AF7"},{"category":"Sm","mappings":{"default":{"default":"triple nested greater than"},"mathspeak":{"default":"triple-nested-greater-than"}},"key":"2AF8"},{"category":"Sm","mappings":{"default":{"default":"double line slanted less than or equals"},"mathspeak":{"default":"double-line-slanted-less-than-or-equal-to"}},"key":"2AF9"},{"category":"Sm","mappings":{"default":{"default":"double line slanted greater than or equals"},"mathspeak":{"default":"double-line-slanted-greater-than-or-equal-to"}},"key":"2AFA"},{"category":"Sm","mappings":{"default":{"default":"triple solidus binary relation"},"mathspeak":{"default":"triple-solidus-binary-relation"}},"key":"2AFB"},{"category":"Sm","mappings":{"default":{"default":"large triple vertical bar operator"},"mathspeak":{"default":"large-triple-vertical-bar"}},"key":"2AFC"},{"category":"Sm","mappings":{"default":{"default":"double solidus operator"},"mathspeak":{"default":"double-solidus"}},"key":"2AFD"},{"category":"Sm","mappings":{"default":{"default":"white vertical bar"},"mathspeak":{"default":"white-vertical-bar"}},"key":"2AFE"},{"category":"Sm","mappings":{"default":{"default":"n ary white vertical bar"},"mathspeak":{"default":"white-vertical-bar"}},"key":"2AFF"},{"category":"Pd","mappings":{"default":{"default":"wave dash"},"mathspeak":{"default":"wave-dash"}},"key":"301C"},{"category":"Po","mappings":{"default":{"default":"presentation form for vertical comma"},"mathspeak":{"default":"presentation-form-for-vertical-comma"}},"key":"FE10"},{"category":"Po","mappings":{"default":{"default":"presentation form for vertical colon"},"mathspeak":{"default":"presentation-form-for-vertical-colon"}},"key":"FE13"},{"category":"Po","mappings":{"default":{"default":"presentation form for vertical semicolon"},"mathspeak":{"default":"presentation-form-for-vertical-semicolon"}},"key":"FE14"},{"category":"Po","mappings":{"default":{"default":"presentation form for vertical exclamation mark"},"mathspeak":{"default":"presentation-form-for-vertical-exclamation-mark"}},"key":"FE15"},{"category":"Po","mappings":{"default":{"default":"presentation form for vertical question mark"},"mathspeak":{"default":"presentation-form-for-vertical-question-mark"}},"key":"FE16"},{"category":"Po","mappings":{"default":{"default":"presentation form for vertical horizontal ellipsis"},"mathspeak":{"default":"presentation-form-for-vertical-horizontal-ellipsis"}},"key":"FE19"},{"category":"Po","mappings":{"default":{"default":"presentation form for vertical two dot leader","alternative":"glyph for vertical two dot leader"},"mathspeak":{"default":"glyph-for-vertical-two-dot-leader"}},"key":"FE30"},{"category":"Pd","mappings":{"default":{"default":"presentation form for vertical em dash","alternative":"glyph for vertical em dash"},"mathspeak":{"default":"glyph-for-vertical-em-dash"}},"key":"FE31"},{"category":"Pd","mappings":{"default":{"default":"presentation form for vertical en dash","alternative":"glyph for vertical en dash"},"mathspeak":{"default":"glyph-for-vertical-en-dash"}},"key":"FE32"},{"category":"Pc","mappings":{"default":{"default":"presentation form for vertical low line","alternative":"glyph for vertical spacing underscore"},"mathspeak":{"default":"glyph-for-vertical-underscore"}},"key":"FE33"},{"category":"Pc","mappings":{"default":{"default":"presentation form for vertical wavy low line","alternative":"glyph for vertical spacing wavy underscore"},"mathspeak":{"default":"glyph-for-vertical-wavy-underscore"}},"key":"FE34"},{"category":"Po","mappings":{"default":{"default":"sesame dot"},"mathspeak":{"default":"sesame-dot"}},"key":"FE45"},{"category":"Po","mappings":{"default":{"default":"white sesame dot"},"mathspeak":{"default":"white-sesame-dot"}},"key":"FE46"},{"category":"Po","mappings":{"default":{"default":"dashed overline","alternative":"spacing dashed overscore"},"mathspeak":{"default":"dashed-overscore"}},"key":"FE49"},{"category":"Po","mappings":{"default":{"default":"centerline overline","alternative":"spacing centerline overscore"},"mathspeak":{"default":"centerline-overscore"}},"key":"FE4A"},{"category":"Po","mappings":{"default":{"default":"wavy overline","alternative":"spacing wavy overscore"},"mathspeak":{"default":"wavy-overscore"}},"key":"FE4B"},{"category":"Po","mappings":{"default":{"default":"double wavy overline","alternative":"spacing double wavy overscore"},"mathspeak":{"default":"double-wavy-overscore"}},"key":"FE4C"},{"category":"Pc","mappings":{"default":{"default":"dashed low line","alternative":"spacing dashed underscore"},"mathspeak":{"default":"dashed-underscore"}},"key":"FE4D"},{"category":"Pc","mappings":{"default":{"default":"centerline low line","alternative":"spacing centerline underscore"},"mathspeak":{"default":"centerline-underscore"}},"key":"FE4E"},{"category":"Pc","mappings":{"default":{"default":"wavy low line","alternative":"spacing wavy underscore"},"mathspeak":{"default":"wavy-underscore"}},"key":"FE4F"},{"category":"Po","mappings":{"default":{"default":"small comma"},"mathspeak":{"default":"small-comma"}},"key":"FE50"},{"category":"Po","mappings":{"default":{"default":"small full stop","alternative":"small period"},"mathspeak":{"default":"small-period"}},"key":"FE52"},{"category":"Po","mappings":{"default":{"default":"small semicolon"},"mathspeak":{"default":"small-semicolon"}},"key":"FE54"},{"category":"Po","mappings":{"default":{"default":"small colon"},"mathspeak":{"default":"small-colon"}},"key":"FE55"},{"category":"Po","mappings":{"default":{"default":"small question mark"},"mathspeak":{"default":"small-question-mark"}},"key":"FE56"},{"category":"Po","mappings":{"default":{"default":"small exclamation mark"},"mathspeak":{"default":"small-exclamation-mark"}},"key":"FE57"},{"category":"Pd","mappings":{"default":{"default":"small em dash"},"mathspeak":{"default":"small-em-dash"}},"key":"FE58"},{"category":"Po","mappings":{"default":{"default":"small number sign"},"mathspeak":{"default":"small-number-sign"}},"key":"FE5F"},{"category":"Po","mappings":{"default":{"default":"small ampersand"},"mathspeak":{"default":"small-ampersand"}},"key":"FE60"},{"category":"Po","mappings":{"default":{"default":"small asterisk"},"mathspeak":{"default":"small-asterisk"}},"key":"FE61"},{"category":"Sm","mappings":{"default":{"default":"small plus sign"},"mathspeak":{"default":"small-plus-sign"}},"key":"FE62"},{"category":"Pd","mappings":{"default":{"default":"small hyphen minus"},"mathspeak":{"default":"small-hyphen-minus"}},"key":"FE63"},{"category":"Sm","mappings":{"default":{"default":"small less than sign"},"mathspeak":{"default":"small-less-than-sign"}},"key":"FE64"},{"category":"Sm","mappings":{"default":{"default":"small greater than sign"},"mathspeak":{"default":"small-greater-than-sign"}},"key":"FE65"},{"category":"Sm","mappings":{"default":{"default":"small equals sign"},"mathspeak":{"default":"small-equals"}},"key":"FE66"},{"category":"Po","mappings":{"default":{"default":"small reverse solidus","alternative":"small backslash"},"mathspeak":{"default":"small-backslash"}},"key":"FE68"},{"category":"Sc","mappings":{"default":{"default":"small dollar sign"},"mathspeak":{"default":"small-dollar-sign"}},"key":"FE69"},{"category":"Po","mappings":{"default":{"default":"small percent sign"},"mathspeak":{"default":"small-percent-sign"}},"key":"FE6A"},{"category":"Po","mappings":{"default":{"default":"small commercial at"},"mathspeak":{"default":"small-commercial-at"}},"key":"FE6B"},{"category":"Po","mappings":{"default":{"default":"fullwidth exclamation mark"},"mathspeak":{"default":"exclamation-mark"}},"key":"FF01"},{"category":"Po","mappings":{"default":{"default":"fullwidth quotation mark"},"mathspeak":{"default":"quotation-mark"}},"key":"FF02"},{"category":"Po","mappings":{"default":{"default":"fullwidth number sign"},"mathspeak":{"default":"number-sign"}},"key":"FF03"},{"category":"Sc","mappings":{"default":{"default":"fullwidth dollar sign"},"mathspeak":{"default":"dollar-sign"}},"key":"FF04"},{"category":"Po","mappings":{"default":{"default":"fullwidth percent sign"},"mathspeak":{"default":"percent-sign"}},"key":"FF05"},{"category":"Po","mappings":{"default":{"default":"fullwidth ampersand"},"mathspeak":{"default":"ampersand"}},"key":"FF06"},{"category":"Po","mappings":{"default":{"default":"fullwidth apostrophe"},"mathspeak":{"default":"apostrophe"}},"key":"FF07"},{"category":"Po","mappings":{"default":{"default":"fullwidth asterisk"},"mathspeak":{"default":"asterisk"}},"key":"FF0A"},{"category":"Sm","mappings":{"default":{"default":"fullwidth plus sign"},"mathspeak":{"default":"plus-sign"}},"key":"FF0B"},{"category":"Po","mappings":{"default":{"default":"fullwidth comma"},"mathspeak":{"default":"comma"}},"key":"FF0C"},{"category":"Pd","mappings":{"default":{"default":"fullwidth hyphen minus"},"mathspeak":{"default":"hyphen-minus"}},"key":"FF0D"},{"category":"Po","mappings":{"default":{"default":"fullwidth full stop","alternative":"fullwidth period"},"mathspeak":{"default":"period"}},"key":"FF0E"},{"category":"Po","mappings":{"default":{"default":"fullwidth solidus","alternative":"fullwidth slash"},"mathspeak":{"default":"slash"}},"key":"FF0F"},{"category":"Po","mappings":{"default":{"default":"fullwidth colon"},"mathspeak":{"default":"colon"}},"key":"FF1A"},{"category":"Po","mappings":{"default":{"default":"fullwidth semicolon"},"mathspeak":{"default":"semicolon"}},"key":"FF1B"},{"category":"Sm","mappings":{"default":{"default":"fullwidth less than sign"},"mathspeak":{"default":"less-than-sign"}},"key":"FF1C"},{"category":"Sm","mappings":{"default":{"default":"fullwidth equals sign"},"mathspeak":{"default":"equals"}},"key":"FF1D"},{"category":"Sm","mappings":{"default":{"default":"fullwidth greater than sign"},"mathspeak":{"default":"greater-than-sign"}},"key":"FF1E"},{"category":"Po","mappings":{"default":{"default":"fullwidth question mark"},"mathspeak":{"default":"question-mark"}},"key":"FF1F"},{"category":"Po","mappings":{"default":{"default":"fullwidth commercial at"},"mathspeak":{"default":"commercial-at"}},"key":"FF20"},{"category":"Po","mappings":{"default":{"default":"fullwidth reverse solidus","alternative":"fullwidth backslash"},"mathspeak":{"default":"backslash"}},"key":"FF3C"},{"category":"Sk","mappings":{"default":{"default":"fullwidth circumflex accent","alternative":"fullwidth spacing circumflex"},"mathspeak":{"default":"caret"}},"key":"FF3E"},{"category":"Pc","mappings":{"default":{"default":"fullwidth low line","alternative":"fullwidth spacing underscore"},"mathspeak":{"default":"bar"}},"key":"FF3F"},{"category":"Sk","mappings":{"default":{"default":"fullwidth grave accent","alternative":"fullwidth spacing grave"},"mathspeak":{"default":"grave"}},"key":"FF40"},{"category":"Sm","mappings":{"default":{"default":"fullwidth vertical line","alternative":"fullwidth vertical bar"},"mathspeak":{"default":"vertical-bar"}},"key":"FF5C"},{"category":"Sm","mappings":{"default":{"default":"fullwidth tilde","alternative":"fullwidth spacing tilde"},"mathspeak":{"default":"tilde"}},"key":"FF5E"},{"category":"Sc","mappings":{"default":{"default":"fullwidth cent sign"},"mathspeak":{"default":"cent-sign"}},"key":"FFE0"},{"category":"Sc","mappings":{"default":{"default":"fullwidth pound sign"},"mathspeak":{"default":"pound-sign"}},"key":"FFE1"},{"category":"Sm","mappings":{"default":{"default":"fullwidth not sign"},"mathspeak":{"default":"not-sign"}},"key":"FFE2"},{"category":"Sk","mappings":{"default":{"default":"fullwidth macron","alternative":"fullwidth spacing macron"},"mathspeak":{"default":"bar"}},"key":"FFE3"},{"category":"So","mappings":{"default":{"default":"fullwidth broken bar","alternative":"fullwidth broken vertical bar"},"mathspeak":{"default":"broken-vertical-bar"}},"key":"FFE4"},{"category":"Sc","mappings":{"default":{"default":"fullwidth yen sign"},"mathspeak":{"default":"yen-sign"}},"key":"FFE5"},{"category":"Sc","mappings":{"default":{"default":"fullwidth won sign"},"mathspeak":{"default":"won-sign"}},"key":"FFE6"},{"category":"So","mappings":{"default":{"default":"halfwidth forms light vertical"},"mathspeak":{"default":"halfwidth-forms-light-vertical"}},"key":"FFE8"},{"category":"So","mappings":{"default":{"default":"halfwidth black square"},"mathspeak":{"default":"halfwidth-black-square"}},"key":"FFED"},{"category":"So","mappings":{"default":{"default":"halfwidth white circle"},"mathspeak":{"default":"halfwidth-white-circle"}},"key":"FFEE"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_whitespace.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_whitespace.js
deleted file mode 100644
index 3bdfe4aa..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/math_whitespace.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Zs","mappings":{"default":{"default":"space"}},"key":"0020"},{"category":"Zs","mappings":{"default":{"default":"no break space","alternative":"non breaking space"}},"key":"00A0"},{"category":"Cf","mappings":{"default":{"default":"soft hyphen"}},"key":"00AD"},{"category":"Zs","mappings":{"default":{"default":"en quad"}},"key":"2000"},{"category":"Zs","mappings":{"default":{"default":"em quad"}},"key":"2001"},{"category":"Zs","mappings":{"default":{"default":"en space"}},"key":"2002"},{"category":"Zs","mappings":{"default":{"default":"em space"}},"key":"2003"},{"category":"Zs","mappings":{"default":{"default":"three per em space"}},"key":"2004"},{"category":"Zs","mappings":{"default":{"default":"four per em space"}},"key":"2005"},{"category":"Zs","mappings":{"default":{"default":"six per em space"}},"key":"2006"},{"category":"Zs","mappings":{"default":{"default":"figure space"}},"key":"2007"},{"category":"Zs","mappings":{"default":{"default":"punctuation space"}},"key":"2008"},{"category":"Zs","mappings":{"default":{"default":"thin space"}},"key":"2009"},{"category":"Zs","mappings":{"default":{"default":"hair space"}},"key":"200A"},{"category":"Cf","mappings":{"default":{"default":"zero width space"}},"key":"200B"},{"category":"Cf","mappings":{"default":{"default":"zero width non joiner"}},"key":"200C"},{"category":"Cf","mappings":{"default":{"default":"zero width joiner"}},"key":"200D"},{"category":"Cf","mappings":{"default":{"default":"left to right mark"}},"key":"200E"},{"category":"Cf","mappings":{"default":{"default":"right to left mark"}},"key":"200F"},{"category":"Zl","mappings":{"default":{"default":"line separator"}},"key":"2028"},{"category":"Zp","mappings":{"default":{"default":"paragraph separator"}},"key":"2029"},{"category":"Cf","mappings":{"default":{"default":"left to right embedding"}},"key":"202A"},{"category":"Cf","mappings":{"default":{"default":"right to left embedding"}},"key":"202B"},{"category":"Cf","mappings":{"default":{"default":"pop directional formatting"}},"key":"202C"},{"category":"Cf","mappings":{"default":{"default":"left to right override"}},"key":"202D"},{"category":"Cf","mappings":{"default":{"default":"right to left override"}},"key":"202E"},{"category":"Zs","mappings":{"default":{"default":"narrow no break space"}},"key":"202F"},{"category":"Zs","mappings":{"default":{"default":"medium mathematical space"}},"key":"205F"},{"category":"Cf","mappings":{"default":{"default":"word joiner"}},"key":"2060"},{"category":"Cf","mappings":{"default":{"default":"function application","short":"of"}},"key":"2061"},{"category":"Cf","mappings":{"default":{"default":"invisible times","short":"times"}},"key":"2062"},{"category":"Cf","mappings":{"default":{"default":"invisible separator","short":"separator"}},"key":"2063"},{"category":"Cf","mappings":{"default":{"default":"invisible plus","short":"plus"}},"key":"2064"},{"category":"Cf","mappings":{"default":{"default":"inhibit symmetric swapping"}},"key":"206A"},{"category":"Cf","mappings":{"default":{"default":"activate symmetric swapping"}},"key":"206B"},{"category":"Cf","mappings":{"default":{"default":"national digit shapes"}},"key":"206E"},{"category":"Cf","mappings":{"default":{"default":"nominal digit shapes"}},"key":"206F"},{"category":"Cf","mappings":{"default":{"default":"zero width no break space","alternative":"byte order mark"}},"key":"FEFF"},{"category":"Cf","mappings":{"default":{"default":"interlinear annotation anchor"}},"key":"FFF9"},{"category":"Cf","mappings":{"default":{"default":"interlinear annotation separator"}},"key":"FFFA"},{"category":"Cf","mappings":{"default":{"default":"interlinear annotation terminator"}},"key":"FFFB"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/other_stars.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/other_stars.js
deleted file mode 100644
index ba5d0a41..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/symbols/other_stars.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"So","mappings":{"default":{"default":"decimal exponent symbol"}},"key":"23E8"},{"category":"So","mappings":{"default":{"default":"black star"}},"key":"2605"},{"category":"So","mappings":{"default":{"default":"white star"}},"key":"2606"},{"category":"So","mappings":{"default":{"default":"medium white circle","short":"white circle"}},"key":"26AA"},{"category":"So","mappings":{"default":{"default":"medium black circle","short":"black circle"}},"key":"26AB"},{"category":"So","mappings":{"default":{"default":"white heavy check mark","short":"white check"}},"key":"2705"},{"category":"So","mappings":{"default":{"default":"check mark","short":"check"}},"key":"2713"},{"category":"So","mappings":{"default":{"default":"heavy check mark","short":"heavy check"}},"key":"2714"},{"category":"So","mappings":{"default":{"default":"multiplication x"}},"key":"2715"},{"category":"So","mappings":{"default":{"default":"heavy multiplication x"}},"key":"2716"},{"category":"So","mappings":{"default":{"default":"ballot x"}},"key":"2717"},{"category":"So","mappings":{"default":{"default":"heavy ballot x"}},"key":"2718"},{"category":"So","mappings":{"default":{"default":"open center cross"}},"key":"271B"},{"category":"So","mappings":{"default":{"default":"heavy open center cross"}},"key":"271C"},{"category":"So","mappings":{"default":{"default":"maltese cross"}},"key":"2720"},{"category":"So","mappings":{"default":{"default":"star of david"}},"key":"2721"},{"category":"So","mappings":{"default":{"default":"four teardrop spoked asterisk"}},"key":"2722"},{"category":"So","mappings":{"default":{"default":"four balloon spoked asterisk"}},"key":"2723"},{"category":"So","mappings":{"default":{"default":"heavy four balloon spoked asterisk"}},"key":"2724"},{"category":"So","mappings":{"default":{"default":"four club spoked asterisk"}},"key":"2725"},{"category":"So","mappings":{"default":{"default":"black four pointed star"}},"key":"2726"},{"category":"So","mappings":{"default":{"default":"white four pointed star"}},"key":"2727"},{"category":"So","mappings":{"default":{"default":"sparkles"}},"key":"2728"},{"category":"So","mappings":{"default":{"default":"stress outlined white star"}},"key":"2729"},{"category":"So","mappings":{"default":{"default":"circled white star"}},"key":"272A"},{"category":"So","mappings":{"default":{"default":"open center black star"}},"key":"272B"},{"category":"So","mappings":{"default":{"default":"black center white star"}},"key":"272C"},{"category":"So","mappings":{"default":{"default":"outlined black star"}},"key":"272D"},{"category":"So","mappings":{"default":{"default":"heavy outlined black star"}},"key":"272E"},{"category":"So","mappings":{"default":{"default":"pinwheel star"}},"key":"272F"},{"category":"So","mappings":{"default":{"default":"shadowed white star"}},"key":"2730"},{"category":"So","mappings":{"default":{"default":"heavy asterisk"}},"key":"2731"},{"category":"So","mappings":{"default":{"default":"open center asterisk"}},"key":"2732"},{"category":"So","mappings":{"default":{"default":"eight spoked asterisk"}},"key":"2733"},{"category":"So","mappings":{"default":{"default":"eight pointed black star"}},"key":"2734"},{"category":"So","mappings":{"default":{"default":"eight pointed pinwheel star"}},"key":"2735"},{"category":"So","mappings":{"default":{"default":"six pointed black star"}},"key":"2736"},{"category":"So","mappings":{"default":{"default":"twelve pointed black star"}},"key":"2739"},{"category":"So","mappings":{"default":{"default":"sixteen pointed asterisk"}},"key":"273A"},{"category":"So","mappings":{"default":{"default":"teardrop spoked asterisk"}},"key":"273B"},{"category":"So","mappings":{"default":{"default":"open center teardrop spoked asterisk"}},"key":"273C"},{"category":"So","mappings":{"default":{"default":"heavy teardrop spoked asterisk"}},"key":"273D"},{"category":"So","mappings":{"default":{"default":"six petalled black and white florette"}},"key":"273E"},{"category":"So","mappings":{"default":{"default":"black florette"}},"key":"273F"},{"category":"So","mappings":{"default":{"default":"white florette"}},"key":"2740"},{"category":"So","mappings":{"default":{"default":"eight petalled outlined black florette"}},"key":"2741"},{"category":"So","mappings":{"default":{"default":"circled open center eight pointed star"}},"key":"2742"},{"category":"So","mappings":{"default":{"default":"heavy teardrop spoked pinwheel asterisk"}},"key":"2743"},{"category":"So","mappings":{"default":{"default":"snowflake"}},"key":"2744"},{"category":"So","mappings":{"default":{"default":"tight trifoliate snowflake"}},"key":"2745"},{"category":"So","mappings":{"default":{"default":"heavy chevron snowflake"}},"key":"2746"},{"category":"So","mappings":{"default":{"default":"sparkle"}},"key":"2747"},{"category":"So","mappings":{"default":{"default":"heavy sparkle"}},"key":"2748"},{"category":"So","mappings":{"default":{"default":"balloon spoked asterisk"}},"key":"2749"},{"category":"So","mappings":{"default":{"default":"eight teardrop spoked propeller asterisk"}},"key":"274A"},{"category":"So","mappings":{"default":{"default":"heavy eight teardrop spoked propeller asterisk"}},"key":"274B"},{"category":"So","mappings":{"default":{"default":"cross mark"}},"key":"274C"},{"category":"So","mappings":{"default":{"default":"shadowed white circle"}},"key":"274D"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/energy.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/energy.js
deleted file mode 100644
index 412da6b3..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/energy.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"energy","mappings":{"default":{"default":"watts"}},"key":"W","names":["W","w"]},{"category":"energy","mappings":{"default":{"default":"kilowatts"}},"key":"kW","names":["kw","kW"]},{"category":"energy","mappings":{"default":{"default":"milliwatts"}},"key":"mW","names":["mw","mW"]},{"category":"energy","mappings":{"default":{"default":"kilowatt hours"}},"key":"kwh","names":["kwh","kWh"]},{"category":"energy","mappings":{"default":{"default":"joules"}},"key":"J","names":["J"]},{"category":"energy","mappings":{"default":{"default":"Newton"}},"key":"N","names":["N"]},{"category":"energy","mappings":{"default":{"default":"amperes"}},"key":"A","names":["A"]},{"category":"energy","mappings":{"default":{"default":"volts"}},"key":"V","names":["V"]},{"category":"energy","mappings":{"default":{"default":"microohm"}},"key":"µΩ","names":["µΩ"]},{"category":"energy","mappings":{"default":{"default":"milliohm"}},"key":"mΩ","names":["mΩ"]},{"category":"energy","mappings":{"default":{"default":"ohm"}},"key":"Ω","names":["Ω","Ohm"]},{"category":"energy","mappings":{"default":{"default":"kilohm"}},"key":"kΩ","names":["kΩ","KΩ"]},{"category":"energy","mappings":{"default":{"default":"ohm"}},"key":"Ω","names":["Ω"]},{"category":"energy","mappings":{"default":{"default":"megaohm"}},"key":"MΩ","names":["MΩ"]},{"category":"energy","mappings":{"default":{"default":"gigaohm"}},"key":"GΩ","names":["GΩ"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/length.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/length.js
deleted file mode 100644
index b1081024..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/length.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"Length","mappings":{"default":{"default":"millimeters"}},"key":"mm","names":["mm"]},{"category":"Length","mappings":{"default":{"default":"centimeters"}},"key":"cm","names":["cm"]},{"category":"Length","mappings":{"default":{"default":"meters"}},"key":"m","names":["m"]},{"category":"Length","mappings":{"default":{"default":"kilometers"}},"key":"km","names":["km"]},{"category":"Length","mappings":{"default":{"default":"feet"}},"key":"ft","names":["ft","ft."]},{"category":"Length","mappings":{"default":{"default":"inches"}},"key":"in","names":["in","in."]},{"category":"Length","mappings":{"default":{"default":"miles"}},"key":"mi","names":["mi","mi."]},{"category":"Length","mappings":{"default":{"default":"yards"}},"key":"yd","names":["yd","yd."]},{"category":"","mappings":{"default":{"default":"nautical miles"}},"key":"n.m.","names":["n.m."]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/memory.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/memory.js
deleted file mode 100644
index 1fa748cd..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/memory.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"","mappings":{"default":{"default":"bits"}},"key":"b","names":["b"]},{"category":"","mappings":{"default":{"default":"bytes"}},"key":"B","names":["B"]},{"category":"","mappings":{"default":{"default":"kilobytes"}},"key":"KB","names":["KB"]},{"category":"","mappings":{"default":{"default":"megabytes"}},"key":"MB","names":["MB"]},{"category":"","mappings":{"default":{"default":"gigabytes"}},"key":"GB","names":["GB"]},{"category":"","mappings":{"default":{"default":"terabytes"}},"key":"TB","names":["TB"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/other.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/other.js
deleted file mode 100644
index 1822756e..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/other.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"","mappings":{"default":{"default":"dozen"}},"key":"doz","names":["doz","doz.","dz","dz."]},{"category":"","mappings":{"default":{"default":"square"}},"key":"sq","names":["sq","sq."]},{"category":"","mappings":{"default":{"default":"hectare"}},"key":"ha","names":["ha"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/speed.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/speed.js
deleted file mode 100644
index 30d2f71a..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/speed.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"","mappings":{"default":{"default":"knot"}},"key":"kt","names":["kt","kt."]},{"category":"","mappings":{"default":{"default":"miles per hour"}},"key":"mph","names":["mph"]},{"category":"","mappings":{"default":{"default":"revolutions per minute"}},"key":"rpm","names":["rpm"]},{"category":"","mappings":{"default":{"default":"kilometers per hour"}},"key":"kmh","names":["kmh"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/temperature.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/temperature.js
deleted file mode 100644
index 24aca140..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/temperature.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"","mappings":{"default":{"default":"Fahrenheit"}},"key":"F","names":["F","F.","°F"]},{"category":"","mappings":{"default":{"default":"Celsius","alternative":"Centigrade"}},"key":"C","names":["C","°C"]},{"category":"","mappings":{"default":{"default":"Kelvin"}},"key":"K","names":["K","°K"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/time.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/time.js
deleted file mode 100644
index 3eed73c7..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/time.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"time","mappings":{"default":{"default":"nanoseconds"}},"key":"ns","names":["ns"]},{"category":"time","mappings":{"default":{"default":"microseconds"}},"key":"µs","names":["µs"]},{"category":"time","mappings":{"default":{"default":"milliseconds"}},"key":"ms","names":["ms"]},{"category":"time","mappings":{"default":{"default":"seconds"}},"key":"s","names":["s"]},{"category":"time","mappings":{"default":{"default":"minutes"}},"key":"min","names":["min"]},{"category":"time","mappings":{"default":{"default":"hours"}},"key":"h","names":["h","hr"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/volume.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/volume.js
deleted file mode 100644
index 842eb005..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/volume.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"volume","mappings":{"default":{"default":"barrels"}},"key":"bbl","names":["bbl.","bbl"]},{"category":"volume","mappings":{"default":{"default":"cubics"}},"key":"cu","names":["cu","cu."]},{"category":"volume","mappings":{"default":{"default":"fluid ounces"}},"key":"fl. oz.","names":["fl. oz."]},{"category":"volume","mappings":{"default":{"default":"gallons"}},"key":"gal","names":["gal","gal."]},{"category":"volume","mappings":{"default":{"default":"pints"}},"key":"pt","names":["pt","pt."]},{"category":"volume","mappings":{"default":{"default":"quarts"}},"key":"qt","names":["qt","qt."]},{"category":"volume","mappings":{"default":{"default":"tablespoons"}},"key":"tbsp","names":["tbsp","tbsp."]},{"category":"volume","mappings":{"default":{"default":"teaspoons"}},"key":"tsp","names":["tsp","tsp."]},{"category":"volume","mappings":{"default":{"default":"cubic centimeters"}},"key":"cc","names":["cc"]},{"category":"volume","mappings":{"default":{"default":"kiloliters"}},"key":"kl","names":["kl"]},{"category":"volume","mappings":{"default":{"default":"liters"}},"key":"l","names":["l"]},{"category":"volume","mappings":{"default":{"default":"milliliters"}},"key":"ml","names":["ml"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/weight.js b/src/main/webapp/math/extensions/a11y/mathmaps/en/units/weight.js
deleted file mode 100644
index 5eb7af23..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/en/units/weight.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"en"},{"category":"","mappings":{"default":{"default":"pounds"}},"key":"lb","names":["lb","lb."]},{"category":"","mappings":{"default":{"default":"long tons"}},"key":"LT","names":["LT","L.T."]},{"category":"","mappings":{"default":{"default":"ounces"}},"key":"oz","names":["oz","oz."]},{"key":"µg","names":["µg","mcg"],"mappings":{"default":{"default":"micrograms"}}},{"category":"","mappings":{"default":{"default":"grams"}},"key":"gr","names":["g","gr"]},{"category":"","mappings":{"default":{"default":"kilograms"}},"key":"kg","names":["kg"]},{"category":"","mappings":{"default":{"default":"micrograms"}},"key":"mcg","names":["mg","µg"]},{"category":"","mappings":{"default":{"default":"milligrams"}},"key":"mg","names":["mg"]},{"category":"","mappings":{"default":{"default":"tons"}},"key":"t","names":["t","T"]}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/algebra.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/algebra.js
deleted file mode 100644
index 96cfc372..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/algebra.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"deg","names":["deg"],"mappings":{"default":{"default":"grados"}},"category":"Algebra"},{"key":"det","names":["det"],"mappings":{"default":{"default":"determinante"}},"category":"Algebra"},{"key":"dim","names":["dim"],"mappings":{"default":{"default":"dimensión"}},"category":"Algebra"},{"key":"hom","names":["hom","Hom"],"mappings":{"default":{"default":"homomorfismo"}},"category":"Algebra"},{"key":"ker","names":["ker"],"mappings":{"default":{"default":"kernel"}},"category":"Algebra"},{"key":"Tr","names":["Tr","tr"],"mappings":{"default":{"default":"traza"}},"category":"Algebra"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/elementary.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/elementary.js
deleted file mode 100644
index 30c0978e..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/elementary.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"log","names":["log"],"mappings":{"default":{"default":"logaritmo"}},"category":"Logarithm"},{"key":"ln","names":["ln"],"mappings":{"default":{"default":"logaritmo neperiano"}},"category":"Logarithm"},{"key":"lg","names":["lg"],"mappings":{"default":{"default":"logaritmo base 10"}},"category":"Logarithm"},{"key":"exp","names":["exp","expt"],"mappings":{"default":{"default":"exponente"}},"category":"Elementary"},{"key":"gcd","names":["gcd"],"mappings":{"default":{"default":"MCD"}},"category":"Elementary"},{"key":"lcm","names":["lcm"],"mappings":{"default":{"default":"mcm"}},"category":"Elementary"},{"key":"arg","names":["arg"],"mappings":{"default":{"default":"argumento"}},"category":"Complex"},{"key":"im","names":["im"],"mappings":{"default":{"default":"parte imaginaria"}},"category":"Complex"},{"key":"re","names":["re"],"mappings":{"default":{"default":"residuo"}},"category":"Complex"},{"key":"inf","names":["inf"],"mappings":{"default":{"default":"extremo inferior"}},"category":"Limits"},{"key":"lim","names":["lim"],"mappings":{"default":{"default":"límite"}},"category":"Limits"},{"key":"max","names":["max"],"mappings":{"default":{"default":"máximo"}},"category":"Limits"},{"key":"min","names":["min"],"mappings":{"default":{"default":"mínimo"}},"category":"Limits"},{"key":"sup","names":["sup"],"mappings":{"default":{"default":"superior"}},"category":"Limits"},{"key":"lim inf","names":["lim inf","liminf"],"mappings":{"default":{"default":"límite inferior"}},"category":"Limits"},{"key":"lim sup","names":["lim sup","limsup"],"mappings":{"default":{"default":"límite superior"}},"category":"Limits"},{"key":"injlim","names":["injlim","inj lim"],"mappings":{"default":{"default":"límite directo"}},"category":"Limits"},{"key":"projlim","names":["projlim","proj lim"],"mappings":{"default":{"default":"límite inverso"}},"category":"Limits"},{"key":"mod","names":["mod"],"mappings":{"default":{"default":"módulo"}},"category":"Elementary"},{"key":"Pr","names":["Pr"],"mappings":{"default":{"default":"probabilidad"}},"category":"Probability"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/hyperbolic.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/hyperbolic.js
deleted file mode 100644
index eaac560c..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/hyperbolic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"cosh","names":["cosh"],"mappings":{"default":{"default":"coseno hiperbólico"}},"category":"Hyperbolic"},{"key":"coth","names":["coth"],"mappings":{"default":{"default":"cotangente hiperbólica"}},"category":"Hyperbolic"},{"key":"csch","names":["csch"],"mappings":{"default":{"default":"cosecante hiperbólica"}},"category":"Hyperbolic"},{"key":"sech","names":["sech"],"mappings":{"default":{"default":"secante hiperbólica"}},"category":"Hyperbolic"},{"key":"sinh","names":["sinh"],"mappings":{"default":{"default":"seno hiperbólico"}},"category":"Hyperbolic"},{"key":"tanh","names":["tanh"],"mappings":{"default":{"default":"tangente hiperbólica"}},"category":"Hyperbolic"},{"key":"arcosh","names":["arcosh","arccosh"],"mappings":{"default":{"default":"area coseno hiperbólico"}},"category":"Area"},{"key":"arcoth","names":["arcoth","arccoth"],"mappings":{"default":{"default":"area cotangente hiperbólica"}},"category":"Area"},{"key":"arcsch","names":["arcsch","arccsch"],"mappings":{"default":{"default":"area cosecante hiperbólica"}},"category":"Area"},{"key":"arsech","names":["arsech","arcsech"],"mappings":{"default":{"default":"area secante hiperbólica"}},"category":"Area"},{"key":"arsinh","names":["arsinh","arcsinh"],"mappings":{"default":{"default":"area seno hiperbólico"}},"category":"Area"},{"key":"artanh","names":["artanh","arctanh"],"mappings":{"default":{"default":"area tangente hiperbólica"}},"category":"Area"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/trigonometry.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/trigonometry.js
deleted file mode 100644
index 0d7550d7..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/functions/trigonometry.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"cos","names":["cos","cosine"],"mappings":{"default":{"default":"coseno"}},"category":"Trigonometric"},{"key":"cot","names":["cot"],"mappings":{"default":{"default":"cotangente"}},"category":"Trigonometric"},{"key":"csc","names":["csc"],"mappings":{"default":{"default":"cosecante"}},"category":"Trigonometric"},{"key":"sec","names":["sec"],"mappings":{"default":{"default":"secant"}},"category":"Trigonometric"},{"key":"sin","names":["sin","sine","sen"],"mappings":{"default":{"default":"seno"}},"category":"Trigonometric"},{"key":"tan","names":["tan"],"mappings":{"default":{"default":"tangente"}},"category":"Trigonometric"},{"key":"arccos","names":["arccos"],"mappings":{"default":{"default":"arco coseno"}},"category":"Cyclometric"},{"key":"arccot","names":["arccot"],"mappings":{"default":{"default":"arco cotangente"}},"category":"Cyclometric"},{"key":"arccsc","names":["arccsc"],"mappings":{"default":{"default":"arco cosecante"}},"category":"Cyclometric"},{"key":"arcsec","names":["arcsec"],"mappings":{"default":{"default":"arco secante"}},"category":"Cyclometric"},{"key":"arcsin","names":["arcsin"],"mappings":{"default":{"default":"arco seno"}},"category":"Cyclometric"},{"key":"arctan","names":["arctan"],"mappings":{"default":{"default":"arco tangente"}},"category":"Cyclometric"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-capital.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-capital.js
deleted file mode 100644
index dc41c695..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-capital.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"0391","mappings":{"default":{"default":"mayúscula Alfa"}},"category":"Lu"},{"key":"0392","mappings":{"default":{"default":"mayúscula Beta"}},"category":"Lu"},{"key":"0393","mappings":{"default":{"default":"mayúscula Gamma"}},"category":"Lu"},{"key":"0394","mappings":{"default":{"default":"mayúscula Delta"}},"category":"Lu"},{"key":"0395","mappings":{"default":{"default":"mayúscula Épsilon"}},"category":"Lu"},{"key":"0396","mappings":{"default":{"default":"mayúscula Zeta"}},"category":"Lu"},{"key":"0397","mappings":{"default":{"default":"mayúscula Eta"}},"category":"Lu"},{"key":"0398","mappings":{"default":{"default":"mayúscula Theta"}},"category":"Lu"},{"key":"0399","mappings":{"default":{"default":"mayúscula Iota"}},"category":"Lu"},{"key":"039A","mappings":{"default":{"default":"mayúscula Kappa"}},"category":"Lu"},{"key":"039B","mappings":{"default":{"default":"mayúscula Lambda"}},"category":"Lu"},{"key":"039C","mappings":{"default":{"default":"mayúscula Mi"}},"category":"Lu"},{"key":"039D","mappings":{"default":{"default":"mayúscula Ni"}},"category":"Lu"},{"key":"039E","mappings":{"default":{"default":"mayúscula Xi"}},"category":"Lu"},{"key":"039F","mappings":{"default":{"default":"mayúscula Ómicron"}},"category":"Lu"},{"key":"03A0","mappings":{"default":{"default":"mayúscula Pi"}},"category":"Lu"},{"key":"03A1","mappings":{"default":{"default":"mayúscula Rho"}},"category":"Lu"},{"key":"03A3","mappings":{"default":{"default":"mayúscula Sigma"}},"category":"Lu"},{"key":"03A4","mappings":{"default":{"default":"mayúscula Tau"}},"category":"Lu"},{"key":"03A5","mappings":{"default":{"default":"mayúscula Ãpsilon"}},"category":"Lu"},{"key":"03A6","mappings":{"default":{"default":"mayúscula Phi"}},"category":"Lu"},{"key":"03A7","mappings":{"default":{"default":"mayúscula Ji"}},"category":"Lu"},{"key":"03A8","mappings":{"default":{"default":"mayúscula Psi"}},"category":"Lu"},{"key":"03A9","mappings":{"default":{"default":"mayúscula Omega"}},"category":"Lu"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-bold.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-bold.js
deleted file mode 100644
index ce70461d..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-bold.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Alfa"}},"key":"1D6A8"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Beta"}},"key":"1D6A9"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Gamma"}},"key":"1D6AA"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Delta"}},"key":"1D6AB"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Épsilon"}},"key":"1D6AC"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Zeta"}},"key":"1D6AD"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Eta"}},"key":"1D6AE"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Theta"}},"key":"1D6AF"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Iota"}},"key":"1D6B0"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Kappa"}},"key":"1D6B1"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Lambda"}},"key":"1D6B2"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Mi"}},"key":"1D6B3"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Ni"}},"key":"1D6B4"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Xi"}},"key":"1D6B5"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Ómicron"}},"key":"1D6B6"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Pi"}},"key":"1D6B7"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Rho"}},"key":"1D6B8"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Sigma"}},"key":"1D6BA"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Tau"}},"key":"1D6BB"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Ãpsilon"}},"key":"1D6BC"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Phi"}},"key":"1D6BD"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Ji"}},"key":"1D6BE"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Psi"}},"key":"1D6BF"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Omega"}},"key":"1D6C0"},{"category":"Ll","mappings":{"default":{"default":"negrita alfa"}},"key":"1D6C2"},{"category":"Ll","mappings":{"default":{"default":"negrita beta"}},"key":"1D6C3"},{"category":"Ll","mappings":{"default":{"default":"negrita gamma"}},"key":"1D6C4"},{"category":"Ll","mappings":{"default":{"default":"negrita delta"}},"key":"1D6C5"},{"category":"Ll","mappings":{"default":{"default":"negrita épsilon"}},"key":"1D6C6"},{"category":"Ll","mappings":{"default":{"default":"negrita zeta"}},"key":"1D6C7"},{"category":"Ll","mappings":{"default":{"default":"negrita eta"}},"key":"1D6C8"},{"category":"Ll","mappings":{"default":{"default":"negrita theta"}},"key":"1D6C9"},{"category":"Ll","mappings":{"default":{"default":"negrita iota"}},"key":"1D6CA"},{"category":"Ll","mappings":{"default":{"default":"negrita kappa"}},"key":"1D6CB"},{"category":"Ll","mappings":{"default":{"default":"negrita lambda"}},"key":"1D6CC"},{"category":"Ll","mappings":{"default":{"default":"negrita mi"}},"key":"1D6CD"},{"category":"Ll","mappings":{"default":{"default":"negrita ni"}},"key":"1D6CE"},{"category":"Ll","mappings":{"default":{"default":"negrita xi"}},"key":"1D6CF"},{"category":"Ll","mappings":{"default":{"default":"negrita ómicron"}},"key":"1D6D0"},{"category":"Ll","mappings":{"default":{"default":"negrita pi"}},"key":"1D6D1"},{"category":"Ll","mappings":{"default":{"default":"negrita rho"}},"key":"1D6D2"},{"category":"Ll","mappings":{"default":{"default":"negrita final sigma"}},"key":"1D6D3"},{"category":"Ll","mappings":{"default":{"default":"negrita sigma"}},"key":"1D6D4"},{"category":"Ll","mappings":{"default":{"default":"negrita tau"}},"key":"1D6D5"},{"category":"Ll","mappings":{"default":{"default":"negrita ípsilon"}},"key":"1D6D6"},{"category":"Ll","mappings":{"default":{"default":"negrita phi"}},"key":"1D6D7"},{"category":"Ll","mappings":{"default":{"default":"negrita ji"}},"key":"1D6D8"},{"category":"Ll","mappings":{"default":{"default":"negrita psi"}},"key":"1D6D9"},{"category":"Ll","mappings":{"default":{"default":"negrita omega"}},"key":"1D6DA"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-italic.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-italic.js
deleted file mode 100644
index d788acc3..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-italic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Alfa"}},"key":"1D6E2"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Beta"}},"key":"1D6E3"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Gamma"}},"key":"1D6E4"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Delta"}},"key":"1D6E5"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Épsilon"}},"key":"1D6E6"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Zeta"}},"key":"1D6E7"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Eta"}},"key":"1D6E8"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Theta"}},"key":"1D6E9"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Iota"}},"key":"1D6EA"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Kappa"}},"key":"1D6EB"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Lambda"}},"key":"1D6EC"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Mi"}},"key":"1D6ED"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Ni"}},"key":"1D6EE"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Xi"}},"key":"1D6EF"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Ómicron"}},"key":"1D6F0"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Pi"}},"key":"1D6F1"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Rho"}},"key":"1D6F2"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Sigma"}},"key":"1D6F4"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Tau"}},"key":"1D6F5"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Ãpsilon"}},"key":"1D6F6"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Phi"}},"key":"1D6F7"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Ji"}},"key":"1D6F8"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Psi"}},"key":"1D6F9"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Omega"}},"key":"1D6FA"},{"category":"Ll","mappings":{"default":{"default":"cursiva alfa"}},"key":"1D6FC"},{"category":"Ll","mappings":{"default":{"default":"cursiva beta"}},"key":"1D6FD"},{"category":"Ll","mappings":{"default":{"default":"cursiva gamma"}},"key":"1D6FE"},{"category":"Ll","mappings":{"default":{"default":"cursiva delta"}},"key":"1D6FF"},{"category":"Ll","mappings":{"default":{"default":"cursiva épsilon"}},"key":"1D700"},{"category":"Ll","mappings":{"default":{"default":"cursiva zeta"}},"key":"1D701"},{"category":"Ll","mappings":{"default":{"default":"cursiva eta"}},"key":"1D702"},{"category":"Ll","mappings":{"default":{"default":"cursiva theta"}},"key":"1D703"},{"category":"Ll","mappings":{"default":{"default":"cursiva iota"}},"key":"1D704"},{"category":"Ll","mappings":{"default":{"default":"cursiva kappa"}},"key":"1D705"},{"category":"Ll","mappings":{"default":{"default":"cursiva lambda"}},"key":"1D706"},{"category":"Ll","mappings":{"default":{"default":"cursiva mi"}},"key":"1D707"},{"category":"Ll","mappings":{"default":{"default":"cursiva ni"}},"key":"1D708"},{"category":"Ll","mappings":{"default":{"default":"cursiva xi"}},"key":"1D709"},{"category":"Ll","mappings":{"default":{"default":"cursiva ómicron"}},"key":"1D70A"},{"category":"Ll","mappings":{"default":{"default":"cursiva pi"}},"key":"1D70B"},{"category":"Ll","mappings":{"default":{"default":"cursiva rho"}},"key":"1D70C"},{"category":"Ll","mappings":{"default":{"default":"cursiva final sigma"}},"key":"1D70D"},{"category":"Ll","mappings":{"default":{"default":"cursiva sigma"}},"key":"1D70E"},{"category":"Ll","mappings":{"default":{"default":"cursiva tau"}},"key":"1D70F"},{"category":"Ll","mappings":{"default":{"default":"cursiva ípsilon"}},"key":"1D710"},{"category":"Ll","mappings":{"default":{"default":"cursiva phi"}},"key":"1D711"},{"category":"Ll","mappings":{"default":{"default":"cursiva ji"}},"key":"1D712"},{"category":"Ll","mappings":{"default":{"default":"cursiva psi"}},"key":"1D713"},{"category":"Ll","mappings":{"default":{"default":"cursiva omega"}},"key":"1D714"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-sans-serif-bold.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-sans-serif-bold.js
deleted file mode 100644
index cb860298..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-mathfonts-sans-serif-bold.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Alfa"}},"key":"1D756"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Beta"}},"key":"1D757"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Gamma"}},"key":"1D758"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Delta"}},"key":"1D759"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Épsilon"}},"key":"1D75A"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Zeta"}},"key":"1D75B"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Eta"}},"key":"1D75C"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Theta"}},"key":"1D75D"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Iota"}},"key":"1D75E"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Kappa"}},"key":"1D75F"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Lambda"}},"key":"1D760"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Mi"}},"key":"1D761"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Ni"}},"key":"1D762"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Xi"}},"key":"1D763"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Ómicron"}},"key":"1D764"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Pi"}},"key":"1D765"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Rho"}},"key":"1D766"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Sigma"}},"key":"1D768"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Tau"}},"key":"1D769"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Ãpsilon"}},"key":"1D76A"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Phi"}},"key":"1D76B"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Ji"}},"key":"1D76C"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Psi"}},"key":"1D76D"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Omega"}},"key":"1D76E"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita alfa"}},"key":"1D770"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita beta"}},"key":"1D771"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita gamma"}},"key":"1D772"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita delta"}},"key":"1D773"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita épsilon"}},"key":"1D774"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita zeta"}},"key":"1D775"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita eta"}},"key":"1D776"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita theta"}},"key":"1D777"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita iota"}},"key":"1D778"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita kappa"}},"key":"1D779"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita lambda"}},"key":"1D77A"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita mi"}},"key":"1D77B"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita ni"}},"key":"1D77C"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita xi"}},"key":"1D77D"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita ómicron"}},"key":"1D77E"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita pi"}},"key":"1D77F"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita rho"}},"key":"1D780"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita final sigma"}},"key":"1D781"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita sigma"}},"key":"1D782"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita tau"}},"key":"1D783"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita ípsilon"}},"key":"1D784"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita phi"}},"key":"1D785"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita ji"}},"key":"1D786"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita psi"}},"key":"1D787"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita omega"}},"key":"1D788"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-scripts.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-scripts.js
deleted file mode 100644
index d7eee0e1..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-scripts.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-small.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-small.js
deleted file mode 100644
index df532758..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-small.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"03B1","mappings":{"default":{"default":"alfa"}},"category":"Ll"},{"key":"03B2","mappings":{"default":{"default":"beta"}},"category":"Ll"},{"key":"03B3","mappings":{"default":{"default":"gamma"}},"category":"Ll"},{"key":"03B4","mappings":{"default":{"default":"delta"}},"category":"Ll"},{"key":"03B5","mappings":{"default":{"default":"épsilon"}},"category":"Ll"},{"key":"03B6","mappings":{"default":{"default":"zeta"}},"category":"Ll"},{"key":"03B7","mappings":{"default":{"default":"eta"}},"category":"Ll"},{"key":"03B8","mappings":{"default":{"default":"theta"}},"category":"Ll"},{"key":"03B9","mappings":{"default":{"default":"iota"}},"category":"Ll"},{"key":"03BA","mappings":{"default":{"default":"kappa"}},"category":"Ll"},{"key":"03BB","mappings":{"default":{"default":"lambda"}},"category":"Ll"},{"key":"03BC","mappings":{"default":{"default":"mi"}},"category":"Ll"},{"key":"03BD","mappings":{"default":{"default":"ni"}},"category":"Ll"},{"key":"03BE","mappings":{"default":{"default":"xi"}},"category":"Ll"},{"key":"03BF","mappings":{"default":{"default":"ómicron"}},"category":"Ll"},{"key":"03C0","mappings":{"default":{"default":"pi"}},"category":"Ll"},{"key":"03C1","mappings":{"default":{"default":"rho"}},"category":"Ll"},{"key":"03C2","mappings":{"default":{"default":"sigma final"}},"category":"Ll"},{"key":"03C3","mappings":{"default":{"default":"sigma"}},"category":"Ll"},{"key":"03C4","mappings":{"default":{"default":"tau"}},"category":"Ll"},{"key":"03C5","mappings":{"default":{"default":"ípsilon"}},"category":"Ll"},{"key":"03C6","mappings":{"default":{"default":"phi"}},"category":"Ll"},{"key":"03C7","mappings":{"default":{"default":"ji"}},"category":"Ll"},{"key":"03C8","mappings":{"default":{"default":"psi"}},"category":"Ll"},{"key":"03C9","mappings":{"default":{"default":"omega"}},"category":"Ll"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-symbols.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-symbols.js
deleted file mode 100644
index f8c9a209..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/greek-symbols.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"03D0","mappings":{"default":{"default":"símbolo beta"}},"category":"Ll"},{"key":"03D1","mappings":{"default":{"default":"variante de theta"}},"category":"Ll"},{"key":"03D5","mappings":{"default":{"default":"phi recta"}},"category":"Ll"},{"key":"03D6","mappings":{"default":{"default":"pi","defaultMP":"variante de pi"}},"category":"Ll"},{"key":"03D7","mappings":{"default":{"default":"símbolo kai griego"}},"category":"Ll"},{"key":"03F0","mappings":{"default":{"default":"kappa","defaultMP":"variante de kappa"}},"category":"Ll"},{"key":"03F1","mappings":{"default":{"default":"rho","defaultMP":"variante de rho"}},"category":"Ll"},{"key":"03F5","mappings":{"default":{"default":"épsilon","defaultMP":"variante de épsilon"}},"category":"Ll"},{"key":"03F6","mappings":{"default":{"default":"épsilon invertido"}},"category":"Sm"},{"key":"03F4","mappings":{"default":{"default":"mayúscula variante de Theta"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula variante de Theta"}},"key":"1D6B9"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula variante de Theta"}},"key":"1D6F3"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula variante de Theta"}},"key":"1D767"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/hebrew_letters.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/hebrew_letters.js
deleted file mode 100644
index 6961fb1e..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/hebrew_letters.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"2135","mappings":{"default":{"default":"alef"}},"category":"Lo"},{"key":"2136","mappings":{"default":{"default":"bet"}},"category":"Lo"},{"key":"2137","mappings":{"default":{"default":"guímel"}},"category":"Lo"},{"key":"2138","mappings":{"default":{"default":"dálet"}},"category":"Lo"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-double-accent.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-double-accent.js
deleted file mode 100644
index 06f94ba1..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-double-accent.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"1E09","mappings":{"default":{"default":"c con cedilla y agudo"}},"category":"Ll"},{"key":"1E15","mappings":{"default":{"default":"e con macrón y grave"}},"category":"Ll"},{"key":"1E17","mappings":{"default":{"default":"e con macrón y agudo"}},"category":"Ll"},{"key":"1E1D","mappings":{"default":{"default":"e con cedilla y breve"}},"category":"Ll"},{"key":"1E2F","mappings":{"default":{"default":"i con diéresis y agudo"}},"category":"Ll"},{"key":"1E39","mappings":{"default":{"default":"l con punto debajo y macrón"}},"category":"Ll"},{"key":"1E4D","mappings":{"default":{"default":"o con tilde y acute"}},"category":"Ll"},{"key":"1E4F","mappings":{"default":{"default":"o con tilde y diéresis"}},"category":"Ll"},{"key":"1E51","mappings":{"default":{"default":"o con macrón y grave"}},"category":"Ll"},{"key":"1E53","mappings":{"default":{"default":"o con macrón y agudo"}},"category":"Ll"},{"key":"1E5D","mappings":{"default":{"default":"r con punto debajo y macrón"}},"category":"Ll"},{"key":"1E65","mappings":{"default":{"default":"s con agudo y punto arriba"}},"category":"Ll"},{"key":"1E67","mappings":{"default":{"default":"s con carón y punto arriba"}},"category":"Ll"},{"key":"1E69","mappings":{"default":{"default":"s con punto debajo y punto arriba"}},"category":"Ll"},{"key":"1E79","mappings":{"default":{"default":"u con tilde y agudo"}},"category":"Ll"},{"key":"1E7B","mappings":{"default":{"default":"u con macrón y diéresis"}},"category":"Ll"},{"key":"1EA5","mappings":{"default":{"default":"a con acento circunflejo y agudo"}},"category":"Ll"},{"key":"1EA7","mappings":{"default":{"default":"a con acento circunflejo y grave"}},"category":"Ll"},{"key":"1EA9","mappings":{"default":{"default":"a con acento circunflejo y gancho arriba"}},"category":"Ll"},{"key":"1EAB","mappings":{"default":{"default":"a con acento circunflejo y tilde"}},"category":"Ll"},{"key":"1EAD","mappings":{"default":{"default":"a con acento circunflejo y punto debajo"}},"category":"Ll"},{"key":"1EAF","mappings":{"default":{"default":"a con breve y agudo"}},"category":"Ll"},{"key":"1EB1","mappings":{"default":{"default":"a con breve y grave"}},"category":"Ll"},{"key":"1EB3","mappings":{"default":{"default":"a con breve y gancho arriba"}},"category":"Ll"},{"key":"1EB5","mappings":{"default":{"default":"a con breve y tilde"}},"category":"Ll"},{"key":"1EB7","mappings":{"default":{"default":"a con breve y punto debajo"}},"category":"Ll"},{"key":"1EBF","mappings":{"default":{"default":"e con acento circunflejo y agudo"}},"category":"Ll"},{"key":"1EC1","mappings":{"default":{"default":"e con acento circunflejo y grave"}},"category":"Ll"},{"key":"1EC3","mappings":{"default":{"default":"e con acento circunflejo y gancho arriba"}},"category":"Ll"},{"key":"1EC5","mappings":{"default":{"default":"e con acento circunflejo y tilde"}},"category":"Ll"},{"key":"1EC7","mappings":{"default":{"default":"e con acento circunflejo y punto debajo"}},"category":"Ll"},{"key":"1ED1","mappings":{"default":{"default":"o con acento circunflejo y agudo"}},"category":"Ll"},{"key":"1ED3","mappings":{"default":{"default":"o con acento circunflejo y grave"}},"category":"Ll"},{"key":"1ED5","mappings":{"default":{"default":"o con acento circunflejo y gancho arriba"}},"category":"Ll"},{"key":"1ED7","mappings":{"default":{"default":"o con acento circunflejo y tilde"}},"category":"Ll"},{"key":"1ED9","mappings":{"default":{"default":"o con acento circunflejo y punto debajo"}},"category":"Ll"},{"key":"1EDB","mappings":{"default":{"default":"o with horn and acute"}},"category":"Ll"},{"key":"1EDD","mappings":{"default":{"default":"o with horn and grave"}},"category":"Ll"},{"key":"1EDF","mappings":{"default":{"default":"o with horn and hook above"}},"category":"Ll"},{"key":"1EE1","mappings":{"default":{"default":"o with horn and tilde"}},"category":"Ll"},{"key":"1EE3","mappings":{"default":{"default":"o con cuerno y punto debajo"}},"category":"Ll"},{"key":"1EE9","mappings":{"default":{"default":"u con cuerno y agudo"}},"category":"Ll"},{"key":"1EEB","mappings":{"default":{"default":"u con cuerno y grave"}},"category":"Ll"},{"key":"1EED","mappings":{"default":{"default":"u con cuerno y gancho arriba"}},"category":"Ll"},{"key":"1EEF","mappings":{"default":{"default":"u con cuerno y tilde"}},"category":"Ll"},{"key":"1EF1","mappings":{"default":{"default":"u con cuerno y punto debajo"}},"category":"Ll"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-normal.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-normal.js
deleted file mode 100644
index e9d632e1..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-normal.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"0061","mappings":{"default":{"default":"a"}},"category":"Ll"},{"key":"0062","mappings":{"default":{"default":"b"}},"category":"Ll"},{"key":"0063","mappings":{"default":{"default":"c"}},"category":"Ll"},{"key":"0064","mappings":{"default":{"default":"d"}},"category":"Ll"},{"key":"0065","mappings":{"default":{"default":"e"}},"category":"Ll"},{"key":"0066","mappings":{"default":{"default":"f"}},"category":"Ll"},{"key":"0067","mappings":{"default":{"default":"g"}},"category":"Ll"},{"key":"0068","mappings":{"default":{"default":"h"}},"category":"Ll"},{"key":"0069","mappings":{"default":{"default":"i"}},"category":"Ll"},{"key":"006A","mappings":{"default":{"default":"j"}},"category":"Ll"},{"key":"006B","mappings":{"default":{"default":"k"}},"category":"Ll"},{"key":"006C","mappings":{"default":{"default":"l"}},"category":"Ll"},{"key":"006D","mappings":{"default":{"default":"m"}},"category":"Ll"},{"key":"006E","mappings":{"default":{"default":"n"}},"category":"Ll"},{"key":"006F","mappings":{"default":{"default":"o"}},"category":"Ll"},{"key":"0070","mappings":{"default":{"default":"p"}},"category":"Ll"},{"key":"0071","mappings":{"default":{"default":"q"}},"category":"Ll"},{"key":"0072","mappings":{"default":{"default":"r"}},"category":"Ll"},{"key":"0073","mappings":{"default":{"default":"s"}},"category":"Ll"},{"key":"0074","mappings":{"default":{"default":"t"}},"category":"Ll"},{"key":"0075","mappings":{"default":{"default":"u"}},"category":"Ll"},{"key":"0076","mappings":{"default":{"default":"v"}},"category":"Ll"},{"key":"0077","mappings":{"default":{"default":"w"}},"category":"Ll"},{"key":"0078","mappings":{"default":{"default":"x"}},"category":"Ll"},{"key":"0079","mappings":{"default":{"default":"y","defaultMP":"ye"}},"category":"Ll"},{"key":"007A","mappings":{"default":{"default":"z"}},"category":"Ll"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-phonetic.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-phonetic.js
deleted file mode 100644
index 0deaaf7d..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-phonetic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"00F8","mappings":{"default":{"default":"o barrada"}},"category":"Ll"},{"key":"0111","mappings":{"default":{"default":"d con barra"}},"category":"Ll"},{"key":"0127","mappings":{"default":{"default":"h con guión"}},"category":"Ll"},{"key":"0142","mappings":{"default":{"default":"l con guión"}},"category":"Ll"},{"key":"0167","mappings":{"default":{"default":"t con guión"}},"category":"Ll"},{"key":"019B","mappings":{"default":{"default":"lambda tachada"}},"category":"Ll"},{"key":"1E9B","mappings":{"default":{"default":"s larga con punto arriba"}},"category":"Ll"},{"key":"0138","mappings":{"default":{"default":"kra"}},"category":"Ll"},{"key":"0192","mappings":{"default":{"default":"f con gancho"}},"category":"Ll"},{"key":"019A","mappings":{"default":{"default":"l con barra"}},"category":"Ll"},{"key":"025B","mappings":{"default":{"default":"e abierta"}},"category":"Ll"},{"key":"0149","mappings":{"default":{"default":"n precedida por apóstrofe"}},"category":"Ll"},{"key":"014B","mappings":{"default":{"default":"eng"}},"category":"Ll"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-single-accent.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-single-accent.js
deleted file mode 100644
index 7d48b036..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-lower-single-accent.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"00E0","mappings":{"default":{"default":"a grave"}},"category":"Ll"},{"key":"00E1","mappings":{"default":{"default":"a aguda"}},"category":"Ll"},{"key":"00E2","mappings":{"default":{"default":"a acento circunflejo"}},"category":"Ll"},{"key":"00E3","mappings":{"default":{"default":"a con tilde"}},"category":"Ll"},{"key":"00E4","mappings":{"default":{"default":"a diéresis"}},"category":"Ll"},{"key":"00E5","mappings":{"default":{"default":"a con anillo"}},"category":"Ll"},{"key":"00E7","mappings":{"default":{"default":"c cedilla"}},"category":"Ll"},{"key":"00E8","mappings":{"default":{"default":"e grave"}},"category":"Ll"},{"key":"00E9","mappings":{"default":{"default":"e aguda"}},"category":"Ll"},{"key":"00EA","mappings":{"default":{"default":"e acento circunflejo"}},"category":"Ll"},{"key":"00EB","mappings":{"default":{"default":"e diéresis"}},"category":"Ll"},{"key":"00EC","mappings":{"default":{"default":"i grave"}},"category":"Ll"},{"key":"00ED","mappings":{"default":{"default":"i aguda"}},"category":"Ll"},{"key":"00EE","mappings":{"default":{"default":"i acento circunflejo"}},"category":"Ll"},{"key":"00EF","mappings":{"default":{"default":"i diéresis"}},"category":"Ll"},{"key":"00F1","mappings":{"default":{"default":"eñe"}},"category":"Ll"},{"key":"00F2","mappings":{"default":{"default":"o grave"}},"category":"Ll"},{"key":"00F3","mappings":{"default":{"default":"o aguda"}},"category":"Ll"},{"key":"00F4","mappings":{"default":{"default":"o acento circunflejo"}},"category":"Ll"},{"key":"00F5","mappings":{"default":{"default":"o con tilde"}},"category":"Ll"},{"key":"00F6","mappings":{"default":{"default":"o diéresis"}},"category":"Ll"},{"key":"00F9","mappings":{"default":{"default":"u grave"}},"category":"Ll"},{"key":"00FA","mappings":{"default":{"default":"u aguda"}},"category":"Ll"},{"key":"00FB","mappings":{"default":{"default":"u acento circunflejo"}},"category":"Ll"},{"key":"00FC","mappings":{"default":{"default":"u diéresis"}},"category":"Ll"},{"key":"00FD","mappings":{"default":{"default":"Y aguda","defaultMP":"ye aguda"}},"category":"Ll"},{"key":"00FF","mappings":{"default":{"default":"y diéresis","defaultMP":"ye diéresis"}},"category":"Ll"},{"key":"0101","mappings":{"default":{"default":"a barra"}},"category":"Ll"},{"key":"0103","mappings":{"default":{"default":"a con breve"}},"category":"Ll"},{"key":"0105","mappings":{"default":{"default":"a con ogonek"}},"category":"Ll"},{"key":"0107","mappings":{"default":{"default":"c con agudo"}},"category":"Ll"},{"key":"0109","mappings":{"default":{"default":"c con acento circunflejo"}},"category":"Ll"},{"key":"010B","mappings":{"default":{"default":"c con punto arriba"}},"category":"Ll"},{"key":"010D","mappings":{"default":{"default":"c con carón"}},"category":"Ll"},{"key":"010F","mappings":{"default":{"default":"d con carón"}},"category":"Ll"},{"key":"0113","mappings":{"default":{"default":"e barra"}},"category":"Ll"},{"key":"0117","mappings":{"default":{"default":"e con punto arriba"}},"category":"Ll"},{"key":"0119","mappings":{"default":{"default":"e con ogonek"}},"category":"Ll"},{"key":"011B","mappings":{"default":{"default":"e con carón"}},"category":"Ll"},{"key":"011D","mappings":{"default":{"default":"g con acento circunflejo"}},"category":"Ll"},{"key":"011F","mappings":{"default":{"default":"g con breve"}},"category":"Ll"},{"key":"0121","mappings":{"default":{"default":"g con punto arriba"}},"category":"Ll"},{"key":"0125","mappings":{"default":{"default":"h con acento circunflejo"}},"category":"Ll"},{"key":"0129","mappings":{"default":{"default":"i con tilde"}},"category":"Ll"},{"key":"012B","mappings":{"default":{"default":"i barra"}},"category":"Ll"},{"key":"012F","mappings":{"default":{"default":"i con ogonek"}},"category":"Ll"},{"key":"0131","mappings":{"default":{"default":"i sin punto"}},"category":"Ll"},{"key":"0135","mappings":{"default":{"default":"j con acento circunflejo"}},"category":"Ll"},{"key":"0137","mappings":{"default":{"default":"k con cedilla"}},"category":"Ll"},{"key":"013A","mappings":{"default":{"default":"l con agudo"}},"category":"Ll"},{"key":"013C","mappings":{"default":{"default":"l con cedilla"}},"category":"Ll"},{"key":"013E","mappings":{"default":{"default":"l con carón"}},"category":"Ll"},{"key":"0140","mappings":{"default":{"default":"l con punto mediano"}},"category":"Ll"},{"key":"0144","mappings":{"default":{"default":"n con agudo"}},"category":"Ll"},{"key":"0146","mappings":{"default":{"default":"n con cedilla"}},"category":"Ll"},{"key":"0148","mappings":{"default":{"default":"n con carón"}},"category":"Ll"},{"key":"014D","mappings":{"default":{"default":"o barra"}},"category":"Ll"},{"key":"0151","mappings":{"default":{"default":"o con doble acento agudo"}},"category":"Ll"},{"key":"0155","mappings":{"default":{"default":"r con agudo"}},"category":"Ll"},{"key":"0157","mappings":{"default":{"default":"r con cedilla"}},"category":"Ll"},{"key":"0159","mappings":{"default":{"default":"r con carón"}},"category":"Ll"},{"key":"015B","mappings":{"default":{"default":"s con agudo"}},"category":"Ll"},{"key":"015D","mappings":{"default":{"default":"s con acento circunflejo"}},"category":"Ll"},{"key":"015F","mappings":{"default":{"default":"s con cedilla"}},"category":"Ll"},{"key":"0161","mappings":{"default":{"default":"s con carón"}},"category":"Ll"},{"key":"0163","mappings":{"default":{"default":"t con cedilla"}},"category":"Ll"},{"key":"0165","mappings":{"default":{"default":"t con carón"}},"category":"Ll"},{"key":"0169","mappings":{"default":{"default":"u con tilde"}},"category":"Ll"},{"key":"016B","mappings":{"default":{"default":"u barra"}},"category":"Ll"},{"key":"016D","mappings":{"default":{"default":"u con breve"}},"category":"Ll"},{"key":"016F","mappings":{"default":{"default":"u con anillo arriba"}},"category":"Ll"},{"key":"0171","mappings":{"default":{"default":"u con doble acento agudo"}},"category":"Ll"},{"key":"0173","mappings":{"default":{"default":"u con ogonek"}},"category":"Ll"},{"key":"0175","mappings":{"default":{"default":"w con circunflejo"}},"category":"Ll"},{"key":"0177","mappings":{"default":{"default":"y con circunflejo"}},"category":"Ll"},{"key":"017A","mappings":{"default":{"default":"z con agudo"}},"category":"Ll"},{"key":"017C","mappings":{"default":{"default":"z con punto"}},"category":"Ll"},{"key":"017E","mappings":{"default":{"default":"z con carón"}},"category":"Ll"},{"key":"01F5","mappings":{"default":{"default":"g con agudo"}},"category":"Ll"},{"key":"1E01","mappings":{"default":{"default":"a con anillo debajo"}},"category":"Ll"},{"key":"1E03","mappings":{"default":{"default":"b con punto arriba"}},"category":"Ll"},{"key":"1E05","mappings":{"default":{"default":"b con punto debajo"}},"category":"Ll"},{"key":"1E07","mappings":{"default":{"default":"b con línea debajo"}},"category":"Ll"},{"key":"1E0B","mappings":{"default":{"default":"d con punto arriba"}},"category":"Ll"},{"key":"1E0D","mappings":{"default":{"default":"d con punto debajo"}},"category":"Ll"},{"key":"1E0F","mappings":{"default":{"default":"d con línea debajo"}},"category":"Ll"},{"key":"1E11","mappings":{"default":{"default":"d con cedilla"}},"category":"Ll"},{"key":"1E13","mappings":{"default":{"default":"d con acento circunflejo debajo"}},"category":"Ll"},{"key":"1E19","mappings":{"default":{"default":"e con acento circunflejo debajo"}},"category":"Ll"},{"key":"1E1B","mappings":{"default":{"default":"e con tilde debajo"}},"category":"Ll"},{"key":"1E1F","mappings":{"default":{"default":"f con punto arriba"}},"category":"Ll"},{"key":"1E21","mappings":{"default":{"default":"g con macrón"}},"category":"Ll"},{"key":"1E23","mappings":{"default":{"default":"h con punto arriba"}},"category":"Ll"},{"key":"1E25","mappings":{"default":{"default":"h con punto debajo"}},"category":"Ll"},{"key":"1E27","mappings":{"default":{"default":"h con diéresis"}},"category":"Ll"},{"key":"1E29","mappings":{"default":{"default":"h con cedilla"}},"category":"Ll"},{"key":"1E2B","mappings":{"default":{"default":"h con breve debajo"}},"category":"Ll"},{"key":"1E2D","mappings":{"default":{"default":"i con tilde debajo"}},"category":"Ll"},{"key":"1E31","mappings":{"default":{"default":"k con agudo"}},"category":"Ll"},{"key":"1E33","mappings":{"default":{"default":"k con punto debajo"}},"category":"Ll"},{"key":"1E35","mappings":{"default":{"default":"k con línea debajo"}},"category":"Ll"},{"key":"1E37","mappings":{"default":{"default":"l con punto debajo"}},"category":"Ll"},{"key":"1E3B","mappings":{"default":{"default":"l con línea debajo"}},"category":"Ll"},{"key":"1E3D","mappings":{"default":{"default":"l con acento circunflejo debajo"}},"category":"Ll"},{"key":"1E3F","mappings":{"default":{"default":"m con agudo"}},"category":"Ll"},{"key":"1E41","mappings":{"default":{"default":"m con punto arriba"}},"category":"Ll"},{"key":"1E43","mappings":{"default":{"default":"m con punto debajo"}},"category":"Ll"},{"key":"1E45","mappings":{"default":{"default":"n con punto arriba"}},"category":"Ll"},{"key":"1E47","mappings":{"default":{"default":"n con punto debajo"}},"category":"Ll"},{"key":"1E49","mappings":{"default":{"default":"n con línea debajo"}},"category":"Ll"},{"key":"1E4B","mappings":{"default":{"default":"n con acento circunflejo debajo"}},"category":"Ll"},{"key":"1E55","mappings":{"default":{"default":"p con agudo"}},"category":"Ll"},{"key":"1E57","mappings":{"default":{"default":"p con punto arriba"}},"category":"Ll"},{"key":"1E59","mappings":{"default":{"default":"r con punto arriba"}},"category":"Ll"},{"key":"1E5B","mappings":{"default":{"default":"r con punto debajo"}},"category":"Ll"},{"key":"1E5F","mappings":{"default":{"default":"r con línea debajo"}},"category":"Ll"},{"key":"1E61","mappings":{"default":{"default":"s con punto arriba"}},"category":"Ll"},{"key":"1E63","mappings":{"default":{"default":"s con punto debajo"}},"category":"Ll"},{"key":"1E6B","mappings":{"default":{"default":"t con punto arriba"}},"category":"Ll"},{"key":"1E6D","mappings":{"default":{"default":"t con punto debajo"}},"category":"Ll"},{"key":"1E6F","mappings":{"default":{"default":"t con línea debajo"}},"category":"Ll"},{"key":"1E71","mappings":{"default":{"default":"t con acento circunflejo debajo"}},"category":"Ll"},{"key":"1E73","mappings":{"default":{"default":"u con diéresis debajo"}},"category":"Ll"},{"key":"1E75","mappings":{"default":{"default":"u con tilde debajo"}},"category":"Ll"},{"key":"1E77","mappings":{"default":{"default":"u con acento circunflejo debajo"}},"category":"Ll"},{"key":"1E7D","mappings":{"default":{"default":"v con tilde"}},"category":"Ll"},{"key":"1E7F","mappings":{"default":{"default":"v con punto debajo"}},"category":"Ll"},{"key":"1E81","mappings":{"default":{"default":"w con grave"}},"category":"Ll"},{"key":"1E83","mappings":{"default":{"default":"w con agudo"}},"category":"Ll"},{"key":"1E85","mappings":{"default":{"default":"w con diéresis"}},"category":"Ll"},{"key":"1E87","mappings":{"default":{"default":"w con punto arriba"}},"category":"Ll"},{"key":"1E89","mappings":{"default":{"default":"w con punto debajo"}},"category":"Ll"},{"key":"1E8B","mappings":{"default":{"default":"x con punto arriba"}},"category":"Ll"},{"key":"1E8D","mappings":{"default":{"default":"x con diéresis"}},"category":"Ll"},{"key":"1E8F","mappings":{"default":{"default":"y con punto arriba"}},"category":"Ll"},{"key":"1E91","mappings":{"default":{"default":"z con acento circunflejo"}},"category":"Ll"},{"key":"1E93","mappings":{"default":{"default":"z con punto debajo"}},"category":"Ll"},{"key":"1E95","mappings":{"default":{"default":"z con línea debajo"}},"category":"Ll"},{"key":"1E96","mappings":{"default":{"default":"h con línea debajo"}},"category":"Ll"},{"key":"1E97","mappings":{"default":{"default":"t con diéresis"}},"category":"Ll"},{"key":"1E98","mappings":{"default":{"default":"w con anillo arriba"}},"category":"Ll"},{"key":"1E99","mappings":{"default":{"default":"y con anillo arriba"}},"category":"Ll"},{"key":"1E9A","mappings":{"default":{"default":"a con medio derecho de anillo"}},"category":"Ll"},{"key":"1EA1","mappings":{"default":{"default":"a con punto debajo"}},"category":"Ll"},{"key":"1EA3","mappings":{"default":{"default":"a con gancho arriba"}},"category":"Ll"},{"key":"1EB9","mappings":{"default":{"default":"e con punto debajo"}},"category":"Ll"},{"key":"1EBB","mappings":{"default":{"default":"e con gancho arriba"}},"category":"Ll"},{"key":"1EBD","mappings":{"default":{"default":"e con tilde"}},"category":"Ll"},{"key":"1EC9","mappings":{"default":{"default":"i con gancho arriba"}},"category":"Ll"},{"key":"1ECB","mappings":{"default":{"default":"i con punto debajo"}},"category":"Ll"},{"key":"1ECD","mappings":{"default":{"default":"o con punto debajo"}},"category":"Ll"},{"key":"1ECF","mappings":{"default":{"default":"o con gancho arriba"}},"category":"Ll"},{"key":"1EE5","mappings":{"default":{"default":"u con punto debajo"}},"category":"Ll"},{"key":"1EE7","mappings":{"default":{"default":"u con gancho arriba"}},"category":"Ll"},{"key":"1EF3","mappings":{"default":{"default":"y con grave"}},"category":"Ll"},{"key":"1EF5","mappings":{"default":{"default":"y con punto debajo"}},"category":"Ll"},{"key":"1EF7","mappings":{"default":{"default":"y con gancho arriba"}},"category":"Ll"},{"key":"1EF9","mappings":{"default":{"default":"y con tilde"}},"category":"Ll"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold-fraktur.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold-fraktur.js
deleted file mode 100644
index 918e9dfd..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold-fraktur.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula A"}},"key":"1D56C"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula B"}},"key":"1D56D"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula C"}},"key":"1D56E"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula D"}},"key":"1D56F"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula E"}},"key":"1D570"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula F"}},"key":"1D571"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula G"}},"key":"1D572"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula H"}},"key":"1D573"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula I"}},"key":"1D574"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula J"}},"key":"1D575"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula K"}},"key":"1D576"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula L"}},"key":"1D577"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula M"}},"key":"1D578"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula N"}},"key":"1D579"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula O"}},"key":"1D57A"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula P"}},"key":"1D57B"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula Q"}},"key":"1D57C"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula R"}},"key":"1D57D"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula S"}},"key":"1D57E"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula T"}},"key":"1D57F"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula U"}},"key":"1D580"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula V"}},"key":"1D581"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula W"}},"key":"1D582"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula X"}},"key":"1D583"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula Y"}},"key":"1D584"},{"category":"Lu","mappings":{"default":{"default":"negrita Fraktur mayúscula Z"}},"key":"1D585"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur a"}},"key":"1D586"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur b"}},"key":"1D587"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur c"}},"key":"1D588"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur d"}},"key":"1D589"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur e"}},"key":"1D58A"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur f"}},"key":"1D58B"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur g"}},"key":"1D58C"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur h"}},"key":"1D58D"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur i"}},"key":"1D58E"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur j"}},"key":"1D58F"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur k"}},"key":"1D590"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur l"}},"key":"1D591"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur m"}},"key":"1D592"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur n"}},"key":"1D593"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur o"}},"key":"1D594"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur p"}},"key":"1D595"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur q"}},"key":"1D596"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur r"}},"key":"1D597"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur s"}},"key":"1D598"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur t"}},"key":"1D599"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur u"}},"key":"1D59A"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur v"}},"key":"1D59B"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur w"}},"key":"1D59C"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur x"}},"key":"1D59D"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur y"}},"key":"1D59E"},{"category":"Ll","mappings":{"default":{"default":"negrita Fraktur z"}},"key":"1D59F"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold-script.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold-script.js
deleted file mode 100644
index f3d18cfc..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold-script.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula A"}},"key":"1D4D0"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula B"}},"key":"1D4D1"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula C"}},"key":"1D4D2"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula D"}},"key":"1D4D3"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula E"}},"key":"1D4D4"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula F"}},"key":"1D4D5"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula G"}},"key":"1D4D6"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula H"}},"key":"1D4D7"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula I"}},"key":"1D4D8"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula J"}},"key":"1D4D9"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula K"}},"key":"1D4DA"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula L"}},"key":"1D4DB"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula M"}},"key":"1D4DC"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula N"}},"key":"1D4DD"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula O"}},"key":"1D4DE"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula P"}},"key":"1D4DF"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula Q"}},"key":"1D4E0"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula R"}},"key":"1D4E1"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula S"}},"key":"1D4E2"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula T"}},"key":"1D4E3"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula U"}},"key":"1D4E4"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula V"}},"key":"1D4E5"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula W"}},"key":"1D4E6"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula X"}},"key":"1D4E7"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula Y"}},"key":"1D4E8"},{"category":"Lu","mappings":{"default":{"default":"negrita script mayúscula Z"}},"key":"1D4E9"},{"category":"Ll","mappings":{"default":{"default":"negrita script a"}},"key":"1D4EA"},{"category":"Ll","mappings":{"default":{"default":"negrita script b"}},"key":"1D4EB"},{"category":"Ll","mappings":{"default":{"default":"negrita script c"}},"key":"1D4EC"},{"category":"Ll","mappings":{"default":{"default":"negrita script d"}},"key":"1D4ED"},{"category":"Ll","mappings":{"default":{"default":"negrita script e"}},"key":"1D4EE"},{"category":"Ll","mappings":{"default":{"default":"negrita script f"}},"key":"1D4EF"},{"category":"Ll","mappings":{"default":{"default":"negrita script g"}},"key":"1D4F0"},{"category":"Ll","mappings":{"default":{"default":"negrita script h"}},"key":"1D4F1"},{"category":"Ll","mappings":{"default":{"default":"negrita script i"}},"key":"1D4F2"},{"category":"Ll","mappings":{"default":{"default":"negrita script j"}},"key":"1D4F3"},{"category":"Ll","mappings":{"default":{"default":"negrita script k"}},"key":"1D4F4"},{"category":"Ll","mappings":{"default":{"default":"negrita script l"}},"key":"1D4F5"},{"category":"Ll","mappings":{"default":{"default":"negrita script m"}},"key":"1D4F6"},{"category":"Ll","mappings":{"default":{"default":"negrita script n"}},"key":"1D4F7"},{"category":"Ll","mappings":{"default":{"default":"negrita script o"}},"key":"1D4F8"},{"category":"Ll","mappings":{"default":{"default":"negrita script p"}},"key":"1D4F9"},{"category":"Ll","mappings":{"default":{"default":"negrita script q"}},"key":"1D4FA"},{"category":"Ll","mappings":{"default":{"default":"negrita script r"}},"key":"1D4FB"},{"category":"Ll","mappings":{"default":{"default":"negrita script s"}},"key":"1D4FC"},{"category":"Ll","mappings":{"default":{"default":"negrita script t"}},"key":"1D4FD"},{"category":"Ll","mappings":{"default":{"default":"negrita script u"}},"key":"1D4FE"},{"category":"Ll","mappings":{"default":{"default":"negrita script v"}},"key":"1D4FF"},{"category":"Ll","mappings":{"default":{"default":"negrita script w"}},"key":"1D500"},{"category":"Ll","mappings":{"default":{"default":"negrita script x"}},"key":"1D501"},{"category":"Ll","mappings":{"default":{"default":"negrita script y"}},"key":"1D502"},{"category":"Ll","mappings":{"default":{"default":"negrita script z"}},"key":"1D503"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold.js
deleted file mode 100644
index a3a3da38..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-bold.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula A"}},"key":"1D400"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula B"}},"key":"1D401"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula C"}},"key":"1D402"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula D"}},"key":"1D403"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula E"}},"key":"1D404"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula F"}},"key":"1D405"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula G"}},"key":"1D406"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula H"}},"key":"1D407"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula I"}},"key":"1D408"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula J"}},"key":"1D409"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula K"}},"key":"1D40A"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula L"}},"key":"1D40B"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula M"}},"key":"1D40C"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula N"}},"key":"1D40D"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula O"}},"key":"1D40E"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula P"}},"key":"1D40F"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Q"}},"key":"1D410"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula R"}},"key":"1D411"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula S"}},"key":"1D412"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula T"}},"key":"1D413"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula U"}},"key":"1D414"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula V"}},"key":"1D415"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula W"}},"key":"1D416"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula X"}},"key":"1D417"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Y"}},"key":"1D418"},{"category":"Lu","mappings":{"default":{"default":"negrita mayúscula Z"}},"key":"1D419"},{"category":"Ll","mappings":{"default":{"default":"negrita a"}},"key":"1D41A"},{"category":"Ll","mappings":{"default":{"default":"negrita b"}},"key":"1D41B"},{"category":"Ll","mappings":{"default":{"default":"negrita c"}},"key":"1D41C"},{"category":"Ll","mappings":{"default":{"default":"negrita d"}},"key":"1D41D"},{"category":"Ll","mappings":{"default":{"default":"negrita e"}},"key":"1D41E"},{"category":"Ll","mappings":{"default":{"default":"negrita f"}},"key":"1D41F"},{"category":"Ll","mappings":{"default":{"default":"negrita g"}},"key":"1D420"},{"category":"Ll","mappings":{"default":{"default":"negrita h"}},"key":"1D421"},{"category":"Ll","mappings":{"default":{"default":"negrita i"}},"key":"1D422"},{"category":"Ll","mappings":{"default":{"default":"negrita j"}},"key":"1D423"},{"category":"Ll","mappings":{"default":{"default":"negrita k"}},"key":"1D424"},{"category":"Ll","mappings":{"default":{"default":"negrita l"}},"key":"1D425"},{"category":"Ll","mappings":{"default":{"default":"negrita m"}},"key":"1D426"},{"category":"Ll","mappings":{"default":{"default":"negrita n"}},"key":"1D427"},{"category":"Ll","mappings":{"default":{"default":"negrita o"}},"key":"1D428"},{"category":"Ll","mappings":{"default":{"default":"negrita p"}},"key":"1D429"},{"category":"Ll","mappings":{"default":{"default":"negrita q"}},"key":"1D42A"},{"category":"Ll","mappings":{"default":{"default":"negrita r"}},"key":"1D42B"},{"category":"Ll","mappings":{"default":{"default":"negrita s"}},"key":"1D42C"},{"category":"Ll","mappings":{"default":{"default":"negrita t"}},"key":"1D42D"},{"category":"Ll","mappings":{"default":{"default":"negrita u"}},"key":"1D42E"},{"category":"Ll","mappings":{"default":{"default":"negrita v"}},"key":"1D42F"},{"category":"Ll","mappings":{"default":{"default":"negrita w"}},"key":"1D430"},{"category":"Ll","mappings":{"default":{"default":"negrita x"}},"key":"1D431"},{"category":"Ll","mappings":{"default":{"default":"negrita y"}},"key":"1D432"},{"category":"Ll","mappings":{"default":{"default":"negrita z"}},"key":"1D433"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-double-struck.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-double-struck.js
deleted file mode 100644
index 74f9e090..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-double-struck.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula A"}},"key":"1D538"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula B"}},"key":"1D539"},{"key":"2102","mappings":{"default":{"default":"negrita de pizarra mayúscula C"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula D"}},"key":"1D53B"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula E"}},"key":"1D53C"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula F"}},"key":"1D53D"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula G"}},"key":"1D53E"},{"key":"210D","mappings":{"default":{"default":"negrita de pizarra mayúscula H"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula I"}},"key":"1D540"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula J"}},"key":"1D541"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula K"}},"key":"1D542"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula L"}},"key":"1D543"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula M"}},"key":"1D544"},{"key":"2115","mappings":{"default":{"default":"negrita de pizarra mayúscula N"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula O"}},"key":"1D546"},{"key":"2119","mappings":{"default":{"default":"negrita de pizarra mayúscula P"}},"category":"Lu"},{"key":"211A","mappings":{"default":{"default":"negrita de pizarra mayúscula Q"}},"category":"Lu"},{"key":"211D","mappings":{"default":{"default":"negrita de pizarra mayúscula R","defaultMP":"R mayúscula negrita"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula S"}},"key":"1D54A"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula T"}},"key":"1D54B"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula U"}},"key":"1D54C"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula V"}},"key":"1D54D"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula W"}},"key":"1D54E"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula X"}},"key":"1D54F"},{"category":"Lu","mappings":{"default":{"default":"negrita de pizarra mayúscula Y"}},"key":"1D550"},{"key":"2124","mappings":{"default":{"default":"negrita de pizarra mayúscula Z"}},"category":"Lu"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra a"}},"key":"1D552"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra b"}},"key":"1D553"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra c"}},"key":"1D554"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra d"}},"key":"1D555"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra e"}},"key":"1D556"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra f"}},"key":"1D557"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra g"}},"key":"1D558"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra h"}},"key":"1D559"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra i"}},"key":"1D55A"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra j"}},"key":"1D55B"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra k"}},"key":"1D55C"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra l"}},"key":"1D55D"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra m"}},"key":"1D55E"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra n"}},"key":"1D55F"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra o"}},"key":"1D560"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra p"}},"key":"1D561"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra q"}},"key":"1D562"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra r"}},"key":"1D563"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra s"}},"key":"1D564"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra t"}},"key":"1D565"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra u"}},"key":"1D566"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra v"}},"key":"1D567"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra w"}},"key":"1D568"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra x"}},"key":"1D569"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra y"}},"key":"1D56A"},{"category":"Ll","mappings":{"default":{"default":"negrita de pizarra z"}},"key":"1D56B"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-fraktur.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-fraktur.js
deleted file mode 100644
index a1d821e7..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-fraktur.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula A"}},"key":"1D504"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula B"}},"key":"1D505"},{"key":"212D","mappings":{"default":{"default":"Fraktur mayúscula C"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula D"}},"key":"1D507"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula E"}},"key":"1D508"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula F"}},"key":"1D509"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula G"}},"key":"1D50A"},{"key":"210C","mappings":{"default":{"default":"Fraktur mayúscula H"}},"category":"Lu"},{"key":"2111","mappings":{"default":{"default":"Fraktur mayúscula I"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula J"}},"key":"1D50D"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula K"}},"key":"1D50E"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula L"}},"key":"1D50F"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula M"}},"key":"1D510"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula N"}},"key":"1D511"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula O"}},"key":"1D512"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula P"}},"key":"1D513"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula Q"}},"key":"1D514"},{"key":"211C","mappings":{"default":{"default":"Fraktur mayúscula R"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula S"}},"key":"1D516"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula T"}},"key":"1D517"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula U"}},"key":"1D518"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula V"}},"key":"1D519"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula W"}},"key":"1D51A"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula X"}},"key":"1D51B"},{"category":"Lu","mappings":{"default":{"default":"Fraktur mayúscula Y"}},"key":"1D51C"},{"key":"2128","mappings":{"default":{"default":"Fraktur mayúscula Z"}},"category":"Lu"},{"category":"Ll","mappings":{"default":{"default":"Fraktur a"}},"key":"1D51E"},{"category":"Ll","mappings":{"default":{"default":"Fraktur b"}},"key":"1D51F"},{"category":"Ll","mappings":{"default":{"default":"Fraktur c"}},"key":"1D520"},{"category":"Ll","mappings":{"default":{"default":"Fraktur d"}},"key":"1D521"},{"category":"Ll","mappings":{"default":{"default":"Fraktur e"}},"key":"1D522"},{"category":"Ll","mappings":{"default":{"default":"Fraktur f"}},"key":"1D523"},{"category":"Ll","mappings":{"default":{"default":"Fraktur g"}},"key":"1D524"},{"category":"Ll","mappings":{"default":{"default":"Fraktur h"}},"key":"1D525"},{"category":"Ll","mappings":{"default":{"default":"Fraktur i"}},"key":"1D526"},{"category":"Ll","mappings":{"default":{"default":"Fraktur j"}},"key":"1D527"},{"category":"Ll","mappings":{"default":{"default":"Fraktur k"}},"key":"1D528"},{"category":"Ll","mappings":{"default":{"default":"Fraktur l"}},"key":"1D529"},{"category":"Ll","mappings":{"default":{"default":"Fraktur m"}},"key":"1D52A"},{"category":"Ll","mappings":{"default":{"default":"Fraktur n"}},"key":"1D52B"},{"category":"Ll","mappings":{"default":{"default":"Fraktur o"}},"key":"1D52C"},{"category":"Ll","mappings":{"default":{"default":"Fraktur p"}},"key":"1D52D"},{"category":"Ll","mappings":{"default":{"default":"Fraktur q"}},"key":"1D52E"},{"category":"Ll","mappings":{"default":{"default":"Fraktur r"}},"key":"1D52F"},{"category":"Ll","mappings":{"default":{"default":"Fraktur s"}},"key":"1D530"},{"category":"Ll","mappings":{"default":{"default":"Fraktur t"}},"key":"1D531"},{"category":"Ll","mappings":{"default":{"default":"Fraktur u"}},"key":"1D532"},{"category":"Ll","mappings":{"default":{"default":"Fraktur v"}},"key":"1D533"},{"category":"Ll","mappings":{"default":{"default":"Fraktur w"}},"key":"1D534"},{"category":"Ll","mappings":{"default":{"default":"Fraktur x"}},"key":"1D535"},{"category":"Ll","mappings":{"default":{"default":"Fraktur y"}},"key":"1D536"},{"category":"Ll","mappings":{"default":{"default":"Fraktur z"}},"key":"1D537"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-italic.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-italic.js
deleted file mode 100644
index a483114f..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-italic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula A"}},"key":"1D434"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula B"}},"key":"1D435"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula C"}},"key":"1D436"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula D"}},"key":"1D437"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula E"}},"key":"1D438"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula F"}},"key":"1D439"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula G"}},"key":"1D43A"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula H"}},"key":"1D43B"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula I"}},"key":"1D43C"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula J"}},"key":"1D43D"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula K"}},"key":"1D43E"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula L"}},"key":"1D43F"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula M"}},"key":"1D440"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula N"}},"key":"1D441"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula O"}},"key":"1D442"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula P"}},"key":"1D443"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Q"}},"key":"1D444"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula R"}},"key":"1D445"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula S"}},"key":"1D446"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula T"}},"key":"1D447"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula U"}},"key":"1D448"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula V"}},"key":"1D449"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula W"}},"key":"1D44A"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula X"}},"key":"1D44B"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Y"}},"key":"1D44C"},{"category":"Lu","mappings":{"default":{"default":"cursiva mayúscula Z"}},"key":"1D44D"},{"category":"Ll","mappings":{"default":{"default":"cursiva a"}},"key":"1D44E"},{"category":"Ll","mappings":{"default":{"default":"cursiva b"}},"key":"1D44F"},{"category":"Ll","mappings":{"default":{"default":"cursiva c"}},"key":"1D450"},{"category":"Ll","mappings":{"default":{"default":"cursiva d"}},"key":"1D451"},{"category":"Ll","mappings":{"default":{"default":"cursiva e"}},"key":"1D452"},{"category":"Ll","mappings":{"default":{"default":"cursiva f"}},"key":"1D453"},{"category":"Ll","mappings":{"default":{"default":"cursiva g"}},"key":"1D454"},{"key":"210E","mappings":{"default":{"default":"constante de Planck"}},"category":"Ll"},{"category":"Ll","mappings":{"default":{"default":"cursiva i"}},"key":"1D456"},{"category":"Ll","mappings":{"default":{"default":"cursiva j"}},"key":"1D457"},{"category":"Ll","mappings":{"default":{"default":"cursiva k"}},"key":"1D458"},{"category":"Ll","mappings":{"default":{"default":"cursiva l"}},"key":"1D459"},{"category":"Ll","mappings":{"default":{"default":"cursiva m"}},"key":"1D45A"},{"category":"Ll","mappings":{"default":{"default":"cursiva n"}},"key":"1D45B"},{"category":"Ll","mappings":{"default":{"default":"cursiva o"}},"key":"1D45C"},{"category":"Ll","mappings":{"default":{"default":"cursiva p"}},"key":"1D45D"},{"category":"Ll","mappings":{"default":{"default":"cursiva q"}},"key":"1D45E"},{"category":"Ll","mappings":{"default":{"default":"cursiva r"}},"key":"1D45F"},{"category":"Ll","mappings":{"default":{"default":"cursiva s"}},"key":"1D460"},{"category":"Ll","mappings":{"default":{"default":"cursiva t"}},"key":"1D461"},{"category":"Ll","mappings":{"default":{"default":"cursiva u"}},"key":"1D462"},{"category":"Ll","mappings":{"default":{"default":"cursiva v"}},"key":"1D463"},{"category":"Ll","mappings":{"default":{"default":"cursiva w"}},"key":"1D464"},{"category":"Ll","mappings":{"default":{"default":"cursiva x"}},"key":"1D465"},{"category":"Ll","mappings":{"default":{"default":"cursiva y"}},"key":"1D466"},{"category":"Ll","mappings":{"default":{"default":"cursiva z"}},"key":"1D467"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-monospace.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-monospace.js
deleted file mode 100644
index c0c63a0d..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-monospace.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula A"}},"key":"1D670"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula B"}},"key":"1D671"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula C"}},"key":"1D672"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula D"}},"key":"1D673"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula E"}},"key":"1D674"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula F"}},"key":"1D675"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula G"}},"key":"1D676"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula H"}},"key":"1D677"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula I"}},"key":"1D678"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula J"}},"key":"1D679"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula K"}},"key":"1D67A"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula L"}},"key":"1D67B"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula M"}},"key":"1D67C"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula N"}},"key":"1D67D"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula O"}},"key":"1D67E"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula P"}},"key":"1D67F"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula Q"}},"key":"1D680"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula R"}},"key":"1D681"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula S"}},"key":"1D682"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula T"}},"key":"1D683"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula U"}},"key":"1D684"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula V"}},"key":"1D685"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula W"}},"key":"1D686"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula X"}},"key":"1D687"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula Y"}},"key":"1D688"},{"category":"Lu","mappings":{"default":{"default":"monoespacio mayúscula Z"}},"key":"1D689"},{"category":"Ll","mappings":{"default":{"default":"monoespacio a"}},"key":"1D68A"},{"category":"Ll","mappings":{"default":{"default":"monoespacio b"}},"key":"1D68B"},{"category":"Ll","mappings":{"default":{"default":"monoespacio c"}},"key":"1D68C"},{"category":"Ll","mappings":{"default":{"default":"monoespacio d"}},"key":"1D68D"},{"category":"Ll","mappings":{"default":{"default":"monoespacio e"}},"key":"1D68E"},{"category":"Ll","mappings":{"default":{"default":"monoespacio f"}},"key":"1D68F"},{"category":"Ll","mappings":{"default":{"default":"monoespacio g"}},"key":"1D690"},{"category":"Ll","mappings":{"default":{"default":"monoespacio h"}},"key":"1D691"},{"category":"Ll","mappings":{"default":{"default":"monoespacio i"}},"key":"1D692"},{"category":"Ll","mappings":{"default":{"default":"monoespacio j"}},"key":"1D693"},{"category":"Ll","mappings":{"default":{"default":"monoespacio k"}},"key":"1D694"},{"category":"Ll","mappings":{"default":{"default":"monoespacio l"}},"key":"1D695"},{"category":"Ll","mappings":{"default":{"default":"monoespacio m"}},"key":"1D696"},{"category":"Ll","mappings":{"default":{"default":"monoespacio n"}},"key":"1D697"},{"category":"Ll","mappings":{"default":{"default":"monoespacio o"}},"key":"1D698"},{"category":"Ll","mappings":{"default":{"default":"monoespacio p"}},"key":"1D699"},{"category":"Ll","mappings":{"default":{"default":"monoespacio q"}},"key":"1D69A"},{"category":"Ll","mappings":{"default":{"default":"monoespacio r"}},"key":"1D69B"},{"category":"Ll","mappings":{"default":{"default":"monoespacio s"}},"key":"1D69C"},{"category":"Ll","mappings":{"default":{"default":"monoespacio t"}},"key":"1D69D"},{"category":"Ll","mappings":{"default":{"default":"monoespacio u"}},"key":"1D69E"},{"category":"Ll","mappings":{"default":{"default":"monoespacio v"}},"key":"1D69F"},{"category":"Ll","mappings":{"default":{"default":"monoespacio w"}},"key":"1D6A0"},{"category":"Ll","mappings":{"default":{"default":"monoespacio x"}},"key":"1D6A1"},{"category":"Ll","mappings":{"default":{"default":"monoespacio y"}},"key":"1D6A2"},{"category":"Ll","mappings":{"default":{"default":"monoespacio z"}},"key":"1D6A3"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif-bold.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif-bold.js
deleted file mode 100644
index 63dfc12a..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif-bold.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula A"}},"key":"1D5D4"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula B"}},"key":"1D5D5"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula C"}},"key":"1D5D6"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula D"}},"key":"1D5D7"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula E"}},"key":"1D5D8"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula F"}},"key":"1D5D9"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula G"}},"key":"1D5DA"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula H"}},"key":"1D5DB"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula I"}},"key":"1D5DC"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula J"}},"key":"1D5DD"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula K"}},"key":"1D5DE"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula L"}},"key":"1D5DF"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula M"}},"key":"1D5E0"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula N"}},"key":"1D5E1"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula O"}},"key":"1D5E2"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula P"}},"key":"1D5E3"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Q"}},"key":"1D5E4"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula R"}},"key":"1D5E5"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula S"}},"key":"1D5E6"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula T"}},"key":"1D5E7"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula U"}},"key":"1D5E8"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula V"}},"key":"1D5E9"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula W"}},"key":"1D5EA"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula X"}},"key":"1D5EB"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Y"}},"key":"1D5EC"},{"category":"Lu","mappings":{"default":{"default":"sans-serif negrita mayúscula Z"}},"key":"1D5ED"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita a"}},"key":"1D5EE"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita b"}},"key":"1D5EF"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita c"}},"key":"1D5F0"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita d"}},"key":"1D5F1"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita e"}},"key":"1D5F2"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita f"}},"key":"1D5F3"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita g"}},"key":"1D5F4"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita h"}},"key":"1D5F5"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita i"}},"key":"1D5F6"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita j"}},"key":"1D5F7"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita k"}},"key":"1D5F8"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita l"}},"key":"1D5F9"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita m"}},"key":"1D5FA"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita n"}},"key":"1D5FB"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita o"}},"key":"1D5FC"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita p"}},"key":"1D5FD"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita q"}},"key":"1D5FE"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita r"}},"key":"1D5FF"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita s"}},"key":"1D600"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita t"}},"key":"1D601"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita u"}},"key":"1D602"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita v"}},"key":"1D603"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita w"}},"key":"1D604"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita x"}},"key":"1D605"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita y"}},"key":"1D606"},{"category":"Ll","mappings":{"default":{"default":"sans-serif negrita z"}},"key":"1D607"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif-italic.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif-italic.js
deleted file mode 100644
index 3177f27c..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif-italic.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula A"}},"key":"1D608"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula B"}},"key":"1D609"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula C"}},"key":"1D60A"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula D"}},"key":"1D60B"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula E"}},"key":"1D60C"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula F"}},"key":"1D60D"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula G"}},"key":"1D60E"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula H"}},"key":"1D60F"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula I"}},"key":"1D610"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula J"}},"key":"1D611"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula K"}},"key":"1D612"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula L"}},"key":"1D613"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula M"}},"key":"1D614"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula N"}},"key":"1D615"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula O"}},"key":"1D616"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula P"}},"key":"1D617"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula Q"}},"key":"1D618"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula R"}},"key":"1D619"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula S"}},"key":"1D61A"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula T"}},"key":"1D61B"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula U"}},"key":"1D61C"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula V"}},"key":"1D61D"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula W"}},"key":"1D61E"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula X"}},"key":"1D61F"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula Y"}},"key":"1D620"},{"category":"Lu","mappings":{"default":{"default":"sans-serif cursiva mayúscula Z"}},"key":"1D621"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva a"}},"key":"1D622"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva b"}},"key":"1D623"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva c"}},"key":"1D624"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva d"}},"key":"1D625"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva e"}},"key":"1D626"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva f"}},"key":"1D627"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva g"}},"key":"1D628"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva h"}},"key":"1D629"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva i"}},"key":"1D62A"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva j"}},"key":"1D62B"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva k"}},"key":"1D62C"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva l"}},"key":"1D62D"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva m"}},"key":"1D62E"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva n"}},"key":"1D62F"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva o"}},"key":"1D630"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva p"}},"key":"1D631"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva q"}},"key":"1D632"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva r"}},"key":"1D633"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva s"}},"key":"1D634"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva t"}},"key":"1D635"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva u"}},"key":"1D636"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva v"}},"key":"1D637"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva w"}},"key":"1D638"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva x"}},"key":"1D639"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva y"}},"key":"1D63A"},{"category":"Ll","mappings":{"default":{"default":"sans-serif cursiva z"}},"key":"1D63B"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif.js
deleted file mode 100644
index cf133edd..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-sans-serif.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula A"}},"key":"1D5A0"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula B"}},"key":"1D5A1"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula C"}},"key":"1D5A2"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula D"}},"key":"1D5A3"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula E"}},"key":"1D5A4"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula F"}},"key":"1D5A5"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula G"}},"key":"1D5A6"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula H"}},"key":"1D5A7"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula I"}},"key":"1D5A8"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula J"}},"key":"1D5A9"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula K"}},"key":"1D5AA"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula L"}},"key":"1D5AB"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula M"}},"key":"1D5AC"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula N"}},"key":"1D5AD"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula O"}},"key":"1D5AE"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula P"}},"key":"1D5AF"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula Q"}},"key":"1D5B0"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula R"}},"key":"1D5B1"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula S"}},"key":"1D5B2"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula T"}},"key":"1D5B3"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula U"}},"key":"1D5B4"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula V"}},"key":"1D5B5"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula W"}},"key":"1D5B6"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula X"}},"key":"1D5B7"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula Y"}},"key":"1D5B8"},{"category":"Lu","mappings":{"default":{"default":"sans-serif mayúscula Z"}},"key":"1D5B9"},{"category":"Ll","mappings":{"default":{"default":"sans-serif a"}},"key":"1D5BA"},{"category":"Ll","mappings":{"default":{"default":"sans-serif b"}},"key":"1D5BB"},{"category":"Ll","mappings":{"default":{"default":"sans-serif c"}},"key":"1D5BC"},{"category":"Ll","mappings":{"default":{"default":"sans-serif d"}},"key":"1D5BD"},{"category":"Ll","mappings":{"default":{"default":"sans-serif e"}},"key":"1D5BE"},{"category":"Ll","mappings":{"default":{"default":"sans-serif f"}},"key":"1D5BF"},{"category":"Ll","mappings":{"default":{"default":"sans-serif g"}},"key":"1D5C0"},{"category":"Ll","mappings":{"default":{"default":"sans-serif h"}},"key":"1D5C1"},{"category":"Ll","mappings":{"default":{"default":"sans-serif i"}},"key":"1D5C2"},{"category":"Ll","mappings":{"default":{"default":"sans-serif j"}},"key":"1D5C3"},{"category":"Ll","mappings":{"default":{"default":"sans-serif k"}},"key":"1D5C4"},{"category":"Ll","mappings":{"default":{"default":"sans-serif l"}},"key":"1D5C5"},{"category":"Ll","mappings":{"default":{"default":"sans-serif m"}},"key":"1D5C6"},{"category":"Ll","mappings":{"default":{"default":"sans-serif n"}},"key":"1D5C7"},{"category":"Ll","mappings":{"default":{"default":"sans-serif o"}},"key":"1D5C8"},{"category":"Ll","mappings":{"default":{"default":"sans-serif p"}},"key":"1D5C9"},{"category":"Ll","mappings":{"default":{"default":"sans-serif q"}},"key":"1D5CA"},{"category":"Ll","mappings":{"default":{"default":"sans-serif r"}},"key":"1D5CB"},{"category":"Ll","mappings":{"default":{"default":"sans-serif s"}},"key":"1D5CC"},{"category":"Ll","mappings":{"default":{"default":"sans-serif t"}},"key":"1D5CD"},{"category":"Ll","mappings":{"default":{"default":"sans-serif u"}},"key":"1D5CE"},{"category":"Ll","mappings":{"default":{"default":"sans-serif v"}},"key":"1D5CF"},{"category":"Ll","mappings":{"default":{"default":"sans-serif w"}},"key":"1D5D0"},{"category":"Ll","mappings":{"default":{"default":"sans-serif x"}},"key":"1D5D1"},{"category":"Ll","mappings":{"default":{"default":"sans-serif y"}},"key":"1D5D2"},{"category":"Ll","mappings":{"default":{"default":"sans-serif z"}},"key":"1D5D3"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-script.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-script.js
deleted file mode 100644
index 8a40a97d..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-mathfonts-script.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula A"}},"key":"1D49C"},{"key":"212C","mappings":{"default":{"default":"script mayúscula B"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula C"}},"key":"1D49E"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula D"}},"key":"1D49F"},{"key":"2130","mappings":{"default":{"default":"script mayúscula E"}},"category":"Lu"},{"key":"2131","mappings":{"default":{"default":"script mayúscula F"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula G"}},"key":"1D4A2"},{"key":"210B","mappings":{"default":{"default":"script mayúscula H"}},"category":"Lu"},{"key":"2110","mappings":{"default":{"default":"script mayúscula I"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula J"}},"key":"1D4A5"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula K"}},"key":"1D4A6"},{"key":"2112","mappings":{"default":{"default":"script mayúscula L"}},"category":"Lu"},{"key":"2133","mappings":{"default":{"default":"script mayúscula M"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula N"}},"key":"1D4A9"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula O"}},"key":"1D4AA"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula P"}},"key":"1D4AB"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula Q"}},"key":"1D4AC"},{"key":"211B","mappings":{"default":{"default":"script mayúscula R"}},"category":"Lu"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula S"}},"key":"1D4AE"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula T"}},"key":"1D4AF"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula U"}},"key":"1D4B0"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula V"}},"key":"1D4B1"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula W"}},"key":"1D4B2"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula X"}},"key":"1D4B3"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula Y"}},"key":"1D4B4"},{"category":"Lu","mappings":{"default":{"default":"script mayúscula Z"}},"key":"1D4B5"},{"category":"Ll","mappings":{"default":{"default":"script a"}},"key":"1D4B6"},{"category":"Ll","mappings":{"default":{"default":"script b"}},"key":"1D4B7"},{"category":"Ll","mappings":{"default":{"default":"script c"}},"key":"1D4B8"},{"category":"Ll","mappings":{"default":{"default":"script d"}},"key":"1D4B9"},{"key":"212F","mappings":{"default":{"default":"script e"}},"category":"Ll"},{"category":"Ll","mappings":{"default":{"default":"script f"}},"key":"1D4BB"},{"key":"210A","mappings":{"default":{"default":"script g"}},"category":"Ll"},{"category":"Ll","mappings":{"default":{"default":"script h"}},"key":"1D4BD"},{"category":"Ll","mappings":{"default":{"default":"script i"}},"key":"1D4BE"},{"category":"Ll","mappings":{"default":{"default":"script j"}},"key":"1D4BF"},{"category":"Ll","mappings":{"default":{"default":"script k"}},"key":"1D4C0"},{"category":"Ll","mappings":{"default":{"default":"script l"}},"key":"1D4C1"},{"category":"Ll","mappings":{"default":{"default":"script m"}},"key":"1D4C2"},{"category":"Ll","mappings":{"default":{"default":"script n"}},"key":"1D4C3"},{"key":"2134","mappings":{"default":{"default":"script o"}},"category":"Ll"},{"category":"Ll","mappings":{"default":{"default":"script p"}},"key":"1D4C5"},{"category":"Ll","mappings":{"default":{"default":"script q"}},"key":"1D4C6"},{"category":"Ll","mappings":{"default":{"default":"script r"}},"key":"1D4C7"},{"category":"Ll","mappings":{"default":{"default":"script s"}},"key":"1D4C8"},{"category":"Ll","mappings":{"default":{"default":"script t"}},"key":"1D4C9"},{"category":"Ll","mappings":{"default":{"default":"script u"}},"key":"1D4CA"},{"category":"Ll","mappings":{"default":{"default":"script v"}},"key":"1D4CB"},{"category":"Ll","mappings":{"default":{"default":"script w"}},"key":"1D4CC"},{"category":"Ll","mappings":{"default":{"default":"script x"}},"key":"1D4CD"},{"category":"Ll","mappings":{"default":{"default":"script y"}},"key":"1D4CE"},{"category":"Ll","mappings":{"default":{"default":"script z"}},"key":"1D4CF"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-rest.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-rest.js
deleted file mode 100644
index e740a801..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-rest.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"24C8","mappings":{"default":{"default":"S en círculo"}},"category":"So"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-double-accent.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-double-accent.js
deleted file mode 100644
index 1092644d..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-double-accent.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"1E08","mappings":{"default":{"default":"mayúscula C con cedilla y agudo"}},"category":"Lu"},{"key":"1E14","mappings":{"default":{"default":"mayúscula E con macrón y grave"}},"category":"Lu"},{"key":"1E16","mappings":{"default":{"default":"mayúscula E con macrón y agudo"}},"category":"Lu"},{"key":"1E1C","mappings":{"default":{"default":"mayúscula E with cedilla and breve"}},"category":"Lu"},{"key":"1E2E","mappings":{"default":{"default":"mayúscula I con diéresis y agudo"}},"category":"Lu"},{"key":"1E38","mappings":{"default":{"default":"mayúscula L con punto debajo y macrón"}},"category":"Lu"},{"key":"1E4C","mappings":{"default":{"default":"mayúscula O con tilde y acute"}},"category":"Lu"},{"key":"1E4E","mappings":{"default":{"default":"mayúscula O con tilde y diéresis"}},"category":"Lu"},{"key":"1E50","mappings":{"default":{"default":"mayúscula O con macrón y grave"}},"category":"Lu"},{"key":"1E52","mappings":{"default":{"default":"mayúscula O con macrón y agudo"}},"category":"Lu"},{"key":"1E5C","mappings":{"default":{"default":"mayúscula R con punto debajo y macrón"}},"category":"Lu"},{"key":"1E64","mappings":{"default":{"default":"mayúscula S con agudo y punto arriba"}},"category":"Lu"},{"key":"1E66","mappings":{"default":{"default":"mayúscula S con carón y punto arriba"}},"category":"Lu"},{"key":"1E68","mappings":{"default":{"default":"mayúscula S con punto debajo y punto arriba"}},"category":"Lu"},{"key":"1E78","mappings":{"default":{"default":"mayúscula U con tilde y agudo"}},"category":"Lu"},{"key":"1E7A","mappings":{"default":{"default":"mayúscula U con macrón y diéresis"}},"category":"Lu"},{"key":"1EA4","mappings":{"default":{"default":"mayúscula A con acento circunflejo y agudo"}},"category":"Lu"},{"key":"1EA6","mappings":{"default":{"default":"mayúscula A con acento circunflejo y grave"}},"category":"Lu"},{"key":"1EA8","mappings":{"default":{"default":"mayúscula A con acento circunflejo y gancho arriba"}},"category":"Lu"},{"key":"1EAA","mappings":{"default":{"default":"mayúscula A con acento circunflejo y tilde"}},"category":"Lu"},{"key":"1EAC","mappings":{"default":{"default":"mayúscula A con acento circunflejo y punto debajo"}},"category":"Lu"},{"key":"1EAE","mappings":{"default":{"default":"mayúscula A con breve y agudo"}},"category":"Lu"},{"key":"1EB0","mappings":{"default":{"default":"mayúscula A con breve y grave"}},"category":"Lu"},{"key":"1EB2","mappings":{"default":{"default":"mayúscula A con breve y gancho arriba"}},"category":"Lu"},{"key":"1EB4","mappings":{"default":{"default":"mayúscula A con breve y tilde"}},"category":"Lu"},{"key":"1EB6","mappings":{"default":{"default":"mayúscula A con breve y punto debajo"}},"category":"Lu"},{"key":"1EBE","mappings":{"default":{"default":"mayúscula E con acento circunflejo y agudo"}},"category":"Lu"},{"key":"1EC0","mappings":{"default":{"default":"mayúscula E con acento circunflejo y grave"}},"category":"Lu"},{"key":"1EC2","mappings":{"default":{"default":"mayúscula E con acento circunflejo y gancho arriba"}},"category":"Lu"},{"key":"1EC4","mappings":{"default":{"default":"mayúscula E con acento circunflejo y tilde"}},"category":"Lu"},{"key":"1EC6","mappings":{"default":{"default":"mayúscula E con acento circunflejo y punto debajo"}},"category":"Lu"},{"key":"1ED0","mappings":{"default":{"default":"mayúscula O con acento circunflejo y agudo"}},"category":"Lu"},{"key":"1ED2","mappings":{"default":{"default":"mayúscula O con acento circunflejo y grave"}},"category":"Lu"},{"key":"1ED4","mappings":{"default":{"default":"mayúscula O con acento circunflejo y gancho arriba"}},"category":"Lu"},{"key":"1ED6","mappings":{"default":{"default":"mayúscula O con acento circunflejo y tilde"}},"category":"Lu"},{"key":"1ED8","mappings":{"default":{"default":"mayúscula O con acento circunflejo y punto debajo"}},"category":"Lu"},{"key":"1EDA","mappings":{"default":{"default":"mayúscula O with horn and acute"}},"category":"Lu"},{"key":"1EDC","mappings":{"default":{"default":"mayúscula O with horn and grave"}},"category":"Lu"},{"key":"1EDE","mappings":{"default":{"default":"mayúscula O with horn and hook above"}},"category":"Lu"},{"key":"1EE0","mappings":{"default":{"default":"mayúscula O with horn and tilde"}},"category":"Lu"},{"key":"1EE2","mappings":{"default":{"default":"mayúscula O con cuerno y punto debajo"}},"category":"Lu"},{"key":"1EE8","mappings":{"default":{"default":"mayúscula U con cuerno y agudo"}},"category":"Lu"},{"key":"1EEA","mappings":{"default":{"default":"mayúscula U con cuerno y grave"}},"category":"Lu"},{"key":"1EEC","mappings":{"default":{"default":"mayúscula U con cuerno y gancho arriba"}},"category":"Lu"},{"key":"1EEE","mappings":{"default":{"default":"mayúscula U con cuerno y tilde"}},"category":"Lu"},{"key":"1EF0","mappings":{"default":{"default":"mayúscula U con cuerno y punto debajo"}},"category":"Lu"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-normal.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-normal.js
deleted file mode 100644
index 0a07dce6..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-normal.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"0041","mappings":{"default":{"default":"mayúscula A"}},"category":"Lu"},{"key":"0042","mappings":{"default":{"default":"mayúscula B"}},"category":"Lu"},{"key":"0043","mappings":{"default":{"default":"mayúscula C"}},"category":"Lu"},{"key":"0044","mappings":{"default":{"default":"mayúscula D"}},"category":"Lu"},{"key":"0045","mappings":{"default":{"default":"mayúscula E"}},"category":"Lu"},{"key":"0046","mappings":{"default":{"default":"mayúscula F"}},"category":"Lu"},{"key":"0047","mappings":{"default":{"default":"mayúscula G"}},"category":"Lu"},{"key":"0048","mappings":{"default":{"default":"mayúscula H"}},"category":"Lu"},{"key":"0049","mappings":{"default":{"default":"mayúscula I"}},"category":"Lu"},{"key":"004A","mappings":{"default":{"default":"mayúscula J"}},"category":"Lu"},{"key":"004B","mappings":{"default":{"default":"mayúscula K"}},"category":"Lu"},{"key":"004C","mappings":{"default":{"default":"mayúscula L"}},"category":"Lu"},{"key":"004D","mappings":{"default":{"default":"mayúscula M"}},"category":"Lu"},{"key":"004E","mappings":{"default":{"default":"mayúscula N"}},"category":"Lu"},{"key":"004F","mappings":{"default":{"default":"mayúscula O"}},"category":"Lu"},{"key":"0050","mappings":{"default":{"default":"mayúscula P"}},"category":"Lu"},{"key":"0051","mappings":{"default":{"default":"mayúscula Q"}},"category":"Lu"},{"key":"0052","mappings":{"default":{"default":"mayúscula R"}},"category":"Lu"},{"key":"0053","mappings":{"default":{"default":"mayúscula S"}},"category":"Lu"},{"key":"0054","mappings":{"default":{"default":"mayúscula T"}},"category":"Lu"},{"key":"0055","mappings":{"default":{"default":"mayúscula U"}},"category":"Lu"},{"key":"0056","mappings":{"default":{"default":"mayúscula V"}},"category":"Lu"},{"key":"0057","mappings":{"default":{"default":"mayúscula W"}},"category":"Lu"},{"key":"0058","mappings":{"default":{"default":"mayúscula X"}},"category":"Lu"},{"key":"0059","mappings":{"default":{"default":"mayúscula Y","defaultMP":"Ye"}},"category":"Lu"},{"key":"005A","mappings":{"default":{"default":"mayúscula Z"}},"category":"Lu"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-single-accent.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-single-accent.js
deleted file mode 100644
index 29780922..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/latin-upper-single-accent.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"00C0","mappings":{"default":{"default":"mayúscula A grave"}},"category":"Lu"},{"key":"00C1","mappings":{"default":{"default":"mayúscula A aguda"}},"category":"Lu"},{"key":"00C2","mappings":{"default":{"default":"mayúscula A acento circunflejo"}},"category":"Lu"},{"key":"00C3","mappings":{"default":{"default":"mayúscula A con tilde"}},"category":"Lu"},{"key":"00C4","mappings":{"default":{"default":"mayúscula A diéresis"}},"category":"Lu"},{"key":"00C5","mappings":{"default":{"default":"mayúscula A con anillo"}},"category":"Lu"},{"key":"00C7","mappings":{"default":{"default":"mayúscula C cedilla"}},"category":"Lu"},{"key":"00C8","mappings":{"default":{"default":"mayúscula E grave"}},"category":"Lu"},{"key":"00C9","mappings":{"default":{"default":"mayúscula E aguda"}},"category":"Lu"},{"key":"00CA","mappings":{"default":{"default":"mayúscula E acento circunflejo"}},"category":"Lu"},{"key":"00CB","mappings":{"default":{"default":"mayúscula E diéresis"}},"category":"Lu"},{"key":"00CC","mappings":{"default":{"default":"mayúscula I grave"}},"category":"Lu"},{"key":"00CD","mappings":{"default":{"default":"mayúscula I aguda"}},"category":"Lu"},{"key":"00CE","mappings":{"default":{"default":"mayúscula I acento circumflejo"}},"category":"Lu"},{"key":"00CF","mappings":{"default":{"default":"mayúscula I diéresis"}},"category":"Lu"},{"key":"00D1","mappings":{"default":{"default":"mayúscula Ñ"}},"category":"Lu"},{"key":"00D2","mappings":{"default":{"default":"mayúscula O grave"}},"category":"Lu"},{"key":"00D3","mappings":{"default":{"default":"mayúscula O aguda"}},"category":"Lu"},{"key":"00D4","mappings":{"default":{"default":"mayúscula O acento circunflejo"}},"category":"Lu"},{"key":"00D5","mappings":{"default":{"default":"mayúscula O con tilde"}},"category":"Lu"},{"key":"00D6","mappings":{"default":{"default":"mayúscula O diéresis"}},"category":"Lu"},{"key":"00D9","mappings":{"default":{"default":"mayúscula U grave"}},"category":"Lu"},{"key":"00DA","mappings":{"default":{"default":"mayúscula U aguda"}},"category":"Lu"},{"key":"00DB","mappings":{"default":{"default":"mayúscula U acento circunflejo"}},"category":"Lu"},{"key":"00DC","mappings":{"default":{"default":"mayúscula U diéresis"}},"category":"Lu"},{"key":"00DD","mappings":{"default":{"default":"mayúscula Y aguda"}},"category":"Lu"},{"key":"0100","mappings":{"default":{"default":"mayúscula A barra"}},"category":"Lu"},{"key":"0102","mappings":{"default":{"default":"mayúscula A con breve"}},"category":"Lu"},{"key":"0104","mappings":{"default":{"default":"mayúscula A con ogonek"}},"category":"Lu"},{"key":"0106","mappings":{"default":{"default":"mayúscula C con agudo"}},"category":"Lu"},{"key":"0108","mappings":{"default":{"default":"mayúscula C con acento circunflejo"}},"category":"Lu"},{"key":"010A","mappings":{"default":{"default":"mayúscula C con punto arriba"}},"category":"Lu"},{"key":"010C","mappings":{"default":{"default":"mayúscula C con carón"}},"category":"Lu"},{"key":"010E","mappings":{"default":{"default":"mayúscula D con carón"}},"category":"Lu"},{"key":"0112","mappings":{"default":{"default":"mayúscula E barra"}},"category":"Lu"},{"key":"0116","mappings":{"default":{"default":"mayúscula E con punto arriba"}},"category":"Lu"},{"key":"0118","mappings":{"default":{"default":"mayúscula E con ogonek"}},"category":"Lu"},{"key":"011A","mappings":{"default":{"default":"mayúscula E con carón"}},"category":"Lu"},{"key":"011C","mappings":{"default":{"default":"mayúscula G con acento circunflejo"}},"category":"Lu"},{"key":"011E","mappings":{"default":{"default":"mayúscula G con breve"}},"category":"Lu"},{"key":"0120","mappings":{"default":{"default":"mayúscula G con punto arriba"}},"category":"Lu"},{"key":"0122","mappings":{"default":{"default":"mayúscula G con cedilla"}},"category":"Lu"},{"key":"0124","mappings":{"default":{"default":"mayúscula H con acento circunflejo"}},"category":"Lu"},{"key":"0128","mappings":{"default":{"default":"mayúscula I con tilde"}},"category":"Lu"},{"key":"012A","mappings":{"default":{"default":"mayúscula I barra"}},"category":"Lu"},{"key":"012E","mappings":{"default":{"default":"mayúscula I con ogonek"}},"category":"Lu"},{"key":"0130","mappings":{"default":{"default":"mayúscula I con punto arriba"}},"category":"Lu"},{"key":"0134","mappings":{"default":{"default":"mayúscula J con acento circunflejo"}},"category":"Lu"},{"key":"0136","mappings":{"default":{"default":"mayúscula K con cedilla"}},"category":"Lu"},{"key":"0139","mappings":{"default":{"default":"mayúscula L con agudo"}},"category":"Lu"},{"key":"013B","mappings":{"default":{"default":"mayúscula L con cedilla"}},"category":"Lu"},{"key":"013D","mappings":{"default":{"default":"mayúscula L con carón"}},"category":"Lu"},{"key":"013F","mappings":{"default":{"default":"mayúscula L con punto mediano"}},"category":"Lu"},{"key":"0143","mappings":{"default":{"default":"mayúscula N con agudo"}},"category":"Lu"},{"key":"0145","mappings":{"default":{"default":"mayúscula N con cedilla"}},"category":"Lu"},{"key":"0147","mappings":{"default":{"default":"mayúscula n con carón"}},"category":"Lu"},{"key":"014C","mappings":{"default":{"default":"mayúscula O barra"}},"category":"Lu"},{"key":"0150","mappings":{"default":{"default":"mayúscula O con doble acento agudo "}},"category":"Lu"},{"key":"0154","mappings":{"default":{"default":"mayúscula R con agudo"}},"category":"Lu"},{"key":"0156","mappings":{"default":{"default":"mayúscula R con cedilla"}},"category":"Lu"},{"key":"0158","mappings":{"default":{"default":"mayúscula R con carón"}},"category":"Lu"},{"key":"015A","mappings":{"default":{"default":"mayúscula S con agudo"}},"category":"Lu"},{"key":"015C","mappings":{"default":{"default":"mayúscula S con acento circunflejo"}},"category":"Lu"},{"key":"015E","mappings":{"default":{"default":"mayúscula S con cedilla"}},"category":"Lu"},{"key":"0160","mappings":{"default":{"default":"mayúscula S con carón"}},"category":"Lu"},{"key":"0162","mappings":{"default":{"default":"mayúscula T con cedilla"}},"category":"Lu"},{"key":"0164","mappings":{"default":{"default":"mayúscula T con carón"}},"category":"Lu"},{"key":"0168","mappings":{"default":{"default":"mayúscula U con tilde"}},"category":"Lu"},{"key":"016A","mappings":{"default":{"default":"mayúscula U barra"}},"category":"Lu"},{"key":"016C","mappings":{"default":{"default":"mayúscula U con breve"}},"category":"Lu"},{"key":"016E","mappings":{"default":{"default":"mayúscula U con anillo arriba"}},"category":"Lu"},{"key":"0170","mappings":{"default":{"default":"mayúscula U con doble acento agudo"}},"category":"Lu"},{"key":"0172","mappings":{"default":{"default":"mayúscula U con ogonek"}},"category":"Lu"},{"key":"0174","mappings":{"default":{"default":"mayúscula W con acento circunflejo"}},"category":"Lu"},{"key":"0176","mappings":{"default":{"default":"mayúscula Y con circunflejo"}},"category":"Lu"},{"key":"0178","mappings":{"default":{"default":"mayúscula Y diéresis"}},"category":"Lu"},{"key":"0179","mappings":{"default":{"default":"mayúscula Z con agudo"}},"category":"Lu"},{"key":"017B","mappings":{"default":{"default":"mayúscula Z con punto"}},"category":"Lu"},{"key":"017D","mappings":{"default":{"default":"mayúscula Z con carón"}},"category":"Lu"},{"key":"1E00","mappings":{"default":{"default":"mayúscula A con anillo debajo"}},"category":"Lu"},{"key":"1E02","mappings":{"default":{"default":"mayúscula B con punto arriba"}},"category":"Lu"},{"key":"1E04","mappings":{"default":{"default":"mayúscula B con punto debajo"}},"category":"Lu"},{"key":"1E06","mappings":{"default":{"default":"mayúscula B con línea debajo"}},"category":"Lu"},{"key":"1E0A","mappings":{"default":{"default":"mayúscula D con punto arriba"}},"category":"Lu"},{"key":"1E0C","mappings":{"default":{"default":"mayúscula D con punto debajo"}},"category":"Lu"},{"key":"1E0E","mappings":{"default":{"default":"mayúscula D con línea debajo"}},"category":"Lu"},{"key":"1E10","mappings":{"default":{"default":"mayúscula D con cedilla"}},"category":"Lu"},{"key":"1E12","mappings":{"default":{"default":"mayúscula D con acento circunflejo debajo"}},"category":"Lu"},{"key":"1E18","mappings":{"default":{"default":"mayúscula E con acento circunflejo debajo"}},"category":"Lu"},{"key":"1E1A","mappings":{"default":{"default":"mayúscula E con tilde debajo"}},"category":"Lu"},{"key":"1E1E","mappings":{"default":{"default":"mayúscula F con punto arriba"}},"category":"Lu"},{"key":"1E20","mappings":{"default":{"default":"mayúscula G con macrón"}},"category":"Lu"},{"key":"1E22","mappings":{"default":{"default":"mayúscula H con punto arriba"}},"category":"Lu"},{"key":"1E24","mappings":{"default":{"default":"mayúscula H con punto debajo"}},"category":"Lu"},{"key":"1E26","mappings":{"default":{"default":"mayúscula H con diéresis"}},"category":"Lu"},{"key":"1E28","mappings":{"default":{"default":"mayúscula H con cedilla"}},"category":"Lu"},{"key":"1E2A","mappings":{"default":{"default":"mayúscula H con breve debajo"}},"category":"Lu"},{"key":"1E2C","mappings":{"default":{"default":"mayúscula I con tilde debajo"}},"category":"Lu"},{"key":"1E30","mappings":{"default":{"default":"mayúscula K con agudo"}},"category":"Lu"},{"key":"1E32","mappings":{"default":{"default":"mayúscula K con punto debajo"}},"category":"Lu"},{"key":"1E34","mappings":{"default":{"default":"mayúscula K con línea debajo"}},"category":"Lu"},{"key":"1E36","mappings":{"default":{"default":"mayúscula L con punto debajo"}},"category":"Lu"},{"key":"1E3A","mappings":{"default":{"default":"mayúscula L con línea debajo"}},"category":"Lu"},{"key":"1E3C","mappings":{"default":{"default":"mayúscula L con acento circunflejo debajo"}},"category":"Lu"},{"key":"1E3E","mappings":{"default":{"default":"mayúscula M con agudo"}},"category":"Lu"},{"key":"1E40","mappings":{"default":{"default":"mayúscula M con punto arriba"}},"category":"Lu"},{"key":"1E42","mappings":{"default":{"default":"mayúscula M con punto debajo"}},"category":"Lu"},{"key":"1E44","mappings":{"default":{"default":"mayúscula N con punto arriba"}},"category":"Lu"},{"key":"1E46","mappings":{"default":{"default":"mayúscula N con punto debajo"}},"category":"Lu"},{"key":"1E48","mappings":{"default":{"default":"mayúscula N con línea debajo"}},"category":"Lu"},{"key":"1E4A","mappings":{"default":{"default":"mayúscula N con acento circunflejo debajo"}},"category":"Lu"},{"key":"1E54","mappings":{"default":{"default":"mayúscula P con agudo"}},"category":"Lu"},{"key":"1E56","mappings":{"default":{"default":"mayúscula P con punto arriba"}},"category":"Lu"},{"key":"1E58","mappings":{"default":{"default":"mayúscula R con punto arriba"}},"category":"Lu"},{"key":"1E5A","mappings":{"default":{"default":"mayúscula R con punto debajo"}},"category":"Lu"},{"key":"1E5E","mappings":{"default":{"default":"mayúscula R con línea debajo"}},"category":"Lu"},{"key":"1E60","mappings":{"default":{"default":"mayúscula S con punto arriba"}},"category":"Lu"},{"key":"1E62","mappings":{"default":{"default":"mayúscula S con punto debajo"}},"category":"Lu"},{"key":"1E6A","mappings":{"default":{"default":"mayúscula T con punto arriba"}},"category":"Lu"},{"key":"1E6C","mappings":{"default":{"default":"mayúscula T con punto debajo"}},"category":"Lu"},{"key":"1E6E","mappings":{"default":{"default":"mayúscula T con línea debajo"}},"category":"Lu"},{"key":"1E70","mappings":{"default":{"default":"mayúscula T con acento circunflejo debajo"}},"category":"Lu"},{"key":"1E72","mappings":{"default":{"default":"mayúscula U con diéresis debajo"}},"category":"Lu"},{"key":"1E74","mappings":{"default":{"default":"mayúscula U con tilde debajo"}},"category":"Lu"},{"key":"1E76","mappings":{"default":{"default":"mayúscula U con acento circunflejo debajo"}},"category":"Lu"},{"key":"1E7C","mappings":{"default":{"default":"mayúscula V con tilde"}},"category":"Lu"},{"key":"1E7E","mappings":{"default":{"default":"mayúscula V con punto debajo"}},"category":"Lu"},{"key":"1E80","mappings":{"default":{"default":"mayúscula W con grave"}},"category":"Lu"},{"key":"1E82","mappings":{"default":{"default":"mayúscula W con agudo"}},"category":"Lu"},{"key":"1E84","mappings":{"default":{"default":"mayúscula W con diéresis"}},"category":"Lu"},{"key":"1E86","mappings":{"default":{"default":"mayúscula W con punto arriba"}},"category":"Lu"},{"key":"1E88","mappings":{"default":{"default":"mayúscula W con punto debajo"}},"category":"Lu"},{"key":"1E8A","mappings":{"default":{"default":"mayúscula X con punto arriba"}},"category":"Lu"},{"key":"1E8C","mappings":{"default":{"default":"mayúscula X con diéresis"}},"category":"Lu"},{"key":"1E8E","mappings":{"default":{"default":"mayúscula Y con punto arriba"}},"category":"Lu"},{"key":"1E90","mappings":{"default":{"default":"mayúscula Z con acento circunflejo"}},"category":"Lu"},{"key":"1E92","mappings":{"default":{"default":"mayúscula Z con punto debajo"}},"category":"Lu"},{"key":"1E94","mappings":{"default":{"default":"mayúscula Z with line below"}},"category":"Lu"},{"key":"1EA0","mappings":{"default":{"default":"mayúscula A con punto debajo"}},"category":"Lu"},{"key":"1EA2","mappings":{"default":{"default":"mayúscula A con gancho arriba"}},"category":"Lu"},{"key":"1EB8","mappings":{"default":{"default":"mayúscula E con punto debajo"}},"category":"Lu"},{"key":"1EBA","mappings":{"default":{"default":"mayúscula E con gancho arriba"}},"category":"Lu"},{"key":"1EBC","mappings":{"default":{"default":"mayúscula E con tilde"}},"category":"Lu"},{"key":"1EC8","mappings":{"default":{"default":"mayúscula I con gancho arriba"}},"category":"Lu"},{"key":"1ECA","mappings":{"default":{"default":"mayúscula I con punto debajo"}},"category":"Lu"},{"key":"1ECC","mappings":{"default":{"default":"mayúscula O con punto debajo"}},"category":"Lu"},{"key":"1ECE","mappings":{"default":{"default":"mayúscula O con gancho arriba"}},"category":"Lu"},{"key":"1EE4","mappings":{"default":{"default":"mayúscula U con punto debajo"}},"category":"Lu"},{"key":"1EE6","mappings":{"default":{"default":"mayúscula U con gancho arriba"}},"category":"Lu"},{"key":"1EF2","mappings":{"default":{"default":"mayúscula Y con grave"}},"category":"Lu"},{"key":"1EF4","mappings":{"default":{"default":"mayúscula Y con punto debajo"}},"category":"Lu"},{"key":"1EF6","mappings":{"default":{"default":"mayúscula Y con gancho arriba"}},"category":"Lu"},{"key":"1EF8","mappings":{"default":{"default":"mayúscula Y con tilde"}},"category":"Lu"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_angles.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_angles.js
deleted file mode 100644
index 98575932..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_angles.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"22BE","mappings":{"default":{"default":"ángulo recto con arco"}},"category":"Sm"},{"key":"237C","mappings":{"default":{"default":"ángulo recto con flecha zigzag hacia abajo"}},"category":"Sm"},{"key":"27C0","mappings":{"default":{"default":"ángulo sólido"}},"category":"Sm"},{"key":"299D","mappings":{"default":{"default":"ángulo recto medido con punto"}},"category":"Sm"},{"key":"29A4","mappings":{"default":{"default":"ángulo con barra inferior"}},"category":"Sm"},{"key":"29A5","mappings":{"default":{"default":"ángulo inverso con barra inferior"}},"category":"Sm"},{"key":"29A6","mappings":{"default":{"default":"ángulo oblicuo hacia arriba"}},"category":"Sm"},{"key":"29A7","mappings":{"default":{"default":"ángulo oblicuo hacia abajo"}},"category":"Sm"},{"key":"29A8","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing up and to the right"}},"category":"Sm"},{"key":"29A9","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing up and to the left"}},"category":"Sm"},{"key":"29AA","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing down and to the right"}},"category":"Sm"},{"key":"29AB","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing down and to the left"}},"category":"Sm"},{"key":"29AC","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing right and up"}},"category":"Sm"},{"key":"29AD","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing left and up"}},"category":"Sm"},{"key":"29AE","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing right and down"}},"category":"Sm"},{"key":"29AF","mappings":{"default":{"default":"measured angle with open arm ending in arrow pointing left and down"}},"category":"Sm"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_arrows.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_arrows.js
deleted file mode 100644
index 81a75c27..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_arrows.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"2190","mappings":{"default":{"default":"flecha izquierda"}},"category":"Sm"},{"key":"2191","mappings":{"default":{"default":"flecha arriba"}},"category":"Sm"},{"key":"2192","mappings":{"default":{"default":"flecha derecha","defaultMP":"flecha"}},"category":"Sm"},{"key":"2193","mappings":{"default":{"default":"flecha abajo"}},"category":"Sm"},{"key":"2194","mappings":{"default":{"default":"flecha izquierda y derecha"}},"category":"Sm"},{"key":"2195","mappings":{"default":{"default":"flecha arriba y abajo"}},"category":"So"},{"key":"2196","mappings":{"default":{"default":"flecha a noroeste"}},"category":"So"},{"key":"2197","mappings":{"default":{"default":"flecha a nordeste"}},"category":"So"},{"key":"2198","mappings":{"default":{"default":"flecha a sureste"}},"category":"So"},{"key":"2199","mappings":{"default":{"default":"flecha a suroeste"}},"category":"So"},{"key":"219A","mappings":{"default":{"default":"flecha izquierda tachada"}},"category":"Sm"},{"key":"219B","mappings":{"default":{"default":"flecha tachada"}},"category":"Sm"},{"key":"219C","mappings":{"default":{"default":"flecha ondulada izquierda"}},"category":"So"},{"key":"219D","mappings":{"default":{"default":"flecha ondulada"}},"category":"So"},{"key":"219E","mappings":{"default":{"default":"flecha izquierda con doble punta"}},"category":"So"},{"key":"219F","mappings":{"default":{"default":"flecha con doble punta hacia arriba"}},"category":"So"},{"key":"21A0","mappings":{"default":{"default":"flecha derechaa con doble punta"}},"category":"Sm"},{"key":"21A1","mappings":{"default":{"default":"flecha con doble punta hacia abajo"}},"category":"So"},{"key":"21A2","mappings":{"default":{"default":"flecha izquierda con cola"}},"category":"So"},{"key":"21A3","mappings":{"default":{"default":"flecha derecha con cola"}},"category":"Sm"},{"key":"21A4","mappings":{"default":{"default":"flecha izquierda de barra"}},"category":"So"},{"key":"21A5","mappings":{"default":{"default":"barra con flecha"}},"category":"So"},{"key":"21A6","mappings":{"default":{"default":"flecha derecha de barra"}},"category":"Sm"},{"key":"21A7","mappings":{"default":{"default":"flecha con barra"}},"category":"So"},{"key":"21A8","mappings":{"default":{"default":"flecha arriba y abajo con base"}},"category":"So"},{"key":"21A9","mappings":{"default":{"default":"flecha izquierda con gancho"}},"category":"So"},{"key":"21AA","mappings":{"default":{"default":"flecha con gancho"}},"category":"So"},{"key":"21AB","mappings":{"default":{"default":"flecha izquierda con lazo"}},"category":"So"},{"key":"21AC","mappings":{"default":{"default":"flecha con lazo"}},"category":"So"},{"key":"21AD","mappings":{"default":{"default":"flecha ondulada izquierda y derecha"}},"category":"So"},{"key":"21AE","mappings":{"default":{"default":"flecha izquierda y derecha tachada"}},"category":"Sm"},{"key":"21AF","mappings":{"default":{"default":"flecha zigzag abajo"}},"category":"So"},{"key":"21B0","mappings":{"default":{"default":"flecha arriba con punta izquierda"}},"category":"So"},{"key":"21B1","mappings":{"default":{"default":"flecha arriba con punta derecha"}},"category":"So"},{"key":"21B2","mappings":{"default":{"default":"flecha abajo con punta izquierda"}},"category":"So"},{"key":"21B3","mappings":{"default":{"default":"flecha abajo con punta derecha"}},"category":"So"},{"key":"21B4","mappings":{"default":{"default":"flecha derecha desde esquina inferior"}},"category":"So"},{"key":"21B5","mappings":{"default":{"default":"flecha hacia abajo desde esquina izquierda"}},"category":"So"},{"key":"21B6","mappings":{"default":{"default":"flecha semicircular superior en sentido antihorario"}},"category":"So"},{"key":"21B7","mappings":{"default":{"default":"flecha semicircular superior en sentido horario"}},"category":"So"},{"key":"21B8","mappings":{"default":{"default":"flecha noroeste a barra larga"}},"category":"So"},{"key":"21B9","mappings":{"default":{"default":"flecha izquierda a barra arriba de flecha derecha a barra"}},"category":"So"},{"key":"21BA","mappings":{"default":{"default":"flecha circular abierta en sentido antihorario"}},"category":"So"},{"key":"21BB","mappings":{"default":{"default":"flecha circular abierta en sentido horario"}},"category":"So"},{"key":"21C4","mappings":{"default":{"default":"flecha derecha arriba de flecha izquierda"}},"category":"So"},{"key":"21C5","mappings":{"default":{"default":"flecha arriba a la izquierda de flecha abajo"}},"category":"So"},{"key":"21C6","mappings":{"default":{"default":"flecha izquierda arriba de flecha derecha"}},"category":"So"},{"key":"21C7","mappings":{"default":{"default":"dos flechas hacia la izquierda"}},"category":"So"},{"key":"21C8","mappings":{"default":{"default":"dos flechas hacia arriba"}},"category":"So"},{"key":"21C9","mappings":{"default":{"default":"dos flechas"}},"category":"So"},{"key":"21CA","mappings":{"default":{"default":"dos flechas hacia abajo"}},"category":"So"},{"key":"21CD","mappings":{"default":{"default":"flecha doble izquierda tachada"}},"category":"So"},{"key":"21CE","mappings":{"default":{"default":"flecha doble izquierda y derecha tachada"}},"category":"Sm"},{"key":"21CF","mappings":{"default":{"default":"flecha doble tachada"}},"category":"Sm"},{"key":"21D0","mappings":{"default":{"default":"flecha doble hacia la izquierda"}},"category":"So"},{"key":"21D1","mappings":{"default":{"default":"flecha doble hacia arriba"}},"category":"So"},{"key":"21D2","mappings":{"default":{"default":"flecha doble"}},"category":"Sm"},{"key":"21D3","mappings":{"default":{"default":"flecha doble hacia abajo"}},"category":"So"},{"key":"21D4","mappings":{"default":{"default":"flecha doble izquierda-derecha"}},"category":"Sm"},{"key":"21D5","mappings":{"default":{"default":"flecha doble vertical"}},"category":"So"},{"key":"21D6","mappings":{"default":{"default":"flecha doble hacia noroeste"}},"category":"So"},{"key":"21D7","mappings":{"default":{"default":"flecha doble hacia nordeste"}},"category":"So"},{"key":"21D8","mappings":{"default":{"default":"flecha doble hacia sudeste"}},"category":"So"},{"key":"21D9","mappings":{"default":{"default":"flecha doble hacia sudoeste"}},"category":"So"},{"key":"21DA","mappings":{"default":{"default":"flecha triple izquierda"}},"category":"So"},{"key":"21DB","mappings":{"default":{"default":"flecha triple"}},"category":"So"},{"key":"21DC","mappings":{"default":{"default":"flecha ondulada izquierda"}},"category":"So"},{"key":"21DD","mappings":{"default":{"default":"flecha ondulada"}},"category":"So"},{"key":"21DE","mappings":{"default":{"default":"flecha hacia arriba con doble tachado"}},"category":"So"},{"key":"21DF","mappings":{"default":{"default":"flecha hacia abajo con doble tachado"}},"category":"So"},{"key":"21E0","mappings":{"default":{"default":"flecha de puntos hacia la izquierda"}},"category":"So"},{"key":"21E1","mappings":{"default":{"default":"flecha de puntos hacia arriba"}},"category":"So"},{"key":"21E2","mappings":{"default":{"default":"flecha de puntos"}},"category":"So"},{"key":"21E3","mappings":{"default":{"default":"flecha de puntos hacia abajo"}},"category":"So"},{"key":"21E4","mappings":{"default":{"default":"flecha izquierda a barra"}},"category":"So"},{"key":"21E5","mappings":{"default":{"default":"flecha derecha a barra"}},"category":"So"},{"key":"21E6","mappings":{"default":{"default":"flecha vacía hacia la izquierda"}},"category":"So"},{"key":"21E7","mappings":{"default":{"default":"flecha vacía hacia arriba"}},"category":"So"},{"key":"21E8","mappings":{"default":{"default":"flecha vacía"}},"category":"So"},{"key":"21E9","mappings":{"default":{"default":"flecha vacía hacia abajo"}},"category":"So"},{"key":"21EA","mappings":{"default":{"default":"flecha vacía hacia arriba desde barra"}},"category":"So"},{"key":"21F5","mappings":{"default":{"default":"upwards arrow to the right of downwards arrow"}},"category":"Sm"},{"key":"21FD","mappings":{"default":{"default":"flecha izquierda con punta vacía"}},"category":"Sm"},{"key":"21FE","mappings":{"default":{"default":"flecha izquierda con punta vacía"}},"category":"Sm"},{"key":"21FF","mappings":{"default":{"default":"flecha izquierda derecha con punta vacía"}},"category":"Sm"},{"key":"27F0","mappings":{"default":{"default":"flecha cuádruple hacia arriba"}},"category":"Sm"},{"key":"27F1","mappings":{"default":{"default":"flecha cuádruple hacia abajo"}},"category":"Sm"},{"key":"27F2","mappings":{"default":{"default":"flecha hacia la izquierda desde círculo"}},"category":"Sm"},{"key":"27F3","mappings":{"default":{"default":"flecha hacia la derecha desde círculo"}},"category":"Sm"},{"key":"27F4","mappings":{"default":{"default":"flecha con más en círculo"}},"category":"Sm"},{"key":"27F5","mappings":{"default":{"default":"flecha larga hacia la izquierda"}},"category":"Sm"},{"key":"27F6","mappings":{"default":{"default":"flecha larga"}},"category":"Sm"},{"key":"27F7","mappings":{"default":{"default":"flecha larga hacia izquierda y derecha"}},"category":"Sm"},{"key":"27F8","mappings":{"default":{"default":"doble flecha larga hacia la izquierda"}},"category":"Sm"},{"key":"27F9","mappings":{"default":{"default":"doble flecha larga"}},"category":"Sm"},{"key":"27FA","mappings":{"default":{"default":"doble flecha larga hacia izquierda y derecha"}},"category":"Sm"},{"key":"27FB","mappings":{"default":{"default":"flecha larga hacia la izquierda, desde barra"}},"category":"Sm"},{"key":"27FC","mappings":{"default":{"default":"flecha larga desde barra"}},"category":"Sm"},{"key":"27FD","mappings":{"default":{"default":"doble flecha larga hacia la izquierda desde barra"}},"category":"Sm"},{"key":"27FE","mappings":{"default":{"default":"doble flecha larga desde barra"}},"category":"Sm"},{"key":"27FF","mappings":{"default":{"default":"flecha larga en zigzag"}},"category":"Sm"},{"key":"2905","mappings":{"default":{"default":"rightwards two headed arrow from bar"}},"category":"Sm"},{"key":"290C","mappings":{"default":{"default":"leftwards double dash arrow"}},"category":"Sm"},{"key":"290D","mappings":{"default":{"default":"rightwards double dash arrow"}},"category":"Sm"},{"key":"290E","mappings":{"default":{"default":"leftwards triple dash arrow"}},"category":"Sm"},{"key":"290F","mappings":{"default":{"default":"rightwards triple dash arrow"}},"category":"Sm"},{"key":"2910","mappings":{"default":{"default":"rightwards two headed triple dash arrow"}},"category":"Sm"},{"key":"2911","mappings":{"default":{"default":"rightwards arrow with dotted stem"}},"category":"Sm"},{"key":"2912","mappings":{"default":{"default":"upwards arrow to bar"}},"category":"Sm"},{"key":"2913","mappings":{"default":{"default":"downwards arrow to bar"}},"category":"Sm"},{"key":"2916","mappings":{"default":{"default":"rightwards two headed arrow with tail"}},"category":"Sm"},{"key":"2919","mappings":{"default":{"default":"cola de flecha hacia la izquierda"}},"category":"Sm"},{"key":"291B","mappings":{"default":{"default":"cola de doble flecha hacia la izquierda"}},"category":"Sm"},{"key":"291C","mappings":{"default":{"default":"cola de doble flecha hacia la derecha"}},"category":"Sm"},{"key":"291D","mappings":{"default":{"default":"flecha hacia diamante relleno a la izquierda"}},"category":"Sm"},{"key":"291E","mappings":{"default":{"default":"flecha hacia diamante a la derecha"}},"category":"Sm"},{"key":"291F","mappings":{"default":{"default":"flecha desde barra hacia diamante a la izquierda"}},"category":"Sm"},{"key":"2920","mappings":{"default":{"default":"flecha desde barra hacia diamante a la derecha"}},"category":"Sm"},{"key":"2923","mappings":{"default":{"default":"flecha a noroeste con garfio"}},"category":"Sm"},{"key":"2924","mappings":{"default":{"default":"flecha a nordeste con garfio"}},"category":"Sm"},{"key":"2925","mappings":{"default":{"default":"flecha a sureste con garfio"}},"category":"Sm"},{"key":"2926","mappings":{"default":{"default":"flecha a suroeste con garfio"}},"category":"Sm"},{"key":"2927","mappings":{"default":{"default":"flechas a noroeste y nordeste"}},"category":"Sm"},{"key":"2928","mappings":{"default":{"default":"flechas a nordeste y sudeste"}},"category":"Sm"},{"key":"2929","mappings":{"default":{"default":"flechas a suddeste y sudoeste"}},"category":"Sm"},{"key":"292A","mappings":{"default":{"default":"flechas a sudoeste y noroeste"}},"category":"Sm"},{"key":"2933","mappings":{"default":{"default":"flecha ondulada"}},"category":"Sm"},{"key":"2935","mappings":{"default":{"default":"flecha hacia la derecha que gira hacia abajo"}},"category":"Sm"},{"key":"2936","mappings":{"default":{"default":"flecha hacia abajo que gira hacia la izquierda"}},"category":"Sm"},{"key":"2937","mappings":{"default":{"default":"flecha hacia abajo que gira hacia la derecha"}},"category":"Sm"},{"key":"2938","mappings":{"default":{"default":"flecha semicircular a la derecha en sentido horario"}},"category":"Sm"},{"key":"2939","mappings":{"default":{"default":"flecha semicircular a la izquierda en sentido antihorario"}},"category":"Sm"},{"key":"293C","mappings":{"default":{"default":"giro negativo"}},"category":"Sm"},{"key":"293D","mappings":{"default":{"default":"giro positivo"}},"category":"Sm"},{"key":"2945","mappings":{"default":{"default":"flecha con más suscrito"}},"category":"Sm"},{"key":"2948","mappings":{"default":{"default":"flecha hacia la izquierda a través de círculo"}},"category":"Sm"},{"key":"2949","mappings":{"default":{"default":"dos cabezas de flecha hacia arriba desde círculo"}},"category":"Sm"},{"key":"2970","mappings":{"default":{"default":"round implies"}},"category":"Sm"},{"key":"2971","mappings":{"default":{"default":"flecha con igual"}},"category":"Sm"},{"key":"2972","mappings":{"default":{"default":"flecha con tilde"}},"category":"Sm"},{"key":"2973","mappings":{"default":{"default":"tilde con flecha hacia la izquierda"}},"category":"Sm"},{"key":"2974","mappings":{"default":{"default":"tilde con flecha"}},"category":"Sm"},{"key":"2975","mappings":{"default":{"default":"flecha con casi igual a"}},"category":"Sm"},{"key":"2976","mappings":{"default":{"default":"flecha hacia la izquierda con menor que"}},"category":"Sm"},{"key":"2978","mappings":{"default":{"default":"flecha con mayor que"}},"category":"Sm"},{"key":"2979","mappings":{"default":{"default":"flecha hacia la izquierda con incluido"}},"category":"Sm"},{"key":"297B","mappings":{"default":{"default":"flecha hacia la izquierda con contiene"}},"category":"Sm"},{"key":"29B3","mappings":{"default":{"default":"conjunto vacío con flecha"}},"category":"Sm"},{"key":"29B4","mappings":{"default":{"default":"conjunto vacío con flecha inversa"}},"category":"Sm"},{"key":"2A17","mappings":{"default":{"default":"integral con flecha hacia la izquierda con garfio"}},"category":"Sm"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_characters.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_characters.js
deleted file mode 100644
index 18c63570..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_characters.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"2113","mappings":{"default":{"default":"script l"}},"category":"Ll"},{"key":"2118","mappings":{"default":{"default":"p de weierstrass"}},"category":"Sm"},{"key":"2145","mappings":{"default":{"default":"mayúscula D"}},"category":"Lu"},{"key":"2146","mappings":{"default":{"default":"d"}},"category":"Ll"},{"key":"2147","mappings":{"default":{"default":"e"}},"category":"Ll"},{"key":"2148","mappings":{"default":{"default":"i"}},"category":"Ll"},{"category":"Ll","mappings":{"default":{"default":"cursiva dotless i"}},"key":"1D6A4"},{"category":"Ll","mappings":{"default":{"default":"cursiva dotless j"}},"key":"1D6A5"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_delimiters.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_delimiters.js
deleted file mode 100644
index 6294d37d..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_delimiters.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"0028","mappings":{"default":{"default":"paréntesis izquierdo","defaultMP":"paréntesis"}},"category":"Ps"},{"key":"0029","mappings":{"default":{"default":"paréntesis derecho","defaultMP":"cierra paréntesis"}},"category":"Pe"},{"key":"005B","mappings":{"default":{"default":"corchete izquierdo","defaultMP":"abre corchetes"}},"category":"Ps"},{"key":"005D","mappings":{"default":{"default":"corchete derecho","defaultMP":"cierra corchetes"}},"category":"Pe"},{"key":"007B","mappings":{"default":{"default":"llave izquierda","defaultMP":"abre llaves"}},"category":"Ps"},{"key":"007D","mappings":{"default":{"default":"llaves derecha","defaultMP":"cierra llaves"}},"category":"Pe"},{"key":"2308","mappings":{"default":{"default":"esquina superior izquierda"}},"category":"Sm"},{"key":"2309","mappings":{"default":{"default":"esquina superior derecha"}},"category":"Sm"},{"key":"230A","mappings":{"default":{"default":"esquina inferior izquierda"}},"category":"Sm"},{"key":"230B","mappings":{"default":{"default":"esquina inferior derecha"}},"category":"Sm"},{"key":"230C","mappings":{"default":{"default":"corte inferior derecho"}},"category":"So"},{"key":"230D","mappings":{"default":{"default":"corte inferior izquierdo"}},"category":"So"},{"key":"230E","mappings":{"default":{"default":"corte superior derecho "}},"category":"So"},{"key":"230F","mappings":{"default":{"default":"corte superior izquierdo"}},"category":"So"},{"key":"231C","mappings":{"default":{"default":"ángulo superior izquierdo"}},"category":"So"},{"key":"231D","mappings":{"default":{"default":"ángulo superior derecho"}},"category":"So"},{"key":"231E","mappings":{"default":{"default":"ángulo inferior izquierdo"}},"category":"So"},{"key":"231F","mappings":{"default":{"default":"ángulo inferior derecho"}},"category":"So"},{"key":"2320","mappings":{"default":{"default":"mitad superior de integral"}},"category":"Sm"},{"key":"2321","mappings":{"default":{"default":"mitad inferior de integral"}},"category":"Sm"},{"key":"2329","mappings":{"default":{"default":"paréntesis angular izquierdo"}},"category":"Ps"},{"key":"232A","mappings":{"default":{"default":"paréntesis angular derecho"}},"category":"Pe"},{"key":"23B0","mappings":{"default":{"default":"izquierda arriba o derecho debajo sección llave"}},"category":"Sm"},{"key":"23B1","mappings":{"default":{"default":"derecha arriba o izquierdo debajo sección llave"}},"category":"Sm"},{"key":"23B4","mappings":{"default":{"default":"corchete superior"}},"category":"So"},{"key":"23B5","mappings":{"default":{"default":"corchete inferior"}},"category":"So"},{"key":"23DC","mappings":{"default":{"default":"paréntesis superior"}},"category":"Sm"},{"key":"23DD","mappings":{"default":{"default":"paréntesis inferior"}},"category":"Sm"},{"key":"23DE","mappings":{"default":{"default":"corchete rizado superior"}},"category":"Sm"},{"key":"23DF","mappings":{"default":{"default":"corchete rizado inferior"}},"category":"Sm"},{"key":"23E0","mappings":{"default":{"default":"corchete superior en tortuga"}},"category":"Sm"},{"key":"23E1","mappings":{"default":{"default":"corchete inferior en tortuga"}},"category":"Sm"},{"key":"27C5","mappings":{"default":{"default":"símbolo delimitador izquierdo de bolsa de s-formó"}},"category":"Ps"},{"key":"27C6","mappings":{"default":{"default":"símbolo delimitador derecho de bolsa de s-formó"}},"category":"Pe"},{"key":"27E6","mappings":{"default":{"default":"corchete vacío izquierdo"}},"category":"Ps"},{"key":"27E7","mappings":{"default":{"default":"corchete vacío derecho"}},"category":"Pe"},{"key":"27E8","mappings":{"default":{"default":"corchete agudo izquierdo"}},"category":"Ps"},{"key":"27E9","mappings":{"default":{"default":"corchete agudo derecho"}},"category":"Pe"},{"key":"27EA","mappings":{"default":{"default":"doble corchete agudo izquierdo"}},"category":"Ps"},{"key":"27EB","mappings":{"default":{"default":"doble corchete agudo derecho"}},"category":"Pe"},{"key":"27EC","mappings":{"default":{"default":"corchete de tortuga vacío izquierdo"}},"category":"Ps"},{"key":"27ED","mappings":{"default":{"default":"corchete de tortuga vacío derecho "}},"category":"Pe"},{"key":"27EE","mappings":{"default":{"default":"paréntesis plano izquierdo"}},"category":"Ps"},{"key":"27EF","mappings":{"default":{"default":"paréntesis plano derecho"}},"category":"Pe"},{"key":"2985","mappings":{"default":{"default":"left white paren"}},"category":"Ps"},{"key":"2986","mappings":{"default":{"default":"right white paren"}},"category":"Pe"},{"key":"2989","mappings":{"default":{"default":"z notation left binding bracket"}},"category":"Ps"},{"key":"298A","mappings":{"default":{"default":"z notation right binding bracket"}},"category":"Pe"},{"key":"298B","mappings":{"default":{"default":"left bracket with underbar"}},"category":"Ps"},{"key":"298C","mappings":{"default":{"default":"right bracket with underbar"}},"category":"Pe"},{"key":"298D","mappings":{"default":{"default":"left bracket with tick in top corner"}},"category":"Ps"},{"key":"298E","mappings":{"default":{"default":"right bracket with tick in bottom corner"}},"category":"Pe"},{"key":"298F","mappings":{"default":{"default":"left bracket with tick in bottom corner"}},"category":"Ps"},{"key":"2990","mappings":{"default":{"default":"right bracket with tick in top corner"}},"category":"Pe"},{"key":"2991","mappings":{"default":{"default":"left angle bracket with dot"}},"category":"Ps"},{"key":"2992","mappings":{"default":{"default":"right angle bracket with dot"}},"category":"Pe"},{"key":"2993","mappings":{"default":{"default":"left arc less than bracket"}},"category":"Ps"},{"key":"2994","mappings":{"default":{"default":"right arc greater than bracket"}},"category":"Pe"},{"key":"2995","mappings":{"default":{"default":"double left arc greater than bracket"}},"category":"Ps"},{"key":"2996","mappings":{"default":{"default":"double right arc less than bracket"}},"category":"Pe"},{"key":"29DA","mappings":{"default":{"default":"left double wiggly fence"}},"category":"Ps"},{"key":"29DB","mappings":{"default":{"default":"right double wiggly fence"}},"category":"Pe"},{"key":"300A","mappings":{"default":{"default":"paréntesis angular doble"}},"category":"Ps"},{"key":"300B","mappings":{"default":{"default":"paréntesis angular doble derecho","defaultMP":"cierra paréntesis angular doble"}},"category":"Pe"},{"key":"3014","mappings":{"default":{"default":"left tortoise shell bracket"}},"category":"Ps"},{"key":"3015","mappings":{"default":{"default":"right tortoise shell bracket"}},"category":"Pe"},{"key":"301A","mappings":{"default":{"default":"corchete vacío"}},"category":"Ps"},{"key":"301B","mappings":{"default":{"default":"corchete vacío derecho","defaultMP":"cierra corchete vacío"}},"category":"Pe"},{"key":"301E","mappings":{"default":{"default":"segunda"}},"category":"Pe"},{"key":"FE35","mappings":{"default":{"default":"paréntesis superior"}},"category":"Ps"},{"key":"FE36","mappings":{"default":{"default":"paréntesis inferior"}},"category":"Pe"},{"key":"FE37","mappings":{"default":{"default":"llave superior"}},"category":"Ps"},{"key":"FE38","mappings":{"default":{"default":"llave inferior"}},"category":"Pe"},{"key":"FE3F","mappings":{"default":{"default":"paréntesis angular superior"}},"category":"Ps"},{"key":"FE40","mappings":{"default":{"default":"paréntesis angular inferior"}},"category":"Pe"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_digits.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_digits.js
deleted file mode 100644
index ce619b0e..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_digits.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"00B2","mappings":{"default":{"default":"super 2"}},"category":"No"},{"key":"00B3","mappings":{"default":{"default":"super 3"}},"category":"No"},{"key":"00B9","mappings":{"default":{"default":"super 1"}},"category":"No"},{"key":"00BC","mappings":{"default":{"default":"un cuarto"}},"category":"No"},{"key":"00BD","mappings":{"default":{"default":"un medio"}},"category":"No"},{"key":"00BE","mappings":{"default":{"default":"tres cuartos"}},"category":"No"},{"key":"2153","mappings":{"default":{"default":"un tercio"}},"category":"No"},{"key":"2154","mappings":{"default":{"default":"dos tercios"}},"category":"No"},{"key":"2155","mappings":{"default":{"default":"un quinto"}},"category":"No"},{"key":"2156","mappings":{"default":{"default":"dos quintos"}},"category":"No"},{"key":"2157","mappings":{"default":{"default":"tres quintos"}},"category":"No"},{"key":"2158","mappings":{"default":{"default":"cuatro quintos"}},"category":"No"},{"key":"2159","mappings":{"default":{"default":"un sexto"}},"category":"No"},{"key":"215A","mappings":{"default":{"default":"cinco sextos"}},"category":"No"},{"key":"215B","mappings":{"default":{"default":"un octavo"}},"category":"No"},{"key":"215C","mappings":{"default":{"default":"tres octavos"}},"category":"No"},{"key":"215D","mappings":{"default":{"default":"cinco octavos"}},"category":"No"},{"key":"215E","mappings":{"default":{"default":"siete octavos"}},"category":"No"},{"category":"Nd","mappings":{"default":{"default":"negrita 0"}},"key":"1D7CE"},{"category":"Nd","mappings":{"default":{"default":"negrita 1"}},"key":"1D7CF"},{"category":"Nd","mappings":{"default":{"default":"negrita 2"}},"key":"1D7D0"},{"category":"Nd","mappings":{"default":{"default":"negrita 3"}},"key":"1D7D1"},{"category":"Nd","mappings":{"default":{"default":"negrita 4"}},"key":"1D7D2"},{"category":"Nd","mappings":{"default":{"default":"negrita 5"}},"key":"1D7D3"},{"category":"Nd","mappings":{"default":{"default":"negrita 6"}},"key":"1D7D4"},{"category":"Nd","mappings":{"default":{"default":"negrita 7"}},"key":"1D7D5"},{"category":"Nd","mappings":{"default":{"default":"negrita 8"}},"key":"1D7D6"},{"category":"Nd","mappings":{"default":{"default":"negrita 9"}},"key":"1D7D7"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 0"}},"key":"1D7D8"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 1"}},"key":"1D7D9"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 2"}},"key":"1D7DA"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 3"}},"key":"1D7DB"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 4"}},"key":"1D7DC"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 5"}},"key":"1D7DD"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 6"}},"key":"1D7DE"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 7"}},"key":"1D7DF"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 8"}},"key":"1D7E0"},{"category":"Nd","mappings":{"default":{"default":"negrita de pizarra 9"}},"key":"1D7E1"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 0"}},"key":"1D7E2"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 1"}},"key":"1D7E3"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 2"}},"key":"1D7E4"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 3"}},"key":"1D7E5"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 4"}},"key":"1D7E6"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 5"}},"key":"1D7E7"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 6"}},"key":"1D7E8"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 7"}},"key":"1D7E9"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 8"}},"key":"1D7EA"},{"category":"Nd","mappings":{"default":{"default":"sans-serif 9"}},"key":"1D7EB"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 0"}},"key":"1D7EC"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 1"}},"key":"1D7ED"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 2"}},"key":"1D7EE"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 3"}},"key":"1D7EF"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 4"}},"key":"1D7F0"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 5"}},"key":"1D7F1"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 6"}},"key":"1D7F2"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 7"}},"key":"1D7F3"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 8"}},"key":"1D7F4"},{"category":"Nd","mappings":{"default":{"default":"sans-serif negrita 9"}},"key":"1D7F5"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 0"}},"key":"1D7F6"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 1"}},"key":"1D7F7"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 2"}},"key":"1D7F8"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 3"}},"key":"1D7F9"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 4"}},"key":"1D7FA"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 5"}},"key":"1D7FB"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 6"}},"key":"1D7FC"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 7"}},"key":"1D7FD"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 8"}},"key":"1D7FE"},{"category":"Nd","mappings":{"default":{"default":"monoespacio 9"}},"key":"1D7FF"},{"category":"No","mappings":{"default":{"default":"0 punto"}},"key":"1F100"},{"category":"No","mappings":{"default":{"default":"0 coma"}},"key":"1F101"},{"category":"No","mappings":{"default":{"default":"1 coma"}},"key":"1F102"},{"category":"No","mappings":{"default":{"default":"2 coma"}},"key":"1F103"},{"category":"No","mappings":{"default":{"default":"3 coma"}},"key":"1F104"},{"category":"No","mappings":{"default":{"default":"4 coma"}},"key":"1F105"},{"category":"No","mappings":{"default":{"default":"5 coma"}},"key":"1F106"},{"category":"No","mappings":{"default":{"default":"6 coma"}},"key":"1F107"},{"category":"No","mappings":{"default":{"default":"7 coma"}},"key":"1F108"},{"category":"No","mappings":{"default":{"default":"8 coma"}},"key":"1F109"},{"category":"No","mappings":{"default":{"default":"9 coma"}},"key":"1F10A"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_geometry.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_geometry.js
deleted file mode 100644
index 9c39f275..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_geometry.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"2500","mappings":{"default":{"default":"delimitador horizontal"}},"category":"So"},{"key":"2502","mappings":{"default":{"default":"delimitador vertical"}},"category":"So"},{"key":"250C","mappings":{"default":{"default":"esquina inferior derecha"}},"category":"So"},{"key":"2510","mappings":{"default":{"default":"esquina inferior izquierda"}},"category":"So"},{"key":"2514","mappings":{"default":{"default":"esquina superior derecha"}},"category":"So"},{"key":"2518","mappings":{"default":{"default":"esquina superior izquierda"}},"category":"So"},{"key":"251C","mappings":{"default":{"default":"delimitador izquierdo y separador horizontal"}},"category":"So"},{"key":"2524","mappings":{"default":{"default":"delimitador derecho y separador horizontal"}},"category":"So"},{"key":"252C","mappings":{"default":{"default":"delimitador superior y separador vertical"}},"category":"So"},{"key":"2534","mappings":{"default":{"default":"delimitador inferior y separador vertical"}},"category":"So"},{"key":"253C","mappings":{"default":{"default":"cruce de separadores sencillos"}},"category":"So"},{"key":"2550","mappings":{"default":{"default":"delimitador horizontal doble"}},"category":"So"},{"key":"2551","mappings":{"default":{"default":"delimitador vertical doble"}},"category":"So"},{"key":"2552","mappings":{"default":{"default":"esquina inferior derecha, vertical doble"}},"category":"So"},{"key":"2553","mappings":{"default":{"default":"esquina inferior derecha, horizontal doble"}},"category":"So"},{"key":"2554","mappings":{"default":{"default":"esquina inferior derecha doble"}},"category":"So"},{"key":"2555","mappings":{"default":{"default":"esquina inferior izquierda, vertical doble"}},"category":"So"},{"key":"2556","mappings":{"default":{"default":"esquina inferior izquierda, horizontal doble"}},"category":"So"},{"key":"2557","mappings":{"default":{"default":"esquina inferior izquierda doble"}},"category":"So"},{"key":"2558","mappings":{"default":{"default":"esquina superior derecha, vertical doble"}},"category":"So"},{"key":"2559","mappings":{"default":{"default":"esquina superior derecha, horizontal doble"}},"category":"So"},{"key":"255A","mappings":{"default":{"default":"esquina superior derecha doble"}},"category":"So"},{"key":"255B","mappings":{"default":{"default":"esquina superior izquierda, vertical doble"}},"category":"So"},{"key":"255C","mappings":{"default":{"default":"esquina superior izquierda, horizontal doble"}},"category":"So"},{"key":"255D","mappings":{"default":{"default":"esquina superior izquierda doble"}},"category":"So"},{"key":"255E","mappings":{"default":{"default":"delimitador izquierdo con separador doble"}},"category":"So"},{"key":"255F","mappings":{"default":{"default":"delimitador izquierdo doble con separador horizontal"}},"category":"So"},{"key":"2560","mappings":{"default":{"default":"delimitador izquierdo y separador horizontal dobles"}},"category":"So"},{"key":"2561","mappings":{"default":{"default":"delimitador derecho con separador doble"}},"category":"So"},{"key":"2562","mappings":{"default":{"default":"delimitador derecho doble con separador horizontal"}},"category":"So"},{"key":"2563","mappings":{"default":{"default":"delimitador derecho y separador horizontal dobles"}},"category":"So"},{"key":"2564","mappings":{"default":{"default":"delimitador superior doble con separador vertical"}},"category":"So"},{"key":"2565","mappings":{"default":{"default":"delimitador superior con separador vertical doble"}},"category":"So"},{"key":"2566","mappings":{"default":{"default":"delimitador superior y separador vertical dobles"}},"category":"So"},{"key":"2567","mappings":{"default":{"default":"delimitador inferior doble con separador vertical"}},"category":"So"},{"key":"2568","mappings":{"default":{"default":"delimitador inferior con separador vertical doble"}},"category":"So"},{"key":"2569","mappings":{"default":{"default":"delimitador inferior y separador vertical dobles"}},"category":"So"},{"key":"256A","mappings":{"default":{"default":"cruce de separadores, vertical sencillo y horizontal doble"}},"category":"So"},{"key":"256B","mappings":{"default":{"default":"cruce de separadores, vertical doble y horizontal sencillo"}},"category":"So"},{"key":"256C","mappings":{"default":{"default":"cruce de separadores dobles"}},"category":"So"},{"key":"2580","mappings":{"default":{"default":"bloque mitad superior"}},"category":"So"},{"key":"2584","mappings":{"default":{"default":"bloque mitad inferior"}},"category":"So"},{"key":"2588","mappings":{"default":{"default":"bloque"}},"category":"So"},{"key":"2591","mappings":{"default":{"default":"sombra ligera"}},"category":"So"},{"key":"2592","mappings":{"default":{"default":"sombra media"}},"category":"So"},{"key":"2593","mappings":{"default":{"default":"sombra intensa"}},"category":"So"},{"key":"25A0","mappings":{"default":{"default":"cuadrado relleno"}},"category":"So"},{"key":"25A1","mappings":{"default":{"default":"cuadrado"}},"category":"So"},{"key":"25AA","mappings":{"default":{"default":"cuadrado relleno"}},"category":"So"},{"key":"25AB","mappings":{"default":{"default":"cuadrado"}},"category":"So"},{"key":"25AD","mappings":{"default":{"default":"rectángulo"}},"category":"So"},{"key":"25AE","mappings":{"default":{"default":"rectángulo relleno vertical"}},"category":"So"},{"key":"25AF","mappings":{"default":{"default":"rectángulo vertical"}},"category":"So"},{"key":"25B1","mappings":{"default":{"default":"paralelogramo"}},"category":"So"},{"key":"25B2","mappings":{"default":{"default":"triángulo relleno"}},"category":"So"},{"key":"25B3","mappings":{"default":{"default":"triángulo"}},"category":"So"},{"key":"25B4","mappings":{"default":{"default":"triángulo relleno"}},"category":"So"},{"key":"25B5","mappings":{"default":{"default":"triángulo"}},"category":"So"},{"key":"25B6","mappings":{"default":{"default":"triángulo relleno señala derecha"}},"category":"So"},{"key":"25B7","mappings":{"default":{"default":"triángulo señala derecha"}},"category":"Sm"},{"key":"25B8","mappings":{"default":{"default":"triángulo relleno señala derecha"}},"category":"So"},{"key":"25B9","mappings":{"default":{"default":"triángulo señala derecha"}},"category":"So"},{"key":"25BC","mappings":{"default":{"default":"triángulo relleno señala abajo"}},"category":"So"},{"key":"25BD","mappings":{"default":{"default":"triángulo señala abajo"}},"category":"So"},{"key":"25BE","mappings":{"default":{"default":"triángulo relleno señala abajo"}},"category":"So"},{"key":"25BF","mappings":{"default":{"default":"triángulo señala abajo"}},"category":"So"},{"key":"25C0","mappings":{"default":{"default":"triángulo relleno señala izquierda"}},"category":"So"},{"key":"25C1","mappings":{"default":{"default":"triángulo señala izquierda"}},"category":"Sm"},{"key":"25C2","mappings":{"default":{"default":"triángulo relleno señala izquierda"}},"category":"So"},{"key":"25C3","mappings":{"default":{"default":"triángulo señala izquierda"}},"category":"So"},{"key":"25C4","mappings":{"default":{"default":"puntero relleno señala izquierda"}},"category":"So"},{"key":"25C5","mappings":{"default":{"default":"puntero señala izquierda"}},"category":"So"},{"key":"25C6","mappings":{"default":{"default":"diamante relleno"}},"category":"So"},{"key":"25C7","mappings":{"default":{"default":"diamante"}},"category":"So"},{"key":"25C8","mappings":{"default":{"default":"diamante vacío contiene diamante relleno"}},"category":"So"},{"key":"25C9","mappings":{"default":{"default":"ojo de pez"}},"category":"So"},{"key":"25CA","mappings":{"default":{"default":"rombo"}},"category":"So"},{"key":"25CB","mappings":{"default":{"default":"círculo vacío"}},"category":"So"},{"key":"25CC","mappings":{"default":{"default":"círculo punteado"}},"category":"So"},{"key":"25CD","mappings":{"default":{"default":"círculo con relleno vertical"}},"category":"So"},{"key":"25CE","mappings":{"default":{"default":"blanco"}},"category":"So"},{"key":"25CF","mappings":{"default":{"default":"círculo relleno"}},"category":"So"},{"key":"25D0","mappings":{"default":{"default":"círculo con mitad izquierda rellena"}},"category":"So"},{"key":"25D1","mappings":{"default":{"default":"círculo con mitad derecha rellena"}},"category":"So"},{"key":"25D2","mappings":{"default":{"default":"círculo con mitad inferior rellena"}},"category":"So"},{"key":"25D3","mappings":{"default":{"default":"círculo con mitad superior rellena"}},"category":"So"},{"key":"25D4","mappings":{"default":{"default":"círculo con cuadrante superior derecho relleno"}},"category":"So"},{"key":"25D5","mappings":{"default":{"default":"círculo con cuadrante superior izquierdo relleno"}},"category":"So"},{"key":"25D6","mappings":{"default":{"default":"semicírculo izquierdo relleno"}},"category":"So"},{"key":"25D7","mappings":{"default":{"default":"semicírculo derecho relleno"}},"category":"So"},{"key":"25D8","mappings":{"default":{"default":"bullet inversa"}},"category":"So"},{"key":"25D9","mappings":{"default":{"default":"círculo vacío inverso"}},"category":"So"},{"key":"25DA","mappings":{"default":{"default":"semicírculo superior vacío inverso"}},"category":"So"},{"key":"25DB","mappings":{"default":{"default":"semicírculo superior vacío inverso"}},"category":"So"},{"key":"25DC","mappings":{"default":{"default":"arco superior izquierda"}},"category":"So"},{"key":"25DD","mappings":{"default":{"default":"arco superior derecha"}},"category":"So"},{"key":"25DE","mappings":{"default":{"default":"arco inferior derecha"}},"category":"So"},{"key":"25DF","mappings":{"default":{"default":"arco inferior izquierda"}},"category":"So"},{"key":"25E0","mappings":{"default":{"default":"semicírculo superior"}},"category":"So"},{"key":"25E1","mappings":{"default":{"default":"semicírculo inferior"}},"category":"So"},{"key":"25E2","mappings":{"default":{"default":"triángulo inferior derecha relleno"}},"category":"So"},{"key":"25E3","mappings":{"default":{"default":"triángulo inferior izquierda relleno"}},"category":"So"},{"key":"25E4","mappings":{"default":{"default":"triángulo superior izquierda relleno"}},"category":"So"},{"key":"25E5","mappings":{"default":{"default":"triángulo superior derecha relleno"}},"category":"So"},{"key":"25E6","mappings":{"default":{"default":"composición"}},"category":"So"},{"key":"25E7","mappings":{"default":{"default":"cuadrado con mitad izquierda rellena"}},"category":"So"},{"key":"25E8","mappings":{"default":{"default":"cuadrado con mitad derecha rellena"}},"category":"So"},{"key":"25E9","mappings":{"default":{"default":"cuadrado con mitad superior izquierda rellena"}},"category":"So"},{"key":"25EA","mappings":{"default":{"default":"cuadrado con mitad inferior derecha rellena"}},"category":"So"},{"key":"25EB","mappings":{"default":{"default":"cuadrado con bisectriz"}},"category":"So"},{"key":"25EC","mappings":{"default":{"default":"triángulo vacío con punto"}},"category":"So"},{"key":"25ED","mappings":{"default":{"default":"triángulo apuntando arriba con mitad izquierda rellena"}},"category":"So"},{"key":"25EE","mappings":{"default":{"default":"triángulo apuntando arriba con mitad derecha rellena"}},"category":"So"},{"key":"25EF","mappings":{"default":{"default":"círculo grande"}},"category":"So"},{"key":"25F8","mappings":{"default":{"default":"triángulo superior izquierda"}},"category":"Sm"},{"key":"25F9","mappings":{"default":{"default":"triángulo superior derecha"}},"category":"Sm"},{"key":"25FA","mappings":{"default":{"default":"triángulo inferior izquierda"}},"category":"Sm"},{"key":"25FB","mappings":{"default":{"default":"cuadrado mediano vacío"}},"category":"Sm"},{"key":"25FC","mappings":{"default":{"default":"cuadrado mediano relleno"}},"category":"Sm"},{"key":"25FD","mappings":{"default":{"default":"cuadrado mediano vacío"}},"category":"Sm"},{"key":"25FE","mappings":{"default":{"default":"cuadrado mediano relleno"}},"category":"Sm"},{"key":"25FF","mappings":{"default":{"default":"triángulo inferior derecha"}},"category":"Sm"},{"key":"2B50","mappings":{"default":{"default":"estrella media vacía"}},"category":"So"},{"key":"2B51","mappings":{"default":{"default":"estrella pequeña rellena"}},"category":"So"},{"key":"2B52","mappings":{"default":{"default":"estrella pequeña vacía"}},"category":"So"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_harpoons.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_harpoons.js
deleted file mode 100644
index 89c27eab..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_harpoons.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"21BC","mappings":{"default":{"default":"flecha izquierda con arpón arriba"}},"category":"So"},{"key":"21BD","mappings":{"default":{"default":"flecha izquierda con arpón debajo"}},"category":"So"},{"key":"21BE","mappings":{"default":{"default":"flecha arriba con arpón derecho"}},"category":"So"},{"key":"21BF","mappings":{"default":{"default":"flecha arriba con arpón izquierdo"}},"category":"So"},{"key":"21C0","mappings":{"default":{"default":"flecha derecha con arpón arriba"}},"category":"So"},{"key":"21C1","mappings":{"default":{"default":"flecha derecha con arpón debajo"}},"category":"So"},{"key":"21C2","mappings":{"default":{"default":"flecha abajo con arpón derecho"}},"category":"So"},{"key":"21C3","mappings":{"default":{"default":"flecha abajo con arpón izquierdo"}},"category":"So"},{"key":"21CB","mappings":{"default":{"default":"arpón izquierdo arriba de arpón derecho"}},"category":"So"},{"key":"21CC","mappings":{"default":{"default":"arpón derecho arriba de arpón izquierdo"}},"category":"So"},{"key":"294A","mappings":{"default":{"default":"left barb up right barb down harpoon"}},"category":"Sm"},{"key":"294B","mappings":{"default":{"default":"left barb down right barb up harpoon"}},"category":"Sm"},{"key":"294E","mappings":{"default":{"default":"left barb up right barb up harpoon"}},"category":"Sm"},{"key":"294F","mappings":{"default":{"default":"arpón a la derecha hacia arriba y abajo"}},"category":"Sm"},{"key":"2950","mappings":{"default":{"default":"left barb down right barb down harpoon"}},"category":"Sm"},{"key":"2951","mappings":{"default":{"default":"arpón a la izquierda hacia arriba y abajo"}},"category":"Sm"},{"key":"2952","mappings":{"default":{"default":"leftwards harpoon to bar with barb upwards"}},"category":"Sm"},{"key":"2953","mappings":{"default":{"default":"rightwards harpoon to bar with barb upwards"}},"category":"Sm"},{"key":"2954","mappings":{"default":{"default":"upwards harpoon to bar with barb rightwards"}},"category":"Sm"},{"key":"2955","mappings":{"default":{"default":"downwards harpoon to bar with barb rightwards"}},"category":"Sm"},{"key":"2956","mappings":{"default":{"default":"leftwards harpoon to bar with barb downwards"}},"category":"Sm"},{"key":"2957","mappings":{"default":{"default":"rightwards harpoon to bar with barb downwards"}},"category":"Sm"},{"key":"2958","mappings":{"default":{"default":"upwards harpoon to bar with barb leftwards"}},"category":"Sm"},{"key":"2959","mappings":{"default":{"default":"downwards harpoon to bar with barb leftwards"}},"category":"Sm"},{"key":"295A","mappings":{"default":{"default":"leftwards harpoon from bar with barb upwards"}},"category":"Sm"},{"key":"295B","mappings":{"default":{"default":"rightwards harpoon from bar with barb upwards"}},"category":"Sm"},{"key":"295C","mappings":{"default":{"default":"upwards harpoon from bar with barb rightwards"}},"category":"Sm"},{"key":"295D","mappings":{"default":{"default":"downwards harpoon from bar with barb rightwards"}},"category":"Sm"},{"key":"295E","mappings":{"default":{"default":"leftwards harpoon from bar with barb downwards"}},"category":"Sm"},{"key":"295F","mappings":{"default":{"default":"rightwards harpoon from bar with barb downwards"}},"category":"Sm"},{"key":"2960","mappings":{"default":{"default":"upwards harpoon from bar with barb leftwards"}},"category":"Sm"},{"key":"2961","mappings":{"default":{"default":"downwards harpoon from bar with barb leftwards"}},"category":"Sm"},{"key":"2962","mappings":{"default":{"default":"leftwards harpoon with barb up above leftwards harpoon with barb down"}},"category":"Sm"},{"key":"2963","mappings":{"default":{"default":"upwards harpoon with barb left beside upwards harpoon with barb right"}},"category":"Sm"},{"key":"2964","mappings":{"default":{"default":"rightwards harpoon with barb up above rightwards harpoon with barb down"}},"category":"Sm"},{"key":"2965","mappings":{"default":{"default":"downwards harpoon with barb left beside downwards harpoon with barb right"}},"category":"Sm"},{"key":"2966","mappings":{"default":{"default":"leftwards harpoon with barb up above rightwards harpoon with barb up"}},"category":"Sm"},{"key":"2967","mappings":{"default":{"default":"leftwards harpoon with barb down above rightwards harpoon with barb down"}},"category":"Sm"},{"key":"2968","mappings":{"default":{"default":"rightwards harpoon with barb up above leftwards harpoon with barb up"}},"category":"Sm"},{"key":"2969","mappings":{"default":{"default":"rightwards harpoon with barb down above leftwards harpoon with barb down"}},"category":"Sm"},{"key":"296A","mappings":{"default":{"default":"barra con arpón hacia la izquierda"}},"category":"Sm"},{"key":"296B","mappings":{"default":{"default":"arpón hacia la izquierda con barra"}},"category":"Sm"},{"key":"296C","mappings":{"default":{"default":"barra con arpón hacia la derecha"}},"category":"Sm"},{"key":"296D","mappings":{"default":{"default":"arpón hacia la derecha con barra"}},"category":"Sm"},{"key":"296E","mappings":{"default":{"default":"upwards harpoon to the left of downwards harpoon"}},"category":"Sm"},{"key":"296F","mappings":{"default":{"default":"upwards harpoon to the right of downwards harpoon"}},"category":"Sm"},{"key":"297C","mappings":{"default":{"default":"left fish tail"}},"category":"Sm"},{"key":"297D","mappings":{"default":{"default":"right fish tail"}},"category":"Sm"},{"key":"297E","mappings":{"default":{"default":"barra con doble gancho"}},"category":"Sm"},{"key":"297F","mappings":{"default":{"default":"down fish tail"}},"category":"Sm"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_non_characters.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_non_characters.js
deleted file mode 100644
index 78d2cf01..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_non_characters.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"210F","mappings":{"default":{"default":"h barra"}},"category":"Ll"},{"key":"2116","mappings":{"default":{"default":"signo de número"}},"category":"So"},{"key":"2117","mappings":{"default":{"default":"derechos de autor de sonido"}},"category":"So"},{"key":"211E","mappings":{"default":{"default":"receta"}},"category":"So"},{"key":"2122","mappings":{"default":{"default":"registrado"}},"category":"So"},{"key":"2125","mappings":{"default":{"default":"onza"}},"category":"So"},{"key":"2126","mappings":{"default":{"default":"ohmio"}},"category":"Lu"},{"key":"2127","mappings":{"default":{"default":"ohmio invertido"}},"category":"So"},{"key":"212A","mappings":{"default":{"default":"grados kelvin"}},"category":"Lu"},{"key":"212B","mappings":{"default":{"default":"angstrom"}},"category":"Lu"},{"key":"2132","mappings":{"default":{"default":"mayúscula F invertida"}},"category":"Lu"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_symbols.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_symbols.js
deleted file mode 100644
index 47a70956..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_symbols.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"0021","mappings":{"default":{"default":"factorial"}},"category":"Po"},{"key":"0022","mappings":{"default":{"default":"comillas"}},"category":"Po"},{"key":"0023","mappings":{"default":{"default":"almuhadilla","defaultMP":"signo de número"}},"category":"Po"},{"key":"0024","mappings":{"default":{"default":"dólar"}},"category":"Sc"},{"key":"0025","mappings":{"default":{"default":"porciento"}},"category":"Po"},{"key":"0026","mappings":{"default":{"default":"ampersand"}},"category":"Po"},{"key":"0027","mappings":{"default":{"default":"prima","defaultMP":"apóstrofo"}},"category":"Po"},{"key":"002A","mappings":{"default":{"default":"por"}},"category":"Po"},{"key":"002B","mappings":{"default":{"default":"más"}},"category":"Sm"},{"key":"002C","mappings":{"default":{"default":"coma"}},"category":"Po"},{"key":"002D","mappings":{"default":{"default":"menos"}},"category":"Pd"},{"key":"002E","mappings":{"default":{"default":"punto"}},"category":"Po"},{"key":"002F","mappings":{"default":{"default":"barra oblicua"}},"category":"Po"},{"key":"003A","mappings":{"default":{"default":"dos puntos"}},"category":"Po"},{"key":"003B","mappings":{"default":{"default":"punto y coma"}},"category":"Po"},{"key":"003C","mappings":{"default":{"default":"menor que"}},"category":"Sm"},{"key":"003D","mappings":{"default":{"default":"igual"}},"category":"Sm"},{"key":"003E","mappings":{"default":{"default":"mayor que"}},"category":"Sm"},{"key":"003F","mappings":{"default":{"default":"interrogación derecho","defaultMP":"cierra interrogación"}},"category":"Po"},{"key":"0040","mappings":{"default":{"default":"arroba"}},"category":"Po"},{"key":"005C","mappings":{"default":{"default":"barra inversa"}},"category":"Po"},{"key":"005E","mappings":{"default":{"default":"circunflejo"}},"category":"Sk"},{"key":"005F","mappings":{"default":{"default":"subrayado"}},"category":"Pc"},{"key":"0060","mappings":{"default":{"default":"acento grave"}},"category":"Sk"},{"key":"007C","mappings":{"default":{"default":"barra vertical"}},"category":"Sm"},{"key":"007E","mappings":{"default":{"default":"tilde"}},"category":"Sm"},{"key":"00A1","mappings":{"default":{"default":"admiración izquierdo","defaultMP":"abre admiración"}},"category":"Po"},{"key":"00A2","mappings":{"default":{"default":"centavo"}},"category":"Sc"},{"key":"00A3","mappings":{"default":{"default":"libra esterlina"}},"category":"Sc"},{"key":"00A4","mappings":{"default":{"default":"moneda"}},"category":"Sc"},{"key":"00A5","mappings":{"default":{"default":"yen"}},"category":"Sc"},{"key":"00A6","mappings":{"default":{"default":"barra vertical partida"}},"category":"So"},{"key":"00A7","mappings":{"default":{"default":"sección"}},"category":"Po"},{"key":"00A8","mappings":{"default":{"default":"diéresis"}},"category":"Sk"},{"key":"00A9","mappings":{"default":{"default":"copyright"}},"category":"So"},{"key":"00AA","mappings":{"default":{"default":"ordinal femenino"}},"category":"Lo"},{"key":"00AB","mappings":{"default":{"default":"comillas angulares izquierda","defaultMP":"abre comillas angulares"}},"category":"Pi"},{"key":"00AC","mappings":{"default":{"default":"negación"}},"category":"Sm"},{"key":"00AE","mappings":{"default":{"default":"registrado"}},"category":"So"},{"key":"00AF","mappings":{"default":{"default":"barra"}},"category":"Sk"},{"key":"00B0","mappings":{"default":{"default":"grado"}},"category":"So"},{"key":"00B1","mappings":{"default":{"default":"más menos"}},"category":"Sm"},{"key":"00B4","mappings":{"default":{"default":"acento agudo"}},"category":"Sk"},{"key":"00B5","mappings":{"default":{"default":"micro"}},"category":"Ll"},{"key":"00B6","mappings":{"default":{"default":"párrafo"}},"category":"Po"},{"key":"00B7","mappings":{"default":{"default":"punto medio"}},"category":"Po"},{"key":"00B8","mappings":{"default":{"default":"cedilla"}},"category":"Sk"},{"key":"00BA","mappings":{"default":{"default":"ordinal masculino"}},"category":"Lo"},{"key":"00BB","mappings":{"default":{"default":"comillas angulares derecha","defaultMP":"cierra comillas angulares"}},"category":"Pf"},{"key":"00BF","mappings":{"default":{"default":"interrogación izquierdo","defaultMP":"abre interrogación"}},"category":"Po"},{"key":"00D7","mappings":{"default":{"default":"por"}},"category":"Sm"},{"key":"00F7","mappings":{"default":{"default":"dividido"}},"category":"Sm"},{"key":"02D8","mappings":{"default":{"default":"breve"}},"category":"Sk"},{"key":"02D9","mappings":{"default":{"default":"punto en superescrito"}},"category":"Sk"},{"key":"02DA","mappings":{"default":{"default":"anillo en superescrito"}},"category":"Sk"},{"key":"02DB","mappings":{"default":{"default":"ogonek"}},"category":"Sk"},{"key":"02DC","mappings":{"default":{"default":"tilde"}},"category":"Sk"},{"key":"02DD","mappings":{"default":{"default":"doble acento agudo"}},"category":"Sk"},{"key":"2010","mappings":{"default":{"default":"menos"}},"category":"Pd"},{"key":"2013","mappings":{"default":{"default":"en raya"}},"category":"Pd"},{"key":"2014","mappings":{"default":{"default":"em raya"}},"category":"Pd"},{"key":"2015","mappings":{"default":{"default":"barra horizontal"}},"category":"Pd"},{"key":"2016","mappings":{"default":{"default":"doble barra vertical"}},"category":"Po"},{"key":"2018","mappings":{"default":{"default":"comilla izquierda"}},"category":"Pi"},{"key":"2019","mappings":{"default":{"default":"comilla derecha"}},"category":"Pf"},{"key":"201A","mappings":{"default":{"default":"comilla bajo 9"}},"category":"Ps"},{"key":"201C","mappings":{"default":{"default":"doble comilla"}},"category":"Pi"},{"key":"201D","mappings":{"default":{"default":"doble comilla derecha"}},"category":"Pf"},{"key":"201E","mappings":{"default":{"default":"doble comilla bajo 9"}},"category":"Ps"},{"key":"2020","mappings":{"default":{"default":"daga"}},"category":"Po"},{"key":"2021","mappings":{"default":{"default":"doble daga"}},"category":"Po"},{"key":"2022","mappings":{"default":{"default":"bala"}},"category":"Po"},{"key":"2025","mappings":{"default":{"default":"dos puntos líder"}},"category":"Po"},{"key":"2026","mappings":{"default":{"default":"puntos suspensivos"}},"category":"Po"},{"key":"2030","mappings":{"default":{"default":"tanto por millar"}},"category":"Po"},{"key":"2031","mappings":{"default":{"default":"tanto por diez mil"}},"category":"Po"},{"key":"2032","mappings":{"default":{"default":"prima"}},"category":"Po"},{"key":"2033","mappings":{"default":{"default":"segunda"}},"category":"Po"},{"key":"2034","mappings":{"default":{"default":"tercera"}},"category":"Po"},{"key":"2035","mappings":{"default":{"default":"acento grave"}},"category":"Po"},{"key":"2036","mappings":{"default":{"default":"doble acento grave"}},"category":"Po"},{"key":"2039","mappings":{"default":{"default":"comillas izquierda","defaultMP":"abre comillas"}},"category":"Pi"},{"key":"203A","mappings":{"default":{"default":"comillas derecha","defaultMP":"cierra comillas"}},"category":"Pf"},{"key":"203E","mappings":{"default":{"default":"barra superior"}},"category":"Po"},{"key":"2040","mappings":{"default":{"default":"ligadura"}},"category":"Pc"},{"key":"2041","mappings":{"default":{"default":"punto de inserción"}},"category":"Po"},{"key":"2043","mappings":{"default":{"default":"guión bala"}},"category":"Po"},{"key":"2044","mappings":{"default":{"default":"barra de fracción"}},"category":"Sm"},{"key":"204F","mappings":{"default":{"default":"punto y coma invertido"}},"category":"Po"},{"key":"2050","mappings":{"default":{"default":"cierre superior"}},"category":"Po"},{"key":"2057","mappings":{"default":{"default":"cuarta"}},"category":"Po"},{"key":"2200","mappings":{"default":{"default":"para todo"}},"category":"Sm"},{"key":"2201","mappings":{"default":{"default":"complementario"}},"category":"Sm"},{"key":"2202","mappings":{"default":{"default":"derivada parcial"}},"category":"Sm"},{"key":"2203","mappings":{"default":{"default":"existe"}},"category":"Sm"},{"key":"2204","mappings":{"default":{"default":"no existe"}},"category":"Sm"},{"key":"2205","mappings":{"default":{"default":"conjunto vacío"}},"category":"Sm"},{"key":"2206","mappings":{"default":{"default":"incremento"}},"category":"Sm"},{"key":"2207","mappings":{"default":{"default":"gradiente"}},"category":"Sm"},{"key":"2208","mappings":{"default":{"default":"perteneciente a"}},"category":"Sm"},{"key":"2209","mappings":{"default":{"default":"no perteneciente a"}},"category":"Sm"},{"key":"220A","mappings":{"default":{"default":"perteneciente a"}},"category":"Sm"},{"key":"220B","mappings":{"default":{"default":"comprende a"}},"category":"Sm"},{"key":"220C","mappings":{"default":{"default":"no comprende a"}},"category":"Sm"},{"key":"220D","mappings":{"default":{"default":"comprende a"}},"category":"Sm"},{"key":"220E","mappings":{"default":{"default":"fin de demostración"}},"category":"Sm"},{"key":"220F","mappings":{"default":{"default":"producto"}},"category":"Sm"},{"key":"2210","mappings":{"default":{"default":"coproducto"}},"category":"Sm"},{"key":"2211","mappings":{"default":{"default":"sumatorio"}},"category":"Sm"},{"key":"2212","mappings":{"default":{"default":"menos"}},"category":"Sm"},{"key":"2213","mappings":{"default":{"default":"menos más"}},"category":"Sm"},{"key":"2214","mappings":{"default":{"default":"punto más"}},"category":"Sm"},{"key":"2215","mappings":{"default":{"default":"barra de división"}},"category":"Sm"},{"key":"2216","mappings":{"default":{"default":"menos"}},"category":"Sm"},{"key":"2217","mappings":{"default":{"default":"asterisco"}},"category":"Sm"},{"key":"2218","mappings":{"default":{"default":"composición"}},"category":"Sm"},{"key":"2219","mappings":{"default":{"default":"bala"}},"category":"Sm"},{"key":"221A","mappings":{"default":{"default":"raíz"}},"category":"Sm"},{"key":"221B","mappings":{"default":{"default":"raíz cúbica"}},"category":"Sm"},{"key":"221C","mappings":{"default":{"default":"raíz cuarta"}},"category":"Sm"},{"key":"221D","mappings":{"default":{"default":"proporcional a"}},"category":"Sm"},{"key":"221E","mappings":{"default":{"default":"infinito"}},"category":"Sm"},{"key":"221F","mappings":{"default":{"default":"ángulo recto"}},"category":"Sm"},{"key":"2220","mappings":{"default":{"default":"ángulo"}},"category":"Sm"},{"key":"2221","mappings":{"default":{"default":"ángulo medido"}},"category":"Sm"},{"key":"2222","mappings":{"default":{"default":"ángulo esférico"}},"category":"Sm"},{"key":"2223","mappings":{"default":{"default":"divide a"}},"category":"Sm"},{"key":"2224","mappings":{"default":{"default":"no divide a"}},"category":"Sm"},{"key":"2225","mappings":{"default":{"default":"paralela a"}},"category":"Sm"},{"key":"2226","mappings":{"default":{"default":"no paralela a"}},"category":"Sm"},{"key":"2227","mappings":{"default":{"default":"y"}},"category":"Sm"},{"key":"2228","mappings":{"default":{"default":"o"}},"category":"Sm"},{"key":"2229","mappings":{"default":{"default":"intersección"}},"category":"Sm"},{"key":"222A","mappings":{"default":{"default":"unión"}},"category":"Sm"},{"key":"222B","mappings":{"default":{"default":"integral"}},"category":"Sm"},{"key":"222C","mappings":{"default":{"default":"integral doble"}},"category":"Sm"},{"key":"222D","mappings":{"default":{"default":"integral triple"}},"category":"Sm"},{"key":"222E","mappings":{"default":{"default":"integral de contorno"}},"category":"Sm"},{"key":"222F","mappings":{"default":{"default":"integral de superficie"}},"category":"Sm"},{"key":"2230","mappings":{"default":{"default":"integral de volumen"}},"category":"Sm"},{"key":"2231","mappings":{"default":{"default":"integral de contorno en sentido horario"}},"category":"Sm"},{"key":"2232","mappings":{"default":{"default":"integral de contorno en sentido horario"}},"category":"Sm"},{"key":"2233","mappings":{"default":{"default":"integral de contorno en sentido antihorario"}},"category":"Sm"},{"key":"2234","mappings":{"default":{"default":"por lo tanto"}},"category":"Sm"},{"key":"2235","mappings":{"default":{"default":"porque"}},"category":"Sm"},{"key":"2236","mappings":{"default":{"default":"razón"}},"category":"Sm"},{"key":"2237","mappings":{"default":{"default":"proporción"}},"category":"Sm"},{"key":"2238","mappings":{"default":{"default":"punto menos"}},"category":"Sm"},{"key":"2239","mappings":{"default":{"default":"exceso"}},"category":"Sm"},{"key":"223A","mappings":{"default":{"default":"proporción geométrica"}},"category":"Sm"},{"key":"223B","mappings":{"default":{"default":"homotecia"}},"category":"Sm"},{"key":"223C","mappings":{"default":{"default":"tilde"}},"category":"Sm"},{"key":"223D","mappings":{"default":{"default":"tilde invertido"}},"category":"Sm"},{"key":"223E","mappings":{"default":{"default":"s horizontal invertida"}},"category":"Sm"},{"key":"223F","mappings":{"default":{"default":"sinusoide"}},"category":"Sm"},{"key":"2240","mappings":{"default":{"default":"producto de guirnalda"}},"category":"Sm"},{"key":"2241","mappings":{"default":{"default":"no tilde"}},"category":"Sm"},{"key":"2242","mappings":{"default":{"default":"menos tilde"}},"category":"Sm"},{"key":"2243","mappings":{"default":{"default":"asintóticamente igual a"}},"category":"Sm"},{"key":"2244","mappings":{"default":{"default":"no asintóticamente igual a"}},"category":"Sm"},{"key":"2245","mappings":{"default":{"default":"aproximadamente igual a"}},"category":"Sm"},{"key":"2246","mappings":{"default":{"default":"aproximado pero no igual a"}},"category":"Sm"},{"key":"2247","mappings":{"default":{"default":"no aproximado a"}},"category":"Sm"},{"key":"2248","mappings":{"default":{"default":"aproximado","defaultMP":"casi igual a"}},"category":"Sm"},{"key":"2249","mappings":{"default":{"default":"no es casi igual a"}},"category":"Sm"},{"key":"224A","mappings":{"default":{"default":"igual o casi igual a"}},"category":"Sm"},{"key":"224B","mappings":{"default":{"default":"triple tilde"}},"category":"Sm"},{"key":"224C","mappings":{"default":{"default":"todo igual a"}},"category":"Sm"},{"key":"224D","mappings":{"default":{"default":"equivalente a"}},"category":"Sm"},{"key":"224E","mappings":{"default":{"default":"geométricamente equivalente a"}},"category":"Sm"},{"key":"224F","mappings":{"default":{"default":"diferencia entre"}},"category":"Sm"},{"key":"2250","mappings":{"default":{"default":"se acerca al límite"}},"category":"Sm"},{"key":"2251","mappings":{"default":{"default":"geométricamente igual a"}},"category":"Sm"},{"key":"2252","mappings":{"default":{"default":"aproximadamente igual a o imagen de"}},"category":"Sm"},{"key":"2253","mappings":{"default":{"default":"imagen de o aproximadamente igual a"}},"category":"Sm"},{"key":"2254","mappings":{"default":{"default":"dos puntos igual"}},"category":"Sm"},{"key":"2255","mappings":{"default":{"default":"igual dos puntos"}},"category":"Sm"},{"key":"2256","mappings":{"default":{"default":"igual incluyendo anillo"}},"category":"Sm"},{"key":"2257","mappings":{"default":{"default":"igual anillo a"}},"category":"Sm"},{"key":"2258","mappings":{"default":{"default":"corresponde a"}},"category":"Sm"},{"key":"2259","mappings":{"default":{"default":"estima a"}},"category":"Sm"},{"key":"225A","mappings":{"default":{"default":"equiangular con"}},"category":"Sm"},{"key":"225B","mappings":{"default":{"default":"igual con estrella"}},"category":"Sm"},{"key":"225C","mappings":{"default":{"default":"igual con delta"}},"category":"Sm"},{"key":"225D","mappings":{"default":{"default":"igual por definición a"}},"category":"Sm"},{"key":"225E","mappings":{"default":{"default":"medido por"}},"category":"Sm"},{"key":"225F","mappings":{"default":{"default":"igual con interrogante"}},"category":"Sm"},{"key":"2260","mappings":{"default":{"default":"no es igual a","defaultMP":"distinto de"}},"category":"Sm"},{"key":"2261","mappings":{"default":{"default":"idéntico a"}},"category":"Sm"},{"key":"2262","mappings":{"default":{"default":"no es idéntico a"}},"category":"Sm"},{"key":"2263","mappings":{"default":{"default":"estrictamente equivalente a"}},"category":"Sm"},{"key":"2264","mappings":{"default":{"default":"menor o igual que"}},"category":"Sm"},{"key":"2265","mappings":{"default":{"default":"mayor o igual que"}},"category":"Sm"},{"key":"2266","mappings":{"default":{"default":"menor o igual que"}},"category":"Sm"},{"key":"2267","mappings":{"default":{"default":"mayor o igual que"}},"category":"Sm"},{"key":"2268","mappings":{"default":{"default":"estrictamente menor que"}},"category":"Sm"},{"key":"2269","mappings":{"default":{"default":"estrictamente mayor que"}},"category":"Sm"},{"key":"226A","mappings":{"default":{"default":"mucho menor que"}},"category":"Sm"},{"key":"226B","mappings":{"default":{"default":"mucho mayor que"}},"category":"Sm"},{"key":"226C","mappings":{"default":{"default":"entre"}},"category":"Sm"},{"key":"226D","mappings":{"default":{"default":"no equivalente a"}},"category":"Sm"},{"key":"226E","mappings":{"default":{"default":"no menor que"}},"category":"Sm"},{"key":"226F","mappings":{"default":{"default":"no mayor que"}},"category":"Sm"},{"key":"2270","mappings":{"default":{"default":"no menor ni igual a"}},"category":"Sm"},{"key":"2271","mappings":{"default":{"default":"no mayor ni igual a"}},"category":"Sm"},{"key":"2272","mappings":{"default":{"default":"menor o equivalente a"}},"category":"Sm"},{"key":"2273","mappings":{"default":{"default":"mayor o equivalente a"}},"category":"Sm"},{"key":"2274","mappings":{"default":{"default":"no menor ni equivalente a"}},"category":"Sm"},{"key":"2275","mappings":{"default":{"default":"no mayor ni equivalente a"}},"category":"Sm"},{"key":"2276","mappings":{"default":{"default":"menor o mayor que"}},"category":"Sm"},{"key":"2277","mappings":{"default":{"default":"mayor o menor que"}},"category":"Sm"},{"key":"2278","mappings":{"default":{"default":"no menor ni mayor que"}},"category":"Sm"},{"key":"2279","mappings":{"default":{"default":"no mayor ni menor que"}},"category":"Sm"},{"key":"227A","mappings":{"default":{"default":"precede a"}},"category":"Sm"},{"key":"227B","mappings":{"default":{"default":"sigue a"}},"category":"Sm"},{"key":"227C","mappings":{"default":{"default":"precede o es igual a"}},"category":"Sm"},{"key":"227D","mappings":{"default":{"default":"sigue o es igual a"}},"category":"Sm"},{"key":"227E","mappings":{"default":{"default":"precede o es equivalente a"}},"category":"Sm"},{"key":"227F","mappings":{"default":{"default":"sigue o es equivalente a"}},"category":"Sm"},{"key":"2280","mappings":{"default":{"default":"no precede a"}},"category":"Sm"},{"key":"2281","mappings":{"default":{"default":"no sigue a"}},"category":"Sm"},{"key":"2282","mappings":{"default":{"default":"incluido en"}},"category":"Sm"},{"key":"2283","mappings":{"default":{"default":"contiene a"}},"category":"Sm"},{"key":"2284","mappings":{"default":{"default":"no incluido en"}},"category":"Sm"},{"key":"2285","mappings":{"default":{"default":"no contiene a"}},"category":"Sm"},{"key":"2286","mappings":{"default":{"default":"incluido o igual a"}},"category":"Sm"},{"key":"2287","mappings":{"default":{"default":"contiene o es igual a"}},"category":"Sm"},{"key":"2288","mappings":{"default":{"default":"no incluido ni igual a"}},"category":"Sm"},{"key":"2289","mappings":{"default":{"default":"no contiene ni es igual a"}},"category":"Sm"},{"key":"228A","mappings":{"default":{"default":"incluido estrictamente en"}},"category":"Sm"},{"key":"228B","mappings":{"default":{"default":"contiene estrictamente a"}},"category":"Sm"},{"key":"228C","mappings":{"default":{"default":"familia de conjuntos"}},"category":"Sm"},{"key":"228D","mappings":{"default":{"default":"producto de familia de conjuntos"}},"category":"Sm"},{"key":"228E","mappings":{"default":{"default":"unión de familia de conjuntos"}},"category":"Sm"},{"key":"228F","mappings":{"default":{"default":"imagen cuadrada de"}},"category":"Sm"},{"key":"2290","mappings":{"default":{"default":"original cuadrado de"}},"category":"Sm"},{"key":"2291","mappings":{"default":{"default":"imagen cuadrada de o igual a"}},"category":"Sm"},{"key":"2292","mappings":{"default":{"default":"original cuadrado de o igual a"}},"category":"Sm"},{"key":"2293","mappings":{"default":{"default":"intersección cuadrada"}},"category":"Sm"},{"key":"2294","mappings":{"default":{"default":"unión cuadrada"}},"category":"Sm"},{"key":"2295","mappings":{"default":{"default":"más en círculo"}},"category":"Sm"},{"key":"2296","mappings":{"default":{"default":"menos en círculo"}},"category":"Sm"},{"key":"2297","mappings":{"default":{"default":"por en círculo"}},"category":"Sm"},{"key":"2298","mappings":{"default":{"default":"barra en círculo"}},"category":"Sm"},{"key":"2299","mappings":{"default":{"default":"punto en círculo"}},"category":"Sm"},{"key":"229A","mappings":{"default":{"default":"anillo en círculo"}},"category":"Sm"},{"key":"229B","mappings":{"default":{"default":"asterisco en círculo"}},"category":"Sm"},{"key":"229C","mappings":{"default":{"default":"igual en círculo"}},"category":"Sm"},{"key":"229D","mappings":{"default":{"default":"menos en círculo"}},"category":"Sm"},{"key":"229E","mappings":{"default":{"default":"más en cuadrado"}},"category":"Sm"},{"key":"229F","mappings":{"default":{"default":"menos en cuadrado"}},"category":"Sm"},{"key":"22A0","mappings":{"default":{"default":"veces en cuadrado"}},"category":"Sm"},{"key":"22A1","mappings":{"default":{"default":"punto en cuadrado"}},"category":"Sm"},{"key":"22A2","mappings":{"default":{"default":"t horizontal hacia la izquierda"}},"category":"Sm"},{"key":"22A3","mappings":{"default":{"default":"t horizontal hacia la derecha"}},"category":"Sm"},{"key":"22A4","mappings":{"default":{"default":"perpendicular"}},"category":"Sm"},{"key":"22A5","mappings":{"default":{"default":"perpendicular invertida"}},"category":"Sm"},{"key":"22A6","mappings":{"default":{"default":"afirmación"}},"category":"Sm"},{"key":"22A7","mappings":{"default":{"default":"modela"}},"category":"Sm"},{"key":"22A8","mappings":{"default":{"default":"verdadero"}},"category":"Sm"},{"key":"22A9","mappings":{"default":{"default":"obliga"}},"category":"Sm"},{"key":"22AA","mappings":{"default":{"default":"triple barra vertical torniquete derecho"}},"category":"Sm"},{"key":"22AB","mappings":{"default":{"default":"doble barra vertical doble torniquete derecho"}},"category":"Sm"},{"key":"22AC","mappings":{"default":{"default":"no prueba"}},"category":"Sm"},{"key":"22AD","mappings":{"default":{"default":"falso"}},"category":"Sm"},{"key":"22AE","mappings":{"default":{"default":"no obliga"}},"category":"Sm"},{"key":"22AF","mappings":{"default":{"default":"doble barra vertical doble torniquete derecho negada"}},"category":"Sm"},{"key":"22B0","mappings":{"default":{"default":"precede respecto de"}},"category":"Sm"},{"key":"22B1","mappings":{"default":{"default":"sigue respecto de"}},"category":"Sm"},{"key":"22B2","mappings":{"default":{"default":"subgrupo normal de"}},"category":"Sm"},{"key":"22B3","mappings":{"default":{"default":"contiene como subgrupo normal a"}},"category":"Sm"},{"key":"22B4","mappings":{"default":{"default":"subgrupo normal o es igual a"}},"category":"Sm"},{"key":"22B5","mappings":{"default":{"default":"contiene como subgrupo normal o es igual a"}},"category":"Sm"},{"key":"22B6","mappings":{"default":{"default":"original de"}},"category":"Sm"},{"key":"22B7","mappings":{"default":{"default":"imagen de"}},"category":"Sm"},{"key":"22B8","mappings":{"default":{"default":"multifunción"}},"category":"Sm"},{"key":"22B9","mappings":{"default":{"default":"matriz hermitiana conjugada"}},"category":"Sm"},{"key":"22BA","mappings":{"default":{"default":"interpola"}},"category":"Sm"},{"key":"22BB","mappings":{"default":{"default":"o excluyente"}},"category":"Sm"},{"key":"22BC","mappings":{"default":{"default":"no y"}},"category":"Sm"},{"key":"22BD","mappings":{"default":{"default":"no o"}},"category":"Sm"},{"key":"22BF","mappings":{"default":{"default":"triángulo rectángulo"}},"category":"Sm"},{"key":"22C0","mappings":{"default":{"default":"y"}},"category":"Sm"},{"key":"22C1","mappings":{"default":{"default":"o"}},"category":"Sm"},{"key":"22C2","mappings":{"default":{"default":"intersección"}},"category":"Sm"},{"key":"22C3","mappings":{"default":{"default":"unión"}},"category":"Sm"},{"key":"22C4","mappings":{"default":{"default":"operador diamante"}},"category":"Sm"},{"key":"22C5","mappings":{"default":{"default":"punto"}},"category":"Sm"},{"key":"22C6","mappings":{"default":{"default":"estrella"}},"category":"Sm"},{"key":"22C7","mappings":{"default":{"default":"dividido por"}},"category":"Sm"},{"key":"22C8","mappings":{"default":{"default":"moño"}},"category":"Sm"},{"key":"22C9","mappings":{"default":{"default":"factor normal izquierdo producto semidirecto"}},"category":"Sm"},{"key":"22CA","mappings":{"default":{"default":"factor normal derecho producto semidirecto"}},"category":"Sm"},{"key":"22CB","mappings":{"default":{"default":"producto semidirecto izquierdo"}},"category":"Sm"},{"key":"22CC","mappings":{"default":{"default":"producto semidirecto derecho"}},"category":"Sm"},{"key":"22CD","mappings":{"default":{"default":"tilde invertida igual a"}},"category":"Sm"},{"key":"22CE","mappings":{"default":{"default":"o rizada"}},"category":"Sm"},{"key":"22CF","mappings":{"default":{"default":"y rizada"}},"category":"Sm"},{"key":"22D0","mappings":{"default":{"default":"doble incluido"}},"category":"Sm"},{"key":"22D1","mappings":{"default":{"default":"doble contiene"}},"category":"Sm"},{"key":"22D2","mappings":{"default":{"default":"doble intersección"}},"category":"Sm"},{"key":"22D3","mappings":{"default":{"default":"doble unión"}},"category":"Sm"},{"key":"22D4","mappings":{"default":{"default":"bieldo"}},"category":"Sm"},{"key":"22D5","mappings":{"default":{"default":"paralela o igual a"}},"category":"Sm"},{"key":"22D6","mappings":{"default":{"default":"menor que con punto"}},"category":"Sm"},{"key":"22D7","mappings":{"default":{"default":"mayor que con punto"}},"category":"Sm"},{"key":"22D8","mappings":{"default":{"default":"mucho menor que"}},"category":"Sm"},{"key":"22D9","mappings":{"default":{"default":"mucho mayor que"}},"category":"Sm"},{"key":"22DA","mappings":{"default":{"default":"menor igual o mayor que"}},"category":"Sm"},{"key":"22DB","mappings":{"default":{"default":"mayor igual o menor que"}},"category":"Sm"},{"key":"22DC","mappings":{"default":{"default":"menor o igual que"}},"category":"Sm"},{"key":"22DD","mappings":{"default":{"default":"mayor o igual que"}},"category":"Sm"},{"key":"22DE","mappings":{"default":{"default":"precede o es igual a"}},"category":"Sm"},{"key":"22DF","mappings":{"default":{"default":"sigue o es igual a"}},"category":"Sm"},{"key":"22E0","mappings":{"default":{"default":"no precede ni es igual a"}},"category":"Sm"},{"key":"22E1","mappings":{"default":{"default":"no sigue ni es igual a"}},"category":"Sm"},{"key":"22E2","mappings":{"default":{"default":"no es imagen cuadrada ni igual a"}},"category":"Sm"},{"key":"22E3","mappings":{"default":{"default":"no es original cuadrada ni igual a"}},"category":"Sm"},{"key":"22E4","mappings":{"default":{"default":"imagen cuadrada estricta"}},"category":"Sm"},{"key":"22E5","mappings":{"default":{"default":"original cuadrada estricta"}},"category":"Sm"},{"key":"22E6","mappings":{"default":{"default":"menor que no equivalente a"}},"category":"Sm"},{"key":"22E7","mappings":{"default":{"default":"mayor que no equivalente a"}},"category":"Sm"},{"key":"22E8","mappings":{"default":{"default":"precede no equivalente a"}},"category":"Sm"},{"key":"22E9","mappings":{"default":{"default":"sigue no equivalente a"}},"category":"Sm"},{"key":"22EA","mappings":{"default":{"default":"no subgrupo normal de"}},"category":"Sm"},{"key":"22EB","mappings":{"default":{"default":"no contiene como subgrupo normal a"}},"category":"Sm"},{"key":"22EC","mappings":{"default":{"default":"no es subgrupo normal ni igual a"}},"category":"Sm"},{"key":"22ED","mappings":{"default":{"default":"no contiene como subgrupo normal ni es igual a"}},"category":"Sm"},{"key":"22EE","mappings":{"default":{"default":"puntos suspensivos verticales"}},"category":"Sm"},{"key":"22EF","mappings":{"default":{"default":"puntos suspensivos altos"}},"category":"Sm"},{"key":"22F0","mappings":{"default":{"default":"puntos suspensivos diagonales subiendo"}},"category":"Sm"},{"key":"22F1","mappings":{"default":{"default":"puntos suspensivos diagonales bajando"}},"category":"Sm"},{"key":"22F2","mappings":{"default":{"default":"pertenece con trazo horizontal"}},"category":"Sm"},{"key":"22F3","mappings":{"default":{"default":"pertenece con barra vertical al fin de raya horizontal"}},"category":"Sm"},{"key":"22F4","mappings":{"default":{"default":"pertenece en pequeño con trazo vertical"}},"category":"Sm"},{"key":"22F5","mappings":{"default":{"default":"pertenece con punto arriba"}},"category":"Sm"},{"key":"22F6","mappings":{"default":{"default":"pertenece con barra arriba"}},"category":"Sm"},{"key":"22F7","mappings":{"default":{"default":"perteneciente subrayado"}},"category":"Sm"},{"key":"22F8","mappings":{"default":{"default":"perteneciente subrayado"}},"category":"Sm"},{"key":"22F9","mappings":{"default":{"default":"pertenece con dos trazos horizontales"}},"category":"Sm"},{"key":"22FA","mappings":{"default":{"default":"contiene o es igual a"}},"category":"Sm"},{"key":"22FB","mappings":{"default":{"default":"contiene con marca"}},"category":"Sm"},{"key":"22FC","mappings":{"default":{"default":"contiene con marca"}},"category":"Sm"},{"key":"22FD","mappings":{"default":{"default":"contiene con barra"}},"category":"Sm"},{"key":"22FE","mappings":{"default":{"default":"perteneciente con barra"}},"category":"Sm"},{"key":"22FF","mappings":{"default":{"default":"z anotación asociación de bolsa"}},"category":"Sm"},{"key":"2300","mappings":{"default":{"default":"diámetro"}},"category":"So"},{"key":"2302","mappings":{"default":{"default":"casa"}},"category":"So"},{"key":"2305","mappings":{"default":{"default":"en proyectividad con"}},"category":"So"},{"key":"2306","mappings":{"default":{"default":"en perspectividad con"}},"category":"So"},{"key":"2310","mappings":{"default":{"default":"no invertido"}},"category":"So"},{"key":"2312","mappings":{"default":{"default":"arco"}},"category":"So"},{"key":"2313","mappings":{"default":{"default":"segmento"}},"category":"So"},{"key":"27C1","mappings":{"default":{"default":"triángulo encerrando triángulo"}},"category":"Sm"},{"key":"27C2","mappings":{"default":{"default":"perpendicular"}},"category":"Sm"},{"key":"27C3","mappings":{"default":{"default":"incluido en"}},"category":"Sm"},{"key":"27C4","mappings":{"default":{"default":"contiene a"}},"category":"Sm"},{"key":"27C7","mappings":{"default":{"default":"punto en círculo"}},"category":"Sm"},{"key":"27C8","mappings":{"default":{"default":"atrás tajo antes de subconjunto"}},"category":"Sm"},{"key":"27C9","mappings":{"default":{"default":"sobreconjunto antes de tajo"}},"category":"Sm"},{"key":"27CA","mappings":{"default":{"default":"barra vertical con golpe horizontal"}},"category":"Sm"},{"key":"27CC","mappings":{"default":{"default":"división larga"}},"category":"Sm"},{"key":"27D1","mappings":{"default":{"default":"y con punto interior"}},"category":"Sm"},{"key":"27D2","mappings":{"default":{"default":"elemento de apertura hacia arriba"}},"category":"Sm"},{"key":"27D3","mappings":{"default":{"default":"ángulo inferior derecho con punto"}},"category":"Sm"},{"key":"27D4","mappings":{"default":{"default":"ángulo inferior izquierdo con punto"}},"category":"Sm"},{"key":"27D5","mappings":{"default":{"default":"izquierdo exterior une"}},"category":"Sm"},{"key":"27D6","mappings":{"default":{"default":"derecho exterior une"}},"category":"Sm"},{"key":"27D7","mappings":{"default":{"default":"lleno exterior une"}},"category":"Sm"},{"key":"27D8","mappings":{"default":{"default":"perpendicular inversa"}},"category":"Sm"},{"key":"27D9","mappings":{"default":{"default":"perpendicular"}},"category":"Sm"},{"key":"27DA","mappings":{"default":{"default":"izquierdo y derecho doble torniquete"}},"category":"Sm"},{"key":"27DB","mappings":{"default":{"default":"doble T horizontal"}},"category":"Sm"},{"key":"27DC","mappings":{"default":{"default":"multifunción por la izquierda"}},"category":"Sm"},{"key":"27DD","mappings":{"default":{"default":"T horizontal derecha larga"}},"category":"Sm"},{"key":"27DE","mappings":{"default":{"default":"T horizontal izquierda larga"}},"category":"Sm"},{"key":"27DF","mappings":{"default":{"default":"perpendicular inversa con círculo arriba"}},"category":"Sm"},{"key":"27E0","mappings":{"default":{"default":"pastilla dividida por regla horizontal"}},"category":"Sm"},{"key":"27E1","mappings":{"default":{"default":"diamante cóncavo vacío"}},"category":"Sm"},{"key":"27E2","mappings":{"default":{"default":"diamante cóncavo con tictac hacia izquierda"}},"category":"Sm"},{"key":"27E3","mappings":{"default":{"default":"diamante cóncavo con tictac hacia derecha"}},"category":"Sm"},{"key":"27E4","mappings":{"default":{"default":"cuadrado con tictac hacia izquierda"}},"category":"Sm"},{"key":"27E5","mappings":{"default":{"default":"cuadrado con tictac hacia derecha"}},"category":"Sm"},{"key":"299A","mappings":{"default":{"default":"zigzag en vertical"}},"category":"Sm"},{"key":"29B0","mappings":{"default":{"default":"conjunto vacío invertido"}},"category":"Sm"},{"key":"29B1","mappings":{"default":{"default":"conjunto vacío con barra"}},"category":"Sm"},{"key":"29B2","mappings":{"default":{"default":"conjunto vacío con círculo"}},"category":"Sm"},{"key":"29B5","mappings":{"default":{"default":"círculo con barra"}},"category":"Sm"},{"key":"29B6","mappings":{"default":{"default":"barra en círculo"}},"category":"Sm"},{"key":"29B7","mappings":{"default":{"default":"paralelas en círculo"}},"category":"Sm"},{"key":"29B9","mappings":{"default":{"default":"perpendicular en círculo"}},"category":"Sm"},{"key":"29BB","mappings":{"default":{"default":"x superimpresa en círculo"}},"category":"Sm"},{"key":"29BC","mappings":{"default":{"default":"circled anticlockwise rotated division"}},"category":"Sm"},{"key":"29BE","mappings":{"default":{"default":"bullet vacía en círculo"}},"category":"Sm"},{"key":"29BF","mappings":{"default":{"default":"bullet en círculo"}},"category":"Sm"},{"key":"29C0","mappings":{"default":{"default":"menor que en círculo"}},"category":"Sm"},{"key":"29C1","mappings":{"default":{"default":"mayor que en círculo"}},"category":"Sm"},{"key":"29C2","mappings":{"default":{"default":"círculo con círculo a la derecha"}},"category":"Sm"},{"key":"29C3","mappings":{"default":{"default":"circle with two horizontal strokes to the right"}},"category":"Sm"},{"key":"29C4","mappings":{"default":{"default":"cuadrado con diagonal ascendente"}},"category":"Sm"},{"key":"29C5","mappings":{"default":{"default":"cuadrado con diagonal descendente"}},"category":"Sm"},{"key":"29C9","mappings":{"default":{"default":"dos cuadrados unidos"}},"category":"Sm"},{"key":"29CD","mappings":{"default":{"default":"triangle with serifs at bottom"}},"category":"Sm"},{"key":"29CE","mappings":{"default":{"default":"triángulo hacia la derecha sobre triángulo hacia la izquierda"}},"category":"Sm"},{"key":"29CF","mappings":{"default":{"default":"subgrupo normal o igual a"}},"category":"Sm"},{"key":"29D0","mappings":{"default":{"default":"contiene como subgrupo normal o es igual a"}},"category":"Sm"},{"key":"29DC","mappings":{"default":{"default":"infinito incompleto"}},"category":"Sm"},{"key":"29DE","mappings":{"default":{"default":"no infinito"}},"category":"Sm"},{"key":"29E3","mappings":{"default":{"default":"igual tachado doble "}},"category":"Sm"},{"key":"29E4","mappings":{"default":{"default":"igual con tilde, con doble tachado"}},"category":"Sm"},{"key":"29E5","mappings":{"default":{"default":"idéntico a con doble tachado"}},"category":"Sm"},{"key":"29EB","mappings":{"default":{"default":"rombo relleno"}},"category":"Sm"},{"key":"29F4","mappings":{"default":{"default":"rule delayed"}},"category":"Sm"},{"key":"29F6","mappings":{"default":{"default":"solidus with overbar"}},"category":"Sm"},{"key":"2A0C","mappings":{"default":{"default":"operador integral cuádruple"}},"category":"Sm"},{"key":"2A0D","mappings":{"default":{"default":"finite part integral"}},"category":"Sm"},{"key":"2A10","mappings":{"default":{"default":"circulation function"}},"category":"Sm"},{"key":"2A11","mappings":{"default":{"default":"integral en sentido antihorario"}},"category":"Sm"},{"key":"2A12","mappings":{"default":{"default":"integral lineal para rectángulo en polo"}},"category":"Sm"},{"key":"2A13","mappings":{"default":{"default":"integral lineal para semicírculo en polo"}},"category":"Sm"},{"key":"2A14","mappings":{"default":{"default":"integral lineal excluyendo el polo"}},"category":"Sm"},{"key":"2A15","mappings":{"default":{"default":"integral en torno de un punto operador"}},"category":"Sm"},{"key":"2A16","mappings":{"default":{"default":"operador integral para cuaterniones"}},"category":"Sm"},{"key":"2A22","mappings":{"default":{"default":"más con círculo"}},"category":"Sm"},{"key":"2A23","mappings":{"default":{"default":"más con ángulo"}},"category":"Sm"},{"key":"2A24","mappings":{"default":{"default":"tilde con más suscrito"}},"category":"Sm"},{"key":"2A25","mappings":{"default":{"default":"más con punto inferior"}},"category":"Sm"},{"key":"2A26","mappings":{"default":{"default":"tilde con más"}},"category":"Sm"},{"key":"2A27","mappings":{"default":{"default":"más con 2 suscrito"}},"category":"Sm"},{"key":"2A29","mappings":{"default":{"default":"menos con coma"}},"category":"Sm"},{"key":"2A2A","mappings":{"default":{"default":"menos con punto inferior"}},"category":"Sm"},{"key":"2A2D","mappings":{"default":{"default":"más en semicírculo izquierdo"}},"category":"Sm"},{"key":"2A2E","mappings":{"default":{"default":"más en semicírculo derecho"}},"category":"Sm"},{"key":"2A2F","mappings":{"default":{"default":"producto vectorial"}},"category":"Sm"},{"key":"2A30","mappings":{"default":{"default":"por con punto"}},"category":"Sm"},{"key":"2A31","mappings":{"default":{"default":"por con subrayado"}},"category":"Sm"},{"key":"2A33","mappings":{"default":{"default":"smash product"}},"category":"Sm"},{"key":"2A34","mappings":{"default":{"default":"por en semicírculo izquierdo"}},"category":"Sm"},{"key":"2A35","mappings":{"default":{"default":"por en semicírculo derecho"}},"category":"Sm"},{"key":"2A36","mappings":{"default":{"default":"por en círculo con ángulo"}},"category":"Sm"},{"key":"2A37","mappings":{"default":{"default":"por en anillo"}},"category":"Sm"},{"key":"2A38","mappings":{"default":{"default":"división en círculo"}},"category":"Sm"},{"key":"2A39","mappings":{"default":{"default":"más en triángulo"}},"category":"Sm"},{"key":"2A3A","mappings":{"default":{"default":"menos en triángulo"}},"category":"Sm"},{"key":"2A3B","mappings":{"default":{"default":"por en triángulo"}},"category":"Sm"},{"key":"2A3C","mappings":{"default":{"default":"producto interior"}},"category":"Sm"},{"key":"2A3F","mappings":{"default":{"default":"coproducto"}},"category":"Sm"},{"key":"2A40","mappings":{"default":{"default":"intersección con punto"}},"category":"Sm"},{"key":"2A42","mappings":{"default":{"default":"unión con barra"}},"category":"Sm"},{"key":"2A43","mappings":{"default":{"default":"intersección con barra"}},"category":"Sm"},{"key":"2A44","mappings":{"default":{"default":"intersección con and"}},"category":"Sm"},{"key":"2A45","mappings":{"default":{"default":"unión con or"}},"category":"Sm"},{"key":"2A46","mappings":{"default":{"default":"unión sobre intersección"}},"category":"Sm"},{"key":"2A47","mappings":{"default":{"default":"intersección sobre unión"}},"category":"Sm"},{"key":"2A48","mappings":{"default":{"default":"unión sobre barra, sobre intersección"}},"category":"Sm"},{"key":"2A49","mappings":{"default":{"default":"intersección sobre barra, sobre unión "}},"category":"Sm"},{"key":"2A4A","mappings":{"default":{"default":"unión y unión"}},"category":"Sm"},{"key":"2A4B","mappings":{"default":{"default":"intersección e intersección"}},"category":"Sm"},{"key":"2A4C","mappings":{"default":{"default":"unión cerrada"}},"category":"Sm"},{"key":"2A4D","mappings":{"default":{"default":"intersección cerrada"}},"category":"Sm"},{"key":"2A50","mappings":{"default":{"default":"unión cerrada con por"}},"category":"Sm"},{"key":"2A53","mappings":{"default":{"default":"y"}},"category":"Sm"},{"key":"2A54","mappings":{"default":{"default":"o"}},"category":"Sm"},{"key":"2A55","mappings":{"default":{"default":"two intersecting logical and"}},"category":"Sm"},{"key":"2A56","mappings":{"default":{"default":"two intersecting logical or"}},"category":"Sm"},{"key":"2A57","mappings":{"default":{"default":"sloping large or"}},"category":"Sm"},{"key":"2A58","mappings":{"default":{"default":"sloping large and"}},"category":"Sm"},{"key":"2A5A","mappings":{"default":{"default":"logical and with middle stem"}},"category":"Sm"},{"key":"2A5B","mappings":{"default":{"default":"logical or with middle stem"}},"category":"Sm"},{"key":"2A5C","mappings":{"default":{"default":"logical and with horizontal dash"}},"category":"Sm"},{"key":"2A5D","mappings":{"default":{"default":"logical or with horizontal dash"}},"category":"Sm"},{"key":"2A5F","mappings":{"default":{"default":"logical and with underbar"}},"category":"Sm"},{"key":"2A66","mappings":{"default":{"default":"igual con punto suscrito"}},"category":"Sm"},{"key":"2A6A","mappings":{"default":{"default":"tilde con punto"}},"category":"Sm"},{"key":"2A6D","mappings":{"default":{"default":"congruente con punto"}},"category":"Sm"},{"key":"2A6F","mappings":{"default":{"default":"casi igual con ángulo"}},"category":"Sm"},{"key":"2A71","mappings":{"default":{"default":"igual con más suscrito"}},"category":"Sm"},{"key":"2A72","mappings":{"default":{"default":"igual con más"}},"category":"Sm"},{"key":"2A73","mappings":{"default":{"default":"igual con operador tilde"}},"category":"Sm"},{"key":"2A74","mappings":{"default":{"default":"igual con dos puntos"}},"category":"Sm"},{"key":"2A75","mappings":{"default":{"default":"igual doble"}},"category":"Sm"},{"key":"2A77","mappings":{"default":{"default":"igual entre cuatro puntos"}},"category":"Sm"},{"key":"2A78","mappings":{"default":{"default":"equivalente con cuatro puntos"}},"category":"Sm"},{"key":"2A79","mappings":{"default":{"default":"menor que con círculo interior"}},"category":"Sm"},{"key":"2A7A","mappings":{"default":{"default":"mayor que con círculo interior"}},"category":"Sm"},{"key":"2A7B","mappings":{"default":{"default":"menor que con interrogante"}},"category":"Sm"},{"key":"2A7C","mappings":{"default":{"default":"mayor que con interrogante"}},"category":"Sm"},{"key":"2A7D","mappings":{"default":{"default":"estrictamente menor que"}},"category":"Sm"},{"key":"2A7E","mappings":{"default":{"default":"estrictamente mayor que"}},"category":"Sm"},{"key":"2A7F","mappings":{"default":{"default":"estrictamente menor que con punto interior"}},"category":"Sm"},{"key":"2A80","mappings":{"default":{"default":"estrictamente mayor que con punto interior"}},"category":"Sm"},{"key":"2A81","mappings":{"default":{"default":"estrictamente menor que con punto"}},"category":"Sm"},{"key":"2A82","mappings":{"default":{"default":"estrictamente mayor que con punto"}},"category":"Sm"},{"key":"2A83","mappings":{"default":{"default":"estrictamente menor que con punto"}},"category":"Sm"},{"key":"2A84","mappings":{"default":{"default":"estrictamente mayor que con punto"}},"category":"Sm"},{"key":"2A89","mappings":{"default":{"default":"menor que, pero no aproximado a"}},"category":"Sm"},{"key":"2A8A","mappings":{"default":{"default":"mayor que, pero no aproximado a"}},"category":"Sm"},{"key":"2A8D","mappings":{"default":{"default":"menor, similar o igual a"}},"category":"Sm"},{"key":"2A8E","mappings":{"default":{"default":"mayor, similar o igual a"}},"category":"Sm"},{"key":"2A8F","mappings":{"default":{"default":"menor, similar o mayor que"}},"category":"Sm"},{"key":"2A90","mappings":{"default":{"default":"mayor, similar o menor que"}},"category":"Sm"},{"key":"2A91","mappings":{"default":{"default":"menor, mayor o igual a"}},"category":"Sm"},{"key":"2A92","mappings":{"default":{"default":"mayor, menor o igual a"}},"category":"Sm"},{"key":"2A93","mappings":{"default":{"default":"estrictamente menor o mayor que"}},"category":"Sm"},{"key":"2A94","mappings":{"default":{"default":"estrictamente mayor o menor que"}},"category":"Sm"},{"key":"2A97","mappings":{"default":{"default":"estrictamente menor que con punto interior"}},"category":"Sm"},{"key":"2A98","mappings":{"default":{"default":"estrictamente mayor que con punto interior"}},"category":"Sm"},{"key":"2A99","mappings":{"default":{"default":"menor o igual a"}},"category":"Sm"},{"key":"2A9A","mappings":{"default":{"default":"mayor o igual a"}},"category":"Sm"},{"key":"2A9D","mappings":{"default":{"default":"equivalente o menor que"}},"category":"Sm"},{"key":"2A9E","mappings":{"default":{"default":"mayor o similar a"}},"category":"Sm"},{"key":"2A9F","mappings":{"default":{"default":"similar, menor o igual a"}},"category":"Sm"},{"key":"2AA0","mappings":{"default":{"default":"similar, mayor o igual a"}},"category":"Sm"},{"key":"2AA1","mappings":{"default":{"default":"mucho menor que"}},"category":"Sm"},{"key":"2AA2","mappings":{"default":{"default":"mucho mayor que"}},"category":"Sm"},{"key":"2AA4","mappings":{"default":{"default":"menor que, mayor que"}},"category":"Sm"},{"key":"2AA5","mappings":{"default":{"default":"mayor o menor que"}},"category":"Sm"},{"key":"2AA6","mappings":{"default":{"default":"menor que cerrado con curva"}},"category":"Sm"},{"key":"2AA7","mappings":{"default":{"default":"mayor que cerrado con curva"}},"category":"Sm"},{"key":"2AA8","mappings":{"default":{"default":"estrictamente menor que cerrado con curva"}},"category":"Sm"},{"key":"2AA9","mappings":{"default":{"default":"estrictamente mayor que cerrado con curva"}},"category":"Sm"},{"key":"2AAA","mappings":{"default":{"default":"más reducido que"}},"category":"Sm"},{"key":"2AAB","mappings":{"default":{"default":"más amplio que"}},"category":"Sm"},{"key":"2AAC","mappings":{"default":{"default":"más reducido o igual a"}},"category":"Sm"},{"key":"2AAD","mappings":{"default":{"default":"más amplio o igual a"}},"category":"Sm"},{"key":"2AAE","mappings":{"default":{"default":"diferencia entre"}},"category":"Sm"},{"key":"2AAF","mappings":{"default":{"default":"precede o es igual a"}},"category":"Sm"},{"key":"2AB5","mappings":{"default":{"default":"precede estrictamente a"}},"category":"Sm"},{"key":"2AB6","mappings":{"default":{"default":"sigue estrictamente a"}},"category":"Sm"},{"key":"2ABB","mappings":{"default":{"default":"precede mucho antes"}},"category":"Sm"},{"key":"2ABC","mappings":{"default":{"default":"sigue mucho después"}},"category":"Sm"},{"key":"2ABD","mappings":{"default":{"default":"subrelación de"}},"category":"Sm"},{"key":"2ABE","mappings":{"default":{"default":"contiene como subrelación a"}},"category":"Sm"},{"key":"2ABF","mappings":{"default":{"default":"incluido con más suscrito"}},"category":"Sm"},{"key":"2AC0","mappings":{"default":{"default":"contiene con más suscrito"}},"category":"Sm"},{"key":"2AC1","mappings":{"default":{"default":"incluido con por suscrito"}},"category":"Sm"},{"key":"2AC2","mappings":{"default":{"default":"contiene con por suscrito"}},"category":"Sm"},{"key":"2AC3","mappings":{"default":{"default":"incluido con punto o es igual a"}},"category":"Sm"},{"key":"2AC4","mappings":{"default":{"default":"contiene con punto o es igual a"}},"category":"Sm"},{"key":"2AC7","mappings":{"default":{"default":"incluido aproximadamente en"}},"category":"Sm"},{"key":"2AC8","mappings":{"default":{"default":"contiene aproximadamente a"}},"category":"Sm"},{"key":"2ACF","mappings":{"default":{"default":"incluido con cierre en"}},"category":"Sm"},{"key":"2AD0","mappings":{"default":{"default":"contiene al cierre del subconjunto"}},"category":"Sm"},{"key":"2AD1","mappings":{"default":{"default":"incluido el cierre o es igual a"}},"category":"Sm"},{"key":"2AD2","mappings":{"default":{"default":"contiene al cierre del subconjunto o es igual a"}},"category":"Sm"},{"key":"2AD3","mappings":{"default":{"default":"está incluido o contiene a"}},"category":"Sm"},{"key":"2AD4","mappings":{"default":{"default":"contiene o está incluido en"}},"category":"Sm"},{"key":"2AD5","mappings":{"default":{"default":"incluido doblemente en"}},"category":"Sm"},{"key":"2AD6","mappings":{"default":{"default":"contiene doblemente a"}},"category":"Sm"},{"key":"2AD7","mappings":{"default":{"default":"contiene o está incluido en"}},"category":"Sm"},{"key":"2AD8","mappings":{"default":{"default":"contiene o está incluido en"}},"category":"Sm"},{"key":"2AD9","mappings":{"default":{"default":"perteneciente dirigido hacia abajo"}},"category":"Sm"},{"key":"2ADA","mappings":{"default":{"default":"pitchfork with tee top"}},"category":"Sm"},{"key":"2ADB","mappings":{"default":{"default":"transversal intersection"}},"category":"Sm"},{"key":"2AE4","mappings":{"default":{"default":"double left turnstile vertical bar"}},"category":"Sm"},{"key":"2AE6","mappings":{"default":{"default":"long dash from left member of double vertical"}},"category":"Sm"},{"key":"2AE7","mappings":{"default":{"default":"short down tack with overbar"}},"category":"Sm"},{"key":"2AE8","mappings":{"default":{"default":"barra con perpendicular"}},"category":"Sm"},{"key":"2AE9","mappings":{"default":{"default":"short up tack above short down tack"}},"category":"Sm"},{"key":"2AEB","mappings":{"default":{"default":"double up tack"}},"category":"Sm"},{"key":"2AEC","mappings":{"default":{"default":"double stroke not sign"}},"category":"Sm"},{"key":"2AED","mappings":{"default":{"default":"reversed double stroke not sign"}},"category":"Sm"},{"key":"2AEE","mappings":{"default":{"default":"does not divide with reversed negation slash"}},"category":"Sm"},{"key":"2AEF","mappings":{"default":{"default":"barra vertical con círculo"}},"category":"Sm"},{"key":"2AF0","mappings":{"default":{"default":"barra con círculo inferior"}},"category":"Sm"},{"key":"2AF1","mappings":{"default":{"default":"down tack with circle below"}},"category":"Sm"},{"key":"2AF2","mappings":{"default":{"default":"paralela con marca"}},"category":"Sm"},{"key":"2AF3","mappings":{"default":{"default":"paralela con tilde"}},"category":"Sm"},{"key":"FE68","mappings":{"default":{"default":"división entera"}},"category":"Po"},{"key":"FF5C","mappings":{"default":{"default":"barra vertical"}},"category":"Sm"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_whitespace.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_whitespace.js
deleted file mode 100644
index d0a84b54..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/math_whitespace.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"00A0","mappings":{"default":{"default":" "}},"category":"Zs"},{"key":"00AD","mappings":{"default":{"default":"guión corto"}},"category":"Cf"},{"key":"2002","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"2003","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"2004","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"2005","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"2007","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"2008","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"2009","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"200A","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"200B","mappings":{"default":{"default":""}},"category":"Cf"},{"key":"200C","mappings":{"default":{"default":"ancho de cero no ensamblador"}},"category":"Cf"},{"key":"200D","mappings":{"default":{"default":"ancho de cero ensamblador"}},"category":"Cf"},{"key":"200E","mappings":{"default":{"default":"marca de izquierda a derecha"}},"category":"Cf"},{"key":"200F","mappings":{"default":{"default":"marca de derecha a izquierda"}},"category":"Cf"},{"key":"205F","mappings":{"default":{"default":""}},"category":"Zs"},{"key":"2060","mappings":{"default":{"default":""}},"category":"Cf"},{"key":"2061","mappings":{"default":{"default":"de"}},"category":"Cf"},{"key":"2062","mappings":{"default":{"default":"por"}},"category":"Cf"},{"key":"2063","mappings":{"default":{"default":"coma"}},"category":"Cf"},{"key":"2064","mappings":{"default":{"default":"más"}},"category":"Cf"},{"key":"FEFF","mappings":{"default":{"default":""}},"category":"Cf"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/other_stars.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/other_stars.js
deleted file mode 100644
index ef2db112..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/symbols/other_stars.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"2605","mappings":{"default":{"default":"estrella rellena"}},"category":"So"},{"key":"2606","mappings":{"default":{"default":"estrella vacía"}},"category":"So"},{"key":"2713","mappings":{"default":{"default":"check mark"}},"category":"So"},{"key":"2717","mappings":{"default":{"default":"ballot x"}},"category":"So"},{"key":"2720","mappings":{"default":{"default":"cruz de Malta"}},"category":"So"},{"key":"2736","mappings":{"default":{"default":"estrella rellena de seis puntas"}},"category":"So"},{"key":"273D","mappings":{"default":{"default":"heavy teardrop spoked asterisk"}},"category":"So"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/energy.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/energy.js
deleted file mode 100644
index b48322e4..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/energy.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"W","names":["W","w"],"mappings":{"default":{"default":"watt"}},"category":"energy"},{"key":"kW","names":["kw","kW"],"mappings":{"default":{"default":"kilowatt"}},"category":"energy"},{"key":"mW","names":["mw","mW"],"mappings":{"default":{"default":"miliwatt"}},"category":"energy"},{"key":"kwh","names":["kwh","kWh"],"mappings":{"default":{"default":"kilowatt hora"}},"category":"energy"},{"key":"J","names":["J"],"mappings":{"default":{"default":"Joules"}},"category":"energy"},{"key":"N","names":["N"],"mappings":{"default":{"default":"Newton"}},"category":"energy"},{"key":"A","names":["A"],"mappings":{"default":{"default":"Ampere"}},"category":"energy"},{"key":"V","names":["V"],"mappings":{"default":{"default":"Voltio"}},"category":"energy"},{"key":"µΩ","names":["µΩ"],"mappings":{"default":{"default":"microohmio"}},"category":"energy"},{"key":"mΩ","names":["mΩ"],"mappings":{"default":{"default":"miliohmio"}},"category":"energy"},{"key":"Ω","names":["Ω","Ohm"],"mappings":{"default":{"default":"ohmio"}},"category":"energy"},{"key":"kΩ","names":["kΩ","KΩ"],"mappings":{"default":{"default":"kiloohmio"}},"category":"energy"},{"key":"MΩ","names":["MΩ"],"mappings":{"default":{"default":"megaohmio"}},"category":"energy"},{"key":"GΩ","names":["GΩ"],"mappings":{"default":{"default":"gigaohmio"}},"category":"energy"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/length.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/length.js
deleted file mode 100644
index 50ed29f3..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/length.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"mm","names":["mm"],"mappings":{"default":{"default":"milímetro"}},"category":"Length"},{"key":"cm","names":["cm"],"mappings":{"default":{"default":"centímetro"}},"category":"Length"},{"key":"m","names":["m"],"mappings":{"default":{"default":"metro"}},"category":"Length"},{"key":"km","names":["km"],"mappings":{"default":{"default":"kilómetro"}},"category":"Length"},{"key":"ft","names":["ft","ft."],"mappings":{"default":{"default":"pies"}},"category":"Length"},{"key":"in","names":["in","in."],"mappings":{"default":{"default":"pulgada"}},"category":"Length"},{"key":"mi","names":["mi","mi."],"mappings":{"default":{"default":"milla"}},"category":"Length"},{"key":"yd","names":["yd","yd."],"mappings":{"default":{"default":"yarda"}},"category":"Length"},{"key":"n.m.","names":["n.m."],"mappings":{"default":{"default":"millas náuticas"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/memory.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/memory.js
deleted file mode 100644
index 3c6546d4..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/memory.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"b","names":["b"],"mappings":{"default":{"default":"bit"}}},{"key":"B","names":["B"],"mappings":{"default":{"default":"byte"}}},{"key":"KB","names":["KB"],"mappings":{"default":{"default":"kilobyte"}}},{"key":"MB","names":["MB"],"mappings":{"default":{"default":"megabyte"}}},{"key":"GB","names":["GB"],"mappings":{"default":{"default":"gigabyte"}}},{"key":"TB","names":["TB"],"mappings":{"default":{"default":"terabyte"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/other.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/other.js
deleted file mode 100644
index 39efb2ed..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/other.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"doz","names":["doz","doz.","dz","dz."],"mappings":{"default":{"default":"docena"}}},{"key":"sq","names":["sq","sq."],"mappings":{"default":{"default":"al cuadrado"}}},{"key":"ha","names":["ha"],"mappings":{"default":{"default":"hectarea"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/speed.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/speed.js
deleted file mode 100644
index d129924e..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/speed.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"kt","names":["kt","kt."],"mappings":{"default":{"default":"nudo"}}},{"key":"mph","names":["mph"],"mappings":{"default":{"default":"millas por hora"}}},{"key":"rpm","names":["rpm"],"mappings":{"default":{"default":"revoluciones por minuto"}}},{"key":"kmh","names":["kmh"],"mappings":{"default":{"default":"kilómetros por hora"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/temperature.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/temperature.js
deleted file mode 100644
index a9d81c73..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/temperature.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"F","names":["F","F.","°F"],"mappings":{"default":{"default":"Fahrenheit"}}},{"key":"C","names":["C","°C"],"mappings":{"default":{"default":"centígrados"}}},{"key":"K","names":["K","°K"],"mappings":{"default":{"default":"Kelvin"}}}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/time.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/time.js
deleted file mode 100644
index 2cc4ead9..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/time.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"ns","names":["ns"],"mappings":{"default":{"default":"nanosegundos"}},"category":"time"},{"key":"µs","names":["µs"],"mappings":{"default":{"default":"microsegundos"}},"category":"time"},{"key":"ms","names":["ms"],"mappings":{"default":{"default":"milisegundos"}},"category":"time"},{"key":"s","names":["s"],"mappings":{"default":{"default":"segundos"}},"category":"time"},{"key":"min","names":["min"],"mappings":{"default":{"default":"minutos"}},"category":"time"},{"key":"h","names":["h","hr"],"mappings":{"default":{"default":"hora"}},"category":"time"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/volume.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/volume.js
deleted file mode 100644
index 138fb9db..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/volume.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"bbl","names":["bbl.","bbl"],"mappings":{"default":{"default":"barrile"}},"category":"volume"},{"key":"cu","names":["cu","cu."],"mappings":{"default":{"default":"cúbico"}},"category":"volume"},{"key":"fl. oz.","names":["fl. oz."],"mappings":{"default":{"default":"onzas líquidas"}},"category":"volume"},{"key":"gal","names":["gal","gal."],"mappings":{"default":{"default":"galone"}},"category":"volume"},{"key":"pt","names":["pt","pt."],"mappings":{"default":{"default":"pinta"}},"category":"volume"},{"key":"qt","names":["qt","qt."],"mappings":{"default":{"default":"quart"}},"category":"volume"},{"key":"tbsp","names":["tbsp","tbsp."],"mappings":{"default":{"default":"cuchara"}},"category":"volume"},{"key":"tsp","names":["tsp","tsp."],"mappings":{"default":{"default":"cucharilla"}},"category":"volume"},{"key":"cc","names":["cc"],"mappings":{"default":{"default":"centímetros cúbicos"}},"category":"volume"},{"key":"kl","names":["kl"],"mappings":{"default":{"default":"kilolitro"}},"category":"volume"},{"key":"l","names":["l"],"mappings":{"default":{"default":"litro"}},"category":"volume"},{"key":"ml","names":["ml"],"mappings":{"default":{"default":"mililitro"}},"category":"volume"}]
diff --git a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/weight.js b/src/main/webapp/math/extensions/a11y/mathmaps/es/units/weight.js
deleted file mode 100644
index 6048fcf3..00000000
--- a/src/main/webapp/math/extensions/a11y/mathmaps/es/units/weight.js
+++ /dev/null
@@ -1 +0,0 @@
-[{"locale":"es"},{"key":"lb","names":["lb","lb."],"mappings":{"default":{"default":"libra"}}},{"key":"LT","names":["LT","L.T."],"mappings":{"default":{"default":"libras imperiales"}}},{"key":"oz","names":["oz","oz."],"mappings":{"default":{"default":"onza"}}},{"key":"µg","names":["µg","mcg"],"mappings":{"default":{"default":"microgramo"}}},{"key":"gr","names":["g","gr"],"mappings":{"default":{"default":"gramo"}}},{"key":"kg","names":["kg"],"mappings":{"default":{"default":"kilogramo"}}},{"key":"mg","names":["mg"],"mappings":{"default":{"default":"miligramo"}}},{"key":"t","names":["t","T"],"mappings":{"default":{"default":"tonelada"}}}]
diff --git a/src/main/webapp/math/jax/output/NativeMML/config.js b/src/main/webapp/math/jax/output/NativeMML/config.js
deleted file mode 100644
index 1791a8ad..00000000
--- a/src/main/webapp/math/jax/output/NativeMML/config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * /MathJax/jax/output/NativeMML/config.js
- *
- * Copyright (c) 2009-2018 The MathJax Consortium
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-MathJax.OutputJax.NativeMML=MathJax.OutputJax({id:"NativeMML",version:"2.7.5",directory:MathJax.OutputJax.directory+"/NativeMML",extensionDir:MathJax.OutputJax.extensionDir+"/NativeMML",config:{matchFontHeight:true,scale:100,minScaleAdjust:50,styles:{"div.MathJax_MathML":{"text-align":"center",margin:".75em 0px"}}}});if(!MathJax.Hub.config.delayJaxRegistration){MathJax.OutputJax.NativeMML.Register("jax/mml")}MathJax.OutputJax.NativeMML.loadComplete("config.js");
diff --git a/src/main/webapp/math/jax/output/NativeMML/jax.js b/src/main/webapp/math/jax/output/NativeMML/jax.js
deleted file mode 100644
index 3e737a30..00000000
--- a/src/main/webapp/math/jax/output/NativeMML/jax.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * /MathJax/jax/output/NativeMML/jax.js
- *
- * Copyright (c) 2009-2018 The MathJax Consortium
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-(function(l,c,g,e){var f,i=c.Browser.isMSIE;var h,b,d,k;c.Register.StartupHook("MathZoom Ready",function(){k=MathJax.Extension.MathZoom});var j=function(m,o){var n=e.Element("span");m="padding"+m;if(o){n.style.cssText=(o.getAttribute("style")||"");if(n.style.padding===""&&(n.style[m]||"")===""){n.style[m]="0px";o.setAttribute("style",n.style.cssText)}}};var a=function(r,m,p){if(r){var o=e.Element("span");o.style.cssText=(r.getAttribute("style")||"");if(o.style.padding===""){var q={paddingLeft:p,paddingTop:m,paddingRight:"0px",paddingBottom:"0px"};for(var n in q){if(q.hasOwnProperty(n)){if((o.style[n]||"")===""){o.style[n]=q[n]}}}}r.setAttribute("style",o.style.cssText)}};l.Augment({config:{styles:{".MathJax_MathML":{"font-style":"normal","font-weight":"normal","line-height":"normal","font-size":"100%","font-size-adjust":"none","text-indent":0,"text-align":"left","text-transform":"none","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none",direction:"ltr","max-width":"none","max-height":"none","min-width":0,"min-height":0,border:0,padding:0,margin:0},"span.MathJax_MathML":{display:"inline!important"},"div.MathJax_MathML":{display:"block!important"},".MathJax_mmlExBox":{display:"block!important",overflow:"hidden",height:"1px",width:"60ex","min-height":0,"max-height":"none",padding:0,border:0,margin:0}}},handlesVariants:false,settings:c.config.menuSettings,ex:1,scale:1,adjustWidths:[],Config:function(){this.SUPER(arguments).Config.call(this);if(this.settings.scale){this.config.scale=this.settings.scale}if(c.config.displayAlign!=="center"){var o=c.config.displayAlign,m=c.config.displayIndent;var n={"text-align":o+"!important"};n["margin-"+o]=m+"!important";c.Insert(this.config.styles,{"div.MathJax_MathML":n,"div.MathJax_MathML math":{"text-align":o},"div.MathJax_MathContainer > span":{"text-align":o+"!important"}})}if(!this.require){this.require=[]}this.require.push(MathJax.OutputJax.extensionDir+"/MathEvents.js")},Startup:function(){h=MathJax.Extension.MathEvents.Event;b=MathJax.Extension.MathEvents.Touch;d=MathJax.Extension.MathEvents.Hover;this.ContextMenu=h.ContextMenu;this.Mousedown=h.AltContextMenu;this.Mouseover=d.Mouseover;this.Mouseout=d.Mouseout;this.Mousemove=d.Mousemove;if(!c.Browser.hasMathPlayer){this.EmExSpan=e.Element("span",{style:{position:"absolute","font-size-adjust":"none"}},[["div",{className:"MathJax_mmlExBox"}],["span",{className:"MathJax_MathML"}]]);f.math(f.mspace().With({width:"60ex"})).toNativeMML(this.EmExSpan.lastChild)}return g.Styles(this.config.styles)},InitializeMML:function(){this.initialized=true;if(c.Browser.hasMathPlayer){try{if(!c.Browser.mpNamespace){var m=document.createElement("object");m.id="mathplayer";m.classid="clsid:32F66A20-7614-11D4-BD11-00104BD3F987";document.getElementsByTagName("head")[0].appendChild(m);document.namespaces.add("m","http://www.w3.org/1998/Math/MathML");c.Browser.mpNamespace=true}if(!c.Browser.mpImported){document.namespaces.m.doImport("#mathplayer");c.Browser.mpImported=true}}catch(n){if(!this.config.noMathPlayerWarning){alert(MathJax.Localization._(["MathML","MathPlayer"],"MathJax was not able to set up MathPlayer.\n\nIf MathPlayer is not installed, you need to install it first.\nOtherwise, your security settings may be preventing ActiveX \ncontrols from running. Use the Internet Options item under\nthe Tools menu and select the Security tab, then press the\nCustom Level button. Check that the settings for\n'Run ActiveX Controls', and 'Binary and script behaviors'\nare enabled.\n\nCurrently you will see error messages rather than\ntypeset mathematics."))}}}else{document.body.appendChild(this.EmExSpan);this.defaultEx=this.EmExSpan.firstChild.offsetWidth/60;this.defaultMEx=this.EmExSpan.lastChild.offsetWidth/60;document.body.removeChild(this.EmExSpan)}},preTranslate:function(o){var t=o.jax[this.id],u,p=t.length,y,r,A,w,z,n,v,s,q;for(u=0;u<p;u++){y=t[u];if(!y.parentNode){continue}if(!this.initialized){this.InitializeMML()}r=y.previousSibling;if(r&&r.className==="MathJax_MathML"){r.parentNode.removeChild(r)}n=y.MathJax.elementJax;if(!n){continue}z=n.root;n.NativeMML={};var x=(z.Get("display")==="block"?"div":"span");A=e.Element(x,{className:"MathJax_MathML",id:n.inputID+"-Frame"},[["span",{className:"MathJax_MathContainer",isMathJax:true,jaxID:this.id,style:{position:"relative",display:"inline-block","white-space":"nowrap"}},[["span",{isMathJax:true,style:{display:"inline-block"}}]]]]);y.parentNode.insertBefore(A,y);if(!i){y.parentNode.insertBefore(this.EmExSpan.cloneNode(true),y)}}for(u=0;u<p;u++){y=t[u];if(!y.parentNode){continue}n=y.MathJax.elementJax;if(!n){continue}if(!i){w=y.previousSibling;v=w.firstChild.offsetWidth/60;s=w.lastChild.offsetWidth/60;if(v===0||v==="NaN"){v=this.defaultEx;s=this.defaultMEx}q=(this.config.matchFontHeight&&s>1?v/s:1);q=Math.floor(Math.max(this.config.minScaleAdjust/100,q)*this.config.scale);n.NativeMML.ex=v;n.NativeMML.mex=s}else{q=100}n.NativeMML.fontSize=q+"%";n.NativeMML.scale=q/100}if(!i){for(u=0;u<p;u++){y=t[u];if(y.parentNode&&y.MathJax.elementJax){y.parentNode.removeChild(y.previousSibling)}}}},Translate:function(s){if(!s.parentNode){return}var m=s.MathJax.elementJax,t=m.root;var u=document.getElementById(m.inputID+"-Frame");if(!u){return}var n=u.firstChild,q=n.firstChild;this.ex=m.NativeMML.ex||this.defaultEx;this.scale=m.NativeMML.scale||1;if(this.scale!==1){u.style.fontSize=m.NativeMML.fontSize}try{t.toNativeMML(q,m)}catch(r){if(r.restart){while(q.firstChild){q.removeChild(q.firstChild)}}throw r}if(i){if(n.addEventListener){for(var o in this.MSIE9events){if(this.MSIE9events.hasOwnProperty(o)){n.addEventListener(o,this.MSIE9event,true)}}}else{var p=(this.config.showMathMenuMSIE!=null?this:c).config;if(p.showMathMenuMSIE&&!this.settings.mpContext&&!this.settings.mpMouse){this.MSIEoverlay(n)}else{n.style.position="";q.firstChild.onmousedown=this.MSIEaltMenu}}}else{n.oncontextmenu=h.Menu;n.onmouseover=h.Mouseover;n.onmouseout=h.Mouseout;n.onmousedown=h.Mousedown;n.onclick=h.Click;n.ondblclick=h.DblClick;n.onkeydown=h.Keydown;n.tabIndex=c.getTabOrder(m);if(c.Browser.noContextMenu){n.ontouchstart=b.start;n.ontouchend=b.end}}},postTranslate:function(n){if(this.forceReflow){var m=(document.styleSheets||[])[0]||{};m.disabled=true;m.disabled=false}},Remove:function(m){var n=m.SourceElement();if(!n){return}n=n.previousSibling;if(!n){return}if(n.className.match(/MathJax_MathML/)){n.parentNode.removeChild(n)}},MMLnamespace:"http://www.w3.org/1998/Math/MathML",isFullWidth:function(r){if(!r){return}var q=r.getAttribute("width")||(String(r.getAttribute("style")).match(/(?:^| )width: *([^; ]*)/)||[])[1];if(q){return !!q.match(/%/)}if(r.nodeName.match(/^(semantics|math|mstyle)$/)){q=this.isFullWidth(r.firstChild)}else{if(r.nodeName.toLowerCase()==="mrow"){for(var o=0,n=r.childNodes.length;o<n&&!q;o++){q=this.isFullWidth(r.childNodes[o])}}}if(q){var p="width:100%; "+(r.getAttribute("style")||"");r.setAttribute("style",p.replace(/ +$/,""))}return q},MSIEoverlay:function(m){var n=m.firstChild;if(n.nodeName.toLowerCase()==="span"){n=n.firstChild}var o=this.getHoverBBox(null,n,{});e.addElement(m,"span",{style:{display:"inline-block",width:0,height:0,position:"relative"}},[["span",{isMathJax:true,className:"MathJax_MathPlayer_Overlay",style:{display:"inline-block",position:"absolute",left:d.Px(-o.w),top:d.Px(-o.h-(o.y||0)-1),width:d.Px(o.w),height:d.Px(o.h+o.d),cursor:"pointer","background-color":"white",filter:"alpha(opacity=0)"}}]]);c.Insert(m,{msieMath:n,onmousedown:this.MSIEevent,oncontextmenu:this.MSIEevent,onclick:this.MSIEevent,onmouseup:this.MSIEevent,onmousemove:this.MSIEevent,ondblclick:this.MSIEevent,onmouseover:this.MSIEevent,onmouseout:this.MSIEevent})},MSIEevents:{mousedown:"Mousedown",contextmenu:"ContextMenu",click:"Click",mouseup:"Mouseup",mousemove:"Mousemove",dblclick:"DblClick",mouseover:"Mouseover",mouseout:"Mouseout"},MSIEevent:function(){var n=window.event;var m=l.MSIEevents[n.type];if(l[m]&&l[m](n,this)===false){return false}if(k&&k.HandleEvent(n,m,this)===false){return false}if(n.srcElement.className==="MathJax_MathPlayer_Overlay"&&this.msieMath.fireEvent){if(m==="ContextMenu"||m==="Mouseover"||m==="Mouseout"){this.msieMath.fireEvent("on"+n.type,n)}}return h.False(n)},MSIEaltMenu:function(){var m=this.parentNode.parentNode;while(!m.jaxID){m=m.parentNode}h.AltContextMenu(window.event,m)},MSIE9events:{contextmenu:"Menu",click:"Click",dblclick:"DblClick",mouseup:"False",mouseover:"Mouseover",mouseout:"Mouseout"},MSIE9event:function(n){if(n.type==="contextmenu"&&l.settings.mpContext){return true}if(n.type==="mouseup"&&l.settings.mpMouse){return true}if(n.type==="click"&&l.settings.mpContext){return h.AltContextMenu(n,this)}var m=l.MSIE9events[n.type];return h[m].call(this,n)},getJaxFromMath:function(m){m=m.parentNode;do{m=m.nextSibling}while(m&&m.nodeName.toLowerCase()!=="script");return c.getJaxFor(m)},getHoverSpan:function(m,n){return n.firstChild},getHoverBBox:function(m,n,o){return h.getBBox(n.parentNode)},Zoom:function(n,u,s,m,r){n.root.toNativeMML(u);if(this.msieIE8HeightBug){u.style.position="absolute"}if(l.widthBug){u.style.width=u.parentNode.style.width=""}if(u.parentNode.style.width.match(/%$/)){u.parentNode.style.minWidth=Math.ceil(3*r/4)+"px"}var p=s.offsetWidth||s.scrollWidth,v=s.offsetHeight||s.scrollHeight;var t=u.offsetWidth,q=u.offsetHeight;if(l.widthBug||u.style.width.match(/%/)){var o=u.firstChild.firstChild.scrollWidth;if(o>t){t=o;u.parentNode.style.width=u.style.minWidth=t+"px"}}if(this.msieIE8HeightBug){u.style.position=""}return{Y:-h.getBBox(u.parentNode).h,mW:p,mH:v,zW:t,zH:q}},NAMEDSPACE:{negativeveryverythinmathspace:"-.0556em",negativeverythinmathspace:"-.1111em",negativethinmathspace:"-.1667em",negativemediummathspace:"-.2222em",negativethickmathspace:"-.2778em",negativeverythickmathspace:"-.3333em",negativeveryverythickmathspace:"-.3889em",veryverythinmathspace:".0556em",verythinmathspace:".1111em",thinmathspace:".1667em",mediummathspace:".2222em",thickmathspace:".2778em",verythickmathspace:".3333em",veryverythickmathspace:".3889em"}});c.Register.StartupHook("mml Jax Ready",function(){f=MathJax.ElementJax.mml;f.mbase.Augment({toNativeMML:function(r){var p=this.NativeMMLelement(this.type);this.NativeMMLattributes(p);for(var q=0,o=this.data.length;q<o;q++){if(this.data[q]){this.data[q].toNativeMML(p)}else{p.appendChild(this.NativeMMLelement("mrow"))}}r.appendChild(p)},NativeMMLattributes:function(w){var r=(this.type==="mstyle"?f.math.prototype.defaults:this.defaults);var t=(this.attrNames||f.copyAttributeNames),v=f.skipAttributes,o=f.copyAttributes;if(!this.attrNames){for(var p in r){if(!v[p]&&!o[p]&&r.hasOwnProperty(p)){if(this[p]!=null&&this[p]!==r[p]){if(this.Get(p,null,1)!==this[p]){w.setAttribute(p,this.NativeMMLattribute(this[p]))}}}}}for(var s=0,q=t.length;s<q;s++){if(o[t[s]]===1&&!r.hasOwnProperty(t[s])){continue}var u=(this.attr||{})[t[s]];if(u==null){u=this[t[s]]}if(u!=null){w.setAttribute(t[s],this.NativeMMLattribute(u))}}this.NativeMMLclass(w)},NativeMMLclass:function(o){var q=[];if(this["class"]){q.push(this["class"])}if(this.isa(f.TeXAtom)){var p=["ORD","OP","BIN","REL","OPEN","CLOSE","PUNCT","INNER","VCENTER"][this.texClass];if(p){q.push("MJX-TeXAtom-"+p);if(p==="OP"&&!this.movablelimits){q.push("MJX-fixedlimits")}}}if(this.mathvariant&&this.NativeMMLvariants[this.mathvariant]){q.push("MJX"+this.mathvariant)}if(this.variantForm){q.push("MJX-variant")}if(q.length){o.setAttribute("class",q.join(" "))}},NativeMMLattribute:function(o){o=String(o);if(l.NAMEDSPACE[o]){o=l.NAMEDSPACE[o]}else{if(o.match(/^\s*(([-+])?(\d+(\.\d*)?|\.\d+))\s*mu\s*$/)){o=(RegExp.$2||"")+((1/18)*RegExp.$3).toFixed(3).replace(/\.?0+$/,"")+"em"}else{if(this.NativeMMLvariants[o]){o=this.NativeMMLvariants[o]}}}return o},NativeMMLvariants:{"-tex-caligraphic":f.VARIANT.SCRIPT,"-tex-caligraphic-bold":f.VARIANT.BOLDSCRIPT,"-tex-oldstyle":f.VARIANT.NORMAL,"-tex-oldstyle-bold":f.VARIANT.BOLD,"-tex-mathit":f.VARIANT.ITALIC},NativeMMLelement:function(o){var p=(c.Browser.mpNamespace?document.createElement("m:"+o):(document.createElementNS?document.createElementNS(l.MMLnamespace,o):document.createElement(o)));p.isMathJax=true;return p}});f.mrow.Augment({toNativeMML:function(s){var r,p;if(this.inferred&&this.parent.inferRow){for(r=0,p=this.data.length;r<p;r++){if(this.data[r]){this.data[r].toNativeMML(s)}else{s.appendChild(this.NativeMMLelement("mrow"))}}}else{if(l.stretchyMoBug&&(this.open||this.close)){var q=this.NativeMMLelement("mfenced");this.NativeMMLattributes(q);r=0,p=this.data.length;if(this.open){q.setAttribute("open",this.open);r++}if(this.close){q.setAttribute("close",this.close);p--}var o=q;if(p-r+1>1){o=this.NativeMMLelement("mrow");s.appendChild(q);s=q}for(;r<p;r++){if(this.data[r]){this.data[r].toNativeMML(o)}else{o.appendChild(this.NativeMMLelement("mrow"))}}s.appendChild(o)}else{this.SUPER(arguments).toNativeMML.call(this,s)}}}});f.msubsup.Augment({toNativeMML:function(s){var r=this.type;if(this.data[this.sup]==null){r="msub"}if(this.data[this.sub]==null){r="msup"}var p=this.NativeMMLelement(r);this.NativeMMLattributes(p);if(this.data[0]){delete this.data[0].inferred}for(var q=0,o=this.data.length;q<o;q++){if(this.data[q]){this.data[q].toNativeMML(p)}}s.appendChild(p)}});f.munderover.Augment({toNativeMML:function(s){var r=this.type;var t=this.data[this.base];if(t&&t.isa(f.TeXAtom)&&t.movablelimits&&!t.Get("displaystyle")){r="msubsup";if(this.data[this.under]==null){r="msup"}if(this.data[this.over]==null){r="msub"}}else{if(this.data[this.under]==null){r="mover"}if(this.data[this.over]==null){r="munder"}}var p=this.NativeMMLelement(r);this.NativeMMLattributes(p);if(this.data[0]){delete this.data[0].inferred}for(var q=0,o=this.data.length;q<o;q++){if(this.data[q]){this.data[q].toNativeMML(p)}}s.appendChild(p)}});if(!i){var m=c.SplitList;f.mtable.Augment({toNativeMML:function(z){var s,q;if(l.tableSpacingBug){var A=this.getValues("rowspacing","columnspacing");this.nMMLtopPadding=m("0px "+A.rowspacing);this.nMMLleftPadding=m("0px "+A.columnspacing);var y=this.nMMLtopPadding,v=y.length;for(s=0,q=this.data.length;s<q;s++){if(this.data[s]){this.data[s].nMMLtopPadding=y[s<v?s:v-1]}}}if(l.tableLabelBug){for(s=0,q=this.data.length;s<q;s++){if(this.data[s]&&this.data[s].isa(f.mlabeledtr)){var u=c.config.displayAlign.charAt(0),w=this.Get("side").charAt(0);this.nMMLhasLabels=true;this.nMMLlaMatch=(u===w);this.nMMLforceWidth=(u==="c"||!!((this.width||"").match("%")));break}}}if(this.width&&this.ffTableWidthBug){var B=(this.style||"").replace(/;\s*$/,"").split(";");if(B[0]===""){B.shift()}B.push("width:"+this.width);this.style=B.join(";")}this.SUPER(arguments).toNativeMML.call(this,z);if(this.nMMLhasLabels){var r=z.firstChild;if(this.nMMLforceWidth||w!=="r"){var p=(u!=="l"?1:0)+(w==="l"?1:0);if(p){var t={columnalign:"left",columnwidth:"auto",columnspacing:"0px",columnlines:"none"};for(var o in t){if(t.hasOwnProperty(o)&&this[o]){var x=[t[o],t[o]].slice(2-p).join(" ")+" ";r.setAttribute(o,x+r.getAttribute(o))}}}}if(this.nMMLforceWidth||!this.nMMLlaMatch){r.setAttribute("width","100%")}}}});f.mtr.Augment({toNativeMML:function(v){this.SUPER(arguments).toNativeMML.call(this,v);var p=v.lastChild;if(l.tableSpacingBug){var r=this.parent.nMMLleftPadding,t=r.length;for(var w=p.firstChild,q=0;w;w=w.nextSibling,q++){a(w,this.nMMLtopPadding,r[q<t?q:t-1])}}if(l.tableLabelBug){var o=this.parent.nMMLforceWidth,u=this.parent.Get("side").charAt(0),s=c.config.displayAlign.charAt(0);if(this.parent.nMMLhasLabels&&p.firstChild){if(o||u!=="r"){j("Left",p.firstChild);if(s!=="l"){p.insertBefore(this.NativeMMLelement("mtd"),p.firstChild).setAttribute("style","padding:0")}if(u==="l"){p.insertBefore(this.NativeMMLelement("mtd"),p.firstChild).setAttribute("style","padding:0")}}if(o||u!=="l"){j("Right",p.lastChild)}}}}});f.mlabeledtr.Augment({toNativeMML:function(C){var t=this.NativeMMLelement("mtr");this.NativeMMLattributes(t);for(var u=1,s=this.data.length;u<s;u++){if(this.data[u]){this.data[u].toNativeMML(t)}else{t.appendChild(this.NativeMMLelement("mtd"))}}if(l.tableSpacingBug){var v=this.parent.nMMLleftPadding,y=v.length;u=0;for(var D=t.firstChild;D;D=D.nextSibling,u++){a(D,this.nMMLtopPadding,v[u<y?u:y-1])}}if(l.tableLabelBug&&this.data[0]){var z=this.parent.Get("side").charAt(0),x=c.config.displayAlign.charAt(0),q=c.config.displayIndent;this.data[0].toNativeMML(t);var A=t.lastChild,r=A;if(z===x){A.setAttribute("style","width:"+q);A.setAttribute("columnalign",c.config.displayAlign)}else{r=this.NativeMMLelement("mpadded");r.setAttribute("style","width:0");r.setAttribute("width","0px");r.appendChild(A.firstChild);A.appendChild(r)}j("",A);t.removeChild(A);var o=100,p=this.parent.nMMLforceWidth;if((this.parent.width||"").match(/%/)){o-=parseFloat(this.parent.width)}var B=o;if(p||z!=="r"){j("Left",t.firstChild);if(x!=="l"){if(x==="c"){B/=2}o-=B;t.insertBefore(this.NativeMMLelement("mtd"),t.firstChild).setAttribute("style","padding:0;width:"+B+"%")}if(z==="l"){t.insertBefore(A,t.firstChild)}}if(p||z!=="l"){j("Right",t.lastChild);if(x!=="r"){t.appendChild(this.NativeMMLelement("mtd")).setAttribute("style","padding:0;width:"+o+"%")}if(z==="r"){if(z!==x){r.setAttribute("lspace","-1width")}t.appendChild(A)}}}C.appendChild(t)}});f.mtd.Augment({toNativeMML:function(r){var p=r.appendChild(this.NativeMMLelement(this.type));this.NativeMMLattributes(p);if(l.mtdWidthBug){l.adjustWidths.push(p);p=p.appendChild(this.NativeMMLelement("mrow"))}for(var q=0,o=this.data.length;q<o;q++){if(this.data[q]){this.data[q].toNativeMML(p)}else{p.appendChild(this.NativeMMLelement("mrow"))}}}});f.mspace.Augment({toNativeMML:function(q){this.SUPER(arguments).toNativeMML.call(this,q);if(l.spaceWidthBug&&this.width){var r=q.lastChild;var p=r.getAttribute("width");var o=(r.getAttribute("style")||"").replace(/;?\s*/,"; ");r.setAttribute("style",o+"width:"+p)}}});f.mn.Augment({NativeMMLremapMinus:function(o){return o.replace(/^-/,"\u2212")},toNativeMML:function(s){var p=this.NativeMMLelement(this.type);this.NativeMMLattributes(p);var r=this.NativeMMLremapMinus;for(var q=0,o=this.data.length;q<o;q++){if(this.data[q]){this.data[q].toNativeMML(p,r);r=null}}s.appendChild(p)}});var n=g.fileURL(MathJax.OutputJax.fontDir+"/HTML-CSS/TeX/otf");l.Augment({config:{styles:{'[class="MJX-tex-oldstyle"]':{"font-family":"MathJax_Caligraphic, MathJax_Caligraphic-WEB"},'[class="MJX-tex-oldstyle-bold"]':{"font-family":"MathJax_Caligraphic, MathJax_Caligraphic-WEB","font-weight":"bold"},'[class="MJX-tex-caligraphic"]':{"font-family":"MathJax_Caligraphic, MathJax_Caligraphic-WEB"},'[class="MJX-tex-caligraphic-bold"]':{"font-family":"MathJax_Caligraphic, MathJax_Caligraphic-WEB","font-weight":"bold"},"@font-face /*1*/":{"font-family":"MathJax_Caligraphic-WEB",src:"url('"+n+"/MathJax_Caligraphic-Regular.otf')"},"@font-face /*2*/":{"font-family":"MathJax_Caligraphic-WEB","font-weight":"bold",src:"url('"+n+"/MathJax_Caligraphic-Bold.otf')"}}}});if(!this.handlesVariants){l.Augment({config:{styles:{'[mathvariant="double-struck"]':{"font-family":"MathJax_AMS, MathJax_AMS-WEB"},'[mathvariant="script"]':{"font-family":"MathJax_Script, MathJax_Script-WEB"},'[mathvariant="fraktur"]':{"font-family":"MathJax_Fraktur, MathJax_Fraktur-WEB"},'[mathvariant="bold-script"]':{"font-family":"MathJax_Script, MathJax_Caligraphic-WEB","font-weight":"bold"},'[mathvariant="bold-fraktur"]':{"font-family":"MathJax_Fraktur, MathJax_Fraktur-WEB","font-weight":"bold"},'[mathvariant="monospace"]':{"font-family":"monospace"},'[mathvariant="sans-serif"]':{"font-family":"sans-serif"},'[mathvariant="bold-sans-serif"]':{"font-family":"sans-serif","font-weight":"bold"},'[mathvariant="sans-serif-italic"]':{"font-family":"sans-serif","font-style":"italic"},'[mathvariant="sans-serif-bold-italic"]':{"font-family":"sans-serif","font-style":"italic","font-weight":"bold"},"@font-face /*3*/":{"font-family":"MathJax_AMS-WEB",src:"url('"+n+"/MathJax_AMS-Regular.otf')"},"@font-face /*4*/":{"font-family":"MathJax_Script-WEB",src:"url('"+n+"/MathJax_Script-Regular.otf')"},"@font-face /*5*/":{"font-family":"MathJax_Fraktur-WEB",src:"url('"+n+"/MathJax_Fraktur-Regular.otf')"},"@font-face /*6*/":{"font-family":"MathJax_Fraktur-WEB","font-weight":"bold",src:"url('"+n+"/MathJax_Fraktur-Bold.otf')"}}}})}}f.math.Augment({toNativeMML:function(y,p){var A=this.NativeMMLelement(this.type),w=A;var u=(p?MathJax.InputJax[p.inputJax].annotationEncoding:null);var v,r;l.adjustWidths=[];A.setAttribute("xmlns",l.MMLnamespace);this.NativeMMLattributes(A);if(l.widthBug){A=A.appendChild(this.NativeMMLelement("mrow"))}if(u){A=A.appendChild(this.NativeMMLelement("semantics"));A.appendChild(this.NativeMMLelement("mrow"));var s=A.appendChild(this.NativeMMLelement("annotation"));s.appendChild(document.createTextNode(p.originalText));s.setAttribute("encoding",u);A=A.firstChild}for(v=0,r=this.data.length;v<r;v++){if(this.data[v]){this.data[v].toNativeMML(A)}else{A.appendChild(this.NativeMMLelement("mrow"))}}var t=((this.data[0]||{data:[]}).data[0]||{});if(t.nMMLhasLabels){if(t.nMMLforceWidth||!t.nMMLlaMatch){A.setAttribute("style","width:100%");if(u){A.parentNode.setAttribute("style","width:100%")}}if(t.nMMLlaMatch){if(y.parentNode.parentNode.nodeName.toLowerCase()==="div"){y.parentNode.parentNode.style.setProperty("margin-"+c.config.displayAlign,"0px","important")}}}var x=l.isFullWidth(w);if(x){y.style.width=y.parentNode.style.width="100%"}y.appendChild(w);if(l.widthBug&&!x){y.style.width=(w.firstChild.scrollWidth/l.ex/l.scale).toFixed(3)+"ex";if(p){p.NativeMML.scrollWidth=w.firstChild.scrollWidth}}if(l.adjustWidths.length){var z=[];for(v=0,r=l.adjustWidths.length;v<r;v++){A=l.adjustWidths[v];var o=A.getAttribute("style")||"";if(!o.match(/(^|;)\s*min-width:/)){var q=A.firstChild.scrollWidth;z.push(q);q=(q/l.ex).toFixed(3)+"ex";o=o.replace(/;?\s*$/,"; ");A.setAttribute("style",o+"min-width:"+q)}}if(!p){p=c.getJaxFor(y)}if(p){p.NativeMML.mtds=z}w.MathJaxMtds=l.adjustWidths;l.adjustWidths=[]}}});f.mfenced.Augment({toNativeMML:function(w){if(!l.mfencedBug){this.SUPER(arguments).toNativeMML.call(this,w);return}var t=c.Browser.isOpera;var u,p,r;var q=this.getValues("open","close","separators");q.open=q.open.replace(/^\s+/,"").replace(/\s+$/,"");q.close=q.close.replace(/^\s+/,"").replace(/\s+$/,"");q.separators=q.separators.replace(/\s+/g,"").split("");if(q.separators.length==0){q.separators=null}else{if(q.separators.length<this.data.length-1){var v=q.separators[q.separators.length-1];for(u=this.data.length-1-q.separators.length;u>0;u--){q.separators.push(v)}}}var o=this.NativeMMLelement(t?this.type:"mrow");this.NativeMMLattributes(o);o.removeAttribute("separators");if(t){o.setAttribute("open",q.open);o.setAttribute("close",q.close);if(this.data.length>1){w.appendChild(o);w=o;o=this.NativeMMLelement("mrow")}}else{o.removeAttribute("open");o.removeAttribute("close")}if(!t){r=this.NativeMMLelement("mo");r.setAttribute("fence","true");r.textContent=q.open;o.appendChild(r)}for(u=0,p=this.data.length;u<p;u++){if(q.separators&&u>0){r=this.NativeMMLelement("mo");r.setAttribute("separator","true");r.textContent=q.separators[u-1];o.appendChild(r)}if(this.data[u]){this.data[u].toNativeMML(o)}else{o.appendChild(this.NativeMMLelement("mrow"))}}if(!t){r=this.NativeMMLelement("mo");r.setAttribute("fence","true");r.textContent=q.close;o.appendChild(r)}w.appendChild(o)}});f.TeXAtom.Augment({toNativeMML:function(p){var o=this.NativeMMLelement("mrow");this.NativeMMLattributes(o);this.data[0].toNativeMML(o);p.appendChild(o)}});f.chars.Augment({toNativeMML:function(p,o){var q=this.toString();if(o){q=o(q)}p.appendChild(document.createTextNode(q))}});f.entity.Augment({toNativeMML:function(o){o.appendChild(document.createTextNode(this.toString()))}});f.xml.Augment({toNativeMML:function(q){for(var p=0,o=this.data.length;p<o;p++){q.appendChild(this.data[p].cloneNode(true))}}});f.mi.Augment({toNativeMML:function(p){this.SUPER(arguments).toNativeMML.call(this,p);if(l.miItalicBug){if(this.Get("mathvariant")===f.VARIANT.NORMAL){var o=p.lastChild;o.setAttribute("mathvariant",f.VARIANT.NORMAL)}}}});f.mo.Augment({toNativeMML:function(t){this.SUPER(arguments).toNativeMML.call(this,t);if(l.webkitMoSpacingBug){var o=0,s=0,v=this.parent;if(v&&v.type==="mrow"&&(v.inferred||!v.isEmbellished())){var q=this.getValues("lspace","rspace");o=q.lspace,s=q.rspace;if(l.NAMEDSPACE[o]){o=l.NAMEDSPACE[o]}if(l.NAMEDSPACE[s]){s=l.NAMEDSPACE[s]}}var u=t.lastChild;var r=e.Element("span");r.style.cssText=(u.getAttribute("style")||"");r.style.setProperty("-webkit-margin-start",o);r.style.setProperty("-webkit-margin-end",s);u.setAttribute("style",r.style.cssText)}}});f.mmultiscripts.Augment({toNativeMML:function(s){if(!l.mmultiscriptsBug||this.data.length===0){this.SUPER(arguments).toNativeMML.call(this,s);return}var q=this.NativeMMLelement("mrow");this.NativeMMLattributes(q);if(this.data[0]){this.data[0].toNativeMML(q)}else{q.appendChild(this.NativeMMLelement("mrow"))}var t=q.removeChild(q.lastChild);var p=this.data.length,r,o;for(r=1;r<p;r+=2){if(this.data[r].type==="mprescripts"){break}o=this.NativeMMLelement("msubsup");o.appendChild(t);if(this.data[r]){this.data[r].toNativeMML(o)}else{o.appendChild(this.NativeMMLelement("mrow"))}if(r+1<p&&this.data[r+1]){this.data[r+1].toNativeMML(o)}else{o.appendChild(this.NativeMMLelement("mrow"))}t=o}q.appendChild(t);for(r++;r<p;r+=2){o=this.NativeMMLelement("msubsup");o.appendChild(this.NativeMMLelement("mrow"));if(this.data[r]){this.data[r].toNativeMML(o)}else{o.appendChild(this.NativeMMLelement("mrow"))}if(r+1<p&&this.data[r+1]){this.data[r+1].toNativeMML(o)}else{o.appendChild(this.NativeMMLelement("mrow"))}q.insertBefore(o,t)}s.appendChild(q)}});c.Register.StartupHook("TeX mathchoice Ready",function(){f.TeXmathchoice.Augment({toNativeMML:function(o){this.Core().toNativeMML(o)}})});setTimeout(MathJax.Callback(["loadComplete",l,"jax.js"]),0)});c.Browser.Select({MSIE:function(m){var n=(document.documentMode||0);l.msieIE8HeightBug=(n===8)},Opera:function(m){l.stretchyMoBug=true;l.tableLabelBug=true;l.mfencedBug=true;l.miBug=true;l.mmultiscriptsBug=true},Firefox:function(m){var n=m.versionAtLeast("29.0");l.ffTableWidthBug=!m.versionAtLeast("13.0");l.forceReflow=!n;l.widthBug=!n;l.mtdWidthBug=true;l.handlesVariants=n;l.spaceWidthBug=!m.versionAtLeast("20.0");l.tableSpacingBug=!m.versionAtLeast("33.0");l.tableLabelBug=true;l.mfencedBug=true},Chrome:function(m){l.tableSpacingBug=true;l.tableLabelBug=true;l.mfencedBug=true},Safari:function(m){l.tableSpacingBug=true;l.tableLabelBug=true;l.mfencedBug=true;l.miItalicBug=true;l.webkitMoSpacingBug=true;l.spaceWidthBug=true;l.mmultiscriptsBug=true}});c.Register.StartupHook("End Cookie",function(){if(c.config.menuSettings.zoom!=="None"){g.Require("[MathJax]/extensions/MathZoom.js")}})})(MathJax.OutputJax.NativeMML,MathJax.Hub,MathJax.Ajax,MathJax.HTML);
diff --git a/src/main/webapp/math/jax/output/PreviewHTML/config.js b/src/main/webapp/math/jax/output/PreviewHTML/config.js
deleted file mode 100644
index ae48c708..00000000
--- a/src/main/webapp/math/jax/output/PreviewHTML/config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * /MathJax/jax/output/PreviewHTML/config.js
- *
- * Copyright (c) 2009-2018 The MathJax Consortium
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-MathJax.OutputJax.PreviewHTML=MathJax.OutputJax({id:"PreviewHTML",version:"2.7.5",directory:MathJax.OutputJax.directory+"/PreviewHTML",extensionDir:MathJax.OutputJax.extensionDir+"/PreviewHTML",noFastPreview:true,config:{scale:100,minScaleAdjust:50,mtextFontInherit:false,linebreaks:{automatic:false,width:"container"}}});if(!MathJax.Hub.config.delayJaxRegistration){MathJax.OutputJax.PreviewHTML.Register("jax/mml")}MathJax.OutputJax.PreviewHTML.loadComplete("config.js");
diff --git a/src/main/webapp/math/jax/output/PreviewHTML/jax.js b/src/main/webapp/math/jax/output/PreviewHTML/jax.js
deleted file mode 100644
index b77dd051..00000000
--- a/src/main/webapp/math/jax/output/PreviewHTML/jax.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * /MathJax/jax/output/PreviewHTML/jax.js
- *
- * Copyright (c) 2009-2018 The MathJax Consortium
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-(function(i,b,e,g){var h;var j,a,d;var f="'Times New Roman',Times,STIXGeneral,serif";var m={".MJXp-script":{"font-size":".8em"},".MJXp-right":{"-webkit-transform-origin":"right","-moz-transform-origin":"right","-ms-transform-origin":"right","-o-transform-origin":"right","transform-origin":"right"},".MJXp-bold":{"font-weight":"bold"},".MJXp-italic":{"font-style":"italic"},".MJXp-scr":{"font-family":"MathJax_Script,"+f},".MJXp-frak":{"font-family":"MathJax_Fraktur,"+f},".MJXp-sf":{"font-family":"MathJax_SansSerif,"+f},".MJXp-cal":{"font-family":"MathJax_Caligraphic,"+f},".MJXp-mono":{"font-family":"MathJax_Typewriter,"+f},".MJXp-largeop":{"font-size":"150%"},".MJXp-largeop.MJXp-int":{"vertical-align":"-.2em"},".MJXp-math":{display:"inline-block","line-height":"1.2","text-indent":"0","font-family":f,"white-space":"nowrap","border-collapse":"collapse"},".MJXp-display":{display:"block","text-align":"center",margin:"1em 0"},".MJXp-math span":{display:"inline-block"},".MJXp-box":{display:"block!important","text-align":"center"},".MJXp-box:after":{content:'" "'},".MJXp-rule":{display:"block!important","margin-top":".1em"},".MJXp-char":{display:"block!important"},".MJXp-mo":{margin:"0 .15em"},".MJXp-mfrac":{margin:"0 .125em","vertical-align":".25em"},".MJXp-denom":{display:"inline-table!important",width:"100%"},".MJXp-denom > *":{display:"table-row!important"},".MJXp-surd":{"vertical-align":"top"},".MJXp-surd > *":{display:"block!important"},".MJXp-script-box > * ":{display:"table!important",height:"50%"},".MJXp-script-box > * > *":{display:"table-cell!important","vertical-align":"top"},".MJXp-script-box > *:last-child > *":{"vertical-align":"bottom"},".MJXp-script-box > * > * > *":{display:"block!important"},".MJXp-mphantom":{visibility:"hidden"},".MJXp-munderover, .MJXp-munder":{display:"inline-table!important"},".MJXp-over":{display:"inline-block!important","text-align":"center"},".MJXp-over > *":{display:"block!important"},".MJXp-munderover > *, .MJXp-munder > *":{display:"table-row!important"},".MJXp-mtable":{"vertical-align":".25em",margin:"0 .125em"},".MJXp-mtable > *":{display:"inline-table!important","vertical-align":"middle"},".MJXp-mtr":{display:"table-row!important"},".MJXp-mtd":{display:"table-cell!important","text-align":"center",padding:".5em 0 0 .5em"},".MJXp-mtr > .MJXp-mtd:first-child":{"padding-left":0},".MJXp-mtr:first-child > .MJXp-mtd":{"padding-top":0},".MJXp-mlabeledtr":{display:"table-row!important"},".MJXp-mlabeledtr > .MJXp-mtd:first-child":{"padding-left":0},".MJXp-mlabeledtr:first-child > .MJXp-mtd":{"padding-top":0},".MJXp-merror":{"background-color":"#FFFF88",color:"#CC0000",border:"1px solid #CC0000",padding:"1px 3px","font-style":"normal","font-size":"90%"}};(function(){for(var n=0;n<10;n++){var o="scaleX(."+n+")";m[".MJXp-scale"+n]={"-webkit-transform":o,"-moz-transform":o,"-ms-transform":o,"-o-transform":o,transform:o}}})();var k=1000000;var c="V",l="H";g.Augment({settings:b.config.menuSettings,config:{styles:m},hideProcessedMath:false,maxStretchyParts:1000,Config:function(){if(!this.require){this.require=[]}this.SUPER(arguments).Config.call(this);var n=this.settings;if(n.scale){this.config.scale=n.scale}this.require.push(MathJax.OutputJax.extensionDir+"/MathEvents.js")},Startup:function(){j=MathJax.Extension.MathEvents.Event;a=MathJax.Extension.MathEvents.Touch;d=MathJax.Extension.MathEvents.Hover;this.ContextMenu=j.ContextMenu;this.Mousedown=j.AltContextMenu;this.Mouseover=d.Mouseover;this.Mouseout=d.Mouseout;this.Mousemove=d.Mousemove;var n=e.addElement(document.body,"div",{style:{width:"5in"}});this.pxPerInch=n.offsetWidth/5;n.parentNode.removeChild(n);return i.Styles(this.config.styles,["InitializePHTML",this])},InitializePHTML:function(){},preTranslate:function(p){var s=p.jax[this.id],t,q=s.length,u,r,v,o,n;for(t=0;t<q;t++){u=s[t];if(!u.parentNode){continue}r=u.previousSibling;if(r&&String(r.className).match(/^MathJax(_PHTML)?(_Display)?( MathJax_Process(ing|ed))?$/)){r.parentNode.removeChild(r)}n=u.MathJax.elementJax;if(!n){continue}n.PHTML={display:(n.root.Get("display")==="block")};v=o=e.Element("span",{className:"MathJax_PHTML",id:n.inputID+"-Frame",isMathJax:true,jaxID:this.id,oncontextmenu:j.Menu,onmousedown:j.Mousedown,onmouseover:j.Mouseover,onmouseout:j.Mouseout,onmousemove:j.Mousemove,onclick:j.Click,ondblclick:j.DblClick,onkeydown:j.Keydown,tabIndex:b.getTabOrder(n)});if(b.Browser.noContextMenu){v.ontouchstart=a.start;v.ontouchend=a.end}if(n.PHTML.display){o=e.Element("div",{className:"MathJax_PHTML_Display"});o.appendChild(v)}o.className+=" MathJax_Processing";u.parentNode.insertBefore(o,u)}},Translate:function(o,s){if(!o.parentNode){return}var n=o.MathJax.elementJax,r=n.root,p=document.getElementById(n.inputID+"-Frame"),t=(n.PHTML.display?p.parentNode:p);this.initPHTML(r,p);try{r.toPreviewHTML(p)}catch(q){if(q.restart){while(p.firstChild){p.removeChild(p.firstChild)}}throw q}t.className=t.className.split(/ /)[0];if(this.hideProcessedMath){t.className+=" MathJax_Processed";if(o.MathJax.preview){n.PHTML.preview=o.MathJax.preview;delete o.MathJax.preview}}},postTranslate:function(s){var o=s.jax[this.id];if(!this.hideProcessedMath){return}for(var q=0,n=o.length;q<n;q++){var p=o[q];if(p&&p.MathJax.elementJax){p.previousSibling.className=p.previousSibling.className.split(/ /)[0];var r=p.MathJax.elementJax.PHTML;if(r.preview){r.preview.innerHTML="";p.MathJax.preview=r.preview;delete r.preview}}}},getJaxFromMath:function(n){if(n.parentNode.className.match(/MathJax_PHTML_Display/)){n=n.parentNode}do{n=n.nextSibling}while(n&&n.nodeName.toLowerCase()!=="script");return b.getJaxFor(n)},getHoverSpan:function(n,o){return n.root.PHTMLspanElement()},getHoverBBox:function(n,q,r){var s=n.root.PHTML,p=n.PHTML.outerEm;var o={w:s.w*p,h:s.h*p,d:s.d*p};if(s.width){o.width=s.width}return o},Zoom:function(o,u,s,n,r){u.className="MathJax";this.idPostfix="-zoom";o.root.toPHTML(u,u);this.idPostfix="";u.style.position="absolute";if(!width){s.style.position="absolute"}var t=u.offsetWidth,q=u.offsetHeight,v=s.offsetHeight,p=s.offsetWidth;if(p===0){p=s.parentNode.offsetWidth}u.style.position=s.style.position="";return{Y:-j.getBBox(u).h,mW:p,mH:v,zW:t,zH:q}},initPHTML:function(o,n){},Remove:function(n){var o=document.getElementById(n.inputID+"-Frame");if(o){if(n.PHTML.display){o=o.parentNode}o.parentNode.removeChild(o)}delete n.PHTML},ID:0,idPostfix:"",GetID:function(){this.ID++;return this.ID},VARIANT:{bold:"MJXp-bold",italic:"MJXp-italic","bold-italic":"MJXp-bold MJXp-italic",script:"MJXp-scr","bold-script":"MJXp-scr MJXp-bold",fraktur:"MJXp-frak","bold-fraktur":"MJXp-frak MJXp-bold",monospace:"MJXp-mono","sans-serif":"MJXp-sf","-tex-caligraphic":"MJXp-cal"},MATHSPACE:{veryverythinmathspace:1/18,verythinmathspace:2/18,thinmathspace:3/18,mediummathspace:4/18,thickmathspace:5/18,verythickmathspace:6/18,veryverythickmathspace:7/18,negativeveryverythinmathspace:-1/18,negativeverythinmathspace:-2/18,negativethinmathspace:-3/18,negativemediummathspace:-4/18,negativethickmathspace:-5/18,negativeverythickmathspace:-6/18,negativeveryverythickmathspace:-7/18,thin:0.08,medium:0.1,thick:0.15,infinity:k},TeX:{x_height:0.430554},pxPerInch:72,em:16,DELIMITERS:{"(":{dir:c},"{":{dir:c,w:0.58},"[":{dir:c},"|":{dir:c,w:0.275},")":{dir:c},"}":{dir:c,w:0.58},"]":{dir:c},"/":{dir:c},"\\":{dir:c},"\u2223":{dir:c,w:0.275},"\u2225":{dir:c,w:0.55},"\u230A":{dir:c,w:0.5},"\u230B":{dir:c,w:0.5},"\u2308":{dir:c,w:0.5},"\u2309":{dir:c,w:0.5},"\u27E8":{dir:c,w:0.5},"\u27E9":{dir:c,w:0.5},"\u2191":{dir:c,w:0.65},"\u2193":{dir:c,w:0.65},"\u21D1":{dir:c,w:0.75},"\u21D3":{dir:c,w:0.75},"\u2195":{dir:c,w:0.65},"\u21D5":{dir:c,w:0.75},"\u27EE":{dir:c,w:0.275},"\u27EF":{dir:c,w:0.275},"\u23B0":{dir:c,w:0.6},"\u23B1":{dir:c,w:0.6}},REMAPACCENT:{"\u20D7":"\u2192","'":"\u02CB","`":"\u02CA",".":"\u02D9","^":"\u02C6","-":"\u02C9","~":"\u02DC","\u00AF":"\u02C9","\u00B0":"\u02DA","\u00B4":"\u02CA","\u0300":"\u02CB","\u0301":"\u02CA","\u0302":"\u02C6","\u0303":"\u02DC","\u0304":"\u02C9","\u0305":"\u02C9","\u0306":"\u02D8","\u0307":"\u02D9","\u0308":"\u00A8","\u030C":"\u02C7"},REMAPACCENTUNDER:{},length2em:function(r,p){if(typeof(r)!=="string"){r=r.toString()}if(r===""){return""}if(r===h.SIZE.NORMAL){return 1}if(r===h.SIZE.BIG){return 2}if(r===h.SIZE.SMALL){return 0.71}if(this.MATHSPACE[r]){return this.MATHSPACE[r]}var o=r.match(/^\s*([-+]?(?:\.\d+|\d+(?:\.\d*)?))?(pt|em|ex|mu|px|pc|in|mm|cm|%)?/);var n=parseFloat(o[1]||"1"),q=o[2];if(p==null){p=1}if(q==="em"){return n}if(q==="ex"){return n*this.TeX.x_height}if(q==="%"){return n/100*p}if(q==="px"){return n/this.em}if(q==="pt"){return n/10}if(q==="pc"){return n*1.2}if(q==="in"){return n*this.pxPerInch/this.em}if(q==="cm"){return n*this.pxPerInch/this.em/2.54}if(q==="mm"){return n*this.pxPerInch/this.em/25.4}if(q==="mu"){return n/18}return n*p},Em:function(n){if(Math.abs(n)<0.001){return"0em"}return(n.toFixed(3).replace(/\.?0+$/,""))+"em"},arrayEntry:function(n,o){return n[Math.max(0,Math.min(o,n.length-1))]}});MathJax.Hub.Register.StartupHook("mml Jax Ready",function(){h=MathJax.ElementJax.mml;h.mbase.Augment({toPreviewHTML:function(o,n){return this.PHTMLdefaultSpan(o,n)},PHTMLdefaultSpan:function(q,o){if(!o){o={}}q=this.PHTMLcreateSpan(q);this.PHTMLhandleStyle(q);this.PHTMLhandleColor(q);if(this.isToken){this.PHTMLhandleToken(q)}for(var p=0,n=this.data.length;p<n;p++){this.PHTMLaddChild(q,p,o)}return q},PHTMLaddChild:function(p,o,n){var q=this.data[o];if(q){if(n.childSpans){p=e.addElement(p,"span",{className:n.className})}q.toPreviewHTML(p);if(!n.noBBox){this.PHTML.w+=q.PHTML.w+q.PHTML.l+q.PHTML.r;if(q.PHTML.h>this.PHTML.h){this.PHTML.h=q.PHTML.h}if(q.PHTML.d>this.PHTML.d){this.PHTML.d=q.PHTML.d}if(q.PHTML.t>this.PHTML.t){this.PHTML.t=q.PHTML.t}if(q.PHTML.b>this.PHTML.b){this.PHTML.b=q.PHTML.b}}}else{if(n.forceChild){e.addElement(p,"span")}}},PHTMLstretchChild:function(q,p,s){var r=this.data[q];if(r&&r.PHTMLcanStretch("Vertical",p,s)){var t=this.PHTML,o=r.PHTML,n=o.w;r.PHTMLstretchV(p,s);t.w+=o.w-n;if(o.h>t.h){t.h=o.h}if(o.d>t.d){t.d=o.d}}},PHTMLcreateSpan:function(n){if(!this.PHTML){this.PHTML={}}this.PHTML={w:0,h:0,d:0,l:0,r:0,t:0,b:0};if(this.inferred){return n}if(this.type==="mo"&&this.data.join("")==="\u222B"){g.lastIsInt=true}else{if(this.type!=="mspace"||this.width!=="negativethinmathspace"){g.lastIsInt=false}}if(!this.PHTMLspanID){this.PHTMLspanID=g.GetID()}var o=(this.id||"MJXp-Span-"+this.PHTMLspanID);return e.addElement(n,"span",{className:"MJXp-"+this.type,id:o})},PHTMLspanElement:function(){if(!this.PHTMLspanID){return null}return document.getElementById(this.id||"MJXp-Span-"+this.PHTMLspanID)},PHTMLhandleToken:function(o){var n=this.getValues("mathvariant");if(n.mathvariant!==h.VARIANT.NORMAL){o.className+=" "+g.VARIANT[n.mathvariant]}},PHTMLhandleStyle:function(n){if(this.style){n.style.cssText=this.style}},PHTMLhandleColor:function(n){if(this.mathcolor){n.style.color=this.mathcolor}if(this.mathbackground){n.style.backgroundColor=this.mathbackground}},PHTMLhandleScriptlevel:function(n){var o=this.Get("scriptlevel");if(o){n.className+=" MJXp-script"}},PHTMLhandleText:function(y,A){var v,p;var z=0,o=0,q=0;for(var s=0,r=A.length;s<r;s++){p=A.charCodeAt(s);v=A.charAt(s);if(p>=55296&&p<56319){s++;p=(((p-55296)<<10)+(A.charCodeAt(s)-56320))+65536}var t=0.7,u=0.22,x=0.5;if(p<127){if(v.match(/[A-Za-ehik-or-xz0-9]/)){u=0}if(v.match(/[A-HK-Z]/)){x=0.67}else{if(v.match(/[IJ]/)){x=0.36}}if(v.match(/[acegm-su-z]/)){t=0.45}else{if(v.match(/[ij]/)){t=0.75}}if(v.match(/[ijlt]/)){x=0.28}}if(g.DELIMITERS[v]){x=g.DELIMITERS[v].w||0.4}if(t>z){z=t}if(u>o){o=u}q+=x}if(!this.CHML){this.PHTML={}}this.PHTML={h:0.9,d:0.3,w:q,l:0,r:0,t:z,b:o};e.addText(y,A)},PHTMLbboxFor:function(o){if(this.data[o]&&this.data[o].PHTML){return this.data[o].PHTML}return{w:0,h:0,d:0,l:0,r:0,t:0,b:0}},PHTMLcanStretch:function(q,o,p){if(this.isEmbellished()){var n=this.Core();if(n&&n!==this){return n.PHTMLcanStretch(q,o,p)}}return false},PHTMLstretchV:function(n,o){},PHTMLstretchH:function(n){},CoreParent:function(){var n=this;while(n&&n.isEmbellished()&&n.CoreMO()===this&&!n.isa(h.math)){n=n.Parent()}return n},CoreText:function(n){if(!n){return""}if(n.isEmbellished()){return n.CoreMO().data.join("")}while((n.isa(h.mrow)||n.isa(h.TeXAtom)||n.isa(h.mstyle)||n.isa(h.mphantom))&&n.data.length===1&&n.data[0]){n=n.data[0]}if(!n.isToken){return""}else{return n.data.join("")}}});h.chars.Augment({toPreviewHTML:function(n){var o=this.toString().replace(/[\u2061-\u2064]/g,"");this.PHTMLhandleText(n,o)}});h.entity.Augment({toPreviewHTML:function(n){var o=this.toString().replace(/[\u2061-\u2064]/g,"");this.PHTMLhandleText(n,o)}});h.math.Augment({toPreviewHTML:function(n){n=this.PHTMLdefaultSpan(n);if(this.Get("display")==="block"){n.className+=" MJXp-display"}return n}});h.mo.Augment({toPreviewHTML:function(o){o=this.PHTMLdefaultSpan(o);this.PHTMLadjustAccent(o);var n=this.getValues("lspace","rspace","scriptlevel","displaystyle","largeop");if(n.scriptlevel===0){this.PHTML.l=g.length2em(n.lspace);this.PHTML.r=g.length2em(n.rspace);o.style.marginLeft=g.Em(this.PHTML.l);o.style.marginRight=g.Em(this.PHTML.r)}else{this.PHTML.l=0.15;this.PHTML.r=0.1}if(n.displaystyle&&n.largeop){var p=e.Element("span",{className:"MJXp-largeop"});p.appendChild(o.firstChild);o.appendChild(p);this.PHTML.h*=1.2;this.PHTML.d*=1.2;if(this.data.join("")==="\u222B"){p.className+=" MJXp-int"}}return o},PHTMLadjustAccent:function(p){var o=this.CoreParent();if(o&&o.isa(h.munderover)&&this.CoreText(o.data[o.base]).length===1){var q=o.data[o.over],n=o.data[o.under];var s=this.data.join(""),r;if(q&&this===q.CoreMO()&&o.Get("accent")){r=g.REMAPACCENT[s]}else{if(n&&this===n.CoreMO()&&o.Get("accentunder")){r=g.REMAPACCENTUNDER[s]}}if(r){s=p.innerHTML=r}if(s.match(/[\u02C6-\u02DC\u00A8]/)){this.PHTML.acc=-0.52}else{if(s==="\u2192"){this.PHTML.acc=-0.15;this.PHTML.vec=true}}}},PHTMLcanStretch:function(q,o,p){if(!this.Get("stretchy")){return false}var r=this.data.join("");if(r.length>1){return false}r=g.DELIMITERS[r];var n=(r&&r.dir===q.substr(0,1));if(n){n=(this.PHTML.h!==o||this.PHTML.d!==p||(this.Get("minsize",true)||this.Get("maxsize",true)))}return n},PHTMLstretchV:function(p,u){var o=this.PHTMLspanElement(),t=this.PHTML;var n=this.getValues("symmetric","maxsize","minsize");if(n.symmetric){l=2*Math.max(p-0.25,u+0.25)}else{l=p+u}n.maxsize=g.length2em(n.maxsize,t.h+t.d);n.minsize=g.length2em(n.minsize,t.h+t.d);l=Math.max(n.minsize,Math.min(n.maxsize,l));var s=l/(t.h+t.d-0.3);var q=e.Element("span",{style:{"font-size":g.Em(s)}});if(s>1.25){var r=Math.ceil(1.25/s*10);q.className="MJXp-right MJXp-scale"+r;q.style.marginLeft=g.Em(t.w*(r/10-1)+0.07);t.w*=s*r/10}q.appendChild(o.firstChild);o.appendChild(q);if(n.symmetric){o.style.verticalAlign=g.Em(0.25*(1-s))}}});h.mspace.Augment({toPreviewHTML:function(q){q=this.PHTMLdefaultSpan(q);var o=this.getValues("height","depth","width");var n=g.length2em(o.width),p=g.length2em(o.height),s=g.length2em(o.depth);var r=this.PHTML;r.w=n;r.h=p;r.d=s;if(n<0){if(!g.lastIsInt){q.style.marginLeft=g.Em(n)}n=0}q.style.width=g.Em(n);q.style.height=g.Em(p+s);if(s){q.style.verticalAlign=g.Em(-s)}return q}});h.mpadded.Augment({toPreviewHTML:function(u){u=this.PHTMLdefaultSpan(u,{childSpans:true,className:"MJXp-box",forceChild:true});var o=u.firstChild;var v=this.getValues("width","height","depth","lspace","voffset");var s=this.PHTMLdimen(v.lspace);var q=0,n=0,t=s.len,r=-s.len,p=0;if(v.width!==""){s=this.PHTMLdimen(v.width,"w",0);if(s.pm){r+=s.len}else{u.style.width=g.Em(s.len)}}if(v.height!==""){s=this.PHTMLdimen(v.height,"h",0);if(!s.pm){q+=-this.PHTMLbboxFor(0).h}q+=s.len}if(v.depth!==""){s=this.PHTMLdimen(v.depth,"d",0);if(!s.pm){n+=-this.PHTMLbboxFor(0).d;p+=-s.len}n+=s.len}if(v.voffset!==""){s=this.PHTMLdimen(v.voffset);q-=s.len;n+=s.len;p+=s.len}if(q){o.style.marginTop=g.Em(q)}if(n){o.style.marginBottom=g.Em(n)}if(t){o.style.marginLeft=g.Em(t)}if(r){o.style.marginRight=g.Em(r)}if(p){u.style.verticalAlign=g.Em(p)}return u},PHTMLdimen:function(q,r,n){if(n==null){n=-k}q=String(q);var o=q.match(/width|height|depth/);var p=(o?this.PHTML[o[0].charAt(0)]:(r?this.PHTML[r]:0));return{len:g.length2em(q,p)||0,pm:!!q.match(/^[-+]/)}}});h.munderover.Augment({toPreviewHTML:function(r){var t=this.getValues("displaystyle","accent","accentunder","align");var n=this.data[this.base];if(!t.displaystyle&&n!=null&&(n.movablelimits||n.CoreMO().Get("movablelimits"))){r=h.msubsup.prototype.toPreviewHTML.call(this,r);r.className=r.className.replace(/munderover/,"msubsup");return r}r=this.PHTMLdefaultSpan(r,{childSpans:true,className:"",noBBox:true});var p=this.PHTMLbboxFor(this.over),v=this.PHTMLbboxFor(this.under),u=this.PHTMLbboxFor(this.base),s=this.PHTML,o=p.acc;if(this.data[this.over]){if(r.lastChild.firstChild){r.lastChild.firstChild.style.marginLeft=p.l=r.lastChild.firstChild.style.marginRight=p.r=0}var q=e.Element("span",{},[["span",{className:"MJXp-over"}]]);q.firstChild.appendChild(r.lastChild);if(r.childNodes.length>(this.data[this.under]?1:0)){q.firstChild.appendChild(r.firstChild)}this.data[this.over].PHTMLhandleScriptlevel(q.firstChild.firstChild);if(o!=null){if(p.vec){q.firstChild.firstChild.firstChild.style.fontSize="60%";p.h*=0.6;p.d*=0.6;p.w*=0.6}o=o-p.d+0.1;if(u.t!=null){o+=u.t-u.h}q.firstChild.firstChild.style.marginBottom=g.Em(o)}if(r.firstChild){r.insertBefore(q,r.firstChild)}else{r.appendChild(q)}}if(this.data[this.under]){if(r.lastChild.firstChild){r.lastChild.firstChild.style.marginLeft=v.l=r.lastChild.firstChild.marginRight=v.r=0}this.data[this.under].PHTMLhandleScriptlevel(r.lastChild)}s.w=Math.max(0.8*p.w,0.8*v.w,u.w);s.h=0.8*(p.h+p.d+(o||0))+u.h;s.d=u.d+0.8*(v.h+v.d);return r}});h.msubsup.Augment({toPreviewHTML:function(q){q=this.PHTMLdefaultSpan(q,{noBBox:true});if(!this.data[this.base]){if(q.firstChild){q.insertBefore(e.Element("span"),q.firstChild)}else{q.appendChild(e.Element("span"))}}var s=this.data[this.base],p=this.data[this.sub],n=this.data[this.sup];if(!s){s={bbox:{h:0.8,d:0.2}}}q.firstChild.style.marginRight=".05em";var o=Math.max(0.4,s.PHTML.h-0.4),u=Math.max(0.2,s.PHTML.d+0.1);var t=this.PHTML;if(n&&p){var r=e.Element("span",{className:"MJXp-script-box",style:{height:g.Em(o+n.PHTML.h*0.8+u+p.PHTML.d*0.8),"vertical-align":g.Em(-u-p.PHTML.d*0.8)}},[["span",{},[["span",{},[["span",{style:{"margin-bottom":g.Em(-(n.PHTML.d-0.05))}}]]]]],["span",{},[["span",{},[["span",{style:{"margin-top":g.Em(-(n.PHTML.h-0.05))}}]]]]]]);p.PHTMLhandleScriptlevel(r.firstChild);n.PHTMLhandleScriptlevel(r.lastChild);r.firstChild.firstChild.firstChild.appendChild(q.lastChild);r.lastChild.firstChild.firstChild.appendChild(q.lastChild);q.appendChild(r);t.h=Math.max(s.PHTML.h,n.PHTML.h*0.8+o);t.d=Math.max(s.PHTML.d,p.PHTML.d*0.8+u);t.w=s.PHTML.w+Math.max(n.PHTML.w,p.PHTML.w)+0.07}else{if(n){q.lastChild.style.verticalAlign=g.Em(o);n.PHTMLhandleScriptlevel(q.lastChild);t.h=Math.max(s.PHTML.h,n.PHTML.h*0.8+o);t.d=Math.max(s.PHTML.d,n.PHTML.d*0.8-o);t.w=s.PHTML.w+n.PHTML.w+0.07}else{if(p){q.lastChild.style.verticalAlign=g.Em(-u);p.PHTMLhandleScriptlevel(q.lastChild);t.h=Math.max(s.PHTML.h,p.PHTML.h*0.8-u);t.d=Math.max(s.PHTML.d,p.PHTML.d*0.8+u);t.w=s.PHTML.w+p.PHTML.w+0.07}}}return q}});h.mfrac.Augment({toPreviewHTML:function(r){r=this.PHTMLdefaultSpan(r,{childSpans:true,className:"MJXp-box",forceChild:true,noBBox:true});var o=this.getValues("linethickness","displaystyle");if(!o.displaystyle){if(this.data[0]){this.data[0].PHTMLhandleScriptlevel(r.firstChild)}if(this.data[1]){this.data[1].PHTMLhandleScriptlevel(r.lastChild)}}var n=e.Element("span",{className:"MJXp-box"},[["span",{className:"MJXp-denom"},[["span",{},[["span",{className:"MJXp-rule",style:{height:"1em"}}]]],["span"]]]]);n.firstChild.lastChild.appendChild(r.lastChild);r.appendChild(n);var s=this.PHTMLbboxFor(0),p=this.PHTMLbboxFor(1),v=this.PHTML;v.w=Math.max(s.w,p.w)*0.8;v.h=s.h+s.d+0.1+0.25;v.d=p.h+p.d-0.25;v.l=v.r=0.125;o.linethickness=Math.max(0,g.length2em(o.linethickness||"0",0));if(o.linethickness){var u=n.firstChild.firstChild.firstChild;var q=g.Em(o.linethickness);u.style.borderTop="none";u.style.borderBottom=(o.linethickness<0.15?"1px":q)+" solid";u.style.margin=q+" 0";q=o.linethickness;n.style.marginTop=g.Em(3*q-1.2);r.style.verticalAlign=g.Em(1.5*q+0.1);v.h+=1.5*q-0.1;v.d+=1.5*q}else{n.style.marginTop="-.7em"}return r}});h.msqrt.Augment({toPreviewHTML:function(n){n=this.PHTMLdefaultSpan(n,{childSpans:true,className:"MJXp-box",forceChild:true,noBBox:true});this.PHTMLlayoutRoot(n,n.firstChild);return n},PHTMLlayoutRoot:function(u,n){var v=this.PHTMLbboxFor(0);var q=Math.ceil((v.h+v.d+0.14)*100),w=g.Em(14/q);var r=e.Element("span",{className:"MJXp-surd"},[["span",{style:{"font-size":q+"%","margin-top":w}},["\u221A"]]]);var s=e.Element("span",{className:"MJXp-root"},[["span",{className:"MJXp-rule",style:{"border-top":".08em solid"}}]]);var p=(1.2/2.2)*q/100;if(q>150){var o=Math.ceil(150/q*10);r.firstChild.className="MJXp-right MJXp-scale"+o;r.firstChild.style.marginLeft=g.Em(p*(o/10-1)/q*100);p=p*o/10;s.firstChild.style.borderTopWidth=g.Em(0.08/Math.sqrt(o/10))}s.appendChild(n);u.appendChild(r);u.appendChild(s);this.PHTML.h=v.h+0.18;this.PHTML.d=v.d;this.PHTML.w=v.w+p;return u}});h.mroot.Augment({toPreviewHTML:function(q){q=this.PHTMLdefaultSpan(q,{childSpans:true,className:"MJXp-box",forceChild:true,noBBox:true});var p=this.PHTMLbboxFor(1),n=q.removeChild(q.lastChild);var t=this.PHTMLlayoutRoot(e.Element("span"),q.firstChild);n.className="MJXp-script";var u=parseInt(t.firstChild.firstChild.style.fontSize);var o=0.55*(u/120)+p.d*0.8,s=-0.6*(u/120);if(u>150){s*=0.95*Math.ceil(150/u*10)/10}n.style.marginRight=g.Em(s);n.style.verticalAlign=g.Em(o);if(-s>p.w*0.8){n.style.marginLeft=g.Em(-s-p.w*0.8)}q.appendChild(n);q.appendChild(t);this.PHTML.w+=Math.max(0,p.w*0.8+s);this.PHTML.h=Math.max(this.PHTML.h,p.h*0.8+o);return q},PHTMLlayoutRoot:h.msqrt.prototype.PHTMLlayoutRoot});h.mfenced.Augment({toPreviewHTML:function(q){q=this.PHTMLcreateSpan(q);this.PHTMLhandleStyle(q);this.PHTMLhandleColor(q);this.addFakeNodes();this.PHTMLaddChild(q,"open",{});for(var p=0,n=this.data.length;p<n;p++){this.PHTMLaddChild(q,"sep"+p,{});this.PHTMLaddChild(q,p,{})}this.PHTMLaddChild(q,"close",{});var o=this.PHTML.h,r=this.PHTML.d;this.PHTMLstretchChild("open",o,r);for(p=0,n=this.data.length;p<n;p++){this.PHTMLstretchChild("sep"+p,o,r);this.PHTMLstretchChild(p,o,r)}this.PHTMLstretchChild("close",o,r);return q}});h.mrow.Augment({toPreviewHTML:function(q){q=this.PHTMLdefaultSpan(q);var p=this.PHTML.h,r=this.PHTML.d;for(var o=0,n=this.data.length;o<n;o++){this.PHTMLstretchChild(o,p,r)}return q}});h.mstyle.Augment({toPreviewHTML:function(n){n=this.PHTMLdefaultSpan(n);this.PHTMLhandleScriptlevel(n);return n}});h.TeXAtom.Augment({toPreviewHTML:function(n){n=this.PHTMLdefaultSpan(n);n.className="MJXp-mrow";return n}});h.mtable.Augment({toPreviewHTML:function(E){E=this.PHTMLdefaultSpan(E,{noBBox:true});var r=this.getValues("columnalign","rowalign","columnspacing","rowspacing","columnwidth","equalcolumns","equalrows","columnlines","rowlines","frame","framespacing","align","width");var u=MathJax.Hub.SplitList,F,A,D,z;var N=u(r.columnspacing),w=u(r.rowspacing),L=u(r.columnalign),t=u(r.rowalign);for(F=0,A=N.length;F<A;F++){N[F]=g.length2em(N[F])}for(F=0,A=w.length;F<A;F++){w[F]=g.length2em(w[F])}var K=e.Element("span");while(E.firstChild){K.appendChild(E.firstChild)}E.appendChild(K);var y=0,s=0;for(F=0,A=this.data.length;F<A;F++){var v=this.data[F];if(v){var J=g.arrayEntry(w,F-1),C=g.arrayEntry(t,F);var x=v.PHTML,q=v.PHTMLspanElement();q.style.verticalAlign=C;var B=(v.type==="mlabeledtr"?1:0);for(D=0,z=v.data.length;D<z-B;D++){var p=v.data[D+B];if(p){var M=g.arrayEntry(N,D-1),G=g.arrayEntry(L,D);var I=p.PHTMLspanElement();if(D){x.w+=M;I.style.paddingLeft=g.Em(M)}if(F){I.style.paddingTop=g.Em(J)}I.style.textAlign=G}}y+=x.h+x.d;if(F){y+=J}if(x.w>s){s=x.w}}}var o=this.PHTML;o.w=s;o.h=y/2+0.25;o.d=y/2-0.25;o.l=o.r=0.125;return E}});h.mlabeledtr.Augment({PHTMLdefaultSpan:function(q,o){if(!o){o={}}q=this.PHTMLcreateSpan(q);this.PHTMLhandleStyle(q);this.PHTMLhandleColor(q);if(this.isToken){this.PHTMLhandleToken(q)}for(var p=1,n=this.data.length;p<n;p++){this.PHTMLaddChild(q,p,o)}return q}});h.semantics.Augment({toPreviewHTML:function(n){n=this.PHTMLcreateSpan(n);if(this.data[0]){this.data[0].toPreviewHTML(n);MathJax.Hub.Insert(this.data[0].PHTML||{},this.PHTML)}return n}});h.annotation.Augment({toPreviewHTML:function(n){}});h["annotation-xml"].Augment({toPreviewHTML:function(n){}});MathJax.Hub.Register.StartupHook("onLoad",function(){setTimeout(MathJax.Callback(["loadComplete",g,"jax.js"]),0)})});MathJax.Hub.Register.StartupHook("End Cookie",function(){if(b.config.menuSettings.zoom!=="None"){i.Require("[MathJax]/extensions/MathZoom.js")}})})(MathJax.Ajax,MathJax.Hub,MathJax.HTML,MathJax.OutputJax.PreviewHTML);
diff --git a/src/main/webapp/math/package.json b/src/main/webapp/math/package.json
deleted file mode 100644
index 693a3b57..00000000
--- a/src/main/webapp/math/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "mathjax",
- "version": "2.7.5",
- "description": "Beautiful math in all browsers. MathJax is an open-source JavaScript display engine for LaTeX, MathML, and AsciiMath notation that works in all browsers.",
- "keywords": [
- "math",
- "svg",
- "mathml",
- "tex",
- "latex",
- "asciimath",
- "browser",
- "browser-only"
- ],
- "maintainers": [
- "MathJax Consortium <info@mathjax.org> (http://www.mathjax.org)"
- ],
- "bugs": {
- "url": "http://github.com/mathjax/MathJax/issues"
- },
- "license": "Apache-2.0",
- "repository": {
- "type": "git",
- "url": "git://github.com/mathjax/MathJax.git"
- },
- "main": "./unpacked/MathJax.js",
- "scripts": {
- "test": "echo 'No tests here!'"
- }
-}
diff --git a/src/main/webapp/offline.html b/src/main/webapp/offline.html
deleted file mode 100644
index aaaa2303..00000000
--- a/src/main/webapp/offline.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<html manifest="cache.manifest">
-</html>
diff --git a/src/main/webapp/onedrive.html b/src/main/webapp/onedrive.html
deleted file mode 100644
index b2ed1933..00000000
--- a/src/main/webapp/onedrive.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title></title>
- <script src="//js.live.net/v5.0/wl.js"></script>
- </head>
- <body>
- <script>
- // Extract authentication info from redirect URL in popup window
- function getAuthInfoFromUrl()
- {
- if (window.location.hash != null)
- {
- try
- {
- var result = new Object();
- var authResponse = window.location.hash.substring(1);
- var params = authResponse.split('&');
-
- for (var i = 0; i < params.length; i++)
- {
- idx = params[i].indexOf('=');
-
- if (idx > 0)
- {
- result[params[i].substring(0, idx)] = params[i].substring(idx + 1);
- }
- }
-
- return result;
- }
- catch (e)
- {
- // ignores parsing errors
- }
- }
-
- return null;
- };
-
- // Main
- if (window.opener != null && window.opener.onOneDriveCallback != null)
- {
- try
- {
- var authInfo = getAuthInfoFromUrl();
- var token = authInfo['access_token'];
- window.opener.onOneDriveCallback(token, window);
- }
- catch (e)
- {
- alert('OneDrive: ' + e.toString());
- window.close();
- }
- }
- </script>
- </body>
-</html>
diff --git a/src/main/webapp/onedrive2.html b/src/main/webapp/onedrive2.html
deleted file mode 100644
index 3e743f7e..00000000
--- a/src/main/webapp/onedrive2.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title></title>
- <script type="text/javascript" src="https://js.live.net/v7.0/OneDrive.js"></script>
- </head>
- <body>
- </body>
-</html>
diff --git a/src/main/webapp/plugins/cConf-license.js b/src/main/webapp/plugins/cConf-license.js
deleted file mode 100644
index 9ee21515..00000000
--- a/src/main/webapp/plugins/cConf-license.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Plugin for Confluence Cloud to get the license
- */
-Draw.loadPlugin(function(ui)
-{
- ui.checkConfLicense = function(license, xdm_e, callback)
- {
- //Exclude dev domain
- if (location.host == 'test.draw.io')
- {
- callback(true);
- return;
- }
-
- var licenseValid = true;
-
- if (license != null && xdm_e != null && license == 'none')
- {
- var hostParse = document.createElement('a');
- hostParse.href = xdm_e;
- var hostname = hostParse.hostname;
-
- if (hostname != null)
- {
- var xhr = new XMLHttpRequest();
-
- xhr.onreadystatechange = function()
- {
- if (xhr.readyState == XMLHttpRequest.DONE)
- {
- if (xhr.status >= 200 && xhr.status <= 299)
- {
- var resp = xhr.responseText;
-
- if (resp != null && resp.length > 0)
- {
- var lic = JSON.parse(resp);
-
- if (lic.atlasCloudLic != 'blocked')
- {
- licenseValid = true;
- }
- else
- {
- licenseValid = false;
- }
- }
- else if (resp != null && resp.length == 0)
- {
- // JSON parse fails on empty response
- licenseValid = false;
- }
- }
-
- callback(licenseValid);
- }
- };
-
- xhr.open('POST', '/license?domain=' + hostname, true);
- xhr.send(null);
- }
- else
- {
- callback(licenseValid);
- }
- }
- else
- {
- callback(licenseValid);
- }
- };
-}); \ No newline at end of file
diff --git a/src/main/webapp/plugins/electron.js b/src/main/webapp/plugins/electron.js
deleted file mode 100644
index f2b1ce06..00000000
--- a/src/main/webapp/plugins/electron.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Plugin for electron build
- */
-Draw.loadPlugin(function(ui)
-{
- if (!window.mxIsElectron5)
- {
- alert('You need to update to latest draw.io desktop');
- }
-}); \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_api_hosting.png b/src/main/webapp/templates/gcp/backup_and_archive_api_hosting.png
deleted file mode 100644
index fb3de01c..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_api_hosting.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_api_hosting.xml b/src/main/webapp/templates/gcp/backup_and_archive_api_hosting.xml
deleted file mode 100644
index e1769844..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_api_hosting.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_cold_standby_server.png b/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_cold_standby_server.png
deleted file mode 100644
index 03087ddf..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_cold_standby_server.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_cold_standby_server.xml b/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_cold_standby_server.xml
deleted file mode 100644
index 2719cce6..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_cold_standby_server.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_warm_static_site.png b/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_warm_static_site.png
deleted file mode 100644
index 9f7f6a63..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_warm_static_site.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_warm_static_site.xml b/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_warm_static_site.xml
deleted file mode 100644
index fe0f2294..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_warm_static_site.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_with_application_replication.png b/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_with_application_replication.png
deleted file mode 100644
index 3211a6aa..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_with_application_replication.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_with_application_replication.xml b/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_with_application_replication.xml
deleted file mode 100644
index 29451302..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_disaster_recovery_with_application_replication.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7Vxbc6M2FP41fkwGEGDzmPiy7Uy6Teud7qNHNjKmwYgFOZf++kogYZCE4wtOnAR7ZhckAeLoO9+5yemB4fr5WwqT1R/YR1HPMvznHhj1LMu0LZf+x1peipY+GBQNQRr6fNC2YRr+h3ijwVs3oY+y2kCCcUTCpN64wHGMFqTWBtMUP9WHLXFUf2oCA6Q0TBcwUlt/hj5Z8VbT9bYdv6EwWPFHD6x+0TGHi4cgxZuYP69ngWX+KbrXUNyLv2i2gj5+qjSBcQ8MU4xJcbR+HqKIyVaIrbhu0tBbzjtFMdnrAru44hFGGySm7Eb02ts5PQjYwTeMAyoYdqeih96u7BxGeOPTvvsIkiVO1/y1yIsQ5TKMoiGOcJqfgonLvvTCjKT4AYmeGMeINQpxGPQkSKEf0veQxixxTDhi6OzBLYzCIKYnEVqyCWUJXIRxwHoNPrry+L7JvrTdG7MvPXhEKQnpyt/w2xCcbO/yg52MrmzxWP5axnbEXf7Ukc2aVmQdsefmIpLXgS8Nexx6rjTxdfmG8BqR9IUO4b3A4xjhOuRx7D1tAekCPmRVwSIYCEXgShCUt94CgR5wLDTgwtHgQlpZulgJO1w/B4wFroNFYl0HOVhmCwaLWSJAQcXXNgw0Erb3FnFFhhZQRSi0M0X0BcLHOinoxMqfcI9DOplyBa36AgpyEzfAy2WGiLIq5TT3WijPdpSFQT4lM36KU7LCAY5hNN623uYMhXwu4QpuIzhH0W1JYvK6EJiSSRiJ0fk510WmIyj2bxj70tN5hBcPP1ZhXDRXLqJnlUv+RYS88HO4IZg2bad8h3P9MxWcUATZ1sCegLJH0LQlMYSlcoCRfyrMsaAQQrTz1ofZqpRK/nK61ynkzYTcSLq8KcObdIHEQnENorcNEB/nVUi/BtC9kbevQpePr2j0lMDYh6lfMn4qWH2EHsMFNcAysra4YWsC5xmONgTdpAshbtZanll1bGlVvUG7awxQW5ZXFrfkdcks7KR5YSw0rC/RFhg7E6fEgMI0GhQ08rsJ6vRgGYZC8J6G3xUeOQ4OQA+HOZvhNIZJtsKkA4AMgLE5cSbjdgBgm68DwNQhwBy0gQDHVBAwpL5ziFKVD35nBCmcbaX3axqgEmgHG6AmiNZgfqyVsTVWBlg7gWhcW04NiVfClTrMAaKihy+VAQlzh7Jm/6jv1hXA9qRg5bDx9KCYgf7qK/sNvDFHtbL/3H/vFOREBUkL8juzg3aI6kgoOrOiSJGEI0f1h41vUpSWAxM1tfBnfHWfonWYMdfSGEEC6X/DwvvuPA3J05iMb8feeTwNx1Y9jXJM1dPwWnA0+kDlRGW1FfLw848qFp5NqyybqTCMWePPfeGTE+s9zkIS4lpUKNbzThqwDn0/52oljpQRMMeE4LWSNNLkp7z8o8He0yokaEovZy1PKaxA6pbfXVaCRtbbPwdl2pKLKrINFeD0Nbjpt4IbNURRcFPTV+6gwnmZpKtIQ8JR32HfHQkoNbUVwaRQZSpS0ijjLdz3lrJxrUrV0WX2wDHGRnWEJG/PHIjnt2oABuZAWT+qfwzHC7JJacsN7WSezCZhz459+m8+4JEnm+GaSZuHGMYozGCWWwrjb7TAVLxFJo9KjF6XJBHVuFwzWX/lbHc+2h7dmJNdONiSzEn5aK7yjkbnS0prWXdlb1nl/IGrQZndRnCpWfuO89+M80/LS0mcD4AKnHNxvmd6l8X5azwPIzTzeT5Uw/2vyJprwunc74qBbbO/e90/B/17DlBW7kuEvWcvTPSOC29FTFgLb4sg7YT6w1HxLJDjkYEjoa0Snx6DPfGuF25+qnjQGQY5wCzx0C7jW5KnYPVVTjINDSm5bVC+pclD800FPbaPBOSiGX2ftmcIHLOmovsYgqKg7ceSDZAdCJGo2tt/aMgZlOMk9/EA72E/89RUgHxpNk8isVMzT14rxklOQ3tniUw8wQYdPexDD7a0LJbGITR1kUQ79KDLAhQVKCaPHtsEJkTi/trgIloUtrTSVNSqfqI5vWSK0sdtnYvOobiVKGfJBa4hXid0reiF4zgIKUm8KxMVk5mhYiqfjI52p9s/KR3pNuF1dNRIR/Z1fWGAofFXzkdIuq1xxxNSPXPVEdOlElNDoPSpicl2FUB1Ifwl7i0U++3rewsbMk9nrlXLJSO3FtsfOr6FXIDbWdf9ras7kJx9Y6DaVl2pWLDdaba1r6zVPUqzMCMoN4NlNiDMHtqzdUfkhZNyVjOfzmWW8R2Tl2b1Sj460uq5B1s9Uf6sWT3rLFbPPYsz/jEqV5dCF3LqcPCmrriuWnS8K842JM1hhjo//IL98Aan5lP74aArZxzASQPnPTkJqOWMd+IkXkSZ/nX3vnSUV06yX9EnYyLwFSsntuqg79ps1WULWtjn3jsuJyCc7r1yAuVuFMMzvBqUjtvhfrZN5YMOY5e0qUQLsiZmfNvEE+jv/pGEt3v86Ykn2+uwevFYtd/sB9gf5GcQF+LEy3lIW/fjWF0esh0nXt10wN3pMgX5HZEnnLaYhTzatY75TD6Ze219QfcadDsBDtkJIP0FBaevcoTu9/OtlCqAug0g31skh+H1qH3Hj+bfsnxBl5uFbMifBXCNZlkxxwsjkBNrF+Dwiv1Hr12ArnZxAH04YnvDDvo4X6kTqLWL2lagjkcuhUcOrzh8dB6xu3rDCaHK2/KIrdYbtjWDjkQuhESa0gyfhkTo6favlhbDt38aFoz/Bw==</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_hosting_filers.png b/src/main/webapp/templates/gcp/backup_and_archive_hosting_filers.png
deleted file mode 100644
index 58043991..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_hosting_filers.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/backup_and_archive_hosting_filers.xml b/src/main/webapp/templates/gcp/backup_and_archive_hosting_filers.xml
deleted file mode 100644
index 6b215f80..00000000
--- a/src/main/webapp/templates/gcp/backup_and_archive_hosting_filers.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/big_data_complex_event_processing.png b/src/main/webapp/templates/gcp/big_data_complex_event_processing.png
deleted file mode 100644
index 4907d300..00000000
--- a/src/main/webapp/templates/gcp/big_data_complex_event_processing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/big_data_complex_event_processing.xml b/src/main/webapp/templates/gcp/big_data_complex_event_processing.xml
deleted file mode 100644
index 30196249..00000000
--- a/src/main/webapp/templates/gcp/big_data_complex_event_processing.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">7V3bcqO4Fv2aPCbF3fDopJ2eh+45OZ1UzTlPXRhkTDVGDJdc5utHAgkDEjY2wnY7Sqq6jZBAlpb2WtraUm70h83719RN1t+hD6IbTfHfb/QvN5qmGpqF/sMpH1WKZTtVQpCGPsm0TXgO/wEkUSGpReiDrJUxhzDKw6Sd6ME4Bl7eSnPTFL61s61g1H5r4gaASXj23IhN/Sv08zVJVS1ne+MPEAZr8mpbm1U3lq73K0hhEZP33Wj6qvypbm9c+izyRbO168O3RpK+uNEfUgjz6tPm/QFEuG1ps1XlHnvu1vVOQZwPKaBVBV7dqAC0xlaEit4v0YcAf/gKYYDaBT+ouoOeVt98iGDho3tPkZuvYLoh3yr/oC25CqPoAUYwLS/1Rwv/ooJZnsJfgN6JYQxwIm0NBV0EqeuH6Gt08qxgnBPAqAa6dqMwiNFFBFa4QlniemEc4LsKyd14/UzFvyjdWeBf9OEVpHmIOn5OHpPDZPuUF3zx5dagryVfS9nm+Fa+9YuBk9b5JsLvLZuo2w2kZ/DrwHsjiXTLVwA3IE8/UBZyF4HqzqwKkUFkkMu3LSItg+Bo3QCjScHlklEQ1A/fIgF9IGDgA0PnAKPTtai3Evxx8x5gK3AXeIl2F5Ro+elhXPxMKCpQ+4nGAdvE2uAmbrQg/aLNBqTtlwJU//C1bRN4jUre8ARDVJdtDyqt7lM7vQJXqwzkTJ/U1RzUTYZiMf0CfGTLyCVM8zUMYOxGi23qfWmggE8auIFb383WdXrkLkF0Xxu0bh/lbprPsa3tpD2GuLbVIMHXZLDiQQRin5ZYRtD79bIO4yqZFFKrq0aRNj4QcgzNNh71+g41z1rHNGg1RHBz9FpHkpTBIvVILmQkCOO4aQBIPt02+FA6DCPo27sfjQwJRkzWDyHL6BoB0+wY9L0lDEPpgKyqxfGQm0nInQRyyu8KOU03hUKubp8GHT3nKXA3mOq7YNxCDfetu8xgVORgnnq0o3BqfaW14djf+T081OKqGswqBxsdLVJLkI6C2alIqK7hCJQGwZKq4do8uXkO0riskqZoXBD38CYHtr1qxWDVisXKFXXGkSt14ii5YkiEXDZCVEXpIMRhAWIqNkeOdZXTUQBxJGuJZi06+WixltUDg2lZC1Wmy0Fmi4MOLzGetWj7NGzSf+LbpxRswgxk9UQ7pZNpmoK7p4VU6+8C0hu3Wdlxc5RBVZL37U36lHmSRMg65CGMs8aUvXpo+0XNV09nIgnmD7KOCgelp7OO6OmLx8X9whFk+tSu6VN55KjyyFEXYft0mwEi0+GM/fDLH7ZliD+r0XMqY2TUlu0ciqDSjj7BLMTYRWkeal+QNrr0WyfDJvT90k5TCDAlKAiWMM/hhvHbcFxETvnDgd/bOszBMyqOU95St4Gqe/L07jgQgR29ix1NZbHD01VCZJXu7EdOa9ASj6y7rD1ljfboIGlm4t8dTiDWveRujRvKgpoxP6SpyUDobey6qVuShG1aQ4yD6FbrWAWz/QQhHiKdsFqzC+/d3FtLVXyRqhiNCgaD+mSy2FBUBgdSFo+TxabFk8XmWWQxOy03djtz9pYYL4tp+5xWFn9xESm5jRdITXxZmthQdA79TqiKzZlUxVejig1T46CHp4vpGv447AyYUZ1SF/vEuh0jiqtxMF4Um9OI4rpfxcpix5bCR7TwcXjC5yz+QJ2RMXR21Sd89pYQIHwGTKb5oxsWyG78KCOd2I4dS0mHaoqaTsTadI1ZRlTpQ5p6wOKZdFuASbdYb21HeXp1o2zFpa6UP6zepJFR8yQZLjkf4CZBcgAVW8RBiEyDME4x1dboH8IpXlWZn6CqSotZuqIkrTpjuCbpEaZ1vrYiMQ9QJANJz+GD8aOf9AyDRR71j40kvTbub1VnIs5zJOcJ5jyLF7lh6SM5b7jRYpe9WUo5/xzmYimmDtJrUgxP3QrxpluaUIppBDgM5RcarlssUd5n/G+VZX28t0XleVteUjfOXG/3IuQ5ua2KTy2WGWqDkzBby+VyBK21vTP2YKLr09/nILbZBKRmKAqDpBGkBt7D/H84+c4kV/+XdNegO51Hdz1aSjjdGYopBcwpenR2lkm7pTL0vCeIhy1h6LtLmOz6huhgVWvI3gmpyWjkKBvgwNNkFmcFVIwmM4RqsqcUeiDLjhFleIVqFaE+nl6ToTyVeLxgcebT5rhuedYzVbweeaZLyhZN2ebFULbhTE2nhmJIAJ0CQKNV/IUCqP62Uo8N0WOsj6yedZ3GR8ZGB43RY4uXb5cpxKrd8uW7pAY7swbric27Hg3GGjzhLjImVO3TkuuMR65jwz+H28/fI6rtYtnO5Gyv4LKdJYTteHFk44MOdrJKH+095zDF5+Kcn3YyUpPrCjmweuLsrjrkgEZbSnM0xBwZut7qFl3nGCOLc2SNEOk9ExsBRVyhANuWxSsop4EHmqT7MKhMzURKnFZLeQk3OOrqGaThjh0CZzeMS9oe163HezwR16LH9ZkmjeIhRtHpeiQ4R0dMp9FmvPW8483ijyLCJqaO8DzaOXF2a3Ra78DJdFo1Oj+ZTpvxlkGlSRpskkzeiQ7TmSSeS/usJilBYu9CTFJZlSszST2nD16zSTIUuUNL+DmDvK3pds+hGNMu/Nk2s93H2B26tbeEgHMGeYtPkgV7WNCymXONuM5TTuiWGBbkubpH+CuKbI3HBsSUBl5D74CzAuZJcnMRm7bcJLnODVvV0PxsFCg3bImmQJt3aGEfuMRHsKtCdyvIHu3rUbtnEj+tqJmZ3XkhPeW0T9TsLTFe1Ng8t74UNYNFjabw9ghOFY9u83Z0Hi9qvoMsc4OL3CNIvQ5zuU3w/GsufYfNX82aiz1kzeXTHr7BWj2dngy4bxeOkMM3bLFrLPLwjYuey/WJs6uey6nypE3hyt/gKH9n7EaY4XM5lkFkj07Qo/bY2bmguZypHDqX65QQMJeTy7SjVA1/L8uM5RYxczmxy7RVVK/yF/r+a1hkwxdq78PgvwXAlZ8ojO4deAXZV/wDZEW0I9TvjJpqGQZ/l81w3TO5nrXi65nJyUW6UTaQv8NhqkU6W+wiHbGBc6SqPrLw8IhiXB6N+LPaoW2oCq7JlU3tPuEyHYmgaGH8O1yGOG69u5Is+lh7smj9J8zDFf3DKPKA+yMPuH9UH21RB9zbzMZ2XtDydKfb07+4fuEsKU+3Z6HjMKdaqQa7BDXZ33xyBqwXnvJs+01pSn/6xJAeccK93bOh5MAT7nWLZhR9xr11N5uEmBx2MfEHSGCK64JYwN1gQFf/opTnNWq0qYjqvsjCGGTZMeJNElWXqPSF+WhORVR1GOTeP92riVj7cTTJVL8rUynMYTGafkKmGnDS4imZKq1s6xEMVY2B0QxF00TzU6ezBJHT7+HLluOeM+6ZUPzTjvsBJ3qdctwXGUiPEqZOj6/2UGGqTiVMnTtNgDBFlynEanCbHTfed+gDnONf</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/big_data_dmp_data_warehouse.png b/src/main/webapp/templates/gcp/big_data_dmp_data_warehouse.png
deleted file mode 100644
index a4e71779..00000000
--- a/src/main/webapp/templates/gcp/big_data_dmp_data_warehouse.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/big_data_dmp_data_warehouse.xml b/src/main/webapp/templates/gcp/big_data_dmp_data_warehouse.xml
deleted file mode 100644
index eb8f798c..00000000
--- a/src/main/webapp/templates/gcp/big_data_dmp_data_warehouse.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/big_data_log_processing.png b/src/main/webapp/templates/gcp/big_data_log_processing.png
deleted file mode 100644
index 847a2057..00000000
--- a/src/main/webapp/templates/gcp/big_data_log_processing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/big_data_log_processing.xml b/src/main/webapp/templates/gcp/big_data_log_processing.xml
deleted file mode 100644
index 8a1f8a5b..00000000
--- a/src/main/webapp/templates/gcp/big_data_log_processing.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">7VvbcqM4EP2aPM4Ud5tHO7d9yFR5K1O1jykZZKyNjDxCJPF+/bZA4k6MEzzJOLarEtQSSHSf7tMt8IV9uXm55Wi7/sFCTC8sI3y5sK8uLMt0LA/+Sckul3hTPxdEnIRqUCm4J/9hJTSUNCUhTmoDBWNUkG1dGLA4xoGoyRDn7Lk+bMVofdYtinBLcB8g2pb+Q0KxVlLT88uOvzCJ1mrqqTXJO5YoeIw4S2M134Vlr7JP3r1B+lrqRpM1CtlzRWRfX9iXnDGRH21eLjGVutVqy8+76ekt1s1xLIacYOUnPCGaYr1ij8Kp8yUcRPLglrEI9CIvlPfA1YrOS8rSEPoWFIkV4xt1V2KnNbkilF4yynjWtG88+YUTE8HZI9Y9MYuxFGptGNCIOAoJ3EZjzIrFQgHGdKCNKIliaFC8kgtKtiggcSR7DTW6Mv3ElF+Q+9fyCwdPmAsChp+pywi2La/yUzauvjl6WnVbRjniLpv1ypGitdhQOW+moqYZlGXkdPilIlJmucVsgwXfwRDdq7G2066hIPNcAnJqK9m6gkXHUUKknCAqrl0CAQ4UFrpxYXfgomFZMNZWHm5eIhkEvkfB1voeZWB5CCQsHrYaFKC+sWHQ1rA1WMMVDeobrSpQ+ybHsH7yVA8JXUpVMywYgbUUBtSXKexXvwBbrRIsWjYpljnITH7LTDMerImAmJhykMygc04i+HuFBMp9GG0kwqPck407JnsXnAU4SaTj7HFg52pm3rh7LWe+14GVY7kdTqwC6ugO59Qdzunwt4nZ4W9juNtk2rLkHIlg3TJHxi04VLeNlgmjqcBgda1SKS1aVl1LdZtJa1pT58but1XNE0OUrIuZq1a02jYq4mvDuq+GWx20O6JvBYRqaXI1CyQE5nG2JMuwijvUnG0VyGjBoAMsvchwjDoyLLsNDdPrCMVFzH4fNtpefi84Rpsudz3j4+PxYbsd+JgcDR++3UIBDiGdVU3GxZpFLEb0upTOS5w0UheKlpjOizS2aXCBuLghtEQMtJWdpSFwHM5k/g3NJWXB4881iXNx5SRoVU75FwuxU22UCgaicsl3LDPy6+BsG3UP+ozsU0FfAJbGvIpho4CG1OXrwADVs5QHapQ91RUL4hEWWmh3Q2hwkjEYDnr6V3O3pi7D7NNO1AqurTF7XeFmDU5Dw86hAaIwUYv13+W75qQR2w13WGz3xnDdaX/9JfWRVbhaJd6vlOVJm8ZvRZRXYz9IwFmC+ROBbK5SruXX8lTOp+o7XtRw0ItIDMq1jOs4gqMWXmpuoYputCyKoYpJGvhxzZqPtumjXUIEejkPOF+MPQdzimp4WrCECMIkLHhukYI47hr9GxKGWcDbQzTFuEb+2YHM7NOB4EFoVO7ZxqPCn/G9jT/HacPP9kcpUtwa+L+Zvp5+1DLF9p0zRX0qirK7KMp9J0Vlp4Ju0a4yYCsBl/Qj0J7W62TbaexY7Rlv+UYDnfkK3o5V92titWDcPwKrkz8Rq45pj4vV6ZB9unOu15Pr2ebAOn6cXM8ZNdfLN+5AixRyMZnrDE731JY9XCDq2kH4nbkeVWs4sRSvp9Y77RTP+5q0+WlTPLeLNv130ubwaOeememAHUSzsQvhdTCTczRm8o7ATPeCcfmU/VBaKs77yC2I7PFlolZyYuTUU+WdNjlNviY5fdqabnIMcnpTTef6jce+9Rpt7/hGDThCTTc5M+fbmROS744IZrpH4872g/sxuLN4vHsgey7SJYy9l38/nD+36TKBhZwYffZsPJ02fU6/Jn1+2trO76BPvydQHqG2a7+QcmaoXoby7AG7jkfjJ/V0ZFx+qr4ueCBByfcQVxTs/PH8FOqlnBhD9aTRp81Q55deDghJ0yEh6WjbTb51hJA0AyrfgcMNf+1lTqK/U6zW/lGRaEmiX9kiTisG9eUiJxSDoFn+TCcfXv4Wyr7+Hw==</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/big_data_time_series_analysis.png b/src/main/webapp/templates/gcp/big_data_time_series_analysis.png
deleted file mode 100644
index 7773b449..00000000
--- a/src/main/webapp/templates/gcp/big_data_time_series_analysis.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/big_data_time_series_analysis.xml b/src/main/webapp/templates/gcp/big_data_time_series_analysis.xml
deleted file mode 100644
index ccd474c2..00000000
--- a/src/main/webapp/templates/gcp/big_data_time_series_analysis.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/dev_test_continuous_delivery_with_spinnaker.png b/src/main/webapp/templates/gcp/dev_test_continuous_delivery_with_spinnaker.png
deleted file mode 100644
index 0ad74dc2..00000000
--- a/src/main/webapp/templates/gcp/dev_test_continuous_delivery_with_spinnaker.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/dev_test_continuous_delivery_with_spinnaker.xml b/src/main/webapp/templates/gcp/dev_test_continuous_delivery_with_spinnaker.xml
deleted file mode 100644
index fc540acc..00000000
--- a/src/main/webapp/templates/gcp/dev_test_continuous_delivery_with_spinnaker.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/dev_test_jenkins_in_k8s.png b/src/main/webapp/templates/gcp/dev_test_jenkins_in_k8s.png
deleted file mode 100644
index a80ca9df..00000000
--- a/src/main/webapp/templates/gcp/dev_test_jenkins_in_k8s.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/dev_test_jenkins_in_k8s.xml b/src/main/webapp/templates/gcp/dev_test_jenkins_in_k8s.xml
deleted file mode 100644
index 30927199..00000000
--- a/src/main/webapp/templates/gcp/dev_test_jenkins_in_k8s.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/dev_test_scale_testing_with_kubernetes_locust.png b/src/main/webapp/templates/gcp/dev_test_scale_testing_with_kubernetes_locust.png
deleted file mode 100644
index 650fc776..00000000
--- a/src/main/webapp/templates/gcp/dev_test_scale_testing_with_kubernetes_locust.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/dev_test_scale_testing_with_kubernetes_locust.xml b/src/main/webapp/templates/gcp/dev_test_scale_testing_with_kubernetes_locust.xml
deleted file mode 100644
index ea09ca74..00000000
--- a/src/main/webapp/templates/gcp/dev_test_scale_testing_with_kubernetes_locust.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/dev_test_ui_testing_with_kubernetes.png b/src/main/webapp/templates/gcp/dev_test_ui_testing_with_kubernetes.png
deleted file mode 100644
index 63929c6f..00000000
--- a/src/main/webapp/templates/gcp/dev_test_ui_testing_with_kubernetes.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/dev_test_ui_testing_with_kubernetes.xml b/src/main/webapp/templates/gcp/dev_test_ui_testing_with_kubernetes.xml
deleted file mode 100644
index 38b67531..00000000
--- a/src/main/webapp/templates/gcp/dev_test_ui_testing_with_kubernetes.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/digital_marketing_dmp_data_warehouse.png b/src/main/webapp/templates/gcp/digital_marketing_dmp_data_warehouse.png
deleted file mode 100644
index c1c135b1..00000000
--- a/src/main/webapp/templates/gcp/digital_marketing_dmp_data_warehouse.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/digital_marketing_dmp_data_warehouse.xml b/src/main/webapp/templates/gcp/digital_marketing_dmp_data_warehouse.xml
deleted file mode 100644
index b6b8e323..00000000
--- a/src/main/webapp/templates/gcp/digital_marketing_dmp_data_warehouse.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/digital_marketing_publisher_side_analysis.png b/src/main/webapp/templates/gcp/digital_marketing_publisher_side_analysis.png
deleted file mode 100644
index 776d1ab6..00000000
--- a/src/main/webapp/templates/gcp/digital_marketing_publisher_side_analysis.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/digital_marketing_publisher_side_analysis.xml b/src/main/webapp/templates/gcp/digital_marketing_publisher_side_analysis.xml
deleted file mode 100644
index 65ccd35c..00000000
--- a/src/main/webapp/templates/gcp/digital_marketing_publisher_side_analysis.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="0759da04-4d03-b8c3-61ff-48e235de8e6a" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/digital_marketing_real_time_bidding.png b/src/main/webapp/templates/gcp/digital_marketing_real_time_bidding.png
deleted file mode 100644
index f9307c08..00000000
--- a/src/main/webapp/templates/gcp/digital_marketing_real_time_bidding.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/digital_marketing_real_time_bidding.xml b/src/main/webapp/templates/gcp/digital_marketing_real_time_bidding.xml
deleted file mode 100644
index cfc29638..00000000
--- a/src/main/webapp/templates/gcp/digital_marketing_real_time_bidding.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="0759da04-4d03-b8c3-61ff-48e235de8e6a" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/financial_services_monte_carlo_simulations.png b/src/main/webapp/templates/gcp/financial_services_monte_carlo_simulations.png
deleted file mode 100644
index e3e3d439..00000000
--- a/src/main/webapp/templates/gcp/financial_services_monte_carlo_simulations.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/financial_services_monte_carlo_simulations.xml b/src/main/webapp/templates/gcp/financial_services_monte_carlo_simulations.xml
deleted file mode 100644
index cea290a7..00000000
--- a/src/main/webapp/templates/gcp/financial_services_monte_carlo_simulations.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/financial_services_time_series_analysis.png b/src/main/webapp/templates/gcp/financial_services_time_series_analysis.png
deleted file mode 100644
index c36d9f13..00000000
--- a/src/main/webapp/templates/gcp/financial_services_time_series_analysis.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/financial_services_time_series_analysis.xml b/src/main/webapp/templates/gcp/financial_services_time_series_analysis.xml
deleted file mode 100644
index 37cbf657..00000000
--- a/src/main/webapp/templates/gcp/financial_services_time_series_analysis.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/gaming_backend_database.png b/src/main/webapp/templates/gcp/gaming_backend_database.png
deleted file mode 100644
index 5c0ce492..00000000
--- a/src/main/webapp/templates/gcp/gaming_backend_database.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/gaming_backend_database.xml b/src/main/webapp/templates/gcp/gaming_backend_database.xml
deleted file mode 100644
index 0bd0c000..00000000
--- a/src/main/webapp/templates/gcp/gaming_backend_database.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/gaming_gaming_analytics.png b/src/main/webapp/templates/gcp/gaming_gaming_analytics.png
deleted file mode 100644
index 054e5e90..00000000
--- a/src/main/webapp/templates/gcp/gaming_gaming_analytics.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/gaming_gaming_analytics.xml b/src/main/webapp/templates/gcp/gaming_gaming_analytics.xml
deleted file mode 100644
index 3c1bf5df..00000000
--- a/src/main/webapp/templates/gcp/gaming_gaming_analytics.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/gaming_mobile_game_backend.png b/src/main/webapp/templates/gcp/gaming_mobile_game_backend.png
deleted file mode 100644
index 2f0384db..00000000
--- a/src/main/webapp/templates/gcp/gaming_mobile_game_backend.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/gaming_mobile_game_backend.xml b/src/main/webapp/templates/gcp/gaming_mobile_game_backend.xml
deleted file mode 100644
index b5e7db9d..00000000
--- a/src/main/webapp/templates/gcp/gaming_mobile_game_backend.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/gaming_real_time_aaa_game_servers.png b/src/main/webapp/templates/gcp/gaming_real_time_aaa_game_servers.png
deleted file mode 100644
index 734c53e7..00000000
--- a/src/main/webapp/templates/gcp/gaming_real_time_aaa_game_servers.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/gaming_real_time_aaa_game_servers.xml b/src/main/webapp/templates/gcp/gaming_real_time_aaa_game_servers.xml
deleted file mode 100644
index 87f976b9..00000000
--- a/src/main/webapp/templates/gcp/gaming_real_time_aaa_game_servers.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7Vxbc5s4FP41fkzGXI0ffUmyO5vOtE1n9zEjg4zZYuSCaOL99XuEJAxI2KTGcZrYfog5uiCOPn3f0YUMrNn6+S5Fm9UnEuB4YA6D54E1H5im4Y48+MMsW27xDIMbwjQKRKad4SH6DwvjUFjzKMBZLSMlJKbRpm70SZJgn9ZsKE3JUz3bksT1u25QiBXDg49i1fpPFNCVsBrueJfwB47Clbi1Z454wgL538OU5Im438C0lsWHJ6+RrEs8aLZCAXmqmKybgTVLCaH81/p5hmPmW+k2Xu62JbVsd4oT2qmAzUv8RHGOZZPdGMpOF/AjZD/uCAnBMawmngLVlYmzmOQBpH2OEV2SdC0ei26lK5dRHM9ITNLi0rp12RcKZjQl37FMSUiCmVG6YwgXYYqCCJ6jkWdJEioQA623piiOwgQuYrxkDco2yI+SkKUORe7K7UcG+4J9fMO+8OMnTmkEPT8R1VCy2dXyjV3Mr2x5W/FYw12O++Kuc5uZVnQds/sWLmr2g+gadjv8XDGJfrnDZI1puoUsItUx7WuHF9rK0SFQ87TDpC2HzKoCR9sSRiTGQVjWvsMC/BBwaIGGo4FGo3Ohvzbs5/o5ZERwHfob8zos8PLoM2Q8biQuwIN9I0HjZLuzlys+NC3VhXKAphgeIPpZ5wWdW8UdPpMIGlN2oqym7MF6BWS5zDBVeqVsZqeOcj1L6RgcAJ+JS5LSFQlJguKbnXVakBQOhIcr0I3RAsfTksea/UJRSm+jWOYursVwZMMEJ8GEETBcLmLif/+2ihJurhSCq0qRfzGlW3GNckrAtGvyPSmGoKHgBBBkm559a5UpkqnNBkmYKg0Mi0+FPHyAEIbEaYCyVemV4uF0j8P9zZzcyrvClJE89UUu1xUqAdWGWOQTWqkC9GXIg1aibSXDhuEwawfmyG2yi+WZdal4aQn4wVvxy0CW/qlQzhwHwM4UM425Q2smQw84hfGdKZjfIZqhBS0yEucUT1JfAoFZyyuzjnotCbXwTo2bGoDR1HIAi6USNYRsrzBJedPoVJ1lb4xb5/amhKxCjBrQtiuS3USAOVYVydQpktmHIpVhZQUfAhNzRNECZfgCitcGxcgbdwCFYWlAYXjO8aAwFUhA564iCtOCPAXLhBMHc08RwaI181jI49jhV4ziq29RgaHJZHKYZBqetOcT8OXBIMY4NpwVYaajCWnF/KLv8BNiqUa/2mq3jmxd9NnHUPeGiusvMc1bjGmcsSamcVuwddqYxrKUCMVtTH8PlgD49hvTePYFyL8xkEfnALLtqaH2fiAfLHE8kKV/Kko7i5mgqSKpgCEoPmogUmpXTSnriDFq46FrFFcMlM8ki2hEahiSEdR9I8M6CoJi7Cmoa8ZcC0IpWSvarJHmcfHRIP6JBSgPUJxZnlJUCeKmovZmLNpDqGaq/Dgsg7eqqmtEvY9QzRVsvHdJqTbGxfouWpTLbhWPNLA0cth3TyimrlTFaMMDaPAhfYmfxWBo9fRQ41VH41VLrNwcucp0ZTYWCr3rRnf1s9A0Gl+07LfQMldumtS0zDpSy7oH78YFJ78xTpzXwom8/d4thvPHEtW+06l8y1pNv+JtOcpUZWgqImPoVMa2++grdaHlNgVHwNAZmC64oXDNbhuwWEGJfKxGh6+p8EvRxHIf6jGTzaqpfjNcTLn3ukeLLetzZb7GOs4eBmgyRbeApG3GvW0PSCxTE5CYvQQkdaBeGe4pohEZkl5U5q2rjKVTmbPMrB3NFGj/ttfBEj1se1kXGTxCBj3NdsPpZFA9MCOEDozzKPMJPN72rJonFO4xKFvzzqSuZR7znqVOJYSL1L1JqXPejNS5yvkx88Ai8sESPUhdl0NlF6njzKIctzDGtip1rkbq3D62YF1X01f8BCjzx4Adv5UucX/khG+py5FXMfGTohMY61tQDIDskJEPnzjKA6W8Rlfsy4sTqKm0TKPwS96rrjpGjVm66OoiCn/kb1BOW3cZOsppy3LPHjmVkVRNTscnkdPxaVayXfUkkcpDOhAEJAd4fS0Onat6dSxTvQ3ecdzmjEd6p8o78jBWFQTSdhzvqBuNx/DO31FKc8Tu8An5IO5sRaoj7czIegNKAUVvkhBKyhyrtFlGNGyHHtkKlnCVFV3KThcZxuZZbeKnnL3aUJyx/zOBkCTx9zTyjAzoc388Yu6NV+HB2gm3XyDB+mE4rzstthzLPQcNjk5BgSN1QfdCga0UCDORV6TAkW5F6Ncp8K98gdMEU8Yqw1mcZ2wm1JUEa4UvPMh5MKEI/JB+CCbkRPGemVD3EtxlUqo/7j1uHvfWBoe6dwB6mZSO1AUE8QpiuQf58OX+vOxQvPiW/Yjf2USRD5MPNlEc6RZBLtzQkRts3RGF03GD+vqY5AZ1PYkPfyXlrMzxTleY+Bj6YMThqWAEdzbRBX5rjMMUQ5RcAZhY5ofcznTgzFm35pRkFSI4dF652c/Nl9o70EYP5OBaCjkYhqbnTd2LYr28UaQu+X3oDvFsJZLzxqfqjgE7LCb/qQUfTrv/HGLd/A8=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_app_engine_and_cloud_endpoints.png b/src/main/webapp/templates/gcp/general_app_engine_and_cloud_endpoints.png
deleted file mode 100644
index c842f24b..00000000
--- a/src/main/webapp/templates/gcp/general_app_engine_and_cloud_endpoints.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_app_engine_and_cloud_endpoints.xml b/src/main/webapp/templates/gcp/general_app_engine_and_cloud_endpoints.xml
deleted file mode 100644
index 7c9aeb82..00000000
--- a/src/main/webapp/templates/gcp/general_app_engine_and_cloud_endpoints.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_compute_engine_and_rest_or_grpc.png b/src/main/webapp/templates/gcp/general_compute_engine_and_rest_or_grpc.png
deleted file mode 100644
index 2b233f89..00000000
--- a/src/main/webapp/templates/gcp/general_compute_engine_and_rest_or_grpc.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_compute_engine_and_rest_or_grpc.xml b/src/main/webapp/templates/gcp/general_compute_engine_and_rest_or_grpc.xml
deleted file mode 100644
index 811aabaf..00000000
--- a/src/main/webapp/templates/gcp/general_compute_engine_and_rest_or_grpc.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7Vptb+MoEP41+djINn79mKZp76RdXbRdaW8/VY5NHFTH5Ajpy/36Gwz4BTuN002qdq+21JgBBjzzzAOMO0LT9dMNizerrzTF+cix0qcRuho5ju06PvwIybOU+GEkBRkjqWpUC27Jv1gJLSXdkRRvWw05pTknm7YwoUWBE96SxYzRx3azJc3bo27iDHcEt0mcd6U/SMpXSmr7UV3xBybZSg0dOoGsWMTJfcborlDjjRy0LC9ZvY61LvWi21Wc0seGCM1GaMoo5fJp/TTFubCtNpvsd72ntpo3wwUf1MGVPR7ifIf1lP0c+l4u4CETDzeUZmAYoUnWgLqqcprTXQp18zzmS8rW6rX4szblkuT5lOaUlUV07YsbOm45o/dY1xS0wEKozWFBIWNxSuA9jDZLWnCFGJg9uoxzkhVQyPFSTGi7iRNSZKLWUq0bwwe2uEEezcQNDw+YcQKenyg1nG5qLd9F4erC1cOq17LqFl/KUa9cIVrxdS7GLU1UWhV046e9rrErh0MgYbrGnD1DE9UB+Qojzxp9qvxYI9L1lGzVAKMXKmGsoiCrdNdIgAcFhj3A8HqAYbgWvLURj+unTNDAOEs2zjgr0XKXCFzcbTQqwH6nxsEwE7v9Nm7Y0EFdE+rwZBhegDy0WaHPrGqEOSUwcuVCx/Cg4Re6XG4x73ilmuYgRyFngKNaNgbrp+XV9YriqoYD7MpFmgiFpGQ4nKpSvNjSfMfxhCU6MIW0Kjk9UWvEZWiJuxvNR4fUHn+rHm7bIY7fDanKS008+CeIKIT2Uq0wRrmaaXv4/+yoZFpklVdTJIn3K12QkpVvMXsgCayWjvVtdvsdfibzPxtULZXLThW3s4q/6XoDroNesyIjEFgmdtJ4uyo9bTCcgRzPDt1r9EI8d5kikUPfYTkwugRHcqU9jxc4n9Mt4YQKODDpi4qtvxj1a5KmYsYmfkx2r9q16dvrIjIqLwO5zlAcyqjs4lABzxp7XS53u7hD0Ul4yGuh/sKO9PAnZaIuEQEhrAiHDdqOgWQClTe4wCzO5WYiXoulVgHT6iLRiou0RjU4BjaG3+bTQ1sM92piX3sHlxb7V7cYGjs924yKR0+7JbDDNn+5Xfrygx76ck+xIfAPrzPHLwsN+/R6a4+DWvuDFkP1ajFD2Ax1vRc8QB6traHeYPbsFNtwnFniPg8AgqEIQKdAQHgYATiFc5Qq4nxBH2e1oOOGhvNxkU7EuQ2Ki5wm999XpJDia5LrRjW8ak/rXYkjWyv1blkPy0mj/AJMBGk41foF3fRcNNyETE1E9C7fDJ41QCrnitc/1rUN19nWifadgckT1tj26ytw2xq3dMcSrJQ0T4uGXhQEpt62IrBThnlH0SsWEzs6DLZheFI+rKFkvSsoNQKGMr6iGS3ivBk1+Inwv/VrwfNP0XPsHYE5MFrpYOVEKZKukqLo7ZAZGTtwc2kaCkVTkecNgyK4I35uNNuIBtv9E0aof8J7QwT1z6uOBDmDV2+yrONIuB9TwyKHPpTU9loS9l8fORrzVgvzthup8hwzAkbDTLV5V+wr2NaKkAWHAM8LbRShFiJQ6IxD33J9z7Z9J4gM/YO52AgAFKJzcbE2we+NufeGoZdX2sEwCaNxFFlOZDu+YyMvaoMmglpdU6cozgChAVmqTwidF0K2P65Zx/Kj4ByIcm2vjSjvXJDqptPIX7cdUL2D1KeZy0oADGLlGp7M6vTQJ9IF5ZyuOymJnoyESiN2Y+hRZGhuobuQPLK4ccS9VNrNk/ro1w+yjgFOO1KHy0Yg9J1jQ29/GAw9x/Z98npd0jPwxH1U0nOzomauc5A50Yvm7Msn6g8DrU9Dp6GWC50MOueHjW6+aVKkjEL1Z4x/yBhHXvBmMR58xBj3/3cx3k3y/MCLz/j+mPHtWQEc0SF8A/X37cLdHpAVeX/xvift9vvEOxTrf2WSzev/F0Oz/wA=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_content_management.png b/src/main/webapp/templates/gcp/general_content_management.png
deleted file mode 100644
index 97b0fbdb..00000000
--- a/src/main/webapp/templates/gcp/general_content_management.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_content_management.xml b/src/main/webapp/templates/gcp/general_content_management.xml
deleted file mode 100644
index a6a75956..00000000
--- a/src/main/webapp/templates/gcp/general_content_management.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7Vxtc6o4FP41fqwDhAB+9Lba/dB7tzvemZ3ZLx2UiMxF4kVs6/76TUjCSxIUFe3WqjMt5D3nPOc54STYA/fL98fUXy2+4wDFPcsI3nvgoWdZpuN65B9N2bIUzzRZQphGAS9UJkyifxFPNHjqJgrQulYwwzjOolU9cYaTBM2yWpqfpvitXmyO43qvKz9ESsJk5sdq6t9RkC14qukMyow/UBQueNee5bKMqT/7FaZ4k/D+ehaY5x+WvfRFW3yi64Uf4LdKEhj1wH2Kccaulu/3KKayFWJj9cYNucW4U5RkrSrYrMarH2+QGLITk7rfpuQipBePGIdEMLQllkOaKzLvY7wJSN5z7GdznC75tLKtEOU8iuN7HOM0vwVjh35JxXWW4l9I5CQ4QTRRiMMgN2HqBxGZh1RmjpOMI4aMHnzz4yhMyE2M5nRA65U/i5KQ5hq8dKV716Rfkj4Y0S+5eEVpFhHND3kzGV6VrfykNw93tuiWT8soSzzlvT7YNGmRLWPaby6iXKqkbfTeqBqzUDgxJISXKEu3pAivYA04RrbCNrhRvZWIdESZRQWM0OOJPreCsGi7RAK54GBoAAbUAENSLdHWil4u30NKA/1wtrL6YY6WlxnFxctKoILIr2sctBOxrZdxRYYWUEUozDNFZALRa50VdGLlPTzjiPRcqlDWYL0BPJ+vUaZopRhmK0VZip6G6WwRZYQWNylJGZLMR5Sg1I+ZCftLCvCQGbJxT2CN8jF/9xPCasv8ZrcN2w9Dcwz36s481Ya5bUGNHXNS7drmTKeuMdtQTM6DGpOzu7A4Z7/F5Z4FBXzC/nSN402GiMKFMGlqcWfV5aPVVoOCagYY+OtF3qnR1EpVn5aqrYJsJT3v5F7B4BoqrsNxZNDveQDg6hBgaxAAOkAAcFtwbk38ZPZB/lGlUlhIzR5ZdbGmoSmHQyr2pyh+xusoizDV2ozIFqUVdT5JBZZRENDxF+pXaggATHGW4aXCABoCGOQfDfTeKPdNSHWa8kb8UtnaN966bBhd4Mat48YyVNy4Gti4XcDG2w+bmglXpi6BxoX0u4PZVX8f+ytmtkRY2SECZWhvlKjRh4oEddQLQCeu+s6CdV/tif479dZgcDPxKzFxYA3amfgOLLY1ceFxPsbEVwuWebCFDw62cGCpAoTdLMbvxALrnKtx21QU9byZxhFRTXoz9M9p6DZs58s92AzJ1oauPs59Bl9u75bodfpyG3wKXy4/a0vGZ+Qf9dmsW5sCprw+djWYMA0NKJwOlsi2GuYUgcueRdwCyJ80H35MjjU2aHr2GBxkbCxCFiTrur3JjJwySbQn5IZn66KcFFw5gI7bUQHQA2HbTAVCOzUqGHRCBXUiuDMH52GCNsHSGxNomQAALROAczGBGmUTTPCE/aDCBkQMfpIHoi7NCTEZyMu06P666AF+QXpQ43r//PljRFKGCrZuEV5dhNccw/GoG/6xpW01suTW8Y9ugW/Kj4xHEVCLaN3NV3DzNCRduVpd6R4lugis2rpgHdsCp+Lo0fMHQiLO7w1mW2pCNpUkvlVebLVNUPpK4wHFdjprzuGbcnz/PS0rLldEXaTiKAkjYo68xCKV6/BhlVASY6AZd+tcn3RD0DRX7+oAh5sMr4mx5j6vYWyXc4Vs0i+ITfkiTrDGTkd4wDqRea19oqe3go/wge4Z/B9Uo5fc/6mAuvm/C/s/oOfUs/k/qEZIb/6vpf+zjYv6P6gLRt78383/dez/YIMVXI3/uwWKW1OeKz+eeeouq6k7gNNFcAg2n4Y9hvAmGcHlrFc5ZNeW8HhEapLhlJ5UvnQAas37varIE/yCgWl4C0wfzTzAc3SLLedc3KM7/nk89zxsE395Gvn89XR54vkdXxnpfMFwN2xxjBUFIRJvU+A0W+AQJ348KlMVcVfQhpJgSF/yIbfTGM9+/VxECUseR7EoVLJQ+UwvWMpipXnzdp5PMFe53xEQqD7ts3nRyewmHTJ3vElnvJQ450v6DNGefRHd7vipxyOAtMQaSPTFxsprlVBQGpLPvMrtsPkp7RDd+dtKsRUtsG4er+VJ/QC4c1hyeeDW3oEiF2wER+O7RQT/a+N78KH4LuKNxQ4P7Ju25UGX/z0O7cCSYeX1K43a4vDSmdEvofny6G9xgvlzo5/ok61ejkO/OAxSQ3/DWfczoB/YUswQHsnu9r6GGgB+BKbE+vmGqQMwBY2LYcqGMqe4faf6AcdBTI5vA2N3ux0izrp2xJ3ow8VB9g9CnPzys33sGhXsa6gjNw0cKPVj7R6XXN7u1k07LWLOXxrg2kVqQ4jwDAA35QPRxwLc2tfQ/2QdKt6Q7Qzgulj9VQH81DWDJsrQFI46A8AdSf9QfkO6dZRhX0MdAdyVD5sNvN3jkhcvewzCBaeVt/n7a50ZUIu9gS9tQGLRWzOgy3kIR37flCyO3Uocw5G2qtvakycfKrFg3zMG0ALsr2tfxLykBc+HmxcwB6eYF7ktf7WJFS9/GguM/gM=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_digital_asset_management_and_sharing.png b/src/main/webapp/templates/gcp/general_digital_asset_management_and_sharing.png
deleted file mode 100644
index 3593a1ee..00000000
--- a/src/main/webapp/templates/gcp/general_digital_asset_management_and_sharing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_digital_asset_management_and_sharing.xml b/src/main/webapp/templates/gcp/general_digital_asset_management_and_sharing.xml
deleted file mode 100644
index 57860201..00000000
--- a/src/main/webapp/templates/gcp/general_digital_asset_management_and_sharing.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_firebase.png b/src/main/webapp/templates/gcp/general_firebase.png
deleted file mode 100644
index 3806cb15..00000000
--- a/src/main/webapp/templates/gcp/general_firebase.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_firebase.xml b/src/main/webapp/templates/gcp/general_firebase.xml
deleted file mode 100644
index 74f7aea3..00000000
--- a/src/main/webapp/templates/gcp/general_firebase.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7VpNc6M4EP01PibFp4GjE9uZw0ztVHm25iyDDKrIiBJyHO+vXwkkQAhsMnFmk53gQ1BLaqHu97obkZl7v39+oKDIvpEE4pljJc8zdzlzHNtz5vyPkJxqie9YtSClKJGDWsEG/QOlUA07oASW2kBGCGao0IUxyXMYM00GKCVHfdiOYH3VAqTQEGxigE3pT5SwTErtedR2fIEozeTSoRPUHVsQP6aUHHK53sxxd9VVd++B0iU3WmYgIceOyF3N3HtKCKvv9s/3EAvbKrPV89Yjvc1zU5izKROcesITwAe59QWNM8S4UQ+USxa88wHmkAIxa+bMwb6YuXcpV37HBWtE4RaUUG6GnZQBdwjje4IJrZqut1zYa5/PKRklj1D15CSHQqiMYAvVFCSIP31vzI7kTOLE9ngbYJTmvIHhTjxLWYAY5enXqrX0LTmj8wjSDe5dxvZYrmVaSxrwCVIGnzsiab0HSPaQ0RMfInudMLr160kS65507bEFjh9JWdbBjBoHJFbTRnfrL34jXTbi77nhP8MVFRphIrcMtiXBBwa5m5U5hbRpObqFBv014qLGjcL6CSizalFrTEvXo47pr2glfqanhWsQZ+pCihkpWv8LXVbb/CH6ljcCLz1ArizxeysIBFMx4F4BA2FkYGBzyuOMkhwJZgrWYmG5LeV3FXOXgAHesYgpKcvhEfAJxTwCGx0GvGDCI6dsEsoykpIc4FUr1Rxt6fCCebIQ4Zo3t5jEjz8ylNfiNcJqUAvgFksqKjv1aKneq/oBZZ32GSCKwOSE3tpV09SzKEALmXyQgYgSVdcAJLeEMbI/B66SHGjc5DwJHr5aCuW4KKxlwrpTMHhj3bq2H2ootB0DhLYlAUchBgw96eluCIVyxe8E8S00y3mh3YO86wRKotTUm5Qzuzmop8yfT1BWG+eMstPgVshuV0JtRkWnxoCTGKaY22HY30UCmCBXTaVPllxmySQyuJHJhYYgLyCDZXs6pHjR8GZksPvx/xVk8KIJyi6S4arwd80EY+DbgExSXWbibcowrejT4arDeWrVgsEW4u+kRAwREYVjjjNIO+H5a2/AHiVJRT1VYRgzjICul5nn0N6vbo6iqN7w6UJy5G9NrbY7qb1fe12hNHFNaHpzgwjBQGUSnKHB1MrEM+OmARwt8HQ234NN4IvfmReIQujbP6fiffQ2jQvntsjqTm5ANmrRBtuTTWopg3YM6DqmAf3rBJcbVeKrONarGK+T4MzXCPTX5pPkH4PkQdAnOc92AygdonnojwNyKs2j4N3TvAH4n03z0HDUIk8o4f2fVP+gVHdVBvsdRJ9QCP7XRA9fatL/I9GbN5uOp37C7SfLPyrLvbn7GxO6bdkGfN4b0VuI/+FM9y676vPwaepJrHSRdhIrvfiSk9igV46/4dmTKr5VORDZv3ryNPcvqnrFuRP3Gzh1RhRiRjm+scDrx0DfUudgYzsw5zh+qM/hN/WT/Drh/MuEewd5tcvowCSGVV2dLErr+GdmMiO+DtBolAx+e3apUOXbA2G4oUM3Ds+v8YHUMo82Rj9aT0xpvt0EpKkpbaeW1LJav/ZRPphc+ox8Em3G9b6Kv6Dwmeb7mgum97UEe+uZrlWH86+Mfr2vrq/Pr7zZ/u9FPbz9Bxd39S8=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_firebase_and_google_app_engine.png b/src/main/webapp/templates/gcp/general_firebase_and_google_app_engine.png
deleted file mode 100644
index fd1da73b..00000000
--- a/src/main/webapp/templates/gcp/general_firebase_and_google_app_engine.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_firebase_and_google_app_engine.xml b/src/main/webapp/templates/gcp/general_firebase_and_google_app_engine.xml
deleted file mode 100644
index 37f035e8..00000000
--- a/src/main/webapp/templates/gcp/general_firebase_and_google_app_engine.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7Vpbb6s4EP41eWzFxQR4TJuk+3BWW6lndR6PHHAAlWBknLbZX7822IAxJLSht9MGqYXxlZnvmxlPMrOvd083BObx3zhE6cwywqeZvZxZlgmsOfvHJYdKMvf8ShCRJBSdGsFd8h8SQkNI90mICqUjxTilSa4KA5xlKKCKDBKCH9VuW5yqq+YwQprgLoCpLv2VhDQWUnPuNw1/oSSKxdKe5VYNGxjcRwTvM7HezLK35adq3kE5l3jRIoYhfmyJ7NXMviYY0+pu93SNUq5bqbZq3Hqgtd43QRkdNQBUIx5gukdyy/OUjb3asJuI39xgHDHF8JmqFjZd3Xid4n3I2m5TSLeY7MRr0YNU5TZJ02ucYlI+2us5v9jAghJ8j2RLhjPEhVIdBnuICAwT9h6dPlucUYEYtnv7CqZJlLGHFG35hoocBkkW8VZD9G4t75r8YnJ/xS9284AITZjlF2IaivNmlp/8YXkB5LLitYymx49y1SXgopjuUr5uqaKuHYRp+HLoqSUSdrlBeIcoObAuohWY7qVTDTpIdgjUPDaYtCVl4hYcbdkRCh5E9ewNFtiNgMMANJweaHSMy+yV89vdU8QdwWUU5NZlVOLld8CR8TuXuGAanBoJPUoGo7Xc0qFl6yqUBCWIvUDyoPqFPrWKFW5xwjZTG1FOU1tQnQBvtwWimlXqbY4ylKXZaUGCOKHMMe4JkyxY4w3KEIFpRWK44xCPKiob64SgDSw4wWHGqVzzfZHn7O8qixKm7hO8BsuFuXZOWtM8l9eCb04Pt4WjnZqHFlBtCHQSzuc9JARTcHB+moNltEGheGG4KXC6p4hBQCqTS+snS9VPr7UGDKRQMoRFXC5qDM3StqelW6t2wB07H/XH0qv3uGcVjiuDXxMBwFEB4PYhAPS64fMR4HkaAm4JDlBR1HGayFhMY87aJaRQb9Ngg0KW8YhHTGiMI5zBdNVIFQN2whvKwgVPs9jjJsXB/c84ySrxOkllpwaYDUZkNmVVvcX0oGyHhLaejwCMuxvLA2tbDuvbS9nQ2k0XfuVHh18KNyi9qrO40xFHKBbvSSA064sgxDYQIdnNENGUq30M6IxLqxv8NdDV+cCZQcp2LGUp2+kAt3o7MaqdTXYmAvaJiSqVHJlo0sAoDx0t7twdsiAmOEt4vOtyZBEQ3MerJXpIGOO+KKmk92/xqSf41nyagEA1WdoM8r3nEejCuLRdlUIWeDUKzTvIB9YLKeSaJyZ6Wwr5hkahf/MQ0i8eaN6eE7Z/TlCR/vjtYsiLCdCNIe9MAFuPIRrCNdCE5UfPSusTinIeUgGrAnpsSl8i7BYXCU0wz2YChiVEWun0j06HXRKGJflk/qONkAn4BlOKd9oJ7Bjeu6n/Iz+N3rHhXPJIYCujvxKzdw8mg6R4Tt7eQZLtyYJKiwBuT+LuHoH/2MQd6J5TA47ielov34GN6/DryNlar8HkcdXIFEgHNVpje7RKjR4FSr62FehM41Qu5Pn3Ncsnfl8J9OMxvBskR55npqWUo9UkbetITGlDYj7BYdjXS5JljYqhxC6VMlCrGskzx6xj/ViewTz/japFFbJ1/TGpFDHeHQ9UQ+p+nXLYM5yxDgN/fNX0MOwHANCNLj3MmX5AhdyF6cvlp3UEerEt+efuI/qC72ivuybX11yT4Y2K9p4zjMfRnsn98NG+hvfXjvZ6PXWRhQSz9m+if1KiA9scmdhPQvURJ8L3prr3XKX+iVSv09CWpX6hzTfPPyvPHcd9M5abhqmB56PRvAH4F+f5iBP8dxV6mm9mhAGVb2aEjT/oNzNASxc8oE4ytjTtGSenOqM4zawKD60eOR9RDL8Y8yld/+jLg/Hgt0vaGNsx1DHsptrJy+k45odj7x9z23x3ddoY5acVYWUJ57UragAcIcPUFTXT0IsezQ/C3qyMtpVLft4iWgP7Z/320LYue+pmwJnE96nAcs+Pveyx+W1y1b35Abi9+h8=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_firebase_and_managed_vms.png b/src/main/webapp/templates/gcp/general_firebase_and_managed_vms.png
deleted file mode 100644
index c8d887ac..00000000
--- a/src/main/webapp/templates/gcp/general_firebase_and_managed_vms.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_firebase_and_managed_vms.xml b/src/main/webapp/templates/gcp/general_firebase_and_managed_vms.xml
deleted file mode 100644
index 49abc82d..00000000
--- a/src/main/webapp/templates/gcp/general_firebase_and_managed_vms.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_gitlabclonegke.png b/src/main/webapp/templates/gcp/general_gitlabclonegke.png
deleted file mode 100644
index 7fe1e82d..00000000
--- a/src/main/webapp/templates/gcp/general_gitlabclonegke.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_gitlabclonegke.xml b/src/main/webapp/templates/gcp/general_gitlabclonegke.xml
deleted file mode 100644
index 1d4bce49..00000000
--- a/src/main/webapp/templates/gcp/general_gitlabclonegke.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7V1bk5s2FP41fkyGO+Zxr26n2842yUzTJw8GGdNgy5Vxdre/vhJIGJC8BsxFJKwfFoS4nfOdy3ckYKbfbV8XyN1vfoc+iGaa4r/O9PuZpqmGZuF/pOUtbbHmTtoQoNCnnU4Nn8P/AG1UaOsx9MGh0DGGMIrDfbHRg7sd8OJCm4sQfCl2W8OoeNa9GwCu4bPnRnzrX6Efb2irajmnDb+AMNjQU881O92wcr1vAYLHHT3fTNPXyV+6eeuyY9EbPWxcH77kmvSHmX6HIIzTpe3rHYiIbJnY0v0ez2zNrhuBXVxpByPd47sbHQG7ZCvC+96u8EJAFhYQBlgw5EjpFny4bONdBI8+3vYcufEaoi29rfiNiXIdRtEdjCBKVvVHi/zwjocYwW+AbdnBHSCNTBwKXgmQ64f4Pkp91nAXU8Tgq9dv3SgMdnglAmtyQYe964W7gGxVaO/c6W2V/HC780B+eOE7QHGINX9DDxPD/ekoX8jK/QeDnZbelnLq8ZSc9d4gTZt4G5HzJiIq64GqhpwOvOaaqF4WAG5BjN5wl8yKKEbemG3Q9ZccIhXWuMmh0WJm5FIzCLKDn6CAFygaziDDFCCjpFusrj1Z3L4GxA98DLy99jFI4LL0CDCWewYLLMC2gSCQsVFZyDkhajovQmafCOAbCL8X3YJIrPQMzzDEF5PpUCursHgAuF4fQMxpJbvMaopyNE5Tn4AfHjh1JX4J+BSi7uoAo2MMbpDHzIm0ZmtaEdFCNZ3RTEF7vnvYJCdVzh0lb9Eab7OZqZYs/V3LZfYvMOQSDh8f5w8tmaylmR/NgsYNhzfarC0PuMzar7FZTVE5pQMfRza6CqIVfHk4NdyeEEFklWzGy0ywZQC4KL4hwTWnaNL2GEasD9j5rMcqgt63L5twlzbnOv0D4viN6ts9xhA3QRRvYAB3bvQEE02dEMfir1YCisC5O8nf+5DD3Qxtbjzq6WXRoxnsXnLrkbsC0W0Wzy87Hyp6eEQe8xcOS15cFADWj+VCRDPvoqqy86ns09n15FzF3a94/dMR51Fo8hi9ewzHUkoeQ1dt1pIP9KbZkc9QmTfKYeIZHuIAgc9/Pk2I6BsRtlFGhCZK/OyuYojqmFMMkSmGzG25Ygi7npy/+GPx6x9fExJ4nGJI7x5D1yrGkM58Bk9AsHo3YQy8+Ihwyw3euAA4w3CjtIzgbonQgrSYoCzC+Mld3UVYL4vfHjgAlURn3N+oj+ZF4qheW0GgzN4UOAla0mmd8RfZoiFw+5m68jpsxe1bnA4nS65iyQ8K+XUCALsyAvRWAr8+BX6ZAr+qCQI/6zlA4Fd5N88BhpOXn/zxZpO50ILDLmpNLYCsqs9JRI8ZTBiHkJi1h4UMUM7en0odtqHvJ4Bm/oHbg3mIFYxjuOVCxHtoKvumFxIWP+PdScsLcnMu55Yevew5W3AsJpchmJogQxAlCHYbrkXVL0OnYHe52y8BxzbJ753wz1ekI3ef+nYsw/i8UDN8VxarIpChKXLP9PavrCZ/0IpKVOfs/C0XlK0pEEgVCAxBIBiyiuhw1kzu8Ljnyd+Em4a4ORt6OgMUG6saIrMQjULLl1nkAWDzAFCSv1wegdII0HYs10tRQFd5lmCJhoVbieSiYeF0WgARx4zMyWASsf49wpTiM9nkmujcgpDs8gns4SE3uyA9kkXrA3Q6AsqmHMDtHmsK7/ewC0IM+4aZhKlSS6yeSXjpqZcgPXEhoyjnnUz7ldPOM7Q061eqS9RIOkXJTvWh8rfzyY5hCJIdp5VkpwjyD6rTUa4zn2KWVLmOJQhNzmChKRt7mfAhMT7U4XLhKnXTKXVho93mvODVhSXu7lIXfuDqmtTleYH3uL/5cjMlLr0mLlZl1P3QiYvKk/DJ8Zx1PPOi41GZrotzaXlMMJxc5Xg0fobN7dH7RjHQTw10lZ5QMsPP1F/F8J3KWn/H8HVNYPhaJ4ZvdcJXjCkflSkfzR5PKdRm7cHy0cw3TmHhclhQ+dmXpnDmjN5VTsq0k5+QS5+oeYIu/oediJ5YAhaFu0tmJvSYNSbPcET4Qpar7PSShZA6uWMNhPzQuaM21dtrTK/TeSchoK2icV/HPA+A6i6i3Yo7T0LfZa+bjL2qyoJM1nu+56CCBVnKLHMaqDPpilq5XtXME1iBA17LA01k+I0eDBPqlLV1ELorlJK6IwjFCsEy9Ii/vjBjoplYNcGjDKztSv9pFOy0kwRcE1WRetPSFvrhOgTosMTJ7M53kb/cut6Gq+m0pyyBCbT0cGRpHNPsJtTNOXXx+iqFpiwIJXN/c1It6U+/nd89np2Vmtf7menDxcml55KWZr5rzuuNtV37UGvJypwu9KbzNZOBzAyi5GUBvVlXS1qyS9bViTPUebbJP4E6WVcdvZUqlR1ZF087B7EuUhw64GyQ45VjiF/ZXJhOA5hRQVUTV8ucHvfwpN4nVzNE85wnrjarw9UywMvM1YwKFRS5uFozsY6bqxkV3mHTSxK5wZrwlx5EgNG15VrtSmUjZ2wGz9iGUVrFzL89LY0p8zf46Qcjy/wbxpmRZ/6mJLy6TuYvnR/sJ/M3p6HcGq/e0suv3jK1PjN/U0TTpsx/VifzN6trfbjM3xz0UdYmmX8zsY478zcH5WdXjNI0VNbIc36TJ2r8PDeps8mGvmvkozSmNIOh1bhae9Y1Jq5m8ox6ZFxNOuvqh6tVmOIvG1eTLn71w9WsCrR64mrM6TnDcjVLRKwnrjarw9UywMvM1SwRKZeaqzUT67i5mjUoo76CqzVU1si5msVT65FxtYa+a+RczeI59shYgHR6Y5GrW70NOi28PsduzyuOiWNbfCVksq4RcGxLktkGdTi2dHlHTxx7euNBnVetDMuxbVFBZOLYs1ocu/obD4bj2HaFWQqScexGYh03x7YHrYRcw7GbKWvkHNvmSyJj49jNfNfIObYty4TjqlytNesaE1ezeUY9Nq4mm3X1wtVsSWYb1OJqssWvfriaXYFWT1wt+wikU1CJbjjClxAJMtB2uJqIWDfnar8dVwDtQAwO9ekaBxL5WVoG9Xq+WKTN7ljafNBp/5iVxS6GAarF05oJlt1YBzytXFHpJDmZS1LurxPkGmqquyDn2D3EOHaSn/xVjOA1jL+Sm/poWiZd/ztZVxSDrj8DFGLRko9qXfqmX88fV6Whr+PXzSe7YmW5b7kOe4LZw3kQ23pxeJF9iusE2fSITQGsKbxn+RkBLDkYNSnAaClFMJpmAYyX+ysX+pdpidUu2DPh5uJq+t1Z3PbJDaPpw8W9f7jYLDm4vj9brOoVZp5NLJVpyyhpq9e3YOqiB7qm8cRZHaaawV3m8UR90BJ6k/HEZmId93iiLglLFb1ZJbj8ZpWGKhv5qKIuqvMNobSKo1PtaWlMo1MGX6ob2ehUwzgz8tEpY9CJMM0Kd9L5wS5Gp/AqgiT7O3Uncvsd+oD0+B8=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_hadoop_on_google_cloud_platform.png b/src/main/webapp/templates/gcp/general_hadoop_on_google_cloud_platform.png
deleted file mode 100644
index a064563b..00000000
--- a/src/main/webapp/templates/gcp/general_hadoop_on_google_cloud_platform.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_hadoop_on_google_cloud_platform.xml b/src/main/webapp/templates/gcp/general_hadoop_on_google_cloud_platform.xml
deleted file mode 100644
index 78e4453d..00000000
--- a/src/main/webapp/templates/gcp/general_hadoop_on_google_cloud_platform.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_high_performance_computing.png b/src/main/webapp/templates/gcp/general_high_performance_computing.png
deleted file mode 100644
index 708655ae..00000000
--- a/src/main/webapp/templates/gcp/general_high_performance_computing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_high_performance_computing.xml b/src/main/webapp/templates/gcp/general_high_performance_computing.xml
deleted file mode 100644
index 736f99f9..00000000
--- a/src/main/webapp/templates/gcp/general_high_performance_computing.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_real_time_bidding.png b/src/main/webapp/templates/gcp/general_real_time_bidding.png
deleted file mode 100644
index 0de27c4b..00000000
--- a/src/main/webapp/templates/gcp/general_real_time_bidding.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_real_time_bidding.xml b/src/main/webapp/templates/gcp/general_real_time_bidding.xml
deleted file mode 100644
index bf2c13cf..00000000
--- a/src/main/webapp/templates/gcp/general_real_time_bidding.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_real_time_stream_processing_iot.png b/src/main/webapp/templates/gcp/general_real_time_stream_processing_iot.png
deleted file mode 100644
index 05622947..00000000
--- a/src/main/webapp/templates/gcp/general_real_time_stream_processing_iot.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_real_time_stream_processing_iot.xml b/src/main/webapp/templates/gcp/general_real_time_stream_processing_iot.xml
deleted file mode 100644
index fe6c8707..00000000
--- a/src/main/webapp/templates/gcp/general_real_time_stream_processing_iot.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/general_web_application_on_google_app_engine.png b/src/main/webapp/templates/gcp/general_web_application_on_google_app_engine.png
deleted file mode 100644
index b28678a4..00000000
--- a/src/main/webapp/templates/gcp/general_web_application_on_google_app_engine.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/general_web_application_on_google_app_engine.xml b/src/main/webapp/templates/gcp/general_web_application_on_google_app_engine.xml
deleted file mode 100644
index 8d5205b4..00000000
--- a/src/main/webapp/templates/gcp/general_web_application_on_google_app_engine.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/internet_of_things_mqtt_to_pubsub_broker.png b/src/main/webapp/templates/gcp/internet_of_things_mqtt_to_pubsub_broker.png
deleted file mode 100644
index 146f8a40..00000000
--- a/src/main/webapp/templates/gcp/internet_of_things_mqtt_to_pubsub_broker.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/internet_of_things_mqtt_to_pubsub_broker.xml b/src/main/webapp/templates/gcp/internet_of_things_mqtt_to_pubsub_broker.xml
deleted file mode 100644
index cb626cf4..00000000
--- a/src/main/webapp/templates/gcp/internet_of_things_mqtt_to_pubsub_broker.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/internet_of_things_sensor_stream_ingest_and_processing.png b/src/main/webapp/templates/gcp/internet_of_things_sensor_stream_ingest_and_processing.png
deleted file mode 100644
index d7674e9c..00000000
--- a/src/main/webapp/templates/gcp/internet_of_things_sensor_stream_ingest_and_processing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/internet_of_things_sensor_stream_ingest_and_processing.xml b/src/main/webapp/templates/gcp/internet_of_things_sensor_stream_ingest_and_processing.xml
deleted file mode 100644
index 0c506b98..00000000
--- a/src/main/webapp/templates/gcp/internet_of_things_sensor_stream_ingest_and_processing.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/lifesciences_genomics_secondary_analysis.png b/src/main/webapp/templates/gcp/lifesciences_genomics_secondary_analysis.png
deleted file mode 100644
index 7c5809ca..00000000
--- a/src/main/webapp/templates/gcp/lifesciences_genomics_secondary_analysis.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/lifesciences_genomics_secondary_analysis.xml b/src/main/webapp/templates/gcp/lifesciences_genomics_secondary_analysis.xml
deleted file mode 100644
index 03ccc3fb..00000000
--- a/src/main/webapp/templates/gcp/lifesciences_genomics_secondary_analysis.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/lifesciences_patient_monitoring.png b/src/main/webapp/templates/gcp/lifesciences_patient_monitoring.png
deleted file mode 100644
index 5c6db174..00000000
--- a/src/main/webapp/templates/gcp/lifesciences_patient_monitoring.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/lifesciences_patient_monitoring.xml b/src/main/webapp/templates/gcp/lifesciences_patient_monitoring.xml
deleted file mode 100644
index 5928b50c..00000000
--- a/src/main/webapp/templates/gcp/lifesciences_patient_monitoring.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/lifesciences_variant_analysis.png b/src/main/webapp/templates/gcp/lifesciences_variant_analysis.png
deleted file mode 100644
index c68ccc96..00000000
--- a/src/main/webapp/templates/gcp/lifesciences_variant_analysis.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/lifesciences_variant_analysis.xml b/src/main/webapp/templates/gcp/lifesciences_variant_analysis.xml
deleted file mode 100644
index d24aa632..00000000
--- a/src/main/webapp/templates/gcp/lifesciences_variant_analysis.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/media_hybrid_rendering.png b/src/main/webapp/templates/gcp/media_hybrid_rendering.png
deleted file mode 100644
index c9d207b9..00000000
--- a/src/main/webapp/templates/gcp/media_hybrid_rendering.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/media_hybrid_rendering.xml b/src/main/webapp/templates/gcp/media_hybrid_rendering.xml
deleted file mode 100644
index 07bc0ed1..00000000
--- a/src/main/webapp/templates/gcp/media_hybrid_rendering.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/media_live_streaming.png b/src/main/webapp/templates/gcp/media_live_streaming.png
deleted file mode 100644
index 66c6c426..00000000
--- a/src/main/webapp/templates/gcp/media_live_streaming.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/media_live_streaming.xml b/src/main/webapp/templates/gcp/media_live_streaming.xml
deleted file mode 100644
index 1ed2e7cb..00000000
--- a/src/main/webapp/templates/gcp/media_live_streaming.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7Vxdc7I4FP41vXwdCOHDy2q1uzPtTue1M3vZQYjIFokbY1v3128CCZ9RaZtW7aAzLZyEBHKe85yTnOCVNV693RJ/vbzHIUqugBG+XVk3VwCYjuuxf1yyyyWOCXJBROJQVCoFs/g/JISGkG7jEG1qFSnGCY3XdWGA0xQFtCbzCcGv9WoLnNR7XfsRaglmgZ+0pX/HIV0KqekMy4I/UBwtRdcecPOCuR88RwRvU9HfFbAW2ScvXvmyLfGgm6Uf4teKyJpcWWOCMc2PVm9jlPCxlcOWXzfdU1rcN0Ep7XQBzK948ZMtkrfsJOza0ZwdRPzgFuOIDQxvKS9hzRWF4wRvQ1b2kPh0gclKPBbdyaFcxEkyxgkm2ak1dfiXXbihBD8jWZLiFHGhHA6DnUTED2P2HI06C5xSgRh299bIT+IoZScJWvAb2qz9IE4jXmqI2pXuXZN/mXw44V928IIIjZnmr0UzFK/LVh75yc0vKLsVj2WUNe6yXm8gFy3pKuH9ZkPU1INQDe8OvVVEQi+3CK8QJTtWRZRCR2BkJ21DnL+WiLRknWUFjPZQCH1hBVHRdokEdiDAsAcYtgIYDdUyba354eot4jQwiII1GEQZWp4CjountUQFGz/dOFAMMew8xpUxBFZ7CKV5EsQeIH6ps4JqWEUPDzhmN1OoEDQ1WG8ALxYbRFtaKW6zk6JAS0/XJFjGlNHiljDJNSu8R2Hs5wbsrzi8o9yMjTv+bMCYUYL8FbeaI9YLb67NqX1Ua+ZnrVdYla2wYEGnuq3NggO7pizYtjazMMEqVqAOa3OOW1vmVVAoHtmfb3CypYgpWw4nlxZnoD5CSn3tUVHN+EJ/s8w6Nfa1UtUoaOurINqGpg/yrmRvBQ3XATkx+PeLIOB2xoClAQPQgi2do5CFJeIUE7rEEU79ZFJKRyUqjKbGfUKveSxU0SyXTWN+C1l1lIayxjzBwfPjMk5zsajEG/oHUboTCva3FDNReSt3OFNNCTEZLoEGMhSWPMw+hzHGOQd4cGqxksSfo2RUBFgNGLKbFn1B+aSV873w2OAtCcRoQ+lA2MURkuYtbZPr4iCMOjuLzohQRGeCsScv/EFaDrk5dmH2aZtNQaI1yq5r0KyhqyvnZEp6wJuYxpibdcDuE5GKvd81KqziMMyQLPmhdYVkiDmmFK9aTuIQsprc9Mod44xdziWvLGgpWxuJ1pvMqYFY3DqtFEFbhVZcBal4tg4IdYjjavZXefQGaFybfw84/3YwmGTmMGKjR/cOJ3xH2CZKDUnU1VDYVUTCesK4X6bX8AxfEslBy+4dwIkdgKNyAN7pHEA7LvyNAkxCVazes/9Zsr/pnZL+3VPSP8mwetwBOO8dU5UDsFVxuaXHAYAG/Rf+QLMDUE0D8zU3juVswVPqw/l3i/NZvAR8RZSvzf1+vH/IZv1T9vf34+yhsoCXt+eIhYAf63UUE1Ij+xz1OsW8dY/XqfKoFtfjKVwPtDu6HglUY2AYEvQSrECLDdiGMTANC0KPxbOeIxuQpAYaEVH+GKKN6gK0bFav5cjRq1jOJA1w7ycvx0+C4Sn95PCUfjLx1/ny1xE/6b13TH+qn3R/sMu6iImSdEx1b+V29Fbf64ryGz/gimSztj3IGzQcb+jYTq1Z6HbzcB/Cs9fj+QzxDOA34dmu0ybzhAPTcoeWALnXCc8fAt6wB95pgQdUKQdwupQDUG0IOb8Auqpn98AcT4bLJI91NIesjldP8FsuVARcJlBt0nB0KKu9uD+++avYwEPkBP9PPleQe6Vapd8Y6IrNISmir5g8P3F8PwV+sET12Lc5PZLa6zw72pNjLuo1thkcAFBzbqQIy0H3/IXAiTJ/ARRhuaapew2kv8wG9PTE5DJX3ruSk7kSVfJC7kw4gSuBZo+IM0QE0J7Oyi5lA+/vKhXWnIM2+0lpaNR9J3OmDXTlLX6ckNqBSw+/08NP+rQzg58tdl9pgx/osKWvD6RFqWc3A2mgCqRVW+8cHVvvgCpNejzxJkanlXib+hua7PZm25oBeBazfywGt01hzd1j8EV+c2cWcO9NRqgC7u754gp65BJPFTymO5BrL1pjbBbhu+BLlr5BO9E14u+7IIYmY5zE/bbAi0l4mUYzBALdMl5DHRkvcAkZL9BnvOrTuIq27vE8Fq9l8f0dj/484f30JHDZJGDZqjVEJQ3oWEK0zBawvpEG1su88DALFOD/3AZhxQKbtg3C9VzhF20PBi1VVV7c4m9g7ngU0Nv9Rdo99LxuVg90WL11SqvfZKitm73ITnAnJrpUEQF47zB3DQfkWqXucAB+TTgA24mfczT881hcgG7zxb49ywuql6m1LC/Aj+3r3be8UGX9GSIvnPW7LjXg1ZopjV04SaOYmej3rTsEeddPKO/4gtcfCuv7VMIPwjba5H4MzQm/4RexUIeXC3oWKljIabCQbZhtDpL7AvRzUHvh6FMchKJVNs00ZhQT/nMqnSlI/GJIcd33MVD2mxQb0e8lE5DbGX0/iIDYafnDOHn18teHrMn/</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/media_rendering.png b/src/main/webapp/templates/gcp/media_rendering.png
deleted file mode 100644
index c1344f5e..00000000
--- a/src/main/webapp/templates/gcp/media_rendering.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/media_rendering.xml b/src/main/webapp/templates/gcp/media_rendering.xml
deleted file mode 100644
index cfa50e87..00000000
--- a/src/main/webapp/templates/gcp/media_rendering.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/media_transcoding.png b/src/main/webapp/templates/gcp/media_transcoding.png
deleted file mode 100644
index d5b3abc0..00000000
--- a/src/main/webapp/templates/gcp/media_transcoding.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/media_transcoding.xml b/src/main/webapp/templates/gcp/media_transcoding.xml
deleted file mode 100644
index edaa74ec..00000000
--- a/src/main/webapp/templates/gcp/media_transcoding.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/retail_beacons_and_targeted_marketing.png b/src/main/webapp/templates/gcp/retail_beacons_and_targeted_marketing.png
deleted file mode 100644
index 8e54a7a6..00000000
--- a/src/main/webapp/templates/gcp/retail_beacons_and_targeted_marketing.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/retail_beacons_and_targeted_marketing.xml b/src/main/webapp/templates/gcp/retail_beacons_and_targeted_marketing.xml
deleted file mode 100644
index 50bcc5cb..00000000
--- a/src/main/webapp/templates/gcp/retail_beacons_and_targeted_marketing.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/retail_fraud_detection.png b/src/main/webapp/templates/gcp/retail_fraud_detection.png
deleted file mode 100644
index 84f612ee..00000000
--- a/src/main/webapp/templates/gcp/retail_fraud_detection.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/retail_fraud_detection.xml b/src/main/webapp/templates/gcp/retail_fraud_detection.xml
deleted file mode 100644
index 93911392..00000000
--- a/src/main/webapp/templates/gcp/retail_fraud_detection.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/retail_pci.png b/src/main/webapp/templates/gcp/retail_pci.png
deleted file mode 100644
index edd362b9..00000000
--- a/src/main/webapp/templates/gcp/retail_pci.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/retail_pci.xml b/src/main/webapp/templates/gcp/retail_pci.xml
deleted file mode 100644
index 2128eaac..00000000
--- a/src/main/webapp/templates/gcp/retail_pci.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/retail_real_time_inventory.png b/src/main/webapp/templates/gcp/retail_real_time_inventory.png
deleted file mode 100644
index 30550b72..00000000
--- a/src/main/webapp/templates/gcp/retail_real_time_inventory.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/retail_real_time_inventory.xml b/src/main/webapp/templates/gcp/retail_real_time_inventory.xml
deleted file mode 100644
index ebf0abb6..00000000
--- a/src/main/webapp/templates/gcp/retail_real_time_inventory.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/retail_recommendation_engines.png b/src/main/webapp/templates/gcp/retail_recommendation_engines.png
deleted file mode 100644
index bc64afcb..00000000
--- a/src/main/webapp/templates/gcp/retail_recommendation_engines.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/retail_recommendation_engines.xml b/src/main/webapp/templates/gcp/retail_recommendation_engines.xml
deleted file mode 100644
index f0f250a7..00000000
--- a/src/main/webapp/templates/gcp/retail_recommendation_engines.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/retail_shopping_cart_analysis.png b/src/main/webapp/templates/gcp/retail_shopping_cart_analysis.png
deleted file mode 100644
index 25cd3890..00000000
--- a/src/main/webapp/templates/gcp/retail_shopping_cart_analysis.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/retail_shopping_cart_analysis.xml b/src/main/webapp/templates/gcp/retail_shopping_cart_analysis.xml
deleted file mode 100644
index ca020e46..00000000
--- a/src/main/webapp/templates/gcp/retail_shopping_cart_analysis.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="d1ab7348-05c3-a1e3-ca4d-12c340fd6b49" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/websites_content_hosting.png b/src/main/webapp/templates/gcp/websites_content_hosting.png
deleted file mode 100644
index 1be164ae..00000000
--- a/src/main/webapp/templates/gcp/websites_content_hosting.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/websites_content_hosting.xml b/src/main/webapp/templates/gcp/websites_content_hosting.xml
deleted file mode 100644
index d02e3143..00000000
--- a/src/main/webapp/templates/gcp/websites_content_hosting.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7VnbcqM4EP0aPybF3fjRceLMVGVrU5OpmkeXDDKwEcgjRGzv128LJG6CxJkws9nNmAej1r379OmWmNmr9HjL0D7+g4aYzCwjPM7s65llmabvw5+QnCqJO3cqQcSSUDZqBA/J31gKDSktkhDnnYacUsKTfVcY0CzDAe/IEGP00G22o6Q76x5FWBM8BIjo0m9JyGO1L2/RVHzCSRTLqX1rXlVsUfAYMVpkcr6ZZe/KX1WdIjWW3Ggeo5AeWiL7ZmavGKW8ekuPK0yEbpXaqn7rkdp63Qxn/KwO0i5PiBRYLdkj0PdqCy+ReLmlNALFiJGqGhiurlwRWoRQd08Q31GWym3xk1LlLiFkRQllZdFee+KBjjln9BGrmoxmWAiVOgwoRAyFCeyj12ZHMy4RA6u3rxBJogwKBO/EgvI9CpIsErWGbN2afm6KB+SLG/HAyxNmPAHLL+UwnO6bUb6KwvWFo6aV2zKaFnflrNeOEMU8JWLeUkV9O0jTiOnwsSWSdrnFNMWcnaCJrPUMiRHpQwuJvUMDSGsum8QtLNq1I0gniOqhGyDAi8TCCC7cAVz0LAvG2ovX9BgJFriMgr11GZVg2QQCFpu9AgWob2oYDGjYOVvFbR3augqVdzIMG0ieuqQwpFY5wz1NYDG1Ba2uARW5qQHobpdjrlmlXuZZhvJNX7PUkgVxwoEXCwaSJVR+w9scJHnlxCgVEI8qVzZWAGxcLvsTzblwnRdc2Llemmv3RduZb3Vh6VrugBtLTp3a5Sy7azHH0Fxubg24nGOMQ+NsjzMcT9M8DiEsySJlPKYRzRC5aaRXZazBofSVljoI2mJyVYejvpU4YnydENW6LEuTCIvgLFyKOArFLaHB49c4ySpxqxOUWl3+wpyfZBkVnIKoWfIdLZnU1FAj8GT5ztqua1TAtXpAsXQYGOVPB1CI8rjWSaVUocnRGClFOS1YUGcitjQHaCbCvDaSMYyg11EF6BadWg32gjjycSZxLePS7UBTsUmDrmrMH+WRZr8tIlknLBer+IK/FzjnegTomzIsfzrd1/7aYYeuvc0OmkUJbXNKCo6BzxQIhLQuWQrm9xTYLaECAQEYFbNWXL/rNUiTMCw9R2FG66EygS3lnKYaHw3Q0aL8DeD1IHj4AboLyQGiZDPalRy93IVGYxpnDQB2lMZs1+2hxfQGmGyAyExjEiaz5y9nDx0flXk82tbpVUsjPSzNXfE8E370pATOEo+Q121QFm5Suk1K+4M++at0Lj1kVO21i7aU7A4laPYk2cWF1bOxr+afNMEAypt/zLhUHxHeWVzy33Ncsu3J49JAghuGJZ0j0gSnvD63MnU2/R2v/qvxyvJ/bbxa/D/jlf8x45X/MePVTz5HlVsb2syPBjJ1au4FMueNgewVB27jZbd/ByGjbTxzgMxVmqIFiGlZ2vE0lh64HzHNAQZxvUnMZWrmUlfTML5dXvcKlxa30X/e/6sELm9BM8wPlD1uhG9sAhTEPR7vJwOsUtn5uYD0034mULfr3aQ94/l9hjgzxIylnafxEGNbAyHGmiTEdOF5YfZgN1V8Gfpmcs7deEgLwNuX8oOVTt9vJZZ3QhNe79Yb4pJOEp6vY0DJ3kgSQx8uqoOBUMhMfDNUOvG+F7Q6Jyg/aImqI8TnDMJeFuC89e2rGkcdMfqHjhVN90DoMNFNFiVAEZPxkGt24vs5PBRUi9ngainvjHxGjyHnks9IqvAM+Sjf7ZDP4qeQz2KK9BaKzcfgqnnzxd2++Qc=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/websites_dynamic_hosting.png b/src/main/webapp/templates/gcp/websites_dynamic_hosting.png
deleted file mode 100644
index be73b867..00000000
--- a/src/main/webapp/templates/gcp/websites_dynamic_hosting.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/websites_dynamic_hosting.xml b/src/main/webapp/templates/gcp/websites_dynamic_hosting.xml
deleted file mode 100644
index cbbb7524..00000000
--- a/src/main/webapp/templates/gcp/websites_dynamic_hosting.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7Vvbbqs4FP2aPLYCbC557CXpGalH6rRHqjQvlQMOYUowB0gv8/WzDTYXG5q0pWlnmuSheNvYZq+1l+0dOkFn66eLjKSrnyyg8cQygqcJOp9YloktB/5wy3NlcbxpZQizKBCNGsNN9A8VRkNYN1FA807DgrG4iNKu0WdJQv2iYyNZxh67zZYs7o6akpBqhhufxLr1NgqKlbCazrSp+EGjcCWG9iy3qlgQ/z7M2CYR400stCw/VfWayL7Eg+YrErDHlgnNJugsY6yortZPZzTmvpVuq+6bD9TW885oUux0A67ueCDxhsopOzHce7qAi5BfXDAWgmN4T1UNdFdXnsVsE0DdVUyKJcvW4rGKZ+nKZRTHZyxmWVlEc4d/4ca8yNg9lTUJSyg3SncYUAgzEkTwHEqbJUsKwRiYPTolcRQmUIjpkk8oT4kfJSGvNUTr1vCuyb9gn874Fy4eaFZEgPyJ6KZgadPLL144P8JyWPFYRtPishz1HHPTqljHfNzSRSoOAho+HH1qmQQuF5StaZE9QxNRW3NExNBUcO+xIaQr42XV4iJ2ZSCIIAjrrhsiwIXgwgAv7B5eKMgCWCm/XD+FXAWOQz+1jsOSLHc+p8VdKkkB7hubBj0exju7uOVDC+kulJ7PKDxA9NAVhT63ihGuWASTaRDsAijBkh2w5TKnhYZKPc2dgPJMT0PqJPNXUQG6uMnAcgKVt3SRgyWvgpisOcXDKpSN8+eErCMfrn6wvOChsyWE8fmJObe3Yme+N4RFaNk9YSw0dfSQM7qIYUMPObsv5IxhauwccYZtakjqMddxOXgiKD96gNUe6uBR3S6XNG4p1yoaiBJZ5CzeFBQYJPHh1rpkKeCZOjS1sEpQfcCDZn1YacD0wDeMFbI7WCFDB8tEPWA544BlaWDJpfCSEfgDOyBUrkDgCJL4fXEVkHxVup43E1sZsqhXmJa/FHBt08Nz9EIE6rpcCXIMU7tb1BNCp+DvQowRkwWNrxjoRMQ4blnlsnqBvFTq11EQ8Lmq0asuqHU7Jax7qFN+FIpZO9NFBJDOGMEQ49jWGIKxThA0HUX9u/Q8Mqdy+FH1H54aaUz8ixPBMkyNca+P9hYJe8k2oPCdFbzDcxXbbfIxwKrONk1u9np2bd3AmcHCNZ+NI0BYXd6RLkB1mza/THccBdK37gJ3fdk44P5xuCN7z7jrW/NNfsRX2YzwluYROeCvHjfmc2820sYDIyXunR78jT780Tj4O9vwXx7w3yP+yNsz/u4Ox4S+LWDANrC5vC7zZaejHyS+yLEAYyU6pz3HAtvT0XG9UcDRT+Mya8YdMuEpS+kT5/eGVWdwOLvwT9tUZdf+SPIC9up8Ub+AGE5bGbiqO0ec4kXKLqvTcmydQoTDfbMkjPiuoGqxytR7xLQa8sg58IqjvESUpxBMM33SJ3hLF1B3kqYxBCk/GOSDU/zMw0/ljTta+WIvx56OUL3hzNPVNO8VpyC3P0A+49TjfsyJZ3pQwN0VEJt7VUC5Gzoo4EEBP0sBp/93BXQOqeJXKKLjqntC/ac0E39YqtjRU8XvUcSfJOdO2lkHRVb65s/Lz1WgMgGd/473Iz77yzo73zLr7OhZ54MC7axAdX5wTwo0/JbHWxTomvIfuIxrWu55Dkr0ZZQIfUslsjU20SCk8l0dlhUrFrKExLPG2lIShV4lC07rt7hUPhXAl3kUN6lRKAukeNqRJsEJf/0MiouY+fe/VlFSmVs3Qal1y9+0KJ5FmWwKBqZmypes3PzqWVj+GobVYb7USVX1enKtIq415naCsHIq9+TLmgeOZ5vMl63qtxjAMyHdmpR4HcfAt+S51SDljMuHKYiV9zkQUt6G29LesqYKPasZvIOszoGsX5+sA+fHr01WjEcnq55nE2t+uQR+SyLXO8ZXE3noF64OkctH63uYtzLc6WX40E7hYxnu2Yq8ile4hhiutse2MTbD3e/J4g+W49FZLH/zVFg8cOh658YVucqbhdg4Np3m4+Juj9VURScv0Nm2vGOn3U+X3JZy1KueVev2bTz3Djz/7/J8nP2IxkfH8BQ5nh6j9sd9G88dT5F5bL8YPwNEf+3q4uAXN+9b279z/wTF5t92qubN/0ah2b8=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/websites_mobile_site_hosting.png b/src/main/webapp/templates/gcp/websites_mobile_site_hosting.png
deleted file mode 100644
index 56678890..00000000
--- a/src/main/webapp/templates/gcp/websites_mobile_site_hosting.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/websites_mobile_site_hosting.xml b/src/main/webapp/templates/gcp/websites_mobile_site_hosting.xml
deleted file mode 100644
index 85af1996..00000000
--- a/src/main/webapp/templates/gcp/websites_mobile_site_hosting.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/websites_multiple_network_interfaces.png b/src/main/webapp/templates/gcp/websites_multiple_network_interfaces.png
deleted file mode 100644
index ca0b72f8..00000000
--- a/src/main/webapp/templates/gcp/websites_multiple_network_interfaces.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/websites_multiple_network_interfaces.xml b/src/main/webapp/templates/gcp/websites_multiple_network_interfaces.xml
deleted file mode 100644
index c6ac78db..00000000
--- a/src/main/webapp/templates/gcp/websites_multiple_network_interfaces.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7VrLUuM4FP2aLJuy5UecZQgJ01X0DFVQM0tKsRVHg2J5ZBlCf/1ItuSXbGKaNBQQZ4F19fS95xxdGU+cxW5/yWC6/UEjRCbAivYT52ICgO0CX/yRlqfS4gez0hAzHKlGteEG/0TKaClrjiOUtRpySgnHadsY0iRBIW/ZIGP0sd1sQ0l71hTGyDDchJCY1n9wxLfKavuzuuIPhOOtmjoA07JiDcP7mNE8UfNNgLMprrJ6B/VY6kGzLYzoY8PkLCfOglHKy7vdfoGI9K12W9lvNVBbrZuhhI/q4JY9HiDJkV6yT0Tf87W4ieXNJaWxcIwcqawRw1WVC0LzSNRdE8g3lO3UY/En7coNJmRBCWVF0Vn58ic6ZpzRe6RrEpogadTusEQhZjDC4jk6bTY04QoxYvXOOSQ4TkSBoI1cUJbCECexrLVU68b0U1v+hH22lD9x84AYxyLyczUMp2k9yq0sXHxz9bTqsay6xVUx64UrTVu+I3LewkXdOKjQyOnQvmFScblEdIc4exJNVC3wFEYUh2YKe481IP1ANdk2sOhYmgiKBHE1dA0EcaOwMIALrwcXnciKYKXydrePpQqcxWEKzuICLHehhMVdqkEh3HdsGPR42B3t4oYPgWO6ULOTIfEA+KEtCn1uVTNcUywWU0ewHUAtbnoAutlkiBtRqZY5LlCWbR8OVaFIKFLghOuMkpyjOQs1kaS1KoE2ltshEsFzQeCunOHQtMIXwWxbzdzkLjDZWZGyw+lnOaqZ3kPZBubU0uRqriHniCXFkoAFqifUSg8qdBlI6qH0IH/dqXvmtQHgWgaFK5A08Wdb1jDWxlI4sAMDGD9yuYcWYv4n4o+U3Yu774lwxwaGYsM9IN7uxdxeeQdZa79WvJWoej0CrnbTo4ut0+ZqT6SmfZFyjxAo2wKB4XkUiYREFSnjWxrTBJJlbT2vOd3ZewhcI3JeJSLdKHHI+AqTmt2irEIiI4KSaC4zKFFcExre325xUpobnUSp0eVfxPmTKsOcU2Gql3xFC0I+LyQmAQ8ohVVcJoAqtbH0o/U9TOlt6eLnuS0iQnMWVsmp3lnFuDGquer0Q2v07jEeKNYIrTe8HBWXuQdXVGoRtx0KuwW0sZtHM3i2GTxD5kMkJaiP1K9SYGAqsG/y2u5Lovyj8NoCg9m1dElxgNFe8f/LaZlca3A3TGWu/VfO18XRoqHeVUZeDlg2rFJ41k3T/8aM55A0R+jAp8Ugdb6C6yrtbUSoAyfPbpHZ3BzMZPGhXM1dyvAD5CprFI1FiHlTzK5phjmmEiqsjFGVElx16nc4igp5PJBCVO06W04PWourR5LGIVRx1gSpgqSlIdqApOv2pPWzo+SkbT58s2d6+iNnpWD2Nbe0Sts+ypbm9G5p3iu3tKKrWCd8ajRIJRSzZ7Bp6LXW4dVAD8c/0EPclKv4dSTrzPCrIXk5dx3H+/BInr5ZcubYXxMojjsPvI+UxfcDZfYukjd7qeQF1u+XPO2h0zGjYRp+0WPE8K2PGcMv8X/lmHGDwpxhLp9wnqYEw0RwZ/RBg+5SETbRd5nEWGjVe54vwnIxd6hcymc7WAy8d/jcBwtrzH8mTto0+ArEsd5Wm/yjatM1o1EeFpQ86kuQbtN3la2v8Vpk4Ij5ydVrelKv12RWb61e5r/QXqNetyjjJ9364Lo18ELhk+vW7KRb43Vrar+zbulPTY6kW9+TDYMn4frgwjXwgutzCxcwzx+3aM8NuHFpbMGKoQz/bCBOvcoTrb3ziXchQ5tzEfBail7w0VL3w8IRmnUEXQqcoKtLoCfqvV8kvViWRLH+jrWMXf2xsLP8Hw==</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/gcp/websites_static_hosting.png b/src/main/webapp/templates/gcp/websites_static_hosting.png
deleted file mode 100644
index 457a96ba..00000000
--- a/src/main/webapp/templates/gcp/websites_static_hosting.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/gcp/websites_static_hosting.xml b/src/main/webapp/templates/gcp/websites_static_hosting.xml
deleted file mode 100644
index 2b587f69..00000000
--- a/src/main/webapp/templates/gcp/websites_static_hosting.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="f106602c-feb2-e66a-4537-3a34d633f6aa" name="Page-1">7Vlbc5s4FP41fkwGxMX2Y5zE6UN2JzPuTB87MshAIyNWyLG9v36PkMRNuLFb0mY7wQ9GRzc45zvfJ6SJd7s9PHBcpH+xmNAJcuLDxLubIOT6KIQ/aTkqSzibK0PCs1g3agyr7F+ijY627rKYlJ2GgjEqsqJrjFiek0h0bJhztu822zDanbXACbEMqwhT2/oli0WqrW44byo+kSxJ9dQzNFUVaxw9J5ztcj3fBHmb6lLVW2zG0i9apjhm+5bJu594t5wxoe62h1tCpW+N21S/5Yna+rk5ycVZHXzV4wXTHTGPHFLou1jDTSJvHhhLwDFyJFUDw9WVt5TtYqh7olhsGN/q1xJH48pNRukto4xXRW8Zyh90LAVnz8TU5Cwn0mjc4UAh4TjO4D16bTYsFxox8PTeAtMsyaFAyUY+UFngKMsTWevo1q3pp678gX1+L39w80K4yCDyN3oYwYpmlM+ycHflm2n1azlNi8dq1jtfmlKxpXLeykX9OOjQyOnIoWXScXkgbEsEP0ITXRv4GiNHkxu6vG8Q6U21LW2BERkj1lmQ1GM3SIAbDYYTwAgGgNELLUSrkLfbQyJp4DqJCnSdVGj5GklcfC0MKsB/Y+NgwMX+2T5u+RB5Ay7UHuQEXiB76bLCkFv1DE8sg4epQ4j6EewOwDabkggrKvVjnhWomTuzInXDozQTQIw7DpYbqPxC1iVYSpXFeCsxnqhcdlYC3jGCm0+sFDJ1Xklh/+7GXQavhs792RTWqRUMpLHm1LFTDjndgPl2xk2DgYzzx0g4uCzPkxhkSRcZFylLWI7pfWNdVFpDYp0qLXdQvCZ0UctRP0oCc7HMqGldlXVIZERIHt9IHYXimrLo+XOa5crc6gSlVpdvRIijLuOdYGBqHvmRVUzqWqiReEIzf+nVNUZwUQ8oyIaBU102gGJcprVPlFOlJ09qpHE82/HItHIdzQvgmYSI2jodRtBlTAG+xcdWg0LyRnmaSLxZj0lmPVl/pT0Kgh4W1RP8KOk03vmuPvQjHVeXLQZ1OnfIowsHtwN2WcLrktGdIMB2BiPSWpeQyYInBtyXMQmQCGJOeEv2H3sNtlkcV4llIGX1MAuFNROCbS26GmCreXUNwHkvWXoF3aVlDxrajLbQo1dvYbGcRWkDeD7NclO3CyY/sGlugOVGWVa4ztCKswecTv7qNT5e10uvljt6QJoG8vcdabLXK/Cd8azWfOBBcZGXdRKcdLRzbTt2UD6CUVYbVyjoxhWZ+UddcIBO2RH7EKrfKFTB+xUqr//9+euF6pwPmQ+hep9C1QPH7JcKVfi+hKpIVeUPyFRwsUx5yHZrMM5H8ZUbdmXqLb6KQaS8D5F6TyI1HRSp+U+K1AXpPP1f6EA7Ru4AQ5ttS4v1x6Ve3+1RL7I5ot6QbJNEOA732ntaZqN5Is8WvGpv9+7v1XiMHLidvDmHkdUeZ5yXXVbuSzlX3jlfyXXe9XW8btfbH7tAx88VjBNrx+NpwfB9GwvefBTB6H7VXLnzN/qsceYfDHE+QwTh6wyB3o4hDD8NHFxJh0zk2aDxSfjPjqm9bqNxLZM6xloJnMeYx9V2OOPyeBA5i130LHFVn3qpkUO9ca6PyXj/KKwe4LdTU6mf5E+jpxOrhj+InqDYHAKr5s1Ju3f/Hw==</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/aws.png b/src/main/webapp/templates/network/aws.png
deleted file mode 100644
index 6f3c009c..00000000
--- a/src/main/webapp/templates/network/aws.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/aws.xml b/src/main/webapp/templates/network/aws.xml
deleted file mode 100644
index 1f7ec854..00000000
--- a/src/main/webapp/templates/network/aws.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="google"><diagram name="Page-1" id="75ae5057-2f1f-a65a-41a6-c58fb5237df7">7Vxdk6I4FP01Pm4XkITA47Tasy9bNVVTtftopSEiNUisEPtjf/0GTRQI2IwbWxq1q0u5BISce85N7g1OwHT99p2TzeovFtNs4jnx2wTMJp7nQgDlW2l531tgGO4NCU9j1eho+Jn+S5XRUdZtGtOi1lAwlol0UzdGLM9pJGo2wjl7rTdbsqz+rRuSUMPwMyKZaf0njcVKWV3HOe74k6bJSn11gNSOZxL9Sjjb5ur7Jh5Y7l773Wuiz6XaFysSs9eKCcwnYMoZE/tP67cpzcq+1d22P+6pY+/hujnNRZ8D/NjFCIexE+IQul7whwLuhWRbqm9hd6HiXXfO7vZoeQJ3Ah4JjxR+UG7FpFjtdjlyoxCc/aJTljG+OxI4u5fcs0yzTNtzlsujHxNO4lRedcO8P4cGwSstusvKE0VsnUbq85Ll4oms06x0ur8pj0lOlFldoeup7bZrWol1pu7J7EXVsS+UC/pWMale/U7Zmgr+LpvovaFC+F1zQm2/Hv0Ja69ZVVwJAWUkyoeTw7mPOMoPCsqesIbnw+o6VVxdS7iWJ/xBhKA8l8ZAXgqQ/+7u/euijtyghvqB5xXU3TB8QCbuFbNV5A9Kc0SaxlLs1CbjYsUSlpNsfrQ+Hn2h0UcZeabZ40HkTpLV7Y9OZ9cXbMsj2nFrOjIQnlDR0cbftylv+SSAnGZEpC91/W8DYnfoN87Je6XBhqW5KCpn/lEaKmqAnVa/eOrbXsXPoxPsr+DoEodbOc9LtKef0IeatFdcQjJzUzZZvyXlYOCBvBbgYS1xTuhawrmQMbpgO6+qqoPk4MybgRnoloi6IHUKgKFGc7/8M9zR//9iYUEhcEMgHFMgfGCqg7bZlQbXAHks0uB9WWkAQ5MG7y4NV5EGcFVpMEEeizSALysNEHjDkgZwl4arSAO8pjQgy6BHGdvGJs5PKEDAPz2BPHzHKEE/ZMN0CqFlMok8E3XgXyIggNEGBL9HQMC2A8LZQPiW6ScBEHSBwO8zcJykQ40YinyDdNhpS+AE6DL5GzRa4uEexAsGQzxsmXjygguRRouMkXjxTDKSR2me3Gm4j2FBk4aeSUO/jYbhRaZDcLQkDHqQUA9ErjwfwqDhFPh0qsRoD4OGF9hOlfi37SbuIN1EJ1L6ugkIncu6SWA5kqR5IWT0KAvmrcED3ljwQEbwMMdwfkvp9SLTZa2d9gbscQvO3hyDx+DGcMZNnB1sDhJaJsjBJYaHHh6t9mtdPy3+YBDiH7h+zSfQh+Ifnmp/gUqr7VJr0TJ1nzvIgzeXJG0WUBA05eDz5gxgvNVV1+shCMOZuevLtUY5UbJKpCV4i4Jy6aImBfEMT/H0xigIULNiBR/C6stkJGxl5GWKmsF4GdmnqunCYYRov+4kCMOTIfqD9heYxoc37ifWy9/nS7ftEvNdurtGT82BMzQzrp+o1W6Pheh34G0AHzZWjVwZeDDeHKqLeogvQMMRX9tLPWR/U9m5ebKIU/k5fd6WhOzIWt5ayQvCRiYCYE26at4yNHmoc1x2eTji5wb6rPhwB8RD22s+dkuulpyVnXbn3sSsGCCvJZP8eakjOGLu9Vn0YZ97Z01UoR7gKK/AH+SSYXCy/QVyybbXpNwX4HYFZ53N1dCCK67AhSPOLPdaZzAMeUBBfcA2PHmwvdDgLg9d4weEByQPJsqjkYfw68hDM6E2PHno8aMAd3mwIQ9+AIcjD2C8VTD1fNwH8uDZlofzofAsM5DTuFily5Zp/U0uEDs8CqXL0V7wUTnax22zfHyJJzvgeB+pAr3KjMOI04EeLw01TgPbNdB7nO7Qi6DxxOV14/R4VyHon4f7CvIAwMCH8cB2pfwuD12r25whDePHu94c9KqTD2gYb79OTjeL5TaPyvJ4y9Mes/Abhu6Nsc/TiH9GjU5uHn+Ec6/Sx186BfP/AA==</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/aws_3d.png b/src/main/webapp/templates/network/aws_3d.png
deleted file mode 100644
index e96614c7..00000000
--- a/src/main/webapp/templates/network/aws_3d.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/aws_3d.xml b/src/main/webapp/templates/network/aws_3d.xml
deleted file mode 100644
index 169a7a75..00000000
--- a/src/main/webapp/templates/network/aws_3d.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="google"><diagram name="Page-1" id="aaaa8250-4180-3840-79b5-4cada1eebb92">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/azure_1.png b/src/main/webapp/templates/network/azure_1.png
deleted file mode 100644
index 6d12ea42..00000000
--- a/src/main/webapp/templates/network/azure_1.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/azure_1.xml b/src/main/webapp/templates/network/azure_1.xml
deleted file mode 100644
index 968c5fd9..00000000
--- a/src/main/webapp/templates/network/azure_1.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="google"><diagram name="Page-1" id="7a6c530e-6e37-e111-ec74-82921da8cc10">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/azure_2.png b/src/main/webapp/templates/network/azure_2.png
deleted file mode 100644
index 1cf0a6d6..00000000
--- a/src/main/webapp/templates/network/azure_2.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/azure_2.xml b/src/main/webapp/templates/network/azure_2.xml
deleted file mode 100644
index cad26f83..00000000
--- a/src/main/webapp/templates/network/azure_2.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36" version="8.6.2" editor="www.draw.io" type="device"><diagram id="6a731a19-8d31-9384-78a2-239565b7b9f0" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_bda_reference_architecture.png b/src/main/webapp/templates/network/ibm_bda_reference_architecture.png
deleted file mode 100644
index 9a889fe0..00000000
--- a/src/main/webapp/templates/network/ibm_bda_reference_architecture.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_bda_reference_architecture.xml b/src/main/webapp/templates/network/ibm_bda_reference_architecture.xml
deleted file mode 100644
index d7d79b1a..00000000
--- a/src/main/webapp/templates/network/ibm_bda_reference_architecture.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="2f404044-711c-603c-8f00-f6bb4c023d3c" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_blockchain.png b/src/main/webapp/templates/network/ibm_blockchain.png
deleted file mode 100644
index 08cd97ae..00000000
--- a/src/main/webapp/templates/network/ibm_blockchain.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_blockchain.xml b/src/main/webapp/templates/network/ibm_blockchain.xml
deleted file mode 100644
index e2708549..00000000
--- a/src/main/webapp/templates/network/ibm_blockchain.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile modified="2019-04-19T13:11:52.693Z" host="localhost" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36" etag="DJXPJYrTTw1msulxKAA5" version="@DRAWIO-VERSION@"><diagram id="eIo0H9kK7ql945uVP1NC" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_cognitive_conversation.png b/src/main/webapp/templates/network/ibm_cognitive_conversation.png
deleted file mode 100644
index b168f5f3..00000000
--- a/src/main/webapp/templates/network/ibm_cognitive_conversation.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_cognitive_conversation.xml b/src/main/webapp/templates/network/ibm_cognitive_conversation.xml
deleted file mode 100644
index f28cd217..00000000
--- a/src/main/webapp/templates/network/ibm_cognitive_conversation.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="2f404044-711c-603c-8f00-f6bb4c023d3c" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_cognitive_discovery.png b/src/main/webapp/templates/network/ibm_cognitive_discovery.png
deleted file mode 100644
index fdc2142a..00000000
--- a/src/main/webapp/templates/network/ibm_cognitive_discovery.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_cognitive_discovery.xml b/src/main/webapp/templates/network/ibm_cognitive_discovery.xml
deleted file mode 100644
index 239f9fdf..00000000
--- a/src/main/webapp/templates/network/ibm_cognitive_discovery.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="2f404044-711c-603c-8f00-f6bb4c023d3c" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_iot_architecture.png b/src/main/webapp/templates/network/ibm_iot_architecture.png
deleted file mode 100644
index 601eadc9..00000000
--- a/src/main/webapp/templates/network/ibm_iot_architecture.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_iot_architecture.xml b/src/main/webapp/templates/network/ibm_iot_architecture.xml
deleted file mode 100644
index c681d0e2..00000000
--- a/src/main/webapp/templates/network/ibm_iot_architecture.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="2f404044-711c-603c-8f00-f6bb4c023d3c" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_microservices.png b/src/main/webapp/templates/network/ibm_microservices.png
deleted file mode 100644
index 05a9f229..00000000
--- a/src/main/webapp/templates/network/ibm_microservices.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_microservices.xml b/src/main/webapp/templates/network/ibm_microservices.xml
deleted file mode 100644
index 1e91f261..00000000
--- a/src/main/webapp/templates/network/ibm_microservices.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="31b32b95-0358-9bc7-6ba0-a27c054ed1a7" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_private_cloud.png b/src/main/webapp/templates/network/ibm_private_cloud.png
deleted file mode 100644
index 38037207..00000000
--- a/src/main/webapp/templates/network/ibm_private_cloud.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_private_cloud.xml b/src/main/webapp/templates/network/ibm_private_cloud.xml
deleted file mode 100644
index 2fdd27e8..00000000
--- a/src/main/webapp/templates/network/ibm_private_cloud.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io" type="device"><diagram id="2f404044-711c-603c-8f00-f6bb4c023d3c" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_vcenter_server_platform.png b/src/main/webapp/templates/network/ibm_vcenter_server_platform.png
deleted file mode 100644
index 6fa07847..00000000
--- a/src/main/webapp/templates/network/ibm_vcenter_server_platform.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_vcenter_server_platform.xml b/src/main/webapp/templates/network/ibm_vcenter_server_platform.xml
deleted file mode 100644
index 343ec8fe..00000000
--- a/src/main/webapp/templates/network/ibm_vcenter_server_platform.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" version="@DRAWIO-VERSION@" editor="www.draw.io"><diagram id="0d7cefc2-ccd6-e077-73ed-a8e48b0cddf6" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/templates/network/ibm_vpc_architecture.png b/src/main/webapp/templates/network/ibm_vpc_architecture.png
deleted file mode 100644
index bca73efd..00000000
--- a/src/main/webapp/templates/network/ibm_vpc_architecture.png
+++ /dev/null
Binary files differ
diff --git a/src/main/webapp/templates/network/ibm_vpc_architecture.xml b/src/main/webapp/templates/network/ibm_vpc_architecture.xml
deleted file mode 100644
index 8f2718f4..00000000
--- a/src/main/webapp/templates/network/ibm_vpc_architecture.xml
+++ /dev/null
@@ -1 +0,0 @@
-<mxfile modified="2019-06-14T10:17:01.477Z" host="localhost" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" etag="dY-RyaEvI0M7g6cvaE8M" version="@DRAWIO-VERSION@" type="device"><diagram id="gla63Dk0FSsQ5Y3dld1r" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/webapp/well-known/microsoft-identity-association.json b/src/main/webapp/well-known/microsoft-identity-association.json
deleted file mode 100644
index 16b29af1..00000000
--- a/src/main/webapp/well-known/microsoft-identity-association.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "associatedApplications": [
- {
- "applicationId": "45c10911-200f-4e27-a666-9e9fca147395"
- },
- {
- "applicationId": "1afa9b7e-2533-4d86-83c0-c4d4678eca0e"
- },
- {
- "applicationId": "aae1c620-4caf-41b3-9633-f6d0b6347dd9"
- },
- {
- "applicationId": "b5ff67d6-3155-4fca-965a-59a3655c4476"
- },
- {
- "applicationId": "417a451a-a343-4788-b6c1-901e63182565"
- }
- ]
-} \ No newline at end of file
diff --git a/src/main/webapp/yarn.lock b/src/main/webapp/yarn.lock
index 299adbdb..d9434bdd 100644
--- a/src/main/webapp/yarn.lock
+++ b/src/main/webapp/yarn.lock
@@ -483,9 +483,9 @@ inherits@^2.0.3, inherits@~2.0.3:
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
ini@^1.3.4:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
- integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
is-obj@^2.0.0:
version "2.0.0"