summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLester Caine <lester@lsces.co.uk>2026-05-14 09:49:08 +0100
committerLester Caine <lester@lsces.co.uk>2026-05-14 09:49:08 +0100
commit0227c8d830b8c7d58ef628a32dffc1e116feb727 (patch)
tree89a25c81b9f4da345557236b7e48d5e106dae0f0
parent6f8d642060d9e9112cdafaede4b2ea28a2e22ce3 (diff)
downloadckeditor-0227c8d830b8c7d58ef628a32dffc1e116feb727.tar.gz
ckeditor-0227c8d830b8c7d58ef628a32dffc1e116feb727.tar.bz2
ckeditor-0227c8d830b8c7d58ef628a32dffc1e116feb727.zip
php-cs-fixer tidies to php8.5 standards
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-rwxr-xr-x[-rw-r--r--].htaccess48
-rwxr-xr-xadmin/admin_ckeditor_inc.php82
-rwxr-xr-xadmin/schema_inc.php16
-rwxr-xr-x[-rw-r--r--]icons/pkg_ckeditor.gifbin1457 -> 1457 bytes
-rwxr-xr-x[-rw-r--r--]icons/pkg_ckeditor.pngbin1590 -> 1590 bytes
-rwxr-xr-ximages/spacer.gifbin0 -> 43 bytes
-rwxr-xr-xincludes/bit_setup_inc.php29
-rwxr-xr-x[-rw-r--r--]index.php0
-rwxr-xr-xlang/en-gb.js5
-rwxr-xr-xlang/en.js5
-rwxr-xr-xplugins/N1ED-editor/plugin.js140
-rwxr-xr-xplugins/OpenStreet/OpenLayers.js5080
-rwxr-xr-xplugins/OpenStreet/images/gg.pngbin0 -> 15882 bytes
-rwxr-xr-xplugins/OpenStreet/key.txt1
-rwxr-xr-xplugins/OpenStreet/save.php10
-rwxr-xr-xplugins/a11yhelp/dialogs/a11yhelp.js26
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/_translationstatus.txt25
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/af.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/ar.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/az.js17
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/bg.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/ca.js21
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/cs.js20
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/cy.js17
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/da.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/de-ch.js18
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/de.js23
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/el.js21
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/en-au.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/en-gb.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/en.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/eo.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/es-mx.js21
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/es.js23
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/et.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/eu.js22
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/fa.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/fi.js17
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/fo.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/fr-ca.js17
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/fr.js13
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/gl.js20
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/gu.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/he.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/hi.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/hr.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/hu.js20
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/id.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/it.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/ja.js9
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/km.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/ko.js10
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/ku.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/lt.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/lv.js20
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/mk.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/mn.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/nb.js12
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/nl.js20
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/no.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/oc.js20
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/pl.js23
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/pt-br.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/pt.js12
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/ro.js12
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/ru.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/si.js16
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/sk.js17
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/sl.js17
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/sq.js12
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/sr-latn.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/sr.js19
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/sv.js17
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/th.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/tr.js18
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/tt.js11
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/ug.js20
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/uk.js20
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/vi.js17
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/zh-cn.js9
-rwxr-xr-xplugins/a11yhelp/dialogs/lang/zh.js15
-rwxr-xr-xplugins/about/dialogs/about.js16
-rwxr-xr-xplugins/about/dialogs/hidpi/logo_ckeditor.pngbin0 -> 12236 bytes
-rwxr-xr-xplugins/about/dialogs/logo_ckeditor.pngbin0 -> 5650 bytes
-rwxr-xr-xplugins/accordionList/LICENSE674
-rwxr-xr-xplugins/accordionList/README.md14
-rwxr-xr-xplugins/accordionList/icons/accordionlist.pngbin0 -> 3289 bytes
-rwxr-xr-xplugins/accordionList/icons/hidpi/accordionlist.pngbin0 -> 3909 bytes
-rwxr-xr-xplugins/accordionList/plugin.js60
-rwxr-xr-xplugins/bootstrapMediaEmbed/icons/bootstrapmediaembed.pngbin0 -> 369 bytes
-rwxr-xr-xplugins/bootstrapMediaEmbed/icons/hidpi/bootstrapmediaembed.pngbin0 -> 680 bytes
-rwxr-xr-xplugins/bootstrapMediaEmbed/lang/en.js19
-rwxr-xr-xplugins/bootstrapMediaEmbed/lang/it.js19
-rwxr-xr-xplugins/bootstrapMediaEmbed/plugin.js159
-rwxr-xr-xplugins/bootstrapTabs/LICENSE-GPL674
-rwxr-xr-xplugins/bootstrapTabs/LICENSE-LGPL165
-rwxr-xr-xplugins/bootstrapTabs/LICENSE-MPL373
-rwxr-xr-xplugins/bootstrapTabs/README.md11
-rwxr-xr-xplugins/bootstrapTabs/dialogs/bootstrapTabs.js30
-rwxr-xr-xplugins/bootstrapTabs/icons/bootstrapTabs.pngbin0 -> 317 bytes
-rwxr-xr-xplugins/bootstrapTabs/sample/bootstrapTabs.html36
-rwxr-xr-xplugins/bt_table/LICENSE340
-rwxr-xr-xplugins/bt_table/README.md18
-rwxr-xr-xplugins/bt_table/dialogs/table.js58
-rwxr-xr-xplugins/clipboard/dialogs/paste.js29
-rwxr-xr-xplugins/colordialog/dialogs/colordialog.css23
-rwxr-xr-xplugins/colordialog/dialogs/colordialog.js44
-rwxr-xr-xplugins/copyformatting/cursors/cursor-disabled.svg25
-rwxr-xr-xplugins/copyformatting/cursors/cursor.svg14
-rwxr-xr-xplugins/copyformatting/styles/copyformatting.css45
-rwxr-xr-xplugins/dialog/dialogDefinition.js4
-rwxr-xr-xplugins/div/dialogs/div.js43
-rwxr-xr-xplugins/find/dialogs/find.js95
-rwxr-xr-xplugins/forms/dialogs/button.js20
-rwxr-xr-xplugins/forms/dialogs/checkbox.js21
-rwxr-xr-xplugins/forms/dialogs/form.js26
-rwxr-xr-xplugins/forms/dialogs/hiddenfield.js7
-rwxr-xr-xplugins/forms/dialogs/radio.js25
-rwxr-xr-xplugins/forms/dialogs/select.js85
-rwxr-xr-xplugins/forms/dialogs/textarea.js22
-rwxr-xr-xplugins/forms/dialogs/textfield.js33
-rwxr-xr-xplugins/forms/images/hiddenfield.gifbin0 -> 178 bytes
-rwxr-xr-xplugins/html5validation/CHANGELOG.txt9
-rwxr-xr-xplugins/html5validation/LICENSE675
-rwxr-xr-xplugins/html5validation/README.md29
-rwxr-xr-xplugins/html5video/dialogs/html5video.js48
-rwxr-xr-xplugins/icons.pngbin0 -> 11297 bytes
-rwxr-xr-xplugins/icons_hidpi.pngbin0 -> 33325 bytes
-rwxr-xr-xplugins/iframe/dialogs/iframe.js30
-rwxr-xr-xplugins/iframe/images/placeholder.pngbin0 -> 265 bytes
-rwxr-xr-xplugins/image/dialogs/image.js162
-rwxr-xr-xplugins/image/images/noimage.pngbin0 -> 1610 bytes
-rwxr-xr-xplugins/leaflet/CHANGELOG.md74
-rwxr-xr-xplugins/leaflet/Creating and Editing Leaflet Maps.txt56
-rwxr-xr-xplugins/leaflet/Installation Guide.txt235
-rwxr-xr-xplugins/leaflet/LICENSE.txt502
-rwxr-xr-xplugins/leaflet/README.md96
-rwxr-xr-xplugins/leaflet/css/contents.css43
-rwxr-xr-xplugins/leaflet/demo/index.html256
-rwxr-xr-xplugins/leaflet/dialogs/leaflet.js518
-rwxr-xr-xplugins/leaflet/icons/leaflet.pngbin0 -> 269 bytes
-rwxr-xr-xplugins/leaflet/lang/de.js19
-rwxr-xr-xplugins/leaflet/lang/en.js20
-rwxr-xr-xplugins/leaflet/lang/eu.js19
-rwxr-xr-xplugins/leaflet/lang/ru.js19
-rwxr-xr-xplugins/leaflet/plugin.js176
-rwxr-xr-xplugins/leaflet/scripts/Leaflet-MiniMap/.DS_Storebin0 -> 6148 bytes
-rwxr-xr-xplugins/leaflet/scripts/Leaflet-MiniMap/LICENSE.txt22
-rwxr-xr-xplugins/leaflet/scripts/Leaflet-MiniMap/package.json25
-rwxr-xr-xplugins/leaflet/scripts/Leaflet-MiniMap/readme.md47
-rwxr-xr-xplugins/leaflet/scripts/Leaflet-MiniMap/src/.DS_Storebin0 -> 6148 bytes
-rwxr-xr-xplugins/leaflet/scripts/Leaflet-MiniMap/src/Control.MiniMap.css43
-rwxr-xr-xplugins/leaflet/scripts/Leaflet-MiniMap/src/Control.MiniMap.js270
-rwxr-xr-xplugins/leaflet/scripts/Leaflet-MiniMap/src/images/toggle.pngbin0 -> 345 bytes
-rwxr-xr-xplugins/leaflet/scripts/leaflet-providers/.DS_Storebin0 -> 6148 bytes
-rwxr-xr-xplugins/leaflet/scripts/leaflet-providers/README.md75
-rwxr-xr-xplugins/leaflet/scripts/leaflet-providers/index.html166
-rwxr-xr-xplugins/leaflet/scripts/leaflet-providers/leaflet-providers.js458
-rwxr-xr-xplugins/leaflet/scripts/leaflet-providers/license.md9
-rwxr-xr-xplugins/leaflet/scripts/leaflet-providers/package.json20
-rwxr-xr-xplugins/leaflet/scripts/mapParser.html185
-rwxr-xr-xplugins/link/dialogs/anchor.js22
-rwxr-xr-xplugins/link/dialogs/link.js30
-rwxr-xr-xplugins/link/images/anchor.pngbin0 -> 752 bytes
-rwxr-xr-xplugins/link/images/hidpi/anchor.pngbin0 -> 1109 bytes
-rwxr-xr-xplugins/liststyle/dialogs/liststyle.js38
-rwxr-xr-xplugins/magicline/images/hidpi/icon-rtl.pngbin0 -> 176 bytes
-rwxr-xr-xplugins/magicline/images/hidpi/icon.pngbin0 -> 199 bytes
-rwxr-xr-xplugins/magicline/images/icon-rtl.pngbin0 -> 138 bytes
-rwxr-xr-xplugins/magicline/images/icon.pngbin0 -> 133 bytes
-rwxr-xr-xplugins/pastefromlibreoffice/filter/default.js363
-rwxr-xr-xplugins/pastefromlibreoffice/plugin.js76
-rwxr-xr-xplugins/preview/preview.html13
-rwxr-xr-xplugins/showblocks/images/block_address.pngbin0 -> 152 bytes
-rwxr-xr-xplugins/showblocks/images/block_blockquote.pngbin0 -> 154 bytes
-rwxr-xr-xplugins/showblocks/images/block_div.pngbin0 -> 127 bytes
-rwxr-xr-xplugins/showblocks/images/block_h1.pngbin0 -> 120 bytes
-rwxr-xr-xplugins/showblocks/images/block_h2.pngbin0 -> 127 bytes
-rwxr-xr-xplugins/showblocks/images/block_h3.pngbin0 -> 123 bytes
-rwxr-xr-xplugins/showblocks/images/block_h4.pngbin0 -> 123 bytes
-rwxr-xr-xplugins/showblocks/images/block_h5.pngbin0 -> 126 bytes
-rwxr-xr-xplugins/showblocks/images/block_h6.pngbin0 -> 123 bytes
-rwxr-xr-xplugins/showblocks/images/block_p.pngbin0 -> 115 bytes
-rwxr-xr-xplugins/showblocks/images/block_pre.pngbin0 -> 128 bytes
-rwxr-xr-xplugins/specialchar/dialogs/lang/_translationstatus.txt20
-rwxr-xr-xplugins/specialchar/dialogs/lang/af.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/ar.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/az.js12
-rwxr-xr-xplugins/specialchar/dialogs/lang/bg.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/ca.js16
-rwxr-xr-xplugins/specialchar/dialogs/lang/cs.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/cy.js16
-rwxr-xr-xplugins/specialchar/dialogs/lang/da.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/de-ch.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/de.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/el.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/en-au.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/en-ca.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/en-gb.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/en.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/eo.js12
-rwxr-xr-xplugins/specialchar/dialogs/lang/es-mx.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/es.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/et.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/eu.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/fa.js14
-rwxr-xr-xplugins/specialchar/dialogs/lang/fi.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/fr-ca.js10
-rwxr-xr-xplugins/specialchar/dialogs/lang/fr.js14
-rwxr-xr-xplugins/specialchar/dialogs/lang/gl.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/he.js14
-rwxr-xr-xplugins/specialchar/dialogs/lang/hr.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/hu.js12
-rwxr-xr-xplugins/specialchar/dialogs/lang/id.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/it.js14
-rwxr-xr-xplugins/specialchar/dialogs/lang/ja.js11
-rwxr-xr-xplugins/specialchar/dialogs/lang/km.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/ko.js12
-rwxr-xr-xplugins/specialchar/dialogs/lang/ku.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/lt.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/lv.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/nb.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/nl.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/no.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/oc.js14
-rwxr-xr-xplugins/specialchar/dialogs/lang/pl.js12
-rwxr-xr-xplugins/specialchar/dialogs/lang/pt-br.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/pt.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/ro.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/ru.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/si.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/sk.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/sl.js14
-rwxr-xr-xplugins/specialchar/dialogs/lang/sq.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/sv.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/th.js13
-rwxr-xr-xplugins/specialchar/dialogs/lang/tr.js14
-rwxr-xr-xplugins/specialchar/dialogs/lang/tt.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/ug.js15
-rwxr-xr-xplugins/specialchar/dialogs/lang/uk.js14
-rwxr-xr-xplugins/specialchar/dialogs/lang/vi.js16
-rwxr-xr-xplugins/specialchar/dialogs/lang/zh-cn.js11
-rwxr-xr-xplugins/specialchar/dialogs/lang/zh.js9
-rwxr-xr-xplugins/specialchar/dialogs/specialchar.js50
-rwxr-xr-xplugins/table/dialogs/table.js77
-rwxr-xr-xplugins/tableselection/styles/tableselection.css44
-rwxr-xr-xplugins/tabletools/dialogs/tableCell.js77
-rwxr-xr-xplugins/templates/dialogs/templates.css76
-rwxr-xr-xplugins/templates/dialogs/templates.js10
-rwxr-xr-xplugins/templates/templates/default.js13
-rwxr-xr-xplugins/templates/templates/images/template1.gifbin0 -> 539 bytes
-rwxr-xr-xplugins/templates/templates/images/template2.gifbin0 -> 497 bytes
-rwxr-xr-xplugins/templates/templates/images/template3.gifbin0 -> 557 bytes
-rwxr-xr-xplugins/widget/images/handle.pngbin0 -> 220 bytes
-rwxr-xr-xsamples/css/samples.css1914
-rwxr-xr-xsamples/img/github-top.pngbin0 -> 383 bytes
-rwxr-xr-xsamples/img/header-bg.pngbin0 -> 13086 bytes
-rwxr-xr-xsamples/img/header-separator.pngbin0 -> 123 bytes
-rwxr-xr-xsamples/img/logo.pngbin0 -> 5634 bytes
-rwxr-xr-xsamples/img/logo.svg13
-rwxr-xr-xsamples/img/navigation-tip.pngbin0 -> 12029 bytes
-rwxr-xr-xsamples/index.html159
-rwxr-xr-xsamples/js/sample.js53
-rwxr-xr-xsamples/js/sf.js45
-rwxr-xr-xsamples/old/ajax.html92
-rwxr-xr-xsamples/old/api.html218
-rwxr-xr-xsamples/old/appendto.html68
-rwxr-xr-xsamples/old/assets/inlineall/logo.pngbin0 -> 4283 bytes
-rwxr-xr-xsamples/old/assets/outputxhtml/outputxhtml.css173
-rwxr-xr-xsamples/old/assets/posteddata.php59
-rwxr-xr-xsamples/old/assets/sample.jpgbin0 -> 14449 bytes
-rwxr-xr-xsamples/old/assets/uilanguages/languages.js7
-rwxr-xr-xsamples/old/datafiltering.html522
-rwxr-xr-xsamples/old/dialog/assets/my_dialog.js48
-rwxr-xr-xsamples/old/dialog/dialog.html203
-rwxr-xr-xsamples/old/divreplace.html146
-rwxr-xr-xsamples/old/enterkey/enterkey.html118
-rwxr-xr-xsamples/old/htmlwriter/assets/outputforflash/outputforflash.flabin0 -> 85504 bytes
-rwxr-xr-xsamples/old/htmlwriter/assets/outputforflash/outputforflash.swfbin0 -> 15571 bytes
-rwxr-xr-xsamples/old/htmlwriter/assets/outputforflash/swfobject.js75
-rwxr-xr-xsamples/old/htmlwriter/outputforflash.html289
-rwxr-xr-xsamples/old/htmlwriter/outputhtml.html231
-rwxr-xr-xsamples/old/index.html148
-rwxr-xr-xsamples/old/inlineall.html325
-rwxr-xr-xsamples/old/inlinebycode.html155
-rwxr-xr-xsamples/old/inlinetextarea.html116
-rwxr-xr-xsamples/old/jquery.html129
-rwxr-xr-xsamples/old/magicline/magicline.html215
-rwxr-xr-xsamples/old/readonly.html85
-rwxr-xr-xsamples/old/replacebyclass.html67
-rwxr-xr-xsamples/old/replacebycode.html66
-rwxr-xr-xsamples/old/sample.css375
-rwxr-xr-xsamples/old/sample.js50
-rwxr-xr-xsamples/old/sample_posteddata.php16
-rwxr-xr-xsamples/old/tabindex.html82
-rwxr-xr-xsamples/old/toolbar/toolbar.html250
-rwxr-xr-xsamples/old/uicolor.html79
-rwxr-xr-xsamples/old/uilanguages.html131
-rwxr-xr-xsamples/old/wysiwygarea/fullpage.html89
-rwxr-xr-xsamples/old/xhtmlstyle.html241
-rwxr-xr-xsamples/toolbarconfigurator/css/fontello.css69
-rwxr-xr-xsamples/toolbarconfigurator/font/LICENSE.txt10
-rwxr-xr-xsamples/toolbarconfigurator/font/config.json28
-rwxr-xr-xsamples/toolbarconfigurator/font/fontello.eotbin0 -> 4988 bytes
-rwxr-xr-xsamples/toolbarconfigurator/font/fontello.svg14
-rwxr-xr-xsamples/toolbarconfigurator/font/fontello.ttfbin0 -> 4820 bytes
-rwxr-xr-xsamples/toolbarconfigurator/font/fontello.woffbin0 -> 2904 bytes
-rwxr-xr-xsamples/toolbarconfigurator/index.html476
-rwxr-xr-xsamples/toolbarconfigurator/js/abstracttoolbarmodifier.js39
-rwxr-xr-xsamples/toolbarconfigurator/js/fulltoolbareditor.js9
-rwxr-xr-xsamples/toolbarconfigurator/js/toolbarmodifier.js91
-rwxr-xr-xsamples/toolbarconfigurator/js/toolbartextmodifier.js50
-rwxr-xr-xsamples/toolbarconfigurator/lib/codemirror/LICENSE19
-rwxr-xr-xsamples/toolbarconfigurator/lib/codemirror/codemirror.css519
-rwxr-xr-xsamples/toolbarconfigurator/lib/codemirror/codemirror.js996
-rwxr-xr-xsamples/toolbarconfigurator/lib/codemirror/javascript.js79
-rwxr-xr-xsamples/toolbarconfigurator/lib/codemirror/neo.css63
-rwxr-xr-xsamples/toolbarconfigurator/lib/codemirror/show-hint.css38
-rwxr-xr-xsamples/toolbarconfigurator/lib/codemirror/show-hint.js48
-rwxr-xr-x[-rw-r--r--]smarty/block.ckeditor.php56
-rwxr-xr-x[-rw-r--r--]templates/admin_ckeditor.tpl2
-rwxr-xr-x[-rw-r--r--]templates/footer_inc.tpl0
322 files changed, 25331 insertions, 118 deletions
diff --git a/.htaccess b/.htaccess
index 8d694ef..480cfd3 100644..100755
--- a/.htaccess
+++ b/.htaccess
@@ -1,24 +1,24 @@
-#
-# Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-# For licensing, see LICENSE.html or http://ckeditor.com/license
-#
-
-#
-# On some specific Linux installations you could face problems with Firefox.
-# It could give you errors when loading the editor saying that some illegal
-# characters were found (three strange chars in the beginning of the file).
-# This could happen if you map the .js or .css files to PHP, for example.
-#
-# Those characters are the Byte Order Mask (BOM) of the Unicode encoded files.
-# All FCKeditor files are Unicode encoded.
-#
-
-AddType application/x-javascript .js
-AddType text/css .css
-
-#
-# If PHP is mapped to handle XML files, you could have some issues. The
-# following will disable it.
-#
-
-AddType text/xml .xml
+#
+# Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+# For licensing, see LICENSE.html or http://ckeditor.com/license
+#
+
+#
+# On some specific Linux installations you could face problems with Firefox.
+# It could give you errors when loading the editor saying that some illegal
+# characters were found (three strange chars in the beginning of the file).
+# This could happen if you map the .js or .css files to PHP, for example.
+#
+# Those characters are the Byte Order Mask (BOM) of the Unicode encoded files.
+# All FCKeditor files are Unicode encoded.
+#
+
+AddType application/x-javascript .js
+AddType text/css .css
+
+#
+# If PHP is mapped to handle XML files, you could have some issues. The
+# following will disable it.
+#
+
+AddType text/xml .xml
diff --git a/admin/admin_ckeditor_inc.php b/admin/admin_ckeditor_inc.php
index 1008c32..e3698c5 100755
--- a/admin/admin_ckeditor_inc.php
+++ b/admin/admin_ckeditor_inc.php
@@ -1,64 +1,62 @@
<?php
-$formCkeditorFeatures = array(
- "ckeditor_custom_config" => array(
- 'label' => 'Custom Config File',
- 'note' => 'If enabled, a custom configuration is included, either <kbd>' . THEMES_PKG_DIR . '/styles/&lt;current-style&gt;/ckeditor/ckconfig.custom.js</kbd>, or <kbd>' . CKEDITOR_PKG_DIR . '/ckconfig.custom.js</kbd>. It may be a modified copy of <kbd>ckconfig.js</kbd> or of <kbd>ckconfig.bitweaver.js</kbd>. Depending on the modifications, a few of the settings below might not work anymore as expected (e.g., toolbar or skin settings).'
- ),
- "ckeditor_debug" => array(
- 'label' => 'Enabled debugging',
- 'note' => 'Enable support for debug message output. On first debug message a window will pop up.'
- ),
- "ckeditor_on_click" => array(
- 'label' => 'Load CKEditor on Click',
- 'note' => 'Delay loading the CKEditor until the user clicks on the text area.'
- ),
- "ckeditor_ask" => array(
- 'label' => 'Ask to use CKEditor',
- 'note' => 'If set the user will be prompted if they want to use CKEditor for a given textbox. This option implies Load CKEditor on Click even if it is not set.'
- ),
-);
-
+$formCkeditorFeatures = [
+ "ckeditor_custom_config" => [
+ "label" => "Custom Config File",
+ "note" => "If enabled, a custom configuration is included, either <kbd>" . THEMES_PKG_PATH . "/styles/&lt;current-style&gt;/ckeditor/ckconfig.custom.js</kbd>, or <kbd>" . CKEDITOR_PKG_DIR . "/ckconfig.custom.js</kbd>. It may be a modified copy of <kbd>ckconfig.js</kbd> or of <kbd>ckconfig.bitweaver.js</kbd>. Depending on the modifications, a few of the settings below might not work anymore as expected (e.g., toolbar or skin settings).",
+ ],
+ "ckeditor_debug" => [
+ "label" => "Enabled debugging",
+ "note" => "Enable support for debug message output. On first debug message a window will pop up.",
+ ],
+ "ckeditor_on_click" => [
+ "label" => "Load CKEditor on Click",
+ "note" => "Delay loading the CKEditor until the user clicks on the text area.",
+ ],
+ "ckeditor_ask" => [
+ "label" => "Ask to use CKEditor",
+ "note" => "If set the user will be prompted if they want to use CKEditor for a given textbox. This option implies Load CKEditor on Click even if it is not set.",
+ ],
+];
// Toolbars
-$gBitSmarty->assign( 'formCkeditorFeatures', $formCkeditorFeatures );
-
-$formToolbars = array( 'ckedit_toolbars' => array(
- 'label' => 'Toolbar Set',
- 'note' => 'The toolbar set to use. "All" includes functionality not supported by Bitweaver. Use at your own risk!'
- )
-);
+$gBitSmarty->assign( "formCkeditorFeatures", $formCkeditorFeatures );
-$gBitSmarty->assign( 'formToolbars', $formToolbars );
-$gBitSmarty->assign( 'formToolbarChoices', array('Basic', 'Intermediate', 'Advanced', 'Full'));
+$formToolbars = [
+ "ckedit_toolbars" => [
+ "label" => "Toolbar Set",
+ "note" => 'The toolbar set to use. "All" includes functionality not supported by Bitweaver. Use at your own risk!',
+ ],
+];
+$gBitSmarty->assign( "formToolbars", $formToolbars );
+$gBitSmarty->assign( "formToolbarChoices", ["Basic", "Intermediate", "Advanced", "Full"]);
// Skin
-$formSkin = array( 'ckedit_skin' => array(
- 'label' => 'Skin',
- 'note' => 'The skin to use.',
- )
-);
-$gBitSmarty->assign( 'formSkin', $formSkin );
-$skins = array_flip( scandir( CKEDITOR_PKG_PATH.'skins/' ) );
-foreach( array( '.', '..' ) as $dir ) {
+$formSkin = [
+ "ckedit_skin" => [
+ "label" => "Skin",
+ "note" => "The skin to use.",
+ ],
+];
+$gBitSmarty->assign( "formSkin", $formSkin );
+$skins = array_flip( scandir( CKEDITOR_PKG_PATH."skins/" ) );
+foreach( [ ".", ".." ] as $dir ) {
if( isset( $skins[$dir] ) ) {
unset( $skins[$dir] );
}
}
-$gBitSmarty->assign( 'formSkinChoices', array_keys( $skins ) );
+$gBitSmarty->assign( "formSkinChoices", array_keys( $skins ) );
-
-if( !empty( $_REQUEST['change_prefs'] ) ) {
+if( !empty( $_REQUEST["change_prefs"] ) ) {
foreach( $formCkeditorFeatures as $item => $data ) {
simple_set_toggle( $item, CKEDITOR_PKG_NAME );
}
- $ckeditorSets = array_merge( $formToolbars , $formSkin);
+ $ckeditorSets = [ ...$formToolbars , ...$formSkin];
foreach( $ckeditorSets as $item => $data ) {
simple_set_value( $item, CKEDITOR_PKG_NAME );
}
-}
-?>
+} \ No newline at end of file
diff --git a/admin/schema_inc.php b/admin/schema_inc.php
index 7ebca97..5e67611 100755
--- a/admin/schema_inc.php
+++ b/admin/schema_inc.php
@@ -1,13 +1,13 @@
<?php
global $gBitInstaller;
-$gBitInstaller->registerPackageInfo( CKEDITOR_PKG_NAME, [
- 'description' => "CKEditor is a 'What You See Is What You Get' textarea HTML editor. It works with IE 5.5+, Firefox 1.0+, Mozilla 1.3+, and Netscape 7+. ",
- 'license' => '<a href="http://www.gnu.org/licenses/licenses.html#LGPL">LGPL</a>',
- 'important' => 'When using this WYSIWYG editor, we recommend that you either use HTML as the only content format or use TikiWiki with the option <kbd>allow HTML</kbd> enabled (formats are set in Administration --> Liberty --> Liberty plugins). It <em>can not</em> be used with competing editor TinyMCE active, and it is largely incompatible with the package Quicktags.',
- 'version' => '3.1+',
+$gBitInstaller->registerPackageInfo( CKEDITOR_PKG_NAME, [
+ "description" => "CKEditor is a 'What You See Is What You Get' textarea HTML editor. It works with IE 5.5+, Firefox 1.0+, Mozilla 1.3+, and Netscape 7+. ",
+ "license" => '<a href="http://www.gnu.org/licenses/licenses.html#LGPL">LGPL</a>',
+ "important" => "When using this WYSIWYG editor, we recommend that you either use HTML as the only content format or use TikiWiki with the option <kbd>allow HTML</kbd> enabled (formats are set in Administration --> Liberty --> Liberty plugins). It <em>can not</em> be used with competing editor TinyMCE active, and it is largely incompatible with the package Quicktags.",
+ "version" => "3.1+",
] );
-$gBitInstaller->registerPreferences( CKEDITOR_PKG_NAME, [
- [ CKEDITOR_PKG_NAME,'ckedit_debug','n'],
- [ CKEDITOR_PKG_NAME,'ckedit_toolbars', 'Basic'],
+$gBitInstaller->registerPreferences( CKEDITOR_PKG_NAME, [
+ [ CKEDITOR_PKG_NAME,"ckedit_debug","n"],
+ [ CKEDITOR_PKG_NAME,"ckedit_toolbars", "Basic"],
] );
diff --git a/icons/pkg_ckeditor.gif b/icons/pkg_ckeditor.gif
index 5d4bfbc..5d4bfbc 100644..100755
--- a/icons/pkg_ckeditor.gif
+++ b/icons/pkg_ckeditor.gif
Binary files differ
diff --git a/icons/pkg_ckeditor.png b/icons/pkg_ckeditor.png
index d2a8530..d2a8530 100644..100755
--- a/icons/pkg_ckeditor.png
+++ b/icons/pkg_ckeditor.png
Binary files differ
diff --git a/images/spacer.gif b/images/spacer.gif
new file mode 100755
index 0000000..5bfd67a
--- /dev/null
+++ b/images/spacer.gif
Binary files differ
diff --git a/includes/bit_setup_inc.php b/includes/bit_setup_inc.php
index 1fb5aac..7448d4c 100755
--- a/includes/bit_setup_inc.php
+++ b/includes/bit_setup_inc.php
@@ -1,26 +1,25 @@
<?php
global $gBitSystem, $gBitThemes;
-$pRegisterHash = array(
- 'package_name' => 'ckeditor',
- 'package_path' => dirname( dirname( __FILE__ ) ).'/',
-);
-
+$pRegisterHash = [
+ "package_name" => "ckeditor",
+ "package_path" => dirname( dirname( __FILE__ ) )."/",
+];
// fix to quieten down VS Code which can't see the dynamic creation of these ...
-define( 'CKEDITOR_PKG_NAME', $pRegisterHash['package_name'] );
-define( 'CKEDITOR_PKG_URL', BIT_ROOT_URL . basename( $pRegisterHash['package_path'] ) . '/' );
-define( 'CKEDITOR_PKG_PATH', BIT_ROOT_PATH . basename( $pRegisterHash['package_path'] ) . '/' );
-define( 'CKEDITOR_PKG_INCLUDE_PATH', BIT_ROOT_PATH . basename( $pRegisterHash['package_path'] ) . '/includes/');
-define( 'CKEDITOR_PKG_CLASS_PATH', BIT_ROOT_PATH . basename( $pRegisterHash['package_path'] ) . '/includes/classes/');
-define( 'CKEDITOR_PKG_ADMIN_PATH', BIT_ROOT_PATH . basename( $pRegisterHash['package_path'] ) . '/admin/');
+define( "CKEDITOR_PKG_NAME", $pRegisterHash["package_name"] );
+define( "CKEDITOR_PKG_URL", BIT_ROOT_URL . basename( $pRegisterHash["package_path"] ) . "/" );
+define( "CKEDITOR_PKG_PATH", BIT_ROOT_PATH . basename( $pRegisterHash["package_path"] ) . "/" );
+define( "CKEDITOR_PKG_INCLUDE_PATH", BIT_ROOT_PATH . basename( $pRegisterHash["package_path"] ) . "/includes/");
+define( "CKEDITOR_PKG_CLASS_PATH", BIT_ROOT_PATH . basename( $pRegisterHash["package_path"] ) . "/includes/classes/");
+define( "CKEDITOR_PKG_ADMIN_PATH", BIT_ROOT_PATH . basename( $pRegisterHash["package_path"] ) . "/admin/");
$gBitSystem->registerPackage( $pRegisterHash );
-if( $gBitSystem->isPackageActive( 'ckeditor' ) && $gBitUser->isRegistered() && $gBitUser->hasPermission( 'p_liberty_enter_html' ) ){
- if( defined( 'IS_LIVE' ) && IS_LIVE ) {
- $gBitThemes->loadJavascript( CKEDITOR_PKG_PATH.'ckeditor.js', false, 600, false );
+if( $gBitSystem->isPackageActive( "ckeditor" ) && $gBitUser->isRegistered() && $gBitUser->hasPermission( "p_liberty_enter_html" ) ){
+ if( defined( "IS_LIVE" ) && IS_LIVE ) {
+ $gBitThemes->loadJavascript( CKEDITOR_PKG_PATH."ckeditor.js", false, 600, false );
} else {
- $gBitThemes->loadJavascript( CKEDITOR_PKG_PATH.'ckeditor.js', false, 600, false );
+ $gBitThemes->loadJavascript( CKEDITOR_PKG_PATH."ckeditor.js", false, 600, false );
}
}
diff --git a/index.php b/index.php
index 92c0b9d..92c0b9d 100644..100755
--- a/index.php
+++ b/index.php
diff --git a/lang/en-gb.js b/lang/en-gb.js
new file mode 100755
index 0000000..39075ea
--- /dev/null
+++ b/lang/en-gb.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/license
+*/
+CKEDITOR.lang['en-gb'] = { "editor": "Rich Text Editor", "editorPanel": "Rich Text Editor panel", "common": { "editorHelp": "Press ALT 0 for help", "browseServer": "Browse Server", "url": "URL", "protocol": "Protocol", "upload": "Upload", "uploadSubmit": "Send it to the Server", "image": "Image", "flash": "Flash", "form": "Form", "checkbox": "Checkbox", "radio": "Radio Button", "textField": "Text Field", "textarea": "Textarea", "hiddenField": "Hidden Field", "button": "Button", "select": "Selection Field", "imageButton": "Image Button", "notSet": "<not set>", "id": "Id", "name": "Name", "langDir": "Language Direction", "langDirLtr": "Left to Right (LTR)", "langDirRtl": "Right to Left (RTL)", "langCode": "Language Code", "longDescr": "Long Description URL", "cssClass": "Stylesheet Classes", "advisoryTitle": "Advisory Title", "cssStyle": "Style", "ok": "OK", "cancel": "Cancel", "close": "Close", "preview": "Preview", "resize": "Drag to resize", "generalTab": "General", "advancedTab": "Advanced", "validateNumberFailed": "This value is not a number.", "confirmNewPage": "Any unsaved changes to this content will be lost. Are you sure you want to load new page?", "confirmCancel": "You have changed some options. Are you sure you want to close the dialogue window?", "options": "Options", "target": "Target", "targetNew": "New Window (_blank)", "targetTop": "Topmost Window (_top)", "targetSelf": "Same Window (_self)", "targetParent": "Parent Window (_parent)", "langDirLTR": "Left to Right (LTR)", "langDirRTL": "Right to Left (RTL)", "styles": "Style", "cssClasses": "Stylesheet Classes", "width": "Width", "height": "Height", "align": "Align", "left": "Left", "right": "Right", "center": "Center", "justify": "Justify", "alignLeft": "Align Left", "alignRight": "Align Right", "alignCenter": "Align Center", "alignTop": "Top", "alignMiddle": "Middle", "alignBottom": "Bottom", "alignNone": "None", "invalidValue": "Invalid value.", "invalidHeight": "Height must be a number.", "invalidWidth": "Width must be a number.", "invalidLength": "Value specified for the \"%1\" field must be a positive number with or without a valid measurement unit (%2).", "invalidCssLength": "Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).", "invalidHtmlLength": "Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).", "invalidInlineStyle": "Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.", "cssLengthTooltip": "Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).", "unavailable": "%1<span class=\"cke_accessibility\">, unavailable</span>", "keyboard": { "8": "Backspace", "13": "Enter", "16": "Shift", "17": "Ctrl", "18": "Alt", "32": "Space", "35": "End", "36": "Home", "46": "Delete", "112": "F1", "113": "F2", "114": "F3", "115": "F4", "116": "F5", "117": "F6", "118": "F7", "119": "F8", "120": "F9", "121": "F10", "122": "F11", "123": "F12", "124": "F13", "125": "F14", "126": "F15", "127": "F16", "128": "F17", "129": "F18", "130": "F19", "131": "F20", "132": "F21", "133": "F22", "134": "F23", "135": "F24", "224": "Command" }, "keyboardShortcut": "Keyboard shortcut", "optionDefault": "Default" }, "about": { "copy": "Copyright &copy; $1. All rights reserved.", "dlgTitle": "About CKEditor 4", "moreInfo": "For licensing information please visit our web site:" }, "basicstyles": { "bold": "Bold", "italic": "Italic", "strike": "Strike Through", "subscript": "Subscript", "superscript": "Superscript", "underline": "Underline" }, "blockquote": { "toolbar": "Block Quote" }, "notification": { "closed": "Notification closed." }, "toolbar": { "toolbarCollapse": "Collapse Toolbar", "toolbarExpand": "Expand Toolbar", "toolbarGroups": { "document": "Document", "clipboard": "Clipboard/Undo", "editing": "Editing", "forms": "Forms", "basicstyles": "Basic Styles", "paragraph": "Paragraph", "links": "Links", "insert": "Insert", "styles": "Styles", "colors": "Colors", "tools": "Tools" }, "toolbars": "Editor toolbars" }, "clipboard": { "copy": "Copy", "copyError": "Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).", "cut": "Cut", "cutError": "Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).", "paste": "Paste", "pasteNotification": "Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.", "pasteArea": "Paste Area", "pasteMsg": "Paste your content inside the area below and press OK." }, "colorbutton": { "auto": "Automatic", "bgColorTitle": "Background Colour", "colors": { "000": "Black", "800000": "Maroon", "8B4513": "Saddle Brown", "2F4F4F": "Dark Slate Grey", "008080": "Teal", "000080": "Navy", "4B0082": "Indigo", "696969": "Dark Grey", "B22222": "Fire Brick", "A52A2A": "Brown", "DAA520": "Golden Rod", "006400": "Dark Green", "40E0D0": "Turquoise", "0000CD": "Medium Blue", "800080": "Purple", "808080": "Grey", "F00": "Red", "FF8C00": "Dark Orange", "FFD700": "Gold", "008000": "Green", "0FF": "Cyan", "00F": "Blue", "EE82EE": "Violet", "A9A9A9": "Dim Grey", "FFA07A": "Light Salmon", "FFA500": "Orange", "FFFF00": "Yellow", "00FF00": "Lime", "AFEEEE": "Pale Turquoise", "ADD8E6": "Light Blue", "DDA0DD": "Plum", "D3D3D3": "Light Grey", "FFF0F5": "Lavender Blush", "FAEBD7": "Antique White", "FFFFE0": "Light Yellow", "F0FFF0": "Honeydew", "F0FFFF": "Azure", "F0F8FF": "Alice Blue", "E6E6FA": "Lavender", "FFF": "White", "1ABC9C": "Strong Cyan", "2ECC71": "Emerald", "3498DB": "Bright Blue", "9B59B6": "Amethyst", "4E5F70": "Grayish Blue", "F1C40F": "Vivid Yellow", "16A085": "Dark Cyan", "27AE60": "Dark Emerald", "2980B9": "Strong Blue", "8E44AD": "Dark Violet", "2C3E50": "Desaturated Blue", "F39C12": "Orange", "E67E22": "Carrot", "E74C3C": "Pale Red", "ECF0F1": "Bright Silver", "95A5A6": "Light Grayish Cyan", "DDD": "Light Gray", "D35400": "Pumpkin", "C0392B": "Strong Red", "BDC3C7": "Silver", "7F8C8D": "Grayish Cyan", "999": "Dark Gray" }, "more": "More Colours...", "panelTitle": "Colours", "textColorTitle": "Text Colour" }, "colordialog": { "clear": "Clear", "highlight": "Highlight", "options": "Colour Options", "selected": "Selected Colour", "title": "Select colour" }, "templates": { "button": "Templates", "emptyListMsg": "(No templates defined)", "insertOption": "Replace actual contents", "options": "Template Options", "selectPromptMsg": "Please select the template to open in the editor", "title": "Content Templates" }, "contextmenu": { "options": "Context Menu Options" }, "copyformatting": { "label": "Copy Formatting", "notification": { "copied": "Formatting copied", "applied": "Formatting applied", "canceled": "Formatting canceled", "failed": "Formatting failed. You cannot apply styles without copying them first." } }, "div": { "IdInputLabel": "Id", "advisoryTitleInputLabel": "Advisory Title", "cssClassInputLabel": "Stylesheet Classes", "edit": "Edit Div", "inlineStyleInputLabel": "Inline Style", "langDirLTRLabel": "Left to Right (LTR)", "langDirLabel": "Language Direction", "langDirRTLLabel": "Right to Left (RTL)", "languageCodeInputLabel": " Language Code", "remove": "Remove Div", "styleSelectLabel": "Style", "title": "Create Div Container", "toolbar": "Create Div Container" }, "elementspath": { "eleLabel": "Elements path", "eleTitle": "%1 element" }, "filetools": { "loadError": "Error occurred during file read.", "networkError": "Network error occurred during file upload.", "httpError404": "HTTP error occurred during file upload (404: File not found).", "httpError403": "HTTP error occurred during file upload (403: Forbidden).", "httpError": "HTTP error occurred during file upload (error status: %1).", "noUrlError": "Upload URL is not defined.", "responseError": "Incorrect server response." }, "find": { "find": "Find", "findOptions": "Find Options", "findWhat": "Find what:", "matchCase": "Match case", "matchCyclic": "Match cyclic", "matchWord": "Match whole word", "notFoundMsg": "The specified text was not found.", "replace": "Replace", "replaceAll": "Replace All", "replaceSuccessMsg": "%1 occurrence(s) replaced.", "replaceWith": "Replace with:", "title": "Find and Replace" }, "font": { "fontSize": { "label": "Size", "voiceLabel": "Font Size", "panelTitle": "Font Size" }, "label": "Font", "panelTitle": "Font Name", "voiceLabel": "Font" }, "fakeobjects": { "anchor": "Anchor", "flash": "Flash Animation", "hiddenfield": "Hidden Field", "iframe": "IFrame", "unknown": "Unknown Object" }, "forms": { "button": { "title": "Button Properties", "text": "Text (Value)", "type": "Type", "typeBtn": "Button", "typeSbm": "Submit", "typeRst": "Reset" }, "checkboxAndRadio": { "checkboxTitle": "Checkbox Properties", "radioTitle": "Radio Button Properties", "value": "Value", "selected": "Selected", "required": "Required" }, "form": { "title": "Form Properties", "menu": "Form Properties", "action": "Action", "method": "Method", "encoding": "Encoding" }, "hidden": { "title": "Hidden Field Properties", "name": "Name", "value": "Value" }, "select": { "title": "Selection Field Properties", "selectInfo": "Select Info", "opAvail": "Available Options", "value": "Value", "size": "Size", "lines": "lines", "chkMulti": "Allow multiple selections", "required": "Required", "opText": "Text", "opValue": "Value", "btnAdd": "Add", "btnModify": "Modify", "btnUp": "Up", "btnDown": "Down", "btnSetValue": "Set as selected value", "btnDelete": "Delete" }, "textarea": { "title": "Textarea Properties", "cols": "Columns", "rows": "Rows" }, "textfield": { "title": "Text Field Properties", "name": "Name", "value": "Value", "charWidth": "Character Width", "maxChars": "Maximum Characters", "required": "Required", "type": "Type", "typeText": "Text", "typePass": "Password", "typeEmail": "E-mail", "typeSearch": "Search", "typeTel": "Telephone Number", "typeUrl": "URL" } }, "format": { "label": "Format", "panelTitle": "Paragraph Format", "tag_address": "Address", "tag_div": "Normal (DIV)", "tag_h1": "Heading 1", "tag_h2": "Heading 2", "tag_h3": "Heading 3", "tag_h4": "Heading 4", "tag_h5": "Heading 5", "tag_h6": "Heading 6", "tag_p": "Normal", "tag_pre": "Formatted" }, "horizontalrule": { "toolbar": "Insert Horizontal Line" }, "iframe": { "border": "Show frame border", "noUrl": "Please type the iframe URL", "scrolling": "Enable scrollbars", "title": "IFrame Properties", "toolbar": "IFrame" }, "image": { "alt": "Alternative Text", "border": "Border", "btnUpload": "Send it to the Server", "button2Img": "Do you want to transform the selected image button on a simple image?", "hSpace": "HSpace", "img2Button": "Do you want to transform the selected image on a image button?", "infoTab": "Image Info", "linkTab": "Link", "lockRatio": "Lock Ratio", "menu": "Image Properties", "resetSize": "Reset Size", "title": "Image Properties", "titleButton": "Image Button Properties", "upload": "Upload", "urlMissing": "Image source URL is missing.", "vSpace": "VSpace", "validateBorder": "Border must be a whole number.", "validateHSpace": "HSpace must be a whole number.", "validateVSpace": "VSpace must be a whole number." }, "indent": { "indent": "Increase Indent", "outdent": "Decrease Indent" }, "link": { "acccessKey": "Access Key", "advanced": "Advanced", "advisoryContentType": "Advisory Content Type", "advisoryTitle": "Advisory Title", "anchor": { "toolbar": "Anchor", "menu": "Edit Anchor", "title": "Anchor Properties", "name": "Anchor Name", "errorName": "Please type the anchor name", "remove": "Remove Anchor" }, "anchorId": "By Element Id", "anchorName": "By Anchor Name", "charset": "Linked Resource Charset", "cssClasses": "Stylesheet Classes", "download": "Force Download", "displayText": "Display Text", "emailAddress": "E-Mail Address", "emailBody": "Message Body", "emailSubject": "Message Subject", "id": "Id", "info": "Link Info", "langCode": "Language Code", "langDir": "Language Direction", "langDirLTR": "Left to Right (LTR)", "langDirRTL": "Right to Left (RTL)", "menu": "Edit Link", "name": "Name", "noAnchors": "(No anchors available in the document)", "noEmail": "Please type the e-mail address", "noUrl": "Please type the link URL", "noTel": "Please type the phone number", "other": "<other>", "phoneNumber": "Phone number", "popupDependent": "Dependent (Netscape)", "popupFeatures": "Popup Window Features", "popupFullScreen": "Full Screen (IE)", "popupLeft": "Left Position", "popupLocationBar": "Location Bar", "popupMenuBar": "Menu Bar", "popupResizable": "Resizable", "popupScrollBars": "Scroll Bars", "popupStatusBar": "Status Bar", "popupToolbar": "Toolbar", "popupTop": "Top Position", "rel": "Relationship", "selectAnchor": "Select an Anchor", "styles": "Style", "tabIndex": "Tab Index", "target": "Target", "targetFrame": "<frame>", "targetFrameName": "Target Frame Name", "targetPopup": "<popup window>", "targetPopupName": "Popup Window Name", "title": "Link", "toAnchor": "Link to anchor in the text", "toEmail": "E-mail", "toUrl": "URL", "toPhone": "Phone", "toolbar": "Link", "type": "Link Type", "unlink": "Unlink", "upload": "Upload" }, "list": { "bulletedlist": "Insert/Remove Bulleted List", "numberedlist": "Insert/Remove Numbered List" }, "liststyle": { "bulletedTitle": "Bulleted List Properties", "circle": "Circle", "decimal": "Decimal (1, 2, 3, etc.)", "disc": "Disc", "lowerAlpha": "Lower Alpha (a, b, c, d, e, etc.)", "lowerRoman": "Lower Roman (i, ii, iii, iv, v, etc.)", "none": "None", "notset": "<not set>", "numberedTitle": "Numbered List Properties", "square": "Square", "start": "Start", "type": "Type", "upperAlpha": "Upper Alpha (A, B, C, D, E, etc.)", "upperRoman": "Upper Roman (I, II, III, IV, V, etc.)", "validateStartNumber": "List start number must be a whole number." }, "magicline": { "title": "Insert paragraph here" }, "maximize": { "maximize": "Maximise", "minimize": "Minimise" }, "newpage": { "toolbar": "New Page" }, "pastetext": { "button": "Paste as plain text", "pasteNotification": "Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.", "title": "Paste as Plain Text" }, "preview": { "preview": "Preview" }, "print": { "toolbar": "Print" }, "removeformat": { "toolbar": "Remove Format" }, "save": { "toolbar": "Save" }, "selectall": { "toolbar": "Select All" }, "showblocks": { "toolbar": "Show Blocks" }, "sourcearea": { "toolbar": "Source" }, "specialchar": { "options": "Special Character Options", "title": "Select Special Character", "toolbar": "Insert Special Character" }, "stylescombo": { "label": "Styles", "panelTitle": "Formatting Styles", "panelTitle1": "Block Styles", "panelTitle2": "Inline Styles", "panelTitle3": "Object Styles" }, "table": { "border": "Border size", "caption": "Caption", "cell": { "menu": "Cell", "insertBefore": "Insert Cell Before", "insertAfter": "Insert Cell After", "deleteCell": "Delete Cells", "merge": "Merge Cells", "mergeRight": "Merge Right", "mergeDown": "Merge Down", "splitHorizontal": "Split Cell Horizontally", "splitVertical": "Split Cell Vertically", "title": "Cell Properties", "cellType": "Cell Type", "rowSpan": "Rows Span", "colSpan": "Columns Span", "wordWrap": "Word Wrap", "hAlign": "Horizontal Alignment", "vAlign": "Vertical Alignment", "alignBaseline": "Baseline", "bgColor": "Background Color", "borderColor": "Border Color", "data": "Data", "header": "Header", "yes": "Yes", "no": "No", "invalidWidth": "Cell width must be a number.", "invalidHeight": "Cell height must be a number.", "invalidRowSpan": "Rows span must be a whole number.", "invalidColSpan": "Columns span must be a whole number.", "chooseColor": "Choose" }, "cellPad": "Cell padding", "cellSpace": "Cell spacing", "column": { "menu": "Column", "insertBefore": "Insert Column Before", "insertAfter": "Insert Column After", "deleteColumn": "Delete Columns" }, "columns": "Columns", "deleteTable": "Delete Table", "headers": "Headers", "headersBoth": "Both", "headersColumn": "First column", "headersNone": "None", "headersRow": "First Row", "invalidBorder": "Border size must be a number.", "invalidCellPadding": "Cell padding must be a number.", "invalidCellSpacing": "Cell spacing must be a number.", "invalidCols": "Number of columns must be a number greater than 0.", "invalidHeight": "Table height must be a number.", "invalidRows": "Number of rows must be a number greater than 0.", "invalidWidth": "Table width must be a number.", "menu": "Table Properties", "row": { "menu": "Row", "insertBefore": "Insert Row Before", "insertAfter": "Insert Row After", "deleteRow": "Delete Rows" }, "rows": "Rows", "summary": "Summary", "title": "Table Properties", "toolbar": "Table", "widthPc": "percent", "widthPx": "pixels", "widthUnit": "width unit" }, "undo": { "redo": "Redo", "undo": "Undo" }, "widget": { "move": "Click and drag to move", "label": "%1 widget" }, "bootstrapTabs": { "dialogTitle": "Bootstrap Tabs", "invalidTabSetTitle": "Title field cannot be empty.", "invalidNumberOfTabs": "Number of Tabs field cannot be empty.", "tabBasicLabel": "Basic Settings", "infoHtml": "<p>Add Tabs when activity content can easily be segmented into</p><p>separate tabs to allow for more efficient use of space.<p>", "tabSetTitleLabel": "Tab Set Title", "numberOfTabsLabel": "Number of Tabs", "removeTabLabel": "Remove a Tab", "removeTabDefault": "Choose a Tab to Remove", "buttonLabel": "Insert Tabs", "contextMenuLabel": "Edit Tabs" }, "html5validation": { "patternLabel": "Validation Pattern", "requiredLabel": "Required?", "validationTabTitle": "Form Validation", "novalidateLabel": "Disable HTML5 Validation", "sampleTwitterUsername": "Twitter Username: ^[A-Za-z0-9_]{1,15}$", "samplePhonePattern": "Valid US Phone Number: d[3][-]d[3][-]d[4]", "sampleZipCode": "<p>Valid US Zip Code: (d[5]([-]d[4])?)</p>", "html5patternLink": "<p>For more HTML5 Validation patterns check out <a href=\"http://html5pattern.com/\" title=\"HTML5 Pattern\">html5pattern.com</a></p>" }, "html5video": { "button": "Insert HTML5 video", "title": "HTML5 video", "infoLabel": "Video info", "allowed": "Allowed file extensions: MP4, WebM, Ogv", "urlMissing": "Video source URL is missing.", "videoProperties": "Video properties", "upload": "Upload", "btnUpload": "Send it to the server", "advanced": "Advanced", "autoplay": "Autoplay?", "allowdownload": "Allow download?", "advisorytitle": "Advisory title", "yes": "Yes", "no": "No", "loop": "Loop?", "responsive": "Responsive width", "controls": "Show controls", "poster": "Thumbnail" } }; \ No newline at end of file
diff --git a/lang/en.js b/lang/en.js
new file mode 100755
index 0000000..24725e2
--- /dev/null
+++ b/lang/en.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/license
+*/
+CKEDITOR.lang['en']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","left":"Left","right":"Right","center":"Center","justify":"Justify","alignLeft":"Align Left","alignRight":"Align Right","alignCenter":"Align Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidLength":"Value specified for the \"%1\" field must be a positive number with or without a valid measurement unit (%2).","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>","keyboard":{"8":"Backspace","13":"Enter","16":"Shift","17":"Ctrl","18":"Alt","32":"Space","35":"End","36":"Home","46":"Delete","112":"F1","113":"F2","114":"F3","115":"F4","116":"F5","117":"F6","118":"F7","119":"F8","120":"F9","121":"F10","122":"F11","123":"F12","124":"F13","125":"F14","126":"F15","127":"F16","128":"F17","129":"F18","130":"F19","131":"F20","132":"F21","133":"F22","134":"F23","135":"F24","224":"Command"},"keyboardShortcut":"Keyboard shortcut","optionDefault":"Default"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor 4","moreInfo":"For licensing information please visit our web site:"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strikethrough","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"notification":{"closed":"Notification closed."},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteNotification":"Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.","pasteArea":"Paste Area","pasteMsg":"Paste your content inside the area below and press OK."},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Color","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White","1ABC9C":"Strong Cyan","2ECC71":"Emerald","3498DB":"Bright Blue","9B59B6":"Amethyst","4E5F70":"Grayish Blue","F1C40F":"Vivid Yellow","16A085":"Dark Cyan","27AE60":"Dark Emerald","2980B9":"Strong Blue","8E44AD":"Dark Violet","2C3E50":"Desaturated Blue","F39C12":"Orange","E67E22":"Carrot","E74C3C":"Pale Red","ECF0F1":"Bright Silver","95A5A6":"Light Grayish Cyan","DDD":"Light Gray","D35400":"Pumpkin","C0392B":"Strong Red","BDC3C7":"Silver","7F8C8D":"Grayish Cyan","999":"Dark Gray"},"more":"More Colors...","panelTitle":"Colors","textColorTitle":"Text Color"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Templates","emptyListMsg":"(No templates defined)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Please select the template to open in the editor","title":"Content Templates"},"contextmenu":{"options":"Context Menu Options"},"copyformatting":{"label":"Copy Formatting","notification":{"copied":"Formatting copied","applied":"Formatting applied","canceled":"Formatting canceled","failed":"Formatting failed. You cannot apply styles without copying them first."}},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"filetools":{"loadError":"Error occurred during file read.","networkError":"Network error occurred during file upload.","httpError404":"HTTP error occurred during file upload (404: File not found).","httpError403":"HTTP error occurred during file upload (403: Forbidden).","httpError":"HTTP error occurred during file upload (error status: %1).","noUrlError":"Upload URL is not defined.","responseError":"Incorrect server response."},"find":{"find":"Find","findOptions":"Find Options","findWhat":"Find what:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"Replace","replaceAll":"Replace All","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Replace with:","title":"Find and Replace"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"forms":{"button":{"title":"Button Properties","text":"Text (Value)","type":"Type","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected","required":"Required"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Action","method":"Method","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Name","value":"Value"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Value","size":"Size","lines":"lines","chkMulti":"Allow multiple selections","required":"Required","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"Delete"},"textarea":{"title":"Textarea Properties","cols":"Columns","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","required":"Required","type":"Type","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","download":"Force Download","displayText":"Display Text","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","noTel":"Please type the phone number","other":"<other>","phoneNumber":"Phone number","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toPhone":"Phone","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"liststyle":{"bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","disc":"Disc","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"New Page"},"pastetext":{"button":"Paste as plain text","pasteNotification":"Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.","title":"Paste as Plain Text"},"preview":{"preview":"Preview"},"print":{"toolbar":"Print"},"removeformat":{"toolbar":"Remove Format"},"save":{"toolbar":"Save"},"selectall":{"toolbar":"Select All"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"widget":{"move":"Click and drag to move","label":"%1 widget"},"bootstrapTabs":{"dialogTitle":"Bootstrap Tabs","invalidTabSetTitle":"Title field cannot be empty.","invalidNumberOfTabs":"Number of Tabs field cannot be empty.","tabBasicLabel":"Basic Settings","infoHtml":"<p>Add Tabs when activity content can easily be segmented into</p><p>separate tabs to allow for more efficient use of space.<p>","tabSetTitleLabel":"Tab Set Title","numberOfTabsLabel":"Number of Tabs","removeTabLabel":"Remove a Tab","removeTabDefault":"Choose a Tab to Remove","buttonLabel":"Insert Tabs","contextMenuLabel":"Edit Tabs"},"html5validation":{"patternLabel":"Validation Pattern","requiredLabel":"Required?","validationTabTitle":"Form Validation","novalidateLabel":"Disable HTML5 Validation","sampleTwitterUsername":"Twitter Username: ^[A-Za-z0-9_]{1,15}$","samplePhonePattern":"Valid US Phone Number: d[3][-]d[3][-]d[4]","sampleZipCode":"<p>Valid US Zip Code: (d[5]([-]d[4])?)</p>","html5patternLink":"<p>For more HTML5 Validation patterns check out <a href=\"http://html5pattern.com/\" title=\"HTML5 Pattern\">html5pattern.com</a></p>"},"html5video":{"button":"Insert HTML5 video","title":"HTML5 video","infoLabel":"Video info","allowed":"Allowed file extensions: MP4, WebM, Ogv","urlMissing":"Video source URL is missing.","videoProperties":"Video properties","upload":"Upload","btnUpload":"Send it to the server","advanced":"Advanced","autoplay":"Autoplay?","allowdownload":"Allow download?","advisorytitle":"Advisory title","yes":"Yes","no":"No","loop":"Loop?","responsive":"Responsive width","controls":"Show controls","poster":"Thumbnail"}}; \ No newline at end of file
diff --git a/plugins/N1ED-editor/plugin.js b/plugins/N1ED-editor/plugin.js
new file mode 100755
index 0000000..47a6ccf
--- /dev/null
+++ b/plugins/N1ED-editor/plugin.js
@@ -0,0 +1,140 @@
+/*!
+ * Add-on for including N1ED into your CKEditor 4
+ * Developer: N1ED
+ * Website: https://n1ed.com/
+ * License: GPL v3
+ */
+
+
+/*
+ * HOW TO INSTALL THIS ADD-ON
+ *
+ * 1. Copy the plugin into
+ *
+ * ckeditor/
+ * plugins/
+ * N1ED-editor/
+ * plugin.js
+ *
+ * 2. Add "N1ED-editor" into "extraPlugins" config option
+ * 3. Done
+ *
+ *
+ * VISUAL CONFIGURATION
+ *
+ * Configure N1ED visually using the Dashboard:
+ *
+ * https://n1ed.com/dashboard
+ *
+ * Get there an API key to link with your installation.
+ * Specify it as a CKEditor parameter:
+ *
+ * apiKey: "..."
+ */
+
+(function() {
+
+ var PLUGIN_NAME = "N1ED-editor";
+ var DEFAULT_API_KEY = "N1ED24RR1234123412341234";
+
+ window.n1edPluginVersion = 202409001;
+ window.n1edPluginEditor = "ckeditor";
+
+ function get(varName, defaultValue) {
+ if (window[varName] !== undefined && window[varName] !== "-")
+ return window[varName];
+ else
+ return defaultValue;
+ }
+
+ var apiKey = CKEDITOR.config.apiKey;
+ if (!apiKey) {
+ for (var i = 0; i < Object.keys(CKEDITOR.instances).length; i++) {
+ var id = Object.keys(CKEDITOR.instances)[i];
+ if (CKEDITOR.instances[id].config.apiKey)
+ apiKey = CKEDITOR.instances[id].config.apiKey;
+ if (!apiKey) {
+ if (CKEDITOR.instances[id].config.Flmngr && CKEDITOR.instances[id].config.Flmngr.apiKey)
+ apiKey = CKEDITOR.instances[id].config.Flmngr.apiKey;
+ }
+ }
+ }
+
+ window.CKEDITOR_OVERRIDE_API_KEY_PARAM = "OVERRIDE_API_KEY";
+ apiKey = window.OVERRIDE_API_KEY || window.N1ED_API_KEY || apiKey || DEFAULT_API_KEY;
+
+ var version = get("N1ED_VERSION", "latest");
+ var n1edPrefix = get("N1ED_PREFIX", null);
+ var n1edHttps = get("N1ED_HTTPS", true);
+
+ var protocol = n1edHttps ? "https" : "http";
+
+ var host = (n1edPrefix ? (n1edPrefix + ".") : "") + "cloud.n1ed.com";
+ var urlPlugin = protocol + "://" + host + "/a/" + apiKey + "/plugins/N1EDEco/plugin.js";
+
+ var oldScriptLoaderLoad = window.CKEDITOR.scriptLoader.load;
+ window.CKEDITOR.scriptLoader.load = function(scriptUrl, callback, scope, showBusy) {
+ return oldScriptLoaderLoad.apply(scope, [
+ scriptUrl,
+ function(completed, failed) {
+ if (!!failed && failed.length) {
+ console.error('[CKEDITOR.resourceManager.load] Resource was not found at "' + failed[0]);
+
+ for (var i = 0; i < failed.length; i++) {
+ var m = failed[i].match(/^https?:\/\/cloud\.n1ed\.com\/cdn\/[^/]+?\/[^/]+?\/ckeditor\/plugins\/([^/]+?)\/plugin\.js.*?/);
+
+ if (!m) {
+ m = failed[i].match(/^https?:\/\/cloud\.n1ed\.com\/.*\/plugin\.js.*?/);
+ }
+ if (m != null) {
+ var pluginName = m[1];
+ console.log("Using a stub for '" + pluginName + "' plugin");
+ CKEDITOR.plugins.add(pluginName, {});
+ if (!completed)
+ completed = [];
+ completed.push(failed[i]);
+ }
+ }
+ failed = [];
+ }
+
+ var elsLoaders = document.querySelectorAll(".n1ed_loading");
+ if (!!elsLoaders)
+ for (var i = 0; i < elsLoaders.length; i++)
+ elsLoaders.item(i).parentElement.removeChild(elsLoaders.item(i));
+
+ callback.apply(scope, [completed, failed]);
+ },
+ scope,
+ showBusy
+ ]);
+ };
+
+ CKEDITOR.plugins.addExternal("N1EDEco", urlPlugin);
+ CKEDITOR.plugins.add(PLUGIN_NAME, {
+ "requires": ["N1EDEco"], // We can not move Ecosystem in this file due to we need to dynamically
+ // embed configuration from your Dashboard into it.
+ // So Ecosystem add-on can be loaded only from CDN
+ });
+
+ function applyPatch() {
+ window.applyPatch && window.applyPatch(PLUGIN_NAME, window.n1edPluginVersion, apiKey);
+ }
+ var script = document.createElement('script');
+ script.type = "text/javascript";
+ script.src = protocol + "://" + host + "/static/pluginPatch.js";
+ document.head.appendChild(script);
+ if (script.readyState) { //IE
+ script.onreadystatechange = function() {
+ if (script.readyState === "loaded" || script.readyState === "complete") {
+ script.onreadystatechange = null;
+ applyPatch();
+ }
+ };
+ } else { //Others
+ script.onload = function() {
+ applyPatch();
+ };
+ }
+
+})() \ No newline at end of file
diff --git a/plugins/OpenStreet/OpenLayers.js b/plugins/OpenStreet/OpenLayers.js
new file mode 100755
index 0000000..8629a6d
--- /dev/null
+++ b/plugins/OpenStreet/OpenLayers.js
@@ -0,0 +1,5080 @@
+var OpenLayers = {
+ VERSION_NUMBER: "Release 2.13.1", singleFile: !0, _getScriptLocation: function() { for (var a = /(^|(.*?\/))(OpenLayers[^\/]*?\.js)(\?|$)/, b = document.getElementsByTagName("script"), c, d = "", e = 0, f = b.length; e < f; e++)if (c = b[e].getAttribute("src")) if (c = c.match(a)) { d = c[1]; break } return function() { return d } }(), ImgPath: "", Class: function() {
+ var a = arguments.length, b = arguments[0], c = arguments[a - 1], d = "function" == typeof c.initialize ? c.initialize : function() { b.prototype.initialize.apply(this, arguments) }; 1 < a ? (a =
+ [d, b].concat(Array.prototype.slice.call(arguments).slice(1, a - 1), c), OpenLayers.inherit.apply(null, a)) : d.prototype = c; return d
+ }, inherit: function(a, b) { var c = function() { }; c.prototype = b.prototype; a.prototype = new c; var d, e, c = 2; for (d = arguments.length; c < d; c++)e = arguments[c], "function" === typeof e && (e = e.prototype), OpenLayers.Util.extend(a.prototype, e) }
+}; OpenLayers.Util = OpenLayers.Util || {};
+OpenLayers.Util.extend = function(a, b) { a = a || {}; if (b) { for (var c in b) { var d = b[c]; void 0 !== d && (a[c] = d) } "function" == typeof window.Event && b instanceof window.Event || !b.hasOwnProperty || !b.hasOwnProperty("toString") || (a.toString = b.toString) } return a };
+OpenLayers.String = {
+ startsWith: function(a, b) { return 0 == a.indexOf(b) }, contains: function(a, b) { return -1 != a.indexOf(b) }, trim: function(a) { return a.replace(/^\s\s*/, "").replace(/\s\s*$/, "") }, camelize: function(a) { a = a.split("-"); for (var b = a[0], c = 1, d = a.length; c < d; c++)var e = a[c], b = b + (e.charAt(0).toUpperCase() + e.substring(1)); return b }, format: function(a, b, c) {
+ b || (b = window); return a.replace(OpenLayers.String.tokenRegEx, function(a, e) {
+ for (var f, g = e.split(/\.+/), h = 0; h < g.length; h++) {
+ 0 == h && (f = b); if (void 0 === f) break;
+ f = f[g[h]]
+ } "function" == typeof f && (f = c ? f.apply(null, c) : f()); return "undefined" == typeof f ? "undefined" : f
+ })
+ }, tokenRegEx: /\$\{([\w.]+?)\}/g, numberRegEx: /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/, isNumeric: function(a) { return OpenLayers.String.numberRegEx.test(a) }, numericIf: function(a, b) { var c = a; !0 === b && null != a && a.replace && (a = a.replace(/^\s*|\s*$/g, "")); return OpenLayers.String.isNumeric(a) ? parseFloat(a) : c }
+};
+OpenLayers.Number = {
+ decimalSeparator: ".", thousandsSeparator: ",", limitSigDigs: function(a, b) { var c = 0; 0 < b && (c = parseFloat(a.toPrecision(b))); return c }, format: function(a, b, c, d) {
+ b = "undefined" != typeof b ? b : 0; c = "undefined" != typeof c ? c : OpenLayers.Number.thousandsSeparator; d = "undefined" != typeof d ? d : OpenLayers.Number.decimalSeparator; null != b && (a = parseFloat(a.toFixed(b))); var e = a.toString().split("."); 1 == e.length && null == b && (b = 0); a = e[0]; if (c) for (var f = /(-?[0-9]+)([0-9][3])/; f.test(a);)a = a.replace(f, "$1" + c + "$2");
+ 0 == b ? b = a : (c = 1 < e.length ? e[1] : "0", null != b && (c += Array(b - c.length + 1).join("0")), b = a + d + c); return b
+ }, zeroPad: function(a, b, c) { for (a = a.toString(c || 10); a.length < b;)a = "0" + a; return a }
+};
+OpenLayers.Function = { bind: function(a, b) { var c = Array.prototype.slice.apply(arguments, [2]); return function() { var d = c.concat(Array.prototype.slice.apply(arguments, [0])); return a.apply(b, d) } }, bindAsEventListener: function(a, b) { return function(c) { return a.call(b, c || window.event) } }, False: function() { return !1 }, True: function() { return !0 }, Void: function() { } };
+OpenLayers.Array = { filter: function(a, b, c) { var d = []; if (Array.prototype.filter) d = a.filter(b, c); else { var e = a.length; if ("function" != typeof b) throw new TypeError; for (var f = 0; f < e; f++)if (f in a) { var g = a[f]; b.call(c, g, f, a) && d.push(g) } } return d } };
+OpenLayers.Bounds = OpenLayers.Class({
+ left: null, bottom: null, right: null, top: null, centerLonLat: null, initialize: function(a, b, c, d) { OpenLayers.Util.isArray(a) && (d = a[3], c = a[2], b = a[1], a = a[0]); null != a && (this.left = OpenLayers.Util.toFloat(a)); null != b && (this.bottom = OpenLayers.Util.toFloat(b)); null != c && (this.right = OpenLayers.Util.toFloat(c)); null != d && (this.top = OpenLayers.Util.toFloat(d)) }, clone: function() { return new OpenLayers.Bounds(this.left, this.bottom, this.right, this.top) }, equals: function(a) {
+ var b = !1; null !=
+ a && (b = this.left == a.left && this.right == a.right && this.top == a.top && this.bottom == a.bottom); return b
+ }, toString: function() { return [this.left, this.bottom, this.right, this.top].join() }, toArray: function(a) { return !0 === a ? [this.bottom, this.left, this.top, this.right] : [this.left, this.bottom, this.right, this.top] }, toBBOX: function(a, b) {
+ null == a && (a = 6); var c = Math.pow(10, a), d = Math.round(this.left * c) / c, e = Math.round(this.bottom * c) / c, f = Math.round(this.right * c) / c, c = Math.round(this.top * c) / c; return !0 === b ? e + "," + d + "," + c + "," + f : d +
+ "," + e + "," + f + "," + c
+ }, toGeometry: function() { return new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([new OpenLayers.Geometry.Point(this.left, this.bottom), new OpenLayers.Geometry.Point(this.right, this.bottom), new OpenLayers.Geometry.Point(this.right, this.top), new OpenLayers.Geometry.Point(this.left, this.top)])]) }, getWidth: function() { return this.right - this.left }, getHeight: function() { return this.top - this.bottom }, getSize: function() { return new OpenLayers.Size(this.getWidth(), this.getHeight()) },
+ getCenterPixel: function() { return new OpenLayers.Pixel((this.left + this.right) / 2, (this.bottom + this.top) / 2) }, getCenterLonLat: function() { this.centerLonLat || (this.centerLonLat = new OpenLayers.LonLat((this.left + this.right) / 2, (this.bottom + this.top) / 2)); return this.centerLonLat }, scale: function(a, b) {
+ null == b && (b = this.getCenterLonLat()); var c, d; "OpenLayers.LonLat" == b.CLASS_NAME ? (c = b.lon, d = b.lat) : (c = b.x, d = b.y); return new OpenLayers.Bounds((this.left - c) * a + c, (this.bottom - d) * a + d, (this.right - c) * a + c, (this.top - d) * a +
+ d)
+ }, add: function(a, b) { if (null == a || null == b) throw new TypeError("Bounds.add cannot receive null values"); return new OpenLayers.Bounds(this.left + a, this.bottom + b, this.right + a, this.top + b) }, extend: function(a) {
+ if (a) switch (a.CLASS_NAME) {
+ case "OpenLayers.LonLat": this.extendXY(a.lon, a.lat); break; case "OpenLayers.Geometry.Point": this.extendXY(a.x, a.y); break; case "OpenLayers.Bounds": this.centerLonLat = null; if (null == this.left || a.left < this.left) this.left = a.left; if (null == this.bottom || a.bottom < this.bottom) this.bottom =
+ a.bottom; if (null == this.right || a.right > this.right) this.right = a.right; if (null == this.top || a.top > this.top) this.top = a.top
+ }
+ }, extendXY: function(a, b) { this.centerLonLat = null; if (null == this.left || a < this.left) this.left = a; if (null == this.bottom || b < this.bottom) this.bottom = b; if (null == this.right || a > this.right) this.right = a; if (null == this.top || b > this.top) this.top = b }, containsLonLat: function(a, b) {
+ "boolean" === typeof b && (b = { inclusive: b }); b = b || {}; var c = this.contains(a.lon, a.lat, b.inclusive), d = b.worldBounds; d && !c && (c = d.getWidth(),
+ d = Math.round((a.lon - (d.left + d.right) / 2) / c), c = this.containsLonLat({ lon: a.lon - d * c, lat: a.lat }, { inclusive: b.inclusive })); return c
+ }, containsPixel: function(a, b) { return this.contains(a.x, a.y, b) }, contains: function(a, b, c) { null == c && (c = !0); if (null == a || null == b) return !1; a = OpenLayers.Util.toFloat(a); b = OpenLayers.Util.toFloat(b); return c ? a >= this.left && a <= this.right && b >= this.bottom && b <= this.top : a > this.left && a < this.right && b > this.bottom && b < this.top }, intersectsBounds: function(a, b) {
+ "boolean" === typeof b && (b = { inclusive: b });
+ b = b || {}; if (b.worldBounds) { var c = this.wrapDateLine(b.worldBounds); a = a.wrapDateLine(b.worldBounds) } else c = this; null == b.inclusive && (b.inclusive = !0); var d = !1, e = c.left == a.right || c.right == a.left || c.top == a.bottom || c.bottom == a.top; if (b.inclusive || !e) var d = a.top >= c.bottom && a.top <= c.top || c.top > a.bottom && c.top < a.top, e = a.left >= c.left && a.left <= c.right || c.left >= a.left && c.left <= a.right, f = a.right >= c.left && a.right <= c.right || c.right >= a.left && c.right <= a.right, d = (a.bottom >= c.bottom && a.bottom <= c.top || c.bottom >= a.bottom &&
+ c.bottom <= a.top || d) && (e || f); if (b.worldBounds && !d) { var g = b.worldBounds, e = g.getWidth(), f = !g.containsBounds(c), g = !g.containsBounds(a); f && !g ? (a = a.add(-e, 0), d = c.intersectsBounds(a, { inclusive: b.inclusive })) : g && !f && (c = c.add(-e, 0), d = a.intersectsBounds(c, { inclusive: b.inclusive })) } return d
+ }, containsBounds: function(a, b, c) {
+ null == b && (b = !1); null == c && (c = !0); var d = this.contains(a.left, a.bottom, c), e = this.contains(a.right, a.bottom, c), f = this.contains(a.left, a.top, c); a = this.contains(a.right, a.top, c); return b ? d || e || f ||
+ a : d && e && f && a
+ }, determineQuadrant: function(a) { var b = "", c = this.getCenterLonLat(), b = b + (a.lat < c.lat ? "b" : "t"); return b + (a.lon < c.lon ? "l" : "r") }, transform: function(a, b) {
+ this.centerLonLat = null; var c = OpenLayers.Projection.transform({ x: this.left, y: this.bottom }, a, b), d = OpenLayers.Projection.transform({ x: this.right, y: this.bottom }, a, b), e = OpenLayers.Projection.transform({ x: this.left, y: this.top }, a, b), f = OpenLayers.Projection.transform({ x: this.right, y: this.top }, a, b); this.left = Math.min(c.x, e.x); this.bottom = Math.min(c.y,
+ d.y); this.right = Math.max(d.x, f.x); this.top = Math.max(e.y, f.y); return this
+ }, wrapDateLine: function(a, b) { b = b || {}; var c = b.leftTolerance || 0, d = b.rightTolerance || 0, e = this.clone(); if (a) { for (var f = a.getWidth(); e.left < a.left && e.right - d <= a.left;)e = e.add(f, 0); for (; e.left + c >= a.right && e.right > a.right;)e = e.add(-f, 0); c = e.left + c; c < a.right && c > a.left && e.right - d > a.right && (e = e.add(-f, 0)) } return e }, CLASS_NAME: "OpenLayers.Bounds"
+});
+OpenLayers.Bounds.fromString = function(a, b) { var c = a.split(","); return OpenLayers.Bounds.fromArray(c, b) }; OpenLayers.Bounds.fromArray = function(a, b) { return !0 === b ? new OpenLayers.Bounds(a[1], a[0], a[3], a[2]) : new OpenLayers.Bounds(a[0], a[1], a[2], a[3]) }; OpenLayers.Bounds.fromSize = function(a) { return new OpenLayers.Bounds(0, a.h, a.w, 0) }; OpenLayers.Bounds.oppositeQuadrant = function(a) { return "" + ("t" == a.charAt(0) ? "b" : "t") + ("l" == a.charAt(1) ? "r" : "l") };
+OpenLayers.Element = {
+ visible: function(a) { return "none" != OpenLayers.Util.getElement(a).style.display }, toggle: function() { for (var a = 0, b = arguments.length; a < b; a++) { var c = OpenLayers.Util.getElement(arguments[a]), d = OpenLayers.Element.visible(c) ? "none" : ""; c.style.display = d } }, remove: function(a) { a = OpenLayers.Util.getElement(a); a.parentNode.removeChild(a) }, getHeight: function(a) { a = OpenLayers.Util.getElement(a); return a.offsetHeight }, hasClass: function(a, b) { var c = a.className; return !!c && RegExp("(^|\\s)" + b + "(\\s|$)").test(c) },
+ addClass: function(a, b) { OpenLayers.Element.hasClass(a, b) || (a.className += (a.className ? " " : "") + b); return a }, removeClass: function(a, b) { var c = a.className; c && (a.className = OpenLayers.String.trim(c.replace(RegExp("(^|\\s+)" + b + "(\\s+|$)"), " "))); return a }, toggleClass: function(a, b) { OpenLayers.Element.hasClass(a, b) ? OpenLayers.Element.removeClass(a, b) : OpenLayers.Element.addClass(a, b); return a }, getStyle: function(a, b) {
+ a = OpenLayers.Util.getElement(a); var c = null; if (a && a.style) {
+ (c = a.style[OpenLayers.String.camelize(b)]) ||
+ (document.defaultView && document.defaultView.getComputedStyle ? c = (c = document.defaultView.getComputedStyle(a, null)) ? c.getPropertyValue(b) : null : a.currentStyle && (c = a.currentStyle[OpenLayers.String.camelize(b)])); var d = ["left", "top", "right", "bottom"]; window.opera && -1 != OpenLayers.Util.indexOf(d, b) && "static" == OpenLayers.Element.getStyle(a, "position") && (c = "auto")
+ } return "auto" == c ? null : c
+ }
+};
+OpenLayers.LonLat = OpenLayers.Class({
+ lon: 0, lat: 0, initialize: function(a, b) { OpenLayers.Util.isArray(a) && (b = a[1], a = a[0]); this.lon = OpenLayers.Util.toFloat(a); this.lat = OpenLayers.Util.toFloat(b) }, toString: function() { return "lon\x3d" + this.lon + ",lat\x3d" + this.lat }, toShortString: function() { return this.lon + ", " + this.lat }, clone: function() { return new OpenLayers.LonLat(this.lon, this.lat) }, add: function(a, b) {
+ if (null == a || null == b) throw new TypeError("LonLat.add cannot receive null values"); return new OpenLayers.LonLat(this.lon +
+ OpenLayers.Util.toFloat(a), this.lat + OpenLayers.Util.toFloat(b))
+ }, equals: function(a) { var b = !1; null != a && (b = this.lon == a.lon && this.lat == a.lat || isNaN(this.lon) && isNaN(this.lat) && isNaN(a.lon) && isNaN(a.lat)); return b }, transform: function(a, b) { var c = OpenLayers.Projection.transform({ x: this.lon, y: this.lat }, a, b); this.lon = c.x; this.lat = c.y; return this }, wrapDateLine: function(a) { var b = this.clone(); if (a) { for (; b.lon < a.left;)b.lon += a.getWidth(); for (; b.lon > a.right;)b.lon -= a.getWidth() } return b }, CLASS_NAME: "OpenLayers.LonLat"
+});
+OpenLayers.LonLat.fromString = function(a) { a = a.split(","); return new OpenLayers.LonLat(a[0], a[1]) }; OpenLayers.LonLat.fromArray = function(a) { var b = OpenLayers.Util.isArray(a); return new OpenLayers.LonLat(b && a[0], b && a[1]) };
+OpenLayers.Pixel = OpenLayers.Class({
+ x: 0, y: 0, initialize: function(a, b) { this.x = parseFloat(a); this.y = parseFloat(b) }, toString: function() { return "x\x3d" + this.x + ",y\x3d" + this.y }, clone: function() { return new OpenLayers.Pixel(this.x, this.y) }, equals: function(a) { var b = !1; null != a && (b = this.x == a.x && this.y == a.y || isNaN(this.x) && isNaN(this.y) && isNaN(a.x) && isNaN(a.y)); return b }, distanceTo: function(a) { return Math.sqrt(Math.pow(this.x - a.x, 2) + Math.pow(this.y - a.y, 2)) }, add: function(a, b) {
+ if (null == a || null == b) throw new TypeError("Pixel.add cannot receive null values");
+ return new OpenLayers.Pixel(this.x + a, this.y + b)
+ }, offset: function(a) { var b = this.clone(); a && (b = this.add(a.x, a.y)); return b }, CLASS_NAME: "OpenLayers.Pixel"
+});
+OpenLayers.Size = OpenLayers.Class({ w: 0, h: 0, initialize: function(a, b) { this.w = parseFloat(a); this.h = parseFloat(b) }, toString: function() { return "w\x3d" + this.w + ",h\x3d" + this.h }, clone: function() { return new OpenLayers.Size(this.w, this.h) }, equals: function(a) { var b = !1; null != a && (b = this.w == a.w && this.h == a.h || isNaN(this.w) && isNaN(this.h) && isNaN(a.w) && isNaN(a.h)); return b }, CLASS_NAME: "OpenLayers.Size" });
+OpenLayers.Console = { log: function() { }, debug: function() { }, info: function() { }, warn: function() { }, error: function() { }, userError: function(a) { alert(a) }, assert: function() { }, dir: function() { }, dirxml: function() { }, trace: function() { }, group: function() { }, groupEnd: function() { }, time: function() { }, timeEnd: function() { }, profile: function() { }, profileEnd: function() { }, count: function() { }, CLASS_NAME: "OpenLayers.Console" };
+(function() { for (var a = document.getElementsByTagName("script"), b = 0, c = a.length; b < c; ++b)if (-1 != a[b].src.indexOf("firebug.js") && console) { OpenLayers.Util.extend(OpenLayers.Console, console); break } })();
+OpenLayers.Lang = {
+ code: null, defaultCode: "en", getCode: function() { OpenLayers.Lang.code || OpenLayers.Lang.setCode(); return OpenLayers.Lang.code }, setCode: function(a) {
+ var b; a || (a = "msie" == OpenLayers.BROWSER_NAME ? navigator.userLanguage : navigator.language); a = a.split("-"); a[0] = a[0].toLowerCase(); "object" == typeof OpenLayers.Lang[a[0]] && (b = a[0]); if (a[1]) { var c = a[0] + "-" + a[1].toUpperCase(); "object" == typeof OpenLayers.Lang[c] && (b = c) } b || (OpenLayers.Console.warn("Failed to find OpenLayers.Lang." + a.join("-") + " dictionary, falling back to default language"),
+ b = OpenLayers.Lang.defaultCode); OpenLayers.Lang.code = b
+ }, translate: function(a, b) { var c = OpenLayers.Lang[OpenLayers.Lang.getCode()]; (c = c && c[a]) || (c = a); b && (c = OpenLayers.String.format(c, b)); return c }
+}; OpenLayers.i18n = OpenLayers.Lang.translate; OpenLayers.Util = OpenLayers.Util || {}; OpenLayers.Util.getElement = function() { for (var a = [], b = 0, c = arguments.length; b < c; b++) { var d = arguments[b]; "string" == typeof d && (d = document.getElementById(d)); if (1 == arguments.length) return d; a.push(d) } return a };
+OpenLayers.Util.isElement = function(a) { return !(!a || 1 !== a.nodeType) }; OpenLayers.Util.isArray = function(a) { return "[object Array]" === Object.prototype.toString.call(a) }; OpenLayers.Util.removeItem = function(a, b) { for (var c = a.length - 1; 0 <= c; c--)a[c] == b && a.splice(c, 1); return a }; OpenLayers.Util.indexOf = function(a, b) { if ("function" == typeof a.indexOf) return a.indexOf(b); for (var c = 0, d = a.length; c < d; c++)if (a[c] == b) return c; return -1 }; OpenLayers.Util.dotless = /\./g;
+OpenLayers.Util.modifyDOMElement = function(a, b, c, d, e, f, g, h) { b && (a.id = b.replace(OpenLayers.Util.dotless, "_")); c && (a.style.left = c.x + "px", a.style.top = c.y + "px"); d && (a.style.width = d.w + "px", a.style.height = d.h + "px"); e && (a.style.position = e); f && (a.style.border = f); g && (a.style.overflow = g); 0 <= parseFloat(h) && 1 > parseFloat(h) ? (a.style.filter = "alpha(opacity\x3d" + 100 * h + ")", a.style.opacity = h) : 1 == parseFloat(h) && (a.style.filter = "", a.style.opacity = "") };
+OpenLayers.Util.createDiv = function(a, b, c, d, e, f, g, h) { var k = document.createElement("div"); d && (k.style.backgroundImage = "url(" + d + ")"); a || (a = OpenLayers.Util.createUniqueID("OpenLayersDiv")); e || (e = "absolute"); OpenLayers.Util.modifyDOMElement(k, a, b, c, e, f, g, h); return k };
+OpenLayers.Util.createImage = function(a, b, c, d, e, f, g, h) { var k = document.createElement("img"); a || (a = OpenLayers.Util.createUniqueID("OpenLayersDiv")); e || (e = "relative"); OpenLayers.Util.modifyDOMElement(k, a, b, c, e, f, null, g); h && (k.style.display = "none", b = function() { k.style.display = ""; OpenLayers.Event.stopObservingElement(k) }, OpenLayers.Event.observe(k, "load", b), OpenLayers.Event.observe(k, "error", b)); k.style.alt = a; k.galleryImg = "no"; d && (k.src = d); return k }; OpenLayers.IMAGE_RELOAD_ATTEMPTS = 0;
+OpenLayers.Util.alphaHackNeeded = null; OpenLayers.Util.alphaHack = function() { if (null == OpenLayers.Util.alphaHackNeeded) { var a = navigator.appVersion.split("MSIE"), a = parseFloat(a[1]), b = !1; try { b = !!document.body.filters } catch (c) { } OpenLayers.Util.alphaHackNeeded = b && 5.5 <= a && 7 > a } return OpenLayers.Util.alphaHackNeeded };
+OpenLayers.Util.modifyAlphaImageDiv = function(a, b, c, d, e, f, g, h, k) {
+ OpenLayers.Util.modifyDOMElement(a, b, c, d, f, null, null, k); b = a.childNodes[0]; e && (b.src = e); OpenLayers.Util.modifyDOMElement(b, a.id + "_innerImage", null, d, "relative", g); OpenLayers.Util.alphaHack() && ("none" != a.style.display && (a.style.display = "inline-block"), null == h && (h = "scale"), a.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src\x3d'" + b.src + "', sizingMethod\x3d'" + h + "')", 0 <= parseFloat(a.style.opacity) && 1 > parseFloat(a.style.opacity) &&
+ (a.style.filter += " alpha(opacity\x3d" + 100 * a.style.opacity + ")"), b.style.filter = "alpha(opacity\x3d0)")
+}; OpenLayers.Util.createAlphaImageDiv = function(a, b, c, d, e, f, g, h, k) { var l = OpenLayers.Util.createDiv(); k = OpenLayers.Util.createImage(null, null, null, null, null, null, null, k); k.className = "olAlphaImg"; l.appendChild(k); OpenLayers.Util.modifyAlphaImageDiv(l, a, b, c, d, e, f, g, h); return l }; OpenLayers.Util.upperCaseObject = function(a) { var b = {}, c; for (c in a) b[c.toUpperCase()] = a[c]; return b };
+OpenLayers.Util.applyDefaults = function(a, b) { a = a || {}; var c = "function" == typeof window.Event && b instanceof window.Event, d; for (d in b) if (void 0 === a[d] || !c && b.hasOwnProperty && b.hasOwnProperty(d) && !a.hasOwnProperty(d)) a[d] = b[d]; !c && b && b.hasOwnProperty && b.hasOwnProperty("toString") && !a.hasOwnProperty("toString") && (a.toString = b.toString); return a };
+OpenLayers.Util.getParameterString = function(a) { var b = [], c; for (c in a) { var d = a[c]; if (null != d && "function" != typeof d) { if ("object" == typeof d && d.constructor == Array) { for (var e = [], f, g = 0, h = d.length; g < h; g++)f = d[g], e.push(encodeURIComponent(null === f || void 0 === f ? "" : f)); d = e.join(",") } else d = encodeURIComponent(d); b.push(encodeURIComponent(c) + "\x3d" + d) } } return b.join("\x26") }; OpenLayers.Util.urlAppend = function(a, b) { var c = a; if (b) var d = (a + " ").split(/[?&]/), c = c + (" " === d.pop() ? b : d.length ? "\x26" + b : "?" + b); return c };
+OpenLayers.Util.getImagesLocation = function() { return OpenLayers.ImgPath || OpenLayers._getScriptLocation() + "img/" }; OpenLayers.Util.getImageLocation = function(a) { return OpenLayers.Util.getImagesLocation() + a }; OpenLayers.Util.Try = function() { for (var a = null, b = 0, c = arguments.length; b < c; b++) { var d = arguments[b]; try { a = d(); break } catch (e) { } } return a };
+OpenLayers.Util.getXmlNodeValue = function(a) { var b = null; OpenLayers.Util.Try(function() { (b = a.text) || (b = a.textContent); b || (b = a.firstChild.nodeValue) }, function() { b = a.textContent }); return b }; OpenLayers.Util.mouseLeft = function(a, b) { for (var c = a.relatedTarget ? a.relatedTarget : a.toElement; c != b && null != c;)c = c.parentNode; return c != b }; OpenLayers.Util.DEFAULT_PRECISION = 14; OpenLayers.Util.toFloat = function(a, b) { null == b && (b = OpenLayers.Util.DEFAULT_PRECISION); "number" !== typeof a && (a = parseFloat(a)); return 0 === b ? a : parseFloat(a.toPrecision(b)) };
+OpenLayers.Util.rad = function(a) { return a * Math.PI / 180 }; OpenLayers.Util.deg = function(a) { return 180 * a / Math.PI }; OpenLayers.Util.VincentyConstants = { a: 6378137, b: 6356752.3142, f: 1 / 298.257223563 };
+OpenLayers.Util.distVincenty = function(a, b) {
+ for (var c = OpenLayers.Util.VincentyConstants, d = c.a, e = c.b, c = c.f, f = OpenLayers.Util.rad(b.lon - a.lon), g = Math.atan((1 - c) * Math.tan(OpenLayers.Util.rad(a.lat))), h = Math.atan((1 - c) * Math.tan(OpenLayers.Util.rad(b.lat))), k = Math.sin(g), g = Math.cos(g), l = Math.sin(h), h = Math.cos(h), m = f, n = 2 * Math.PI, p = 20; 1E-12 < Math.abs(m - n) && 0 < --p;) {
+ var q = Math.sin(m), r = Math.cos(m), t = Math.sqrt(h * q * h * q + (g * l - k * h * r) * (g * l - k * h * r)); if (0 == t) return 0; var r = k * l + g * h * r, u = Math.atan2(t, r), v = Math.asin(g * h *
+ q / t), w = Math.cos(v) * Math.cos(v), q = r - 2 * k * l / w, x = c / 16 * w * (4 + c * (4 - 3 * w)), n = m, m = f + (1 - x) * c * Math.sin(v) * (u + x * t * (q + x * r * (-1 + 2 * q * q)))
+ } if (0 == p) return NaN; d = w * (d * d - e * e) / (e * e); c = d / 1024 * (256 + d * (-128 + d * (74 - 47 * d))); return (e * (1 + d / 16384 * (4096 + d * (-768 + d * (320 - 175 * d)))) * (u - c * t * (q + c / 4 * (r * (-1 + 2 * q * q) - c / 6 * q * (-3 + 4 * t * t) * (-3 + 4 * q * q))))).toFixed(3) / 1E3
+};
+OpenLayers.Util.destinationVincenty = function(a, b, c) {
+ var d = OpenLayers.Util, e = d.VincentyConstants, f = e.a, g = e.b, h = e.f, e = a.lon; a = a.lat; var k = d.rad(b); b = Math.sin(k); k = Math.cos(k); a = (1 - h) * Math.tan(d.rad(a)); var l = 1 / Math.sqrt(1 + a * a), m = a * l, n = Math.atan2(a, k); a = l * b; for (var p = 1 - a * a, f = p * (f * f - g * g) / (g * g), q = 1 + f / 16384 * (4096 + f * (-768 + f * (320 - 175 * f))), r = f / 1024 * (256 + f * (-128 + f * (74 - 47 * f))), f = c / (g * q), t = 2 * Math.PI; 1E-12 < Math.abs(f - t);)var u = Math.cos(2 * n + f), v = Math.sin(f), w = Math.cos(f), x = r * v * (u + r / 4 * (w * (-1 + 2 * u * u) - r / 6 * u * (-3 + 4 *
+ v * v) * (-3 + 4 * u * u))), t = f, f = c / (g * q) + x; c = m * v - l * w * k; g = Math.atan2(m * w + l * v * k, (1 - h) * Math.sqrt(a * a + c * c)); b = Math.atan2(v * b, l * w - m * v * k); k = h / 16 * p * (4 + h * (4 - 3 * p)); u = b - (1 - k) * h * a * (f + k * v * (u + k * w * (-1 + 2 * u * u))); Math.atan2(a, -c); return new OpenLayers.LonLat(e + d.deg(u), d.deg(g))
+};
+OpenLayers.Util.getParameters = function(a, b) {
+ b = b || {}; a = null === a || void 0 === a ? window.location.href : a; var c = ""; if (OpenLayers.String.contains(a, "?")) var d = a.indexOf("?") + 1, c = OpenLayers.String.contains(a, "#") ? a.indexOf("#") : a.length, c = a.substring(d, c); for (var d = {}, c = c.split(/[&;]/), e = 0, f = c.length; e < f; ++e) {
+ var g = c[e].split("\x3d"); if (g[0]) {
+ var h = g[0]; try { h = decodeURIComponent(h) } catch (k) { h = unescape(h) } g = (g[1] || "").replace(/\+/g, " "); try { g = decodeURIComponent(g) } catch (l) { g = unescape(g) } !1 !== b.splitArgs && (g =
+ g.split(",")); 1 == g.length && (g = g[0]); d[h] = g
+ }
+ } return d
+}; OpenLayers.Util.lastSeqID = 0; OpenLayers.Util.createUniqueID = function(a) { a = null == a ? "id_" : a.replace(OpenLayers.Util.dotless, "_"); OpenLayers.Util.lastSeqID += 1; return a + OpenLayers.Util.lastSeqID }; OpenLayers.INCHES_PER_UNIT = { inches: 1, ft: 12, mi: 63360, m: 39.37, km: 39370, dd: 4374754, yd: 36 }; OpenLayers.INCHES_PER_UNIT["in"] = OpenLayers.INCHES_PER_UNIT.inches; OpenLayers.INCHES_PER_UNIT.degrees = OpenLayers.INCHES_PER_UNIT.dd; OpenLayers.INCHES_PER_UNIT.nmi = 1852 * OpenLayers.INCHES_PER_UNIT.m;
+OpenLayers.METERS_PER_INCH = .0254000508001016;
+OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT, {
+ Inch: OpenLayers.INCHES_PER_UNIT.inches, Meter: 1 / OpenLayers.METERS_PER_INCH, Foot: .3048006096012192 / OpenLayers.METERS_PER_INCH, IFoot: .3048 / OpenLayers.METERS_PER_INCH, ClarkeFoot: .3047972651151 / OpenLayers.METERS_PER_INCH, SearsFoot: .30479947153867626 / OpenLayers.METERS_PER_INCH, GoldCoastFoot: .3047997101815088 / OpenLayers.METERS_PER_INCH, IInch: .0254 / OpenLayers.METERS_PER_INCH, MicroInch: 2.54E-5 / OpenLayers.METERS_PER_INCH, Mil: 2.54E-8 / OpenLayers.METERS_PER_INCH,
+ Centimeter: .01 / OpenLayers.METERS_PER_INCH, Kilometer: 1E3 / OpenLayers.METERS_PER_INCH, Yard: .9144018288036576 / OpenLayers.METERS_PER_INCH, SearsYard: .914398414616029 / OpenLayers.METERS_PER_INCH, IndianYard: .9143985307444408 / OpenLayers.METERS_PER_INCH, IndianYd37: .91439523 / OpenLayers.METERS_PER_INCH, IndianYd62: .9143988 / OpenLayers.METERS_PER_INCH, IndianYd75: .9143985 / OpenLayers.METERS_PER_INCH, IndianFoot: .30479951 / OpenLayers.METERS_PER_INCH, IndianFt37: .30479841 / OpenLayers.METERS_PER_INCH, IndianFt62: .3047996 /
+ OpenLayers.METERS_PER_INCH, IndianFt75: .3047995 / OpenLayers.METERS_PER_INCH, Mile: 1609.3472186944373 / OpenLayers.METERS_PER_INCH, IYard: .9144 / OpenLayers.METERS_PER_INCH, IMile: 1609.344 / OpenLayers.METERS_PER_INCH, NautM: 1852 / OpenLayers.METERS_PER_INCH, "Lat-66": 110943.31648893273 / OpenLayers.METERS_PER_INCH, "Lat-83": 110946.25736872235 / OpenLayers.METERS_PER_INCH, Decimeter: .1 / OpenLayers.METERS_PER_INCH, Millimeter: .001 / OpenLayers.METERS_PER_INCH, Dekameter: 10 / OpenLayers.METERS_PER_INCH, Decameter: 10 / OpenLayers.METERS_PER_INCH,
+ Hectometer: 100 / OpenLayers.METERS_PER_INCH, GermanMeter: 1.0000135965 / OpenLayers.METERS_PER_INCH, CaGrid: .999738 / OpenLayers.METERS_PER_INCH, ClarkeChain: 20.1166194976 / OpenLayers.METERS_PER_INCH, GunterChain: 20.11684023368047 / OpenLayers.METERS_PER_INCH, BenoitChain: 20.116782494375872 / OpenLayers.METERS_PER_INCH, SearsChain: 20.11676512155 / OpenLayers.METERS_PER_INCH, ClarkeLink: .201166194976 / OpenLayers.METERS_PER_INCH, GunterLink: .2011684023368047 / OpenLayers.METERS_PER_INCH, BenoitLink: .20116782494375873 / OpenLayers.METERS_PER_INCH,
+ SearsLink: .2011676512155 / OpenLayers.METERS_PER_INCH, Rod: 5.02921005842012 / OpenLayers.METERS_PER_INCH, IntnlChain: 20.1168 / OpenLayers.METERS_PER_INCH, IntnlLink: .201168 / OpenLayers.METERS_PER_INCH, Perch: 5.02921005842012 / OpenLayers.METERS_PER_INCH, Pole: 5.02921005842012 / OpenLayers.METERS_PER_INCH, Furlong: 201.1684023368046 / OpenLayers.METERS_PER_INCH, Rood: 3.778266898 / OpenLayers.METERS_PER_INCH, CapeFoot: .3047972615 / OpenLayers.METERS_PER_INCH, Brealey: 375 / OpenLayers.METERS_PER_INCH, ModAmFt: .304812252984506 / OpenLayers.METERS_PER_INCH,
+ Fathom: 1.8288 / OpenLayers.METERS_PER_INCH, "NautM-UK": 1853.184 / OpenLayers.METERS_PER_INCH, "50kilometers": 5E4 / OpenLayers.METERS_PER_INCH, "150kilometers": 15E4 / OpenLayers.METERS_PER_INCH
+});
+OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT, {
+ mm: OpenLayers.INCHES_PER_UNIT.Meter / 1E3, cm: OpenLayers.INCHES_PER_UNIT.Meter / 100, dm: 100 * OpenLayers.INCHES_PER_UNIT.Meter, km: 1E3 * OpenLayers.INCHES_PER_UNIT.Meter, kmi: OpenLayers.INCHES_PER_UNIT.nmi, fath: OpenLayers.INCHES_PER_UNIT.Fathom, ch: OpenLayers.INCHES_PER_UNIT.IntnlChain, link: OpenLayers.INCHES_PER_UNIT.IntnlLink, "us-in": OpenLayers.INCHES_PER_UNIT.inches, "us-ft": OpenLayers.INCHES_PER_UNIT.Foot, "us-yd": OpenLayers.INCHES_PER_UNIT.Yard, "us-ch": OpenLayers.INCHES_PER_UNIT.GunterChain,
+ "us-mi": OpenLayers.INCHES_PER_UNIT.Mile, "ind-yd": OpenLayers.INCHES_PER_UNIT.IndianYd37, "ind-ft": OpenLayers.INCHES_PER_UNIT.IndianFt37, "ind-ch": 20.11669506 / OpenLayers.METERS_PER_INCH
+}); OpenLayers.DOTS_PER_INCH = 72; OpenLayers.Util.normalizeScale = function(a) { return 1 < a ? 1 / a : a }; OpenLayers.Util.getResolutionFromScale = function(a, b) { var c; a && (null == b && (b = "degrees"), c = 1 / (OpenLayers.Util.normalizeScale(a) * OpenLayers.INCHES_PER_UNIT[b] * OpenLayers.DOTS_PER_INCH)); return c };
+OpenLayers.Util.getScaleFromResolution = function(a, b) { null == b && (b = "degrees"); return a * OpenLayers.INCHES_PER_UNIT[b] * OpenLayers.DOTS_PER_INCH };
+OpenLayers.Util.pagePosition = function(a) {
+ var b = [0, 0], c = OpenLayers.Util.getViewportElement(); if (!a || a == window || a == c) return b; var d = OpenLayers.IS_GECKO && document.getBoxObjectFor && "absolute" == OpenLayers.Element.getStyle(a, "position") && ("" == a.style.top || "" == a.style.left), e = null; if (a.getBoundingClientRect) a = a.getBoundingClientRect(), e = window.pageYOffset || c.scrollTop, b[0] = a.left + (window.pageXOffset || c.scrollLeft), b[1] = a.top + e; else if (document.getBoxObjectFor && !d) a = document.getBoxObjectFor(a), c = document.getBoxObjectFor(c),
+ b[0] = a.screenX - c.screenX, b[1] = a.screenY - c.screenY; else { b[0] = a.offsetLeft; b[1] = a.offsetTop; e = a.offsetParent; if (e != a) for (; e;)b[0] += e.offsetLeft, b[1] += e.offsetTop, e = e.offsetParent; c = OpenLayers.BROWSER_NAME; if ("opera" == c || "safari" == c && "absolute" == OpenLayers.Element.getStyle(a, "position")) b[1] -= document.body.offsetTop; for (e = a.offsetParent; e && e != document.body;) { b[0] -= e.scrollLeft; if ("opera" != c || "TR" != e.tagName) b[1] -= e.scrollTop; e = e.offsetParent } } return b
+};
+OpenLayers.Util.getViewportElement = function() { var a = arguments.callee.viewportElement; void 0 == a && (a = "msie" == OpenLayers.BROWSER_NAME && "CSS1Compat" != document.compatMode ? document.body : document.documentElement, arguments.callee.viewportElement = a); return a };
+OpenLayers.Util.isEquivalentUrl = function(a, b, c) { c = c || {}; OpenLayers.Util.applyDefaults(c, { ignoreCase: !0, ignorePort80: !0, ignoreHash: !0, splitArgs: !1 }); a = OpenLayers.Util.createUrlObject(a, c); b = OpenLayers.Util.createUrlObject(b, c); for (var d in a) if ("args" !== d && a[d] != b[d]) return !1; for (d in a.args) { if (a.args[d] != b.args[d]) return !1; delete b.args[d] } for (d in b.args) return !1; return !0 };
+OpenLayers.Util.createUrlObject = function(a, b) {
+ b = b || {}; if (!/^\w+:\/\//.test(a)) { var c = window.location, d = c.port ? ":" + c.port : "", d = c.protocol + "//" + c.host.split(":").shift() + d; 0 === a.indexOf("/") ? a = d + a : (c = c.pathname.split("/"), c.pop(), a = d + c.join("/") + "/" + a) } b.ignoreCase && (a = a.toLowerCase()); c = document.createElement("a"); c.href = a; d = {}; d.host = c.host.split(":").shift(); d.protocol = c.protocol; d.port = b.ignorePort80 ? "80" == c.port || "0" == c.port ? "" : c.port : "" == c.port || "0" == c.port ? "80" : c.port; d.hash = b.ignoreHash || "#" ===
+ c.hash ? "" : c.hash; var e = c.search; e || (e = a.indexOf("?"), e = -1 != e ? a.substr(e) : ""); d.args = OpenLayers.Util.getParameters(e, { splitArgs: b.splitArgs }); d.pathname = "/" == c.pathname.charAt(0) ? c.pathname : "/" + c.pathname; return d
+}; OpenLayers.Util.removeTail = function(a) { var b = null, b = a.indexOf("?"), c = a.indexOf("#"); return -1 == b ? -1 != c ? a.substr(0, c) : a : -1 != c ? a.substr(0, Math.min(b, c)) : a.substr(0, b) }; OpenLayers.IS_GECKO = function() { var a = navigator.userAgent.toLowerCase(); return -1 == a.indexOf("webkit") && -1 != a.indexOf("gecko") }();
+OpenLayers.CANVAS_SUPPORTED = function() { var a = document.createElement("canvas"); return !(!a.getContext || !a.getContext("2d")) }(); OpenLayers.BROWSER_NAME = function() { var a = "", b = navigator.userAgent.toLowerCase(); -1 != b.indexOf("opera") ? a = "opera" : -1 != b.indexOf("msie") ? a = "msie" : -1 != b.indexOf("safari") ? a = "safari" : -1 != b.indexOf("mozilla") && (a = -1 != b.indexOf("firefox") ? "firefox" : "mozilla"); return a }(); OpenLayers.Util.getBrowserName = function() { return OpenLayers.BROWSER_NAME };
+OpenLayers.Util.getRenderedDimensions = function(a, b, c) {
+ var d, e, f = document.createElement("div"); f.style.visibility = "hidden"; for (var g = c && c.containerElement ? c.containerElement : document.body, h = !1, k = null, l = g; l && "body" != l.tagName.toLowerCase();) { var m = OpenLayers.Element.getStyle(l, "position"); if ("absolute" == m) { h = !0; break } else if (m && "static" != m) break; l = l.parentNode } !h || 0 !== g.clientHeight && 0 !== g.clientWidth || (k = document.createElement("div"), k.style.visibility = "hidden", k.style.position = "absolute", k.style.overflow =
+ "visible", k.style.width = document.body.clientWidth + "px", k.style.height = document.body.clientHeight + "px", k.appendChild(f)); f.style.position = "absolute"; b && (b.w ? (d = b.w, f.style.width = d + "px") : b.h && (e = b.h, f.style.height = e + "px")); c && c.displayClass && (f.className = c.displayClass); b = document.createElement("div"); b.innerHTML = a; b.style.overflow = "visible"; if (b.childNodes) for (a = 0, c = b.childNodes.length; a < c; a++)b.childNodes[a].style && (b.childNodes[a].style.overflow = "visible"); f.appendChild(b); k ? g.appendChild(k) : g.appendChild(f);
+ d || (d = parseInt(b.scrollWidth), f.style.width = d + "px"); e || (e = parseInt(b.scrollHeight)); f.removeChild(b); k ? (k.removeChild(f), g.removeChild(k)) : g.removeChild(f); return new OpenLayers.Size(d, e)
+};
+OpenLayers.Util.getScrollbarWidth = function() {
+ var a = OpenLayers.Util._scrollbarWidth; if (null == a) {
+ var b = null, c = null, b = document.createElement("div"); b.style.position = "absolute"; b.style.top = "-1000px"; b.style.left = "-1000px"; b.style.width = "100px"; b.style.height = "50px"; b.style.overflow = "hidden"; c = document.createElement("div"); c.style.width = "100%"; c.style.height = "200px"; b.appendChild(c); document.body.appendChild(b); a = c.offsetWidth; b.style.overflow = "scroll"; b = c.offsetWidth; document.body.removeChild(document.body.lastChild);
+ OpenLayers.Util._scrollbarWidth = a - b; a = OpenLayers.Util._scrollbarWidth
+ } return a
+};
+OpenLayers.Util.getFormattedLonLat = function(a, b, c) { c || (c = "dms"); a = (a + 540) % 360 - 180; var d = Math.abs(a), e = Math.floor(d), f = d = (d - e) / (1 / 60), d = Math.floor(d), f = Math.round((f - d) / (1 / 60) * 10), f = f / 10; 60 <= f && (f -= 60, d += 1, 60 <= d && (d -= 60, e += 1)); 10 > e && (e = "0" + e); e += "°"; 0 <= c.indexOf("dm") && (10 > d && (d = "0" + d), e += d + "'", 0 <= c.indexOf("dms") && (10 > f && (f = "0" + f), e += f + '"')); return "lon" == b ? e + (0 > a ? OpenLayers.i18n("W") : OpenLayers.i18n("E")) : e + (0 > a ? OpenLayers.i18n("S") : OpenLayers.i18n("N")) };
+OpenLayers.Format = OpenLayers.Class({ options: null, externalProjection: null, internalProjection: null, data: null, keepData: !1, initialize: function(a) { OpenLayers.Util.extend(this, a); this.options = a }, destroy: function() { }, read: function(a) { throw Error("Read not implemented."); }, write: function(a) { throw Error("Write not implemented."); }, CLASS_NAME: "OpenLayers.Format" });
+OpenLayers.Format.CSWGetRecords = function(a) { a = OpenLayers.Util.applyDefaults(a, OpenLayers.Format.CSWGetRecords.DEFAULTS); var b = OpenLayers.Format.CSWGetRecords["v" + a.version.replace(/\./g, "_")]; if (!b) throw "Unsupported CSWGetRecords version: " + a.version; return new b(a) }; OpenLayers.Format.CSWGetRecords.DEFAULTS = { version: "2.0.2" };
+OpenLayers.Control = OpenLayers.Class({
+ id: null, map: null, div: null, type: null, allowSelection: !1, displayClass: "", title: "", autoActivate: !1, active: null, handlerOptions: null, handler: null, eventListeners: null, events: null, initialize: function(a) {
+ this.displayClass = this.CLASS_NAME.replace("OpenLayers.", "ol").replace(/\./g, ""); OpenLayers.Util.extend(this, a); this.events = new OpenLayers.Events(this); if (this.eventListeners instanceof Object) this.events.on(this.eventListeners); null == this.id && (this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME +
+ "_"))
+ }, destroy: function() { this.events && (this.eventListeners && this.events.un(this.eventListeners), this.events.destroy(), this.events = null); this.eventListeners = null; this.handler && (this.handler.destroy(), this.handler = null); if (this.handlers) { for (var a in this.handlers) this.handlers.hasOwnProperty(a) && "function" == typeof this.handlers[a].destroy && this.handlers[a].destroy(); this.handlers = null } this.map && (this.map.removeControl(this), this.map = null); this.div = null }, setMap: function(a) {
+ this.map = a; this.handler &&
+ this.handler.setMap(a)
+ }, draw: function(a) { null == this.div && (this.div = OpenLayers.Util.createDiv(this.id), this.div.className = this.displayClass, this.allowSelection || (this.div.className += " olControlNoSelect", this.div.setAttribute("unselectable", "on", 0), this.div.onselectstart = OpenLayers.Function.False), "" != this.title && (this.div.title = this.title)); null != a && (this.position = a.clone()); this.moveTo(this.position); return this.div }, moveTo: function(a) {
+ null != a && null != this.div && (this.div.style.left = a.x + "px", this.div.style.top =
+ a.y + "px")
+ }, activate: function() { if (this.active) return !1; this.handler && this.handler.activate(); this.active = !0; this.map && OpenLayers.Element.addClass(this.map.viewPortDiv, this.displayClass.replace(/ /g, "") + "Active"); this.events.triggerEvent("activate"); return !0 }, deactivate: function() {
+ return this.active ? (this.handler && this.handler.deactivate(), this.active = !1, this.map && OpenLayers.Element.removeClass(this.map.viewPortDiv, this.displayClass.replace(/ /g, "") + "Active"), this.events.triggerEvent("deactivate"),
+ !0) : !1
+ }, CLASS_NAME: "OpenLayers.Control"
+}); OpenLayers.Control.TYPE_BUTTON = 1; OpenLayers.Control.TYPE_TOGGLE = 2; OpenLayers.Control.TYPE_TOOL = 3;
+OpenLayers.Event = {
+ observers: !1, KEY_SPACE: 32, KEY_BACKSPACE: 8, KEY_TAB: 9, KEY_RETURN: 13, KEY_ESC: 27, KEY_LEFT: 37, KEY_UP: 38, KEY_RIGHT: 39, KEY_DOWN: 40, KEY_DELETE: 46, element: function(a) { return a.target || a.srcElement }, isSingleTouch: function(a) { return a.touches && 1 == a.touches.length }, isMultiTouch: function(a) { return a.touches && 1 < a.touches.length }, isLeftClick: function(a) { return a.which && 1 == a.which || a.button && 1 == a.button }, isRightClick: function(a) { return a.which && 3 == a.which || a.button && 2 == a.button }, stop: function(a,
+ b) { b || OpenLayers.Event.preventDefault(a); a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0 }, preventDefault: function(a) { a.preventDefault ? a.preventDefault() : a.returnValue = !1 }, findElement: function(a, b) { for (var c = OpenLayers.Event.element(a); c.parentNode && (!c.tagName || c.tagName.toUpperCase() != b.toUpperCase());)c = c.parentNode; return c }, observe: function(a, b, c, d) {
+ a = OpenLayers.Util.getElement(a); d = d || !1; "keypress" == b && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || a.attachEvent) && (b = "keydown");
+ this.observers || (this.observers = {}); if (!a._eventCacheID) { var e = "eventCacheID_"; a.id && (e = a.id + "_" + e); a._eventCacheID = OpenLayers.Util.createUniqueID(e) } e = a._eventCacheID; this.observers[e] || (this.observers[e] = []); this.observers[e].push({ element: a, name: b, observer: c, useCapture: d }); a.addEventListener ? a.addEventListener(b, c, d) : a.attachEvent && a.attachEvent("on" + b, c)
+ }, stopObservingElement: function(a) { a = OpenLayers.Util.getElement(a)._eventCacheID; this._removeElementObservers(OpenLayers.Event.observers[a]) },
+ _removeElementObservers: function(a) { if (a) for (var b = a.length - 1; 0 <= b; b--) { var c = a[b]; OpenLayers.Event.stopObserving.apply(this, [c.element, c.name, c.observer, c.useCapture]) } }, stopObserving: function(a, b, c, d) {
+ d = d || !1; a = OpenLayers.Util.getElement(a); var e = a._eventCacheID; "keypress" == b && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || a.detachEvent) && (b = "keydown"); var f = !1, g = OpenLayers.Event.observers[e]; if (g) for (var h = 0; !f && h < g.length;) {
+ var k = g[h]; if (k.name == b && k.observer == c && k.useCapture == d) {
+ g.splice(h,
+ 1); 0 == g.length && delete OpenLayers.Event.observers[e]; f = !0; break
+ } h++
+ } f && (a.removeEventListener ? a.removeEventListener(b, c, d) : a && a.detachEvent && a.detachEvent("on" + b, c)); return f
+ }, unloadCache: function() { if (OpenLayers.Event && OpenLayers.Event.observers) { for (var a in OpenLayers.Event.observers) OpenLayers.Event._removeElementObservers.apply(this, [OpenLayers.Event.observers[a]]); OpenLayers.Event.observers = !1 } }, CLASS_NAME: "OpenLayers.Event"
+};
+OpenLayers.Event.observe(window, "unload", OpenLayers.Event.unloadCache, !1);
+OpenLayers.Events = OpenLayers.Class({
+ BROWSER_EVENTS: "mouseover mouseout mousedown mouseup mousemove click dblclick rightclick dblrightclick resize focus blur touchstart touchmove touchend keydown".split(" "), listeners: null, object: null, element: null, eventHandler: null, fallThrough: null, includeXY: !1, extensions: null, extensionCount: null, clearMouseListener: null, initialize: function(a, b, c, d, e) {
+ OpenLayers.Util.extend(this, e); this.object = a; this.fallThrough = d; this.listeners = {}; this.extensions = {}; this.extensionCount =
+ {}; this._msTouches = []; null != b && this.attachToElement(b)
+ }, destroy: function() { for (var a in this.extensions) "boolean" !== typeof this.extensions[a] && this.extensions[a].destroy(); this.extensions = null; this.element && (OpenLayers.Event.stopObservingElement(this.element), this.element.hasScrollEvent && OpenLayers.Event.stopObserving(window, "scroll", this.clearMouseListener)); this.eventHandler = this.fallThrough = this.object = this.listeners = this.element = null }, addEventType: function(a) { }, attachToElement: function(a) {
+ this.element ?
+ OpenLayers.Event.stopObservingElement(this.element) : (this.eventHandler = OpenLayers.Function.bindAsEventListener(this.handleBrowserEvent, this), this.clearMouseListener = OpenLayers.Function.bind(this.clearMouseCache, this)); this.element = a; for (var b = !!window.navigator.msMaxTouchPoints, c, d = 0, e = this.BROWSER_EVENTS.length; d < e; d++)c = this.BROWSER_EVENTS[d], OpenLayers.Event.observe(a, c, this.eventHandler), b && 0 === c.indexOf("touch") && this.addMsTouchListener(a, c, this.eventHandler); OpenLayers.Event.observe(a, "dragstart",
+ OpenLayers.Event.stop)
+ }, on: function(a) { for (var b in a) "scope" != b && a.hasOwnProperty(b) && this.register(b, a.scope, a[b]) }, register: function(a, b, c, d) { a in OpenLayers.Events && !this.extensions[a] && (this.extensions[a] = new OpenLayers.Events[a](this)); if (null != c) { null == b && (b = this.object); var e = this.listeners[a]; e || (e = [], this.listeners[a] = e, this.extensionCount[a] = 0); b = { obj: b, func: c }; d ? (e.splice(this.extensionCount[a], 0, b), "object" === typeof d && d.extension && this.extensionCount[a]++) : e.push(b) } }, registerPriority: function(a,
+ b, c) { this.register(a, b, c, !0) }, un: function(a) { for (var b in a) "scope" != b && a.hasOwnProperty(b) && this.unregister(b, a.scope, a[b]) }, unregister: function(a, b, c) { null == b && (b = this.object); a = this.listeners[a]; if (null != a) for (var d = 0, e = a.length; d < e; d++)if (a[d].obj == b && a[d].func == c) { a.splice(d, 1); break } }, remove: function(a) { null != this.listeners[a] && (this.listeners[a] = []) }, triggerEvent: function(a, b) {
+ var c = this.listeners[a]; if (c && 0 != c.length) {
+ null == b && (b = {}); b.object = this.object; b.element = this.element; b.type || (b.type =
+ a); for (var c = c.slice(), d, e = 0, f = c.length; e < f && (d = c[e], d = d.func.apply(d.obj, [b]), void 0 == d || 0 != d); e++); this.fallThrough || OpenLayers.Event.stop(b, !0); return d
+ }
+ }, handleBrowserEvent: function(a) { var b = a.type, c = this.listeners[b]; if (c && 0 != c.length) { if ((c = a.touches) && c[0]) { for (var d = 0, e = 0, f = c.length, g, h = 0; h < f; ++h)g = this.getTouchClientXY(c[h]), d += g.clientX, e += g.clientY; a.clientX = d / f; a.clientY = e / f } this.includeXY && (a.xy = this.getMousePosition(a)); this.triggerEvent(b, a) } }, getTouchClientXY: function(a) {
+ var b = window.olMockWin ||
+ window, c = b.pageXOffset, b = b.pageYOffset, d = a.clientX, e = a.clientY; if (0 === a.pageY && Math.floor(e) > Math.floor(a.pageY) || 0 === a.pageX && Math.floor(d) > Math.floor(a.pageX)) d -= c, e -= b; else if (e < a.pageY - b || d < a.pageX - c) d = a.pageX - c, e = a.pageY - b; a.olClientX = d; a.olClientY = e; return { clientX: d, clientY: e }
+ }, clearMouseCache: function() { this.element.scrolls = null; this.element.lefttop = null; this.element.offsets = null }, getMousePosition: function(a) {
+ this.includeXY ? this.element.hasScrollEvent || (OpenLayers.Event.observe(window, "scroll",
+ this.clearMouseListener), this.element.hasScrollEvent = !0) : this.clearMouseCache(); if (!this.element.scrolls) { var b = OpenLayers.Util.getViewportElement(); this.element.scrolls = [window.pageXOffset || b.scrollLeft, window.pageYOffset || b.scrollTop] } this.element.lefttop || (this.element.lefttop = [document.documentElement.clientLeft || 0, document.documentElement.clientTop || 0]); this.element.offsets || (this.element.offsets = OpenLayers.Util.pagePosition(this.element)); return new OpenLayers.Pixel(a.clientX + this.element.scrolls[0] -
+ this.element.offsets[0] - this.element.lefttop[0], a.clientY + this.element.scrolls[1] - this.element.offsets[1] - this.element.lefttop[1])
+ }, addMsTouchListener: function(a, b, c) {
+ function d(a) { c(OpenLayers.Util.applyDefaults({ stopPropagation: function() { for (var a = e.length - 1; 0 <= a; --a)e[a].stopPropagation() }, preventDefault: function() { for (var a = e.length - 1; 0 <= a; --a)e[a].preventDefault() }, type: b }, a)) } var e = this._msTouches; switch (b) {
+ case "touchstart": return this.addMsTouchListenerStart(a, b, d); case "touchend": return this.addMsTouchListenerEnd(a,
+ b, d); case "touchmove": return this.addMsTouchListenerMove(a, b, d); default: throw "Unknown touch event type";
+ }
+ }, addMsTouchListenerStart: function(a, b, c) { var d = this._msTouches; OpenLayers.Event.observe(a, "MSPointerDown", function(a) { for (var b = !1, g = 0, h = d.length; g < h; ++g)if (d[g].pointerId == a.pointerId) { b = !0; break } b || d.push(a); a.touches = d.slice(); c(a) }); OpenLayers.Event.observe(a, "MSPointerUp", function(a) { for (var b = 0, c = d.length; b < c; ++b)if (d[b].pointerId == a.pointerId) { d.splice(b, 1); break } }) }, addMsTouchListenerMove: function(a,
+ b, c) { var d = this._msTouches; OpenLayers.Event.observe(a, "MSPointerMove", function(a) { if (a.pointerType != a.MSPOINTER_TYPE_MOUSE || 0 != a.buttons) if (1 != d.length || d[0].pageX != a.pageX || d[0].pageY != a.pageY) { for (var b = 0, g = d.length; b < g; ++b)if (d[b].pointerId == a.pointerId) { d[b] = a; break } a.touches = d.slice(); c(a) } }) }, addMsTouchListenerEnd: function(a, b, c) {
+ var d = this._msTouches; OpenLayers.Event.observe(a, "MSPointerUp", function(a) {
+ for (var b = 0, g = d.length; b < g; ++b)if (d[b].pointerId == a.pointerId) { d.splice(b, 1); break } a.touches =
+ d.slice(); c(a)
+ })
+ }, CLASS_NAME: "OpenLayers.Events"
+});
+OpenLayers.Events.buttonclick = OpenLayers.Class({
+ target: null, events: "mousedown mouseup click dblclick touchstart touchmove touchend keydown".split(" "), startRegEx: /^mousedown|touchstart$/, cancelRegEx: /^touchmove$/, completeRegEx: /^mouseup|touchend$/, initialize: function(a) { this.target = a; for (a = this.events.length - 1; 0 <= a; --a)this.target.register(this.events[a], this, this.buttonClick, { extension: !0 }) }, destroy: function() {
+ for (var a = this.events.length - 1; 0 <= a; --a)this.target.unregister(this.events[a], this, this.buttonClick);
+ delete this.target
+ }, getPressedButton: function(a) { var b = 3, c; do { if (OpenLayers.Element.hasClass(a, "olButton")) { c = a; break } a = a.parentNode } while (0 < --b && a); return c }, ignore: function(a) { var b = 3, c = !1; do { if ("a" === a.nodeName.toLowerCase()) { c = !0; break } a = a.parentNode } while (0 < --b && a); return c }, buttonClick: function(a) {
+ var b = !0, c = OpenLayers.Event.element(a); if (c && (OpenLayers.Event.isLeftClick(a) || !~a.type.indexOf("mouse"))) if (c = this.getPressedButton(c)) {
+ if ("keydown" === a.type) switch (a.keyCode) {
+ case OpenLayers.Event.KEY_RETURN: case OpenLayers.Event.KEY_SPACE: this.target.triggerEvent("buttonclick",
+ { buttonElement: c }), OpenLayers.Event.stop(a), b = !1
+ } else if (this.startEvt) { if (this.completeRegEx.test(a.type)) { var b = OpenLayers.Util.pagePosition(c), d = OpenLayers.Util.getViewportElement(), e = window.pageYOffset || d.scrollTop; b[0] -= window.pageXOffset || d.scrollLeft; b[1] -= e; this.target.triggerEvent("buttonclick", { buttonElement: c, buttonXY: { x: this.startEvt.clientX - b[0], y: this.startEvt.clientY - b[1] } }) } this.cancelRegEx.test(a.type) && delete this.startEvt; OpenLayers.Event.stop(a); b = !1 } this.startRegEx.test(a.type) &&
+ (this.startEvt = a, OpenLayers.Event.stop(a), b = !1)
+ } else b = !this.ignore(OpenLayers.Event.element(a)), delete this.startEvt; return b
+ }
+}); OpenLayers.Util = OpenLayers.Util || {};
+OpenLayers.Util.vendorPrefix = function() {
+ function a(a) { return a ? a.replace(/([A-Z])/g, function(a) { return "-" + a.toLowerCase() }).replace(/^ms-/, "-ms-") : null } function b(a, b) { if (void 0 === g[b]) { var c, e = 0, f = d.length, p = "undefined" !== typeof a.cssText; for (g[b] = null; e < f; e++)if ((c = d[e]) ? (p || (c = c.toLowerCase()), c = c + b.charAt(0).toUpperCase() + b.slice(1)) : c = b, void 0 !== a[c]) { g[b] = c; break } } return g[b] } function c(a) { return b(e, a) } var d = ["", "O", "ms", "Moz", "Webkit"], e = document.createElement("div").style, f = {}, g = {}; return {
+ css: function(b) {
+ if (void 0 ===
+ f[b]) { var d = b.replace(/(-[\s\S])/g, function(a) { return a.charAt(1).toUpperCase() }), d = c(d); f[b] = a(d) } return f[b]
+ }, js: b, style: c, cssCache: f, jsCache: g
+ }
+}();
+OpenLayers.Animation = function(a) { var b = OpenLayers.Util.vendorPrefix.js(a, "requestAnimationFrame"), c = !!b, d = function() { var c = a[b] || function(b, c) { a.setTimeout(b, 16) }; return function(b, d) { c.apply(a, [b, d]) } }(), e = 0, f = {}; return { isNative: c, requestFrame: d, start: function(a, b, c) { b = 0 < b ? b : Number.POSITIVE_INFINITY; var l = ++e, m = +new Date; f[l] = function() { f[l] && +new Date - m <= b ? (a(), f[l] && d(f[l], c)) : delete f[l] }; d(f[l], c); return l }, stop: function(a) { delete f[a] } } }(window);
+OpenLayers.Tween = OpenLayers.Class({
+ easing: null, begin: null, finish: null, duration: null, callbacks: null, time: null, minFrameRate: null, startTime: null, animationId: null, playing: !1, initialize: function(a) { this.easing = a ? a : OpenLayers.Easing.Expo.easeOut }, start: function(a, b, c, d) {
+ this.playing = !0; this.begin = a; this.finish = b; this.duration = c; this.callbacks = d.callbacks; this.minFrameRate = d.minFrameRate || 30; this.time = 0; this.startTime = (new Date).getTime(); OpenLayers.Animation.stop(this.animationId); this.animationId = null;
+ this.callbacks && this.callbacks.start && this.callbacks.start.call(this, this.begin); this.animationId = OpenLayers.Animation.start(OpenLayers.Function.bind(this.play, this))
+ }, stop: function() { this.playing && (this.callbacks && this.callbacks.done && this.callbacks.done.call(this, this.finish), OpenLayers.Animation.stop(this.animationId), this.animationId = null, this.playing = !1) }, play: function() {
+ var a = {}, b; for (b in this.begin) {
+ var c = this.begin[b], d = this.finish[b]; if (null == c || null == d || isNaN(c) || isNaN(d)) throw new TypeError("invalid value for Tween");
+ a[b] = this.easing.apply(this, [this.time, c, d - c, this.duration])
+ } this.time++; this.callbacks && this.callbacks.eachStep && ((new Date).getTime() - this.startTime) / this.time <= 1E3 / this.minFrameRate && this.callbacks.eachStep.call(this, a); this.time > this.duration && this.stop()
+ }, CLASS_NAME: "OpenLayers.Tween"
+}); OpenLayers.Easing = { CLASS_NAME: "OpenLayers.Easing" }; OpenLayers.Easing.Linear = { easeIn: function(a, b, c, d) { return c * a / d + b }, easeOut: function(a, b, c, d) { return c * a / d + b }, easeInOut: function(a, b, c, d) { return c * a / d + b }, CLASS_NAME: "OpenLayers.Easing.Linear" };
+OpenLayers.Easing.Expo = { easeIn: function(a, b, c, d) { return 0 == a ? b : c * Math.pow(2, 10 * (a / d - 1)) + b }, easeOut: function(a, b, c, d) { return a == d ? b + c : c * (-Math.pow(2, -10 * a / d) + 1) + b }, easeInOut: function(a, b, c, d) { return 0 == a ? b : a == d ? b + c : 1 > (a /= d / 2) ? c / 2 * Math.pow(2, 10 * (a - 1)) + b : c / 2 * (-Math.pow(2, -10 * --a) + 2) + b }, CLASS_NAME: "OpenLayers.Easing.Expo" };
+OpenLayers.Easing.Quad = { easeIn: function(a, b, c, d) { return c * (a /= d) * a + b }, easeOut: function(a, b, c, d) { return -c * (a /= d) * (a - 2) + b }, easeInOut: function(a, b, c, d) { return 1 > (a /= d / 2) ? c / 2 * a * a + b : -c / 2 * (--a * (a - 2) - 1) + b }, CLASS_NAME: "OpenLayers.Easing.Quad" };
+OpenLayers.Projection = OpenLayers.Class({
+ proj: null, projCode: null, titleRegEx: /\+title=[^\+]*/, initialize: function(a, b) { OpenLayers.Util.extend(this, b); this.projCode = a; "object" == typeof Proj4js && (this.proj = new Proj4js.Proj(a)) }, getCode: function() { return this.proj ? this.proj.srsCode : this.projCode }, getUnits: function() { return this.proj ? this.proj.units : null }, toString: function() { return this.getCode() }, equals: function(a) {
+ var b = !1; a && (a instanceof OpenLayers.Projection || (a = new OpenLayers.Projection(a)), "object" ==
+ typeof Proj4js && this.proj.defData && a.proj.defData ? b = this.proj.defData.replace(this.titleRegEx, "") == a.proj.defData.replace(this.titleRegEx, "") : a.getCode && (b = this.getCode(), a = a.getCode(), b = b == a || !!OpenLayers.Projection.transforms[b] && OpenLayers.Projection.transforms[b][a] === OpenLayers.Projection.nullTransform)); return b
+ }, destroy: function() { delete this.proj; delete this.projCode }, CLASS_NAME: "OpenLayers.Projection"
+}); OpenLayers.Projection.transforms = {};
+OpenLayers.Projection.defaults = { "EPSG:4326": { units: "degrees", maxExtent: [-180, -90, 180, 90], yx: !0 }, "CRS:84": { units: "degrees", maxExtent: [-180, -90, 180, 90] }, "EPSG:900913": { units: "m", maxExtent: [-2.003750834E7, -2.003750834E7, 2.003750834E7, 2.003750834E7] } };
+OpenLayers.Projection.addTransform = function(a, b, c) { if (c === OpenLayers.Projection.nullTransform) { var d = OpenLayers.Projection.defaults[a]; d && !OpenLayers.Projection.defaults[b] && (OpenLayers.Projection.defaults[b] = d) } OpenLayers.Projection.transforms[a] || (OpenLayers.Projection.transforms[a] = {}); OpenLayers.Projection.transforms[a][b] = c };
+OpenLayers.Projection.transform = function(a, b, c) { if (b && c) if (b instanceof OpenLayers.Projection || (b = new OpenLayers.Projection(b)), c instanceof OpenLayers.Projection || (c = new OpenLayers.Projection(c)), b.proj && c.proj) a = Proj4js.transform(b.proj, c.proj, a); else { b = b.getCode(); c = c.getCode(); var d = OpenLayers.Projection.transforms; if (d[b] && d[b][c]) d[b][c](a) } return a }; OpenLayers.Projection.nullTransform = function(a) { return a };
+(function() {
+ function a(a) { a.x = 180 * a.x / d; a.y = 180 / Math.PI * (2 * Math.atan(Math.exp(a.y / d * Math.PI)) - Math.PI / 2); return a } function b(a) { a.x = a.x * d / 180; var b = Math.log(Math.tan((90 + a.y) * Math.PI / 360)) / Math.PI * d; a.y = Math.max(-2.003750834E7, Math.min(b, 2.003750834E7)); return a } function c(c, d) { var e = OpenLayers.Projection.addTransform, f = OpenLayers.Projection.nullTransform, g, p, q, r, t; g = 0; for (p = d.length; g < p; ++g)for (q = d[g], e(c, q, b), e(q, c, a), t = g + 1; t < p; ++t)r = d[t], e(q, r, f), e(r, q, f) } var d = 2.003750834E7, e = ["EPSG:900913", "EPSG:3857",
+ "EPSG:102113", "EPSG:102100"], f = ["CRS:84", "urn:ogc:def:crs:EPSG:6.6:4326", "EPSG:4326"], g; for (g = e.length - 1; 0 <= g; --g)c(e[g], f); for (g = f.length - 1; 0 <= g; --g)c(f[g], e)
+})();
+OpenLayers.Map = OpenLayers.Class({
+ Z_INDEX_BASE: { BaseLayer: 100, Overlay: 325, Feature: 725, Popup: 750, Control: 1E3 }, id: null, fractionalZoom: !1, events: null, allOverlays: !1, div: null, dragging: !1, size: null, viewPortDiv: null, layerContainerOrigin: null, layerContainerDiv: null, layers: null, controls: null, popups: null, baseLayer: null, center: null, resolution: null, zoom: 0, panRatio: 1.5, options: null, tileSize: null, projection: "EPSG:4326", units: null, resolutions: null, maxResolution: null, minResolution: null, maxScale: null, minScale: null,
+ maxExtent: null, minExtent: null, restrictedExtent: null, numZoomLevels: 16, theme: null, displayProjection: null, fallThrough: !1, autoUpdateSize: !0, eventListeners: null, panTween: null, panMethod: OpenLayers.Easing.Expo.easeOut, panDuration: 50, zoomTween: null, zoomMethod: OpenLayers.Easing.Quad.easeOut, zoomDuration: 20, paddingForPopups: null, layerContainerOriginPx: null, minPx: null, maxPx: null, initialize: function(a, b) {
+ 1 === arguments.length && "object" === typeof a && (a = (b = a) && b.div); this.tileSize = new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH,
+ OpenLayers.Map.TILE_HEIGHT); this.paddingForPopups = new OpenLayers.Bounds(15, 15, 15, 15); this.theme = OpenLayers._getScriptLocation() + "theme/default/style.css"; this.options = OpenLayers.Util.extend({}, b); OpenLayers.Util.extend(this, b); OpenLayers.Util.applyDefaults(this, OpenLayers.Projection.defaults[this.projection instanceof OpenLayers.Projection ? this.projection.projCode : this.projection]); !this.maxExtent || this.maxExtent instanceof OpenLayers.Bounds || (this.maxExtent = new OpenLayers.Bounds(this.maxExtent));
+ !this.minExtent || this.minExtent instanceof OpenLayers.Bounds || (this.minExtent = new OpenLayers.Bounds(this.minExtent)); !this.restrictedExtent || this.restrictedExtent instanceof OpenLayers.Bounds || (this.restrictedExtent = new OpenLayers.Bounds(this.restrictedExtent)); !this.center || this.center instanceof OpenLayers.LonLat || (this.center = new OpenLayers.LonLat(this.center)); this.layers = []; this.id = OpenLayers.Util.createUniqueID("OpenLayers.Map_"); (this.div = OpenLayers.Util.getElement(a)) || (this.div = document.createElement("div"),
+ this.div.style.height = "1px", this.div.style.width = "1px"); OpenLayers.Element.addClass(this.div, "olMap"); var c = this.id + "_OpenLayers_ViewPort"; this.viewPortDiv = OpenLayers.Util.createDiv(c, null, null, null, "relative", null, "hidden"); this.viewPortDiv.style.width = "100%"; this.viewPortDiv.style.height = "100%"; this.viewPortDiv.className = "olMapViewport"; this.div.appendChild(this.viewPortDiv); this.events = new OpenLayers.Events(this, this.viewPortDiv, null, this.fallThrough, { includeXY: !0 }); OpenLayers.TileManager && null !==
+ this.tileManager && (this.tileManager instanceof OpenLayers.TileManager || (this.tileManager = new OpenLayers.TileManager(this.tileManager)), this.tileManager.addMap(this)); c = this.id + "_OpenLayers_Container"; this.layerContainerDiv = OpenLayers.Util.createDiv(c); this.layerContainerDiv.style.zIndex = this.Z_INDEX_BASE.Popup - 1; this.layerContainerOriginPx = { x: 0, y: 0 }; this.applyTransform(); this.viewPortDiv.appendChild(this.layerContainerDiv); this.updateSize(); if (this.eventListeners instanceof Object) this.events.on(this.eventListeners);
+ !0 === this.autoUpdateSize && (this.updateSizeDestroy = OpenLayers.Function.bind(this.updateSize, this), OpenLayers.Event.observe(window, "resize", this.updateSizeDestroy)); if (this.theme) { for (var c = !0, d = document.getElementsByTagName("link"), e = 0, f = d.length; e < f; ++e)if (OpenLayers.Util.isEquivalentUrl(d.item(e).href, this.theme)) { c = !1; break } c && (c = document.createElement("link"), c.setAttribute("rel", "stylesheet"), c.setAttribute("type", "text/css"), c.setAttribute("href", this.theme), document.getElementsByTagName("head")[0].appendChild(c)) } null ==
+ this.controls && (this.controls = [], null != OpenLayers.Control && (OpenLayers.Control.Navigation ? this.controls.push(new OpenLayers.Control.Navigation) : OpenLayers.Control.TouchNavigation && this.controls.push(new OpenLayers.Control.TouchNavigation), OpenLayers.Control.Zoom ? this.controls.push(new OpenLayers.Control.Zoom) : OpenLayers.Control.PanZoom && this.controls.push(new OpenLayers.Control.PanZoom), OpenLayers.Control.ArgParser && this.controls.push(new OpenLayers.Control.ArgParser), OpenLayers.Control.Attribution &&
+ this.controls.push(new OpenLayers.Control.Attribution))); e = 0; for (f = this.controls.length; e < f; e++)this.addControlToMap(this.controls[e]); this.popups = []; this.unloadDestroy = OpenLayers.Function.bind(this.destroy, this); OpenLayers.Event.observe(window, "unload", this.unloadDestroy); b && b.layers && (delete this.center, delete this.zoom, this.addLayers(b.layers), b.center && !this.getCenter() && this.setCenter(b.center, b.zoom)); this.panMethod && (this.panTween = new OpenLayers.Tween(this.panMethod)); this.zoomMethod && this.applyTransform.transform &&
+ (this.zoomTween = new OpenLayers.Tween(this.zoomMethod))
+ }, getViewport: function() { return this.viewPortDiv }, render: function(a) { this.div = OpenLayers.Util.getElement(a); OpenLayers.Element.addClass(this.div, "olMap"); this.viewPortDiv.parentNode.removeChild(this.viewPortDiv); this.div.appendChild(this.viewPortDiv); this.updateSize() }, unloadDestroy: null, updateSizeDestroy: null, destroy: function() {
+ if (!this.unloadDestroy) return !1; this.panTween && (this.panTween.stop(), this.panTween = null); this.zoomTween && (this.zoomTween.stop(),
+ this.zoomTween = null); OpenLayers.Event.stopObserving(window, "unload", this.unloadDestroy); this.unloadDestroy = null; this.updateSizeDestroy && OpenLayers.Event.stopObserving(window, "resize", this.updateSizeDestroy); this.paddingForPopups = null; if (null != this.controls) { for (var a = this.controls.length - 1; 0 <= a; --a)this.controls[a].destroy(); this.controls = null } if (null != this.layers) { for (a = this.layers.length - 1; 0 <= a; --a)this.layers[a].destroy(!1); this.layers = null } this.viewPortDiv && this.viewPortDiv.parentNode && this.viewPortDiv.parentNode.removeChild(this.viewPortDiv);
+ this.viewPortDiv = null; this.tileManager && (this.tileManager.removeMap(this), this.tileManager = null); this.eventListeners && (this.events.un(this.eventListeners), this.eventListeners = null); this.events.destroy(); this.options = this.events = null
+ }, setOptions: function(a) { var b = this.minPx && a.restrictedExtent != this.restrictedExtent; OpenLayers.Util.extend(this, a); b && this.moveTo(this.getCachedCenter(), this.zoom, { forceZoomChange: !0 }) }, getTileSize: function() { return this.tileSize }, getBy: function(a, b, c) {
+ var d = "function" ==
+ typeof c.test; return OpenLayers.Array.filter(this[a], function(a) { return a[b] == c || d && c.test(a[b]) })
+ }, getLayersBy: function(a, b) { return this.getBy("layers", a, b) }, getLayersByName: function(a) { return this.getLayersBy("name", a) }, getLayersByClass: function(a) { return this.getLayersBy("CLASS_NAME", a) }, getControlsBy: function(a, b) { return this.getBy("controls", a, b) }, getControlsByClass: function(a) { return this.getControlsBy("CLASS_NAME", a) }, getLayer: function(a) {
+ for (var b = null, c = 0, d = this.layers.length; c < d; c++) {
+ var e =
+ this.layers[c]; if (e.id == a) { b = e; break }
+ } return b
+ }, setLayerZIndex: function(a, b) { a.setZIndex(this.Z_INDEX_BASE[a.isBaseLayer ? "BaseLayer" : "Overlay"] + 5 * b) }, resetLayersZIndex: function() { for (var a = 0, b = this.layers.length; a < b; a++)this.setLayerZIndex(this.layers[a], a) }, addLayer: function(a) {
+ for (var b = 0, c = this.layers.length; b < c; b++)if (this.layers[b] == a) return !1; if (!1 === this.events.triggerEvent("preaddlayer", { layer: a })) return !1; this.allOverlays && (a.isBaseLayer = !1); a.div.className = "olLayerDiv"; a.div.style.overflow =
+ ""; this.setLayerZIndex(a, this.layers.length); a.isFixed ? this.viewPortDiv.appendChild(a.div) : this.layerContainerDiv.appendChild(a.div); this.layers.push(a); a.setMap(this); a.isBaseLayer || this.allOverlays && !this.baseLayer ? null == this.baseLayer ? this.setBaseLayer(a) : a.setVisibility(!1) : a.redraw(); this.events.triggerEvent("addlayer", { layer: a }); a.events.triggerEvent("added", { map: this, layer: a }); a.afterAdd(); return !0
+ }, addLayers: function(a) { for (var b = 0, c = a.length; b < c; b++)this.addLayer(a[b]) }, removeLayer: function(a,
+ b) {
+ if (!1 !== this.events.triggerEvent("preremovelayer", { layer: a })) {
+ null == b && (b = !0); a.isFixed ? this.viewPortDiv.removeChild(a.div) : this.layerContainerDiv.removeChild(a.div); OpenLayers.Util.removeItem(this.layers, a); a.removeMap(this); a.map = null; if (this.baseLayer == a && (this.baseLayer = null, b)) for (var c = 0, d = this.layers.length; c < d; c++) { var e = this.layers[c]; if (e.isBaseLayer || this.allOverlays) { this.setBaseLayer(e); break } } this.resetLayersZIndex(); this.events.triggerEvent("removelayer", { layer: a }); a.events.triggerEvent("removed",
+ { map: this, layer: a })
+ }
+ }, getNumLayers: function() { return this.layers.length }, getLayerIndex: function(a) { return OpenLayers.Util.indexOf(this.layers, a) }, setLayerIndex: function(a, b) {
+ var c = this.getLayerIndex(a); 0 > b ? b = 0 : b > this.layers.length && (b = this.layers.length); if (c != b) {
+ this.layers.splice(c, 1); this.layers.splice(b, 0, a); for (var c = 0, d = this.layers.length; c < d; c++)this.setLayerZIndex(this.layers[c], c); this.events.triggerEvent("changelayer", { layer: a, property: "order" }); this.allOverlays && (0 === b ? this.setBaseLayer(a) :
+ this.baseLayer !== this.layers[0] && this.setBaseLayer(this.layers[0]))
+ }
+ }, raiseLayer: function(a, b) { var c = this.getLayerIndex(a) + b; this.setLayerIndex(a, c) }, setBaseLayer: function(a) {
+ if (a != this.baseLayer && -1 != OpenLayers.Util.indexOf(this.layers, a)) {
+ var b = this.getCachedCenter(), c = OpenLayers.Util.getResolutionFromScale(this.getScale(), a.units); null == this.baseLayer || this.allOverlays || this.baseLayer.setVisibility(!1); this.baseLayer = a; if (!this.allOverlays || this.baseLayer.visibility) this.baseLayer.setVisibility(!0),
+ !1 === this.baseLayer.inRange && this.baseLayer.redraw(); null != b && (a = this.getZoomForResolution(c || this.resolution, !0), this.setCenter(b, a, !1, !0)); this.events.triggerEvent("changebaselayer", { layer: this.baseLayer })
+ }
+ }, addControl: function(a, b) { this.controls.push(a); this.addControlToMap(a, b) }, addControls: function(a, b) { for (var c = 1 === arguments.length ? [] : b, d = 0, e = a.length; d < e; d++)this.addControl(a[d], c[d] ? c[d] : null) }, addControlToMap: function(a, b) {
+ a.outsideViewport = null != a.div; this.displayProjection && !a.displayProjection &&
+ (a.displayProjection = this.displayProjection); a.setMap(this); var c = a.draw(b); c && !a.outsideViewport && (c.style.zIndex = this.Z_INDEX_BASE.Control + this.controls.length, this.viewPortDiv.appendChild(c)); a.autoActivate && a.activate()
+ }, getControl: function(a) { for (var b = null, c = 0, d = this.controls.length; c < d; c++) { var e = this.controls[c]; if (e.id == a) { b = e; break } } return b }, removeControl: function(a) {
+ a && a == this.getControl(a.id) && (a.div && a.div.parentNode == this.viewPortDiv && this.viewPortDiv.removeChild(a.div), OpenLayers.Util.removeItem(this.controls,
+ a))
+ }, addPopup: function(a, b) { if (b) for (var c = this.popups.length - 1; 0 <= c; --c)this.removePopup(this.popups[c]); a.map = this; this.popups.push(a); if (c = a.draw()) c.style.zIndex = this.Z_INDEX_BASE.Popup + this.popups.length, this.layerContainerDiv.appendChild(c) }, removePopup: function(a) { OpenLayers.Util.removeItem(this.popups, a); if (a.div) try { this.layerContainerDiv.removeChild(a.div) } catch (b) { } a.map = null }, getSize: function() { var a = null; null != this.size && (a = this.size.clone()); return a }, updateSize: function() {
+ var a = this.getCurrentSize();
+ if (a && !isNaN(a.h) && !isNaN(a.w)) { this.events.clearMouseCache(); var b = this.getSize(); null == b && (this.size = b = a); if (!a.equals(b)) { this.size = a; a = 0; for (b = this.layers.length; a < b; a++)this.layers[a].onMapResize(); a = this.getCachedCenter(); null != this.baseLayer && null != a && (b = this.getZoom(), this.zoom = null, this.setCenter(a, b)) } } this.events.triggerEvent("updatesize")
+ }, getCurrentSize: function() {
+ var a = new OpenLayers.Size(this.div.clientWidth, this.div.clientHeight); if (0 == a.w && 0 == a.h || isNaN(a.w) && isNaN(a.h)) a.w = this.div.offsetWidth,
+ a.h = this.div.offsetHeight; if (0 == a.w && 0 == a.h || isNaN(a.w) && isNaN(a.h)) a.w = parseInt(this.div.style.width), a.h = parseInt(this.div.style.height); return a
+ }, calculateBounds: function(a, b) { var c = null; null == a && (a = this.getCachedCenter()); null == b && (b = this.getResolution()); if (null != a && null != b) var c = this.size.w * b / 2, d = this.size.h * b / 2, c = new OpenLayers.Bounds(a.lon - c, a.lat - d, a.lon + c, a.lat + d); return c }, getCenter: function() { var a = null, b = this.getCachedCenter(); b && (a = b.clone()); return a }, getCachedCenter: function() {
+ !this.center &&
+ this.size && (this.center = this.getLonLatFromViewPortPx({ x: this.size.w / 2, y: this.size.h / 2 })); return this.center
+ }, getZoom: function() { return this.zoom }, pan: function(a, b, c) { c = OpenLayers.Util.applyDefaults(c, { animate: !0, dragging: !1 }); if (c.dragging) 0 == a && 0 == b || this.moveByPx(a, b); else { var d = this.getViewPortPxFromLonLat(this.getCachedCenter()); a = d.add(a, b); if (this.dragging || !a.equals(d)) d = this.getLonLatFromViewPortPx(a), c.animate ? this.panTo(d) : (this.moveTo(d), this.dragging && (this.dragging = !1, this.events.triggerEvent("moveend"))) } },
+ panTo: function(a) {
+ if (this.panTween && this.getExtent().scale(this.panRatio).containsLonLat(a)) {
+ var b = this.getCachedCenter(); if (!a.equals(b)) {
+ var b = this.getPixelFromLonLat(b), c = this.getPixelFromLonLat(a), d = 0, e = 0; this.panTween.start({ x: 0, y: 0 }, { x: c.x - b.x, y: c.y - b.y }, this.panDuration, {
+ callbacks: {
+ eachStep: OpenLayers.Function.bind(function(a) { this.moveByPx(a.x - d, a.y - e); d = Math.round(a.x); e = Math.round(a.y) }, this), done: OpenLayers.Function.bind(function(b) { this.moveTo(a); this.dragging = !1; this.events.triggerEvent("moveend") },
+ this)
+ }
+ })
+ }
+ } else this.setCenter(a)
+ }, setCenter: function(a, b, c, d) { this.panTween && this.panTween.stop(); this.zoomTween && this.zoomTween.stop(); this.moveTo(a, b, { dragging: c, forceZoomChange: d }) }, moveByPx: function(a, b) {
+ var c = this.size.w / 2, d = this.size.h / 2, e = c + a, f = d + b, g = this.baseLayer.wrapDateLine, h = 0, k = 0; this.restrictedExtent && (h = c, k = d, g = !1); a = g || e <= this.maxPx.x - h && e >= this.minPx.x + h ? Math.round(a) : 0; b = f <= this.maxPx.y - k && f >= this.minPx.y + k ? Math.round(b) : 0; if (a || b) {
+ this.dragging || (this.dragging = !0, this.events.triggerEvent("movestart"));
+ this.center = null; a && (this.layerContainerOriginPx.x -= a, this.minPx.x -= a, this.maxPx.x -= a); b && (this.layerContainerOriginPx.y -= b, this.minPx.y -= b, this.maxPx.y -= b); this.applyTransform(); d = 0; for (e = this.layers.length; d < e; ++d)c = this.layers[d], c.visibility && (c === this.baseLayer || c.inRange) && (c.moveByPx(a, b), c.events.triggerEvent("move")); this.events.triggerEvent("move")
+ }
+ }, adjustZoom: function(a) {
+ if (this.baseLayer && this.baseLayer.wrapDateLine) {
+ var b = this.baseLayer.resolutions, c = this.getMaxExtent().getWidth() / this.size.w;
+ if (this.getResolutionForZoom(a) > c) if (this.fractionalZoom) a = this.getZoomForResolution(c); else for (var d = a | 0, e = b.length; d < e; ++d)if (b[d] <= c) { a = d; break }
+ } return a
+ }, getMinZoom: function() { return this.adjustZoom(0) }, moveTo: function(a, b, c) {
+ null == a || a instanceof OpenLayers.LonLat || (a = new OpenLayers.LonLat(a)); c || (c = {}); null != b && (b = parseFloat(b), this.fractionalZoom || (b = Math.round(b))); var d = b; b = this.adjustZoom(b); b !== d && (a = this.getCenter()); var d = c.dragging || this.dragging, e = c.forceZoomChange; this.getCachedCenter() ||
+ this.isValidLonLat(a) || (a = this.maxExtent.getCenterLonLat(), this.center = a.clone()); if (null != this.restrictedExtent) {
+ null == a && (a = this.center); null == b && (b = this.getZoom()); var f = this.getResolutionForZoom(b), f = this.calculateBounds(a, f); if (!this.restrictedExtent.containsBounds(f)) {
+ var g = this.restrictedExtent.getCenterLonLat(); f.getWidth() > this.restrictedExtent.getWidth() ? a = new OpenLayers.LonLat(g.lon, a.lat) : f.left < this.restrictedExtent.left ? a = a.add(this.restrictedExtent.left - f.left, 0) : f.right > this.restrictedExtent.right &&
+ (a = a.add(this.restrictedExtent.right - f.right, 0)); f.getHeight() > this.restrictedExtent.getHeight() ? a = new OpenLayers.LonLat(a.lon, g.lat) : f.bottom < this.restrictedExtent.bottom ? a = a.add(0, this.restrictedExtent.bottom - f.bottom) : f.top > this.restrictedExtent.top && (a = a.add(0, this.restrictedExtent.top - f.top))
+ }
+ } e = e || this.isValidZoomLevel(b) && b != this.getZoom(); f = this.isValidLonLat(a) && !a.equals(this.center); if (e || f || d) {
+ d || this.events.triggerEvent("movestart", { zoomChanged: e }); f && (!e && this.center && this.centerLayerContainer(a),
+ this.center = a.clone()); a = e ? this.getResolutionForZoom(b) : this.getResolution(); if (e || null == this.layerContainerOrigin) {
+ this.layerContainerOrigin = this.getCachedCenter(); this.layerContainerOriginPx.x = 0; this.layerContainerOriginPx.y = 0; this.applyTransform(); var f = this.getMaxExtent({ restricted: !0 }), h = f.getCenterLonLat(), g = this.center.lon - h.lon, h = h.lat - this.center.lat, k = Math.round(f.getWidth() / a), l = Math.round(f.getHeight() / a); this.minPx = { x: (this.size.w - k) / 2 - g / a, y: (this.size.h - l) / 2 - h / a }; this.maxPx = {
+ x: this.minPx.x +
+ Math.round(f.getWidth() / a), y: this.minPx.y + Math.round(f.getHeight() / a)
+ }
+ } e && (this.zoom = b, this.resolution = a); a = this.getExtent(); this.baseLayer.visibility && (this.baseLayer.moveTo(a, e, c.dragging), c.dragging || this.baseLayer.events.triggerEvent("moveend", { zoomChanged: e })); a = this.baseLayer.getExtent(); for (b = this.layers.length - 1; 0 <= b; --b)f = this.layers[b], f === this.baseLayer || f.isBaseLayer || (g = f.calculateInRange(), f.inRange != g && ((f.inRange = g) || f.display(!1), this.events.triggerEvent("changelayer", { layer: f, property: "visibility" })),
+ g && f.visibility && (f.moveTo(a, e, c.dragging), c.dragging || f.events.triggerEvent("moveend", { zoomChanged: e }))); this.events.triggerEvent("move"); d || this.events.triggerEvent("moveend"); if (e) { b = 0; for (c = this.popups.length; b < c; b++)this.popups[b].updatePosition(); this.events.triggerEvent("zoomend") }
+ }
+ }, centerLayerContainer: function(a) {
+ var b = this.getViewPortPxFromLonLat(this.layerContainerOrigin), c = this.getViewPortPxFromLonLat(a); if (null != b && null != c) {
+ var d = this.layerContainerOriginPx.x; a = this.layerContainerOriginPx.y;
+ var e = Math.round(b.x - c.x), b = Math.round(b.y - c.y); this.applyTransform(this.layerContainerOriginPx.x = e, this.layerContainerOriginPx.y = b); d -= e; a -= b; this.minPx.x -= d; this.maxPx.x -= d; this.minPx.y -= a; this.maxPx.y -= a
+ }
+ }, isValidZoomLevel: function(a) { return null != a && 0 <= a && a < this.getNumZoomLevels() }, isValidLonLat: function(a) { var b = !1; null != a && (b = this.getMaxExtent(), b = b.containsLonLat(a, { worldBounds: this.baseLayer.wrapDateLine && b })); return b }, getProjection: function() {
+ var a = this.getProjectionObject(); return a ? a.getCode() :
+ null
+ }, getProjectionObject: function() { var a = null; null != this.baseLayer && (a = this.baseLayer.projection); return a }, getMaxResolution: function() { var a = null; null != this.baseLayer && (a = this.baseLayer.maxResolution); return a }, getMaxExtent: function(a) { var b = null; a && a.restricted && this.restrictedExtent ? b = this.restrictedExtent : null != this.baseLayer && (b = this.baseLayer.maxExtent); return b }, getNumZoomLevels: function() { var a = null; null != this.baseLayer && (a = this.baseLayer.numZoomLevels); return a }, getExtent: function() {
+ var a =
+ null; null != this.baseLayer && (a = this.baseLayer.getExtent()); return a
+ }, getResolution: function() { var a = null; null != this.baseLayer ? a = this.baseLayer.getResolution() : !0 === this.allOverlays && 0 < this.layers.length && (a = this.layers[0].getResolution()); return a }, getUnits: function() { var a = null; null != this.baseLayer && (a = this.baseLayer.units); return a }, getScale: function() { var a = null; null != this.baseLayer && (a = this.getResolution(), a = OpenLayers.Util.getScaleFromResolution(a, this.baseLayer.units)); return a }, getZoomForExtent: function(a,
+ b) { var c = null; null != this.baseLayer && (c = this.baseLayer.getZoomForExtent(a, b)); return c }, getResolutionForZoom: function(a) { var b = null; this.baseLayer && (b = this.baseLayer.getResolutionForZoom(a)); return b }, getZoomForResolution: function(a, b) { var c = null; null != this.baseLayer && (c = this.baseLayer.getZoomForResolution(a, b)); return c }, zoomTo: function(a, b) {
+ var c = this; if (c.isValidZoomLevel(a)) if (c.baseLayer.wrapDateLine && (a = c.adjustZoom(a)), c.zoomTween) {
+ var d = c.getResolution(), e = c.getResolutionForZoom(a), f = { scale: 1 },
+ d = { scale: d / e }; c.zoomTween.playing && c.zoomTween.duration < 3 * c.zoomDuration ? c.zoomTween.finish = { scale: c.zoomTween.finish.scale * d.scale } : (b || (e = c.getSize(), b = { x: e.w / 2, y: e.h / 2 }), c.zoomTween.start(f, d, c.zoomDuration, {
+ minFrameRate: 50, callbacks: {
+ eachStep: function(a) { var d = c.layerContainerOriginPx; a = a.scale; c.applyTransform(d.x + ((a - 1) * (d.x - b.x) | 0), d.y + ((a - 1) * (d.y - b.y) | 0), a) }, done: function(a) {
+ c.applyTransform(); a = c.getResolution() / a.scale; var d = c.getZoomForResolution(a, !0); c.moveTo(c.getZoomTargetCenter(b,
+ a), d, !0)
+ }
+ }
+ }))
+ } else f = b ? c.getZoomTargetCenter(b, c.getResolutionForZoom(a)) : null, c.setCenter(f, a)
+ }, zoomIn: function() { this.zoomTo(this.getZoom() + 1) }, zoomOut: function() { this.zoomTo(this.getZoom() - 1) }, zoomToExtent: function(a, b) { a instanceof OpenLayers.Bounds || (a = new OpenLayers.Bounds(a)); var c = a.getCenterLonLat(); if (this.baseLayer.wrapDateLine) { c = this.getMaxExtent(); for (a = a.clone(); a.right < a.left;)a.right += c.getWidth(); c = a.getCenterLonLat().wrapDateLine(c) } this.setCenter(c, this.getZoomForExtent(a, b)) },
+ zoomToMaxExtent: function(a) { a = this.getMaxExtent({ restricted: a ? a.restricted : !0 }); this.zoomToExtent(a) }, zoomToScale: function(a, b) { var c = OpenLayers.Util.getResolutionFromScale(a, this.baseLayer.units), d = this.size.w * c / 2, c = this.size.h * c / 2, e = this.getCachedCenter(), d = new OpenLayers.Bounds(e.lon - d, e.lat - c, e.lon + d, e.lat + c); this.zoomToExtent(d, b) }, getLonLatFromViewPortPx: function(a) { var b = null; null != this.baseLayer && (b = this.baseLayer.getLonLatFromViewPortPx(a)); return b }, getViewPortPxFromLonLat: function(a) {
+ var b =
+ null; null != this.baseLayer && (b = this.baseLayer.getViewPortPxFromLonLat(a)); return b
+ }, getZoomTargetCenter: function(a, b) { var c = null, d = this.getSize(), e = d.w / 2 - a.x, d = a.y - d.h / 2, f = this.getLonLatFromPixel(a); f && (c = new OpenLayers.LonLat(f.lon + e * b, f.lat + d * b)); return c }, getLonLatFromPixel: function(a) { return this.getLonLatFromViewPortPx(a) }, getPixelFromLonLat: function(a) { a = this.getViewPortPxFromLonLat(a); a.x = Math.round(a.x); a.y = Math.round(a.y); return a }, getGeodesicPixelSize: function(a) {
+ var b = a ? this.getLonLatFromPixel(a) :
+ this.getCachedCenter() || new OpenLayers.LonLat(0, 0), c = this.getResolution(); a = b.add(-c / 2, 0); var d = b.add(c / 2, 0), e = b.add(0, -c / 2), b = b.add(0, c / 2), c = new OpenLayers.Projection("EPSG:4326"), f = this.getProjectionObject() || c; f.equals(c) || (a.transform(f, c), d.transform(f, c), e.transform(f, c), b.transform(f, c)); return new OpenLayers.Size(OpenLayers.Util.distVincenty(a, d), OpenLayers.Util.distVincenty(e, b))
+ }, getViewPortPxFromLayerPx: function(a) {
+ var b = null; null != a && (b = a.add(this.layerContainerOriginPx.x, this.layerContainerOriginPx.y));
+ return b
+ }, getLayerPxFromViewPortPx: function(a) { var b = null; null != a && (b = a.add(-this.layerContainerOriginPx.x, -this.layerContainerOriginPx.y), isNaN(b.x) || isNaN(b.y)) && (b = null); return b }, getLonLatFromLayerPx: function(a) { a = this.getViewPortPxFromLayerPx(a); return this.getLonLatFromViewPortPx(a) }, getLayerPxFromLonLat: function(a) { a = this.getPixelFromLonLat(a); return this.getLayerPxFromViewPortPx(a) }, applyTransform: function(a, b, c) {
+ c = c || 1; var d = this.layerContainerOriginPx, e = 1 !== c; a = a || d.x; b = b || d.y; var f = this.layerContainerDiv.style,
+ g = this.applyTransform.transform, h = this.applyTransform.template; if (void 0 === g && (g = OpenLayers.Util.vendorPrefix.style("transform"), this.applyTransform.transform = g)) { var k = OpenLayers.Element.getStyle(this.viewPortDiv, OpenLayers.Util.vendorPrefix.css("transform")); k && "none" === k || (h = ["translate3d(", ",0) ", "scale3d(", ",1)"], f[g] = [h[0], "0,0", h[1]].join("")); h && ~f[g].indexOf(h[0]) || (h = ["translate(", ") ", "scale(", ")"]); this.applyTransform.template = h } null === g || "translate3d(" !== h[0] && !0 !== e ? (f.left = a + "px", f.top =
+ b + "px", null !== g && (f[g] = "")) : (!0 === e && "translate(" === h[0] && (a -= d.x, b -= d.y, f.left = d.x + "px", f.top = d.y + "px"), f[g] = [h[0], a, "px,", b, "px", h[1], h[2], c, ",", c, h[3]].join(""))
+ }, CLASS_NAME: "OpenLayers.Map"
+}); OpenLayers.Map.TILE_WIDTH = 256; OpenLayers.Map.TILE_HEIGHT = 256;
+OpenLayers.Handler = OpenLayers.Class({
+ id: null, control: null, map: null, keyMask: null, active: !1, evt: null, touch: !1, initialize: function(a, b, c) { OpenLayers.Util.extend(this, c); this.control = a; this.callbacks = b; (a = this.map || a.map) && this.setMap(a); this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_") }, setMap: function(a) { this.map = a }, checkModifiers: function(a) {
+ return null == this.keyMask ? !0 : ((a.shiftKey ? OpenLayers.Handler.MOD_SHIFT : 0) | (a.ctrlKey ? OpenLayers.Handler.MOD_CTRL : 0) | (a.altKey ? OpenLayers.Handler.MOD_ALT :
+ 0) | (a.metaKey ? OpenLayers.Handler.MOD_META : 0)) == this.keyMask
+ }, activate: function() { if (this.active) return !1; for (var a = OpenLayers.Events.prototype.BROWSER_EVENTS, b = 0, c = a.length; b < c; b++)this[a[b]] && this.register(a[b], this[a[b]]); return this.active = !0 }, deactivate: function() { if (!this.active) return !1; for (var a = OpenLayers.Events.prototype.BROWSER_EVENTS, b = 0, c = a.length; b < c; b++)this[a[b]] && this.unregister(a[b], this[a[b]]); this.active = this.touch = !1; return !0 }, startTouch: function() {
+ if (!this.touch) {
+ this.touch = !0;
+ for (var a = "mousedown mouseup mousemove click dblclick mouseout".split(" "), b = 0, c = a.length; b < c; b++)this[a[b]] && this.unregister(a[b], this[a[b]])
+ }
+ }, callback: function(a, b) { a && this.callbacks[a] && this.callbacks[a].apply(this.control, b) }, register: function(a, b) { this.map.events.registerPriority(a, this, b); this.map.events.registerPriority(a, this, this.setEvent) }, unregister: function(a, b) { this.map.events.unregister(a, this, b); this.map.events.unregister(a, this, this.setEvent) }, setEvent: function(a) { this.evt = a; return !0 },
+ destroy: function() { this.deactivate(); this.control = this.map = null }, CLASS_NAME: "OpenLayers.Handler"
+}); OpenLayers.Handler.MOD_NONE = 0; OpenLayers.Handler.MOD_SHIFT = 1; OpenLayers.Handler.MOD_CTRL = 2; OpenLayers.Handler.MOD_ALT = 4; OpenLayers.Handler.MOD_META = 8;
+OpenLayers.Handler.Click = OpenLayers.Class(OpenLayers.Handler, {
+ delay: 300, single: !0, "double": !1, pixelTolerance: 0, dblclickTolerance: 13, stopSingle: !1, stopDouble: !1, timerId: null, down: null, last: null, first: null, rightclickTimerId: null, touchstart: function(a) { this.startTouch(); this.down = this.getEventInfo(a); this.last = this.getEventInfo(a); return !0 }, touchmove: function(a) { this.last = this.getEventInfo(a); return !0 }, touchend: function(a) {
+ this.down && (a.xy = this.last.xy, a.lastTouches = this.last.touches, this.handleSingle(a),
+ this.down = null); return !0
+ }, mousedown: function(a) { this.down = this.getEventInfo(a); this.last = this.getEventInfo(a); return !0 }, mouseup: function(a) { var b = !0; this.checkModifiers(a) && this.control.handleRightClicks && OpenLayers.Event.isRightClick(a) && (b = this.rightclick(a)); return b }, rightclick: function(a) {
+ if (this.passesTolerance(a)) {
+ if (null != this.rightclickTimerId) return this.clearTimer(), this.callback("dblrightclick", [a]), !this.stopDouble; a = this["double"] ? OpenLayers.Util.extend({}, a) : this.callback("rightclick",
+ [a]); a = OpenLayers.Function.bind(this.delayedRightCall, this, a); this.rightclickTimerId = window.setTimeout(a, this.delay)
+ } return !this.stopSingle
+ }, delayedRightCall: function(a) { this.rightclickTimerId = null; a && this.callback("rightclick", [a]) }, click: function(a) { this.last || (this.last = this.getEventInfo(a)); this.handleSingle(a); return !this.stopSingle }, dblclick: function(a) { this.handleDouble(a); return !this.stopDouble }, handleDouble: function(a) {
+ this.passesDblclickTolerance(a) && (this["double"] && this.callback("dblclick",
+ [a]), this.clearTimer())
+ }, handleSingle: function(a) { this.passesTolerance(a) && (null != this.timerId ? (this.last.touches && 1 === this.last.touches.length && (this["double"] && OpenLayers.Event.preventDefault(a), this.handleDouble(a)), this.last.touches && 2 === this.last.touches.length || this.clearTimer()) : (this.first = this.getEventInfo(a), a = this.single ? OpenLayers.Util.extend({}, a) : null, this.queuePotentialClick(a))) }, queuePotentialClick: function(a) {
+ this.timerId = window.setTimeout(OpenLayers.Function.bind(this.delayedCall,
+ this, a), this.delay)
+ }, passesTolerance: function(a) { var b = !0; if (null != this.pixelTolerance && this.down && this.down.xy && (b = this.pixelTolerance >= this.down.xy.distanceTo(a.xy)) && this.touch && this.down.touches.length === this.last.touches.length) { a = 0; for (var c = this.down.touches.length; a < c; ++a)if (this.getTouchDistance(this.down.touches[a], this.last.touches[a]) > this.pixelTolerance) { b = !1; break } } return b }, getTouchDistance: function(a, b) {
+ return Math.sqrt(Math.pow(a.clientX - b.clientX, 2) + Math.pow(a.clientY - b.clientY,
+ 2))
+ }, passesDblclickTolerance: function(a) { a = !0; this.down && this.first && (a = this.down.xy.distanceTo(this.first.xy) <= this.dblclickTolerance); return a }, clearTimer: function() { null != this.timerId && (window.clearTimeout(this.timerId), this.timerId = null); null != this.rightclickTimerId && (window.clearTimeout(this.rightclickTimerId), this.rightclickTimerId = null) }, delayedCall: function(a) { this.timerId = null; a && this.callback("click", [a]) }, getEventInfo: function(a) {
+ var b; if (a.touches) {
+ var c = a.touches.length; b = Array(c); for (var d,
+ e = 0; e < c; e++)d = a.touches[e], b[e] = { clientX: d.olClientX, clientY: d.olClientY }
+ } return { xy: a.xy, touches: b }
+ }, deactivate: function() { var a = !1; OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.clearTimer(), this.last = this.first = this.down = null, a = !0); return a }, CLASS_NAME: "OpenLayers.Handler.Click"
+});
+OpenLayers.Handler.Drag = OpenLayers.Class(OpenLayers.Handler, {
+ started: !1, stopDown: !0, dragging: !1, last: null, start: null, lastMoveEvt: null, oldOnselectstart: null, interval: 0, timeoutId: null, documentDrag: !1, documentEvents: null, initialize: function(a, b, c) { OpenLayers.Handler.prototype.initialize.apply(this, arguments); if (!0 === this.documentDrag) { var d = this; this._docMove = function(a) { d.mousemove({ xy: { x: a.clientX, y: a.clientY }, element: document }) }; this._docUp = function(a) { d.mouseup({ xy: { x: a.clientX, y: a.clientY } }) } } },
+ dragstart: function(a) {
+ var b = !0; this.dragging = !1; this.checkModifiers(a) && (OpenLayers.Event.isLeftClick(a) || OpenLayers.Event.isSingleTouch(a)) ? (this.started = !0, this.last = this.start = a.xy, OpenLayers.Element.addClass(this.map.viewPortDiv, "olDragDown"), this.down(a), this.callback("down", [a.xy]), OpenLayers.Event.preventDefault(a), this.oldOnselectstart || (this.oldOnselectstart = document.onselectstart ? document.onselectstart : OpenLayers.Function.True), document.onselectstart = OpenLayers.Function.False, b = !this.stopDown) :
+ (this.started = !1, this.last = this.start = null); return b
+ }, dragmove: function(a) {
+ this.lastMoveEvt = a; !this.started || this.timeoutId || a.xy.x == this.last.x && a.xy.y == this.last.y || (!0 === this.documentDrag && this.documentEvents && (a.element === document ? (this.adjustXY(a), this.setEvent(a)) : this.removeDocumentEvents()), 0 < this.interval && (this.timeoutId = setTimeout(OpenLayers.Function.bind(this.removeTimeout, this), this.interval)), this.dragging = !0, this.move(a), this.callback("move", [a.xy]), this.oldOnselectstart || (this.oldOnselectstart =
+ document.onselectstart, document.onselectstart = OpenLayers.Function.False), this.last = a.xy); return !0
+ }, dragend: function(a) { if (this.started) { !0 === this.documentDrag && this.documentEvents && (this.adjustXY(a), this.removeDocumentEvents()); var b = this.start != this.last; this.dragging = this.started = !1; OpenLayers.Element.removeClass(this.map.viewPortDiv, "olDragDown"); this.up(a); this.callback("up", [a.xy]); b && this.callback("done", [a.xy]); document.onselectstart = this.oldOnselectstart } return !0 }, down: function(a) { }, move: function(a) { },
+ up: function(a) { }, out: function(a) { }, mousedown: function(a) { return this.dragstart(a) }, touchstart: function(a) { this.startTouch(); return this.dragstart(a) }, mousemove: function(a) { return this.dragmove(a) }, touchmove: function(a) { return this.dragmove(a) }, removeTimeout: function() { this.timeoutId = null; this.dragging && this.mousemove(this.lastMoveEvt) }, mouseup: function(a) { return this.dragend(a) }, touchend: function(a) { a.xy = this.last; return this.dragend(a) }, mouseout: function(a) {
+ if (this.started && OpenLayers.Util.mouseLeft(a,
+ this.map.viewPortDiv)) if (!0 === this.documentDrag) this.addDocumentEvents(); else { var b = this.start != this.last; this.dragging = this.started = !1; OpenLayers.Element.removeClass(this.map.viewPortDiv, "olDragDown"); this.out(a); this.callback("out", []); b && this.callback("done", [a.xy]); document.onselectstart && (document.onselectstart = this.oldOnselectstart) } return !0
+ }, click: function(a) { return this.start == this.last }, activate: function() {
+ var a = !1; OpenLayers.Handler.prototype.activate.apply(this, arguments) && (this.dragging =
+ !1, a = !0); return a
+ }, deactivate: function() { var a = !1; OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.dragging = this.started = !1, this.last = this.start = null, a = !0, OpenLayers.Element.removeClass(this.map.viewPortDiv, "olDragDown")); return a }, adjustXY: function(a) { var b = OpenLayers.Util.pagePosition(this.map.viewPortDiv); a.xy.x -= b[0]; a.xy.y -= b[1] }, addDocumentEvents: function() {
+ OpenLayers.Element.addClass(document.body, "olDragDown"); this.documentEvents = !0; OpenLayers.Event.observe(document, "mousemove",
+ this._docMove); OpenLayers.Event.observe(document, "mouseup", this._docUp)
+ }, removeDocumentEvents: function() { OpenLayers.Element.removeClass(document.body, "olDragDown"); this.documentEvents = !1; OpenLayers.Event.stopObserving(document, "mousemove", this._docMove); OpenLayers.Event.stopObserving(document, "mouseup", this._docUp) }, CLASS_NAME: "OpenLayers.Handler.Drag"
+});
+OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, {
+ element: null, ovmap: null, size: { w: 180, h: 90 }, layers: null, minRectSize: 15, minRectDisplayClass: "RectReplacement", minRatio: 8, maxRatio: 32, mapOptions: null, autoPan: !1, handlers: null, resolutionFactor: 1, maximized: !1, maximizeTitle: "", minimizeTitle: "", initialize: function(a) { this.layers = []; this.handlers = {}; OpenLayers.Control.prototype.initialize.apply(this, [a]) }, destroy: function() {
+ this.mapDiv && (this.handlers.click && this.handlers.click.destroy(),
+ this.handlers.drag && this.handlers.drag.destroy(), this.ovmap && this.ovmap.viewPortDiv.removeChild(this.extentRectangle), this.extentRectangle = null, this.rectEvents && (this.rectEvents.destroy(), this.rectEvents = null), this.ovmap && (this.ovmap.destroy(), this.ovmap = null), this.element.removeChild(this.mapDiv), this.mapDiv = null, this.div.removeChild(this.element), this.element = null, this.maximizeDiv && (this.div.removeChild(this.maximizeDiv), this.maximizeDiv = null), this.minimizeDiv && (this.div.removeChild(this.minimizeDiv),
+ this.minimizeDiv = null), this.map.events.un({ buttonclick: this.onButtonClick, moveend: this.update, changebaselayer: this.baseLayerDraw, scope: this }), OpenLayers.Control.prototype.destroy.apply(this, arguments))
+ }, draw: function() {
+ OpenLayers.Control.prototype.draw.apply(this, arguments); if (0 === this.layers.length) if (this.map.baseLayer) this.layers = [this.map.baseLayer.clone()]; else return this.map.events.register("changebaselayer", this, this.baseLayerDraw), this.div; this.element = document.createElement("div"); this.element.className =
+ this.displayClass + "Element"; this.element.style.display = "none"; this.mapDiv = document.createElement("div"); this.mapDiv.style.width = this.size.w + "px"; this.mapDiv.style.height = this.size.h + "px"; this.mapDiv.style.position = "relative"; this.mapDiv.style.overflow = "hidden"; this.mapDiv.id = OpenLayers.Util.createUniqueID("overviewMap"); this.extentRectangle = document.createElement("div"); this.extentRectangle.style.position = "absolute"; this.extentRectangle.style.zIndex = 1E3; this.extentRectangle.className = this.displayClass +
+ "ExtentRectangle"; this.element.appendChild(this.mapDiv); this.div.appendChild(this.element); if (this.outsideViewport) this.element.style.display = ""; else {
+ this.div.className += " " + this.displayClass + "Container"; var a = OpenLayers.Util.getImageLocation("layer-switcher-maximize.png"); this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv(this.displayClass + "MaximizeButton", null, null, a, "absolute"); this.maximizeDiv.style.display = "none"; this.maximizeDiv.className = this.displayClass + "MaximizeButton olButton"; this.maximizeTitle &&
+ (this.maximizeDiv.title = this.maximizeTitle); this.div.appendChild(this.maximizeDiv); a = OpenLayers.Util.getImageLocation("layer-switcher-minimize.png"); this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_minimizeDiv", null, null, a, "absolute"); this.minimizeDiv.style.display = "none"; this.minimizeDiv.className = this.displayClass + "MinimizeButton olButton"; this.minimizeTitle && (this.minimizeDiv.title = this.minimizeTitle); this.div.appendChild(this.minimizeDiv); this.minimizeControl()
+ } this.map.getExtent() &&
+ this.update(); this.map.events.on({ buttonclick: this.onButtonClick, moveend: this.update, scope: this }); this.maximized && this.maximizeControl(); return this.div
+ }, baseLayerDraw: function() { this.draw(); this.map.events.unregister("changebaselayer", this, this.baseLayerDraw) }, rectDrag: function(a) {
+ var b = this.handlers.drag.last.x - a.x, c = this.handlers.drag.last.y - a.y; if (0 != b || 0 != c) {
+ var d = this.rectPxBounds.top, e = this.rectPxBounds.left; a = Math.abs(this.rectPxBounds.getHeight()); var f = this.rectPxBounds.getWidth(), c = Math.max(0,
+ d - c), c = Math.min(c, this.ovmap.size.h - this.hComp - a), b = Math.max(0, e - b), b = Math.min(b, this.ovmap.size.w - this.wComp - f); this.setRectPxBounds(new OpenLayers.Bounds(b, c + a, b + f, c))
+ }
+ }, mapDivClick: function(a) {
+ var b = this.rectPxBounds.getCenterPixel(), c = a.xy.x - b.x, d = a.xy.y - b.y, e = this.rectPxBounds.top, f = this.rectPxBounds.left; a = Math.abs(this.rectPxBounds.getHeight()); b = this.rectPxBounds.getWidth(); d = Math.max(0, e + d); d = Math.min(d, this.ovmap.size.h - a); c = Math.max(0, f + c); c = Math.min(c, this.ovmap.size.w - b); this.setRectPxBounds(new OpenLayers.Bounds(c,
+ d + a, c + b, d)); this.updateMapToRect()
+ }, onButtonClick: function(a) { a.buttonElement === this.minimizeDiv ? this.minimizeControl() : a.buttonElement === this.maximizeDiv && this.maximizeControl() }, maximizeControl: function(a) { this.element.style.display = ""; this.showToggle(!1); null != a && OpenLayers.Event.stop(a) }, minimizeControl: function(a) { this.element.style.display = "none"; this.showToggle(!0); null != a && OpenLayers.Event.stop(a) }, showToggle: function(a) {
+ this.maximizeDiv && (this.maximizeDiv.style.display = a ? "" : "none"); this.minimizeDiv &&
+ (this.minimizeDiv.style.display = a ? "none" : "")
+ }, update: function() { null == this.ovmap && this.createMap(); !this.autoPan && this.isSuitableOverview() || this.updateOverview(); this.updateRectToMap() }, isSuitableOverview: function() {
+ var a = this.map.getExtent(), b = this.map.getMaxExtent(), a = new OpenLayers.Bounds(Math.max(a.left, b.left), Math.max(a.bottom, b.bottom), Math.min(a.right, b.right), Math.min(a.top, b.top)); this.ovmap.getProjection() != this.map.getProjection() && (a = a.transform(this.map.getProjectionObject(), this.ovmap.getProjectionObject()));
+ b = this.ovmap.getResolution() / this.map.getResolution(); return b > this.minRatio && b <= this.maxRatio && this.ovmap.getExtent().containsBounds(a)
+ }, updateOverview: function() {
+ var a = this.map.getResolution(), b = this.ovmap.getResolution(), c = b / a; c > this.maxRatio ? b = this.minRatio * a : c <= this.minRatio && (b = this.maxRatio * a); this.ovmap.getProjection() != this.map.getProjection() ? (a = this.map.center.clone(), a.transform(this.map.getProjectionObject(), this.ovmap.getProjectionObject())) : a = this.map.center; this.ovmap.setCenter(a,
+ this.ovmap.getZoomForResolution(b * this.resolutionFactor)); this.updateRectToMap()
+ }, createMap: function() {
+ var a = OpenLayers.Util.extend({ controls: [], maxResolution: "auto", fallThrough: !1 }, this.mapOptions); this.ovmap = new OpenLayers.Map(this.mapDiv, a); this.ovmap.viewPortDiv.appendChild(this.extentRectangle); OpenLayers.Event.stopObserving(window, "unload", this.ovmap.unloadDestroy); this.ovmap.addLayers(this.layers); this.ovmap.zoomToMaxExtent(); this.wComp = (this.wComp = parseInt(OpenLayers.Element.getStyle(this.extentRectangle,
+ "border-left-width")) + parseInt(OpenLayers.Element.getStyle(this.extentRectangle, "border-right-width"))) ? this.wComp : 2; this.hComp = (this.hComp = parseInt(OpenLayers.Element.getStyle(this.extentRectangle, "border-top-width")) + parseInt(OpenLayers.Element.getStyle(this.extentRectangle, "border-bottom-width"))) ? this.hComp : 2; this.handlers.drag = new OpenLayers.Handler.Drag(this, { move: this.rectDrag, done: this.updateMapToRect }, { map: this.ovmap }); this.handlers.click = new OpenLayers.Handler.Click(this, { click: this.mapDivClick },
+ { single: !0, "double": !1, stopSingle: !0, stopDouble: !0, pixelTolerance: 1, map: this.ovmap }); this.handlers.click.activate(); this.rectEvents = new OpenLayers.Events(this, this.extentRectangle, null, !0); this.rectEvents.register("mouseover", this, function(a) { this.handlers.drag.active || this.map.dragging || this.handlers.drag.activate() }); this.rectEvents.register("mouseout", this, function(a) { this.handlers.drag.dragging || this.handlers.drag.deactivate() }); if (this.ovmap.getProjection() != this.map.getProjection()) {
+ var a = this.map.getProjectionObject().getUnits() ||
+ this.map.units || this.map.baseLayer.units, b = this.ovmap.getProjectionObject().getUnits() || this.ovmap.units || this.ovmap.baseLayer.units; this.resolutionFactor = a && b ? OpenLayers.INCHES_PER_UNIT[a] / OpenLayers.INCHES_PER_UNIT[b] : 1
+ }
+ }, updateRectToMap: function() { var a; a = this.ovmap.getProjection() != this.map.getProjection() ? this.map.getExtent().transform(this.map.getProjectionObject(), this.ovmap.getProjectionObject()) : this.map.getExtent(); (a = this.getRectBoundsFromMapBounds(a)) && this.setRectPxBounds(a) }, updateMapToRect: function() {
+ var a =
+ this.getMapBoundsFromRectBounds(this.rectPxBounds); this.ovmap.getProjection() != this.map.getProjection() && (a = a.transform(this.ovmap.getProjectionObject(), this.map.getProjectionObject())); this.map.panTo(a.getCenterLonLat())
+ }, setRectPxBounds: function(a) {
+ var b = Math.max(a.top, 0), c = Math.max(a.left, 0), d = Math.min(a.top + Math.abs(a.getHeight()), this.ovmap.size.h - this.hComp); a = Math.min(a.left + a.getWidth(), this.ovmap.size.w - this.wComp); var e = Math.max(a - c, 0), f = Math.max(d - b, 0); e < this.minRectSize || f < this.minRectSize ?
+ (this.extentRectangle.className = this.displayClass + this.minRectDisplayClass, e = c + e / 2 - this.minRectSize / 2, this.extentRectangle.style.top = Math.round(b + f / 2 - this.minRectSize / 2) + "px", this.extentRectangle.style.left = Math.round(e) + "px", this.extentRectangle.style.height = this.minRectSize + "px", this.extentRectangle.style.width = this.minRectSize + "px") : (this.extentRectangle.className = this.displayClass + "ExtentRectangle", this.extentRectangle.style.top = Math.round(b) + "px", this.extentRectangle.style.left = Math.round(c) +
+ "px", this.extentRectangle.style.height = Math.round(f) + "px", this.extentRectangle.style.width = Math.round(e) + "px"); this.rectPxBounds = new OpenLayers.Bounds(Math.round(c), Math.round(d), Math.round(a), Math.round(b))
+ }, getRectBoundsFromMapBounds: function(a) { var b = this.getOverviewPxFromLonLat({ lon: a.left, lat: a.bottom }); a = this.getOverviewPxFromLonLat({ lon: a.right, lat: a.top }); var c = null; b && a && (c = new OpenLayers.Bounds(b.x, b.y, a.x, a.y)); return c }, getMapBoundsFromRectBounds: function(a) {
+ var b = this.getLonLatFromOverviewPx({
+ x: a.left,
+ y: a.bottom
+ }); a = this.getLonLatFromOverviewPx({ x: a.right, y: a.top }); return new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat)
+ }, getLonLatFromOverviewPx: function(a) { var b = this.ovmap.size, c = this.ovmap.getResolution(), d = this.ovmap.getExtent().getCenterLonLat(); return { lon: d.lon + (a.x - b.w / 2) * c, lat: d.lat - (a.y - b.h / 2) * c } }, getOverviewPxFromLonLat: function(a) { var b = this.ovmap.getResolution(), c = this.ovmap.getExtent(); if (c) return { x: Math.round(1 / b * (a.lon - c.left)), y: Math.round(1 / b * (c.top - a.lat)) } }, CLASS_NAME: "OpenLayers.Control.OverviewMap"
+});
+OpenLayers.Layer = OpenLayers.Class({
+ id: null, name: null, div: null, opacity: 1, alwaysInRange: null, RESOLUTION_PROPERTIES: "scales resolutions maxScale minScale maxResolution minResolution numZoomLevels maxZoomLevel".split(" "), events: null, map: null, isBaseLayer: !1, alpha: !1, displayInLayerSwitcher: !0, visibility: !0, attribution: null, inRange: !1, imageSize: null, options: null, eventListeners: null, gutter: 0, projection: null, units: null, scales: null, resolutions: null, maxExtent: null, minExtent: null, maxResolution: null, minResolution: null,
+ numZoomLevels: null, minScale: null, maxScale: null, displayOutsideMaxExtent: !1, wrapDateLine: !1, metadata: null, initialize: function(a, b) {
+ this.metadata = {}; b = OpenLayers.Util.extend({}, b); null != this.alwaysInRange && (b.alwaysInRange = this.alwaysInRange); this.addOptions(b); this.name = a; if (null == this.id && (this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_"), this.div = OpenLayers.Util.createDiv(this.id), this.div.style.width = "100%", this.div.style.height = "100%", this.div.dir = "ltr", this.events = new OpenLayers.Events(this,
+ this.div), this.eventListeners instanceof Object)) this.events.on(this.eventListeners)
+ }, destroy: function(a) { null == a && (a = !0); null != this.map && this.map.removeLayer(this, a); this.options = this.div = this.name = this.map = this.projection = null; this.events && (this.eventListeners && this.events.un(this.eventListeners), this.events.destroy()); this.events = this.eventListeners = null }, clone: function(a) { null == a && (a = new OpenLayers.Layer(this.name, this.getOptions())); OpenLayers.Util.applyDefaults(a, this); a.map = null; return a },
+ getOptions: function() { var a = {}, b; for (b in this.options) a[b] = this[b]; return a }, setName: function(a) { a != this.name && (this.name = a, null != this.map && this.map.events.triggerEvent("changelayer", { layer: this, property: "name" })) }, addOptions: function(a, b) {
+ null == this.options && (this.options = {}); a && ("string" == typeof a.projection && (a.projection = new OpenLayers.Projection(a.projection)), a.projection && OpenLayers.Util.applyDefaults(a, OpenLayers.Projection.defaults[a.projection.getCode()]), !a.maxExtent || a.maxExtent instanceof
+ OpenLayers.Bounds || (a.maxExtent = new OpenLayers.Bounds(a.maxExtent)), !a.minExtent || a.minExtent instanceof OpenLayers.Bounds || (a.minExtent = new OpenLayers.Bounds(a.minExtent))); OpenLayers.Util.extend(this.options, a); OpenLayers.Util.extend(this, a); this.projection && this.projection.getUnits() && (this.units = this.projection.getUnits()); if (this.map) {
+ var c = this.map.getResolution(), d = this.RESOLUTION_PROPERTIES.concat(["projection", "units", "minExtent", "maxExtent"]), e; for (e in a) if (a.hasOwnProperty(e) && 0 <= OpenLayers.Util.indexOf(d,
+ e)) { this.initResolutions(); b && this.map.baseLayer === this && (this.map.setCenter(this.map.getCenter(), this.map.getZoomForResolution(c), !1, !0), this.map.events.triggerEvent("changebaselayer", { layer: this })); break }
+ }
+ }, onMapResize: function() { }, redraw: function() { var a = !1; if (this.map) { this.inRange = this.calculateInRange(); var b = this.getExtent(); b && this.inRange && this.visibility && (this.moveTo(b, !0, !1), this.events.triggerEvent("moveend", { zoomChanged: !0 }), a = !0) } return a }, moveTo: function(a, b, c) {
+ a = this.visibility; this.isBaseLayer ||
+ (a = a && this.inRange); this.display(a)
+ }, moveByPx: function(a, b) { }, setMap: function(a) {
+ null == this.map && (this.map = a, this.maxExtent = this.maxExtent || this.map.maxExtent, this.minExtent = this.minExtent || this.map.minExtent, this.projection = this.projection || this.map.projection, "string" == typeof this.projection && (this.projection = new OpenLayers.Projection(this.projection)), this.units = this.projection.getUnits() || this.units || this.map.units, this.initResolutions(), this.isBaseLayer || (this.inRange = this.calculateInRange(),
+ this.div.style.display = this.visibility && this.inRange ? "" : "none"), this.setTileSize())
+ }, afterAdd: function() { }, removeMap: function(a) { }, getImageSize: function(a) { return this.imageSize || this.tileSize }, setTileSize: function(a) { this.tileSize = a = a ? a : this.tileSize ? this.tileSize : this.map.getTileSize(); this.gutter && (this.imageSize = new OpenLayers.Size(a.w + 2 * this.gutter, a.h + 2 * this.gutter)) }, getVisibility: function() { return this.visibility }, setVisibility: function(a) {
+ a != this.visibility && (this.visibility = a, this.display(a),
+ this.redraw(), null != this.map && this.map.events.triggerEvent("changelayer", { layer: this, property: "visibility" }), this.events.triggerEvent("visibilitychanged"))
+ }, display: function(a) { a != ("none" != this.div.style.display) && (this.div.style.display = a && this.calculateInRange() ? "block" : "none") }, calculateInRange: function() { var a = !1; this.alwaysInRange ? a = !0 : this.map && (a = this.map.getResolution(), a = a >= this.minResolution && a <= this.maxResolution); return a }, setIsBaseLayer: function(a) {
+ a != this.isBaseLayer && (this.isBaseLayer =
+ a, null != this.map && this.map.events.triggerEvent("changebaselayer", { layer: this }))
+ }, initResolutions: function() {
+ var a, b, c, d = {}, e = !0; a = 0; for (b = this.RESOLUTION_PROPERTIES.length; a < b; a++)c = this.RESOLUTION_PROPERTIES[a], d[c] = this.options[c], e && this.options[c] && (e = !1); null == this.options.alwaysInRange && (this.alwaysInRange = e); null == d.resolutions && (d.resolutions = this.resolutionsFromScales(d.scales)); null == d.resolutions && (d.resolutions = this.calculateResolutions(d)); if (null == d.resolutions) {
+ a = 0; for (b = this.RESOLUTION_PROPERTIES.length; a <
+ b; a++)c = this.RESOLUTION_PROPERTIES[a], d[c] = null != this.options[c] ? this.options[c] : this.map[c]; null == d.resolutions && (d.resolutions = this.resolutionsFromScales(d.scales)); null == d.resolutions && (d.resolutions = this.calculateResolutions(d))
+ } var f; this.options.maxResolution && "auto" !== this.options.maxResolution && (f = this.options.maxResolution); this.options.minScale && (f = OpenLayers.Util.getResolutionFromScale(this.options.minScale, this.units)); var g; this.options.minResolution && "auto" !== this.options.minResolution &&
+ (g = this.options.minResolution); this.options.maxScale && (g = OpenLayers.Util.getResolutionFromScale(this.options.maxScale, this.units)); d.resolutions && (d.resolutions.sort(function(a, b) { return b - a }), f || (f = d.resolutions[0]), g || (g = d.resolutions[d.resolutions.length - 1])); if (this.resolutions = d.resolutions) { b = this.resolutions.length; this.scales = Array(b); for (a = 0; a < b; a++)this.scales[a] = OpenLayers.Util.getScaleFromResolution(this.resolutions[a], this.units); this.numZoomLevels = b } if (this.minResolution = g) this.maxScale =
+ OpenLayers.Util.getScaleFromResolution(g, this.units); if (this.maxResolution = f) this.minScale = OpenLayers.Util.getScaleFromResolution(f, this.units)
+ }, resolutionsFromScales: function(a) { if (null != a) { var b, c, d; d = a.length; b = Array(d); for (c = 0; c < d; c++)b[c] = OpenLayers.Util.getResolutionFromScale(a[c], this.units); return b } }, calculateResolutions: function(a) {
+ var b, c, d = a.maxResolution; null != a.minScale ? d = OpenLayers.Util.getResolutionFromScale(a.minScale, this.units) : "auto" == d && null != this.maxExtent && (b = this.map.getSize(),
+ c = this.maxExtent.getWidth() / b.w, b = this.maxExtent.getHeight() / b.h, d = Math.max(c, b)); c = a.minResolution; null != a.maxScale ? c = OpenLayers.Util.getResolutionFromScale(a.maxScale, this.units) : "auto" == a.minResolution && null != this.minExtent && (b = this.map.getSize(), c = this.minExtent.getWidth() / b.w, b = this.minExtent.getHeight() / b.h, c = Math.max(c, b)); "number" !== typeof d && "number" !== typeof c && null != this.maxExtent && (d = this.map.getTileSize(), d = Math.max(this.maxExtent.getWidth() / d.w, this.maxExtent.getHeight() / d.h)); b = a.maxZoomLevel;
+ a = a.numZoomLevels; "number" === typeof c && "number" === typeof d && void 0 === a ? a = Math.floor(Math.log(d / c) / Math.log(2)) + 1 : void 0 === a && null != b && (a = b + 1); if (!("number" !== typeof a || 0 >= a || "number" !== typeof d && "number" !== typeof c)) { b = Array(a); var e = 2; "number" == typeof c && "number" == typeof d && (e = Math.pow(d / c, 1 / (a - 1))); var f; if ("number" === typeof d) for (f = 0; f < a; f++)b[f] = d / Math.pow(e, f); else for (f = 0; f < a; f++)b[a - 1 - f] = c * Math.pow(e, f); return b }
+ }, getResolution: function() { var a = this.map.getZoom(); return this.getResolutionForZoom(a) },
+ getExtent: function() { return this.map.calculateBounds() }, getZoomForExtent: function(a, b) { var c = this.map.getSize(), c = Math.max(a.getWidth() / c.w, a.getHeight() / c.h); return this.getZoomForResolution(c, b) }, getDataExtent: function() { }, getResolutionForZoom: function(a) { a = Math.max(0, Math.min(a, this.resolutions.length - 1)); if (this.map.fractionalZoom) { var b = Math.floor(a), c = Math.ceil(a); a = this.resolutions[b] - (a - b) * (this.resolutions[b] - this.resolutions[c]) } else a = this.resolutions[Math.round(a)]; return a }, getZoomForResolution: function(a,
+ b) { var c, d; if (this.map.fractionalZoom) { var e = 0, f = this.resolutions[e], g = this.resolutions[this.resolutions.length - 1], h; c = 0; for (d = this.resolutions.length; c < d; ++c)if (h = this.resolutions[c], h >= a && (f = h, e = c), h <= a) { g = h; break } c = f - g; c = 0 < c ? e + (f - a) / c : e } else { f = Number.POSITIVE_INFINITY; c = 0; for (d = this.resolutions.length; c < d; c++)if (b) { e = Math.abs(this.resolutions[c] - a); if (e > f) break; f = e } else if (this.resolutions[c] < a) break; c = Math.max(0, c - 1) } return c }, getLonLatFromViewPortPx: function(a) {
+ var b = null, c = this.map; if (null !=
+ a && c.minPx) { var b = c.getResolution(), d = c.getMaxExtent({ restricted: !0 }), b = new OpenLayers.LonLat((a.x - c.minPx.x) * b + d.left, (c.minPx.y - a.y) * b + d.top); this.wrapDateLine && (b = b.wrapDateLine(this.maxExtent)) } return b
+ }, getViewPortPxFromLonLat: function(a, b) { var c = null; null != a && (b = b || this.map.getResolution(), c = this.map.calculateBounds(null, b), c = new OpenLayers.Pixel(1 / b * (a.lon - c.left), 1 / b * (c.top - a.lat))); return c }, setOpacity: function(a) {
+ if (a != this.opacity) {
+ this.opacity = a; for (var b = this.div.childNodes, c = 0, d = b.length; c <
+ d; ++c) { var e = b[c].firstChild || b[c], f = b[c].lastChild; f && "iframe" === f.nodeName.toLowerCase() && (e = f.parentNode); OpenLayers.Util.modifyDOMElement(e, null, null, null, null, null, null, a) } null != this.map && this.map.events.triggerEvent("changelayer", { layer: this, property: "opacity" })
+ }
+ }, getZIndex: function() { return this.div.style.zIndex }, setZIndex: function(a) { this.div.style.zIndex = a }, adjustBounds: function(a) {
+ if (this.gutter) {
+ var b = this.gutter * this.map.getResolution(); a = new OpenLayers.Bounds(a.left - b, a.bottom - b, a.right +
+ b, a.top + b)
+ } this.wrapDateLine && (b = { rightTolerance: this.getResolution(), leftTolerance: this.getResolution() }, a = a.wrapDateLine(this.maxExtent, b)); return a
+ }, CLASS_NAME: "OpenLayers.Layer"
+});
+OpenLayers.Layer.SphericalMercator = {
+ getExtent: function() { return this.sphericalMercator ? this.map.calculateBounds() : OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this) }, getLonLatFromViewPortPx: function(a) { return OpenLayers.Layer.prototype.getLonLatFromViewPortPx.apply(this, arguments) }, getViewPortPxFromLonLat: function(a) { return OpenLayers.Layer.prototype.getViewPortPxFromLonLat.apply(this, arguments) }, initMercatorParameters: function() {
+ this.RESOLUTIONS = []; for (var a = 0; a <= this.MAX_ZOOM_LEVEL; ++a)this.RESOLUTIONS[a] =
+ 156543.03390625 / Math.pow(2, a); this.units = "m"; this.projection = this.projection || "EPSG:900913"
+ }, forwardMercator: function() { var a = new OpenLayers.Projection("EPSG:4326"), b = new OpenLayers.Projection("EPSG:900913"); return function(c, d) { var e = OpenLayers.Projection.transform({ x: c, y: d }, a, b); return new OpenLayers.LonLat(e.x, e.y) } }(), inverseMercator: function() {
+ var a = new OpenLayers.Projection("EPSG:4326"), b = new OpenLayers.Projection("EPSG:900913"); return function(c, d) {
+ var e = OpenLayers.Projection.transform({
+ x: c,
+ y: d
+ }, b, a); return new OpenLayers.LonLat(e.x, e.y)
+ }
+ }()
+};
+OpenLayers.Layer.EventPane = OpenLayers.Class(OpenLayers.Layer, {
+ smoothDragPan: !0, isBaseLayer: !0, isFixed: !0, pane: null, mapObject: null, initialize: function(a, b) { OpenLayers.Layer.prototype.initialize.apply(this, arguments); null == this.pane && (this.pane = OpenLayers.Util.createDiv(this.div.id + "_EventPane")) }, destroy: function() { this.pane = this.mapObject = null; OpenLayers.Layer.prototype.destroy.apply(this, arguments) }, setMap: function(a) {
+ OpenLayers.Layer.prototype.setMap.apply(this, arguments); this.pane.style.zIndex =
+ parseInt(this.div.style.zIndex) + 1; this.pane.style.display = this.div.style.display; this.pane.style.width = "100%"; this.pane.style.height = "100%"; "msie" == OpenLayers.BROWSER_NAME && (this.pane.style.background = "url(" + OpenLayers.Util.getImageLocation("blank.gif") + ")"); this.isFixed ? this.map.viewPortDiv.appendChild(this.pane) : this.map.layerContainerDiv.appendChild(this.pane); this.loadMapObject(); null == this.mapObject && this.loadWarningMessage()
+ }, removeMap: function(a) {
+ this.pane && this.pane.parentNode && this.pane.parentNode.removeChild(this.pane);
+ OpenLayers.Layer.prototype.removeMap.apply(this, arguments)
+ }, loadWarningMessage: function() { this.div.style.backgroundColor = "darkblue"; var a = this.map.getSize(), b = Math.min(a.w, 300), c = Math.min(a.h, 200), b = new OpenLayers.Size(b, c), a = (new OpenLayers.Pixel(a.w / 2, a.h / 2)).add(-b.w / 2, -b.h / 2), a = OpenLayers.Util.createDiv(this.name + "_warning", a, b, null, null, null, "auto"); a.style.padding = "7px"; a.style.backgroundColor = "yellow"; a.innerHTML = this.getWarningHTML(); this.div.appendChild(a) }, getWarningHTML: function() { return "" },
+ display: function(a) { OpenLayers.Layer.prototype.display.apply(this, arguments); this.pane.style.display = this.div.style.display }, setZIndex: function(a) { OpenLayers.Layer.prototype.setZIndex.apply(this, arguments); this.pane.style.zIndex = parseInt(this.div.style.zIndex) + 1 }, moveByPx: function(a, b) { OpenLayers.Layer.prototype.moveByPx.apply(this, arguments); this.dragPanMapObject ? this.dragPanMapObject(a, -b) : this.moveTo(this.map.getCachedCenter()) }, moveTo: function(a, b, c) {
+ OpenLayers.Layer.prototype.moveTo.apply(this,
+ arguments); if (null != this.mapObject) {
+ var d = this.map.getCenter(), e = this.map.getZoom(); if (null != d) {
+ var f = this.getMapObjectCenter(), f = this.getOLLonLatFromMapObjectLonLat(f), g = this.getMapObjectZoom(), g = this.getOLZoomFromMapObjectZoom(g); d.equals(f) && e == g || (!b && f && this.dragPanMapObject && this.smoothDragPan ? (e = this.map.getViewPortPxFromLonLat(f), d = this.map.getViewPortPxFromLonLat(d), this.dragPanMapObject(d.x - e.x, e.y - d.y)) : (d = this.getMapObjectLonLatFromOLLonLat(d), e = this.getMapObjectZoomFromOLZoom(e), this.setMapObjectCenter(d,
+ e, c)))
+ }
+ }
+ }, getLonLatFromViewPortPx: function(a) { var b = null; null != this.mapObject && null != this.getMapObjectCenter() && (a = this.getMapObjectPixelFromOLPixel(a), a = this.getMapObjectLonLatFromMapObjectPixel(a), b = this.getOLLonLatFromMapObjectLonLat(a)); return b }, getViewPortPxFromLonLat: function(a) { var b = null; null != this.mapObject && null != this.getMapObjectCenter() && (a = this.getMapObjectLonLatFromOLLonLat(a), a = this.getMapObjectPixelFromMapObjectLonLat(a), b = this.getOLPixelFromMapObjectPixel(a)); return b }, getOLLonLatFromMapObjectLonLat: function(a) {
+ var b =
+ null; null != a && (b = this.getLongitudeFromMapObjectLonLat(a), a = this.getLatitudeFromMapObjectLonLat(a), b = new OpenLayers.LonLat(b, a)); return b
+ }, getMapObjectLonLatFromOLLonLat: function(a) { var b = null; null != a && (b = this.getMapObjectLonLatFromLonLat(a.lon, a.lat)); return b }, getOLPixelFromMapObjectPixel: function(a) { var b = null; null != a && (b = this.getXFromMapObjectPixel(a), a = this.getYFromMapObjectPixel(a), b = new OpenLayers.Pixel(b, a)); return b }, getMapObjectPixelFromOLPixel: function(a) {
+ var b = null; null != a && (b = this.getMapObjectPixelFromXY(a.x,
+ a.y)); return b
+ }, CLASS_NAME: "OpenLayers.Layer.EventPane"
+});
+OpenLayers.Layer.FixedZoomLevels = OpenLayers.Class({
+ initialize: function() { }, initResolutions: function() {
+ for (var a = ["minZoomLevel", "maxZoomLevel", "numZoomLevels"], b = 0, c = a.length; b < c; b++) { var d = a[b]; this[d] = null != this.options[d] ? this.options[d] : this.map[d] } if (null == this.minZoomLevel || this.minZoomLevel < this.MIN_ZOOM_LEVEL) this.minZoomLevel = this.MIN_ZOOM_LEVEL; a = this.MAX_ZOOM_LEVEL - this.minZoomLevel + 1; b = null == this.options.numZoomLevels && null != this.options.maxZoomLevel || null == this.numZoomLevels && null != this.maxZoomLevel ?
+ this.maxZoomLevel - this.minZoomLevel + 1 : this.numZoomLevels; this.numZoomLevels = null != b ? Math.min(b, a) : a; this.maxZoomLevel = this.minZoomLevel + this.numZoomLevels - 1; if (null != this.RESOLUTIONS) { a = 0; this.resolutions = []; for (b = this.minZoomLevel; b <= this.maxZoomLevel; b++)this.resolutions[a++] = this.RESOLUTIONS[b]; this.maxResolution = this.resolutions[0]; this.minResolution = this.resolutions[this.resolutions.length - 1] }
+ }, getResolution: function() {
+ if (null != this.resolutions) return OpenLayers.Layer.prototype.getResolution.apply(this,
+ arguments); var a = null, b = this.map.getSize(), c = this.getExtent(); null != b && null != c && (a = Math.max(c.getWidth() / b.w, c.getHeight() / b.h)); return a
+ }, getExtent: function() { var a = this.map.getSize(), b = this.getLonLatFromViewPortPx({ x: 0, y: 0 }), a = this.getLonLatFromViewPortPx({ x: a.w, y: a.h }); return null != b && null != a ? new OpenLayers.Bounds(b.lon, a.lat, a.lon, b.lat) : null }, getZoomForResolution: function(a) {
+ if (null != this.resolutions) return OpenLayers.Layer.prototype.getZoomForResolution.apply(this, arguments); var b = OpenLayers.Layer.prototype.getExtent.apply(this,
+ []); return this.getZoomForExtent(b)
+ }, getOLZoomFromMapObjectZoom: function(a) { var b = null; null != a && (b = a - this.minZoomLevel, this.map.baseLayer !== this && (b = this.map.baseLayer.getZoomForResolution(this.getResolutionForZoom(b)))); return b }, getMapObjectZoomFromOLZoom: function(a) { var b = null; null != a && (b = a + this.minZoomLevel, this.map.baseLayer !== this && (b = this.getZoomForResolution(this.map.baseLayer.getResolutionForZoom(b)))); return b }, CLASS_NAME: "OpenLayers.Layer.FixedZoomLevels"
+});
+OpenLayers.Layer.Google = OpenLayers.Class(OpenLayers.Layer.EventPane, OpenLayers.Layer.FixedZoomLevels, {
+ MIN_ZOOM_LEVEL: 0, MAX_ZOOM_LEVEL: 21, RESOLUTIONS: [1.40625, .703125, .3515625, .17578125, .087890625, .0439453125, .02197265625, .010986328125, .0054931640625, .00274658203125, .001373291015625, 6.866455078125E-4, 3.4332275390625E-4, 1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.145767211914062E-5, 1.072883605957031E-5, 5.36441802978515E-6, 2.68220901489257E-6, 1.341104507446289E-6, 6.705522537231445E-7],
+ type: null, wrapDateLine: !0, sphericalMercator: !1, version: null, initialize: function(a, b) {
+ b = b || {}; b.version || (b.version = "function" === typeof GMap2 ? "2" : "3"); var c = OpenLayers.Layer.Google["v" + b.version.replace(/\./g, "_")]; if (c) OpenLayers.Util.applyDefaults(b, c); else throw "Unsupported Google Maps API version: " + b.version; OpenLayers.Util.applyDefaults(b, c.DEFAULTS); b.maxExtent && (b.maxExtent = b.maxExtent.clone()); OpenLayers.Layer.EventPane.prototype.initialize.apply(this, [a, b]); OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
+ [a, b]); this.sphericalMercator && (OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator), this.initMercatorParameters())
+ }, clone: function() { return new OpenLayers.Layer.Google(this.name, this.getOptions()) }, setVisibility: function(a) { var b = null == this.opacity ? 1 : this.opacity; OpenLayers.Layer.EventPane.prototype.setVisibility.apply(this, arguments); this.setOpacity(b) }, display: function(a) { this._dragging || this.setGMapVisibility(a); OpenLayers.Layer.EventPane.prototype.display.apply(this, arguments) }, moveTo: function(a,
+ b, c) { this._dragging = c; OpenLayers.Layer.EventPane.prototype.moveTo.apply(this, arguments); delete this._dragging }, setOpacity: function(a) { a !== this.opacity && (null != this.map && this.map.events.triggerEvent("changelayer", { layer: this, property: "opacity" }), this.opacity = a); if (this.getVisibility()) { var b = this.getMapContainer(); OpenLayers.Util.modifyDOMElement(b, null, null, null, null, null, null, a) } }, destroy: function() {
+ if (this.map) {
+ this.setGMapVisibility(!1); var a = OpenLayers.Layer.Google.cache[this.map.id]; a && 1 >= a.count &&
+ this.removeGMapElements()
+ } OpenLayers.Layer.EventPane.prototype.destroy.apply(this, arguments)
+ }, removeGMapElements: function() {
+ var a = OpenLayers.Layer.Google.cache[this.map.id]; if (a) {
+ var b = this.mapObject && this.getMapContainer(); b && b.parentNode && b.parentNode.removeChild(b); (b = a.termsOfUse) && b.parentNode && b.parentNode.removeChild(b); (a = a.poweredBy) && a.parentNode && a.parentNode.removeChild(a); this.mapObject && window.google && google.maps && google.maps.event && google.maps.event.clearListeners && google.maps.event.clearListeners(this.mapObject,
+ "tilesloaded")
+ }
+ }, removeMap: function(a) { this.visibility && this.mapObject && this.setGMapVisibility(!1); var b = OpenLayers.Layer.Google.cache[a.id]; b && (1 >= b.count ? (this.removeGMapElements(), delete OpenLayers.Layer.Google.cache[a.id]) : --b.count); delete this.termsOfUse; delete this.poweredBy; delete this.mapObject; delete this.dragObject; OpenLayers.Layer.EventPane.prototype.removeMap.apply(this, arguments) }, getOLBoundsFromMapObjectBounds: function(a) {
+ var b = null; null != a && (b = a.getSouthWest(), a = a.getNorthEast(), this.sphericalMercator ?
+ (b = this.forwardMercator(b.lng(), b.lat()), a = this.forwardMercator(a.lng(), a.lat())) : (b = new OpenLayers.LonLat(b.lng(), b.lat()), a = new OpenLayers.LonLat(a.lng(), a.lat())), b = new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat)); return b
+ }, getWarningHTML: function() { return OpenLayers.i18n("googleWarning") }, getMapObjectCenter: function() { return this.mapObject.getCenter() }, getMapObjectZoom: function() { return this.mapObject.getZoom() }, getLongitudeFromMapObjectLonLat: function(a) {
+ return this.sphericalMercator ? this.forwardMercator(a.lng(),
+ a.lat()).lon : a.lng()
+ }, getLatitudeFromMapObjectLonLat: function(a) { return this.sphericalMercator ? this.forwardMercator(a.lng(), a.lat()).lat : a.lat() }, getXFromMapObjectPixel: function(a) { return a.x }, getYFromMapObjectPixel: function(a) { return a.y }, CLASS_NAME: "OpenLayers.Layer.Google"
+}); OpenLayers.Layer.Google.cache = {};
+OpenLayers.Layer.Google.v2 = {
+ termsOfUse: null, poweredBy: null, dragObject: null, loadMapObject: function() {
+ this.type || (this.type = G_NORMAL_MAP); var a, b, c, d = OpenLayers.Layer.Google.cache[this.map.id]; if (d) a = d.mapObject, b = d.termsOfUse, c = d.poweredBy, ++d.count; else {
+ var d = this.map.viewPortDiv, e = document.createElement("div"); e.id = this.map.id + "_GMap2Container"; e.style.position = "absolute"; e.style.width = "100%"; e.style.height = "100%"; d.appendChild(e); try {
+ a = new GMap2(e), b = e.lastChild, d.appendChild(b), b.style.zIndex =
+ "1100", b.style.right = "", b.style.bottom = "", b.className = "olLayerGoogleCopyright", c = e.lastChild, d.appendChild(c), c.style.zIndex = "1100", c.style.right = "", c.style.bottom = "", c.className = "olLayerGooglePoweredBy gmnoprint"
+ } catch (f) { throw f; } OpenLayers.Layer.Google.cache[this.map.id] = { mapObject: a, termsOfUse: b, poweredBy: c, count: 1 }
+ } this.mapObject = a; this.termsOfUse = b; this.poweredBy = c; -1 === OpenLayers.Util.indexOf(this.mapObject.getMapTypes(), this.type) && this.mapObject.addMapType(this.type); "function" == typeof a.getDragObject ?
+ this.dragObject = a.getDragObject() : this.dragPanMapObject = null; !1 === this.isBaseLayer && this.setGMapVisibility("none" !== this.div.style.display)
+ }, onMapResize: function() { if (this.visibility && this.mapObject.isLoaded()) this.mapObject.checkResize(); else { if (!this._resized) var a = this, b = GEvent.addListener(this.mapObject, "load", function() { GEvent.removeListener(b); delete a._resized; a.mapObject.checkResize(); a.moveTo(a.map.getCenter(), a.map.getZoom()) }); this._resized = !0 } }, setGMapVisibility: function(a) {
+ var b = OpenLayers.Layer.Google.cache[this.map.id];
+ if (b) { var c = this.mapObject.getContainer(); !0 === a ? (this.mapObject.setMapType(this.type), c.style.display = "", this.termsOfUse.style.left = "", this.termsOfUse.style.display = "", this.poweredBy.style.display = "", b.displayed = this.id) : (b.displayed === this.id && delete b.displayed, b.displayed || (c.style.display = "none", this.termsOfUse.style.display = "none", this.termsOfUse.style.left = "-9999px", this.poweredBy.style.display = "none")) }
+ }, getMapContainer: function() { return this.mapObject.getContainer() }, getMapObjectBoundsFromOLBounds: function(a) {
+ var b =
+ null; null != a && (b = this.sphericalMercator ? this.inverseMercator(a.bottom, a.left) : new OpenLayers.LonLat(a.bottom, a.left), a = this.sphericalMercator ? this.inverseMercator(a.top, a.right) : new OpenLayers.LonLat(a.top, a.right), b = new GLatLngBounds(new GLatLng(b.lat, b.lon), new GLatLng(a.lat, a.lon))); return b
+ }, setMapObjectCenter: function(a, b) { this.mapObject.setCenter(a, b) }, dragPanMapObject: function(a, b) { this.dragObject.moveBy(new GSize(-a, b)) }, getMapObjectLonLatFromMapObjectPixel: function(a) { return this.mapObject.fromContainerPixelToLatLng(a) },
+ getMapObjectPixelFromMapObjectLonLat: function(a) { return this.mapObject.fromLatLngToContainerPixel(a) }, getMapObjectZoomFromMapObjectBounds: function(a) { return this.mapObject.getBoundsZoomLevel(a) }, getMapObjectLonLatFromLonLat: function(a, b) { var c; this.sphericalMercator ? (c = this.inverseMercator(a, b), c = new GLatLng(c.lat, c.lon)) : c = new GLatLng(b, a); return c }, getMapObjectPixelFromXY: function(a, b) { return new GPoint(a, b) }
+};
+OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
+ namespaces: null, namespaceAlias: null, defaultPrefix: null, readers: {}, writers: {}, xmldom: null, initialize: function(a) { window.ActiveXObject && (this.xmldom = new ActiveXObject("Microsoft.XMLDOM")); OpenLayers.Format.prototype.initialize.apply(this, [a]); this.namespaces = OpenLayers.Util.extend({}, this.namespaces); this.namespaceAlias = {}; for (var b in this.namespaces) this.namespaceAlias[this.namespaces[b]] = b }, destroy: function() {
+ this.xmldom = null; OpenLayers.Format.prototype.destroy.apply(this,
+ arguments)
+ }, setNamespace: function(a, b) { this.namespaces[a] = b; this.namespaceAlias[b] = a }, read: function(a) {
+ var b = a.indexOf("\x3c"); 0 < b && (a = a.substring(b)); b = OpenLayers.Util.Try(OpenLayers.Function.bind(function() { var b; b = window.ActiveXObject && !this.xmldom ? new ActiveXObject("Microsoft.XMLDOM") : this.xmldom; b.loadXML(a); return b }, this), function() { return (new DOMParser).parseFromString(a, "text/xml") }, function() {
+ var b = new XMLHttpRequest; b.open("GET", "data:text/xml;charset\x3dutf-8," + encodeURIComponent(a), !1);
+ b.overrideMimeType && b.overrideMimeType("text/xml"); b.send(null); return b.responseXML
+ }); this.keepData && (this.data = b); return b
+ }, write: function(a) { if (this.xmldom) a = a.xml; else { var b = new XMLSerializer; if (1 == a.nodeType) { var c = document.implementation.createDocument("", "", null); c.importNode && (a = c.importNode(a, !0)); c.appendChild(a); a = b.serializeToString(c) } else a = b.serializeToString(a) } return a }, createElementNS: function(a, b) {
+ return this.xmldom ? "string" == typeof a ? this.xmldom.createNode(1, b, a) : this.xmldom.createNode(1,
+ b, "") : document.createElementNS(a, b)
+ }, createDocumentFragment: function() { return this.xmldom ? this.xmldom.createDocumentFragment() : document.createDocumentFragment() }, createTextNode: function(a) { "string" !== typeof a && (a = String(a)); return this.xmldom ? this.xmldom.createTextNode(a) : document.createTextNode(a) }, getElementsByTagNameNS: function(a, b, c) {
+ var d = []; if (a.getElementsByTagNameNS) d = a.getElementsByTagNameNS(b, c); else {
+ a = a.getElementsByTagName("*"); for (var e, f, g = 0, h = a.length; g < h; ++g)if (e = a[g], f = e.prefix ? e.prefix +
+ ":" + c : c, "*" == c || f == e.nodeName) "*" != b && b != e.namespaceURI || d.push(e)
+ } return d
+ }, getAttributeNodeNS: function(a, b, c) { var d = null; if (a.getAttributeNodeNS) d = a.getAttributeNodeNS(b, c); else { a = a.attributes; for (var e, f, g = 0, h = a.length; g < h; ++g)if (e = a[g], e.namespaceURI == b && (f = e.prefix ? e.prefix + ":" + c : c, f == e.nodeName)) { d = e; break } } return d }, getAttributeNS: function(a, b, c) { var d = ""; if (a.getAttributeNS) d = a.getAttributeNS(b, c) || ""; else if (a = this.getAttributeNodeNS(a, b, c)) d = a.nodeValue; return d }, getChildValue: function(a,
+ b) { var c = b || ""; if (a) for (var d = a.firstChild; d; d = d.nextSibling)switch (d.nodeType) { case 3: case 4: c += d.nodeValue }return c }, isSimpleContent: function(a) { var b = !0; for (a = a.firstChild; a; a = a.nextSibling)if (1 === a.nodeType) { b = !1; break } return b }, contentType: function(a) {
+ var b = !1, c = !1, d = OpenLayers.Format.XML.CONTENT_TYPE.EMPTY; for (a = a.firstChild; a; a = a.nextSibling) { switch (a.nodeType) { case 1: c = !0; break; case 8: break; default: b = !0 }if (c && b) break } if (c && b) d = OpenLayers.Format.XML.CONTENT_TYPE.MIXED; else {
+ if (c) return OpenLayers.Format.XML.CONTENT_TYPE.COMPLEX;
+ if (b) return OpenLayers.Format.XML.CONTENT_TYPE.SIMPLE
+ } return d
+ }, hasAttributeNS: function(a, b, c) { return a.hasAttributeNS ? a.hasAttributeNS(b, c) : !!this.getAttributeNodeNS(a, b, c) }, setAttributeNS: function(a, b, c, d) { if (a.setAttributeNS) a.setAttributeNS(b, c, d); else if (this.xmldom) b ? (b = a.ownerDocument.createNode(2, c, b), b.nodeValue = d, a.setAttributeNode(b)) : a.setAttribute(c, d); else throw "setAttributeNS not implemented"; }, createElementNSPlus: function(a, b) {
+ b = b || {}; var c = b.uri || this.namespaces[b.prefix]; c || (c = a.indexOf(":"),
+ c = this.namespaces[a.substring(0, c)]); c || (c = this.namespaces[this.defaultPrefix]); c = this.createElementNS(c, a); b.attributes && this.setAttributes(c, b.attributes); var d = b.value; null != d && c.appendChild(this.createTextNode(d)); return c
+ }, setAttributes: function(a, b) { var c, d, e; for (e in b) null != b[e] && b[e].toString && (c = b[e].toString(), d = this.namespaces[e.substring(0, e.indexOf(":"))] || null, this.setAttributeNS(a, d, e, c)) }, readNode: function(a, b) {
+ b || (b = {}); var c = this.readers[a.namespaceURI ? this.namespaceAlias[a.namespaceURI] :
+ this.defaultPrefix]; if (c) { var d = a.localName || a.nodeName.split(":").pop(); (c = c[d] || c["*"]) && c.apply(this, [a, b]) } return b
+ }, readChildNodes: function(a, b) { b || (b = {}); for (var c = a.childNodes, d, e = 0, f = c.length; e < f; ++e)d = c[e], 1 == d.nodeType && this.readNode(d, b); return b }, writeNode: function(a, b, c) { var d, e = a.indexOf(":"); 0 < e ? (d = a.substring(0, e), a = a.substring(e + 1)) : d = c ? this.namespaceAlias[c.namespaceURI] : this.defaultPrefix; b = this.writers[d][a].apply(this, [b]); c && c.appendChild(b); return b }, getChildEl: function(a, b,
+ c) { return a && this.getThisOrNextEl(a.firstChild, b, c) }, getNextEl: function(a, b, c) { return a && this.getThisOrNextEl(a.nextSibling, b, c) }, getThisOrNextEl: function(a, b, c) { a: for (; a; a = a.nextSibling)switch (a.nodeType) { case 1: if (!(b && b !== (a.localName || a.nodeName.split(":").pop()) || c && c !== a.namespaceURI)) break a; a = null; break a; case 3: if (/^\s*$/.test(a.nodeValue)) break; case 4: case 6: case 12: case 10: case 11: a = null; break a }return a || null }, lookupNamespaceURI: function(a, b) {
+ var c = null; if (a) if (a.lookupNamespaceURI) c =
+ a.lookupNamespaceURI(b); else a: switch (a.nodeType) {
+ case 1: if (null !== a.namespaceURI && a.prefix === b) { c = a.namespaceURI; break a } if (c = a.attributes.length) for (var d, e = 0; e < c; ++e)if (d = a.attributes[e], "xmlns" === d.prefix && d.name === "xmlns:" + b) { c = d.value || null; break a } else if ("xmlns" === d.name && null === b) { c = d.value || null; break a } c = this.lookupNamespaceURI(a.parentNode, b); break a; case 2: c = this.lookupNamespaceURI(a.ownerElement, b); break a; case 9: c = this.lookupNamespaceURI(a.documentElement, b); break a; case 6: case 12: case 10: case 11: break a;
+ default: c = this.lookupNamespaceURI(a.parentNode, b)
+ }return c
+ }, getXMLDoc: function() { OpenLayers.Format.XML.document || this.xmldom || (document.implementation && document.implementation.createDocument ? OpenLayers.Format.XML.document = document.implementation.createDocument("", "", null) : !this.xmldom && window.ActiveXObject && (this.xmldom = new ActiveXObject("Microsoft.XMLDOM"))); return OpenLayers.Format.XML.document || this.xmldom }, CLASS_NAME: "OpenLayers.Format.XML"
+});
+OpenLayers.Format.XML.CONTENT_TYPE = { EMPTY: 0, SIMPLE: 1, COMPLEX: 2, MIXED: 3 }; OpenLayers.Format.XML.lookupNamespaceURI = OpenLayers.Function.bind(OpenLayers.Format.XML.prototype.lookupNamespaceURI, OpenLayers.Format.XML.prototype); OpenLayers.Format.XML.document = null; OpenLayers.Format.WFST = function(a) { a = OpenLayers.Util.applyDefaults(a, OpenLayers.Format.WFST.DEFAULTS); var b = OpenLayers.Format.WFST["v" + a.version.replace(/\./g, "_")]; if (!b) throw "Unsupported WFST version: " + a.version; return new b(a) };
+OpenLayers.Format.WFST.DEFAULTS = { version: "1.0.0" };
+OpenLayers.Feature = OpenLayers.Class({
+ layer: null, id: null, lonlat: null, data: null, marker: null, popupClass: null, popup: null, initialize: function(a, b, c) { this.layer = a; this.lonlat = b; this.data = null != c ? c : {}; this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_") }, destroy: function() {
+ null != this.layer && null != this.layer.map && null != this.popup && this.layer.map.removePopup(this.popup); null != this.layer && null != this.marker && this.layer.removeMarker(this.marker); this.data = this.lonlat = this.id = this.layer = null; null != this.marker &&
+ (this.destroyMarker(this.marker), this.marker = null); null != this.popup && (this.destroyPopup(this.popup), this.popup = null)
+ }, onScreen: function() { var a = !1; null != this.layer && null != this.layer.map && (a = this.layer.map.getExtent().containsLonLat(this.lonlat)); return a }, createMarker: function() { null != this.lonlat && (this.marker = new OpenLayers.Marker(this.lonlat, this.data.icon)); return this.marker }, destroyMarker: function() { this.marker.destroy() }, createPopup: function(a) {
+ null != this.lonlat && (this.popup || (this.popup = new (this.popupClass ?
+ this.popupClass : OpenLayers.Popup.Anchored)(this.id + "_popup", this.lonlat, this.data.popupSize, this.data.popupContentHTML, this.marker ? this.marker.icon : null, a)), null != this.data.overflow && (this.popup.contentDiv.style.overflow = this.data.overflow), this.popup.feature = this); return this.popup
+ }, destroyPopup: function() { this.popup && (this.popup.feature = null, this.popup.destroy(), this.popup = null) }, CLASS_NAME: "OpenLayers.Feature"
+}); OpenLayers.State = { UNKNOWN: "Unknown", INSERT: "Insert", UPDATE: "Update", DELETE: "Delete" };
+OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, {
+ fid: null, geometry: null, attributes: null, bounds: null, state: null, style: null, url: null, renderIntent: "default", modified: null, initialize: function(a, b, c) { OpenLayers.Feature.prototype.initialize.apply(this, [null, null, b]); this.lonlat = null; this.geometry = a ? a : null; this.state = null; this.attributes = {}; b && (this.attributes = OpenLayers.Util.extend(this.attributes, b)); this.style = c ? c : null }, destroy: function() {
+ this.layer && (this.layer.removeFeatures(this), this.layer =
+ null); this.modified = this.geometry = null; OpenLayers.Feature.prototype.destroy.apply(this, arguments)
+ }, clone: function() { return new OpenLayers.Feature.Vector(this.geometry ? this.geometry.clone() : null, this.attributes, this.style) }, onScreen: function(a) { var b = !1; this.layer && this.layer.map && (b = this.layer.map.getExtent(), a ? (a = this.geometry.getBounds(), b = b.intersectsBounds(a)) : b = b.toGeometry().intersects(this.geometry)); return b }, getVisibility: function() {
+ return !(this.style && "none" == this.style.display || !this.layer ||
+ this.layer && this.layer.styleMap && "none" == this.layer.styleMap.createSymbolizer(this, this.renderIntent).display || this.layer && !this.layer.getVisibility())
+ }, createMarker: function() { return null }, destroyMarker: function() { }, createPopup: function() { return null }, atPoint: function(a, b, c) { var d = !1; this.geometry && (d = this.geometry.atPoint(a, b, c)); return d }, destroyPopup: function() { }, move: function(a) {
+ if (this.layer && this.geometry.move) {
+ a = "OpenLayers.LonLat" == a.CLASS_NAME ? this.layer.getViewPortPxFromLonLat(a) : a; var b =
+ this.layer.getViewPortPxFromLonLat(this.geometry.getBounds().getCenterLonLat()), c = this.layer.map.getResolution(); this.geometry.move(c * (a.x - b.x), c * (b.y - a.y)); this.layer.drawFeature(this); return b
+ }
+ }, toState: function(a) {
+ if (a == OpenLayers.State.UPDATE) switch (this.state) { case OpenLayers.State.UNKNOWN: case OpenLayers.State.DELETE: this.state = a } else if (a == OpenLayers.State.INSERT) switch (this.state) { case OpenLayers.State.UNKNOWN: break; default: this.state = a } else if (a == OpenLayers.State.DELETE) switch (this.state) {
+ case OpenLayers.State.UNKNOWN: case OpenLayers.State.UPDATE: this.state =
+ a
+ } else a == OpenLayers.State.UNKNOWN && (this.state = a)
+ }, CLASS_NAME: "OpenLayers.Feature.Vector"
+});
+OpenLayers.Feature.Vector.style = {
+ "default": { fillColor: "#ee9900", fillOpacity: .4, hoverFillColor: "white", hoverFillOpacity: .8, strokeColor: "#ee9900", strokeOpacity: 1, strokeWidth: 1, strokeLinecap: "round", strokeDashstyle: "solid", hoverStrokeColor: "red", hoverStrokeOpacity: 1, hoverStrokeWidth: .2, pointRadius: 6, hoverPointRadius: 1, hoverPointUnit: "%", pointerEvents: "visiblePainted", cursor: "inherit", fontColor: "#000000", labelAlign: "cm", labelOutlineColor: "white", labelOutlineWidth: 3 }, select: {
+ fillColor: "blue", fillOpacity: .4,
+ hoverFillColor: "white", hoverFillOpacity: .8, strokeColor: "blue", strokeOpacity: 1, strokeWidth: 2, strokeLinecap: "round", strokeDashstyle: "solid", hoverStrokeColor: "red", hoverStrokeOpacity: 1, hoverStrokeWidth: .2, pointRadius: 6, hoverPointRadius: 1, hoverPointUnit: "%", pointerEvents: "visiblePainted", cursor: "pointer", fontColor: "#000000", labelAlign: "cm", labelOutlineColor: "white", labelOutlineWidth: 3
+ }, temporary: {
+ fillColor: "#66cccc", fillOpacity: .2, hoverFillColor: "white", hoverFillOpacity: .8, strokeColor: "#66cccc", strokeOpacity: 1,
+ strokeLinecap: "round", strokeWidth: 2, strokeDashstyle: "solid", hoverStrokeColor: "red", hoverStrokeOpacity: 1, hoverStrokeWidth: .2, pointRadius: 6, hoverPointRadius: 1, hoverPointUnit: "%", pointerEvents: "visiblePainted", cursor: "inherit", fontColor: "#000000", labelAlign: "cm", labelOutlineColor: "white", labelOutlineWidth: 3
+ }, "delete": { display: "none" }
+};
+OpenLayers.Style = OpenLayers.Class({
+ id: null, name: null, title: null, description: null, layerName: null, isDefault: !1, rules: null, context: null, defaultStyle: null, defaultsPerSymbolizer: !1, propertyStyles: null, initialize: function(a, b) { OpenLayers.Util.extend(this, b); this.rules = []; b && b.rules && this.addRules(b.rules); this.setDefaultStyle(a || OpenLayers.Feature.Vector.style["default"]); this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_") }, destroy: function() {
+ for (var a = 0, b = this.rules.length; a < b; a++)this.rules[a].destroy(),
+ this.rules[a] = null; this.defaultStyle = this.rules = null
+ }, createSymbolizer: function(a) {
+ for (var b = this.defaultsPerSymbolizer ? {} : this.createLiterals(OpenLayers.Util.extend({}, this.defaultStyle), a), c = this.rules, d, e = [], f = !1, g = 0, h = c.length; g < h; g++)d = c[g], d.evaluate(a) && (d instanceof OpenLayers.Rule && d.elseFilter ? e.push(d) : (f = !0, this.applySymbolizer(d, b, a))); if (0 == f && 0 < e.length) for (f = !0, g = 0, h = e.length; g < h; g++)this.applySymbolizer(e[g], b, a); 0 < c.length && 0 == f && (b.display = "none"); null != b.label && "string" !== typeof b.label &&
+ (b.label = String(b.label)); return b
+ }, applySymbolizer: function(a, b, c) {
+ var d = c.geometry ? this.getSymbolizerPrefix(c.geometry) : OpenLayers.Style.SYMBOLIZER_PREFIXES[0]; a = a.symbolizer[d] || a.symbolizer; !0 === this.defaultsPerSymbolizer && (d = this.defaultStyle, OpenLayers.Util.applyDefaults(a, { pointRadius: d.pointRadius }), !0 !== a.stroke && !0 !== a.graphic || OpenLayers.Util.applyDefaults(a, { strokeWidth: d.strokeWidth, strokeColor: d.strokeColor, strokeOpacity: d.strokeOpacity, strokeDashstyle: d.strokeDashstyle, strokeLinecap: d.strokeLinecap }),
+ !0 !== a.fill && !0 !== a.graphic || OpenLayers.Util.applyDefaults(a, { fillColor: d.fillColor, fillOpacity: d.fillOpacity }), !0 === a.graphic && OpenLayers.Util.applyDefaults(a, { pointRadius: this.defaultStyle.pointRadius, externalGraphic: this.defaultStyle.externalGraphic, graphicName: this.defaultStyle.graphicName, graphicOpacity: this.defaultStyle.graphicOpacity, graphicWidth: this.defaultStyle.graphicWidth, graphicHeight: this.defaultStyle.graphicHeight, graphicXOffset: this.defaultStyle.graphicXOffset, graphicYOffset: this.defaultStyle.graphicYOffset }));
+ return this.createLiterals(OpenLayers.Util.extend(b, a), c)
+ }, createLiterals: function(a, b) { var c = OpenLayers.Util.extend({}, b.attributes || b.data); OpenLayers.Util.extend(c, this.context); for (var d in this.propertyStyles) a[d] = OpenLayers.Style.createLiteral(a[d], c, b, d); return a }, findPropertyStyles: function() {
+ var a = {}; this.addPropertyStyles(a, this.defaultStyle); for (var b = this.rules, c, d, e = 0, f = b.length; e < f; e++) {
+ c = b[e].symbolizer; for (var g in c) if (d = c[g], "object" == typeof d) this.addPropertyStyles(a, d); else {
+ this.addPropertyStyles(a,
+ c); break
+ }
+ } return a
+ }, addPropertyStyles: function(a, b) { var c, d; for (d in b) c = b[d], "string" == typeof c && c.match(/\$\{\w+\}/) && (a[d] = !0); return a }, addRules: function(a) { Array.prototype.push.apply(this.rules, a); this.propertyStyles = this.findPropertyStyles() }, setDefaultStyle: function(a) { this.defaultStyle = a; this.propertyStyles = this.findPropertyStyles() }, getSymbolizerPrefix: function(a) { for (var b = OpenLayers.Style.SYMBOLIZER_PREFIXES, c = 0, d = b.length; c < d; c++)if (-1 != a.CLASS_NAME.indexOf(b[c])) return b[c] }, clone: function() {
+ var a =
+ OpenLayers.Util.extend({}, this); if (this.rules) { a.rules = []; for (var b = 0, c = this.rules.length; b < c; ++b)a.rules.push(this.rules[b].clone()) } a.context = this.context && OpenLayers.Util.extend({}, this.context); b = OpenLayers.Util.extend({}, this.defaultStyle); return new OpenLayers.Style(b, a)
+ }, CLASS_NAME: "OpenLayers.Style"
+}); OpenLayers.Style.createLiteral = function(a, b, c, d) { "string" == typeof a && -1 != a.indexOf("${") && (a = OpenLayers.String.format(a, b, [c, d]), a = isNaN(a) || !a ? a : parseFloat(a)); return a };
+OpenLayers.Style.SYMBOLIZER_PREFIXES = ["Point", "Line", "Polygon", "Text", "Raster"]; OpenLayers.Filter = OpenLayers.Class({ initialize: function(a) { OpenLayers.Util.extend(this, a) }, destroy: function() { }, evaluate: function(a) { return !0 }, clone: function() { return null }, toString: function() { return OpenLayers.Format && OpenLayers.Format.CQL ? OpenLayers.Format.CQL.prototype.write(this) : Object.prototype.toString.call(this) }, CLASS_NAME: "OpenLayers.Filter" });
+OpenLayers.Filter.Spatial = OpenLayers.Class(OpenLayers.Filter, {
+ type: null, property: null, value: null, distance: null, distanceUnits: null, evaluate: function(a) { var b = !1; switch (this.type) { case OpenLayers.Filter.Spatial.BBOX: case OpenLayers.Filter.Spatial.INTERSECTS: if (a.geometry) { var c = this.value; "OpenLayers.Bounds" == this.value.CLASS_NAME && (c = this.value.toGeometry()); a.geometry.intersects(c) && (b = !0) } break; default: throw Error("evaluate is not implemented for this filter type."); }return b }, clone: function() {
+ var a =
+ OpenLayers.Util.applyDefaults({ value: this.value && this.value.clone && this.value.clone() }, this); return new OpenLayers.Filter.Spatial(a)
+ }, CLASS_NAME: "OpenLayers.Filter.Spatial"
+}); OpenLayers.Filter.Spatial.BBOX = "BBOX"; OpenLayers.Filter.Spatial.INTERSECTS = "INTERSECTS"; OpenLayers.Filter.Spatial.DWITHIN = "DWITHIN"; OpenLayers.Filter.Spatial.WITHIN = "WITHIN"; OpenLayers.Filter.Spatial.CONTAINS = "CONTAINS";
+OpenLayers.Filter.FeatureId = OpenLayers.Class(OpenLayers.Filter, { fids: null, type: "FID", initialize: function(a) { this.fids = []; OpenLayers.Filter.prototype.initialize.apply(this, [a]) }, evaluate: function(a) { for (var b = 0, c = this.fids.length; b < c; b++)if ((a.fid || a.id) == this.fids[b]) return !0; return !1 }, clone: function() { var a = new OpenLayers.Filter.FeatureId; OpenLayers.Util.extend(a, this); a.fids = this.fids.slice(); return a }, CLASS_NAME: "OpenLayers.Filter.FeatureId" });
+OpenLayers.Format.WFST.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance", wfs: "http://www.opengis.net/wfs", gml: "http://www.opengis.net/gml", ogc: "http://www.opengis.net/ogc", ows: "http://www.opengis.net/ows" }, defaultPrefix: "wfs", version: null, schemaLocations: null, srsName: null, extractAttributes: !0, xy: !0, stateName: null, initialize: function(a) {
+ this.stateName = {}; this.stateName[OpenLayers.State.INSERT] = "wfs:Insert"; this.stateName[OpenLayers.State.UPDATE] =
+ "wfs:Update"; this.stateName[OpenLayers.State.DELETE] = "wfs:Delete"; OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+ }, getSrsName: function(a, b) { var c = b && b.srsName; c || (c = a && a.layer ? a.layer.projection.getCode() : this.srsName); return c }, read: function(a, b) {
+ b = b || {}; OpenLayers.Util.applyDefaults(b, { output: "features" }); "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var c = {}; a && this.readNode(a, c, !0); c.features && "features" === b.output &&
+ (c = c.features); return c
+ }, readers: { wfs: { FeatureCollection: function(a, b) { b.features = []; this.readChildNodes(a, b) } } }, write: function(a, b) { var c = this.writeNode("wfs:Transaction", { features: a, options: b }), d = this.schemaLocationAttr(); d && this.setAttributeNS(c, this.namespaces.xsi, "xsi:schemaLocation", d); return OpenLayers.Format.XML.prototype.write.apply(this, [c]) }, writers: {
+ wfs: {
+ GetFeature: function(a) {
+ var b = this.createElementNSPlus("wfs:GetFeature", {
+ attributes: {
+ service: "WFS", version: this.version, handle: a && a.handle,
+ outputFormat: a && a.outputFormat, maxFeatures: a && a.maxFeatures, "xsi:schemaLocation": this.schemaLocationAttr(a)
+ }
+ }); if ("string" == typeof this.featureType) this.writeNode("Query", a, b); else for (var c = 0, d = this.featureType.length; c < d; c++)a.featureType = this.featureType[c], this.writeNode("Query", a, b); return b
+ }, Transaction: function(a) {
+ a = a || {}; var b = a.options || {}, c = this.createElementNSPlus("wfs:Transaction", { attributes: { service: "WFS", version: this.version, handle: b.handle } }), d, e = a.features; if (e) {
+ !0 === b.multi && OpenLayers.Util.extend(this.geometryTypes,
+ { "OpenLayers.Geometry.Point": "MultiPoint", "OpenLayers.Geometry.LineString": !0 === this.multiCurve ? "MultiCurve" : "MultiLineString", "OpenLayers.Geometry.Polygon": !0 === this.multiSurface ? "MultiSurface" : "MultiPolygon" }); var f, g; a = 0; for (d = e.length; a < d; ++a)g = e[a], (f = this.stateName[g.state]) && this.writeNode(f, { feature: g, options: b }, c); !0 === b.multi && this.setGeometryTypes()
+ } if (b.nativeElements) for (a = 0, d = b.nativeElements.length; a < d; ++a)this.writeNode("wfs:Native", b.nativeElements[a], c); return c
+ }, Native: function(a) {
+ return this.createElementNSPlus("wfs:Native",
+ { attributes: { vendorId: a.vendorId, safeToIgnore: a.safeToIgnore }, value: a.value })
+ }, Insert: function(a) { var b = a.feature; a = a.options; a = this.createElementNSPlus("wfs:Insert", { attributes: { handle: a && a.handle } }); this.srsName = this.getSrsName(b); this.writeNode("feature:_typeName", b, a); return a }, Update: function(a) {
+ var b = a.feature; a = a.options; a = this.createElementNSPlus("wfs:Update", { attributes: { handle: a && a.handle, typeName: (this.featureNS ? this.featurePrefix + ":" : "") + this.featureType } }); this.featureNS && a.setAttribute("xmlns:" +
+ this.featurePrefix, this.featureNS); var c = b.modified; null === this.geometryName || c && void 0 === c.geometry || (this.srsName = this.getSrsName(b), this.writeNode("Property", { name: this.geometryName, value: b.geometry }, a)); for (var d in b.attributes) void 0 === b.attributes[d] || c && c.attributes && (!c.attributes || void 0 === c.attributes[d]) || this.writeNode("Property", { name: d, value: b.attributes[d] }, a); this.writeNode("ogc:Filter", new OpenLayers.Filter.FeatureId({ fids: [b.fid] }), a); return a
+ }, Property: function(a) {
+ var b = this.createElementNSPlus("wfs:Property");
+ this.writeNode("Name", a.name, b); null !== a.value && this.writeNode("Value", a.value, b); return b
+ }, Name: function(a) { return this.createElementNSPlus("wfs:Name", { value: a }) }, Value: function(a) { var b; a instanceof OpenLayers.Geometry ? (b = this.createElementNSPlus("wfs:Value"), a = this.writeNode("feature:_geometry", a).firstChild, b.appendChild(a)) : b = this.createElementNSPlus("wfs:Value", { value: a }); return b }, Delete: function(a) {
+ var b = a.feature; a = a.options; a = this.createElementNSPlus("wfs:Delete", {
+ attributes: {
+ handle: a &&
+ a.handle, typeName: (this.featureNS ? this.featurePrefix + ":" : "") + this.featureType
+ }
+ }); this.featureNS && a.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); this.writeNode("ogc:Filter", new OpenLayers.Filter.FeatureId({ fids: [b.fid] }), a); return a
+ }
+ }
+ }, schemaLocationAttr: function(a) {
+ a = OpenLayers.Util.extend({ featurePrefix: this.featurePrefix, schema: this.schema }, a); var b = OpenLayers.Util.extend({}, this.schemaLocations); a.schema && (b[a.featurePrefix] = a.schema); a = []; var c, d; for (d in b) (c = this.namespaces[d]) &&
+ a.push(c + " " + b[d]); return a.join(" ") || void 0
+ }, setFilterProperty: function(a) { if (a.filters) for (var b = 0, c = a.filters.length; b < c; ++b)OpenLayers.Format.WFST.v1.prototype.setFilterProperty.call(this, a.filters[b]); else a instanceof OpenLayers.Filter.Spatial && !a.property && (a.property = this.geometryName) }, CLASS_NAME: "OpenLayers.Format.WFST.v1"
+});
+OpenLayers.Format.OGCExceptionReport = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { ogc: "http://www.opengis.net/ogc" }, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, defaultPrefix: "ogc", read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); var b = { exceptionReport: null }; a.documentElement && (this.readChildNodes(a, b), null === b.exceptionReport && (b = (new OpenLayers.Format.OWSCommon).read(a))); return b }, readers: {
+ ogc: {
+ ServiceExceptionReport: function(a,
+ b) { b.exceptionReport = { exceptions: [] }; this.readChildNodes(a, b.exceptionReport) }, ServiceException: function(a, b) { var c = { code: a.getAttribute("code"), locator: a.getAttribute("locator"), text: this.getChildValue(a) }; b.exceptions.push(c) }
+ }
+ }, CLASS_NAME: "OpenLayers.Format.OGCExceptionReport"
+});
+OpenLayers.Format.XML.VersionedOGC = OpenLayers.Class(OpenLayers.Format.XML, {
+ defaultVersion: null, version: null, profile: null, allowFallback: !1, name: null, stringifyOutput: !1, parser: null, initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]); a = this.CLASS_NAME; this.name = a.substring(a.lastIndexOf(".") + 1) }, getVersion: function(a, b) { var c; a ? (c = this.version, c || (c = a.getAttribute("version"), c || (c = this.defaultVersion))) : c = b && b.version || this.version || this.defaultVersion; return c }, getParser: function(a) {
+ a =
+ a || this.defaultVersion; var b = this.profile ? "_" + this.profile : ""; if (!this.parser || this.parser.VERSION != a) { var c = OpenLayers.Format[this.name]["v" + a.replace(/\./g, "_") + b]; if (!c && ("" !== b && this.allowFallback && (b = "", c = OpenLayers.Format[this.name]["v" + a.replace(/\./g, "_")]), !c)) throw "Can't find a " + this.name + " parser for version " + a + b; this.parser = new c(this.options) } return this.parser
+ }, write: function(a, b) {
+ var c = this.getVersion(null, b); this.parser = this.getParser(c); c = this.parser.write(a, b); return !1 === this.stringifyOutput ?
+ c : OpenLayers.Format.XML.prototype.write.apply(this, [c])
+ }, read: function(a, b) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); var c = this.getVersion(a.documentElement); this.parser = this.getParser(c); var d = this.parser.read(a, b), e = this.parser.errorProperty || null; null !== e && void 0 === d[e] && (e = new OpenLayers.Format.OGCExceptionReport, d.error = e.read(a)); d.version = c; return d }, CLASS_NAME: "OpenLayers.Format.XML.VersionedOGC"
+});
+OpenLayers.Filter.Logical = OpenLayers.Class(OpenLayers.Filter, {
+ filters: null, type: null, initialize: function(a) { this.filters = []; OpenLayers.Filter.prototype.initialize.apply(this, [a]) }, destroy: function() { this.filters = null; OpenLayers.Filter.prototype.destroy.apply(this) }, evaluate: function(a) {
+ var b, c; switch (this.type) {
+ case OpenLayers.Filter.Logical.AND: b = 0; for (c = this.filters.length; b < c; b++)if (0 == this.filters[b].evaluate(a)) return !1; return !0; case OpenLayers.Filter.Logical.OR: b = 0; for (c = this.filters.length; b <
+ c; b++)if (1 == this.filters[b].evaluate(a)) return !0; return !1; case OpenLayers.Filter.Logical.NOT: return !this.filters[0].evaluate(a)
+ }
+ }, clone: function() { for (var a = [], b = 0, c = this.filters.length; b < c; ++b)a.push(this.filters[b].clone()); return new OpenLayers.Filter.Logical({ type: this.type, filters: a }) }, CLASS_NAME: "OpenLayers.Filter.Logical"
+}); OpenLayers.Filter.Logical.AND = "\x26\x26"; OpenLayers.Filter.Logical.OR = "||"; OpenLayers.Filter.Logical.NOT = "!";
+OpenLayers.Filter.Comparison = OpenLayers.Class(OpenLayers.Filter, {
+ type: null, property: null, value: null, matchCase: !0, lowerBoundary: null, upperBoundary: null, initialize: function(a) { OpenLayers.Filter.prototype.initialize.apply(this, [a]); this.type === OpenLayers.Filter.Comparison.LIKE && void 0 === a.matchCase && (this.matchCase = null) }, evaluate: function(a) {
+ a instanceof OpenLayers.Feature.Vector && (a = a.attributes); var b = !1; a = a[this.property]; switch (this.type) {
+ case OpenLayers.Filter.Comparison.EQUAL_TO: b = this.value;
+ b = this.matchCase || "string" != typeof a || "string" != typeof b ? a == b : a.toUpperCase() == b.toUpperCase(); break; case OpenLayers.Filter.Comparison.NOT_EQUAL_TO: b = this.value; b = this.matchCase || "string" != typeof a || "string" != typeof b ? a != b : a.toUpperCase() != b.toUpperCase(); break; case OpenLayers.Filter.Comparison.LESS_THAN: b = a < this.value; break; case OpenLayers.Filter.Comparison.GREATER_THAN: b = a > this.value; break; case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO: b = a <= this.value; break; case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO: b =
+ a >= this.value; break; case OpenLayers.Filter.Comparison.BETWEEN: b = a >= this.lowerBoundary && a <= this.upperBoundary; break; case OpenLayers.Filter.Comparison.LIKE: b = RegExp(this.value, "gi").test(a); break; case OpenLayers.Filter.Comparison.IS_null: b = null === a
+ }return b
+ }, value2regex: function(a, b, c) {
+ if ("." == a) throw Error("'.' is an unsupported wildCard character for OpenLayers.Filter.Comparison"); a = a ? a : "*"; b = b ? b : "."; this.value = this.value.replace(RegExp("\\" + (c ? c : "!") + "(.|$)", "g"), "\\$1"); this.value = this.value.replace(RegExp("\\" +
+ b, "g"), "."); this.value = this.value.replace(RegExp("\\" + a, "g"), ".*"); this.value = this.value.replace(RegExp("\\\\.\\*", "g"), "\\" + a); return this.value = this.value.replace(RegExp("\\\\\\.", "g"), "\\" + b)
+ }, regex2value: function() { var a = this.value, a = a.replace(/!/g, "!!"), a = a.replace(/(\\)?\\\./g, function(a, c) { return c ? a : "!." }), a = a.replace(/(\\)?\\\*/g, function(a, c) { return c ? a : "!*" }), a = a.replace(/\\\\/g, "\\"); return a = a.replace(/\.\*/g, "*") }, clone: function() {
+ return OpenLayers.Util.extend(new OpenLayers.Filter.Comparison,
+ this)
+ }, CLASS_NAME: "OpenLayers.Filter.Comparison"
+}); OpenLayers.Filter.Comparison.EQUAL_TO = "\x3d\x3d"; OpenLayers.Filter.Comparison.NOT_EQUAL_TO = "!\x3d"; OpenLayers.Filter.Comparison.LESS_THAN = "\x3c"; OpenLayers.Filter.Comparison.GREATER_THAN = "\x3e"; OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO = "\x3c\x3d"; OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = "\x3e\x3d"; OpenLayers.Filter.Comparison.BETWEEN = ".."; OpenLayers.Filter.Comparison.LIKE = "~"; OpenLayers.Filter.Comparison.IS_null = "null";
+OpenLayers.Format.Filter = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.0.0", CLASS_NAME: "OpenLayers.Format.Filter" }); OpenLayers.Filter.Function = OpenLayers.Class(OpenLayers.Filter, { name: null, params: null, CLASS_NAME: "OpenLayers.Filter.Function" });
+OpenLayers.Date = {
+ dateRegEx: /^(?:(\d[4])(?:-(\d[2])(?:-(\d[2]))?)?)?(?:(?:T(\d{1,2}):(\d[2]):(\d[2](?:\.\d+)?)(Z|(?:[+-]\d{1,2}(?::(\d[2]))?)))|Z)?$/, toISOString: function() {
+ return "toISOString" in Date.prototype ? function(a) { return a.toISOString() } : function(a) {
+ return isNaN(a.getTime()) ? "Invalid Date" : a.getUTCFullYear() + "-" + OpenLayers.Number.zeroPad(a.getUTCMonth() + 1, 2) + "-" + OpenLayers.Number.zeroPad(a.getUTCDate(), 2) + "T" + OpenLayers.Number.zeroPad(a.getUTCHours(), 2) + ":" + OpenLayers.Number.zeroPad(a.getUTCMinutes(),
+ 2) + ":" + OpenLayers.Number.zeroPad(a.getUTCSeconds(), 2) + "." + OpenLayers.Number.zeroPad(a.getUTCMilliseconds(), 3) + "Z"
+ }
+ }(), parse: function(a) {
+ var b; if ((a = a.match(this.dateRegEx)) && (a[1] || a[7])) {
+ b = parseInt(a[1], 10) || 0; var c = parseInt(a[2], 10) - 1 || 0, d = parseInt(a[3], 10) || 1; b = new Date(Date.UTC(b, c, d)); if (c = a[7]) {
+ var d = parseInt(a[4], 10), e = parseInt(a[5], 10), f = parseFloat(a[6]), g = f | 0, f = Math.round(1E3 * (f - g)); b.setUTCHours(d, e, g, f); "Z" !== c && (c = parseInt(c, 10), a = parseInt(a[8], 10) || 0, a = -1E3 * (3600 * c + 60 * a), b = new Date(b.getTime() +
+ a))
+ }
+ } else b = new Date("invalid"); return b
+ }
+};
+OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { ogc: "http://www.opengis.net/ogc", gml: "http://www.opengis.net/gml", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, defaultPrefix: "ogc", schemaLocation: null, initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]) }, read: function(a) { var b = {}; this.readers.ogc.Filter.apply(this, [a, b]); return b.filter }, readers: {
+ ogc: {
+ _expression: function(a) {
+ for (var b = "", c = a.firstChild; c; c =
+ c.nextSibling)switch (c.nodeType) { case 1: a = this.readNode(c); a.property ? b += "${" + a.property + "}" : void 0 !== a.value && (b += a.value); break; case 3: case 4: b += c.nodeValue }return b
+ }, Filter: function(a, b) { var c = { fids: [], filters: [] }; this.readChildNodes(a, c); 0 < c.fids.length ? b.filter = new OpenLayers.Filter.FeatureId({ fids: c.fids }) : 0 < c.filters.length && (b.filter = c.filters[0]) }, FeatureId: function(a, b) { var c = a.getAttribute("fid"); c && b.fids.push(c) }, And: function(a, b) {
+ var c = new OpenLayers.Filter.Logical({ type: OpenLayers.Filter.Logical.AND });
+ this.readChildNodes(a, c); b.filters.push(c)
+ }, Or: function(a, b) { var c = new OpenLayers.Filter.Logical({ type: OpenLayers.Filter.Logical.OR }); this.readChildNodes(a, c); b.filters.push(c) }, Not: function(a, b) { var c = new OpenLayers.Filter.Logical({ type: OpenLayers.Filter.Logical.NOT }); this.readChildNodes(a, c); b.filters.push(c) }, PropertyIsLessThan: function(a, b) { var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.LESS_THAN }); this.readChildNodes(a, c); b.filters.push(c) }, PropertyIsGreaterThan: function(a,
+ b) { var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.GREATER_THAN }); this.readChildNodes(a, c); b.filters.push(c) }, PropertyIsLessThanOrEqualTo: function(a, b) { var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO }); this.readChildNodes(a, c); b.filters.push(c) }, PropertyIsGreaterThanOrEqualTo: function(a, b) { var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO }); this.readChildNodes(a, c); b.filters.push(c) },
+ PropertyIsBetween: function(a, b) { var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.BETWEEN }); this.readChildNodes(a, c); b.filters.push(c) }, Literal: function(a, b) { b.value = OpenLayers.String.numericIf(this.getChildValue(a), !0) }, PropertyName: function(a, b) { b.property = this.getChildValue(a) }, LowerBoundary: function(a, b) { b.lowerBoundary = OpenLayers.String.numericIf(this.readers.ogc._expression.call(this, a), !0) }, UpperBoundary: function(a, b) {
+ b.upperBoundary = OpenLayers.String.numericIf(this.readers.ogc._expression.call(this,
+ a), !0)
+ }, Intersects: function(a, b) { this.readSpatial(a, b, OpenLayers.Filter.Spatial.INTERSECTS) }, Within: function(a, b) { this.readSpatial(a, b, OpenLayers.Filter.Spatial.WITHIN) }, Contains: function(a, b) { this.readSpatial(a, b, OpenLayers.Filter.Spatial.CONTAINS) }, DWithin: function(a, b) { this.readSpatial(a, b, OpenLayers.Filter.Spatial.DWITHIN) }, Distance: function(a, b) { b.distance = parseInt(this.getChildValue(a)); b.distanceUnits = a.getAttribute("units") }, Function: function(a, b) { }, PropertyIsNull: function(a, b) {
+ var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.IS_null });
+ this.readChildNodes(a, c); b.filters.push(c)
+ }
+ }
+ }, readSpatial: function(a, b, c) { c = new OpenLayers.Filter.Spatial({ type: c }); this.readChildNodes(a, c); c.value = c.components[0]; delete c.components; b.filters.push(c) }, encodeLiteral: function(a) { a instanceof Date && (a = OpenLayers.Date.toISOString(a)); return a }, writeOgcExpression: function(a, b) { a instanceof OpenLayers.Filter.Function ? this.writeNode("Function", a, b) : this.writeNode("Literal", a, b); return b }, write: function(a) { return this.writers.ogc.Filter.apply(this, [a]) },
+ writers: {
+ ogc: {
+ Filter: function(a) { var b = this.createElementNSPlus("ogc:Filter"); this.writeNode(this.getFilterType(a), a, b); return b }, _featureIds: function(a) { for (var b = this.createDocumentFragment(), c = 0, d = a.fids.length; c < d; ++c)this.writeNode("ogc:FeatureId", a.fids[c], b); return b }, FeatureId: function(a) { return this.createElementNSPlus("ogc:FeatureId", { attributes: { fid: a } }) }, And: function(a) {
+ for (var b = this.createElementNSPlus("ogc:And"), c, d = 0, e = a.filters.length; d < e; ++d)c = a.filters[d], this.writeNode(this.getFilterType(c),
+ c, b); return b
+ }, Or: function(a) { for (var b = this.createElementNSPlus("ogc:Or"), c, d = 0, e = a.filters.length; d < e; ++d)c = a.filters[d], this.writeNode(this.getFilterType(c), c, b); return b }, Not: function(a) { var b = this.createElementNSPlus("ogc:Not"); a = a.filters[0]; this.writeNode(this.getFilterType(a), a, b); return b }, PropertyIsLessThan: function(a) { var b = this.createElementNSPlus("ogc:PropertyIsLessThan"); this.writeNode("PropertyName", a, b); this.writeOgcExpression(a.value, b); return b }, PropertyIsGreaterThan: function(a) {
+ var b =
+ this.createElementNSPlus("ogc:PropertyIsGreaterThan"); this.writeNode("PropertyName", a, b); this.writeOgcExpression(a.value, b); return b
+ }, PropertyIsLessThanOrEqualTo: function(a) { var b = this.createElementNSPlus("ogc:PropertyIsLessThanOrEqualTo"); this.writeNode("PropertyName", a, b); this.writeOgcExpression(a.value, b); return b }, PropertyIsGreaterThanOrEqualTo: function(a) {
+ var b = this.createElementNSPlus("ogc:PropertyIsGreaterThanOrEqualTo"); this.writeNode("PropertyName", a, b); this.writeOgcExpression(a.value, b);
+ return b
+ }, PropertyIsBetween: function(a) { var b = this.createElementNSPlus("ogc:PropertyIsBetween"); this.writeNode("PropertyName", a, b); this.writeNode("LowerBoundary", a, b); this.writeNode("UpperBoundary", a, b); return b }, PropertyName: function(a) { return this.createElementNSPlus("ogc:PropertyName", { value: a.property }) }, Literal: function(a) { return this.createElementNSPlus("ogc:Literal", { value: (this.encodeLiteral || OpenLayers.Format.Filter.v1.prototype.encodeLiteral)(a) }) }, LowerBoundary: function(a) {
+ var b = this.createElementNSPlus("ogc:LowerBoundary");
+ this.writeOgcExpression(a.lowerBoundary, b); return b
+ }, UpperBoundary: function(a) { var b = this.createElementNSPlus("ogc:UpperBoundary"); this.writeNode("Literal", a.upperBoundary, b); return b }, INTERSECTS: function(a) { return this.writeSpatial(a, "Intersects") }, WITHIN: function(a) { return this.writeSpatial(a, "Within") }, CONTAINS: function(a) { return this.writeSpatial(a, "Contains") }, DWITHIN: function(a) { var b = this.writeSpatial(a, "DWithin"); this.writeNode("Distance", a, b); return b }, Distance: function(a) {
+ return this.createElementNSPlus("ogc:Distance",
+ { attributes: { units: a.distanceUnits }, value: a.distance })
+ }, Function: function(a) { var b = this.createElementNSPlus("ogc:Function", { attributes: { name: a.name } }); a = a.params; for (var c = 0, d = a.length; c < d; c++)this.writeOgcExpression(a[c], b); return b }, PropertyIsNull: function(a) { var b = this.createElementNSPlus("ogc:PropertyIsNull"); this.writeNode("PropertyName", a, b); return b }
+ }
+ }, getFilterType: function(a) { var b = this.filterMap[a.type]; if (!b) throw "Filter writing not supported for rule type: " + a.type; return b }, filterMap: {
+ "\x26\x26": "And",
+ "||": "Or", "!": "Not", "\x3d\x3d": "PropertyIsEqualTo", "!\x3d": "PropertyIsNotEqualTo", "\x3c": "PropertyIsLessThan", "\x3e": "PropertyIsGreaterThan", "\x3c\x3d": "PropertyIsLessThanOrEqualTo", "\x3e\x3d": "PropertyIsGreaterThanOrEqualTo", "..": "PropertyIsBetween", "~": "PropertyIsLike", null: "PropertyIsNull", BBOX: "BBOX", DWITHIN: "DWITHIN", WITHIN: "WITHIN", CONTAINS: "CONTAINS", INTERSECTS: "INTERSECTS", FID: "_featureIds"
+ }, CLASS_NAME: "OpenLayers.Format.Filter.v1"
+});
+OpenLayers.Geometry = OpenLayers.Class({
+ id: null, parent: null, bounds: null, initialize: function() { this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_") }, destroy: function() { this.bounds = this.id = null }, clone: function() { return new OpenLayers.Geometry }, setBounds: function(a) { a && (this.bounds = a.clone()) }, clearBounds: function() { this.bounds = null; this.parent && this.parent.clearBounds() }, extendBounds: function(a) { this.getBounds() ? this.bounds.extend(a) : this.setBounds(a) }, getBounds: function() {
+ null == this.bounds && this.calculateBounds();
+ return this.bounds
+ }, calculateBounds: function() { }, distanceTo: function(a, b) { }, getVertices: function(a) { }, atPoint: function(a, b, c) { var d = !1; null != this.getBounds() && null != a && (b = null != b ? b : 0, c = null != c ? c : 0, d = (new OpenLayers.Bounds(this.bounds.left - b, this.bounds.bottom - c, this.bounds.right + b, this.bounds.top + c)).containsLonLat(a)); return d }, getLength: function() { return 0 }, getArea: function() { return 0 }, getCentroid: function() { return null }, toString: function() {
+ return OpenLayers.Format && OpenLayers.Format.WKT ? OpenLayers.Format.WKT.prototype.write(new OpenLayers.Feature.Vector(this)) :
+ Object.prototype.toString.call(this)
+ }, CLASS_NAME: "OpenLayers.Geometry"
+}); OpenLayers.Geometry.fromWKT = function(a) { var b; if (OpenLayers.Format && OpenLayers.Format.WKT) { var c = OpenLayers.Geometry.fromWKT.format; c || (c = new OpenLayers.Format.WKT, OpenLayers.Geometry.fromWKT.format = c); a = c.read(a); if (a instanceof OpenLayers.Feature.Vector) b = a.geometry; else if (OpenLayers.Util.isArray(a)) { b = a.length; for (var c = Array(b), d = 0; d < b; ++d)c[d] = a[d].geometry; b = new OpenLayers.Geometry.Collection(c) } } return b };
+OpenLayers.Geometry.segmentsIntersect = function(a, b, c) {
+ var d = c && c.point; c = c && c.tolerance; var e = !1, f = a.x1 - b.x1, g = a.y1 - b.y1, h = a.x2 - a.x1, k = a.y2 - a.y1, l = b.y2 - b.y1, m = b.x2 - b.x1, n = l * h - m * k, l = m * g - l * f, g = h * g - k * f; 0 == n ? 0 == l && 0 == g && (e = !0) : (f = l / n, n = g / n, 0 <= f && 1 >= f && 0 <= n && 1 >= n && (d ? (h = a.x1 + f * h, n = a.y1 + f * k, e = new OpenLayers.Geometry.Point(h, n)) : e = !0)); if (c) if (e) { if (d) a: for (a = [a, b], b = 0; 2 > b; ++b)for (f = a[b], k = 1; 3 > k; ++k)if (h = f["x" + k], n = f["y" + k], d = Math.sqrt(Math.pow(h - e.x, 2) + Math.pow(n - e.y, 2)), d < c) { e.x = h; e.y = n; break a } } else a: for (a =
+ [a, b], b = 0; 2 > b; ++b)for (h = a[b], n = a[(b + 1) % 2], k = 1; 3 > k; ++k)if (f = { x: h["x" + k], y: h["y" + k] }, g = OpenLayers.Geometry.distanceToSegment(f, n), g.distance < c) { e = d ? new OpenLayers.Geometry.Point(f.x, f.y) : !0; break a } return e
+}; OpenLayers.Geometry.distanceToSegment = function(a, b) { var c = OpenLayers.Geometry.distanceSquaredToSegment(a, b); c.distance = Math.sqrt(c.distance); return c };
+OpenLayers.Geometry.distanceSquaredToSegment = function(a, b) { var c = a.x, d = a.y, e = b.x1, f = b.y1, g = b.x2, h = b.y2, k = g - e, l = h - f, m = (k * (c - e) + l * (d - f)) / (Math.pow(k, 2) + Math.pow(l, 2)); 0 >= m || (1 <= m ? (e = g, f = h) : (e += m * k, f += m * l)); return { distance: Math.pow(e - c, 2) + Math.pow(f - d, 2), x: e, y: f, along: m } };
+OpenLayers.Geometry.Point = OpenLayers.Class(OpenLayers.Geometry, {
+ x: null, y: null, initialize: function(a, b) { OpenLayers.Geometry.prototype.initialize.apply(this, arguments); this.x = parseFloat(a); this.y = parseFloat(b) }, clone: function(a) { null == a && (a = new OpenLayers.Geometry.Point(this.x, this.y)); OpenLayers.Util.applyDefaults(a, this); return a }, calculateBounds: function() { this.bounds = new OpenLayers.Bounds(this.x, this.y, this.x, this.y) }, distanceTo: function(a, b) {
+ var c = !(b && !1 === b.edge) && b && b.details, d, e, f, g, h; a instanceof
+ OpenLayers.Geometry.Point ? (e = this.x, f = this.y, g = a.x, h = a.y, d = Math.sqrt(Math.pow(e - g, 2) + Math.pow(f - h, 2)), d = c ? { x0: e, y0: f, x1: g, y1: h, distance: d } : d) : (d = a.distanceTo(this, b), c && (d = { x0: d.x1, y0: d.y1, x1: d.x0, y1: d.y0, distance: d.distance })); return d
+ }, equals: function(a) { var b = !1; null != a && (b = this.x == a.x && this.y == a.y || isNaN(this.x) && isNaN(this.y) && isNaN(a.x) && isNaN(a.y)); return b }, toShortString: function() { return this.x + ", " + this.y }, move: function(a, b) { this.x += a; this.y += b; this.clearBounds() }, rotate: function(a, b) {
+ a *=
+ Math.PI / 180; var c = this.distanceTo(b), d = a + Math.atan2(this.y - b.y, this.x - b.x); this.x = b.x + c * Math.cos(d); this.y = b.y + c * Math.sin(d); this.clearBounds()
+ }, getCentroid: function() { return new OpenLayers.Geometry.Point(this.x, this.y) }, resize: function(a, b, c) { this.x = b.x + a * (void 0 == c ? 1 : c) * (this.x - b.x); this.y = b.y + a * (this.y - b.y); this.clearBounds(); return this }, intersects: function(a) { return "OpenLayers.Geometry.Point" == a.CLASS_NAME ? this.equals(a) : a.intersects(this) }, transform: function(a, b) {
+ a && b && (OpenLayers.Projection.transform(this,
+ a, b), this.bounds = null); return this
+ }, getVertices: function(a) { return [this] }, CLASS_NAME: "OpenLayers.Geometry.Point"
+});
+OpenLayers.Geometry.Collection = OpenLayers.Class(OpenLayers.Geometry, {
+ components: null, componentTypes: null, initialize: function(a) { OpenLayers.Geometry.prototype.initialize.apply(this, arguments); this.components = []; null != a && this.addComponents(a) }, destroy: function() { this.components.length = 0; this.components = null; OpenLayers.Geometry.prototype.destroy.apply(this, arguments) }, clone: function() {
+ for (var a = eval("new " + this.CLASS_NAME + "()"), b = 0, c = this.components.length; b < c; b++)a.addComponent(this.components[b].clone());
+ OpenLayers.Util.applyDefaults(a, this); return a
+ }, getComponentsString: function() { for (var a = [], b = 0, c = this.components.length; b < c; b++)a.push(this.components[b].toShortString()); return a.join(",") }, calculateBounds: function() { this.bounds = null; var a = new OpenLayers.Bounds, b = this.components; if (b) for (var c = 0, d = b.length; c < d; c++)a.extend(b[c].getBounds()); null != a.left && null != a.bottom && null != a.right && null != a.top && this.setBounds(a) }, addComponents: function(a) {
+ OpenLayers.Util.isArray(a) || (a = [a]); for (var b = 0, c = a.length; b <
+ c; b++)this.addComponent(a[b])
+ }, addComponent: function(a, b) { var c = !1; if (a && (null == this.componentTypes || -1 < OpenLayers.Util.indexOf(this.componentTypes, a.CLASS_NAME))) { if (null != b && b < this.components.length) { var c = this.components.slice(0, b), d = this.components.slice(b, this.components.length); c.push(a); this.components = c.concat(d) } else this.components.push(a); a.parent = this; this.clearBounds(); c = !0 } return c }, removeComponents: function(a) {
+ var b = !1; OpenLayers.Util.isArray(a) || (a = [a]); for (var c = a.length - 1; 0 <= c; --c)b =
+ this.removeComponent(a[c]) || b; return b
+ }, removeComponent: function(a) { OpenLayers.Util.removeItem(this.components, a); this.clearBounds(); return !0 }, getLength: function() { for (var a = 0, b = 0, c = this.components.length; b < c; b++)a += this.components[b].getLength(); return a }, getArea: function() { for (var a = 0, b = 0, c = this.components.length; b < c; b++)a += this.components[b].getArea(); return a }, getGeodesicArea: function(a) { for (var b = 0, c = 0, d = this.components.length; c < d; c++)b += this.components[c].getGeodesicArea(a); return b }, getCentroid: function(a) {
+ if (!a) return this.components.length &&
+ this.components[0].getCentroid(); a = this.components.length; if (!a) return !1; for (var b = [], c = [], d = 0, e = Number.MAX_VALUE, f, g = 0; g < a; ++g) { f = this.components[g]; var h = f.getArea(); f = f.getCentroid(!0); isNaN(h) || isNaN(f.x) || isNaN(f.y) || (b.push(h), d += h, e = h < e && 0 < h ? h : e, c.push(f)) } a = b.length; if (0 === d) { for (g = 0; g < a; ++g)b[g] = 1; d = b.length } else { for (g = 0; g < a; ++g)b[g] /= e; d /= e } for (var k = e = 0, g = 0; g < a; ++g)f = c[g], h = b[g], e += f.x * h, k += f.y * h; return new OpenLayers.Geometry.Point(e / d, k / d)
+ }, getGeodesicLength: function(a) {
+ for (var b = 0, c =
+ 0, d = this.components.length; c < d; c++)b += this.components[c].getGeodesicLength(a); return b
+ }, move: function(a, b) { for (var c = 0, d = this.components.length; c < d; c++)this.components[c].move(a, b) }, rotate: function(a, b) { for (var c = 0, d = this.components.length; c < d; ++c)this.components[c].rotate(a, b) }, resize: function(a, b, c) { for (var d = 0; d < this.components.length; ++d)this.components[d].resize(a, b, c); return this }, distanceTo: function(a, b) {
+ for (var c = !(b && !1 === b.edge) && b && b.details, d, e, f, g = Number.POSITIVE_INFINITY, h = 0, k = this.components.length; h <
+ k && !(d = this.components[h].distanceTo(a, b), f = c ? d.distance : d, f < g && (g = f, e = d, 0 == g)); ++h); return e
+ }, equals: function(a) { var b = !0; if (a && a.CLASS_NAME && this.CLASS_NAME == a.CLASS_NAME) if (OpenLayers.Util.isArray(a.components) && a.components.length == this.components.length) for (var c = 0, d = this.components.length; c < d; ++c) { if (!this.components[c].equals(a.components[c])) { b = !1; break } } else b = !1; else b = !1; return b }, transform: function(a, b) {
+ if (a && b) {
+ for (var c = 0, d = this.components.length; c < d; c++)this.components[c].transform(a,
+ b); this.bounds = null
+ } return this
+ }, intersects: function(a) { for (var b = !1, c = 0, d = this.components.length; c < d && !(b = a.intersects(this.components[c])); ++c); return b }, getVertices: function(a) { for (var b = [], c = 0, d = this.components.length; c < d; ++c)Array.prototype.push.apply(b, this.components[c].getVertices(a)); return b }, CLASS_NAME: "OpenLayers.Geometry.Collection"
+});
+OpenLayers.Geometry.MultiPoint = OpenLayers.Class(OpenLayers.Geometry.Collection, { componentTypes: ["OpenLayers.Geometry.Point"], addPoint: function(a, b) { this.addComponent(a, b) }, removePoint: function(a) { this.removeComponent(a) }, CLASS_NAME: "OpenLayers.Geometry.MultiPoint" });
+OpenLayers.Geometry.Curve = OpenLayers.Class(OpenLayers.Geometry.MultiPoint, {
+ componentTypes: ["OpenLayers.Geometry.Point"], getLength: function() { var a = 0; if (this.components && 1 < this.components.length) for (var b = 1, c = this.components.length; b < c; b++)a += this.components[b - 1].distanceTo(this.components[b]); return a }, getGeodesicLength: function(a) {
+ var b = this; if (a) { var c = new OpenLayers.Projection("EPSG:4326"); c.equals(a) || (b = this.clone().transform(a, c)) } a = 0; if (b.components && 1 < b.components.length) for (var d, e = 1, f = b.components.length; e <
+ f; e++)c = b.components[e - 1], d = b.components[e], a += OpenLayers.Util.distVincenty({ lon: c.x, lat: c.y }, { lon: d.x, lat: d.y }); return 1E3 * a
+ }, CLASS_NAME: "OpenLayers.Geometry.Curve"
+});
+OpenLayers.Geometry.LineString = OpenLayers.Class(OpenLayers.Geometry.Curve, {
+ removeComponent: function(a) { var b = this.components && 2 < this.components.length; b && OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this, arguments); return b }, intersects: function(a) {
+ var b = !1, c = a.CLASS_NAME; if ("OpenLayers.Geometry.LineString" == c || "OpenLayers.Geometry.LinearRing" == c || "OpenLayers.Geometry.Point" == c) {
+ var d = this.getSortedSegments(); a = "OpenLayers.Geometry.Point" == c ? [{ x1: a.x, y1: a.y, x2: a.x, y2: a.y }] : a.getSortedSegments();
+ var e, f, g, h, k, l, m, n = 0, p = d.length; a: for (; n < p; ++n) { c = d[n]; e = c.x1; f = c.x2; g = c.y1; h = c.y2; for (var q = 0, r = a.length; q < r; ++q) { k = a[q]; if (k.x1 > f) break; if (!(k.x2 < e || (l = k.y1, m = k.y2, Math.min(l, m) > Math.max(g, h) || Math.max(l, m) < Math.min(g, h) || !OpenLayers.Geometry.segmentsIntersect(c, k)))) { b = !0; break a } } }
+ } else b = a.intersects(this); return b
+ }, getSortedSegments: function() {
+ for (var a = this.components.length - 1, b = Array(a), c, d, e = 0; e < a; ++e)c = this.components[e], d = this.components[e + 1], b[e] = c.x < d.x ? { x1: c.x, y1: c.y, x2: d.x, y2: d.y } :
+ { x1: d.x, y1: d.y, x2: c.x, y2: c.y }; return b.sort(function(a, b) { return a.x1 - b.x1 })
+ }, splitWithSegment: function(a, b) {
+ for (var c = !(b && !1 === b.edge), d = b && b.tolerance, e = [], f = this.getVertices(), g = [], h = [], k = !1, l, m, n = { point: !0, tolerance: d }, p = null, q = 0, r = f.length - 2; q <= r; ++q)if (d = f[q], g.push(d.clone()), l = f[q + 1], m = { x1: d.x, y1: d.y, x2: l.x, y2: l.y }, m = OpenLayers.Geometry.segmentsIntersect(a, m, n), m instanceof OpenLayers.Geometry.Point && ((m.x === a.x1 && m.y === a.y1 || m.x === a.x2 && m.y === a.y2 || m.equals(d) || m.equals(l) ? !0 : !1) || c)) m.equals(h[h.length -
+ 1]) || h.push(m.clone()), 0 === q && m.equals(d) || m.equals(l) || (k = !0, m.equals(d) || g.push(m), e.push(new OpenLayers.Geometry.LineString(g)), g = [m.clone()]); k && (g.push(l.clone()), e.push(new OpenLayers.Geometry.LineString(g))); if (0 < h.length) var t = a.x1 < a.x2 ? 1 : -1, u = a.y1 < a.y2 ? 1 : -1, p = { lines: e, points: h.sort(function(a, b) { return t * a.x - t * b.x || u * a.y - u * b.y }) }; return p
+ }, split: function(a, b) {
+ var c = null, d = b && b.mutual, e, f, g, h; if (a instanceof OpenLayers.Geometry.LineString) {
+ var k = this.getVertices(), l, m, n, p, q, r = []; g = []; for (var t =
+ 0, u = k.length - 2; t <= u; ++t) { l = k[t]; m = k[t + 1]; n = { x1: l.x, y1: l.y, x2: m.x, y2: m.y }; h = h || [a]; d && r.push(l.clone()); for (var v = 0; v < h.length; ++v)if (p = h[v].splitWithSegment(n, b)) if (q = p.lines, 0 < q.length && (q.unshift(v, 1), Array.prototype.splice.apply(h, q), v += q.length - 2), d) for (var w = 0, x = p.points.length; w < x; ++w)q = p.points[w], q.equals(l) || (r.push(q), g.push(new OpenLayers.Geometry.LineString(r)), r = q.equals(m) ? [] : [q.clone()]) } d && 0 < g.length && 0 < r.length && (r.push(m.clone()), g.push(new OpenLayers.Geometry.LineString(r)))
+ } else c =
+ a.splitWith(this, b); h && 1 < h.length ? f = !0 : h = []; g && 1 < g.length ? e = !0 : g = []; if (f || e) c = d ? [g, h] : h; return c
+ }, splitWith: function(a, b) { return a.split(this, b) }, getVertices: function(a) { return !0 === a ? [this.components[0], this.components[this.components.length - 1]] : !1 === a ? this.components.slice(1, this.components.length - 1) : this.components.slice() }, distanceTo: function(a, b) {
+ var c = !(b && !1 === b.edge) && b && b.details, d, e = {}, f = Number.POSITIVE_INFINITY; if (a instanceof OpenLayers.Geometry.Point) {
+ for (var g = this.getSortedSegments(),
+ h = a.x, k = a.y, l, m = 0, n = g.length; m < n; ++m)if (l = g[m], d = OpenLayers.Geometry.distanceToSegment(a, l), d.distance < f) { if (f = d.distance, e = d, 0 === f) break } else if (l.x2 > h && (k > l.y1 && k < l.y2 || k < l.y1 && k > l.y2)) break; e = c ? { distance: e.distance, x0: e.x, y0: e.y, x1: h, y1: k } : e.distance
+ } else if (a instanceof OpenLayers.Geometry.LineString) {
+ var g = this.getSortedSegments(), h = a.getSortedSegments(), p, q, r = h.length, t = { point: !0 }, m = 0, n = g.length; a: for (; m < n; ++m) {
+ k = g[m]; l = k.x1; q = k.y1; for (var u = 0; u < r; ++u)if (d = h[u], p = OpenLayers.Geometry.segmentsIntersect(k,
+ d, t)) { f = 0; e = { distance: 0, x0: p.x, y0: p.y, x1: p.x, y1: p.y }; break a } else d = OpenLayers.Geometry.distanceToSegment({ x: l, y: q }, d), d.distance < f && (f = d.distance, e = { distance: f, x0: l, y0: q, x1: d.x, y1: d.y })
+ } c || (e = e.distance); 0 !== f && k && (d = a.distanceTo(new OpenLayers.Geometry.Point(k.x2, k.y2), b), m = c ? d.distance : d, m < f && (e = c ? { distance: f, x0: d.x1, y0: d.y1, x1: d.x0, y1: d.y0 } : m))
+ } else e = a.distanceTo(this, b), c && (e = { distance: e.distance, x0: e.x1, y0: e.y1, x1: e.x0, y1: e.y0 }); return e
+ }, simplify: function(a) {
+ if (this && null !== this) {
+ var b = this.getVertices();
+ if (3 > b.length) return this; var c = function(a, b, d, k) { for (var l = 0, m = 0, n = b, p; n < d; n++) { p = a[b]; var q = a[d], r = a[n], r = Math.abs(.5 * (p.x * q.y + q.x * r.y + r.x * p.y - q.x * p.y - r.x * q.y - p.x * r.y)); p = Math.sqrt(Math.pow(p.x - q.x, 2) + Math.pow(p.y - q.y, 2)); p = r / p * 2; p > l && (l = p, m = n) } l > k && m != b && (e.push(m), c(a, b, m, k), c(a, m, d, k)) }, d = b.length - 1, e = []; e.push(0); for (e.push(d); b[0].equals(b[d]);)d--, e.push(d); c(b, 0, d, a); a = []; e.sort(function(a, b) { return a - b }); for (d = 0; d < e.length; d++)a.push(b[e[d]]); return new OpenLayers.Geometry.LineString(a)
+ } return this
+ },
+ CLASS_NAME: "OpenLayers.Geometry.LineString"
+});
+OpenLayers.Geometry.MultiLineString = OpenLayers.Class(OpenLayers.Geometry.Collection, {
+ componentTypes: ["OpenLayers.Geometry.LineString"], split: function(a, b) {
+ for (var c = null, d = b && b.mutual, e, f, g, h, k = [], l = [a], m = 0, n = this.components.length; m < n; ++m) {
+ f = this.components[m]; g = !1; for (var p = 0; p < l.length; ++p)if (e = f.split(l[p], b)) {
+ if (d) { g = e[0]; for (var q = 0, r = g.length; q < r; ++q)0 === q && k.length ? k[k.length - 1].addComponent(g[q]) : k.push(new OpenLayers.Geometry.MultiLineString([g[q]])); g = !0; e = e[1] } if (e.length) {
+ e.unshift(p,
+ 1); Array.prototype.splice.apply(l, e); break
+ }
+ } g || (k.length ? k[k.length - 1].addComponent(f.clone()) : k = [new OpenLayers.Geometry.MultiLineString(f.clone())])
+ } k && 1 < k.length ? g = !0 : k = []; l && 1 < l.length ? h = !0 : l = []; if (g || h) c = d ? [k, l] : l; return c
+ }, splitWith: function(a, b) {
+ var c = null, d = b && b.mutual, e, f, g, h, k, l; if (a instanceof OpenLayers.Geometry.LineString) {
+ l = []; k = [a]; for (var m = 0, n = this.components.length; m < n; ++m) {
+ g = !1; f = this.components[m]; for (var p = 0; p < k.length; ++p)if (e = k[p].split(f, b)) {
+ d && (g = e[0], g.length && (g.unshift(p,
+ 1), Array.prototype.splice.apply(k, g), p += g.length - 2), e = e[1], 0 === e.length && (e = [f.clone()])); g = 0; for (var q = e.length; g < q; ++g)0 === g && l.length ? l[l.length - 1].addComponent(e[g]) : l.push(new OpenLayers.Geometry.MultiLineString([e[g]])); g = !0
+ } g || (l.length ? l[l.length - 1].addComponent(f.clone()) : l = [new OpenLayers.Geometry.MultiLineString([f.clone()])])
+ }
+ } else c = a.split(this); k && 1 < k.length ? h = !0 : k = []; l && 1 < l.length ? g = !0 : l = []; if (h || g) c = d ? [k, l] : l; return c
+ }, CLASS_NAME: "OpenLayers.Geometry.MultiLineString"
+});
+OpenLayers.Geometry.LinearRing = OpenLayers.Class(OpenLayers.Geometry.LineString, {
+ componentTypes: ["OpenLayers.Geometry.Point"], addComponent: function(a, b) { var c = !1, d = this.components.pop(); null == b && a.equals(d) || (c = OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, arguments)); OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, [this.components[0]]); return c }, removeComponent: function(a) {
+ var b = this.components && 3 < this.components.length; b && (this.components.pop(), OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,
+ arguments), OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, [this.components[0]])); return b
+ }, move: function(a, b) { for (var c = 0, d = this.components.length; c < d - 1; c++)this.components[c].move(a, b) }, rotate: function(a, b) { for (var c = 0, d = this.components.length; c < d - 1; ++c)this.components[c].rotate(a, b) }, resize: function(a, b, c) { for (var d = 0, e = this.components.length; d < e - 1; ++d)this.components[d].resize(a, b, c); return this }, transform: function(a, b) {
+ if (a && b) {
+ for (var c = 0, d = this.components.length; c < d - 1; c++)this.components[c].transform(a,
+ b); this.bounds = null
+ } return this
+ }, getCentroid: function() {
+ if (this.components) {
+ var a = this.components.length; if (0 < a && 2 >= a) return this.components[0].clone(); if (2 < a) {
+ var b = 0, c = 0, d = this.components[0].x, e = this.components[0].y, f = -1 * this.getArea(); if (0 != f) { for (var g = 0; g < a - 1; g++)var h = this.components[g], k = this.components[g + 1], b = b + (h.x + k.x - 2 * d) * ((h.x - d) * (k.y - e) - (k.x - d) * (h.y - e)), c = c + (h.y + k.y - 2 * e) * ((h.x - d) * (k.y - e) - (k.x - d) * (h.y - e)); b = d + b / (6 * f); a = e + c / (6 * f) } else {
+ for (g = 0; g < a - 1; g++)b += this.components[g].x, c += this.components[g].y;
+ b /= a - 1; a = c / (a - 1)
+ } return new OpenLayers.Geometry.Point(b, a)
+ } return null
+ }
+ }, getArea: function() { var a = 0; if (this.components && 2 < this.components.length) { for (var b = a = 0, c = this.components.length; b < c - 1; b++)var d = this.components[b], e = this.components[b + 1], a = a + (d.x + e.x) * (e.y - d.y); a = -a / 2 } return a }, getGeodesicArea: function(a) {
+ var b = this; if (a) { var c = new OpenLayers.Projection("EPSG:4326"); c.equals(a) || (b = this.clone().transform(a, c)) } a = 0; c = b.components && b.components.length; if (2 < c) {
+ for (var d, e, f = 0; f < c - 1; f++)d = b.components[f],
+ e = b.components[f + 1], a += OpenLayers.Util.rad(e.x - d.x) * (2 + Math.sin(OpenLayers.Util.rad(d.y)) + Math.sin(OpenLayers.Util.rad(e.y))); a = 40680631590769 * a / 2
+ } return a
+ }, containsPoint: function(a) {
+ var b = OpenLayers.Number.limitSigDigs, c = b(a.x, 14); a = b(a.y, 14); for (var d = this.components.length - 1, e, f, g, h, k, l = 0, m = 0; m < d; ++m)if (e = this.components[m], g = b(e.x, 14), e = b(e.y, 14), f = this.components[m + 1], h = b(f.x, 14), f = b(f.y, 14), e == f) { if (a == e && (g <= h && c >= g && c <= h || g >= h && c <= g && c >= h)) { l = -1; break } } else {
+ k = b((h - g) / (f - e) * (a - f) + h, 14); if (k ==
+ c && (e < f && a >= e && a <= f || e > f && a <= e && a >= f)) { l = -1; break } k <= c || g != h && (k < Math.min(g, h) || k > Math.max(g, h)) || (e < f && a >= e && a < f || e > f && a < e && a >= f) && ++l
+ } return -1 == l ? 1 : !!(l & 1)
+ }, intersects: function(a) {
+ var b = !1; if ("OpenLayers.Geometry.Point" == a.CLASS_NAME) b = this.containsPoint(a); else if ("OpenLayers.Geometry.LineString" == a.CLASS_NAME) b = a.intersects(this); else if ("OpenLayers.Geometry.LinearRing" == a.CLASS_NAME) b = OpenLayers.Geometry.LineString.prototype.intersects.apply(this, [a]); else for (var c = 0, d = a.components.length; c <
+ d && !(b = a.components[c].intersects(this)); ++c); return b
+ }, getVertices: function(a) { return !0 === a ? [] : this.components.slice(0, this.components.length - 1) }, CLASS_NAME: "OpenLayers.Geometry.LinearRing"
+});
+OpenLayers.Geometry.Polygon = OpenLayers.Class(OpenLayers.Geometry.Collection, {
+ componentTypes: ["OpenLayers.Geometry.LinearRing"], getArea: function() { var a = 0; if (this.components && 0 < this.components.length) for (var a = a + Math.abs(this.components[0].getArea()), b = 1, c = this.components.length; b < c; b++)a -= Math.abs(this.components[b].getArea()); return a }, getGeodesicArea: function(a) {
+ var b = 0; if (this.components && 0 < this.components.length) for (var b = b + Math.abs(this.components[0].getGeodesicArea(a)), c = 1, d = this.components.length; c <
+ d; c++)b -= Math.abs(this.components[c].getGeodesicArea(a)); return b
+ }, containsPoint: function(a) { var b = this.components.length, c = !1; if (0 < b && (c = this.components[0].containsPoint(a), 1 !== c && c && 1 < b)) for (var d, e = 1; e < b; ++e)if (d = this.components[e].containsPoint(a)) { c = 1 === d ? 1 : !1; break } return c }, intersects: function(a) {
+ var b = !1, c, d; if ("OpenLayers.Geometry.Point" == a.CLASS_NAME) b = this.containsPoint(a); else if ("OpenLayers.Geometry.LineString" == a.CLASS_NAME || "OpenLayers.Geometry.LinearRing" == a.CLASS_NAME) {
+ c = 0; for (d =
+ this.components.length; c < d && !(b = a.intersects(this.components[c])); ++c); if (!b) for (c = 0, d = a.components.length; c < d && !(b = this.containsPoint(a.components[c])); ++c);
+ } else for (c = 0, d = a.components.length; c < d && !(b = this.intersects(a.components[c])); ++c); if (!b && "OpenLayers.Geometry.Polygon" == a.CLASS_NAME) { var e = this.components[0]; c = 0; for (d = e.components.length; c < d && !(b = a.containsPoint(e.components[c])); ++c); } return b
+ }, distanceTo: function(a, b) {
+ return b && !1 === b.edge && this.intersects(a) ? 0 : OpenLayers.Geometry.Collection.prototype.distanceTo.apply(this,
+ [a, b])
+ }, CLASS_NAME: "OpenLayers.Geometry.Polygon"
+}); OpenLayers.Geometry.Polygon.createRegularPolygon = function(a, b, c, d) { var e = Math.PI * (1 / c - .5); d && (e += d / 180 * Math.PI); for (var f, g = [], h = 0; h < c; ++h)f = e + 2 * h * Math.PI / c, d = a.x + b * Math.cos(f), f = a.y + b * Math.sin(f), g.push(new OpenLayers.Geometry.Point(d, f)); a = new OpenLayers.Geometry.LinearRing(g); return new OpenLayers.Geometry.Polygon([a]) };
+OpenLayers.Geometry.MultiPolygon = OpenLayers.Class(OpenLayers.Geometry.Collection, { componentTypes: ["OpenLayers.Geometry.Polygon"], CLASS_NAME: "OpenLayers.Geometry.MultiPolygon" });
+OpenLayers.Format.GML = OpenLayers.Class(OpenLayers.Format.XML, {
+ featureNS: "http://mapserver.gis.umn.edu/mapserver", featurePrefix: "feature", featureName: "featureMember", layerName: "features", geometryName: "geometry", collectionName: "FeatureCollection", gmlns: "http://www.opengis.net/gml", extractAttributes: !0, xy: !0, initialize: function(a) { this.regExes = { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }; OpenLayers.Format.XML.prototype.initialize.apply(this, [a]) }, read: function(a) {
+ "string" ==
+ typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a = this.getElementsByTagNameNS(a.documentElement, this.gmlns, this.featureName); for (var b = [], c = 0; c < a.length; c++) { var d = this.parseFeature(a[c]); d && b.push(d) } return b
+ }, parseFeature: function(a) {
+ for (var b = "MultiPolygon Polygon MultiLineString LineString MultiPoint Point Envelope".split(" "), c, d, e, f = 0; f < b.length; ++f)if (c = b[f], d = this.getElementsByTagNameNS(a, this.gmlns, c), 0 < d.length) {
+ if (e = this.parseGeometry[c.toLowerCase()]) e = e.apply(this,
+ [d[0]]), this.internalProjection && this.externalProjection && e.transform(this.externalProjection, this.internalProjection); else throw new TypeError("Unsupported geometry type: " + c); break
+ } var g; c = this.getElementsByTagNameNS(a, this.gmlns, "Box"); for (f = 0; f < c.length; ++f)b = c[f], d = this.parseGeometry.box.apply(this, [b]), b = b.parentNode, "boundedBy" === (b.localName || b.nodeName.split(":").pop()) ? g = d : e = d.toGeometry(); var h; this.extractAttributes && (h = this.parseAttributes(a)); h = new OpenLayers.Feature.Vector(e, h); h.bounds =
+ g; h.gml = { featureType: a.firstChild.nodeName.split(":")[1], featureNS: a.firstChild.namespaceURI, featureNSPrefix: a.firstChild.prefix }; a = a.firstChild; for (var k; a && (1 != a.nodeType || !(k = a.getAttribute("fid") || a.getAttribute("id")));)a = a.nextSibling; h.fid = k; return h
+ }, parseGeometry: {
+ point: function(a) {
+ var b, c; c = []; b = this.getElementsByTagNameNS(a, this.gmlns, "pos"); 0 < b.length && (c = b[0].firstChild.nodeValue, c = c.replace(this.regExes.trimSpace, ""), c = c.split(this.regExes.splitSpace)); 0 == c.length && (b = this.getElementsByTagNameNS(a,
+ this.gmlns, "coordinates"), 0 < b.length && (c = b[0].firstChild.nodeValue, c = c.replace(this.regExes.removeSpace, ""), c = c.split(","))); 0 == c.length && (b = this.getElementsByTagNameNS(a, this.gmlns, "coord"), 0 < b.length && (a = this.getElementsByTagNameNS(b[0], this.gmlns, "X"), b = this.getElementsByTagNameNS(b[0], this.gmlns, "Y"), 0 < a.length && 0 < b.length && (c = [a[0].firstChild.nodeValue, b[0].firstChild.nodeValue]))); 2 == c.length && (c[2] = null); return this.xy ? new OpenLayers.Geometry.Point(c[0], c[1], c[2]) : new OpenLayers.Geometry.Point(c[1],
+ c[0], c[2])
+ }, multipoint: function(a) { a = this.getElementsByTagNameNS(a, this.gmlns, "Point"); var b = []; if (0 < a.length) for (var c, d = 0; d < a.length; ++d)(c = this.parseGeometry.point.apply(this, [a[d]])) && b.push(c); return new OpenLayers.Geometry.MultiPoint(b) }, linestring: function(a, b) {
+ var c, d; d = []; var e = []; c = this.getElementsByTagNameNS(a, this.gmlns, "posList"); if (0 < c.length) {
+ d = this.getChildValue(c[0]); d = d.replace(this.regExes.trimSpace, ""); d = d.split(this.regExes.splitSpace); var f = parseInt(c[0].getAttribute("dimension")),
+ g, h, k; for (c = 0; c < d.length / f; ++c)g = c * f, h = d[g], k = d[g + 1], g = 2 == f ? null : d[g + 2], this.xy ? e.push(new OpenLayers.Geometry.Point(h, k, g)) : e.push(new OpenLayers.Geometry.Point(k, h, g))
+ } if (0 == d.length && (c = this.getElementsByTagNameNS(a, this.gmlns, "coordinates"), 0 < c.length)) for (d = this.getChildValue(c[0]), d = d.replace(this.regExes.trimSpace, ""), d = d.replace(this.regExes.trimComma, ","), f = d.split(this.regExes.splitSpace), c = 0; c < f.length; ++c)d = f[c].split(","), 2 == d.length && (d[2] = null), this.xy ? e.push(new OpenLayers.Geometry.Point(d[0],
+ d[1], d[2])) : e.push(new OpenLayers.Geometry.Point(d[1], d[0], d[2])); d = null; 0 != e.length && (d = b ? new OpenLayers.Geometry.LinearRing(e) : new OpenLayers.Geometry.LineString(e)); return d
+ }, multilinestring: function(a) { a = this.getElementsByTagNameNS(a, this.gmlns, "LineString"); var b = []; if (0 < a.length) for (var c, d = 0; d < a.length; ++d)(c = this.parseGeometry.linestring.apply(this, [a[d]])) && b.push(c); return new OpenLayers.Geometry.MultiLineString(b) }, polygon: function(a) {
+ a = this.getElementsByTagNameNS(a, this.gmlns, "LinearRing");
+ var b = []; if (0 < a.length) for (var c, d = 0; d < a.length; ++d)(c = this.parseGeometry.linestring.apply(this, [a[d], !0])) && b.push(c); return new OpenLayers.Geometry.Polygon(b)
+ }, multipolygon: function(a) { a = this.getElementsByTagNameNS(a, this.gmlns, "Polygon"); var b = []; if (0 < a.length) for (var c, d = 0; d < a.length; ++d)(c = this.parseGeometry.polygon.apply(this, [a[d]])) && b.push(c); return new OpenLayers.Geometry.MultiPolygon(b) }, envelope: function(a) {
+ var b = [], c, d, e = this.getElementsByTagNameNS(a, this.gmlns, "lowerCorner"); if (0 < e.length) {
+ c =
+ []; 0 < e.length && (c = e[0].firstChild.nodeValue, c = c.replace(this.regExes.trimSpace, ""), c = c.split(this.regExes.splitSpace)); 2 == c.length && (c[2] = null); var f = this.xy ? new OpenLayers.Geometry.Point(c[0], c[1], c[2]) : new OpenLayers.Geometry.Point(c[1], c[0], c[2])
+ } a = this.getElementsByTagNameNS(a, this.gmlns, "upperCorner"); if (0 < a.length) {
+ c = []; 0 < a.length && (c = a[0].firstChild.nodeValue, c = c.replace(this.regExes.trimSpace, ""), c = c.split(this.regExes.splitSpace)); 2 == c.length && (c[2] = null); var g = this.xy ? new OpenLayers.Geometry.Point(c[0],
+ c[1], c[2]) : new OpenLayers.Geometry.Point(c[1], c[0], c[2])
+ } f && g && (b.push(new OpenLayers.Geometry.Point(f.x, f.y)), b.push(new OpenLayers.Geometry.Point(g.x, f.y)), b.push(new OpenLayers.Geometry.Point(g.x, g.y)), b.push(new OpenLayers.Geometry.Point(f.x, g.y)), b.push(new OpenLayers.Geometry.Point(f.x, f.y)), b = new OpenLayers.Geometry.LinearRing(b), d = new OpenLayers.Geometry.Polygon([b])); return d
+ }, box: function(a) {
+ var b = this.getElementsByTagNameNS(a, this.gmlns, "coordinates"), c = a = null; 0 < b.length && (b = b[0].firstChild.nodeValue,
+ b = b.split(" "), 2 == b.length && (a = b[0].split(","), c = b[1].split(","))); if (null !== a && null !== c) return new OpenLayers.Bounds(parseFloat(a[0]), parseFloat(a[1]), parseFloat(c[0]), parseFloat(c[1]))
+ }
+ }, parseAttributes: function(a) {
+ var b = {}; a = a.firstChild; for (var c, d, e; a;) {
+ if (1 == a.nodeType) {
+ a = a.childNodes; for (c = 0; c < a.length; ++c)if (d = a[c], 1 == d.nodeType) if (e = d.childNodes, 1 == e.length) {
+ if (e = e[0], 3 == e.nodeType || 4 == e.nodeType) d = d.prefix ? d.nodeName.split(":")[1] : d.nodeName, e = e.nodeValue.replace(this.regExes.trimSpace,
+ ""), b[d] = e
+ } else b[d.nodeName.split(":").pop()] = null; break
+ } a = a.nextSibling
+ } return b
+ }, write: function(a) { OpenLayers.Util.isArray(a) || (a = [a]); for (var b = this.createElementNS("http://www.opengis.net/wfs", "wfs:" + this.collectionName), c = 0; c < a.length; c++)b.appendChild(this.createFeatureXML(a[c])); return OpenLayers.Format.XML.prototype.write.apply(this, [b]) }, createFeatureXML: function(a) {
+ var b = this.buildGeometryNode(a.geometry), c = this.createElementNS(this.featureNS, this.featurePrefix + ":" + this.geometryName); c.appendChild(b);
+ var b = this.createElementNS(this.gmlns, "gml:" + this.featureName), d = this.createElementNS(this.featureNS, this.featurePrefix + ":" + this.layerName); d.setAttribute("fid", a.fid || a.id); d.appendChild(c); for (var e in a.attributes) { var c = this.createTextNode(a.attributes[e]), f = e.substring(e.lastIndexOf(":") + 1), f = this.createElementNS(this.featureNS, this.featurePrefix + ":" + f); f.appendChild(c); d.appendChild(f) } b.appendChild(d); return b
+ }, buildGeometryNode: function(a) {
+ this.externalProjection && this.internalProjection &&
+ (a = a.clone(), a.transform(this.internalProjection, this.externalProjection)); var b = a.CLASS_NAME, b = b.substring(b.lastIndexOf(".") + 1); return this.buildGeometry[b.toLowerCase()].apply(this, [a])
+ }, buildGeometry: {
+ point: function(a) { var b = this.createElementNS(this.gmlns, "gml:Point"); b.appendChild(this.buildCoordinatesNode(a)); return b }, multipoint: function(a) {
+ var b = this.createElementNS(this.gmlns, "gml:MultiPoint"); a = a.components; for (var c, d, e = 0; e < a.length; e++)c = this.createElementNS(this.gmlns, "gml:pointMember"),
+ d = this.buildGeometry.point.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c); return b
+ }, linestring: function(a) { var b = this.createElementNS(this.gmlns, "gml:LineString"); b.appendChild(this.buildCoordinatesNode(a)); return b }, multilinestring: function(a) {
+ var b = this.createElementNS(this.gmlns, "gml:MultiLineString"); a = a.components; for (var c, d, e = 0; e < a.length; ++e)c = this.createElementNS(this.gmlns, "gml:lineStringMember"), d = this.buildGeometry.linestring.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c);
+ return b
+ }, linearring: function(a) { var b = this.createElementNS(this.gmlns, "gml:LinearRing"); b.appendChild(this.buildCoordinatesNode(a)); return b }, polygon: function(a) { var b = this.createElementNS(this.gmlns, "gml:Polygon"); a = a.components; for (var c, d, e = 0; e < a.length; ++e)c = 0 == e ? "outerBoundaryIs" : "innerBoundaryIs", c = this.createElementNS(this.gmlns, "gml:" + c), d = this.buildGeometry.linearring.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c); return b }, multipolygon: function(a) {
+ var b = this.createElementNS(this.gmlns,
+ "gml:MultiPolygon"); a = a.components; for (var c, d, e = 0; e < a.length; ++e)c = this.createElementNS(this.gmlns, "gml:polygonMember"), d = this.buildGeometry.polygon.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c); return b
+ }, bounds: function(a) { var b = this.createElementNS(this.gmlns, "gml:Box"); b.appendChild(this.buildCoordinatesNode(a)); return b }
+ }, buildCoordinatesNode: function(a) {
+ var b = this.createElementNS(this.gmlns, "gml:coordinates"); b.setAttribute("decimal", "."); b.setAttribute("cs", ","); b.setAttribute("ts",
+ " "); var c = []; if (a instanceof OpenLayers.Bounds) c.push(a.left + "," + a.bottom), c.push(a.right + "," + a.top); else { a = a.components ? a.components : [a]; for (var d = 0; d < a.length; d++)c.push(a[d].x + "," + a[d].y) } c = this.createTextNode(c.join(" ")); b.appendChild(c); return b
+ }, CLASS_NAME: "OpenLayers.Format.GML"
+}); OpenLayers.Format.GML || (OpenLayers.Format.GML = {});
+OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { gml: "http://www.opengis.net/gml", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance", wfs: "http://www.opengis.net/wfs" }, defaultPrefix: "gml", schemaLocation: null, featureType: null, featureNS: null, geometryName: "geometry", extractAttributes: !0, srsName: null, xy: !0, geometryTypes: null, singleFeatureType: null, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g, featureMember: /^(.*:)?featureMembers?$/ },
+ initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]); this.setGeometryTypes(); a && a.featureNS && this.setNamespace("feature", a.featureNS); this.singleFeatureType = !a || "string" === typeof a.featureType }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = []; this.readNode(a, { features: b }, !0); if (0 == b.length) {
+ var c = this.getElementsByTagNameNS(a, this.namespaces.gml, "featureMember"); if (c.length) {
+ a =
+ 0; for (var d = c.length; a < d; ++a)this.readNode(c[a], { features: b }, !0)
+ } else c = this.getElementsByTagNameNS(a, this.namespaces.gml, "featureMembers"), c.length && this.readNode(c[0], { features: b }, !0)
+ } return b
+ }, readNode: function(a, b, c) {
+ !0 === c && !0 === this.autoConfig && (this.featureType = null, delete this.namespaceAlias[this.featureNS], delete this.namespaces.feature, this.featureNS = null); this.featureNS || a.prefix in this.namespaces || a.parentNode.namespaceURI != this.namespaces.gml || !this.regExes.featureMember.test(a.parentNode.nodeName) ||
+ (this.featureType = a.nodeName.split(":").pop(), this.setNamespace("feature", a.namespaceURI), this.featureNS = a.namespaceURI, this.autoConfig = !0); return OpenLayers.Format.XML.prototype.readNode.apply(this, [a, b])
+ }, readers: {
+ gml: {
+ _inherit: function(a, b, c) { }, featureMember: function(a, b) { this.readChildNodes(a, b) }, featureMembers: function(a, b) { this.readChildNodes(a, b) }, name: function(a, b) { b.name = this.getChildValue(a) }, boundedBy: function(a, b) {
+ var c = {}; this.readChildNodes(a, c); c.components && 0 < c.components.length &&
+ (b.bounds = c.components[0])
+ }, Point: function(a, b) { var c = { points: [] }; this.readChildNodes(a, c); b.components || (b.components = []); b.components.push(c.points[0]) }, coordinates: function(a, b) { for (var c = this.getChildValue(a).replace(this.regExes.trimSpace, ""), c = c.replace(this.regExes.trimComma, ","), c = c.split(this.regExes.splitSpace), d, e = c.length, f = Array(e), g = 0; g < e; ++g)d = c[g].split(","), f[g] = this.xy ? new OpenLayers.Geometry.Point(d[0], d[1], d[2]) : new OpenLayers.Geometry.Point(d[1], d[0], d[2]); b.points = f }, coord: function(a,
+ b) { var c = {}; this.readChildNodes(a, c); b.points || (b.points = []); b.points.push(new OpenLayers.Geometry.Point(c.x, c.y, c.z)) }, X: function(a, b) { b.x = this.getChildValue(a) }, Y: function(a, b) { b.y = this.getChildValue(a) }, Z: function(a, b) { b.z = this.getChildValue(a) }, MultiPoint: function(a, b) { var c = { components: [] }; this.readers.gml._inherit.apply(this, [a, c, b]); this.readChildNodes(a, c); b.components = [new OpenLayers.Geometry.MultiPoint(c.components)] }, pointMember: function(a, b) { this.readChildNodes(a, b) }, LineString: function(a,
+ b) { var c = {}; this.readers.gml._inherit.apply(this, [a, c, b]); this.readChildNodes(a, c); b.components || (b.components = []); b.components.push(new OpenLayers.Geometry.LineString(c.points)) }, MultiLineString: function(a, b) { var c = { components: [] }; this.readers.gml._inherit.apply(this, [a, c, b]); this.readChildNodes(a, c); b.components = [new OpenLayers.Geometry.MultiLineString(c.components)] }, lineStringMember: function(a, b) { this.readChildNodes(a, b) }, Polygon: function(a, b) {
+ var c = { outer: null, inner: [] }; this.readers.gml._inherit.apply(this,
+ [a, c, b]); this.readChildNodes(a, c); c.inner.unshift(c.outer); b.components || (b.components = []); b.components.push(new OpenLayers.Geometry.Polygon(c.inner))
+ }, LinearRing: function(a, b) { var c = {}; this.readers.gml._inherit.apply(this, [a, c]); this.readChildNodes(a, c); b.components = [new OpenLayers.Geometry.LinearRing(c.points)] }, MultiPolygon: function(a, b) { var c = { components: [] }; this.readers.gml._inherit.apply(this, [a, c, b]); this.readChildNodes(a, c); b.components = [new OpenLayers.Geometry.MultiPolygon(c.components)] },
+ polygonMember: function(a, b) { this.readChildNodes(a, b) }, GeometryCollection: function(a, b) { var c = { components: [] }; this.readers.gml._inherit.apply(this, [a, c, b]); this.readChildNodes(a, c); b.components = [new OpenLayers.Geometry.Collection(c.components)] }, geometryMember: function(a, b) { this.readChildNodes(a, b) }
+ }, feature: {
+ "*": function(a, b) {
+ var c, d = a.localName || a.nodeName.split(":").pop(); b.features ? this.singleFeatureType || -1 === OpenLayers.Util.indexOf(this.featureType, d) ? d === this.featureType && (c = "_typeName") : c =
+ "_typeName" : 0 == a.childNodes.length || 1 == a.childNodes.length && 3 == a.firstChild.nodeType ? this.extractAttributes && (c = "_attribute") : c = "_geometry"; c && this.readers.feature[c].apply(this, [a, b])
+ }, _typeName: function(a, b) {
+ var c = { components: [], attributes: {} }; this.readChildNodes(a, c); c.name && (c.attributes.name = c.name); var d = new OpenLayers.Feature.Vector(c.components[0], c.attributes); this.singleFeatureType || (d.type = a.nodeName.split(":").pop(), d.namespace = a.namespaceURI); var e = a.getAttribute("fid") || this.getAttributeNS(a,
+ this.namespaces.gml, "id"); e && (d.fid = e); this.internalProjection && this.externalProjection && d.geometry && d.geometry.transform(this.externalProjection, this.internalProjection); c.bounds && (d.bounds = c.bounds); b.features.push(d)
+ }, _geometry: function(a, b) { this.geometryName || (this.geometryName = a.nodeName.split(":").pop()); this.readChildNodes(a, b) }, _attribute: function(a, b) { var c = a.localName || a.nodeName.split(":").pop(), d = this.getChildValue(a); b.attributes[c] = d }
+ }, wfs: {
+ FeatureCollection: function(a, b) {
+ this.readChildNodes(a,
+ b)
+ }
+ }
+ }, write: function(a) { var b; b = OpenLayers.Util.isArray(a) ? "featureMembers" : "featureMember"; a = this.writeNode("gml:" + b, a); this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation); return OpenLayers.Format.XML.prototype.write.apply(this, [a]) }, writers: {
+ gml: {
+ featureMember: function(a) { var b = this.createElementNSPlus("gml:featureMember"); this.writeNode("feature:_typeName", a, b); return b }, MultiPoint: function(a) {
+ var b = this.createElementNSPlus("gml:MultiPoint"); a = a.components || [a];
+ for (var c = 0, d = a.length; c < d; ++c)this.writeNode("pointMember", a[c], b); return b
+ }, pointMember: function(a) { var b = this.createElementNSPlus("gml:pointMember"); this.writeNode("Point", a, b); return b }, MultiLineString: function(a) { var b = this.createElementNSPlus("gml:MultiLineString"); a = a.components || [a]; for (var c = 0, d = a.length; c < d; ++c)this.writeNode("lineStringMember", a[c], b); return b }, lineStringMember: function(a) { var b = this.createElementNSPlus("gml:lineStringMember"); this.writeNode("LineString", a, b); return b },
+ MultiPolygon: function(a) { var b = this.createElementNSPlus("gml:MultiPolygon"); a = a.components || [a]; for (var c = 0, d = a.length; c < d; ++c)this.writeNode("polygonMember", a[c], b); return b }, polygonMember: function(a) { var b = this.createElementNSPlus("gml:polygonMember"); this.writeNode("Polygon", a, b); return b }, GeometryCollection: function(a) { for (var b = this.createElementNSPlus("gml:GeometryCollection"), c = 0, d = a.components.length; c < d; ++c)this.writeNode("geometryMember", a.components[c], b); return b }, geometryMember: function(a) {
+ var b =
+ this.createElementNSPlus("gml:geometryMember"); a = this.writeNode("feature:_geometry", a); b.appendChild(a.firstChild); return b
+ }
+ }, feature: {
+ _typeName: function(a) { var b = this.createElementNSPlus("feature:" + this.featureType, { attributes: { fid: a.fid } }); a.geometry && this.writeNode("feature:_geometry", a.geometry, b); for (var c in a.attributes) { var d = a.attributes[c]; null != d && this.writeNode("feature:_attribute", { name: c, value: d }, b) } return b }, _geometry: function(a) {
+ this.externalProjection && this.internalProjection && (a =
+ a.clone().transform(this.internalProjection, this.externalProjection)); var b = this.createElementNSPlus("feature:" + this.geometryName); a = this.writeNode("gml:" + this.geometryTypes[a.CLASS_NAME], a, b); this.srsName && a.setAttribute("srsName", this.srsName); return b
+ }, _attribute: function(a) { return this.createElementNSPlus("feature:" + a.name, { value: a.value }) }
+ }, wfs: {
+ FeatureCollection: function(a) {
+ for (var b = this.createElementNSPlus("wfs:FeatureCollection"), c = 0, d = a.length; c < d; ++c)this.writeNode("gml:featureMember",
+ a[c], b); return b
+ }
+ }
+ }, setGeometryTypes: function() { this.geometryTypes = { "OpenLayers.Geometry.Point": "Point", "OpenLayers.Geometry.MultiPoint": "MultiPoint", "OpenLayers.Geometry.LineString": "LineString", "OpenLayers.Geometry.MultiLineString": "MultiLineString", "OpenLayers.Geometry.Polygon": "Polygon", "OpenLayers.Geometry.MultiPolygon": "MultiPolygon", "OpenLayers.Geometry.Collection": "GeometryCollection" } }, CLASS_NAME: "OpenLayers.Format.GML.Base"
+});
+OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
+ schemaLocation: "http://www.opengis.net/gml http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/1.0.0/gmlsf.xsd", curve: !1, multiCurve: !0, surface: !1, multiSurface: !0, initialize: function(a) { OpenLayers.Format.GML.Base.prototype.initialize.apply(this, [a]) }, readers: {
+ gml: OpenLayers.Util.applyDefaults({
+ _inherit: function(a, b, c) { if (a = parseInt(a.getAttribute("srsDimension"), 10) || c && c.srsDimension) b.srsDimension = a }, featureMembers: function(a,
+ b) { this.readChildNodes(a, b) }, Curve: function(a, b) { var c = { points: [] }; this.readers.gml._inherit.apply(this, [a, c, b]); this.readChildNodes(a, c); b.components || (b.components = []); b.components.push(new OpenLayers.Geometry.LineString(c.points)) }, segments: function(a, b) { this.readChildNodes(a, b) }, LineStringSegment: function(a, b) { var c = {}; this.readChildNodes(a, c); c.points && Array.prototype.push.apply(b.points, c.points) }, pos: function(a, b) {
+ var c = this.getChildValue(a).replace(this.regExes.trimSpace, "").split(this.regExes.splitSpace),
+ c = this.xy ? new OpenLayers.Geometry.Point(c[0], c[1], c[2]) : new OpenLayers.Geometry.Point(c[1], c[0], c[2]); b.points = [c]
+ }, posList: function(a, b) {
+ for (var c = this.getChildValue(a).replace(this.regExes.trimSpace, "").split(this.regExes.splitSpace), d = b.srsDimension || parseInt(a.getAttribute("srsDimension") || a.getAttribute("dimension"), 10) || 2, e, f, g, h = Array(c.length / d), k = 0, l = c.length; k < l; k += d)e = c[k], f = c[k + 1], g = 2 == d ? void 0 : c[k + 2], h[k / d] = this.xy ? new OpenLayers.Geometry.Point(e, f, g) : new OpenLayers.Geometry.Point(f,
+ e, g); b.points = h
+ }, Surface: function(a, b) { this.readChildNodes(a, b) }, patches: function(a, b) { this.readChildNodes(a, b) }, PolygonPatch: function(a, b) { this.readers.gml.Polygon.apply(this, [a, b]) }, exterior: function(a, b) { var c = {}; this.readChildNodes(a, c); b.outer = c.components[0] }, interior: function(a, b) { var c = {}; this.readChildNodes(a, c); b.inner.push(c.components[0]) }, MultiCurve: function(a, b) {
+ var c = { components: [] }; this.readers.gml._inherit.apply(this, [a, c, b]); this.readChildNodes(a, c); 0 < c.components.length && (b.components =
+ [new OpenLayers.Geometry.MultiLineString(c.components)])
+ }, curveMember: function(a, b) { this.readChildNodes(a, b) }, MultiSurface: function(a, b) { var c = { components: [] }; this.readers.gml._inherit.apply(this, [a, c, b]); this.readChildNodes(a, c); 0 < c.components.length && (b.components = [new OpenLayers.Geometry.MultiPolygon(c.components)]) }, surfaceMember: function(a, b) { this.readChildNodes(a, b) }, surfaceMembers: function(a, b) { this.readChildNodes(a, b) }, pointMembers: function(a, b) { this.readChildNodes(a, b) }, lineStringMembers: function(a,
+ b) { this.readChildNodes(a, b) }, polygonMembers: function(a, b) { this.readChildNodes(a, b) }, geometryMembers: function(a, b) { this.readChildNodes(a, b) }, Envelope: function(a, b) { var c = { points: Array(2) }; this.readChildNodes(a, c); b.components || (b.components = []); var d = c.points[0], c = c.points[1]; b.components.push(new OpenLayers.Bounds(d.x, d.y, c.x, c.y)) }, lowerCorner: function(a, b) { var c = {}; this.readers.gml.pos.apply(this, [a, c]); b.points[0] = c.points[0] }, upperCorner: function(a, b) {
+ var c = {}; this.readers.gml.pos.apply(this,
+ [a, c]); b.points[1] = c.points[0]
+ }
+ }, OpenLayers.Format.GML.Base.prototype.readers.gml), feature: OpenLayers.Format.GML.Base.prototype.readers.feature, wfs: OpenLayers.Format.GML.Base.prototype.readers.wfs
+ }, write: function(a) { var b; b = OpenLayers.Util.isArray(a) ? "featureMembers" : "featureMember"; a = this.writeNode("gml:" + b, a); this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation); return OpenLayers.Format.XML.prototype.write.apply(this, [a]) }, writers: {
+ gml: OpenLayers.Util.applyDefaults({
+ featureMembers: function(a) {
+ for (var b =
+ this.createElementNSPlus("gml:featureMembers"), c = 0, d = a.length; c < d; ++c)this.writeNode("feature:_typeName", a[c], b); return b
+ }, Point: function(a) { var b = this.createElementNSPlus("gml:Point"); this.writeNode("pos", a, b); return b }, pos: function(a) { return this.createElementNSPlus("gml:pos", { value: this.xy ? a.x + " " + a.y : a.y + " " + a.x }) }, LineString: function(a) { var b = this.createElementNSPlus("gml:LineString"); this.writeNode("posList", a.components, b); return b }, Curve: function(a) {
+ var b = this.createElementNSPlus("gml:Curve");
+ this.writeNode("segments", a, b); return b
+ }, segments: function(a) { var b = this.createElementNSPlus("gml:segments"); this.writeNode("LineStringSegment", a, b); return b }, LineStringSegment: function(a) { var b = this.createElementNSPlus("gml:LineStringSegment"); this.writeNode("posList", a.components, b); return b }, posList: function(a) { for (var b = a.length, c = Array(b), d, e = 0; e < b; ++e)d = a[e], c[e] = this.xy ? d.x + " " + d.y : d.y + " " + d.x; return this.createElementNSPlus("gml:posList", { value: c.join(" ") }) }, Surface: function(a) {
+ var b = this.createElementNSPlus("gml:Surface");
+ this.writeNode("patches", a, b); return b
+ }, patches: function(a) { var b = this.createElementNSPlus("gml:patches"); this.writeNode("PolygonPatch", a, b); return b }, PolygonPatch: function(a) { var b = this.createElementNSPlus("gml:PolygonPatch", { attributes: { interpolation: "planar" } }); this.writeNode("exterior", a.components[0], b); for (var c = 1, d = a.components.length; c < d; ++c)this.writeNode("interior", a.components[c], b); return b }, Polygon: function(a) {
+ var b = this.createElementNSPlus("gml:Polygon"); this.writeNode("exterior", a.components[0],
+ b); for (var c = 1, d = a.components.length; c < d; ++c)this.writeNode("interior", a.components[c], b); return b
+ }, exterior: function(a) { var b = this.createElementNSPlus("gml:exterior"); this.writeNode("LinearRing", a, b); return b }, interior: function(a) { var b = this.createElementNSPlus("gml:interior"); this.writeNode("LinearRing", a, b); return b }, LinearRing: function(a) { var b = this.createElementNSPlus("gml:LinearRing"); this.writeNode("posList", a.components, b); return b }, MultiCurve: function(a) {
+ var b = this.createElementNSPlus("gml:MultiCurve");
+ a = a.components || [a]; for (var c = 0, d = a.length; c < d; ++c)this.writeNode("curveMember", a[c], b); return b
+ }, curveMember: function(a) { var b = this.createElementNSPlus("gml:curveMember"); this.curve ? this.writeNode("Curve", a, b) : this.writeNode("LineString", a, b); return b }, MultiSurface: function(a) { var b = this.createElementNSPlus("gml:MultiSurface"); a = a.components || [a]; for (var c = 0, d = a.length; c < d; ++c)this.writeNode("surfaceMember", a[c], b); return b }, surfaceMember: function(a) {
+ var b = this.createElementNSPlus("gml:surfaceMember");
+ this.surface ? this.writeNode("Surface", a, b) : this.writeNode("Polygon", a, b); return b
+ }, Envelope: function(a) { var b = this.createElementNSPlus("gml:Envelope"); this.writeNode("lowerCorner", a, b); this.writeNode("upperCorner", a, b); this.srsName && b.setAttribute("srsName", this.srsName); return b }, lowerCorner: function(a) { return this.createElementNSPlus("gml:lowerCorner", { value: this.xy ? a.left + " " + a.bottom : a.bottom + " " + a.left }) }, upperCorner: function(a) {
+ return this.createElementNSPlus("gml:upperCorner", {
+ value: this.xy ?
+ a.right + " " + a.top : a.top + " " + a.right
+ })
+ }
+ }, OpenLayers.Format.GML.Base.prototype.writers.gml), feature: OpenLayers.Format.GML.Base.prototype.writers.feature, wfs: OpenLayers.Format.GML.Base.prototype.writers.wfs
+ }, setGeometryTypes: function() {
+ this.geometryTypes = {
+ "OpenLayers.Geometry.Point": "Point", "OpenLayers.Geometry.MultiPoint": "MultiPoint", "OpenLayers.Geometry.LineString": !0 === this.curve ? "Curve" : "LineString", "OpenLayers.Geometry.MultiLineString": !1 === this.multiCurve ? "MultiLineString" : "MultiCurve", "OpenLayers.Geometry.Polygon": !0 ===
+ this.surface ? "Surface" : "Polygon", "OpenLayers.Geometry.MultiPolygon": !1 === this.multiSurface ? "MultiPolygon" : "MultiSurface", "OpenLayers.Geometry.Collection": "GeometryCollection"
+ }
+ }, CLASS_NAME: "OpenLayers.Format.GML.v3"
+});
+OpenLayers.Format.Filter.v1_1_0 = OpenLayers.Class(OpenLayers.Format.GML.v3, OpenLayers.Format.Filter.v1, {
+ VERSION: "1.1.0", schemaLocation: "http://www.opengis.net/ogc/filter/1.1.0/filter.xsd", initialize: function(a) { OpenLayers.Format.GML.v3.prototype.initialize.apply(this, [a]) }, readers: {
+ ogc: OpenLayers.Util.applyDefaults({
+ PropertyIsEqualTo: function(a, b) {
+ var c = a.getAttribute("matchCase"), c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.EQUAL_TO, matchCase: !("false" === c || "0" === c) }); this.readChildNodes(a,
+ c); b.filters.push(c)
+ }, PropertyIsNotEqualTo: function(a, b) { var c = a.getAttribute("matchCase"), c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO, matchCase: !("false" === c || "0" === c) }); this.readChildNodes(a, c); b.filters.push(c) }, PropertyIsLike: function(a, b) {
+ var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.LIKE }); this.readChildNodes(a, c); var d = a.getAttribute("wildCard"), e = a.getAttribute("singleChar"), f = a.getAttribute("escapeChar"); c.value2regex(d, e,
+ f); b.filters.push(c)
+ }
+ }, OpenLayers.Format.Filter.v1.prototype.readers.ogc), gml: OpenLayers.Format.GML.v3.prototype.readers.gml, feature: OpenLayers.Format.GML.v3.prototype.readers.feature
+ }, writers: {
+ ogc: OpenLayers.Util.applyDefaults({
+ PropertyIsEqualTo: function(a) { var b = this.createElementNSPlus("ogc:PropertyIsEqualTo", { attributes: { matchCase: a.matchCase } }); this.writeNode("PropertyName", a, b); this.writeOgcExpression(a.value, b); return b }, PropertyIsNotEqualTo: function(a) {
+ var b = this.createElementNSPlus("ogc:PropertyIsNotEqualTo",
+ { attributes: { matchCase: a.matchCase } }); this.writeNode("PropertyName", a, b); this.writeOgcExpression(a.value, b); return b
+ }, PropertyIsLike: function(a) { var b = this.createElementNSPlus("ogc:PropertyIsLike", { attributes: { matchCase: a.matchCase, wildCard: "*", singleChar: ".", escapeChar: "!" } }); this.writeNode("PropertyName", a, b); this.writeNode("Literal", a.regex2value(), b); return b }, BBOX: function(a) {
+ var b = this.createElementNSPlus("ogc:BBOX"); a.property && this.writeNode("PropertyName", a, b); var c = this.writeNode("gml:Envelope",
+ a.value); a.projection && c.setAttribute("srsName", a.projection); b.appendChild(c); return b
+ }, SortBy: function(a) { for (var b = this.createElementNSPlus("ogc:SortBy"), c = 0, d = a.length; c < d; c++)this.writeNode("ogc:SortProperty", a[c], b); return b }, SortProperty: function(a) { var b = this.createElementNSPlus("ogc:SortProperty"); this.writeNode("ogc:PropertyName", a, b); this.writeNode("ogc:SortOrder", "DESC" == a.order ? "DESC" : "ASC", b); return b }, SortOrder: function(a) { return this.createElementNSPlus("ogc:SortOrder", { value: a }) }
+ },
+ OpenLayers.Format.Filter.v1.prototype.writers.ogc), gml: OpenLayers.Format.GML.v3.prototype.writers.gml, feature: OpenLayers.Format.GML.v3.prototype.writers.feature
+ }, writeSpatial: function(a, b) {
+ var c = this.createElementNSPlus("ogc:" + b); this.writeNode("PropertyName", a, c); if (a.value instanceof OpenLayers.Filter.Function) this.writeNode("Function", a.value, c); else {
+ var d; d = a.value instanceof OpenLayers.Geometry ? this.writeNode("feature:_geometry", a.value).firstChild : this.writeNode("gml:Envelope", a.value); a.projection &&
+ d.setAttribute("srsName", a.projection); c.appendChild(d)
+ } return c
+ }, CLASS_NAME: "OpenLayers.Format.Filter.v1_1_0"
+}); OpenLayers.Format.OWSCommon = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.0.0", getVersion: function(a, b) { var c = this.version; if (!c) { var d = a.getAttribute("xmlns:ows"); d && "1.1" === d.substring(d.lastIndexOf("/") + 1) && (c = "1.1.0"); c || (c = this.defaultVersion) } return c }, CLASS_NAME: "OpenLayers.Format.OWSCommon" });
+OpenLayers.Format.OWSCommon.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+ regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, read: function(a, b) { OpenLayers.Util.applyDefaults(b, this.options); var c = {}; this.readChildNodes(a, c); return c }, readers: {
+ ows: {
+ Exception: function(a, b) { var c = { code: a.getAttribute("exceptionCode"), locator: a.getAttribute("locator"), texts: [] }; b.exceptions.push(c); this.readChildNodes(a, c) }, ExceptionText: function(a, b) { var c = this.getChildValue(a); b.texts.push(c) },
+ ServiceIdentification: function(a, b) { b.serviceIdentification = {}; this.readChildNodes(a, b.serviceIdentification) }, Title: function(a, b) { b.title = this.getChildValue(a) }, Abstract: function(a, b) { b["abstract"] = this.getChildValue(a) }, Keywords: function(a, b) { b.keywords = {}; this.readChildNodes(a, b.keywords) }, Keyword: function(a, b) { b[this.getChildValue(a)] = !0 }, ServiceType: function(a, b) { b.serviceType = { codeSpace: a.getAttribute("codeSpace"), value: this.getChildValue(a) } }, ServiceTypeVersion: function(a, b) {
+ b.serviceTypeVersion =
+ this.getChildValue(a)
+ }, Fees: function(a, b) { b.fees = this.getChildValue(a) }, AccessConstraints: function(a, b) { b.accessConstraints = this.getChildValue(a) }, ServiceProvider: function(a, b) { b.serviceProvider = {}; this.readChildNodes(a, b.serviceProvider) }, ProviderName: function(a, b) { b.providerName = this.getChildValue(a) }, ProviderSite: function(a, b) { b.providerSite = this.getAttributeNS(a, this.namespaces.xlink, "href") }, ServiceContact: function(a, b) { b.serviceContact = {}; this.readChildNodes(a, b.serviceContact) }, IndividualName: function(a,
+ b) { b.individualName = this.getChildValue(a) }, PositionName: function(a, b) { b.positionName = this.getChildValue(a) }, ContactInfo: function(a, b) { b.contactInfo = {}; this.readChildNodes(a, b.contactInfo) }, Phone: function(a, b) { b.phone = {}; this.readChildNodes(a, b.phone) }, Voice: function(a, b) { b.voice = this.getChildValue(a) }, Address: function(a, b) { b.address = {}; this.readChildNodes(a, b.address) }, DeliveryPoint: function(a, b) { b.deliveryPoint = this.getChildValue(a) }, City: function(a, b) { b.city = this.getChildValue(a) }, AdministrativeArea: function(a,
+ b) { b.administrativeArea = this.getChildValue(a) }, PostalCode: function(a, b) { b.postalCode = this.getChildValue(a) }, Country: function(a, b) { b.country = this.getChildValue(a) }, ElectronicMailAddress: function(a, b) { b.electronicMailAddress = this.getChildValue(a) }, Role: function(a, b) { b.role = this.getChildValue(a) }, OperationsMetadata: function(a, b) { b.operationsMetadata = {}; this.readChildNodes(a, b.operationsMetadata) }, Operation: function(a, b) { var c = a.getAttribute("name"); b[c] = {}; this.readChildNodes(a, b[c]) }, DCP: function(a,
+ b) { b.dcp = {}; this.readChildNodes(a, b.dcp) }, HTTP: function(a, b) { b.http = {}; this.readChildNodes(a, b.http) }, Get: function(a, b) { b.get || (b.get = []); var c = { url: this.getAttributeNS(a, this.namespaces.xlink, "href") }; this.readChildNodes(a, c); b.get.push(c) }, Post: function(a, b) { b.post || (b.post = []); var c = { url: this.getAttributeNS(a, this.namespaces.xlink, "href") }; this.readChildNodes(a, c); b.post.push(c) }, Parameter: function(a, b) {
+ b.parameters || (b.parameters = {}); var c = a.getAttribute("name"); b.parameters[c] = {}; this.readChildNodes(a,
+ b.parameters[c])
+ }, Constraint: function(a, b) { b.constraints || (b.constraints = {}); var c = a.getAttribute("name"); b.constraints[c] = {}; this.readChildNodes(a, b.constraints[c]) }, Value: function(a, b) { b[this.getChildValue(a)] = !0 }, OutputFormat: function(a, b) { b.formats.push({ value: this.getChildValue(a) }); this.readChildNodes(a, b) }, WGS84BoundingBox: function(a, b) { var c = {}; c.crs = a.getAttribute("crs"); b.BoundingBox ? b.BoundingBox.push(c) : (b.projection = c.crs, c = b); this.readChildNodes(a, c) }, BoundingBox: function(a, b) {
+ this.readers.ows.WGS84BoundingBox.apply(this,
+ [a, b])
+ }, LowerCorner: function(a, b) { var c = this.getChildValue(a).replace(this.regExes.trimSpace, ""), c = c.replace(this.regExes.trimComma, ","), c = c.split(this.regExes.splitSpace); b.left = c[0]; b.bottom = c[1] }, UpperCorner: function(a, b) { var c = this.getChildValue(a).replace(this.regExes.trimSpace, ""), c = c.replace(this.regExes.trimComma, ","), c = c.split(this.regExes.splitSpace); b.right = c[0]; b.top = c[1]; b.bounds = new OpenLayers.Bounds(b.left, b.bottom, b.right, b.top); delete b.left; delete b.bottom; delete b.right; delete b.top },
+ Language: function(a, b) { b.language = this.getChildValue(a) }
+ }
+ }, writers: {
+ ows: {
+ BoundingBox: function(a, b) { var c = this.createElementNSPlus(b || "ows:BoundingBox", { attributes: { crs: a.projection } }); this.writeNode("ows:LowerCorner", a, c); this.writeNode("ows:UpperCorner", a, c); return c }, LowerCorner: function(a) { return this.createElementNSPlus("ows:LowerCorner", { value: a.bounds.left + " " + a.bounds.bottom }) }, UpperCorner: function(a) { return this.createElementNSPlus("ows:UpperCorner", { value: a.bounds.right + " " + a.bounds.top }) },
+ Identifier: function(a) { return this.createElementNSPlus("ows:Identifier", { value: a }) }, Title: function(a) { return this.createElementNSPlus("ows:Title", { value: a }) }, Abstract: function(a) { return this.createElementNSPlus("ows:Abstract", { value: a }) }, OutputFormat: function(a) { return this.createElementNSPlus("ows:OutputFormat", { value: a }) }
+ }
+ }, CLASS_NAME: "OpenLayers.Format.OWSCommon.v1"
+});
+OpenLayers.Format.OWSCommon.v1_0_0 = OpenLayers.Class(OpenLayers.Format.OWSCommon.v1, {
+ namespaces: { ows: "http://www.opengis.net/ows", xlink: "http://www.w3.org/1999/xlink" }, readers: { ows: OpenLayers.Util.applyDefaults({ ExceptionReport: function(a, b) { b.success = !1; b.exceptionReport = { version: a.getAttribute("version"), language: a.getAttribute("language"), exceptions: [] }; this.readChildNodes(a, b.exceptionReport) } }, OpenLayers.Format.OWSCommon.v1.prototype.readers.ows) }, writers: { ows: OpenLayers.Format.OWSCommon.v1.prototype.writers.ows },
+ CLASS_NAME: "OpenLayers.Format.OWSCommon.v1_0_0"
+});
+OpenLayers.Format.WFST.v1_1_0 = OpenLayers.Class(OpenLayers.Format.Filter.v1_1_0, OpenLayers.Format.WFST.v1, {
+ version: "1.1.0", schemaLocations: { wfs: "http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" }, initialize: function(a) { OpenLayers.Format.Filter.v1_1_0.prototype.initialize.apply(this, [a]); OpenLayers.Format.WFST.v1.prototype.initialize.apply(this, [a]) }, readNode: function(a, b, c) { return OpenLayers.Format.GML.v3.prototype.readNode.apply(this, arguments) }, readers: {
+ wfs: OpenLayers.Util.applyDefaults({
+ FeatureCollection: function(a, b) {
+ b.numberOfFeatures =
+ parseInt(a.getAttribute("numberOfFeatures")); OpenLayers.Format.WFST.v1.prototype.readers.wfs.FeatureCollection.apply(this, arguments)
+ }, TransactionResponse: function(a, b) { b.insertIds = []; b.success = !1; this.readChildNodes(a, b) }, TransactionSummary: function(a, b) { b.success = !0 }, InsertResults: function(a, b) { this.readChildNodes(a, b) }, Feature: function(a, b) { var c = { fids: [] }; this.readChildNodes(a, c); b.insertIds.push(c.fids[0]) }
+ }, OpenLayers.Format.WFST.v1.prototype.readers.wfs), gml: OpenLayers.Format.GML.v3.prototype.readers.gml,
+ feature: OpenLayers.Format.GML.v3.prototype.readers.feature, ogc: OpenLayers.Format.Filter.v1_1_0.prototype.readers.ogc, ows: OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows
+ }, writers: {
+ wfs: OpenLayers.Util.applyDefaults({
+ GetFeature: function(a) { var b = OpenLayers.Format.WFST.v1.prototype.writers.wfs.GetFeature.apply(this, arguments); a && this.setAttributes(b, { resultType: a.resultType, startIndex: a.startIndex, count: a.count }); return b }, Query: function(a) {
+ a = OpenLayers.Util.extend({
+ featureNS: this.featureNS,
+ featurePrefix: this.featurePrefix, featureType: this.featureType, srsName: this.srsName
+ }, a); var b = a.featurePrefix, c = this.createElementNSPlus("wfs:Query", { attributes: { typeName: (b ? b + ":" : "") + a.featureType, srsName: a.srsName } }); a.featureNS && c.setAttribute("xmlns:" + b, a.featureNS); if (a.propertyNames) for (var b = 0, d = a.propertyNames.length; b < d; b++)this.writeNode("wfs:PropertyName", { property: a.propertyNames[b] }, c); a.filter && (OpenLayers.Format.WFST.v1_1_0.prototype.setFilterProperty.call(this, a.filter), this.writeNode("ogc:Filter",
+ a.filter, c)); return c
+ }, PropertyName: function(a) { return this.createElementNSPlus("wfs:PropertyName", { value: a.property }) }
+ }, OpenLayers.Format.WFST.v1.prototype.writers.wfs), gml: OpenLayers.Format.GML.v3.prototype.writers.gml, feature: OpenLayers.Format.GML.v3.prototype.writers.feature, ogc: OpenLayers.Format.Filter.v1_1_0.prototype.writers.ogc
+ }, CLASS_NAME: "OpenLayers.Format.WFST.v1_1_0"
+});
+OpenLayers.Protocol = OpenLayers.Class({
+ format: null, options: null, autoDestroy: !0, defaultFilter: null, initialize: function(a) { a = a || {}; OpenLayers.Util.extend(this, a); this.options = a }, mergeWithDefaultFilter: function(a) { return a && this.defaultFilter ? new OpenLayers.Filter.Logical({ type: OpenLayers.Filter.Logical.AND, filters: [this.defaultFilter, a] }) : a || this.defaultFilter || void 0 }, destroy: function() { this.format = this.options = null }, read: function(a) { a = a || {}; a.filter = this.mergeWithDefaultFilter(a.filter) }, create: function() { },
+ update: function() { }, "delete": function() { }, commit: function() { }, abort: function(a) { }, createCallback: function(a, b, c) { return OpenLayers.Function.bind(function() { a.apply(this, [b, c]) }, this) }, CLASS_NAME: "OpenLayers.Protocol"
+}); OpenLayers.Protocol.Response = OpenLayers.Class({ code: null, requestType: null, last: !0, features: null, data: null, reqFeatures: null, priv: null, error: null, initialize: function(a) { OpenLayers.Util.extend(this, a) }, success: function() { return 0 < this.code }, CLASS_NAME: "OpenLayers.Protocol.Response" });
+OpenLayers.Protocol.Response.SUCCESS = 1; OpenLayers.Protocol.Response.FAILURE = 0;
+OpenLayers.Format.JSON = OpenLayers.Class(OpenLayers.Format, {
+ indent: " ", space: " ", newline: "\n", level: 0, pretty: !1, nativeJSON: function() { return !(!window.JSON || "function" != typeof JSON.parse || "function" != typeof JSON.stringify) }(), read: function(a, b) {
+ var c; if (this.nativeJSON) c = JSON.parse(a, b); else try {
+ if (/^[\],:{}\s]*$/.test(a.replace(/\\["\\\/bfnrtu]/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, "")) && (c = eval("(" + a + ")"), "function" ===
+ typeof b)) { var d = function(a, c) { if (c && "object" === typeof c) for (var e in c) c.hasOwnProperty(e) && (c[e] = d(e, c[e])); return b(a, c) }; c = d("", c) }
+ } catch (e) { } this.keepData && (this.data = c); return c
+ }, write: function(a, b) { this.pretty = !!b; var c = null, d = typeof a; if (this.serialize[d]) try { c = !this.pretty && this.nativeJSON ? JSON.stringify(a) : this.serialize[d].apply(this, [a]) } catch (e) { OpenLayers.Console.error("Trouble serializing: " + e) } return c }, writeIndent: function() {
+ var a = []; if (this.pretty) for (var b = 0; b < this.level; ++b)a.push(this.indent);
+ return a.join("")
+ }, writeNewline: function() { return this.pretty ? this.newline : "" }, writeSpace: function() { return this.pretty ? this.space : "" }, serialize: {
+ object: function(a) {
+ if (null == a) return "null"; if (a.constructor == Date) return this.serialize.date.apply(this, [a]); if (a.constructor == Array) return this.serialize.array.apply(this, [a]); var b = ["{"]; this.level += 1; var c, d, e, f = !1; for (c in a) a.hasOwnProperty(c) && (d = OpenLayers.Format.JSON.prototype.write.apply(this, [c, this.pretty]), e = OpenLayers.Format.JSON.prototype.write.apply(this,
+ [a[c], this.pretty]), null != d && null != e && (f && b.push(","), b.push(this.writeNewline(), this.writeIndent(), d, ":", this.writeSpace(), e), f = !0)); --this.level; b.push(this.writeNewline(), this.writeIndent(), "}"); return b.join("")
+ }, array: function(a) {
+ var b, c = ["["]; this.level += 1; for (var d = 0, e = a.length; d < e; ++d)b = OpenLayers.Format.JSON.prototype.write.apply(this, [a[d], this.pretty]), null != b && (0 < d && c.push(","), c.push(this.writeNewline(), this.writeIndent(), b)); --this.level; c.push(this.writeNewline(), this.writeIndent(),
+ "]"); return c.join("")
+ }, string: function(a) { var b = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }; return /["\\\x00-\x1f]/.test(a) ? '"' + a.replace(/([\x00-\x1f\\"])/g, function(a, d) { var e = b[d]; if (e) return e; e = d.charCodeAt(); return "\\u00" + Math.floor(e / 16).toString(16) + (e % 16).toString(16) }) + '"' : '"' + a + '"' }, number: function(a) { return isFinite(a) ? String(a) : "null" }, "boolean": function(a) { return String(a) }, date: function(a) {
+ function b(a) { return 10 > a ? "0" + a : a } return '"' + a.getFullYear() +
+ "-" + b(a.getMonth() + 1) + "-" + b(a.getDate()) + "T" + b(a.getHours()) + ":" + b(a.getMinutes()) + ":" + b(a.getSeconds()) + '"'
+ }
+ }, CLASS_NAME: "OpenLayers.Format.JSON"
+});
+OpenLayers.Format.GeoJSON = OpenLayers.Class(OpenLayers.Format.JSON, {
+ ignoreExtraDims: !1, read: function(a, b, c) {
+ b = b ? b : "FeatureCollection"; var d = null, e = null, e = "string" == typeof a ? OpenLayers.Format.JSON.prototype.read.apply(this, [a, c]) : a; if (!e) OpenLayers.Console.error("Bad JSON: " + a); else if ("string" != typeof e.type) OpenLayers.Console.error("Bad GeoJSON - no type: " + a); else if (this.isValidType(e, b)) switch (b) {
+ case "Geometry": try { d = this.parseGeometry(e) } catch (f) { OpenLayers.Console.error(f) } break; case "Feature": try {
+ d =
+ this.parseFeature(e), d.type = "Feature"
+ } catch (g) { OpenLayers.Console.error(g) } break; case "FeatureCollection": switch (d = [], e.type) { case "Feature": try { d.push(this.parseFeature(e)) } catch (h) { d = null, OpenLayers.Console.error(h) } break; case "FeatureCollection": a = 0; for (b = e.features.length; a < b; ++a)try { d.push(this.parseFeature(e.features[a])) } catch (k) { d = null, OpenLayers.Console.error(k) } break; default: try { var l = this.parseGeometry(e); d.push(new OpenLayers.Feature.Vector(l)) } catch (m) { d = null, OpenLayers.Console.error(m) } }
+ }return d
+ },
+ isValidType: function(a, b) { var c = !1; switch (b) { case "Geometry": -1 == OpenLayers.Util.indexOf("Point MultiPoint LineString MultiLineString Polygon MultiPolygon Box GeometryCollection".split(" "), a.type) ? OpenLayers.Console.error("Unsupported geometry type: " + a.type) : c = !0; break; case "FeatureCollection": c = !0; break; default: a.type == b ? c = !0 : OpenLayers.Console.error("Cannot convert types from " + a.type + " to " + b) }return c }, parseFeature: function(a) {
+ var b, c, d; c = a.properties ? a.properties : {}; d = a.geometry && a.geometry.bbox ||
+ a.bbox; try { b = this.parseGeometry(a.geometry) } catch (e) { throw e; } b = new OpenLayers.Feature.Vector(b, c); d && (b.bounds = OpenLayers.Bounds.fromArray(d)); a.id && (b.fid = a.id); return b
+ }, parseGeometry: function(a) {
+ if (null == a) return null; var b, c = !1; if ("GeometryCollection" == a.type) {
+ if (!OpenLayers.Util.isArray(a.geometries)) throw "GeometryCollection must have geometries array: " + a; b = a.geometries.length; for (var c = Array(b), d = 0; d < b; ++d)c[d] = this.parseGeometry.apply(this, [a.geometries[d]]); b = new OpenLayers.Geometry.Collection(c);
+ c = !0
+ } else { if (!OpenLayers.Util.isArray(a.coordinates)) throw "Geometry must have coordinates array: " + a; if (!this.parseCoords[a.type.toLowerCase()]) throw "Unsupported geometry type: " + a.type; try { b = this.parseCoords[a.type.toLowerCase()].apply(this, [a.coordinates]) } catch (e) { throw e; } } this.internalProjection && this.externalProjection && !c && b.transform(this.externalProjection, this.internalProjection); return b
+ }, parseCoords: {
+ point: function(a) {
+ if (0 == this.ignoreExtraDims && 2 != a.length) throw "Only 2D points are supported: " +
+ a; return new OpenLayers.Geometry.Point(a[0], a[1])
+ }, multipoint: function(a) { for (var b = [], c = null, d = 0, e = a.length; d < e; ++d) { try { c = this.parseCoords.point.apply(this, [a[d]]) } catch (f) { throw f; } b.push(c) } return new OpenLayers.Geometry.MultiPoint(b) }, linestring: function(a) { for (var b = [], c = null, d = 0, e = a.length; d < e; ++d) { try { c = this.parseCoords.point.apply(this, [a[d]]) } catch (f) { throw f; } b.push(c) } return new OpenLayers.Geometry.LineString(b) }, multilinestring: function(a) {
+ for (var b = [], c = null, d = 0, e = a.length; d < e; ++d) {
+ try {
+ c =
+ this.parseCoords.linestring.apply(this, [a[d]])
+ } catch (f) { throw f; } b.push(c)
+ } return new OpenLayers.Geometry.MultiLineString(b)
+ }, polygon: function(a) { for (var b = [], c, d, e = 0, f = a.length; e < f; ++e) { try { d = this.parseCoords.linestring.apply(this, [a[e]]) } catch (g) { throw g; } c = new OpenLayers.Geometry.LinearRing(d.components); b.push(c) } return new OpenLayers.Geometry.Polygon(b) }, multipolygon: function(a) { for (var b = [], c = null, d = 0, e = a.length; d < e; ++d) { try { c = this.parseCoords.polygon.apply(this, [a[d]]) } catch (f) { throw f; } b.push(c) } return new OpenLayers.Geometry.MultiPolygon(b) },
+ box: function(a) { if (2 != a.length) throw "GeoJSON box coordinates must have 2 elements"; return new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([new OpenLayers.Geometry.Point(a[0][0], a[0][1]), new OpenLayers.Geometry.Point(a[1][0], a[0][1]), new OpenLayers.Geometry.Point(a[1][0], a[1][1]), new OpenLayers.Geometry.Point(a[0][0], a[1][1]), new OpenLayers.Geometry.Point(a[0][0], a[0][1])])]) }
+ }, write: function(a, b) {
+ var c = { type: null }; if (OpenLayers.Util.isArray(a)) {
+ c.type = "FeatureCollection"; var d =
+ a.length; c.features = Array(d); for (var e = 0; e < d; ++e) { var f = a[e]; if (!f instanceof OpenLayers.Feature.Vector) throw "FeatureCollection only supports collections of features: " + f; c.features[e] = this.extract.feature.apply(this, [f]) }
+ } else 0 == a.CLASS_NAME.indexOf("OpenLayers.Geometry") ? c = this.extract.geometry.apply(this, [a]) : a instanceof OpenLayers.Feature.Vector && (c = this.extract.feature.apply(this, [a]), a.layer && a.layer.projection && (c.crs = this.createCRSObject(a))); return OpenLayers.Format.JSON.prototype.write.apply(this,
+ [c, b])
+ }, createCRSObject: function(a) { a = a.layer.projection.toString(); var b = {}; a.match(/epsg:/i) && (a = parseInt(a.substring(a.indexOf(":") + 1)), b = 4326 == a ? { type: "name", properties: { name: "urn:ogc:def:crs:OGC:1.3:CRS84" } } : { type: "name", properties: { name: "EPSG:" + a } }); return b }, extract: {
+ feature: function(a) { var b = this.extract.geometry.apply(this, [a.geometry]), b = { type: "Feature", properties: a.attributes, geometry: b }; null != a.fid && (b.id = a.fid); return b }, geometry: function(a) {
+ if (null == a) return null; this.internalProjection &&
+ this.externalProjection && (a = a.clone(), a.transform(this.internalProjection, this.externalProjection)); var b = a.CLASS_NAME.split(".")[2]; a = this.extract[b.toLowerCase()].apply(this, [a]); return "Collection" == b ? { type: "GeometryCollection", geometries: a } : { type: b, coordinates: a }
+ }, point: function(a) { return [a.x, a.y] }, multipoint: function(a) { for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push(this.extract.point.apply(this, [a.components[c]])); return b }, linestring: function(a) {
+ for (var b = [], c = 0, d = a.components.length; c <
+ d; ++c)b.push(this.extract.point.apply(this, [a.components[c]])); return b
+ }, multilinestring: function(a) { for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push(this.extract.linestring.apply(this, [a.components[c]])); return b }, polygon: function(a) { for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push(this.extract.linestring.apply(this, [a.components[c]])); return b }, multipolygon: function(a) { for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push(this.extract.polygon.apply(this, [a.components[c]])); return b }, collection: function(a) {
+ for (var b =
+ a.components.length, c = Array(b), d = 0; d < b; ++d)c[d] = this.extract.geometry.apply(this, [a.components[d]]); return c
+ }
+ }, CLASS_NAME: "OpenLayers.Format.GeoJSON"
+});
+OpenLayers.Protocol.Script = OpenLayers.Class(OpenLayers.Protocol, {
+ url: null, params: null, callback: null, callbackTemplate: "OpenLayers.Protocol.Script.registry.${id}", callbackKey: "callback", callbackPrefix: "", scope: null, format: null, pendingRequests: null, srsInBBOX: !1, initialize: function(a) {
+ a = a || {}; this.params = {}; this.pendingRequests = {}; OpenLayers.Protocol.prototype.initialize.apply(this, arguments); this.format || (this.format = new OpenLayers.Format.GeoJSON); if (!this.filterToParams && OpenLayers.Format.QueryStringFilter) {
+ var b =
+ new OpenLayers.Format.QueryStringFilter({ srsInBBOX: this.srsInBBOX }); this.filterToParams = function(a, d) { return b.write(a, d) }
+ }
+ }, read: function(a) {
+ OpenLayers.Protocol.prototype.read.apply(this, arguments); a = OpenLayers.Util.applyDefaults(a, this.options); a.params = OpenLayers.Util.applyDefaults(a.params, this.options.params); a.filter && this.filterToParams && (a.params = this.filterToParams(a.filter, a.params)); var b = new OpenLayers.Protocol.Response({ requestType: "read" }), c = this.createRequest(a.url, a.params, OpenLayers.Function.bind(function(c) {
+ b.data =
+ c; this.handleRead(b, a)
+ }, this)); b.priv = c; return b
+ }, createRequest: function(a, b, c) {
+ c = OpenLayers.Protocol.Script.register(c); var d = OpenLayers.String.format(this.callbackTemplate, { id: c }); b = OpenLayers.Util.extend({}, b); b[this.callbackKey] = this.callbackPrefix + d; a = OpenLayers.Util.urlAppend(a, OpenLayers.Util.getParameterString(b)); b = document.createElement("script"); b.type = "text/javascript"; b.src = a; b.id = "OpenLayers_Protocol_Script_" + c; this.pendingRequests[b.id] = b; document.getElementsByTagName("head")[0].appendChild(b);
+ return b
+ }, destroyRequest: function(a) { OpenLayers.Protocol.Script.unregister(a.id.split("_").pop()); delete this.pendingRequests[a.id]; a.parentNode && a.parentNode.removeChild(a) }, handleRead: function(a, b) { this.handleResponse(a, b) }, handleResponse: function(a, b) { b.callback && (a.data ? (a.features = this.parseFeatures(a.data), a.code = OpenLayers.Protocol.Response.SUCCESS) : a.code = OpenLayers.Protocol.Response.FAILURE, this.destroyRequest(a.priv), b.callback.call(b.scope, a)) }, parseFeatures: function(a) { return this.format.read(a) },
+ abort: function(a) { if (a) this.destroyRequest(a.priv); else for (var b in this.pendingRequests) this.destroyRequest(this.pendingRequests[b]) }, destroy: function() { this.abort(); delete this.params; delete this.format; OpenLayers.Protocol.prototype.destroy.apply(this) }, CLASS_NAME: "OpenLayers.Protocol.Script"
+}); (function() { var a = OpenLayers.Protocol.Script, b = 0; a.registry = {}; a.register = function(c) { var d = "c" + ++b; a.registry[d] = function() { c.apply(this, arguments) }; return d }; a.unregister = function(b) { delete a.registry[b] } })();
+OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
+ geometryType: "linestring", initialize: function(a) { OpenLayers.Format.prototype.initialize.apply(this, [a]) }, read: function(a) {
+ var b; if ("linestring" == this.geometryType) b = OpenLayers.Geometry.LineString; else if ("linearring" == this.geometryType) b = OpenLayers.Geometry.LinearRing; else if ("multipoint" == this.geometryType) b = OpenLayers.Geometry.MultiPoint; else if ("point" != this.geometryType && "polygon" != this.geometryType) return null; a = this.decodeDeltas(a,
+ 2); for (var c = a.length, d = [], e = 0; e + 1 < c;) { var f = a[e++], g = a[e++]; d.push(new OpenLayers.Geometry.Point(g, f)) } return "point" == this.geometryType ? new OpenLayers.Feature.Vector(d[0]) : "polygon" == this.geometryType ? new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(d)])) : new OpenLayers.Feature.Vector(new b(d))
+ }, decode: function(a, b, c) { a = this.decodeDeltas(a, b, c || 1E5); c = a.length; for (var d = [], e = 0; e + (b - 1) < c;) { for (var f = [], g = 0; g < b; ++g)f.push(a[e++]); d.push(f) } return d },
+ write: function(a) { a = (a.constructor == Array ? a[0] : a).geometry; var b = a.CLASS_NAME.split(".")[2].toLowerCase(); if ("point" == b) a = Array(a); else if ("linestring" == b || "linearring" == b || "multipoint" == b) a = a.components; else if ("polygon" == b) a = a.components[0].components; else return null; for (var b = [], c = a.length, d = 0; d < c; ++d) { var e = a[d]; b.push(e.y); b.push(e.x) } return this.encodeDeltas(b, 2) }, encode: function(a, b, c) {
+ c = c || 1E5; for (var d = [], e = a.length, f = 0; f < e; ++f)for (var g = a[f], h = 0; h < b; ++h)d.push(g[h]); return this.encodeDeltas(d,
+ b, c)
+ }, encodeDeltas: function(a, b, c) { var d, e = Array(b); for (d = 0; d < b; ++d)e[d] = 0; for (var f = a.length, g = 0; g < f;)for (d = 0; d < b; ++d, ++g) { var h = a[g], k = h - e[d]; e[d] = h; a[g] = k } return this.encodeFloats(a, c || 1E5) }, decodeDeltas: function(a, b, c) { var d, e = Array(b); for (d = 0; d < b; ++d)e[d] = 0; a = this.decodeFloats(a, c || 1E5); c = a.length; for (var f = 0; f < c;)for (d = 0; d < b; ++d, ++f)e[d] += a[f], a[f] = e[d]; return a }, encodeFloats: function(a, b) { for (var c = b || 1E5, d = a.length, e = 0; e < d; ++e)a[e] = Math.round(a[e] * c); return this.encodeSignedIntegers(a) }, decodeFloats: function(a,
+ b) { for (var c = b || 1E5, d = this.decodeSignedIntegers(a), e = d.length, f = 0; f < e; ++f)d[f] /= c; return d }, encodeSignedIntegers: function(a) { for (var b = a.length, c = 0; c < b; ++c) { var d = a[c], e = d << 1; 0 > d && (e = ~e); a[c] = e } return this.encodeUnsignedIntegers(a) }, decodeSignedIntegers: function(a) { a = this.decodeUnsignedIntegers(a); for (var b = a.length, c = 0; c < b; ++c) { var d = a[c]; a[c] = d & 1 ? ~(d >> 1) : d >> 1 } return a }, encodeUnsignedIntegers: function(a) { for (var b = "", c = a.length, d = 0; d < c; ++d)b += this.encodeUnsignedInteger(a[d]); return b }, decodeUnsignedIntegers: function(a) {
+ for (var b =
+ [], c = 0, d = 0, e = a.length, f = 0; f < e; ++f) { var g = a.charCodeAt(f) - 63, c = c | (g & 31) << d; 32 > g ? (b.push(c), d = c = 0) : d += 5 } return b
+ }, encodeFloat: function(a, b) { a = Math.round(a * (b || 1E5)); return this.encodeSignedInteger(a) }, decodeFloat: function(a, b) { return this.decodeSignedInteger(a) / (b || 1E5) }, encodeSignedInteger: function(a) { var b = a << 1; 0 > a && (b = ~b); return this.encodeUnsignedInteger(b) }, decodeSignedInteger: function(a) { a = this.decodeUnsignedInteger(a); return a & 1 ? ~(a >> 1) : a >> 1 }, encodeUnsignedInteger: function(a) {
+ for (var b, c = ""; 32 <=
+ a;)b = (32 | a & 31) + 63, c += String.fromCharCode(b), a >>= 5; return c + String.fromCharCode(a + 63)
+ }, decodeUnsignedInteger: function(a) { for (var b = 0, c = 0, d = a.length, e = 0; e < d; ++e) { var f = a.charCodeAt(e) - 63, b = b | (f & 31) << c; if (32 > f) break; c += 5 } return b }, CLASS_NAME: "OpenLayers.Format.EncodedPolyline"
+});
+OpenLayers.Control.Panel = OpenLayers.Class(OpenLayers.Control, {
+ controls: null, autoActivate: !0, defaultControl: null, saveState: !1, allowDepress: !1, activeState: null, initialize: function(a) { OpenLayers.Control.prototype.initialize.apply(this, [a]); this.controls = []; this.activeState = {} }, destroy: function() {
+ this.map && this.map.events.unregister("buttonclick", this, this.onButtonClick); OpenLayers.Control.prototype.destroy.apply(this, arguments); for (var a, b = this.controls.length - 1; 0 <= b; b--)a = this.controls[b], a.events &&
+ a.events.un({ activate: this.iconOn, deactivate: this.iconOff }), a.panel_div = null; this.activeState = null
+ }, activate: function() { if (OpenLayers.Control.prototype.activate.apply(this, arguments)) { for (var a, b = 0, c = this.controls.length; b < c; b++)a = this.controls[b], (a === this.defaultControl || this.saveState && this.activeState[a.id]) && a.activate(); !0 === this.saveState && (this.defaultControl = null); this.redraw(); return !0 } return !1 }, deactivate: function() {
+ if (OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
+ for (var a,
+ b = 0, c = this.controls.length; b < c; b++)a = this.controls[b], this.activeState[a.id] = a.deactivate(); this.redraw(); return !0
+ } return !1
+ }, draw: function() { OpenLayers.Control.prototype.draw.apply(this, arguments); this.outsideViewport ? (this.events.attachToElement(this.div), this.events.register("buttonclick", this, this.onButtonClick)) : this.map.events.register("buttonclick", this, this.onButtonClick); this.addControlsToMap(this.controls); return this.div }, redraw: function() {
+ for (var a = this.div.childNodes.length - 1; 0 <= a; a--)this.div.removeChild(this.div.childNodes[a]);
+ this.div.innerHTML = ""; if (this.active) for (var a = 0, b = this.controls.length; a < b; a++)this.div.appendChild(this.controls[a].panel_div)
+ }, activateControl: function(a) {
+ if (!this.active) return !1; if (a.type == OpenLayers.Control.TYPE_BUTTON) a.trigger(); else if (a.type == OpenLayers.Control.TYPE_TOGGLE) a.active ? a.deactivate() : a.activate(); else if (this.allowDepress && a.active) a.deactivate(); else {
+ for (var b, c = 0, d = this.controls.length; c < d; c++)b = this.controls[c], b == a || b.type !== OpenLayers.Control.TYPE_TOOL && null != b.type || b.deactivate();
+ a.activate()
+ }
+ }, addControls: function(a) { OpenLayers.Util.isArray(a) || (a = [a]); this.controls = this.controls.concat(a); for (var b = 0, c = a.length; b < c; b++) { var d = a[b], e = this.createControlMarkup(d); OpenLayers.Element.addClass(e, d.displayClass + "ItemInactive"); OpenLayers.Element.addClass(e, "olButton"); "" == d.title || e.title || (e.title = d.title); d.panel_div = e } this.map && (this.addControlsToMap(a), this.redraw()) }, createControlMarkup: function(a) { return document.createElement("div") }, addControlsToMap: function(a) {
+ for (var b,
+ c = 0, d = a.length; c < d; c++)b = a[c], !0 === b.autoActivate ? (b.autoActivate = !1, this.map.addControl(b), b.autoActivate = !0) : (this.map.addControl(b), b.deactivate()), b.events.on({ activate: this.iconOn, deactivate: this.iconOff })
+ }, iconOn: function() { var a = this.panel_div; a.className = a.className.replace(RegExp("\\b(" + this.displayClass + "Item)Inactive\\b"), "$1Active") }, iconOff: function() { var a = this.panel_div; a.className = a.className.replace(RegExp("\\b(" + this.displayClass + "Item)Active\\b"), "$1Inactive") }, onButtonClick: function(a) {
+ var b =
+ this.controls; a = a.buttonElement; for (var c = b.length - 1; 0 <= c; --c)if (b[c].panel_div === a) { this.activateControl(b[c]); break }
+ }, getControlsBy: function(a, b) { var c = "function" == typeof b.test; return OpenLayers.Array.filter(this.controls, function(d) { return d[a] == b || c && b.test(d[a]) }) }, getControlsByName: function(a) { return this.getControlsBy("name", a) }, getControlsByClass: function(a) { return this.getControlsBy("CLASS_NAME", a) }, CLASS_NAME: "OpenLayers.Control.Panel"
+});
+OpenLayers.Control.Button = OpenLayers.Class(OpenLayers.Control, { type: OpenLayers.Control.TYPE_BUTTON, trigger: function() { }, CLASS_NAME: "OpenLayers.Control.Button" }); OpenLayers.Control.ZoomIn = OpenLayers.Class(OpenLayers.Control.Button, { trigger: function() { this.map && this.map.zoomIn() }, CLASS_NAME: "OpenLayers.Control.ZoomIn" }); OpenLayers.Control.ZoomOut = OpenLayers.Class(OpenLayers.Control.Button, { trigger: function() { this.map && this.map.zoomOut() }, CLASS_NAME: "OpenLayers.Control.ZoomOut" });
+OpenLayers.Control.ZoomToMaxExtent = OpenLayers.Class(OpenLayers.Control.Button, { trigger: function() { this.map && this.map.zoomToMaxExtent() }, CLASS_NAME: "OpenLayers.Control.ZoomToMaxExtent" }); OpenLayers.Control.ZoomPanel = OpenLayers.Class(OpenLayers.Control.Panel, { initialize: function(a) { OpenLayers.Control.Panel.prototype.initialize.apply(this, [a]); this.addControls([new OpenLayers.Control.ZoomIn, new OpenLayers.Control.ZoomToMaxExtent, new OpenLayers.Control.ZoomOut]) }, CLASS_NAME: "OpenLayers.Control.ZoomPanel" });
+OpenLayers.Layer.HTTPRequest = OpenLayers.Class(OpenLayers.Layer, {
+ URL_HASH_FACTOR: (Math.sqrt(5) - 1) / 2, url: null, params: null, reproject: !1, initialize: function(a, b, c, d) { OpenLayers.Layer.prototype.initialize.apply(this, [a, d]); this.url = b; this.params || (this.params = OpenLayers.Util.extend({}, c)) }, destroy: function() { this.params = this.url = null; OpenLayers.Layer.prototype.destroy.apply(this, arguments) }, clone: function(a) {
+ null == a && (a = new OpenLayers.Layer.HTTPRequest(this.name, this.url, this.params, this.getOptions()));
+ return OpenLayers.Layer.prototype.clone.apply(this, [a])
+ }, setUrl: function(a) { this.url = a }, mergeNewParams: function(a) { this.params = OpenLayers.Util.extend(this.params, a); a = this.redraw(); null != this.map && this.map.events.triggerEvent("changelayer", { layer: this, property: "params" }); return a }, redraw: function(a) { return a ? this.mergeNewParams({ _olSalt: Math.random() }) : OpenLayers.Layer.prototype.redraw.apply(this, []) }, selectUrl: function(a, b) {
+ for (var c = 1, d = 0, e = a.length; d < e; d++)c = c * a.charCodeAt(d) * this.URL_HASH_FACTOR,
+ c -= Math.floor(c); return b[Math.floor(c * b.length)]
+ }, getFullRequestString: function(a, b) { var c = b || this.url, d = OpenLayers.Util.extend({}, this.params), d = OpenLayers.Util.extend(d, a), e = OpenLayers.Util.getParameterString(d); OpenLayers.Util.isArray(c) && (c = this.selectUrl(e, c)); var e = OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(c)), f; for (f in d) f.toUpperCase() in e && delete d[f]; e = OpenLayers.Util.getParameterString(d); return OpenLayers.Util.urlAppend(c, e) }, CLASS_NAME: "OpenLayers.Layer.HTTPRequest"
+});
+OpenLayers.Tile = OpenLayers.Class({
+ events: null, eventListeners: null, id: null, layer: null, url: null, bounds: null, size: null, position: null, isLoading: !1, initialize: function(a, b, c, d, e, f) { this.layer = a; this.position = b.clone(); this.setBounds(c); this.url = d; e && (this.size = e.clone()); this.id = OpenLayers.Util.createUniqueID("Tile_"); OpenLayers.Util.extend(this, f); this.events = new OpenLayers.Events(this); if (this.eventListeners instanceof Object) this.events.on(this.eventListeners) }, unload: function() {
+ this.isLoading && (this.isLoading =
+ !1, this.events.triggerEvent("unload"))
+ }, destroy: function() { this.position = this.size = this.bounds = this.layer = null; this.eventListeners && this.events.un(this.eventListeners); this.events.destroy(); this.events = this.eventListeners = null }, draw: function(a) { a || this.clear(); var b = this.shouldDraw(); b && !a && !1 === this.events.triggerEvent("beforedraw") && (b = null); return b }, shouldDraw: function() {
+ var a = !1, b = this.layer.maxExtent; if (b) {
+ var c = this.layer.map, c = c.baseLayer.wrapDateLine && c.getMaxExtent(); this.bounds.intersectsBounds(b,
+ { inclusive: !1, worldBounds: c }) && (a = !0)
+ } return a || this.layer.displayOutsideMaxExtent
+ }, setBounds: function(a) { a = a.clone(); if (this.layer.map.baseLayer.wrapDateLine) { var b = this.layer.map.getMaxExtent(), c = this.layer.map.getResolution(); a = a.wrapDateLine(b, { leftTolerance: c, rightTolerance: c }) } this.bounds = a }, moveTo: function(a, b, c) { null == c && (c = !0); this.setBounds(a); this.position = b.clone(); c && this.draw() }, clear: function(a) { }, CLASS_NAME: "OpenLayers.Tile"
+});
+OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, {
+ url: null, imgDiv: null, frame: null, imageReloadAttempts: null, layerAlphaHack: null, asyncRequestId: null, maxGetUrlLength: null, canvasContext: null, crossOriginKeyword: null, initialize: function(a, b, c, d, e, f) {
+ OpenLayers.Tile.prototype.initialize.apply(this, arguments); this.url = d; this.layerAlphaHack = this.layer.alpha && OpenLayers.Util.alphaHack(); if (null != this.maxGetUrlLength || this.layer.gutter || this.layerAlphaHack) this.frame = document.createElement("div"), this.frame.style.position =
+ "absolute", this.frame.style.overflow = "hidden"; null != this.maxGetUrlLength && OpenLayers.Util.extend(this, OpenLayers.Tile.Image.IFrame)
+ }, destroy: function() { this.imgDiv && (this.clear(), this.frame = this.imgDiv = null); this.asyncRequestId = null; OpenLayers.Tile.prototype.destroy.apply(this, arguments) }, draw: function() {
+ var a = OpenLayers.Tile.prototype.draw.apply(this, arguments); a ? (this.layer != this.layer.map.baseLayer && this.layer.reproject && (this.bounds = this.getBoundsFromBaseLayer(this.position)), this.isLoading ? this._loadEvent =
+ "reload" : (this.isLoading = !0, this._loadEvent = "loadstart"), this.renderTile(), this.positionTile()) : !1 === a && this.unload(); return a
+ }, renderTile: function() { if (this.layer.async) { var a = this.asyncRequestId = (this.asyncRequestId || 0) + 1; this.layer.getURLasync(this.bounds, function(b) { a == this.asyncRequestId && (this.url = b, this.initImage()) }, this) } else this.url = this.layer.getURL(this.bounds), this.initImage() }, positionTile: function() {
+ var a = this.getTile().style, b = this.frame ? this.size : this.layer.getImageSize(this.bounds),
+ c = 1; this.layer instanceof OpenLayers.Layer.Grid && (c = this.layer.getServerResolution() / this.layer.map.getResolution()); a.left = this.position.x + "px"; a.top = this.position.y + "px"; a.width = Math.round(c * b.w) + "px"; a.height = Math.round(c * b.h) + "px"
+ }, clear: function() {
+ OpenLayers.Tile.prototype.clear.apply(this, arguments); var a = this.imgDiv; if (a) {
+ var b = this.getTile(); b.parentNode === this.layer.div && this.layer.div.removeChild(b); this.setImgSrc(); !0 === this.layerAlphaHack && (a.style.filter = ""); OpenLayers.Element.removeClass(a,
+ "olImageLoadError")
+ } this.canvasContext = null
+ }, getImage: function() {
+ if (!this.imgDiv) {
+ this.imgDiv = OpenLayers.Tile.Image.IMAGE.cloneNode(!1); var a = this.imgDiv.style; if (this.frame) { var b = 0, c = 0; this.layer.gutter && (b = this.layer.gutter / this.layer.tileSize.w * 100, c = this.layer.gutter / this.layer.tileSize.h * 100); a.left = -b + "%"; a.top = -c + "%"; a.width = 2 * b + 100 + "%"; a.height = 2 * c + 100 + "%" } a.visibility = "hidden"; a.opacity = 0; 1 > this.layer.opacity && (a.filter = "alpha(opacity\x3d" + 100 * this.layer.opacity + ")"); a.position = "absolute";
+ this.layerAlphaHack && (a.paddingTop = a.height, a.height = "0", a.width = "100%"); this.frame && this.frame.appendChild(this.imgDiv)
+ } return this.imgDiv
+ }, setImage: function(a) { this.imgDiv = a }, initImage: function() {
+ if (this.url || this.imgDiv) {
+ this.events.triggerEvent("beforeload"); this.layer.div.appendChild(this.getTile()); this.events.triggerEvent(this._loadEvent); var a = this.getImage(), b = a.getAttribute("src") || ""; this.url && OpenLayers.Util.isEquivalentUrl(b, this.url) ? this._loadTimeout = window.setTimeout(OpenLayers.Function.bind(this.onImageLoad,
+ this), 0) : (this.stopLoading(), this.crossOriginKeyword && a.removeAttribute("crossorigin"), OpenLayers.Event.observe(a, "load", OpenLayers.Function.bind(this.onImageLoad, this)), OpenLayers.Event.observe(a, "error", OpenLayers.Function.bind(this.onImageError, this)), this.imageReloadAttempts = 0, this.setImgSrc(this.url))
+ } else this.isLoading = !1
+ }, setImgSrc: function(a) {
+ var b = this.imgDiv; a ? (b.style.visibility = "hidden", b.style.opacity = 0, this.crossOriginKeyword && ("data:" !== a.substr(0, 5) ? b.setAttribute("crossorigin", this.crossOriginKeyword) :
+ b.removeAttribute("crossorigin")), b.src = a) : (this.stopLoading(), this.imgDiv = null, b.parentNode && b.parentNode.removeChild(b))
+ }, getTile: function() { return this.frame ? this.frame : this.getImage() }, createBackBuffer: function() { if (this.imgDiv && !this.isLoading) { var a; this.frame ? (a = this.frame.cloneNode(!1), a.appendChild(this.imgDiv)) : a = this.imgDiv; this.imgDiv = null; return a } }, onImageLoad: function() {
+ var a = this.imgDiv; this.stopLoading(); a.style.visibility = "inherit"; a.style.opacity = this.layer.opacity; this.isLoading =
+ !1; this.canvasContext = null; this.events.triggerEvent("loadend"); !0 === this.layerAlphaHack && (a.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src\x3d'" + a.src + "', sizingMethod\x3d'scale')")
+ }, onImageError: function() { var a = this.imgDiv; null != a.src && (this.imageReloadAttempts++, this.imageReloadAttempts <= OpenLayers.IMAGE_RELOAD_ATTEMPTS ? this.setImgSrc(this.layer.getURL(this.bounds)) : (OpenLayers.Element.addClass(a, "olImageLoadError"), this.events.triggerEvent("loaderror"), this.onImageLoad())) },
+ stopLoading: function() { OpenLayers.Event.stopObservingElement(this.imgDiv); window.clearTimeout(this._loadTimeout); delete this._loadTimeout }, getCanvasContext: function() { if (OpenLayers.CANVAS_SUPPORTED && this.imgDiv && !this.isLoading) { if (!this.canvasContext) { var a = document.createElement("canvas"); a.width = this.size.w; a.height = this.size.h; this.canvasContext = a.getContext("2d"); this.canvasContext.drawImage(this.imgDiv, 0, 0) } return this.canvasContext } }, CLASS_NAME: "OpenLayers.Tile.Image"
+});
+OpenLayers.Tile.Image.IMAGE = function() { var a = new Image; a.className = "olTileImage"; a.galleryImg = "no"; return a }();
+OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
+ tileSize: null, tileOriginCorner: "bl", tileOrigin: null, tileOptions: null, tileClass: OpenLayers.Tile.Image, grid: null, singleTile: !1, ratio: 1.5, buffer: 0, transitionEffect: "resize", numLoadingTiles: 0, serverResolutions: null, loading: !1, backBuffer: null, gridResolution: null, backBufferResolution: null, backBufferLonLat: null, backBufferTimerId: null, removeBackBufferDelay: null, className: null, gridLayout: null, rowSign: null, transitionendEvents: ["transitionend",
+ "webkitTransitionEnd", "otransitionend", "oTransitionEnd"], initialize: function(a, b, c, d) { OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this, arguments); this.grid = []; this._removeBackBuffer = OpenLayers.Function.bind(this.removeBackBuffer, this); this.initProperties(); this.rowSign = "t" === this.tileOriginCorner.substr(0, 1) ? 1 : -1 }, initProperties: function() {
+ void 0 === this.options.removeBackBufferDelay && (this.removeBackBufferDelay = this.singleTile ? 0 : 2500); void 0 === this.options.className && (this.className = this.singleTile ?
+ "olLayerGridSingleTile" : "olLayerGrid")
+ }, setMap: function(a) { OpenLayers.Layer.HTTPRequest.prototype.setMap.call(this, a); OpenLayers.Element.addClass(this.div, this.className) }, removeMap: function(a) { this.removeBackBuffer() }, destroy: function() { this.removeBackBuffer(); this.clearGrid(); this.tileSize = this.grid = null; OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments) }, clearGrid: function() {
+ if (this.grid) {
+ for (var a = 0, b = this.grid.length; a < b; a++)for (var c = this.grid[a], d = 0, e = c.length; d < e; d++)this.destroyTile(c[d]);
+ this.grid = []; this.gridLayout = this.gridResolution = null
+ }
+ }, addOptions: function(a, b) { var c = void 0 !== a.singleTile && a.singleTile !== this.singleTile; OpenLayers.Layer.HTTPRequest.prototype.addOptions.apply(this, arguments); this.map && c && (this.initProperties(), this.clearGrid(), this.tileSize = this.options.tileSize, this.setTileSize(), this.moveTo(null, !0)) }, clone: function(a) {
+ null == a && (a = new OpenLayers.Layer.Grid(this.name, this.url, this.params, this.getOptions())); a = OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this,
+ [a]); null != this.tileSize && (a.tileSize = this.tileSize.clone()); a.grid = []; a.gridResolution = null; a.backBuffer = null; a.backBufferTimerId = null; a.loading = !1; a.numLoadingTiles = 0; return a
+ }, moveTo: function(a, b, c) {
+ OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this, arguments); a = a || this.map.getExtent(); if (null != a) {
+ var d = !this.grid.length || b, e = this.getTilesBounds(), f = this.map.getResolution(); this.getServerResolution(f); if (this.singleTile) {
+ if (d || !c && !e.containsBounds(a)) b && "resize" !== this.transitionEffect &&
+ this.removeBackBuffer(), b && "resize" !== this.transitionEffect || this.applyBackBuffer(f), this.initSingleTile(a)
+ } else d || !e.intersectsBounds(a, { worldBounds: this.map.baseLayer.wrapDateLine && this.map.getMaxExtent() }) ? (!b || "resize" !== this.transitionEffect && this.gridResolution !== f || this.applyBackBuffer(f), this.initGriddedTiles(a)) : this.moveGriddedTiles()
+ }
+ }, getTileData: function(a) {
+ var b = null, c = a.lon, d = a.lat, e = this.grid.length; if (this.map && e) {
+ var f = this.map.getResolution(); a = this.tileSize.w; var g = this.tileSize.h,
+ h = this.grid[0][0].bounds, k = h.left, h = h.top; if (c < k && this.map.baseLayer.wrapDateLine) var l = this.map.getMaxExtent().getWidth(), m = Math.ceil((k - c) / l), c = c + l * m; c = (c - k) / (f * a); d = (h - d) / (f * g); f = Math.floor(c); k = Math.floor(d); 0 <= k && k < e && (e = this.grid[k][f]) && (b = { tile: e, i: Math.floor((c - f) * a), j: Math.floor((d - k) * g) })
+ } return b
+ }, destroyTile: function(a) { this.removeTileMonitoringHooks(a); a.destroy() }, getServerResolution: function(a) {
+ var b = Number.POSITIVE_INFINITY; a = a || this.map.getResolution(); if (this.serverResolutions &&
+ -1 === OpenLayers.Util.indexOf(this.serverResolutions, a)) { var c, d, e, f; for (c = this.serverResolutions.length - 1; 0 <= c; c--) { e = this.serverResolutions[c]; d = Math.abs(e - a); if (d > b) break; b = d; f = e } a = f } return a
+ }, getServerZoom: function() { var a = this.getServerResolution(); return this.serverResolutions ? OpenLayers.Util.indexOf(this.serverResolutions, a) : this.map.getZoomForResolution(a) + (this.zoomOffset || 0) }, applyBackBuffer: function(a) {
+ null !== this.backBufferTimerId && this.removeBackBuffer(); var b = this.backBuffer; if (!b) {
+ b =
+ this.createBackBuffer(); if (!b) return; a === this.gridResolution ? this.div.insertBefore(b, this.div.firstChild) : this.map.baseLayer.div.parentNode.insertBefore(b, this.map.baseLayer.div); this.backBuffer = b; var c = this.grid[0][0].bounds; this.backBufferLonLat = { lon: c.left, lat: c.top }; this.backBufferResolution = this.gridResolution
+ } for (var c = this.backBufferResolution / a, d = b.childNodes, e, f = d.length - 1; 0 <= f; --f)e = d[f], e.style.top = (c * e._i * e._h | 0) + "px", e.style.left = (c * e._j * e._w | 0) + "px", e.style.width = Math.round(c * e._w) +
+ "px", e.style.height = Math.round(c * e._h) + "px"; a = this.getViewPortPxFromLonLat(this.backBufferLonLat, a); c = this.map.layerContainerOriginPx.y; b.style.left = Math.round(a.x - this.map.layerContainerOriginPx.x) + "px"; b.style.top = Math.round(a.y - c) + "px"
+ }, createBackBuffer: function() {
+ var a; if (0 < this.grid.length) {
+ a = document.createElement("div"); a.id = this.div.id + "_bb"; a.className = "olBackBuffer"; a.style.position = "absolute"; var b = this.map; a.style.zIndex = "resize" === this.transitionEffect ? this.getZIndex() - 1 : b.Z_INDEX_BASE.BaseLayer -
+ (b.getNumLayers() - b.getLayerIndex(this)); for (var b = 0, c = this.grid.length; b < c; b++)for (var d = 0, e = this.grid[b].length; d < e; d++) { var f = this.grid[b][d], g = this.grid[b][d].createBackBuffer(); g && (g._i = b, g._j = d, g._w = f.size.w, g._h = f.size.h, g.id = f.id + "_bb", a.appendChild(g)) }
+ } return a
+ }, removeBackBuffer: function() {
+ if (this._transitionElement) { for (var a = this.transitionendEvents.length - 1; 0 <= a; --a)OpenLayers.Event.stopObserving(this._transitionElement, this.transitionendEvents[a], this._removeBackBuffer); delete this._transitionElement } this.backBuffer &&
+ (this.backBuffer.parentNode && this.backBuffer.parentNode.removeChild(this.backBuffer), this.backBufferResolution = this.backBuffer = null, null !== this.backBufferTimerId && (window.clearTimeout(this.backBufferTimerId), this.backBufferTimerId = null))
+ }, moveByPx: function(a, b) { this.singleTile || this.moveGriddedTiles() }, setTileSize: function(a) { this.singleTile && (a = this.map.getSize(), a.h = parseInt(a.h * this.ratio, 10), a.w = parseInt(a.w * this.ratio, 10)); OpenLayers.Layer.HTTPRequest.prototype.setTileSize.apply(this, [a]) }, getTilesBounds: function() {
+ var a =
+ null, b = this.grid.length; if (b) var a = this.grid[b - 1][0].bounds, b = this.grid[0].length * a.getWidth(), c = this.grid.length * a.getHeight(), a = new OpenLayers.Bounds(a.left, a.bottom, a.left + b, a.bottom + c); return a
+ }, initSingleTile: function(a) {
+ this.events.triggerEvent("retile"); var b = a.getCenterLonLat(), c = a.getWidth() * this.ratio; a = a.getHeight() * this.ratio; b = new OpenLayers.Bounds(b.lon - c / 2, b.lat - a / 2, b.lon + c / 2, b.lat + a / 2); c = this.map.getLayerPxFromLonLat({ lon: b.left, lat: b.top }); this.grid.length || (this.grid[0] = []); (a = this.grid[0][0]) ?
+ a.moveTo(b, c) : (a = this.addTile(b, c), this.addTileMonitoringHooks(a), a.draw(), this.grid[0][0] = a); this.removeExcessTiles(1, 1); this.gridResolution = this.getServerResolution()
+ }, calculateGridLayout: function(a, b, c) { var d = c * this.tileSize.w; c *= this.tileSize.h; var e = Math.floor((a.left - b.lon) / d) - this.buffer, f = this.rowSign; a = Math[~f ? "floor" : "ceil"](f * (b.lat - a.top + c) / c) - this.buffer * f; return { tilelon: d, tilelat: c, startcol: e, startrow: a } }, getTileOrigin: function() {
+ var a = this.tileOrigin; if (!a) var a = this.getMaxExtent(),
+ b = { tl: ["left", "top"], tr: ["right", "top"], bl: ["left", "bottom"], br: ["right", "bottom"] }[this.tileOriginCorner], a = new OpenLayers.LonLat(a[b[0]], a[b[1]]); return a
+ }, getTileBoundsForGridIndex: function(a, b) { var c = this.getTileOrigin(), d = this.gridLayout, e = d.tilelon, f = d.tilelat, g = d.startcol, d = d.startrow, h = this.rowSign; return new OpenLayers.Bounds(c.lon + (g + b) * e, c.lat - (d + a * h) * f * h, c.lon + (g + b + 1) * e, c.lat - (d + (a - 1) * h) * f * h) }, initGriddedTiles: function(a) {
+ this.events.triggerEvent("retile"); var b = this.map.getSize(), c = this.getTileOrigin(),
+ d = this.map.getResolution(), e = this.getServerResolution(), f = d / e, d = this.tileSize.w / f, f = this.tileSize.h / f, g = Math.ceil(b.h / f) + 2 * this.buffer + 1, b = Math.ceil(b.w / d) + 2 * this.buffer + 1; this.gridLayout = e = this.calculateGridLayout(a, c, e); var c = e.tilelon, h = e.tilelat, e = this.map.layerContainerOriginPx.x, k = this.map.layerContainerOriginPx.y, l = this.getTileBoundsForGridIndex(0, 0), m = this.map.getViewPortPxFromLonLat(new OpenLayers.LonLat(l.left, l.top)); m.x = Math.round(m.x) - e; m.y = Math.round(m.y) - k; var e = [], k = this.map.getCenter(),
+ n = 0; do { var p = this.grid[n]; p || (p = [], this.grid.push(p)); var q = 0; do { var l = this.getTileBoundsForGridIndex(n, q), r = m.clone(); r.x += q * Math.round(d); r.y += n * Math.round(f); var t = p[q]; t ? t.moveTo(l, r, !1) : (t = this.addTile(l, r), this.addTileMonitoringHooks(t), p.push(t)); r = l.getCenterLonLat(); e.push({ tile: t, distance: Math.pow(r.lon - k.lon, 2) + Math.pow(r.lat - k.lat, 2) }); q += 1 } while (l.right <= a.right + c * this.buffer || q < b); n += 1 } while (l.bottom >= a.bottom - h * this.buffer || n < g); this.removeExcessTiles(n, q); this.gridResolution = d = this.getServerResolution();
+ e.sort(function(a, b) { return a.distance - b.distance }); a = 0; for (d = e.length; a < d; ++a)e[a].tile.draw()
+ }, getMaxExtent: function() { return this.maxExtent }, addTile: function(a, b) { var c = new this.tileClass(this, b, a, null, this.tileSize, this.tileOptions); this.events.triggerEvent("addtile", { tile: c }); return c }, addTileMonitoringHooks: function(a) {
+ a.onLoadStart = function() {
+ !1 === this.loading && (this.loading = !0, this.events.triggerEvent("loadstart")); this.events.triggerEvent("tileloadstart", { tile: a }); this.numLoadingTiles++;
+ !this.singleTile && this.backBuffer && this.gridResolution === this.backBufferResolution && OpenLayers.Element.addClass(a.getTile(), "olTileReplacing")
+ }; a.onLoadEnd = function(b) {
+ this.numLoadingTiles--; b = "unload" === b.type; this.events.triggerEvent("tileloaded", { tile: a, aborted: b }); if (!this.singleTile && !b && this.backBuffer && this.gridResolution === this.backBufferResolution) {
+ var c = a.getTile(); if ("none" === OpenLayers.Element.getStyle(c, "display")) { var d = document.getElementById(a.id + "_bb"); d && d.parentNode.removeChild(d) } OpenLayers.Element.removeClass(c,
+ "olTileReplacing")
+ } if (0 === this.numLoadingTiles) { if (this.backBuffer) if (0 === this.backBuffer.childNodes.length) this.removeBackBuffer(); else { this._transitionElement = b ? this.div.lastChild : a.imgDiv; b = this.transitionendEvents; for (c = b.length - 1; 0 <= c; --c)OpenLayers.Event.observe(this._transitionElement, b[c], this._removeBackBuffer); this.backBufferTimerId = window.setTimeout(this._removeBackBuffer, this.removeBackBufferDelay) } this.loading = !1; this.events.triggerEvent("loadend") }
+ }; a.onLoadError = function() {
+ this.events.triggerEvent("tileerror",
+ { tile: a })
+ }; a.events.on({ loadstart: a.onLoadStart, loadend: a.onLoadEnd, unload: a.onLoadEnd, loaderror: a.onLoadError, scope: this })
+ }, removeTileMonitoringHooks: function(a) { a.unload(); a.events.un({ loadstart: a.onLoadStart, loadend: a.onLoadEnd, unload: a.onLoadEnd, loaderror: a.onLoadError, scope: this }) }, moveGriddedTiles: function() {
+ for (var a = this.buffer + 1; ;) {
+ var b = this.grid[0][0], c = b.position.x + this.map.layerContainerOriginPx.x, b = b.position.y + this.map.layerContainerOriginPx.y, d = this.getServerResolution() / this.map.getResolution(),
+ d = { w: Math.round(this.tileSize.w * d), h: Math.round(this.tileSize.h * d) }; if (c > -d.w * (a - 1)) this.shiftColumn(!0, d); else if (c < -d.w * a) this.shiftColumn(!1, d); else if (b > -d.h * (a - 1)) this.shiftRow(!0, d); else if (b < -d.h * a) this.shiftRow(!1, d); else break
+ }
+ }, shiftRow: function(a, b) {
+ var c = this.grid, d = a ? 0 : c.length - 1, e = a ? -1 : 1; this.gridLayout.startrow += e * this.rowSign; for (var f = c[d], g = c[a ? "pop" : "shift"](), h = 0, k = g.length; h < k; h++) { var l = g[h], m = f[h].position.clone(); m.y += b.h * e; l.moveTo(this.getTileBoundsForGridIndex(d, h), m) } c[a ?
+ "unshift" : "push"](g)
+ }, shiftColumn: function(a, b) { var c = this.grid, d = a ? 0 : c[0].length - 1, e = a ? -1 : 1; this.gridLayout.startcol += e; for (var f = 0, g = c.length; f < g; f++) { var h = c[f], k = h[d].position.clone(), l = h[a ? "pop" : "shift"](); k.x += b.w * e; l.moveTo(this.getTileBoundsForGridIndex(f, d), k); h[a ? "unshift" : "push"](l) } }, removeExcessTiles: function(a, b) {
+ for (var c, d; this.grid.length > a;) { var e = this.grid.pop(); c = 0; for (d = e.length; c < d; c++) { var f = e[c]; this.destroyTile(f) } } c = 0; for (d = this.grid.length; c < d; c++)for (; this.grid[c].length >
+ b;)e = this.grid[c], f = e.pop(), this.destroyTile(f)
+ }, onMapResize: function() { this.singleTile && (this.clearGrid(), this.setTileSize()) }, getTileBounds: function(a) { var b = this.maxExtent, c = this.getResolution(), d = c * this.tileSize.w, c = c * this.tileSize.h, e = this.getLonLatFromViewPortPx(a); a = b.left + d * Math.floor((e.lon - b.left) / d); b = b.bottom + c * Math.floor((e.lat - b.bottom) / c); return new OpenLayers.Bounds(a, b, a + d, b + c) }, CLASS_NAME: "OpenLayers.Layer.Grid"
+});
+OpenLayers.Format.ArcXML = OpenLayers.Class(OpenLayers.Format.XML, {
+ fontStyleKeys: "antialiasing blockout font fontcolor fontsize fontstyle glowing interval outline printmode shadow transparency".split(" "), request: null, response: null, initialize: function(a) {
+ this.request = new OpenLayers.Format.ArcXML.Request; this.response = new OpenLayers.Format.ArcXML.Response; if (a) if ("feature" == a.requesttype) {
+ this.request.get_image = null; var b = this.request.get_feature.query; this.addCoordSys(b.featurecoordsys, a.featureCoordSys);
+ this.addCoordSys(b.filtercoordsys, a.filterCoordSys); a.polygon ? (b.isspatial = !0, b.spatialfilter.polygon = a.polygon) : a.envelope && (b.isspatial = !0, b.spatialfilter.envelope = { minx: 0, miny: 0, maxx: 0, maxy: 0 }, this.parseEnvelope(b.spatialfilter.envelope, a.envelope))
+ } else "image" == a.requesttype ? (this.request.get_feature = null, b = this.request.get_image.properties, this.parseEnvelope(b.envelope, a.envelope), this.addLayers(b.layerlist, a.layers), this.addImageSize(b.imagesize, a.tileSize), this.addCoordSys(b.featurecoordsys,
+ a.featureCoordSys), this.addCoordSys(b.filtercoordsys, a.filterCoordSys)) : this.request = null; OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+ }, parseEnvelope: function(a, b) { b && 4 == b.length && (a.minx = b[0], a.miny = b[1], a.maxx = b[2], a.maxy = b[3]) }, addLayers: function(a, b) { for (var c = 0, d = b.length; c < d; c++)a.push(b[c]) }, addImageSize: function(a, b) { null !== b && (a.width = b.w, a.height = b.h, a.printwidth = b.w, a.printheight = b.h) }, addCoordSys: function(a, b) {
+ "string" == typeof b ? (a.id = parseInt(b), a.string = b) : "object" == typeof b &&
+ null !== b.proj && (a.id = b.proj.srsProjNumber, a.string = b.proj.srsCode)
+ }, iserror: function(a) { var b = null; a ? (a = OpenLayers.Format.XML.prototype.read.apply(this, [a]), a = a.documentElement.getElementsByTagName("ERROR"), b = null !== a && 0 < a.length) : b = "" !== this.response.error; return b }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); var b = null; a && a.documentElement && (b = "ARCXML" == a.documentElement.nodeName ? a.documentElement : a.documentElement.getElementsByTagName("ARCXML")[0]);
+ if (!b || "parsererror" === b.firstChild.nodeName) { var c, d; try { c = a.firstChild.nodeValue, d = a.firstChild.childNodes[1].firstChild.nodeValue } catch (e) { } throw { message: "Error parsing the ArcXML request", error: c, source: d }; } return this.parseResponse(b)
+ }, write: function(a) {
+ a || (a = this.request); var b = this.createElementNS("", "ARCXML"); b.setAttribute("version", "1.1"); var c = this.createElementNS("", "REQUEST"); if (null != a.get_image) {
+ var d = this.createElementNS("", "GET_IMAGE"); c.appendChild(d); var e = this.createElementNS("",
+ "PROPERTIES"); d.appendChild(e); a = a.get_image.properties; null != a.featurecoordsys && (d = this.createElementNS("", "FEATURECOORDSYS"), e.appendChild(d), 0 === a.featurecoordsys.id ? d.setAttribute("string", a.featurecoordsys.string) : d.setAttribute("id", a.featurecoordsys.id)); null != a.filtercoordsys && (d = this.createElementNS("", "FILTERCOORDSYS"), e.appendChild(d), 0 === a.filtercoordsys.id ? d.setAttribute("string", a.filtercoordsys.string) : d.setAttribute("id", a.filtercoordsys.id)); null != a.envelope && (d = this.createElementNS("",
+ "ENVELOPE"), e.appendChild(d), d.setAttribute("minx", a.envelope.minx), d.setAttribute("miny", a.envelope.miny), d.setAttribute("maxx", a.envelope.maxx), d.setAttribute("maxy", a.envelope.maxy)); d = this.createElementNS("", "IMAGESIZE"); e.appendChild(d); d.setAttribute("height", a.imagesize.height); d.setAttribute("width", a.imagesize.width); if (a.imagesize.height != a.imagesize.printheight || a.imagesize.width != a.imagesize.printwidth) d.setAttribute("printheight", a.imagesize.printheight), d.setArrtibute("printwidth", a.imagesize.printwidth);
+ null != a.background && (d = this.createElementNS("", "BACKGROUND"), e.appendChild(d), d.setAttribute("color", a.background.color.r + "," + a.background.color.g + "," + a.background.color.b), null !== a.background.transcolor && d.setAttribute("transcolor", a.background.transcolor.r + "," + a.background.transcolor.g + "," + a.background.transcolor.b)); if (null != a.layerlist && 0 < a.layerlist.length) for (d = this.createElementNS("", "LAYERLIST"), e.appendChild(d), e = 0; e < a.layerlist.length; e++) {
+ var f = this.createElementNS("", "LAYERDEF"); d.appendChild(f);
+ f.setAttribute("id", a.layerlist[e].id); f.setAttribute("visible", a.layerlist[e].visible); if ("object" == typeof a.layerlist[e].query) {
+ var g = a.layerlist[e].query; if (0 > g.where.length) continue; var h = null, h = "boolean" == typeof g.spatialfilter && g.spatialfilter ? this.createElementNS("", "SPATIALQUERY") : this.createElementNS("", "QUERY"); h.setAttribute("where", g.where); "number" == typeof g.accuracy && 0 < g.accuracy && h.setAttribute("accuracy", g.accuracy); "number" == typeof g.featurelimit && 2E3 > g.featurelimit && h.setAttribute("featurelimit",
+ g.featurelimit); "string" == typeof g.subfields && "#ALL#" != g.subfields && h.setAttribute("subfields", g.subfields); "string" == typeof g.joinexpression && 0 < g.joinexpression.length && h.setAttribute("joinexpression", g.joinexpression); "string" == typeof g.jointables && 0 < g.jointables.length && h.setAttribute("jointables", g.jointables); f.appendChild(h)
+ } "object" == typeof a.layerlist[e].renderer && this.addRenderer(f, a.layerlist[e].renderer)
+ }
+ } else null != a.get_feature && (d = this.createElementNS("", "GET_FEATURES"), d.setAttribute("outputmode",
+ "newxml"), d.setAttribute("checkesc", "true"), a.get_feature.geometry ? d.setAttribute("geometry", a.get_feature.geometry) : d.setAttribute("geometry", "false"), a.get_feature.compact && d.setAttribute("compact", a.get_feature.compact), "number" == a.get_feature.featurelimit && d.setAttribute("featurelimit", a.get_feature.featurelimit), d.setAttribute("globalenvelope", "true"), c.appendChild(d), null != a.get_feature.layer && 0 < a.get_feature.layer.length && (e = this.createElementNS("", "LAYER"), e.setAttribute("id", a.get_feature.layer),
+ d.appendChild(e)), a = a.get_feature.query, null != a && (e = a.isspatial ? this.createElementNS("", "SPATIALQUERY") : this.createElementNS("", "QUERY"), d.appendChild(e), "number" == typeof a.accuracy && e.setAttribute("accuracy", a.accuracy), null != a.featurecoordsys && (d = this.createElementNS("", "FEATURECOORDSYS"), 0 == a.featurecoordsys.id ? d.setAttribute("string", a.featurecoordsys.string) : d.setAttribute("id", a.featurecoordsys.id), e.appendChild(d)), null != a.filtercoordsys && (d = this.createElementNS("", "FILTERCOORDSYS"), 0 === a.filtercoordsys.id ?
+ d.setAttribute("string", a.filtercoordsys.string) : d.setAttribute("id", a.filtercoordsys.id), e.appendChild(d)), 0 < a.buffer && (d = this.createElementNS("", "BUFFER"), d.setAttribute("distance", a.buffer), e.appendChild(d)), a.isspatial && (d = this.createElementNS("", "SPATIALFILTER"), d.setAttribute("relation", a.spatialfilter.relation), e.appendChild(d), a.spatialfilter.envelope ? (f = this.createElementNS("", "ENVELOPE"), f.setAttribute("minx", a.spatialfilter.envelope.minx), f.setAttribute("miny", a.spatialfilter.envelope.miny),
+ f.setAttribute("maxx", a.spatialfilter.envelope.maxx), f.setAttribute("maxy", a.spatialfilter.envelope.maxy), d.appendChild(f)) : "object" == typeof a.spatialfilter.polygon && d.appendChild(this.writePolygonGeometry(a.spatialfilter.polygon))), null != a.where && 0 < a.where.length && e.setAttribute("where", a.where))); b.appendChild(c); return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+ }, addGroupRenderer: function(a, b) {
+ var c = this.createElementNS("", "GROUPRENDERER"); a.appendChild(c); for (var d = 0; d < b.length; d++)this.addRenderer(c,
+ b[d])
+ }, addRenderer: function(a, b) { if (OpenLayers.Util.isArray(b)) this.addGroupRenderer(a, b); else { var c = this.createElementNS("", b.type.toUpperCase() + "RENDERER"); a.appendChild(c); "VALUEMAPRENDERER" == c.tagName ? this.addValueMapRenderer(c, b) : "VALUEMAPLABELRENDERER" == c.tagName ? this.addValueMapLabelRenderer(c, b) : "SIMPLELABELRENDERER" == c.tagName ? this.addSimpleLabelRenderer(c, b) : "SCALEDEPENDENTRENDERER" == c.tagName && this.addScaleDependentRenderer(c, b) } }, addScaleDependentRenderer: function(a, b) {
+ "string" != typeof b.lower &&
+ "number" != typeof b.lower || a.setAttribute("lower", b.lower); "string" != typeof b.upper && "number" != typeof b.upper || a.setAttribute("upper", b.upper); this.addRenderer(a, b.renderer)
+ }, addValueMapLabelRenderer: function(a, b) {
+ a.setAttribute("lookupfield", b.lookupfield); a.setAttribute("labelfield", b.labelfield); if ("object" == typeof b.exacts) for (var c = 0, d = b.exacts.length; c < d; c++) {
+ var e = b.exacts[c], f = this.createElementNS("", "EXACT"); "string" == typeof e.value && f.setAttribute("value", e.value); "string" == typeof e.label &&
+ f.setAttribute("label", e.label); "string" == typeof e.method && f.setAttribute("method", e.method); a.appendChild(f); if ("object" == typeof e.symbol) { var g = null; "text" == e.symbol.type && (g = this.createElementNS("", "TEXTSYMBOL")); if (null != g) { for (var h = this.fontStyleKeys, k = 0, l = h.length; k < l; k++) { var m = h[k]; e.symbol[m] && g.setAttribute(m, e.symbol[m]) } f.appendChild(g) } }
+ }
+ }, addValueMapRenderer: function(a, b) {
+ a.setAttribute("lookupfield", b.lookupfield); if ("object" == typeof b.ranges) for (var c = 0, d = b.ranges.length; c < d; c++) {
+ var e =
+ b.ranges[c], f = this.createElementNS("", "RANGE"); f.setAttribute("lower", e.lower); f.setAttribute("upper", e.upper); a.appendChild(f); if ("object" == typeof e.symbol) {
+ var g = null; "simplepolygon" == e.symbol.type && (g = this.createElementNS("", "SIMPLEPOLYGONSYMBOL")); null != g && ("string" == typeof e.symbol.boundarycolor && g.setAttribute("boundarycolor", e.symbol.boundarycolor), "string" == typeof e.symbol.fillcolor && g.setAttribute("fillcolor", e.symbol.fillcolor), "number" == typeof e.symbol.filltransparency && g.setAttribute("filltransparency",
+ e.symbol.filltransparency), f.appendChild(g))
+ }
+ } else if ("object" == typeof b.exacts) for (c = 0, d = b.exacts.length; c < d; c++)e = b.exacts[c], f = this.createElementNS("", "EXACT"), "string" == typeof e.value && f.setAttribute("value", e.value), "string" == typeof e.label && f.setAttribute("label", e.label), "string" == typeof e.method && f.setAttribute("method", e.method), a.appendChild(f), "object" == typeof e.symbol && (g = null, "simplemarker" == e.symbol.type && (g = this.createElementNS("", "SIMPLEMARKERSYMBOL")), null != g && ("string" == typeof e.symbol.antialiasing &&
+ g.setAttribute("antialiasing", e.symbol.antialiasing), "string" == typeof e.symbol.color && g.setAttribute("color", e.symbol.color), "string" == typeof e.symbol.outline && g.setAttribute("outline", e.symbol.outline), "string" == typeof e.symbol.overlap && g.setAttribute("overlap", e.symbol.overlap), "string" == typeof e.symbol.shadow && g.setAttribute("shadow", e.symbol.shadow), "number" == typeof e.symbol.transparency && g.setAttribute("transparency", e.symbol.transparency), "string" == typeof e.symbol.usecentroid && g.setAttribute("usecentroid",
+ e.symbol.usecentroid), "number" == typeof e.symbol.width && g.setAttribute("width", e.symbol.width), f.appendChild(g)))
+ }, addSimpleLabelRenderer: function(a, b) {
+ a.setAttribute("field", b.field); for (var c = "featureweight howmanylabels labelbufferratio labelpriorities labelweight linelabelposition rotationalangles".split(" "), d = 0, e = c.length; d < e; d++) { var f = c[d]; b[f] && a.setAttribute(f, b[f]) } if ("text" == b.symbol.type) {
+ var g = b.symbol, h = this.createElementNS("", "TEXTSYMBOL"); a.appendChild(h); c = this.fontStyleKeys; d = 0;
+ for (e = c.length; d < e; d++)f = c[d], g[f] && h.setAttribute(f, b[f])
+ }
+ }, writePolygonGeometry: function(a) {
+ if (!(a instanceof OpenLayers.Geometry.Polygon)) throw { message: "Cannot write polygon geometry to ArcXML with an " + a.CLASS_NAME + " object.", geometry: a }; for (var b = this.createElementNS("", "POLYGON"), c = 0, d = a.components.length; c < d; c++) {
+ for (var e = a.components[c], f = this.createElementNS("", "RING"), g = 0, h = e.components.length; g < h; g++) {
+ var k = e.components[g], l = this.createElementNS("", "POINT"); l.setAttribute("x", k.x); l.setAttribute("y",
+ k.y); f.appendChild(l)
+ } b.appendChild(f)
+ } return b
+ }, parseResponse: function(a) {
+ "string" == typeof a && (a = (new OpenLayers.Format.XML).read(a)); var b = new OpenLayers.Format.ArcXML.Response, c = a.getElementsByTagName("ERROR"); if (null != c && 0 < c.length) b.error = this.getChildValue(c, "Unknown error."); else {
+ c = a.getElementsByTagName("RESPONSE"); if (null == c || 0 == c.length) return b.error = "No RESPONSE tag found in ArcXML response.", b; var d = c[0].firstChild.nodeName; "#text" == d && (d = c[0].firstChild.nextSibling.nodeName); if ("IMAGE" ==
+ d) c = a.getElementsByTagName("ENVELOPE"), a = a.getElementsByTagName("OUTPUT"), null == c || 0 == c.length ? b.error = "No ENVELOPE tag found in ArcXML response." : null == a || 0 == a.length ? b.error = "No OUTPUT tag found in ArcXML response." : (c = this.parseAttributes(c[0]), d = this.parseAttributes(a[0]), b.image = "string" == typeof d.type ? { envelope: c, output: { type: d.type, data: this.getChildValue(a[0]) } } : { envelope: c, output: d }); else if ("FEATURES" == d) {
+ if (a = c[0].getElementsByTagName("FEATURES"), c = a[0].getElementsByTagName("FEATURECOUNT"),
+ b.features.featurecount = c[0].getAttribute("count"), 0 < b.features.featurecount) for (c = a[0].getElementsByTagName("ENVELOPE"), b.features.envelope = this.parseAttributes(c[0], "number"), a = a[0].getElementsByTagName("FEATURE"), c = 0; c < a.length; c++) {
+ for (var d = new OpenLayers.Feature.Vector, e = a[c].getElementsByTagName("FIELD"), f = 0; f < e.length; f++) { var g = e[f].getAttribute("name"), h = e[f].getAttribute("value"); d.attributes[g] = h } e = a[c].getElementsByTagName("POLYGON"); if (0 < e.length) {
+ e = e[0].getElementsByTagName("RING");
+ f = []; for (g = 0; g < e.length; g++) { h = []; h.push(this.parsePointGeometry(e[g])); for (var k = e[g].getElementsByTagName("HOLE"), l = 0; l < k.length; l++)h.push(this.parsePointGeometry(k[l])); f.push(new OpenLayers.Geometry.Polygon(h)) } d.geometry = 1 == f.length ? f[0] : new OpenLayers.Geometry.MultiPolygon(f)
+ } b.features.feature.push(d)
+ }
+ } else b.error = "Unidentified response type."
+ } return b
+ }, parseAttributes: function(a, b) {
+ for (var c = {}, d = 0; d < a.attributes.length; d++)c[a.attributes[d].nodeName] = "number" == b ? parseFloat(a.attributes[d].nodeValue) :
+ a.attributes[d].nodeValue; return c
+ }, parsePointGeometry: function(a) { var b = [], c = a.getElementsByTagName("COORDS"); if (0 < c.length) for (a = this.getChildValue(c[0]), a = a.split(/;/), c = 0; c < a.length; c++) { var d = a[c].split(/ /); b.push(new OpenLayers.Geometry.Point(d[0], d[1])) } else if (a = a.getElementsByTagName("POINT"), 0 < a.length) for (c = 0; c < a.length; c++)b.push(new OpenLayers.Geometry.Point(parseFloat(a[c].getAttribute("x")), parseFloat(a[c].getAttribute("y")))); return new OpenLayers.Geometry.LinearRing(b) }, CLASS_NAME: "OpenLayers.Format.ArcXML"
+});
+OpenLayers.Format.ArcXML.Request = OpenLayers.Class({
+ initialize: function(a) {
+ return OpenLayers.Util.extend(this, {
+ get_image: {
+ properties: {
+ background: null, draw: !0, envelope: { minx: 0, miny: 0, maxx: 0, maxy: 0 }, featurecoordsys: { id: 0, string: "", datumtransformid: 0, datumtransformstring: "" }, filtercoordsys: { id: 0, string: "", datumtransformid: 0, datumtransformstring: "" }, imagesize: { height: 0, width: 0, dpi: 96, printheight: 0, printwidth: 0, scalesymbols: !1 }, layerlist: [], output: {
+ baseurl: "", legendbaseurl: "", legendname: "", legendpath: "",
+ legendurl: "", name: "", path: "", type: "jpg", url: ""
+ }
+ }
+ }, get_feature: { layer: "", query: { isspatial: !1, featurecoordsys: { id: 0, string: "", datumtransformid: 0, datumtransformstring: "" }, filtercoordsys: { id: 0, string: "", datumtransformid: 0, datumtransformstring: "" }, buffer: 0, where: "", spatialfilter: { relation: "envelope_intersection", envelope: null } } }, environment: { separators: { cs: " ", ts: ";" } }, layer: [], workspaces: []
+ })
+ }, CLASS_NAME: "OpenLayers.Format.ArcXML.Request"
+});
+OpenLayers.Format.ArcXML.Response = OpenLayers.Class({ initialize: function(a) { return OpenLayers.Util.extend(this, { image: { envelope: null, output: "" }, features: { featurecount: 0, envelope: null, feature: [] }, error: "" }) }, CLASS_NAME: "OpenLayers.Format.ArcXML.Response" });
+(function() {
+ function a() { this._object = f && !k ? new f : new window.ActiveXObject("Microsoft.XMLHTTP"); this._listeners = [] } function b() { return new a } function c(a) { b.onreadystatechange && b.onreadystatechange.apply(a); a.dispatchEvent({ type: "readystatechange", bubbles: !1, cancelable: !1, timeStamp: new Date + 0 }) } function d(a) {
+ try { a.responseText = a._object.responseText } catch (b) { } try {
+ var c = a._object, d = c.responseXML, e = c.responseText; h && e && d && !d.documentElement && c.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/) &&
+ (d = new window.ActiveXObject("Microsoft.XMLDOM"), d.async = !1, d.validateOnParse = !1, d.loadXML(e)); a.responseXML = d && (h && 0 != d.parseError || !d.documentElement || d.documentElement && "parsererror" == d.documentElement.tagName) ? null : d
+ } catch (f) { } try { a.status = a._object.status } catch (g) { } try { a.statusText = a._object.statusText } catch (k) { }
+ } function e(a) { a._object.onreadystatechange = new window.Function } var f = window.XMLHttpRequest, g = !!window.controllers, h = window.document.all && !window.opera, k = h && window.navigator.userAgent.match(/MSIE 7.0/);
+ b.prototype = a.prototype; g && f.wrapped && (b.wrapped = f.wrapped); b.UNSENT = 0; b.OPENED = 1; b.HEADERS_RECEIVED = 2; b.LOADING = 3; b.DONE = 4; b.prototype.readyState = b.UNSENT; b.prototype.responseText = ""; b.prototype.responseXML = null; b.prototype.status = 0; b.prototype.statusText = ""; b.prototype.priority = "NORMAL"; b.prototype.onreadystatechange = null; b.onreadystatechange = null; b.onopen = null; b.onsend = null; b.onabort = null; b.prototype.open = function(a, f, k, p, q) {
+ delete this._headers; 3 > arguments.length && (k = !0); this._async = k; var r = this,
+ t = this.readyState, u; h && k && (u = function() { t != b.DONE && (e(r), r.abort()) }, window.attachEvent("onunload", u)); b.onopen && b.onopen.apply(this, arguments); 4 < arguments.length ? this._object.open(a, f, k, p, q) : 3 < arguments.length ? this._object.open(a, f, k, p) : this._object.open(a, f, k); this.readyState = b.OPENED; c(this); this._object.onreadystatechange = function() {
+ if (!g || k) r.readyState = r._object.readyState, d(r), r._aborted ? r.readyState = b.UNSENT : (r.readyState == b.DONE && (delete r._data, e(r), h && k && window.detachEvent("onunload", u)),
+ t != r.readyState && c(r), t = r.readyState)
+ }
+ }; b.prototype.send = function(a) { b.onsend && b.onsend.apply(this, arguments); arguments.length || (a = null); a && a.nodeType && (a = window.XMLSerializer ? (new window.XMLSerializer).serializeToString(a) : a.xml, this._headers["Content-Type"] || this._object.setRequestHeader("Content-Type", "application/xml")); this._data = a; a: if (this._object.send(this._data), g && !this._async) for (this.readyState = b.OPENED, d(this); this.readyState < b.DONE;)if (this.readyState++, c(this), this._aborted) break a };
+ b.prototype.abort = function() { b.onabort && b.onabort.apply(this, arguments); this.readyState > b.UNSENT && (this._aborted = !0); this._object.abort(); e(this); this.readyState = b.UNSENT; delete this._data }; b.prototype.getAllResponseHeaders = function() { return this._object.getAllResponseHeaders() }; b.prototype.getResponseHeader = function(a) { return this._object.getResponseHeader(a) }; b.prototype.setRequestHeader = function(a, b) { this._headers || (this._headers = {}); this._headers[a] = b; return this._object.setRequestHeader(a, b) };
+ b.prototype.addEventListener = function(a, b, c) { for (var d = 0, e; e = this._listeners[d]; d++)if (e[0] == a && e[1] == b && e[2] == c) return; this._listeners.push([a, b, c]) }; b.prototype.removeEventListener = function(a, b, c) { for (var d = 0, e; (e = this._listeners[d]) && (e[0] != a || e[1] != b || e[2] != c); d++); e && this._listeners.splice(d, 1) }; b.prototype.dispatchEvent = function(a) {
+ a = {
+ type: a.type, target: this, currentTarget: this, eventPhase: 2, bubbles: a.bubbles, cancelable: a.cancelable, timeStamp: a.timeStamp, stopPropagation: function() { }, preventDefault: function() { },
+ initEvent: function() { }
+ }; "readystatechange" == a.type && this.onreadystatechange && (this.onreadystatechange.handleEvent || this.onreadystatechange).apply(this, [a]); for (var b = 0, c; c = this._listeners[b]; b++)c[0] != a.type || c[2] || (c[1].handleEvent || c[1]).apply(this, [a])
+ }; b.prototype.toString = function() { return "[object XMLHttpRequest]" }; b.toString = function() { return "[XMLHttpRequest]" }; window.Function.prototype.apply || (window.Function.prototype.apply = function(a, b) {
+ b || (b = []); a.__func = this; a.__func(b[0], b[1], b[2], b[3],
+ b[4]); delete a.__func
+ }); OpenLayers.Request || (OpenLayers.Request = {}); OpenLayers.Request.XMLHttpRequest = b
+})(); OpenLayers.ProxyHost = ""; OpenLayers.Request || (OpenLayers.Request = {});
+OpenLayers.Util.extend(OpenLayers.Request, {
+ DEFAULT_CONFIG: { method: "GET", url: window.location.href, async: !0, user: void 0, password: void 0, params: null, proxy: OpenLayers.ProxyHost, headers: {}, data: null, callback: function() { }, success: null, failure: null, scope: null }, URL_SPLIT_REGEX: /([^:]*:)\/\/([^:]*:?[^@]*@)?([^:\/\?]*):?([^\/\?]*)/, events: new OpenLayers.Events(this), makeSameOrigin: function(a, b) {
+ var c = 0 !== a.indexOf("http"), d = !c && a.match(this.URL_SPLIT_REGEX); if (d) {
+ var e = window.location, c = d[1] == e.protocol && d[3] ==
+ e.hostname, d = d[4], e = e.port; if (80 != d && "" != d || "80" != e && "" != e) c = c && d == e
+ } c || b && (a = "function" == typeof b ? b(a) : b + encodeURIComponent(a)); return a
+ }, issue: function(a) {
+ var b = OpenLayers.Util.extend(this.DEFAULT_CONFIG, { proxy: OpenLayers.ProxyHost }); a = a || {}; a.headers = a.headers || {}; a = OpenLayers.Util.applyDefaults(a, b); a.headers = OpenLayers.Util.applyDefaults(a.headers, b.headers); var b = !1, c; for (c in a.headers) a.headers.hasOwnProperty(c) && "x-requested-with" === c.toLowerCase() && (b = !0); !1 === b && (a.headers["X-Requested-With"] =
+ "XMLHttpRequest"); var d = new OpenLayers.Request.XMLHttpRequest, e = OpenLayers.Util.urlAppend(a.url, OpenLayers.Util.getParameterString(a.params || {})), e = OpenLayers.Request.makeSameOrigin(e, a.proxy); d.open(a.method, e, a.async, a.user, a.password); for (var f in a.headers) d.setRequestHeader(f, a.headers[f]); var g = this.events, h = this; d.onreadystatechange = function() {
+ d.readyState == OpenLayers.Request.XMLHttpRequest.DONE && !1 !== g.triggerEvent("complete", { request: d, config: a, requestUrl: e }) && h.runCallbacks({
+ request: d, config: a,
+ requestUrl: e
+ })
+ }; !1 === a.async ? d.send(a.data) : window.setTimeout(function() { 0 !== d.readyState && d.send(a.data) }, 0); return d
+ }, runCallbacks: function(a) {
+ var b = a.request, c = a.config, d = c.scope ? OpenLayers.Function.bind(c.callback, c.scope) : c.callback, e; c.success && (e = c.scope ? OpenLayers.Function.bind(c.success, c.scope) : c.success); var f; c.failure && (f = c.scope ? OpenLayers.Function.bind(c.failure, c.scope) : c.failure); "file:" == OpenLayers.Util.createUrlObject(c.url).protocol && b.responseText && (b.status = 200); d(b); if (!b.status ||
+ 200 <= b.status && 300 > b.status) this.events.triggerEvent("success", a), e && e(b); b.status && (200 > b.status || 300 <= b.status) && (this.events.triggerEvent("failure", a), f && f(b))
+ }, GET: function(a) { a = OpenLayers.Util.extend(a, { method: "GET" }); return OpenLayers.Request.issue(a) }, POST: function(a) { a = OpenLayers.Util.extend(a, { method: "POST" }); a.headers = a.headers ? a.headers : {}; "CONTENT-TYPE" in OpenLayers.Util.upperCaseObject(a.headers) || (a.headers["Content-Type"] = "application/xml"); return OpenLayers.Request.issue(a) }, PUT: function(a) {
+ a =
+ OpenLayers.Util.extend(a, { method: "PUT" }); a.headers = a.headers ? a.headers : {}; "CONTENT-TYPE" in OpenLayers.Util.upperCaseObject(a.headers) || (a.headers["Content-Type"] = "application/xml"); return OpenLayers.Request.issue(a)
+ }, DELETE: function(a) { a = OpenLayers.Util.extend(a, { method: "DELETE" }); return OpenLayers.Request.issue(a) }, HEAD: function(a) { a = OpenLayers.Util.extend(a, { method: "HEAD" }); return OpenLayers.Request.issue(a) }, OPTIONS: function(a) { a = OpenLayers.Util.extend(a, { method: "OPTIONS" }); return OpenLayers.Request.issue(a) }
+});
+OpenLayers.Layer.ArcIMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ DEFAULT_PARAMS: { ClientVersion: "9.2", ServiceName: "" }, featureCoordSys: "4326", filterCoordSys: "4326", layers: null, async: !0, name: "ArcIMS", isBaseLayer: !0, DEFAULT_OPTIONS: { tileSize: new OpenLayers.Size(512, 512), featureCoordSys: "4326", filterCoordSys: "4326", layers: null, isBaseLayer: !0, async: !0, name: "ArcIMS" }, initialize: function(a, b, c) {
+ this.tileSize = new OpenLayers.Size(512, 512); this.params = OpenLayers.Util.applyDefaults({ ServiceName: c.serviceName },
+ this.DEFAULT_PARAMS); this.options = OpenLayers.Util.applyDefaults(c, this.DEFAULT_OPTIONS); OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a, b, this.params, c]); this.transparent && (this.isBaseLayer || (this.isBaseLayer = !1), "image/jpeg" == this.format && (this.format = OpenLayers.Util.alphaHack() ? "image/gif" : "image/png")); null === this.options.layers && (this.options.layers = [])
+ }, getURL: function(a) {
+ var b = ""; a = this.adjustBounds(a); a = new OpenLayers.Format.ArcXML(OpenLayers.Util.extend(this.options, {
+ requesttype: "image",
+ envelope: a.toArray(), tileSize: this.tileSize
+ })); a = new OpenLayers.Request.POST({ url: this.getFullRequestString(), data: a.write(), async: !1 }); null != a && (b = a.responseXML, b && b.documentElement || (b = a.responseText), b = (new OpenLayers.Format.ArcXML).read(b), b = this.getUrlOrImage(b.image.output)); return b
+ }, getURLasync: function(a, b, c) {
+ a = this.adjustBounds(a); a = new OpenLayers.Format.ArcXML(OpenLayers.Util.extend(this.options, { requesttype: "image", envelope: a.toArray(), tileSize: this.tileSize })); OpenLayers.Request.POST({
+ url: this.getFullRequestString(),
+ async: !0, data: a.write(), callback: function(a) { var e = a.responseXML; e && e.documentElement || (e = a.responseText); a = (new OpenLayers.Format.ArcXML).read(e); b.call(c, this.getUrlOrImage(a.image.output)) }, scope: this
+ })
+ }, getUrlOrImage: function(a) { var b = ""; a.url ? b = a.url : a.data && (b = "data:image/" + a.type + ";base64," + a.data); return b }, setLayerQuery: function(a, b) {
+ for (var c = 0; c < this.options.layers.length; c++)if (a == this.options.layers[c].id) { this.options.layers[c].query = b; return } this.options.layers.push({
+ id: a, visible: !0,
+ query: b
+ })
+ }, getFeatureInfo: function(a, b, c) {
+ var d = c.buffer || 1, e = c.callback || function() { }, f = c.scope || window, g = {}; OpenLayers.Util.extend(g, this.options); g.requesttype = "feature"; a instanceof OpenLayers.LonLat ? (g.polygon = null, g.envelope = [a.lon - d, a.lat - d, a.lon + d, a.lat + d]) : a instanceof OpenLayers.Geometry.Polygon && (g.envelope = null, g.polygon = a); var h = new OpenLayers.Format.ArcXML(g); OpenLayers.Util.extend(h.request.get_feature, c); h.request.get_feature.layer = b.id; "number" == typeof b.query.accuracy ? h.request.get_feature.query.accuracy =
+ b.query.accuracy : (a = this.map.getCenter(), c = this.map.getViewPortPxFromLonLat(a), c.x++, c = this.map.getLonLatFromPixel(c), h.request.get_feature.query.accuracy = c.lon - a.lon); h.request.get_feature.query.where = b.query.where; h.request.get_feature.query.spatialfilter.relation = "area_intersection"; OpenLayers.Request.POST({ url: this.getFullRequestString({ CustomService: "Query" }), data: h.write(), callback: function(a) { a = h.parseResponse(a.responseText); h.iserror() ? e.call(f, null) : e.call(f, a.features) } })
+ }, clone: function(a) {
+ null ==
+ a && (a = new OpenLayers.Layer.ArcIMS(this.name, this.url, this.getOptions())); return OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+ }, CLASS_NAME: "OpenLayers.Layer.ArcIMS"
+});
+OpenLayers.Control.PanZoom = OpenLayers.Class(OpenLayers.Control, {
+ slideFactor: 50, slideRatio: null, buttons: null, position: null, initialize: function(a) { this.position = new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X, OpenLayers.Control.PanZoom.Y); OpenLayers.Control.prototype.initialize.apply(this, arguments) }, destroy: function() { this.map && this.map.events.unregister("buttonclick", this, this.onButtonClick); this.removeButtons(); this.position = this.buttons = null; OpenLayers.Control.prototype.destroy.apply(this, arguments) },
+ setMap: function(a) { OpenLayers.Control.prototype.setMap.apply(this, arguments); this.map.events.register("buttonclick", this, this.onButtonClick) }, draw: function(a) {
+ OpenLayers.Control.prototype.draw.apply(this, arguments); a = this.position; this.buttons = []; var b = { w: 18, h: 18 }, c = new OpenLayers.Pixel(a.x + b.w / 2, a.y); this._addButton("panup", "north-mini.png", c, b); a.y = c.y + b.h; this._addButton("panleft", "west-mini.png", a, b); this._addButton("panright", "east-mini.png", a.add(b.w, 0), b); this._addButton("pandown", "south-mini.png",
+ c.add(0, 2 * b.h), b); this._addButton("zoomin", "zoom-plus-mini.png", c.add(0, 3 * b.h + 5), b); this._addButton("zoomworld", "zoom-world-mini.png", c.add(0, 4 * b.h + 5), b); this._addButton("zoomout", "zoom-minus-mini.png", c.add(0, 5 * b.h + 5), b); return this.div
+ }, _addButton: function(a, b, c, d) { b = OpenLayers.Util.getImageLocation(b); c = OpenLayers.Util.createAlphaImageDiv(this.id + "_" + a, c, d, b, "absolute"); c.style.cursor = "pointer"; this.div.appendChild(c); c.action = a; c.className = "olButton"; this.buttons.push(c); return c }, _removeButton: function(a) {
+ this.div.removeChild(a);
+ OpenLayers.Util.removeItem(this.buttons, a)
+ }, removeButtons: function() { for (var a = this.buttons.length - 1; 0 <= a; --a)this._removeButton(this.buttons[a]) }, onButtonClick: function(a) {
+ switch (a.buttonElement.action) {
+ case "panup": this.map.pan(0, -this.getSlideFactor("h")); break; case "pandown": this.map.pan(0, this.getSlideFactor("h")); break; case "panleft": this.map.pan(-this.getSlideFactor("w"), 0); break; case "panright": this.map.pan(this.getSlideFactor("w"), 0); break; case "zoomin": this.map.zoomIn(); break; case "zoomout": this.map.zoomOut();
+ break; case "zoomworld": this.map.zoomToMaxExtent()
+ }
+ }, getSlideFactor: function(a) { return this.slideRatio ? this.map.getSize()[a] * this.slideRatio : this.slideFactor }, CLASS_NAME: "OpenLayers.Control.PanZoom"
+}); OpenLayers.Control.PanZoom.X = 4; OpenLayers.Control.PanZoom.Y = 4;
+OpenLayers.Control.PanZoomBar = OpenLayers.Class(OpenLayers.Control.PanZoom, {
+ zoomStopWidth: 18, zoomStopHeight: 11, slider: null, sliderEvents: null, zoombarDiv: null, zoomWorldIcon: !1, panIcons: !0, forceFixedZoomLevel: !1, mouseDragStart: null, deltaY: null, zoomStart: null, destroy: function() { this._removeZoomBar(); this.map.events.un({ changebaselayer: this.redraw, updatesize: this.redraw, scope: this }); OpenLayers.Control.PanZoom.prototype.destroy.apply(this, arguments); delete this.mouseDragStart; delete this.zoomStart }, setMap: function(a) {
+ OpenLayers.Control.PanZoom.prototype.setMap.apply(this,
+ arguments); this.map.events.on({ changebaselayer: this.redraw, updatesize: this.redraw, scope: this })
+ }, redraw: function() { null != this.div && (this.removeButtons(), this._removeZoomBar()); this.draw() }, draw: function(a) {
+ OpenLayers.Control.prototype.draw.apply(this, arguments); a = this.position.clone(); this.buttons = []; var b = { w: 18, h: 18 }; if (this.panIcons) {
+ var c = new OpenLayers.Pixel(a.x + b.w / 2, a.y), d = b.w; this.zoomWorldIcon && (c = new OpenLayers.Pixel(a.x + b.w, a.y)); this._addButton("panup", "north-mini.png", c, b); a.y = c.y + b.h;
+ this._addButton("panleft", "west-mini.png", a, b); this.zoomWorldIcon && (this._addButton("zoomworld", "zoom-world-mini.png", a.add(b.w, 0), b), d *= 2); this._addButton("panright", "east-mini.png", a.add(d, 0), b); this._addButton("pandown", "south-mini.png", c.add(0, 2 * b.h), b); this._addButton("zoomin", "zoom-plus-mini.png", c.add(0, 3 * b.h + 5), b); c = this._addZoomBar(c.add(0, 4 * b.h + 5)); this._addButton("zoomout", "zoom-minus-mini.png", c, b)
+ } else this._addButton("zoomin", "zoom-plus-mini.png", a, b), c = this._addZoomBar(a.add(0, b.h)),
+ this._addButton("zoomout", "zoom-minus-mini.png", c, b), this.zoomWorldIcon && (c = c.add(0, b.h + 3), this._addButton("zoomworld", "zoom-world-mini.png", c, b)); return this.div
+ }, _addZoomBar: function(a) {
+ var b = OpenLayers.Util.getImageLocation("slider.png"), c = this.id + "_" + this.map.id, d = this.map.getMinZoom(), e = this.map.getNumZoomLevels() - 1 - this.map.getZoom(), e = OpenLayers.Util.createAlphaImageDiv(c, a.add(-1, e * this.zoomStopHeight), { w: 20, h: 9 }, b, "absolute"); e.style.cursor = "move"; this.slider = e; this.sliderEvents = new OpenLayers.Events(this,
+ e, null, !0, { includeXY: !0 }); this.sliderEvents.on({ touchstart: this.zoomBarDown, touchmove: this.zoomBarDrag, touchend: this.zoomBarUp, mousedown: this.zoomBarDown, mousemove: this.zoomBarDrag, mouseup: this.zoomBarUp }); var f = { w: this.zoomStopWidth, h: this.zoomStopHeight * (this.map.getNumZoomLevels() - d) }, b = OpenLayers.Util.getImageLocation("zoombar.png"), c = null; OpenLayers.Util.alphaHack() ? (c = this.id + "_" + this.map.id, c = OpenLayers.Util.createAlphaImageDiv(c, a, { w: f.w, h: this.zoomStopHeight }, b, "absolute", null, "crop"), c.style.height =
+ f.h + "px") : c = OpenLayers.Util.createDiv("OpenLayers_Control_PanZoomBar_Zoombar" + this.map.id, a, f, b); c.style.cursor = "pointer"; c.className = "olButton"; this.zoombarDiv = c; this.div.appendChild(c); this.startTop = parseInt(c.style.top); this.div.appendChild(e); this.map.events.register("zoomend", this, this.moveZoomBar); return a.add(0, this.zoomStopHeight * (this.map.getNumZoomLevels() - d))
+ }, _removeZoomBar: function() {
+ this.sliderEvents.un({
+ touchstart: this.zoomBarDown, touchmove: this.zoomBarDrag, touchend: this.zoomBarUp,
+ mousedown: this.zoomBarDown, mousemove: this.zoomBarDrag, mouseup: this.zoomBarUp
+ }); this.sliderEvents.destroy(); this.div.removeChild(this.zoombarDiv); this.zoombarDiv = null; this.div.removeChild(this.slider); this.slider = null; this.map.events.unregister("zoomend", this, this.moveZoomBar)
+ }, onButtonClick: function(a) {
+ OpenLayers.Control.PanZoom.prototype.onButtonClick.apply(this, arguments); if (a.buttonElement === this.zoombarDiv) {
+ var b = a.buttonXY.y / this.zoomStopHeight; if (this.forceFixedZoomLevel || !this.map.fractionalZoom) b =
+ Math.floor(b); b = this.map.getNumZoomLevels() - 1 - b; b = Math.min(Math.max(b, 0), this.map.getNumZoomLevels() - 1); this.map.zoomTo(b)
+ }
+ }, passEventToSlider: function(a) { this.sliderEvents.handleBrowserEvent(a) }, zoomBarDown: function(a) {
+ if (OpenLayers.Event.isLeftClick(a) || OpenLayers.Event.isSingleTouch(a)) this.map.events.on({ touchmove: this.passEventToSlider, mousemove: this.passEventToSlider, mouseup: this.passEventToSlider, scope: this }), this.mouseDragStart = a.xy.clone(), this.zoomStart = a.xy.clone(), this.div.style.cursor =
+ "move", this.zoombarDiv.offsets = null, OpenLayers.Event.stop(a)
+ }, zoomBarDrag: function(a) { if (null != this.mouseDragStart) { var b = this.mouseDragStart.y - a.xy.y, c = OpenLayers.Util.pagePosition(this.zoombarDiv); 0 < a.clientY - c[1] && a.clientY - c[1] < parseInt(this.zoombarDiv.style.height) - 2 && (b = parseInt(this.slider.style.top) - b, this.slider.style.top = b + "px", this.mouseDragStart = a.xy.clone()); this.deltaY = this.zoomStart.y - a.xy.y; OpenLayers.Event.stop(a) } }, zoomBarUp: function(a) {
+ if ((OpenLayers.Event.isLeftClick(a) || "touchend" ===
+ a.type) && this.mouseDragStart) { this.div.style.cursor = ""; this.map.events.un({ touchmove: this.passEventToSlider, mouseup: this.passEventToSlider, mousemove: this.passEventToSlider, scope: this }); var b = this.map.zoom; !this.forceFixedZoomLevel && this.map.fractionalZoom ? (b += this.deltaY / this.zoomStopHeight, b = Math.min(Math.max(b, 0), this.map.getNumZoomLevels() - 1)) : (b += this.deltaY / this.zoomStopHeight, b = Math.max(Math.round(b), 0)); this.map.zoomTo(b); this.zoomStart = this.mouseDragStart = null; this.deltaY = 0; OpenLayers.Event.stop(a) }
+ },
+ moveZoomBar: function() { var a = (this.map.getNumZoomLevels() - 1 - this.map.getZoom()) * this.zoomStopHeight + this.startTop + 1; this.slider.style.top = a + "px" }, CLASS_NAME: "OpenLayers.Control.PanZoomBar"
+}); OpenLayers.Format.WFSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.1.0", CLASS_NAME: "OpenLayers.Format.WFSCapabilities" });
+OpenLayers.Format.WFSCapabilities.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { wfs: "http://www.opengis.net/wfs", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance", ows: "http://www.opengis.net/ows" }, errorProperty: "featureTypeList", defaultPrefix: "wfs", read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a, b); return b }, readers: {
+ wfs: {
+ WFS_Capabilities: function(a,
+ b) { this.readChildNodes(a, b) }, FeatureTypeList: function(a, b) { b.featureTypeList = { featureTypes: [] }; this.readChildNodes(a, b.featureTypeList) }, FeatureType: function(a, b) { var c = {}; this.readChildNodes(a, c); b.featureTypes.push(c) }, Name: function(a, b) { var c = this.getChildValue(a); c && (c = c.split(":"), b.name = c.pop(), 0 < c.length && (b.featureNS = this.lookupNamespaceURI(a, c[0]))) }, Title: function(a, b) { var c = this.getChildValue(a); c && (b.title = c) }, Abstract: function(a, b) { var c = this.getChildValue(a); c && (b["abstract"] = c) }
+ }
+ },
+ CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1"
+}); OpenLayers.Format.WFSCapabilities.v1_1_0 = OpenLayers.Class(OpenLayers.Format.WFSCapabilities.v1, { regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, readers: { wfs: OpenLayers.Util.applyDefaults({ DefaultSRS: function(a, b) { var c = this.getChildValue(a); c && (b.srs = c) } }, OpenLayers.Format.WFSCapabilities.v1.prototype.readers.wfs), ows: OpenLayers.Format.OWSCommon.v1.prototype.readers.ows }, CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1_1_0" });
+OpenLayers.Layer.Image = OpenLayers.Class(OpenLayers.Layer, {
+ isBaseLayer: !0, url: null, extent: null, size: null, tile: null, aspectRatio: null, initialize: function(a, b, c, d, e) { this.url = b; this.maxExtent = this.extent = c; this.size = d; OpenLayers.Layer.prototype.initialize.apply(this, [a, e]); this.aspectRatio = this.extent.getHeight() / this.size.h / (this.extent.getWidth() / this.size.w) }, destroy: function() {
+ this.tile && (this.removeTileMonitoringHooks(this.tile), this.tile.destroy(), this.tile = null); OpenLayers.Layer.prototype.destroy.apply(this,
+ arguments)
+ }, clone: function(a) { null == a && (a = new OpenLayers.Layer.Image(this.name, this.url, this.extent, this.size, this.getOptions())); return OpenLayers.Layer.prototype.clone.apply(this, [a]) }, setMap: function(a) { null == this.options.maxResolution && (this.options.maxResolution = this.aspectRatio * this.extent.getWidth() / this.size.w); OpenLayers.Layer.prototype.setMap.apply(this, arguments) }, moveTo: function(a, b, c) {
+ OpenLayers.Layer.prototype.moveTo.apply(this, arguments); var d = null == this.tile; if (b || d) {
+ this.setTileSize();
+ var e = this.map.getLayerPxFromLonLat({ lon: this.extent.left, lat: this.extent.top }); d ? (this.tile = new OpenLayers.Tile.Image(this, e, this.extent, null, this.tileSize), this.addTileMonitoringHooks(this.tile)) : (this.tile.size = this.tileSize.clone(), this.tile.position = e.clone()); this.tile.draw()
+ }
+ }, setTileSize: function() { var a = this.extent.getWidth() / this.map.getResolution(), b = this.extent.getHeight() / this.map.getResolution(); this.tileSize = new OpenLayers.Size(a, b) }, addTileMonitoringHooks: function(a) {
+ a.onLoadStart =
+ function() { this.events.triggerEvent("loadstart") }; a.events.register("loadstart", this, a.onLoadStart); a.onLoadEnd = function() { this.events.triggerEvent("loadend") }; a.events.register("loadend", this, a.onLoadEnd); a.events.register("unload", this, a.onLoadEnd)
+ }, removeTileMonitoringHooks: function(a) { a.unload(); a.events.un({ loadstart: a.onLoadStart, loadend: a.onLoadEnd, unload: a.onLoadEnd, scope: this }) }, setUrl: function(a) { this.url = a; this.tile.draw() }, getURL: function(a) { return this.url }, CLASS_NAME: "OpenLayers.Layer.Image"
+});
+OpenLayers.Strategy = OpenLayers.Class({ layer: null, options: null, active: null, autoActivate: !0, autoDestroy: !0, initialize: function(a) { OpenLayers.Util.extend(this, a); this.options = a; this.active = !1 }, destroy: function() { this.deactivate(); this.options = this.layer = null }, setLayer: function(a) { this.layer = a }, activate: function() { return this.active ? !1 : this.active = !0 }, deactivate: function() { return this.active ? (this.active = !1, !0) : !1 }, CLASS_NAME: "OpenLayers.Strategy" });
+OpenLayers.Strategy.Save = OpenLayers.Class(OpenLayers.Strategy, {
+ events: null, auto: !1, timer: null, initialize: function(a) { OpenLayers.Strategy.prototype.initialize.apply(this, [a]); this.events = new OpenLayers.Events(this) }, activate: function() {
+ var a = OpenLayers.Strategy.prototype.activate.call(this); if (a && this.auto) if ("number" === typeof this.auto) this.timer = window.setInterval(OpenLayers.Function.bind(this.save, this), 1E3 * this.auto); else this.layer.events.on({
+ featureadded: this.triggerSave, afterfeaturemodified: this.triggerSave,
+ scope: this
+ }); return a
+ }, deactivate: function() { var a = OpenLayers.Strategy.prototype.deactivate.call(this); a && this.auto && ("number" === typeof this.auto ? window.clearInterval(this.timer) : this.layer.events.un({ featureadded: this.triggerSave, afterfeaturemodified: this.triggerSave, scope: this })); return a }, triggerSave: function(a) { var b = a.feature; b.state !== OpenLayers.State.INSERT && b.state !== OpenLayers.State.UPDATE && b.state !== OpenLayers.State.DELETE || this.save([a.feature]) }, save: function(a) {
+ a || (a = this.layer.features);
+ this.events.triggerEvent("start", { features: a }); var b = this.layer.projection, c = this.layer.map.getProjectionObject(); if (!c.equals(b)) { for (var d = a.length, e = Array(d), f, g, h = 0; h < d; ++h)f = a[h], g = f.clone(), g.fid = f.fid, g.state = f.state, f.url && (g.url = f.url), g._original = f, g.geometry.transform(c, b), e[h] = g; a = e } this.layer.protocol.commit(a, { callback: this.onCommit, scope: this })
+ }, onCommit: function(a) {
+ var b = { response: a }; if (a.success()) {
+ for (var c = a.reqFeatures, d, e = [], f = a.insertIds || [], g = 0, h = 0, k = c.length; h < k; ++h)if (d = c[h],
+ d = d._original || d, a = d.state) a == OpenLayers.State.DELETE ? e.push(d) : a == OpenLayers.State.INSERT && (d.fid = f[g], ++g), d.state = null; 0 < e.length && this.layer.destroyFeatures(e); this.events.triggerEvent("success", b)
+ } else this.events.triggerEvent("fail", b)
+ }, CLASS_NAME: "OpenLayers.Strategy.Save"
+});
+OpenLayers.Events.featureclick = OpenLayers.Class({
+ cache: null, map: null, provides: ["featureclick", "nofeatureclick", "featureover", "featureout"], initialize: function(a) {
+ this.target = a; if (a.object instanceof OpenLayers.Map) this.setMap(a.object); else if (a.object instanceof OpenLayers.Layer.Vector) a.object.map ? this.setMap(a.object.map) : a.object.events.register("added", this, function(b) { this.setMap(a.object.map) }); else throw "Listeners for '" + this.provides.join("', '") + "' events can only be registered for OpenLayers.Layer.Vector or OpenLayers.Map instances";
+ for (var b = this.provides.length - 1; 0 <= b; --b)a.extensions[this.provides[b]] = !0
+ }, setMap: function(a) { this.map = a; this.cache = {}; a.events.register("mousedown", this, this.start, { extension: !0 }); a.events.register("mouseup", this, this.onClick, { extension: !0 }); a.events.register("touchstart", this, this.start, { extension: !0 }); a.events.register("touchmove", this, this.cancel, { extension: !0 }); a.events.register("touchend", this, this.onClick, { extension: !0 }); a.events.register("mousemove", this, this.onMousemove, { extension: !0 }) },
+ start: function(a) { this.startEvt = a }, cancel: function(a) { delete this.startEvt }, onClick: function(a) { if (this.startEvt && ("touchend" === a.type || OpenLayers.Event.isLeftClick(a))) { a = this.getFeatures(this.startEvt); delete this.startEvt; for (var b, c, d = {}, e = 0, f = a.length; e < f && (b = a[e], c = b.layer, d[c.id] = !0, b = this.triggerEvent("featureclick", { feature: b }), !1 !== b); ++e); e = 0; for (f = this.map.layers.length; e < f; ++e)c = this.map.layers[e], c instanceof OpenLayers.Layer.Vector && !d[c.id] && this.triggerEvent("nofeatureclick", { layer: c }) } },
+ onMousemove: function(a) { delete this.startEvt; var b = this.getFeatures(a), c = {}; a = []; for (var d, e = 0, f = b.length; e < f; ++e)d = b[e], c[d.id] = d, this.cache[d.id] || a.push(d); var b = [], g; for (g in this.cache) d = this.cache[g], d.layer && d.layer.map ? c[d.id] || b.push(d) : delete this.cache[g]; e = 0; for (f = a.length; e < f && (d = a[e], this.cache[d.id] = d, g = this.triggerEvent("featureover", { feature: d }), !1 !== g); ++e); e = 0; for (f = b.length; e < f && (d = b[e], delete this.cache[d.id], g = this.triggerEvent("featureout", { feature: d }), !1 !== g); ++e); }, triggerEvent: function(a,
+ b) { var c = b.feature ? b.feature.layer : b.layer, d = this.target.object; if (d instanceof OpenLayers.Map || d === c) return this.target.triggerEvent(a, b) }, getFeatures: function(a) {
+ var b = a.clientX, c = a.clientY, d = [], e = [], f = [], g, h, k, l; for (l = this.map.layers.length - 1; 0 <= l; --l)if (g = this.map.layers[l], "none" !== g.div.style.display) if (g.renderer instanceof OpenLayers.Renderer.Elements) {
+ if (g instanceof OpenLayers.Layer.Vector) for (h = document.elementFromPoint(b, c); h && h._featureId;)(k = g.getFeatureById(h._featureId)) ? (d.push(k),
+ h.style.display = "none", e.push(h), h = document.elementFromPoint(b, c)) : h = !1; f.push(g); g.div.style.display = "none"
+ } else g.renderer instanceof OpenLayers.Renderer.Canvas && (k = g.renderer.getFeatureIdFromEvent(a)) && (d.push(k), f.push(g)); l = 0; for (a = e.length; l < a; ++l)e[l].style.display = ""; for (l = f.length - 1; 0 <= l; --l)f[l].div.style.display = "block"; return d
+ }, destroy: function() {
+ for (var a = this.provides.length - 1; 0 <= a; --a)delete this.target.extensions[this.provides[a]]; this.map.events.un({
+ mousemove: this.onMousemove, mousedown: this.start,
+ mouseup: this.onClick, touchstart: this.start, touchmove: this.cancel, touchend: this.onClick, scope: this
+ }); delete this.cache; delete this.map; delete this.target
+ }
+}); OpenLayers.Events.nofeatureclick = OpenLayers.Events.featureclick; OpenLayers.Events.featureover = OpenLayers.Events.featureclick; OpenLayers.Events.featureout = OpenLayers.Events.featureclick;
+OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
+ defaultDesc: "No description available", extractWaypoints: !0, extractTracks: !0, extractRoutes: !0, extractAttributes: !0, namespaces: { gpx: "http://www.topografix.com/GPX/1/1", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, schemaLocation: "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd", creator: "OpenLayers", initialize: function(a) {
+ this.externalProjection = new OpenLayers.Projection("EPSG:4326"); OpenLayers.Format.XML.prototype.initialize.apply(this,
+ [a])
+ }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); var b = []; if (this.extractTracks) for (var c = a.getElementsByTagName("trk"), d = 0, e = c.length; d < e; d++) { var f = {}; this.extractAttributes && (f = this.parseAttributes(c[d])); for (var g = this.getElementsByTagNameNS(c[d], c[d].namespaceURI, "trkseg"), h = 0, k = g.length; h < k; h++) { var l = this.extractSegment(g[h], "trkpt"); b.push(new OpenLayers.Feature.Vector(l, f)) } } if (this.extractRoutes) for (e = a.getElementsByTagName("rte"), c = 0, d =
+ e.length; c < d; c++)f = {}, this.extractAttributes && (f = this.parseAttributes(e[c])), g = this.extractSegment(e[c], "rtept"), b.push(new OpenLayers.Feature.Vector(g, f)); if (this.extractWaypoints) for (a = a.getElementsByTagName("wpt"), c = 0, e = a.length; c < e; c++)f = {}, this.extractAttributes && (f = this.parseAttributes(a[c])), d = new OpenLayers.Geometry.Point(a[c].getAttribute("lon"), a[c].getAttribute("lat")), b.push(new OpenLayers.Feature.Vector(d, f)); if (this.internalProjection && this.externalProjection) for (f = 0, a = b.length; f < a; f++)b[f].geometry.transform(this.externalProjection,
+ this.internalProjection); return b
+ }, extractSegment: function(a, b) { for (var c = this.getElementsByTagNameNS(a, a.namespaceURI, b), d = [], e = 0, f = c.length; e < f; e++)d.push(new OpenLayers.Geometry.Point(c[e].getAttribute("lon"), c[e].getAttribute("lat"))); return new OpenLayers.Geometry.LineString(d) }, parseAttributes: function(a) {
+ var b = {}; a = a.firstChild; for (var c, d; a;)1 == a.nodeType && a.firstChild && (c = a.firstChild, 3 == c.nodeType || 4 == c.nodeType) && (d = a.prefix ? a.nodeName.split(":")[1] : a.nodeName, "trkseg" != d && "rtept" != d &&
+ (b[d] = c.nodeValue)), a = a.nextSibling; return b
+ }, write: function(a, b) { a = OpenLayers.Util.isArray(a) ? a : [a]; var c = this.createElementNS(this.namespaces.gpx, "gpx"); c.setAttribute("version", "1.1"); c.setAttribute("creator", this.creator); this.setAttributes(c, { "xsi:schemaLocation": this.schemaLocation }); b && "object" == typeof b && c.appendChild(this.buildMetadataNode(b)); for (var d = 0, e = a.length; d < e; d++)c.appendChild(this.buildFeatureNode(a[d])); return OpenLayers.Format.XML.prototype.write.apply(this, [c]) }, buildMetadataNode: function(a) {
+ for (var b =
+ ["name", "desc", "author"], c = this.createElementNS(this.namespaces.gpx, "metadata"), d = 0; d < b.length; d++) { var e = b[d]; if (a[e]) { var f = this.createElementNS(this.namespaces.gpx, e); f.appendChild(this.createTextNode(a[e])); c.appendChild(f) } } return c
+ }, buildFeatureNode: function(a) {
+ var b = a.geometry, b = b.clone(); this.internalProjection && this.externalProjection && b.transform(this.internalProjection, this.externalProjection); if ("OpenLayers.Geometry.Point" == b.CLASS_NAME) {
+ var c = this.buildWptNode(b); this.appendAttributesNode(c,
+ a); return c
+ } c = this.createElementNS(this.namespaces.gpx, "trk"); this.appendAttributesNode(c, a); a = this.buildTrkSegNode(b); a = OpenLayers.Util.isArray(a) ? a : [a]; for (var b = 0, d = a.length; b < d; b++)c.appendChild(a[b]); return c
+ }, buildTrkSegNode: function(a) {
+ var b, c, d, e; if ("OpenLayers.Geometry.LineString" == a.CLASS_NAME || "OpenLayers.Geometry.LinearRing" == a.CLASS_NAME) {
+ b = this.createElementNS(this.namespaces.gpx, "trkseg"); c = 0; for (d = a.components.length; c < d; c++)e = a.components[c], b.appendChild(this.buildTrkPtNode(e));
+ return b
+ } b = []; c = 0; for (d = a.components.length; c < d; c++)b.push(this.buildTrkSegNode(a.components[c])); return b
+ }, buildTrkPtNode: function(a) { var b = this.createElementNS(this.namespaces.gpx, "trkpt"); b.setAttribute("lon", a.x); b.setAttribute("lat", a.y); return b }, buildWptNode: function(a) { var b = this.createElementNS(this.namespaces.gpx, "wpt"); b.setAttribute("lon", a.x); b.setAttribute("lat", a.y); return b }, appendAttributesNode: function(a, b) {
+ var c = this.createElementNS(this.namespaces.gpx, "name"); c.appendChild(this.createTextNode(b.attributes.name ||
+ b.id)); a.appendChild(c); c = this.createElementNS(this.namespaces.gpx, "desc"); c.appendChild(this.createTextNode(b.attributes.description || this.defaultDesc)); a.appendChild(c)
+ }, CLASS_NAME: "OpenLayers.Format.GPX"
+}); OpenLayers.Format.WMSDescribeLayer = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.1.1", CLASS_NAME: "OpenLayers.Format.WMSDescribeLayer" });
+OpenLayers.Format.WMSDescribeLayer.v1_1_1 = OpenLayers.Class(OpenLayers.Format.WMSDescribeLayer, {
+ initialize: function(a) { OpenLayers.Format.WMSDescribeLayer.prototype.initialize.apply(this, [a]) }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); for (var b = a.documentElement.childNodes, c = { layerDescriptions: [] }, d, e, f = 0; f < b.length; ++f)if (d = b[f], e = d.nodeName, "LayerDescription" == e) {
+ e = d.getAttribute("name"); var g = "", h = "", k = ""; d.getAttribute("owsType") ? (g = d.getAttribute("owsType"),
+ h = d.getAttribute("owsURL")) : "" != d.getAttribute("wfs") ? (g = "WFS", h = d.getAttribute("wfs")) : "" != d.getAttribute("wcs") && (g = "WCS", h = d.getAttribute("wcs")); d = d.getElementsByTagName("Query"); 0 < d.length && ((k = d[0].getAttribute("typeName")) || (k = d[0].getAttribute("typename"))); d = { layerName: e, owsType: g, owsURL: h, typeName: k }; c.layerDescriptions.push(d); c.length = c.layerDescriptions.length; c[c.length - 1] = d
+ } else if ("ServiceException" == e) return { error: (new OpenLayers.Format.OGCExceptionReport).read(a) }; return c
+ }, CLASS_NAME: "OpenLayers.Format.WMSDescribeLayer.v1_1_1"
+});
+OpenLayers.Format.WMSDescribeLayer.v1_1_0 = OpenLayers.Format.WMSDescribeLayer.v1_1_1;
+OpenLayers.Layer.XYZ = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ isBaseLayer: !0, sphericalMercator: !1, zoomOffset: 0, serverResolutions: null, initialize: function(a, b, c) { if (c && c.sphericalMercator || this.sphericalMercator) c = OpenLayers.Util.extend({ projection: "EPSG:900913", numZoomLevels: 19 }, c); OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a || this.name, b || this.url, {}, c]) }, clone: function(a) {
+ null == a && (a = new OpenLayers.Layer.XYZ(this.name, this.url, this.getOptions())); return OpenLayers.Layer.Grid.prototype.clone.apply(this,
+ [a])
+ }, getURL: function(a) { a = this.getXYZ(a); var b = this.url; OpenLayers.Util.isArray(b) && (b = this.selectUrl("" + a.x + a.y + a.z, b)); return OpenLayers.String.format(b, a) }, getXYZ: function(a) { var b = this.getServerResolution(), c = Math.round((a.left - this.maxExtent.left) / (b * this.tileSize.w)); a = Math.round((this.maxExtent.top - a.top) / (b * this.tileSize.h)); b = this.getServerZoom(); if (this.wrapDateLine) var d = Math.pow(2, b), c = (c % d + d) % d; return { x: c, y: a, z: b } }, setMap: function(a) {
+ OpenLayers.Layer.Grid.prototype.setMap.apply(this,
+ arguments); this.tileOrigin || (this.tileOrigin = new OpenLayers.LonLat(this.maxExtent.left, this.maxExtent.bottom))
+ }, CLASS_NAME: "OpenLayers.Layer.XYZ"
+});
+OpenLayers.Layer.OSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+ name: "OpenStreetMap", url: ["http://a.tile.openstreetmap.org/${z}/${x}/${y}.png", "http://b.tile.openstreetmap.org/${z}/${x}/${y}.png", "http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"], attribution: "\x26copy; \x3ca href\x3d'http://www.openstreetmap.org/copyright'\x3eOpenStreetMap\x3c/a\x3e contributors", sphericalMercator: !0, wrapDateLine: !0, tileOptions: null, initialize: function(a, b, c) {
+ OpenLayers.Layer.XYZ.prototype.initialize.apply(this, arguments);
+ this.tileOptions = OpenLayers.Util.extend({ crossOriginKeyword: "anonymous" }, this.options && this.options.tileOptions)
+ }, clone: function(a) { null == a && (a = new OpenLayers.Layer.OSM(this.name, this.url, this.getOptions())); return OpenLayers.Layer.XYZ.prototype.clone.apply(this, [a]) }, CLASS_NAME: "OpenLayers.Layer.OSM"
+});
+OpenLayers.Renderer = OpenLayers.Class({
+ container: null, root: null, extent: null, locked: !1, size: null, resolution: null, map: null, featureDx: 0, initialize: function(a, b) { this.container = OpenLayers.Util.getElement(a); OpenLayers.Util.extend(this, b) }, destroy: function() { this.map = this.resolution = this.size = this.extent = this.container = null }, supported: function() { return !1 }, setExtent: function(a, b) {
+ this.extent = a.clone(); if (this.map.baseLayer && this.map.baseLayer.wrapDateLine) {
+ var c = a.getWidth() / this.map.getExtent().getWidth();
+ a = a.scale(1 / c); this.extent = a.wrapDateLine(this.map.getMaxExtent()).scale(c)
+ } b && (this.resolution = null); return !0
+ }, setSize: function(a) { this.size = a.clone(); this.resolution = null }, getResolution: function() { return this.resolution = this.resolution || this.map.getResolution() }, drawFeature: function(a, b) {
+ null == b && (b = a.style); if (a.geometry) {
+ var c = a.geometry.getBounds(); if (c) {
+ var d; this.map.baseLayer && this.map.baseLayer.wrapDateLine && (d = this.map.getMaxExtent()); c.intersectsBounds(this.extent, { worldBounds: d }) ? this.calculateFeatureDx(c,
+ d) : b = { display: "none" }; c = this.drawGeometry(a.geometry, b, a.id); if ("none" != b.display && b.label && !1 !== c) { d = a.geometry.getCentroid(); if (b.labelXOffset || b.labelYOffset) { var e = isNaN(b.labelXOffset) ? 0 : b.labelXOffset, f = isNaN(b.labelYOffset) ? 0 : b.labelYOffset, g = this.getResolution(); d.move(e * g, f * g) } this.drawText(a.id, b, d) } else this.removeText(a.id); return c
+ }
+ }
+ }, calculateFeatureDx: function(a, b) {
+ this.featureDx = 0; if (b) {
+ var c = b.getWidth(); this.featureDx = Math.round(((a.left + a.right) / 2 - (this.extent.left + this.extent.right) /
+ 2) / c) * c
+ }
+ }, drawGeometry: function(a, b, c) { }, drawText: function(a, b, c) { }, removeText: function(a) { }, clear: function() { }, getFeatureIdFromEvent: function(a) { }, eraseFeatures: function(a) { OpenLayers.Util.isArray(a) || (a = [a]); for (var b = 0, c = a.length; b < c; ++b) { var d = a[b]; this.eraseGeometry(d.geometry, d.id); this.removeText(d.id) } }, eraseGeometry: function(a, b) { }, moveRoot: function(a) { }, getRenderLayerId: function() { return this.container.id }, applyDefaultSymbolizer: function(a) {
+ var b = OpenLayers.Util.extend({}, OpenLayers.Renderer.defaultSymbolizer);
+ !1 === a.stroke && (delete b.strokeWidth, delete b.strokeColor); !1 === a.fill && delete b.fillColor; OpenLayers.Util.extend(b, a); return b
+ }, CLASS_NAME: "OpenLayers.Renderer"
+}); OpenLayers.Renderer.defaultSymbolizer = { fillColor: "#000000", strokeColor: "#000000", strokeWidth: 2, fillOpacity: 1, strokeOpacity: 1, pointRadius: 0, labelAlign: "cm" };
+OpenLayers.Renderer.symbol = { star: [350, 75, 379, 161, 469, 161, 397, 215, 423, 301, 350, 250, 277, 301, 303, 215, 231, 161, 321, 161, 350, 75], cross: [4, 0, 6, 0, 6, 4, 10, 4, 10, 6, 6, 6, 6, 10, 4, 10, 4, 6, 0, 6, 0, 4, 4, 4, 4, 0], x: [0, 0, 25, 0, 50, 35, 75, 0, 100, 0, 65, 50, 100, 100, 75, 100, 50, 65, 25, 100, 0, 100, 35, 50, 0, 0], square: [0, 0, 0, 1, 1, 1, 1, 0, 0, 0], triangle: [0, 10, 10, 10, 5, 0, 0, 10] };
+OpenLayers.Renderer.Canvas = OpenLayers.Class(OpenLayers.Renderer, {
+ hitDetection: !0, hitOverflow: 0, canvas: null, features: null, pendingRedraw: !1, cachedSymbolBounds: {}, initialize: function(a, b) { OpenLayers.Renderer.prototype.initialize.apply(this, arguments); this.root = document.createElement("canvas"); this.container.appendChild(this.root); this.canvas = this.root.getContext("2d"); this.features = {}; this.hitDetection && (this.hitCanvas = document.createElement("canvas"), this.hitContext = this.hitCanvas.getContext("2d")) },
+ setExtent: function() { OpenLayers.Renderer.prototype.setExtent.apply(this, arguments); return !1 }, eraseGeometry: function(a, b) { this.eraseFeatures(this.features[b][0]) }, supported: function() { return OpenLayers.CANVAS_SUPPORTED }, setSize: function(a) { this.size = a.clone(); var b = this.root; b.style.width = a.w + "px"; b.style.height = a.h + "px"; b.width = a.w; b.height = a.h; this.resolution = null; this.hitDetection && (b = this.hitCanvas, b.style.width = a.w + "px", b.style.height = a.h + "px", b.width = a.w, b.height = a.h) }, drawFeature: function(a,
+ b) { var c; if (a.geometry) { b = this.applyDefaultSymbolizer(b || a.style); c = a.geometry.getBounds(); var d; this.map.baseLayer && this.map.baseLayer.wrapDateLine && (d = this.map.getMaxExtent()); d = c && c.intersectsBounds(this.extent, { worldBounds: d }); (c = "none" !== b.display && !!c && d) ? this.features[a.id] = [a, b] : delete this.features[a.id]; this.pendingRedraw = !0 } this.pendingRedraw && !this.locked && (this.redraw(), this.pendingRedraw = !1); return c }, drawGeometry: function(a, b, c) {
+ var d = a.CLASS_NAME; if ("OpenLayers.Geometry.Collection" ==
+ d || "OpenLayers.Geometry.MultiPoint" == d || "OpenLayers.Geometry.MultiLineString" == d || "OpenLayers.Geometry.MultiPolygon" == d) for (d = 0; d < a.components.length; d++)this.drawGeometry(a.components[d], b, c); else switch (a.CLASS_NAME) { case "OpenLayers.Geometry.Point": this.drawPoint(a, b, c); break; case "OpenLayers.Geometry.LineString": this.drawLineString(a, b, c); break; case "OpenLayers.Geometry.LinearRing": this.drawLinearRing(a, b, c); break; case "OpenLayers.Geometry.Polygon": this.drawPolygon(a, b, c) }
+ }, drawExternalGraphic: function(a,
+ b, c) {
+ var d = new Image, e = b.title || b.graphicTitle; e && (d.title = e); var f = b.graphicWidth || b.graphicHeight, g = b.graphicHeight || b.graphicWidth, f = f ? f : 2 * b.pointRadius, g = g ? g : 2 * b.pointRadius, h = void 0 != b.graphicXOffset ? b.graphicXOffset : -(.5 * f), k = void 0 != b.graphicYOffset ? b.graphicYOffset : -(.5 * g), l = b.graphicOpacity || b.fillOpacity; d.onload = OpenLayers.Function.bind(function() {
+ if (this.features[c]) {
+ var b = this.getLocalXY(a), e = b[0], b = b[1]; if (!isNaN(e) && !isNaN(b)) {
+ var e = e + h | 0, b = b + k | 0, p = this.canvas; p.globalAlpha = l; var q =
+ OpenLayers.Renderer.Canvas.drawImageScaleFactor || (OpenLayers.Renderer.Canvas.drawImageScaleFactor = /android 2.1/.test(navigator.userAgent.toLowerCase()) ? 320 / window.screen.width : 1); p.drawImage(d, e * q, b * q, f * q, g * q); this.hitDetection && (this.setHitContextStyle("fill", c), this.hitContext.fillRect(e, b, f, g))
+ }
+ }
+ }, this); d.src = b.externalGraphic
+ }, drawNamedSymbol: function(a, b, c) {
+ var d, e, f, g; f = Math.PI / 180; var h = OpenLayers.Renderer.symbol[b.graphicName]; if (!h) throw Error(b.graphicName + " is not a valid symbol name");
+ if (!(!h.length || 2 > h.length || (a = this.getLocalXY(a), e = a[0], g = a[1], isNaN(e) || isNaN(g)))) {
+ this.canvas.lineCap = "round"; this.canvas.lineJoin = "round"; this.hitDetection && (this.hitContext.lineCap = "round", this.hitContext.lineJoin = "round"); if (b.graphicName in this.cachedSymbolBounds) d = this.cachedSymbolBounds[b.graphicName]; else { d = new OpenLayers.Bounds; for (a = 0; a < h.length; a += 2)d.extend(new OpenLayers.LonLat(h[a], h[a + 1])); this.cachedSymbolBounds[b.graphicName] = d } this.canvas.save(); this.hitDetection && this.hitContext.save();
+ this.canvas.translate(e, g); this.hitDetection && this.hitContext.translate(e, g); a = f * b.rotation; isNaN(a) || (this.canvas.rotate(a), this.hitDetection && this.hitContext.rotate(a)); f = 2 * b.pointRadius / Math.max(d.getWidth(), d.getHeight()); this.canvas.scale(f, f); this.hitDetection && this.hitContext.scale(f, f); a = d.getCenterLonLat().lon; d = d.getCenterLonLat().lat; this.canvas.translate(-a, -d); this.hitDetection && this.hitContext.translate(-a, -d); g = b.strokeWidth; b.strokeWidth = g / f; if (!1 !== b.fill) {
+ this.setCanvasStyle("fill",
+ b); this.canvas.beginPath(); for (a = 0; a < h.length; a += 2)d = h[a], e = h[a + 1], 0 == a && this.canvas.moveTo(d, e), this.canvas.lineTo(d, e); this.canvas.closePath(); this.canvas.fill(); if (this.hitDetection) { this.setHitContextStyle("fill", c, b); this.hitContext.beginPath(); for (a = 0; a < h.length; a += 2)d = h[a], e = h[a + 1], 0 == a && this.canvas.moveTo(d, e), this.hitContext.lineTo(d, e); this.hitContext.closePath(); this.hitContext.fill() }
+ } if (!1 !== b.stroke) {
+ this.setCanvasStyle("stroke", b); this.canvas.beginPath(); for (a = 0; a < h.length; a += 2)d = h[a],
+ e = h[a + 1], 0 == a && this.canvas.moveTo(d, e), this.canvas.lineTo(d, e); this.canvas.closePath(); this.canvas.stroke(); if (this.hitDetection) { this.setHitContextStyle("stroke", c, b, f); this.hitContext.beginPath(); for (a = 0; a < h.length; a += 2)d = h[a], e = h[a + 1], 0 == a && this.hitContext.moveTo(d, e), this.hitContext.lineTo(d, e); this.hitContext.closePath(); this.hitContext.stroke() }
+ } b.strokeWidth = g; this.canvas.restore(); this.hitDetection && this.hitContext.restore(); this.setCanvasStyle("reset")
+ }
+ }, setCanvasStyle: function(a, b) {
+ "fill" ===
+ a ? (this.canvas.globalAlpha = b.fillOpacity, this.canvas.fillStyle = b.fillColor) : "stroke" === a ? (this.canvas.globalAlpha = b.strokeOpacity, this.canvas.strokeStyle = b.strokeColor, this.canvas.lineWidth = b.strokeWidth) : (this.canvas.globalAlpha = 0, this.canvas.lineWidth = 1)
+ }, featureIdToHex: function(a) { a = Number(a.split("_").pop()) + 1; 16777216 <= a && (this.hitOverflow = a - 16777215, a = a % 16777216 + 1); a = "000000" + a.toString(16); var b = a.length; return "#" + a.substring(b - 6, b) }, setHitContextStyle: function(a, b, c, d) {
+ b = this.featureIdToHex(b);
+ "fill" == a ? (this.hitContext.globalAlpha = 1, this.hitContext.fillStyle = b) : "stroke" == a ? (this.hitContext.globalAlpha = 1, this.hitContext.strokeStyle = b, "undefined" === typeof d ? this.hitContext.lineWidth = c.strokeWidth + 2 : isNaN(d) || (this.hitContext.lineWidth = c.strokeWidth + 2 / d)) : (this.hitContext.globalAlpha = 0, this.hitContext.lineWidth = 1)
+ }, drawPoint: function(a, b, c) {
+ if (!1 !== b.graphic) if (b.externalGraphic) this.drawExternalGraphic(a, b, c); else if (b.graphicName && "circle" != b.graphicName) this.drawNamedSymbol(a, b, c); else {
+ var d =
+ this.getLocalXY(a); a = d[0]; d = d[1]; if (!isNaN(a) && !isNaN(d)) {
+ var e = 2 * Math.PI, f = b.pointRadius; !1 !== b.fill && (this.setCanvasStyle("fill", b), this.canvas.beginPath(), this.canvas.arc(a, d, f, 0, e, !0), this.canvas.fill(), this.hitDetection && (this.setHitContextStyle("fill", c, b), this.hitContext.beginPath(), this.hitContext.arc(a, d, f, 0, e, !0), this.hitContext.fill())); !1 !== b.stroke && (this.setCanvasStyle("stroke", b), this.canvas.beginPath(), this.canvas.arc(a, d, f, 0, e, !0), this.canvas.stroke(), this.hitDetection && (this.setHitContextStyle("stroke",
+ c, b), this.hitContext.beginPath(), this.hitContext.arc(a, d, f, 0, e, !0), this.hitContext.stroke()), this.setCanvasStyle("reset"))
+ }
+ }
+ }, drawLineString: function(a, b, c) { b = OpenLayers.Util.applyDefaults({ fill: !1 }, b); this.drawLinearRing(a, b, c) }, drawLinearRing: function(a, b, c) {
+ !1 !== b.fill && (this.setCanvasStyle("fill", b), this.renderPath(this.canvas, a, b, c, "fill"), this.hitDetection && (this.setHitContextStyle("fill", c, b), this.renderPath(this.hitContext, a, b, c, "fill"))); !1 !== b.stroke && (this.setCanvasStyle("stroke", b), this.renderPath(this.canvas,
+ a, b, c, "stroke"), this.hitDetection && (this.setHitContextStyle("stroke", c, b), this.renderPath(this.hitContext, a, b, c, "stroke"))); this.setCanvasStyle("reset")
+ }, renderPath: function(a, b, c, d, e) { b = b.components; c = b.length; a.beginPath(); d = this.getLocalXY(b[0]); var f = d[1]; if (!isNaN(d[0]) && !isNaN(f)) { a.moveTo(d[0], d[1]); for (d = 1; d < c; ++d)f = this.getLocalXY(b[d]), a.lineTo(f[0], f[1]); "fill" === e ? a.fill() : a.stroke() } }, drawPolygon: function(a, b, c) {
+ a = a.components; var d = a.length; this.drawLinearRing(a[0], b, c); for (var e = 1; e <
+ d; ++e)this.canvas.globalCompositeOperation = "destination-out", this.hitDetection && (this.hitContext.globalCompositeOperation = "destination-out"), this.drawLinearRing(a[e], OpenLayers.Util.applyDefaults({ stroke: !1, fillOpacity: 1 }, b), c), this.canvas.globalCompositeOperation = "source-over", this.hitDetection && (this.hitContext.globalCompositeOperation = "source-over"), this.drawLinearRing(a[e], OpenLayers.Util.applyDefaults({ fill: !1 }, b), c)
+ }, drawText: function(a, b) {
+ var c = this.getLocalXY(a); this.setCanvasStyle("reset");
+ this.canvas.fillStyle = b.fontColor; this.canvas.globalAlpha = b.fontOpacity || 1; var d = [b.fontStyle ? b.fontStyle : "normal", "normal", b.fontWeight ? b.fontWeight : "normal", b.fontSize ? b.fontSize : "1em", b.fontFamily ? b.fontFamily : "sans-serif"].join(" "), e = b.label.split("\n"), f = e.length; if (this.canvas.fillText) {
+ this.canvas.font = d; this.canvas.textAlign = OpenLayers.Renderer.Canvas.LABEL_ALIGN[b.labelAlign[0]] || "center"; this.canvas.textBaseline = OpenLayers.Renderer.Canvas.LABEL_ALIGN[b.labelAlign[1]] || "middle"; var g = OpenLayers.Renderer.Canvas.LABEL_FACTOR[b.labelAlign[1]];
+ null == g && (g = -.5); d = this.canvas.measureText("Mg").height || this.canvas.measureText("xx").width; c[1] += d * g * (f - 1); for (g = 0; g < f; g++)b.labelOutlineWidth && (this.canvas.save(), this.canvas.globalAlpha = b.labelOutlineOpacity || b.fontOpacity || 1, this.canvas.strokeStyle = b.labelOutlineColor, this.canvas.lineWidth = b.labelOutlineWidth, this.canvas.strokeText(e[g], c[0], c[1] + d * g + 1), this.canvas.restore()), this.canvas.fillText(e[g], c[0], c[1] + d * g)
+ } else if (this.canvas.mozDrawText) {
+ this.canvas.mozTextStyle = d; var h = OpenLayers.Renderer.Canvas.LABEL_FACTOR[b.labelAlign[0]];
+ null == h && (h = -.5); g = OpenLayers.Renderer.Canvas.LABEL_FACTOR[b.labelAlign[1]]; null == g && (g = -.5); d = this.canvas.mozMeasureText("xx"); c[1] += d * (1 + g * f); for (g = 0; g < f; g++) { var k = c[0] + h * this.canvas.mozMeasureText(e[g]), l = c[1] + g * d; this.canvas.translate(k, l); this.canvas.mozDrawText(e[g]); this.canvas.translate(-k, -l) }
+ } this.setCanvasStyle("reset")
+ }, getLocalXY: function(a) { var b = this.getResolution(), c = this.extent; return [(a.x - this.featureDx) / b + -c.left / b, c.top / b - a.y / b] }, clear: function() {
+ var a = this.root.height, b = this.root.width;
+ this.canvas.clearRect(0, 0, b, a); this.features = {}; this.hitDetection && this.hitContext.clearRect(0, 0, b, a)
+ }, getFeatureIdFromEvent: function(a) { var b; if (this.hitDetection && "none" !== this.root.style.display && !this.map.dragging && (a = a.xy, a = this.hitContext.getImageData(a.x | 0, a.y | 0, 1, 1).data, 255 === a[3] && (a = a[2] + 256 * (a[1] + 256 * a[0])))) { a = "OpenLayers_Feature_Vector_" + (a - 1 + this.hitOverflow); try { b = this.features[a][0] } catch (c) { } } return b }, eraseFeatures: function(a) {
+ OpenLayers.Util.isArray(a) || (a = [a]); for (var b = 0; b < a.length; ++b)delete this.features[a[b].id];
+ this.redraw()
+ }, redraw: function() {
+ if (!this.locked) {
+ var a = this.root.height, b = this.root.width; this.canvas.clearRect(0, 0, b, a); this.hitDetection && this.hitContext.clearRect(0, 0, b, a); var a = [], c, d, e = this.map.baseLayer && this.map.baseLayer.wrapDateLine && this.map.getMaxExtent(), f; for (f in this.features) this.features.hasOwnProperty(f) && (b = this.features[f][0], c = b.geometry, this.calculateFeatureDx(c.getBounds(), e), d = this.features[f][1], this.drawGeometry(c, d, b.id), d.label && a.push([b, d])); b = 0; for (c = a.length; b < c; ++b)f =
+ a[b], this.drawText(f[0].geometry.getCentroid(), f[1])
+ }
+ }, CLASS_NAME: "OpenLayers.Renderer.Canvas"
+}); OpenLayers.Renderer.Canvas.LABEL_ALIGN = { l: "left", r: "right", t: "top", b: "bottom" }; OpenLayers.Renderer.Canvas.LABEL_FACTOR = { l: 0, r: -1, t: 0, b: -1 }; OpenLayers.Renderer.Canvas.drawImageScaleFactor = null;
+OpenLayers.Format.OSM = OpenLayers.Class(OpenLayers.Format.XML, {
+ checkTags: !1, interestingTagsExclude: null, areaTags: null, initialize: function(a) {
+ var b = { interestingTagsExclude: "source source_ref source:ref history attribution created_by".split(" "), areaTags: "area building leisure tourism ruins historic landuse military natural sport".split(" ") }, b = OpenLayers.Util.extend(b, a), c = {}; for (a = 0; a < b.interestingTagsExclude.length; a++)c[b.interestingTagsExclude[a]] = !0; b.interestingTagsExclude = c; c = {}; for (a = 0; a < b.areaTags.length; a++)c[b.areaTags[a]] =
+ !0; b.areaTags = c; this.externalProjection = new OpenLayers.Projection("EPSG:4326"); OpenLayers.Format.XML.prototype.initialize.apply(this, [b])
+ }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); var b = this.getNodes(a), c = this.getWays(a); a = Array(c.length); for (var d = 0; d < c.length; d++) {
+ for (var e = Array(c[d].nodes.length), f = this.isWayArea(c[d]) ? 1 : 0, g = 0; g < c[d].nodes.length; g++) {
+ var h = b[c[d].nodes[g]], k = new OpenLayers.Geometry.Point(h.lon, h.lat); k.osm_id = parseInt(c[d].nodes[g]);
+ e[g] = k; h.used = !0
+ } h = f ? new OpenLayers.Geometry.Polygon(new OpenLayers.Geometry.LinearRing(e)) : new OpenLayers.Geometry.LineString(e); this.internalProjection && this.externalProjection && h.transform(this.externalProjection, this.internalProjection); e = new OpenLayers.Feature.Vector(h, c[d].tags); e.osm_id = parseInt(c[d].id); e.fid = "way." + e.osm_id; a[d] = e
+ } for (var l in b) {
+ h = b[l]; if (!h.used || this.checkTags) {
+ if (this.checkTags) { c = this.getTags(h.node, !0); if (h.used && !c[1]) continue; c = c[0] } else c = this.getTags(h.node); e =
+ new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(h.lon, h.lat), c); this.internalProjection && this.externalProjection && e.geometry.transform(this.externalProjection, this.internalProjection); e.osm_id = parseInt(l); e.fid = "node." + e.osm_id; a.push(e)
+ } h.node = null
+ } return a
+ }, getNodes: function(a) { a = a.getElementsByTagName("node"); for (var b = {}, c = 0; c < a.length; c++) { var d = a[c], e = d.getAttribute("id"); b[e] = { lat: d.getAttribute("lat"), lon: d.getAttribute("lon"), node: d } } return b }, getWays: function(a) {
+ a = a.getElementsByTagName("way");
+ for (var b = [], c = 0; c < a.length; c++) { var d = a[c], e = { id: d.getAttribute("id") }; e.tags = this.getTags(d); d = d.getElementsByTagName("nd"); e.nodes = Array(d.length); for (var f = 0; f < d.length; f++)e.nodes[f] = d[f].getAttribute("ref"); b.push(e) } return b
+ }, getTags: function(a, b) { for (var c = a.getElementsByTagName("tag"), d = {}, e = !1, f = 0; f < c.length; f++) { var g = c[f].getAttribute("k"); d[g] = c[f].getAttribute("v"); b && (this.interestingTagsExclude[g] || (e = !0)) } return b ? [d, e] : d }, isWayArea: function(a) {
+ var b = !1, c = !1; a.nodes[0] == a.nodes[a.nodes.length -
+ 1] && (b = !0); if (this.checkTags) for (var d in a.tags) if (this.areaTags[d]) { c = !0; break } return b && (this.checkTags ? c : !0)
+ }, write: function(a) {
+ OpenLayers.Util.isArray(a) || (a = [a]); this.osm_id = 1; this.created_nodes = {}; var b = this.createElementNS(null, "osm"); b.setAttribute("version", "0.5"); b.setAttribute("generator", "OpenLayers " + OpenLayers.VERSION_NUMBER); for (var c = a.length - 1; 0 <= c; c--)for (var d = this.createFeatureNodes(a[c]), e = 0; e < d.length; e++)b.appendChild(d[e]); return OpenLayers.Format.XML.prototype.write.apply(this,
+ [b])
+ }, createFeatureNodes: function(a) { var b = [], c = a.geometry.CLASS_NAME, c = c.substring(c.lastIndexOf(".") + 1), c = c.toLowerCase(); (c = this.createXML[c]) && (b = c.apply(this, [a])); return b }, createXML: {
+ point: function(a) {
+ var b = null, c = a.geometry ? a.geometry : a; this.internalProjection && this.externalProjection && (c = c.clone(), c.transform(this.internalProjection, this.externalProjection)); var d = !1; a.osm_id ? (b = a.osm_id, this.created_nodes[b] && (d = !0)) : (b = -this.osm_id, this.osm_id++); var e = d ? this.created_nodes[b] : this.createElementNS(null,
+ "node"); this.created_nodes[b] = e; e.setAttribute("id", b); e.setAttribute("lon", c.x); e.setAttribute("lat", c.y); a.attributes && this.serializeTags(a, e); this.setState(a, e); return d ? [] : [e]
+ }, linestring: function(a) {
+ var b, c = [], d = a.geometry; a.osm_id ? b = a.osm_id : (b = -this.osm_id, this.osm_id++); var e = this.createElementNS(null, "way"); e.setAttribute("id", b); for (b = 0; b < d.components.length; b++) {
+ var f = this.createXML.point.apply(this, [d.components[b]]); if (f.length) { var f = f[0], g = f.getAttribute("id"); c.push(f) } else g = d.components[b].osm_id,
+ f = this.created_nodes[g]; this.setState(a, f); f = this.createElementNS(null, "nd"); f.setAttribute("ref", g); e.appendChild(f)
+ } this.serializeTags(a, e); c.push(e); return c
+ }, polygon: function(a) { var b = OpenLayers.Util.extend({ area: "yes" }, a.attributes), b = new OpenLayers.Feature.Vector(a.geometry.components[0], b); b.osm_id = a.osm_id; return this.createXML.linestring.apply(this, [b]) }
+ }, serializeTags: function(a, b) {
+ for (var c in a.attributes) {
+ var d = this.createElementNS(null, "tag"); d.setAttribute("k", c); d.setAttribute("v",
+ a.attributes[c]); b.appendChild(d)
+ }
+ }, setState: function(a, b) { if (a.state) { var c = null; switch (a.state) { case OpenLayers.State.UPDATE: case OpenLayers.State.DELETE: c = "delete" }c && b.setAttribute("action", c) } }, CLASS_NAME: "OpenLayers.Format.OSM"
+});
+OpenLayers.Handler.Keyboard = OpenLayers.Class(OpenLayers.Handler, {
+ KEY_EVENTS: ["keydown", "keyup"], eventListener: null, observeElement: null, initialize: function(a, b, c) { OpenLayers.Handler.prototype.initialize.apply(this, arguments); this.eventListener = OpenLayers.Function.bindAsEventListener(this.handleKeyEvent, this) }, destroy: function() { this.deactivate(); this.eventListener = null; OpenLayers.Handler.prototype.destroy.apply(this, arguments) }, activate: function() {
+ if (OpenLayers.Handler.prototype.activate.apply(this,
+ arguments)) { this.observeElement = this.observeElement || document; for (var a = 0, b = this.KEY_EVENTS.length; a < b; a++)OpenLayers.Event.observe(this.observeElement, this.KEY_EVENTS[a], this.eventListener); return !0 } return !1
+ }, deactivate: function() { var a = !1; if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) { for (var a = 0, b = this.KEY_EVENTS.length; a < b; a++)OpenLayers.Event.stopObserving(this.observeElement, this.KEY_EVENTS[a], this.eventListener); a = !0 } return a }, handleKeyEvent: function(a) {
+ this.checkModifiers(a) &&
+ this.callback(a.type, [a])
+ }, CLASS_NAME: "OpenLayers.Handler.Keyboard"
+});
+OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
+ documentDrag: !1, geometryTypes: null, clickout: !0, toggle: !0, standalone: !1, layer: null, feature: null, vertex: null, vertices: null, virtualVertices: null, handlers: null, deleteCodes: null, virtualStyle: null, vertexRenderIntent: null, mode: null, createVertices: !0, modified: !1, radiusHandle: null, dragHandle: null, onModificationStart: function() { }, onModification: function() { }, onModificationEnd: function() { }, initialize: function(a, b) {
+ b = b || {}; this.layer = a; this.vertices =
+ []; this.virtualVertices = []; this.virtualStyle = OpenLayers.Util.extend({}, this.layer.style || this.layer.styleMap.createSymbolizer(null, b.vertexRenderIntent)); this.virtualStyle.fillOpacity = .3; this.virtualStyle.strokeOpacity = .3; this.deleteCodes = [46, 68]; this.mode = OpenLayers.Control.ModifyFeature.RESHAPE; OpenLayers.Control.prototype.initialize.apply(this, [b]); OpenLayers.Util.isArray(this.deleteCodes) || (this.deleteCodes = [this.deleteCodes]); var c = { documentDrag: this.documentDrag, stopDown: !1 }; this.handlers = {
+ keyboard: new OpenLayers.Handler.Keyboard(this,
+ { keydown: this.handleKeypress }), drag: new OpenLayers.Handler.Drag(this, { down: function(a) { this.vertex = null; (a = this.layer.getFeatureFromEvent(this.handlers.drag.evt)) ? this.dragStart(a) : this.clickout && (this._unselect = this.feature) }, move: function(a) { delete this._unselect; this.vertex && this.dragVertex(this.vertex, a) }, up: function() { this.handlers.drag.stopDown = !1; this._unselect && (this.unselectFeature(this._unselect), delete this._unselect) }, done: function(a) { this.vertex && this.dragComplete(this.vertex) } }, c)
+ }
+ },
+ destroy: function() { this.map && this.map.events.un({ removelayer: this.handleMapEvents, changelayer: this.handleMapEvents, scope: this }); this.layer = null; OpenLayers.Control.prototype.destroy.apply(this, []) }, activate: function() { this.moveLayerToTop(); this.map.events.on({ removelayer: this.handleMapEvents, changelayer: this.handleMapEvents, scope: this }); return this.handlers.keyboard.activate() && this.handlers.drag.activate() && OpenLayers.Control.prototype.activate.apply(this, arguments) }, deactivate: function() {
+ var a = !1;
+ OpenLayers.Control.prototype.deactivate.apply(this, arguments) && (this.moveLayerBack(), this.map.events.un({ removelayer: this.handleMapEvents, changelayer: this.handleMapEvents, scope: this }), this.layer.removeFeatures(this.vertices, { silent: !0 }), this.layer.removeFeatures(this.virtualVertices, { silent: !0 }), this.vertices = [], this.handlers.drag.deactivate(), this.handlers.keyboard.deactivate(), (a = this.feature) && a.geometry && a.layer && this.unselectFeature(a), a = !0); return a
+ }, beforeSelectFeature: function(a) {
+ return this.layer.events.triggerEvent("beforefeaturemodified",
+ { feature: a })
+ }, selectFeature: function(a) { if (!(this.feature === a || this.geometryTypes && -1 == OpenLayers.Util.indexOf(this.geometryTypes, a.geometry.CLASS_NAME))) { !1 !== this.beforeSelectFeature(a) && (this.feature && this.unselectFeature(this.feature), this.feature = a, this.layer.selectedFeatures.push(a), this.layer.drawFeature(a, "select"), this.modified = !1, this.resetVertices(), this.onModificationStart(this.feature)); var b = a.modified; !a.geometry || b && b.geometry || (this._originalGeometry = a.geometry.clone()) } }, unselectFeature: function(a) {
+ this.layer.removeFeatures(this.vertices,
+ { silent: !0 }); this.vertices = []; this.layer.destroyFeatures(this.virtualVertices, { silent: !0 }); this.virtualVertices = []; this.dragHandle && (this.layer.destroyFeatures([this.dragHandle], { silent: !0 }), delete this.dragHandle); this.radiusHandle && (this.layer.destroyFeatures([this.radiusHandle], { silent: !0 }), delete this.radiusHandle); this.layer.drawFeature(this.feature, "default"); this.feature = null; OpenLayers.Util.removeItem(this.layer.selectedFeatures, a); this.onModificationEnd(a); this.layer.events.triggerEvent("afterfeaturemodified",
+ { feature: a, modified: this.modified }); this.modified = !1
+ }, dragStart: function(a) { var b = "OpenLayers.Geometry.Point" == a.geometry.CLASS_NAME; this.standalone || (a._sketch || !b) && a._sketch || (this.toggle && this.feature === a && (this._unselect = a), this.selectFeature(a)); if (a._sketch || b) this.vertex = a, this.handlers.drag.stopDown = !0 }, dragVertex: function(a, b) {
+ var c = this.map.getLonLatFromViewPortPx(b), d = a.geometry; d.move(c.lon - d.x, c.lat - d.y); this.modified = !0; "OpenLayers.Geometry.Point" == this.feature.geometry.CLASS_NAME ?
+ this.layer.events.triggerEvent("vertexmodified", { vertex: a.geometry, feature: this.feature, pixel: b }) : (a._index ? (a.geometry.parent.addComponent(a.geometry, a._index), delete a._index, OpenLayers.Util.removeItem(this.virtualVertices, a), this.vertices.push(a)) : a == this.dragHandle ? (this.layer.removeFeatures(this.vertices, { silent: !0 }), this.vertices = [], this.radiusHandle && (this.layer.destroyFeatures([this.radiusHandle], { silent: !0 }), this.radiusHandle = null)) : a !== this.radiusHandle && this.layer.events.triggerEvent("vertexmodified",
+ { vertex: a.geometry, feature: this.feature, pixel: b }), 0 < this.virtualVertices.length && (this.layer.destroyFeatures(this.virtualVertices, { silent: !0 }), this.virtualVertices = []), this.layer.drawFeature(this.feature, this.standalone ? void 0 : "select")); this.layer.drawFeature(a)
+ }, dragComplete: function(a) { this.resetVertices(); this.setFeatureState(); this.onModification(this.feature); this.layer.events.triggerEvent("featuremodified", { feature: this.feature }) }, setFeatureState: function() {
+ if (this.feature.state != OpenLayers.State.INSERT &&
+ this.feature.state != OpenLayers.State.DELETE && (this.feature.state = OpenLayers.State.UPDATE, this.modified && this._originalGeometry)) { var a = this.feature; a.modified = OpenLayers.Util.extend(a.modified, { geometry: this._originalGeometry }); delete this._originalGeometry }
+ }, resetVertices: function() {
+ 0 < this.vertices.length && (this.layer.removeFeatures(this.vertices, { silent: !0 }), this.vertices = []); 0 < this.virtualVertices.length && (this.layer.removeFeatures(this.virtualVertices, { silent: !0 }), this.virtualVertices = []); this.dragHandle &&
+ (this.layer.destroyFeatures([this.dragHandle], { silent: !0 }), this.dragHandle = null); this.radiusHandle && (this.layer.destroyFeatures([this.radiusHandle], { silent: !0 }), this.radiusHandle = null); this.feature && "OpenLayers.Geometry.Point" != this.feature.geometry.CLASS_NAME && (this.mode & OpenLayers.Control.ModifyFeature.DRAG && this.collectDragHandle(), this.mode & (OpenLayers.Control.ModifyFeature.ROTATE | OpenLayers.Control.ModifyFeature.RESIZE) && this.collectRadiusHandle(), this.mode & OpenLayers.Control.ModifyFeature.RESHAPE &&
+ (this.mode & OpenLayers.Control.ModifyFeature.RESIZE || this.collectVertices()))
+ }, handleKeypress: function(a) {
+ var b = a.keyCode; this.feature && -1 != OpenLayers.Util.indexOf(this.deleteCodes, b) && (b = this.layer.getFeatureFromEvent(this.handlers.drag.evt)) && -1 != OpenLayers.Util.indexOf(this.vertices, b) && !this.handlers.drag.dragging && b.geometry.parent && (b.geometry.parent.removeComponent(b.geometry), this.layer.events.triggerEvent("vertexremoved", { vertex: b.geometry, feature: this.feature, pixel: a.xy }), this.layer.drawFeature(this.feature,
+ this.standalone ? void 0 : "select"), this.modified = !0, this.resetVertices(), this.setFeatureState(), this.onModification(this.feature), this.layer.events.triggerEvent("featuremodified", { feature: this.feature }))
+ }, collectVertices: function() {
+ function a(c) {
+ var d, e, f; if ("OpenLayers.Geometry.Point" == c.CLASS_NAME) e = new OpenLayers.Feature.Vector(c), e._sketch = !0, e.renderIntent = b.vertexRenderIntent, b.vertices.push(e); else {
+ f = c.components.length; "OpenLayers.Geometry.LinearRing" == c.CLASS_NAME && --f; for (d = 0; d < f; ++d)e = c.components[d],
+ "OpenLayers.Geometry.Point" == e.CLASS_NAME ? (e = new OpenLayers.Feature.Vector(e), e._sketch = !0, e.renderIntent = b.vertexRenderIntent, b.vertices.push(e)) : a(e); if (b.createVertices && "OpenLayers.Geometry.MultiPoint" != c.CLASS_NAME) for (d = 0, f = c.components.length; d < f - 1; ++d) {
+ e = c.components[d]; var g = c.components[d + 1]; "OpenLayers.Geometry.Point" == e.CLASS_NAME && "OpenLayers.Geometry.Point" == g.CLASS_NAME && (e = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point((e.x + g.x) / 2, (e.y + g.y) / 2), null, b.virtualStyle), e.geometry.parent =
+ c, e._index = d + 1, e._sketch = !0, b.virtualVertices.push(e))
+ }
+ }
+ } this.vertices = []; this.virtualVertices = []; var b = this; a.call(this, this.feature.geometry); this.layer.addFeatures(this.virtualVertices, { silent: !0 }); this.layer.addFeatures(this.vertices, { silent: !0 })
+ }, collectDragHandle: function() {
+ var a = this.feature.geometry, b = a.getBounds().getCenterLonLat(), b = new OpenLayers.Geometry.Point(b.lon, b.lat), c = new OpenLayers.Feature.Vector(b); b.move = function(b, c) {
+ OpenLayers.Geometry.Point.prototype.move.call(this, b, c); a.move(b,
+ c)
+ }; c._sketch = !0; this.dragHandle = c; this.dragHandle.renderIntent = this.vertexRenderIntent; this.layer.addFeatures([this.dragHandle], { silent: !0 })
+ }, collectRadiusHandle: function() {
+ var a = this.feature.geometry, b = a.getBounds(), c = b.getCenterLonLat(), d = new OpenLayers.Geometry.Point(c.lon, c.lat), b = new OpenLayers.Geometry.Point(b.right, b.bottom), c = new OpenLayers.Feature.Vector(b), e = this.mode & OpenLayers.Control.ModifyFeature.RESIZE, f = this.mode & OpenLayers.Control.ModifyFeature.RESHAPE, g = this.mode & OpenLayers.Control.ModifyFeature.ROTATE;
+ b.move = function(b, c) { OpenLayers.Geometry.Point.prototype.move.call(this, b, c); var l = this.x - d.x, m = this.y - d.y, n = l - b, p = m - c; if (g) { var q = Math.atan2(p, n), q = Math.atan2(m, l) - q, q = 180 / Math.PI * q; a.rotate(q, d) } if (e) { var r; f ? (m /= p, r = l / n / m) : (n = Math.sqrt(n * n + p * p), m = Math.sqrt(l * l + m * m) / n); a.resize(m, d, r) } }; c._sketch = !0; this.radiusHandle = c; this.radiusHandle.renderIntent = this.vertexRenderIntent; this.layer.addFeatures([this.radiusHandle], { silent: !0 })
+ }, setMap: function(a) {
+ this.handlers.drag.setMap(a); OpenLayers.Control.prototype.setMap.apply(this,
+ arguments)
+ }, handleMapEvents: function(a) { "removelayer" != a.type && "order" != a.property || this.moveLayerToTop() }, moveLayerToTop: function() { var a = Math.max(this.map.Z_INDEX_BASE.Feature - 1, this.layer.getZIndex()) + 1; this.layer.setZIndex(a) }, moveLayerBack: function() { var a = this.layer.getZIndex() - 1; a >= this.map.Z_INDEX_BASE.Feature ? this.layer.setZIndex(a) : this.map.setLayerZIndex(this.layer, this.map.getLayerIndex(this.layer)) }, CLASS_NAME: "OpenLayers.Control.ModifyFeature"
+});
+OpenLayers.Control.ModifyFeature.RESHAPE = 1; OpenLayers.Control.ModifyFeature.RESIZE = 2; OpenLayers.Control.ModifyFeature.ROTATE = 4; OpenLayers.Control.ModifyFeature.DRAG = 8;
+OpenLayers.Layer.Bing = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+ key: null, serverResolutions: [156543.03390625, 78271.516953125, 39135.7584765625, 19567.87923828125, 9783.939619140625, 4891.9698095703125, 2445.9849047851562, 1222.9924523925781, 611.4962261962891, 305.74811309814453, 152.87405654907226, 76.43702827453613, 38.218514137268066, 19.109257068634033, 9.554628534317017, 4.777314267158508, 2.388657133579254, 1.194328566789627, .5971642833948135, .29858214169740677, .14929107084870338, .07464553542435169], attributionTemplate: '\x3cspan class\x3d"olBingAttribution ${type}"\x3e\x3cdiv\x3e\x3ca target\x3d"_blank" href\x3d"http://www.bing.com/maps/"\x3e\x3cimg src\x3d"${logo}" /\x3e\x3c/a\x3e\x3c/div\x3e${copyrights}\x3ca style\x3d"white-space: nowrap" target\x3d"_blank" href\x3d"http://www.microsoft.com/maps/product/terms.html"\x3eTerms of Use\x3c/a\x3e\x3c/span\x3e',
+ metadata: null, protocolRegex: /^http:/i, type: "Road", culture: "en-US", metadataParams: null, tileOptions: null, protocol: ~window.location.href.indexOf("http") ? "" : "http:", initialize: function(a) { a = OpenLayers.Util.applyDefaults({ sphericalMercator: !0 }, a); OpenLayers.Layer.XYZ.prototype.initialize.apply(this, [a.name || "Bing " + (a.type || this.type), null, a]); this.tileOptions = OpenLayers.Util.extend({ crossOriginKeyword: "anonymous" }, this.options.tileOptions); this.loadMetadata() }, loadMetadata: function() {
+ this._callbackId =
+ "_callback_" + this.id.replace(/\./g, "_"); window[this._callbackId] = OpenLayers.Function.bind(OpenLayers.Layer.Bing.processMetadata, this); var a = OpenLayers.Util.applyDefaults({ key: this.key, jsonp: this._callbackId, include: "ImageryProviders" }, this.metadataParams), a = this.protocol + "//dev.virtualearth.net/REST/v1/Imagery/Metadata/" + this.type + "?" + OpenLayers.Util.getParameterString(a), b = document.createElement("script"); b.type = "text/javascript"; b.src = a; b.id = this._callbackId; document.getElementsByTagName("head")[0].appendChild(b)
+ },
+ initLayer: function() {
+ var a = this.metadata.resourceSets[0].resources[0], b = a.imageUrl.replace("{quadkey}", "${quadkey}"), b = b.replace("{culture}", this.culture), b = b.replace(this.protocolRegex, this.protocol); this.url = []; for (var c = 0; c < a.imageUrlSubdomains.length; ++c)this.url.push(b.replace("{subdomain}", a.imageUrlSubdomains[c])); this.addOptions({ maxResolution: Math.min(this.serverResolutions[a.zoomMin], this.maxResolution || Number.POSITIVE_INFINITY), numZoomLevels: Math.min(a.zoomMax + 1 - a.zoomMin, this.numZoomLevels) },
+ !0); this.isBaseLayer || this.redraw(); this.updateAttribution()
+ }, getURL: function(a) { if (this.url) { var b = this.getXYZ(a); a = b.x; for (var c = b.y, b = b.z, d = [], e = b; 0 < e; --e) { var f = "0", g = 1 << e - 1; 0 != (a & g) && f++; 0 != (c & g) && (f++, f++); d.push(f) } d = d.join(""); a = this.selectUrl("" + a + c + b, this.url); return OpenLayers.String.format(a, { quadkey: d }) } }, updateAttribution: function() {
+ var a = this.metadata; if (a.resourceSets && this.map && this.map.center) {
+ var b = a.resourceSets[0].resources[0], c = this.map.getExtent().transform(this.map.getProjectionObject(),
+ new OpenLayers.Projection("EPSG:4326")), d = b.imageryProviders || [], e = OpenLayers.Util.indexOf(this.serverResolutions, this.getServerResolution()), b = "", f, g, h, k, l, m, n; g = 0; for (h = d.length; g < h; ++g)for (f = d[g], k = 0, l = f.coverageAreas.length; k < l; ++k)n = f.coverageAreas[k], m = OpenLayers.Bounds.fromArray(n.bbox, !0), c.intersectsBounds(m) && e <= n.zoomMax && e >= n.zoomMin && (b += f.attribution + " "); a = a.brandLogoUri.replace(this.protocolRegex, this.protocol); this.attribution = OpenLayers.String.format(this.attributionTemplate, {
+ type: this.type.toLowerCase(),
+ logo: a, copyrights: b
+ }); this.map && this.map.events.triggerEvent("changelayer", { layer: this, property: "attribution" })
+ }
+ }, setMap: function() { OpenLayers.Layer.XYZ.prototype.setMap.apply(this, arguments); this.map.events.register("moveend", this, this.updateAttribution) }, clone: function(a) { null == a && (a = new OpenLayers.Layer.Bing(this.options)); return OpenLayers.Layer.XYZ.prototype.clone.apply(this, [a]) }, destroy: function() {
+ this.map && this.map.events.unregister("moveend", this, this.updateAttribution); OpenLayers.Layer.XYZ.prototype.destroy.apply(this,
+ arguments)
+ }, CLASS_NAME: "OpenLayers.Layer.Bing"
+}); OpenLayers.Layer.Bing.processMetadata = function(a) { this.metadata = a; this.initLayer(); a = document.getElementById(this._callbackId); a.parentNode.removeChild(a); window[this._callbackId] = void 0; delete this._callbackId };
+OpenLayers.StyleMap = OpenLayers.Class({
+ styles: null, extendDefault: !0, initialize: function(a, b) {
+ this.styles = { "default": new OpenLayers.Style(OpenLayers.Feature.Vector.style["default"]), select: new OpenLayers.Style(OpenLayers.Feature.Vector.style.select), temporary: new OpenLayers.Style(OpenLayers.Feature.Vector.style.temporary), "delete": new OpenLayers.Style(OpenLayers.Feature.Vector.style["delete"]) }; if (a instanceof OpenLayers.Style) this.styles["default"] = a, this.styles.select = a, this.styles.temporary = a, this.styles["delete"] =
+ a; else if ("object" == typeof a) for (var c in a) if (a[c] instanceof OpenLayers.Style) this.styles[c] = a[c]; else if ("object" == typeof a[c]) this.styles[c] = new OpenLayers.Style(a[c]); else { this.styles["default"] = new OpenLayers.Style(a); this.styles.select = new OpenLayers.Style(a); this.styles.temporary = new OpenLayers.Style(a); this.styles["delete"] = new OpenLayers.Style(a); break } OpenLayers.Util.extend(this, b)
+ }, destroy: function() { for (var a in this.styles) this.styles[a].destroy(); this.styles = null }, createSymbolizer: function(a,
+ b) { a || (a = new OpenLayers.Feature.Vector); this.styles[b] || (b = "default"); a.renderIntent = b; var c = {}; this.extendDefault && "default" != b && (c = this.styles["default"].createSymbolizer(a)); return OpenLayers.Util.extend(c, this.styles[b].createSymbolizer(a)) }, addUniqueValueRules: function(a, b, c, d) { var e = [], f; for (f in c) e.push(new OpenLayers.Rule({ symbolizer: c[f], context: d, filter: new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.EQUAL_TO, property: b, value: f }) })); this.styles[a].addRules(e) }, CLASS_NAME: "OpenLayers.StyleMap"
+});
+OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
+ isBaseLayer: !1, isFixed: !1, features: null, filter: null, selectedFeatures: null, unrenderedFeatures: null, reportError: !0, style: null, styleMap: null, strategies: null, protocol: null, renderers: ["SVG", "VML", "Canvas"], renderer: null, rendererOptions: null, geometryType: null, drawn: !1, ratio: 1, initialize: function(a, b) {
+ OpenLayers.Layer.prototype.initialize.apply(this, arguments); this.renderer && this.renderer.supported() || this.assignRenderer(); this.renderer && this.renderer.supported() ||
+ (this.renderer = null, this.displayError()); this.styleMap || (this.styleMap = new OpenLayers.StyleMap); this.features = []; this.selectedFeatures = []; this.unrenderedFeatures = {}; if (this.strategies) for (var c = 0, d = this.strategies.length; c < d; c++)this.strategies[c].setLayer(this)
+ }, destroy: function() {
+ if (this.strategies) { var a, b, c; b = 0; for (c = this.strategies.length; b < c; b++)a = this.strategies[b], a.autoDestroy && a.destroy(); this.strategies = null } this.protocol && (this.protocol.autoDestroy && this.protocol.destroy(), this.protocol =
+ null); this.destroyFeatures(); this.unrenderedFeatures = this.selectedFeatures = this.features = null; this.renderer && this.renderer.destroy(); this.drawn = this.geometryType = this.renderer = null; OpenLayers.Layer.prototype.destroy.apply(this, arguments)
+ }, clone: function(a) { null == a && (a = new OpenLayers.Layer.Vector(this.name, this.getOptions())); a = OpenLayers.Layer.prototype.clone.apply(this, [a]); for (var b = this.features, c = b.length, d = Array(c), e = 0; e < c; ++e)d[e] = b[e].clone(); a.features = d; return a }, refresh: function(a) {
+ this.calculateInRange() &&
+ this.visibility && this.events.triggerEvent("refresh", a)
+ }, assignRenderer: function() { for (var a = 0, b = this.renderers.length; a < b; a++) { var c = this.renderers[a]; if ((c = "function" == typeof c ? c : OpenLayers.Renderer[c]) && c.prototype.supported()) { this.renderer = new c(this.div, this.rendererOptions); break } } }, displayError: function() { this.reportError && OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported", { renderers: this.renderers.join("\n") })) }, setMap: function(a) {
+ OpenLayers.Layer.prototype.setMap.apply(this,
+ arguments); if (this.renderer) { this.renderer.map = this.map; var b = this.map.getSize(); b.w *= this.ratio; b.h *= this.ratio; this.renderer.setSize(b) } else this.map.removeLayer(this)
+ }, afterAdd: function() { if (this.strategies) { var a, b, c; b = 0; for (c = this.strategies.length; b < c; b++)a = this.strategies[b], a.autoActivate && a.activate() } }, removeMap: function(a) { this.drawn = !1; if (this.strategies) { var b, c; b = 0; for (c = this.strategies.length; b < c; b++)a = this.strategies[b], a.autoActivate && a.deactivate() } }, onMapResize: function() {
+ OpenLayers.Layer.prototype.onMapResize.apply(this,
+ arguments); var a = this.map.getSize(); a.w *= this.ratio; a.h *= this.ratio; this.renderer.setSize(a)
+ }, moveTo: function(a, b, c) {
+ OpenLayers.Layer.prototype.moveTo.apply(this, arguments); var d = !0; if (!c) {
+ this.renderer.root.style.visibility = "hidden"; var d = this.map.getSize(), e = d.w, d = d.h, e = e / 2 * this.ratio - e / 2, d = d / 2 * this.ratio - d / 2, e = e + this.map.layerContainerOriginPx.x, e = -Math.round(e), d = d + this.map.layerContainerOriginPx.y, d = -Math.round(d); this.div.style.left = e + "px"; this.div.style.top = d + "px"; e = this.map.getExtent().scale(this.ratio);
+ d = this.renderer.setExtent(e, b); this.renderer.root.style.visibility = "visible"; !0 === OpenLayers.IS_GECKO && (this.div.scrollLeft = this.div.scrollLeft); if (!b && d) for (var f in this.unrenderedFeatures) e = this.unrenderedFeatures[f], this.drawFeature(e)
+ } if (!this.drawn || b || !d) for (this.drawn = !0, f = 0, d = this.features.length; f < d; f++)this.renderer.locked = f !== d - 1, e = this.features[f], this.drawFeature(e)
+ }, display: function(a) {
+ OpenLayers.Layer.prototype.display.apply(this, arguments); var b = this.div.style.display; b != this.renderer.root.style.display &&
+ (this.renderer.root.style.display = b)
+ }, addFeatures: function(a, b) {
+ OpenLayers.Util.isArray(a) || (a = [a]); var c = !b || !b.silent; if (c) { var d = { features: a }; if (!1 === this.events.triggerEvent("beforefeaturesadded", d)) return; a = d.features } for (var d = [], e = 0, f = a.length; e < f; e++) {
+ this.renderer.locked = e != a.length - 1 ? !0 : !1; var g = a[e]; if (this.geometryType && !(g.geometry instanceof this.geometryType)) throw new TypeError("addFeatures: component should be an " + this.geometryType.prototype.CLASS_NAME); g.layer = this; !g.style && this.style &&
+ (g.style = OpenLayers.Util.extend({}, this.style)); if (c) { if (!1 === this.events.triggerEvent("beforefeatureadded", { feature: g })) continue; this.preFeatureInsert(g) } d.push(g); this.features.push(g); this.drawFeature(g); c && (this.events.triggerEvent("featureadded", { feature: g }), this.onFeatureInsert(g))
+ } c && this.events.triggerEvent("featuresadded", { features: d })
+ }, removeFeatures: function(a, b) {
+ if (a && 0 !== a.length) {
+ if (a === this.features) return this.removeAllFeatures(b); OpenLayers.Util.isArray(a) || (a = [a]); a === this.selectedFeatures &&
+ (a = a.slice()); var c = !b || !b.silent; c && this.events.triggerEvent("beforefeaturesremoved", { features: a }); for (var d = a.length - 1; 0 <= d; d--) {
+ this.renderer.locked = 0 != d && a[d - 1].geometry ? !0 : !1; var e = a[d]; delete this.unrenderedFeatures[e.id]; c && this.events.triggerEvent("beforefeatureremoved", { feature: e }); this.features = OpenLayers.Util.removeItem(this.features, e); e.layer = null; e.geometry && this.renderer.eraseFeatures(e); -1 != OpenLayers.Util.indexOf(this.selectedFeatures, e) && OpenLayers.Util.removeItem(this.selectedFeatures,
+ e); c && this.events.triggerEvent("featureremoved", { feature: e })
+ } c && this.events.triggerEvent("featuresremoved", { features: a })
+ }
+ }, removeAllFeatures: function(a) {
+ a = !a || !a.silent; var b = this.features; a && this.events.triggerEvent("beforefeaturesremoved", { features: b }); for (var c, d = b.length - 1; 0 <= d; d--)c = b[d], a && this.events.triggerEvent("beforefeatureremoved", { feature: c }), c.layer = null, a && this.events.triggerEvent("featureremoved", { feature: c }); this.renderer.clear(); this.features = []; this.unrenderedFeatures = {}; this.selectedFeatures =
+ []; a && this.events.triggerEvent("featuresremoved", { features: b })
+ }, destroyFeatures: function(a, b) { void 0 == a && (a = this.features); if (a) { this.removeFeatures(a, b); for (var c = a.length - 1; 0 <= c; c--)a[c].destroy() } }, drawFeature: function(a, b) { if (this.drawn) { if ("object" != typeof b) { b || a.state !== OpenLayers.State.DELETE || (b = "delete"); var c = b || a.renderIntent; (b = a.style || this.style) || (b = this.styleMap.createSymbolizer(a, c)) } c = this.renderer.drawFeature(a, b); !1 === c || null === c ? this.unrenderedFeatures[a.id] = a : delete this.unrenderedFeatures[a.id] } },
+ eraseFeatures: function(a) { this.renderer.eraseFeatures(a) }, getFeatureFromEvent: function(a) { if (!this.renderer) throw Error("getFeatureFromEvent called on layer with no renderer. This usually means you destroyed a layer, but not some handler which is associated with it."); var b = null; (a = this.renderer.getFeatureIdFromEvent(a)) && (b = "string" === typeof a ? this.getFeatureById(a) : a); return b }, getFeatureBy: function(a, b) {
+ for (var c = null, d = 0, e = this.features.length; d < e; ++d)if (this.features[d][a] == b) {
+ c = this.features[d];
+ break
+ } return c
+ }, getFeatureById: function(a) { return this.getFeatureBy("id", a) }, getFeatureByFid: function(a) { return this.getFeatureBy("fid", a) }, getFeaturesByAttribute: function(a, b) { var c, d, e = this.features.length, f = []; for (c = 0; c < e; c++)(d = this.features[c]) && d.attributes && d.attributes[a] === b && f.push(d); return f }, onFeatureInsert: function(a) { }, preFeatureInsert: function(a) { }, getDataExtent: function() {
+ var a = null, b = this.features; if (b && 0 < b.length) for (var c = null, d = 0, e = b.length; d < e; d++)if (c = b[d].geometry) null === a &&
+ (a = new OpenLayers.Bounds), a.extend(c.getBounds()); return a
+ }, CLASS_NAME: "OpenLayers.Layer.Vector"
+});
+OpenLayers.Layer.PointGrid = OpenLayers.Class(OpenLayers.Layer.Vector, {
+ dx: null, dy: null, ratio: 1.5, maxFeatures: 250, rotation: 0, origin: null, gridBounds: null, initialize: function(a) { a = a || {}; OpenLayers.Layer.Vector.prototype.initialize.apply(this, [a.name, a]) }, setMap: function(a) { OpenLayers.Layer.Vector.prototype.setMap.apply(this, arguments); a.events.register("moveend", this, this.onMoveEnd) }, removeMap: function(a) {
+ a.events.unregister("moveend", this, this.onMoveEnd); OpenLayers.Layer.Vector.prototype.removeMap.apply(this,
+ arguments)
+ }, setRatio: function(a) { this.ratio = a; this.updateGrid(!0) }, setMaxFeatures: function(a) { this.maxFeatures = a; this.updateGrid(!0) }, setSpacing: function(a, b) { this.dx = a; this.dy = b || a; this.updateGrid(!0) }, setOrigin: function(a) { this.origin = a; this.updateGrid(!0) }, getOrigin: function() { this.origin || (this.origin = this.map.getExtent().getCenterLonLat()); return this.origin }, setRotation: function(a) { this.rotation = a; this.updateGrid(!0) }, onMoveEnd: function() { this.updateGrid() }, getViewBounds: function() {
+ var a = this.map.getExtent();
+ if (this.rotation) { var b = this.getOrigin(), b = new OpenLayers.Geometry.Point(b.lon, b.lat), a = a.toGeometry(); a.rotate(-this.rotation, b); a = a.getBounds() } return a
+ }, updateGrid: function(a) {
+ if (a || this.invalidBounds()) {
+ var b = this.getViewBounds(), c = this.getOrigin(); a = new OpenLayers.Geometry.Point(c.lon, c.lat); var d = b.getWidth(), e = b.getHeight(), f = d / e, g = Math.sqrt(this.dx * this.dy * this.maxFeatures / f), d = Math.min(d * this.ratio, g * f), e = Math.min(e * this.ratio, g), b = b.getCenterLonLat(); this.gridBounds = new OpenLayers.Bounds(b.lon -
+ d / 2, b.lat - e / 2, b.lon + d / 2, b.lat + e / 2); for (var b = Math.floor(e / this.dy), d = Math.floor(d / this.dx), e = c.lon + this.dx * Math.ceil((this.gridBounds.left - c.lon) / this.dx), c = c.lat + this.dy * Math.ceil((this.gridBounds.bottom - c.lat) / this.dy), g = Array(b * d), h, k = 0; k < d; ++k)for (var f = e + k * this.dx, l = 0; l < b; ++l)h = c + l * this.dy, h = new OpenLayers.Geometry.Point(f, h), this.rotation && h.rotate(this.rotation, a), g[k * b + l] = new OpenLayers.Feature.Vector(h); this.destroyFeatures(this.features, { silent: !0 }); this.addFeatures(g, { silent: !0 })
+ }
+ }, invalidBounds: function() {
+ return !this.gridBounds ||
+ !this.gridBounds.containsBounds(this.getViewBounds())
+ }, CLASS_NAME: "OpenLayers.Layer.PointGrid"
+});
+OpenLayers.Handler.MouseWheel = OpenLayers.Class(OpenLayers.Handler, {
+ wheelListener: null, interval: 0, maxDelta: Number.POSITIVE_INFINITY, delta: 0, cumulative: !0, initialize: function(a, b, c) { OpenLayers.Handler.prototype.initialize.apply(this, arguments); this.wheelListener = OpenLayers.Function.bindAsEventListener(this.onWheelEvent, this) }, destroy: function() { OpenLayers.Handler.prototype.destroy.apply(this, arguments); this.wheelListener = null }, onWheelEvent: function(a) {
+ if (this.map && this.checkModifiers(a)) {
+ for (var b =
+ !1, c = !1, d = !1, e = OpenLayers.Event.element(a); null != e && !d && !b;) { if (!b) try { var f, b = (f = e.currentStyle ? e.currentStyle.overflow : document.defaultView.getComputedStyle(e, null).getPropertyValue("overflow")) && "auto" == f || "scroll" == f } catch (g) { } if (!c && (c = OpenLayers.Element.hasClass(e, "olScrollable"), !c)) for (var d = 0, h = this.map.layers.length; d < h; d++) { var k = this.map.layers[d]; if (e == k.div || e == k.pane) { c = !0; break } } d = e == this.map.div; e = e.parentNode } if (!b && d) {
+ if (c) if (b = 0, a.wheelDelta ? (b = a.wheelDelta, 0 === b % 160 && (b *= .75),
+ b /= 120) : a.detail && (b = -(a.detail / Math.abs(a.detail))), this.delta += b, window.clearTimeout(this._timeoutId), this.interval && Math.abs(this.delta) < this.maxDelta) { var l = OpenLayers.Util.extend({}, a); this._timeoutId = window.setTimeout(OpenLayers.Function.bind(function() { this.wheelZoom(l) }, this), this.interval) } else this.wheelZoom(a); OpenLayers.Event.stop(a)
+ }
+ }
+ }, wheelZoom: function(a) {
+ var b = this.delta; this.delta = 0; b && (a.xy = this.map.events.getMousePosition(a), 0 > b ? this.callback("down", [a, this.cumulative ? Math.max(-this.maxDelta,
+ b) : -1]) : this.callback("up", [a, this.cumulative ? Math.min(this.maxDelta, b) : 1]))
+ }, activate: function(a) { if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) { var b = this.wheelListener; OpenLayers.Event.observe(window, "DOMMouseScroll", b); OpenLayers.Event.observe(window, "mousewheel", b); OpenLayers.Event.observe(document, "mousewheel", b); return !0 } return !1 }, deactivate: function(a) {
+ if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+ var b = this.wheelListener; OpenLayers.Event.stopObserving(window,
+ "DOMMouseScroll", b); OpenLayers.Event.stopObserving(window, "mousewheel", b); OpenLayers.Event.stopObserving(document, "mousewheel", b); return !0
+ } return !1
+ }, CLASS_NAME: "OpenLayers.Handler.MouseWheel"
+}); OpenLayers.Symbolizer = OpenLayers.Class({ zIndex: 0, initialize: function(a) { OpenLayers.Util.extend(this, a) }, clone: function() { return new (eval(this.CLASS_NAME))(OpenLayers.Util.extend({}, this)) }, CLASS_NAME: "OpenLayers.Symbolizer" });
+OpenLayers.Symbolizer.Raster = OpenLayers.Class(OpenLayers.Symbolizer, { initialize: function(a) { OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments) }, CLASS_NAME: "OpenLayers.Symbolizer.Raster" });
+OpenLayers.Rule = OpenLayers.Class({
+ id: null, name: null, title: null, description: null, context: null, filter: null, elseFilter: !1, symbolizer: null, symbolizers: null, minScaleDenominator: null, maxScaleDenominator: null, initialize: function(a) { this.symbolizer = {}; OpenLayers.Util.extend(this, a); this.symbolizers && delete this.symbolizer; this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_") }, destroy: function() { for (var a in this.symbolizer) this.symbolizer[a] = null; this.symbolizer = null; delete this.symbolizers }, evaluate: function(a) {
+ var b =
+ this.getContext(a), c = !0; if (this.minScaleDenominator || this.maxScaleDenominator) var d = a.layer.map.getScale(); this.minScaleDenominator && (c = d >= OpenLayers.Style.createLiteral(this.minScaleDenominator, b)); c && this.maxScaleDenominator && (c = d < OpenLayers.Style.createLiteral(this.maxScaleDenominator, b)); c && this.filter && (c = "OpenLayers.Filter.FeatureId" == this.filter.CLASS_NAME ? this.filter.evaluate(a) : this.filter.evaluate(b)); return c
+ }, getContext: function(a) {
+ var b = this.context; b || (b = a.attributes || a.data); "function" ==
+ typeof this.context && (b = this.context(a)); return b
+ }, clone: function() {
+ var a = OpenLayers.Util.extend({}, this); if (this.symbolizers) { var b = this.symbolizers.length; a.symbolizers = Array(b); for (var c = 0; c < b; ++c)a.symbolizers[c] = this.symbolizers[c].clone() } else { a.symbolizer = {}; for (var d in this.symbolizer) b = this.symbolizer[d], c = typeof b, "object" === c ? a.symbolizer[d] = OpenLayers.Util.extend({}, b) : "string" === c && (a.symbolizer[d] = b) } a.filter = this.filter && this.filter.clone(); a.context = this.context && OpenLayers.Util.extend({},
+ this.context); return new OpenLayers.Rule(a)
+ }, CLASS_NAME: "OpenLayers.Rule"
+}); OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { profile: null, defaultVersion: "1.0.0", stringifyOutput: !0, namedLayersAsArray: !1, CLASS_NAME: "OpenLayers.Format.SLD" }); OpenLayers.Symbolizer.Polygon = OpenLayers.Class(OpenLayers.Symbolizer, { initialize: function(a) { OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments) }, CLASS_NAME: "OpenLayers.Symbolizer.Polygon" });
+OpenLayers.Format.GML.v2 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
+ schemaLocation: "http://www.opengis.net/gml http://schemas.opengis.net/gml/2.1.2/feature.xsd", initialize: function(a) { OpenLayers.Format.GML.Base.prototype.initialize.apply(this, [a]) }, readers: {
+ gml: OpenLayers.Util.applyDefaults({
+ outerBoundaryIs: function(a, b) { var c = {}; this.readChildNodes(a, c); b.outer = c.components[0] }, innerBoundaryIs: function(a, b) { var c = {}; this.readChildNodes(a, c); b.inner.push(c.components[0]) }, Box: function(a, b) {
+ var c =
+ {}; this.readChildNodes(a, c); b.components || (b.components = []); var d = c.points[0], c = c.points[1]; b.components.push(new OpenLayers.Bounds(d.x, d.y, c.x, c.y))
+ }
+ }, OpenLayers.Format.GML.Base.prototype.readers.gml), feature: OpenLayers.Format.GML.Base.prototype.readers.feature, wfs: OpenLayers.Format.GML.Base.prototype.readers.wfs
+ }, write: function(a) {
+ var b; b = OpenLayers.Util.isArray(a) ? "wfs:FeatureCollection" : "gml:featureMember"; a = this.writeNode(b, a); this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation);
+ return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+ }, writers: {
+ gml: OpenLayers.Util.applyDefaults({
+ Point: function(a) { var b = this.createElementNSPlus("gml:Point"); this.writeNode("coordinates", [a], b); return b }, coordinates: function(a) { for (var b = a.length, c = Array(b), d, e = 0; e < b; ++e)d = a[e], c[e] = this.xy ? d.x + "," + d.y : d.y + "," + d.x, void 0 != d.z && (c[e] += "," + d.z); return this.createElementNSPlus("gml:coordinates", { attributes: { decimal: ".", cs: ",", ts: " " }, value: 1 == b ? c[0] : c.join(" ") }) }, LineString: function(a) {
+ var b =
+ this.createElementNSPlus("gml:LineString"); this.writeNode("coordinates", a.components, b); return b
+ }, Polygon: function(a) { var b = this.createElementNSPlus("gml:Polygon"); this.writeNode("outerBoundaryIs", a.components[0], b); for (var c = 1; c < a.components.length; ++c)this.writeNode("innerBoundaryIs", a.components[c], b); return b }, outerBoundaryIs: function(a) { var b = this.createElementNSPlus("gml:outerBoundaryIs"); this.writeNode("LinearRing", a, b); return b }, innerBoundaryIs: function(a) {
+ var b = this.createElementNSPlus("gml:innerBoundaryIs");
+ this.writeNode("LinearRing", a, b); return b
+ }, LinearRing: function(a) { var b = this.createElementNSPlus("gml:LinearRing"); this.writeNode("coordinates", a.components, b); return b }, Box: function(a) { var b = this.createElementNSPlus("gml:Box"); this.writeNode("coordinates", [{ x: a.left, y: a.bottom }, { x: a.right, y: a.top }], b); this.srsName && b.setAttribute("srsName", this.srsName); return b }
+ }, OpenLayers.Format.GML.Base.prototype.writers.gml), feature: OpenLayers.Format.GML.Base.prototype.writers.feature, wfs: OpenLayers.Format.GML.Base.prototype.writers.wfs
+ },
+ CLASS_NAME: "OpenLayers.Format.GML.v2"
+});
+OpenLayers.Format.Filter.v1_0_0 = OpenLayers.Class(OpenLayers.Format.GML.v2, OpenLayers.Format.Filter.v1, {
+ VERSION: "1.0.0", schemaLocation: "http://www.opengis.net/ogc/filter/1.0.0/filter.xsd", initialize: function(a) { OpenLayers.Format.GML.v2.prototype.initialize.apply(this, [a]) }, readers: {
+ ogc: OpenLayers.Util.applyDefaults({
+ PropertyIsEqualTo: function(a, b) { var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.EQUAL_TO }); this.readChildNodes(a, c); b.filters.push(c) }, PropertyIsNotEqualTo: function(a,
+ b) { var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO }); this.readChildNodes(a, c); b.filters.push(c) }, PropertyIsLike: function(a, b) { var c = new OpenLayers.Filter.Comparison({ type: OpenLayers.Filter.Comparison.LIKE }); this.readChildNodes(a, c); var d = a.getAttribute("wildCard"), e = a.getAttribute("singleChar"), f = a.getAttribute("escape"); c.value2regex(d, e, f); b.filters.push(c) }
+ }, OpenLayers.Format.Filter.v1.prototype.readers.ogc), gml: OpenLayers.Format.GML.v2.prototype.readers.gml,
+ feature: OpenLayers.Format.GML.v2.prototype.readers.feature
+ }, writers: {
+ ogc: OpenLayers.Util.applyDefaults({
+ PropertyIsEqualTo: function(a) { var b = this.createElementNSPlus("ogc:PropertyIsEqualTo"); this.writeNode("PropertyName", a, b); this.writeOgcExpression(a.value, b); return b }, PropertyIsNotEqualTo: function(a) { var b = this.createElementNSPlus("ogc:PropertyIsNotEqualTo"); this.writeNode("PropertyName", a, b); this.writeOgcExpression(a.value, b); return b }, PropertyIsLike: function(a) {
+ var b = this.createElementNSPlus("ogc:PropertyIsLike",
+ { attributes: { wildCard: "*", singleChar: ".", escape: "!" } }); this.writeNode("PropertyName", a, b); this.writeNode("Literal", a.regex2value(), b); return b
+ }, BBOX: function(a) { var b = this.createElementNSPlus("ogc:BBOX"); a.property && this.writeNode("PropertyName", a, b); var c = this.writeNode("gml:Box", a.value, b); a.projection && c.setAttribute("srsName", a.projection); return b }
+ }, OpenLayers.Format.Filter.v1.prototype.writers.ogc), gml: OpenLayers.Format.GML.v2.prototype.writers.gml, feature: OpenLayers.Format.GML.v2.prototype.writers.feature
+ },
+ writeSpatial: function(a, b) { var c = this.createElementNSPlus("ogc:" + b); this.writeNode("PropertyName", a, c); if (a.value instanceof OpenLayers.Filter.Function) this.writeNode("Function", a.value, c); else { var d; d = a.value instanceof OpenLayers.Geometry ? this.writeNode("feature:_geometry", a.value).firstChild : this.writeNode("gml:Box", a.value); a.projection && d.setAttribute("srsName", a.projection); c.appendChild(d) } return c }, CLASS_NAME: "OpenLayers.Format.Filter.v1_0_0"
+});
+OpenLayers.Format.WFST.v1_0_0 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, OpenLayers.Format.WFST.v1, {
+ version: "1.0.0", srsNameInQuery: !1, schemaLocations: { wfs: "http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" }, initialize: function(a) { OpenLayers.Format.Filter.v1_0_0.prototype.initialize.apply(this, [a]); OpenLayers.Format.WFST.v1.prototype.initialize.apply(this, [a]) }, readNode: function(a, b, c) { return OpenLayers.Format.GML.v2.prototype.readNode.apply(this, arguments) }, readers: {
+ wfs: OpenLayers.Util.applyDefaults({
+ WFS_TransactionResponse: function(a,
+ b) { b.insertIds = []; b.success = !1; this.readChildNodes(a, b) }, InsertResult: function(a, b) { var c = { fids: [] }; this.readChildNodes(a, c); b.insertIds = b.insertIds.concat(c.fids) }, TransactionResult: function(a, b) { this.readChildNodes(a, b) }, Status: function(a, b) { this.readChildNodes(a, b) }, SUCCESS: function(a, b) { b.success = !0 }
+ }, OpenLayers.Format.WFST.v1.prototype.readers.wfs), gml: OpenLayers.Format.GML.v2.prototype.readers.gml, feature: OpenLayers.Format.GML.v2.prototype.readers.feature, ogc: OpenLayers.Format.Filter.v1_0_0.prototype.readers.ogc
+ },
+ writers: {
+ wfs: OpenLayers.Util.applyDefaults({
+ Query: function(a) {
+ a = OpenLayers.Util.extend({ featureNS: this.featureNS, featurePrefix: this.featurePrefix, featureType: this.featureType, srsName: this.srsName, srsNameInQuery: this.srsNameInQuery }, a); var b = a.featurePrefix, c = this.createElementNSPlus("wfs:Query", { attributes: { typeName: (b ? b + ":" : "") + a.featureType } }); a.srsNameInQuery && a.srsName && c.setAttribute("srsName", a.srsName); a.featureNS && c.setAttribute("xmlns:" + b, a.featureNS); if (a.propertyNames) for (var b = 0, d = a.propertyNames.length; b <
+ d; b++)this.writeNode("ogc:PropertyName", { property: a.propertyNames[b] }, c); a.filter && (this.setFilterProperty(a.filter), this.writeNode("ogc:Filter", a.filter, c)); return c
+ }
+ }, OpenLayers.Format.WFST.v1.prototype.writers.wfs), gml: OpenLayers.Format.GML.v2.prototype.writers.gml, feature: OpenLayers.Format.GML.v2.prototype.writers.feature, ogc: OpenLayers.Format.Filter.v1_0_0.prototype.writers.ogc
+ }, CLASS_NAME: "OpenLayers.Format.WFST.v1_0_0"
+});
+OpenLayers.ElementsIndexer = OpenLayers.Class({
+ maxZIndex: null, order: null, indices: null, compare: null, initialize: function(a) { this.compare = a ? OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER : OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER; this.clear() }, insert: function(a) {
+ this.exists(a) && this.remove(a); var b = a.id; this.determineZIndex(a); for (var c = -1, d = this.order.length, e; 1 < d - c;)e = parseInt((c + d) / 2), 0 < this.compare(this, a, OpenLayers.Util.getElement(this.order[e])) ? c = e : d = e; this.order.splice(d,
+ 0, b); this.indices[b] = this.getZIndex(a); return this.getNextElement(d)
+ }, remove: function(a) { a = a.id; var b = OpenLayers.Util.indexOf(this.order, a); 0 <= b && (this.order.splice(b, 1), delete this.indices[a], this.maxZIndex = 0 < this.order.length ? this.indices[this.order[this.order.length - 1]] : 0) }, clear: function() { this.order = []; this.indices = {}; this.maxZIndex = 0 }, exists: function(a) { return null != this.indices[a.id] }, getZIndex: function(a) { return a._style.graphicZIndex }, determineZIndex: function(a) {
+ var b = a._style.graphicZIndex;
+ null == b ? (b = this.maxZIndex, a._style.graphicZIndex = b) : b > this.maxZIndex && (this.maxZIndex = b)
+ }, getNextElement: function(a) { a += 1; if (a < this.order.length) { var b = OpenLayers.Util.getElement(this.order[a]); void 0 == b && (b = this.getNextElement(a)); return b } return null }, CLASS_NAME: "OpenLayers.ElementsIndexer"
+});
+OpenLayers.ElementsIndexer.IndexingMethods = { Z_ORDER: function(a, b, c) { b = a.getZIndex(b); var d = 0; c && (a = a.getZIndex(c), d = b - a); return d }, Z_ORDER_DRAWING_ORDER: function(a, b, c) { a = OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(a, b, c); c && 0 == a && (a = 1); return a }, Z_ORDER_Y_ORDER: function(a, b, c) { a = OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(a, b, c); c && 0 === a && (b = c._boundsBottom - b._boundsBottom, a = 0 === b ? 1 : b); return a } };
+OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
+ rendererRoot: null, root: null, vectorRoot: null, textRoot: null, xmlns: null, xOffset: 0, indexer: null, BACKGROUND_ID_SUFFIX: "_background", LABEL_ID_SUFFIX: "_label", LABEL_OUTLINE_SUFFIX: "_outline", initialize: function(a, b) {
+ OpenLayers.Renderer.prototype.initialize.apply(this, arguments); this.rendererRoot = this.createRenderRoot(); this.root = this.createRoot("_root"); this.vectorRoot = this.createRoot("_vroot"); this.textRoot = this.createRoot("_troot"); this.root.appendChild(this.vectorRoot);
+ this.root.appendChild(this.textRoot); this.rendererRoot.appendChild(this.root); this.container.appendChild(this.rendererRoot); b && (b.zIndexing || b.yOrdering) && (this.indexer = new OpenLayers.ElementsIndexer(b.yOrdering))
+ }, destroy: function() { this.clear(); this.xmlns = this.root = this.rendererRoot = null; OpenLayers.Renderer.prototype.destroy.apply(this, arguments) }, clear: function() {
+ var a, b = this.vectorRoot; if (b) for (; a = b.firstChild;)b.removeChild(a); if (b = this.textRoot) for (; a = b.firstChild;)b.removeChild(a); this.indexer &&
+ this.indexer.clear()
+ }, setExtent: function(a, b) { var c = OpenLayers.Renderer.prototype.setExtent.apply(this, arguments), d = this.getResolution(); if (this.map.baseLayer && this.map.baseLayer.wrapDateLine) { var e, f = a.getWidth() / this.map.getExtent().getWidth(); a = a.scale(1 / f); f = this.map.getMaxExtent(); f.right > a.left && f.right < a.right ? e = !0 : f.left > a.left && f.left < a.right && (e = !1); if (e !== this.rightOfDateLine || b) c = !1, this.xOffset = !0 === e ? f.getWidth() / d : 0; this.rightOfDateLine = e } return c }, getNodeType: function(a, b) { }, drawGeometry: function(a,
+ b, c) {
+ var d = a.CLASS_NAME, e = !0; if ("OpenLayers.Geometry.Collection" == d || "OpenLayers.Geometry.MultiPoint" == d || "OpenLayers.Geometry.MultiLineString" == d || "OpenLayers.Geometry.MultiPolygon" == d) { for (var d = 0, f = a.components.length; d < f; d++)e = this.drawGeometry(a.components[d], b, c) && e; return e } d = e = !1; "none" != b.display && (b.backgroundGraphic ? this.redrawBackgroundNode(a.id, a, b, c) : d = !0, e = this.redrawNode(a.id, a, b, c)); 0 == e && (b = document.getElementById(a.id)) && (b._style.backgroundGraphic && (d = !0), b.parentNode.removeChild(b));
+ d && (b = document.getElementById(a.id + this.BACKGROUND_ID_SUFFIX)) && b.parentNode.removeChild(b); return e
+ }, redrawNode: function(a, b, c, d) {
+ c = this.applyDefaultSymbolizer(c); a = this.nodeFactory(a, this.getNodeType(b, c)); a._featureId = d; a._boundsBottom = b.getBounds().bottom; a._geometryClass = b.CLASS_NAME; a._style = c; b = this.drawGeometryNode(a, b, c); if (!1 === b) return !1; a = b.node; this.indexer ? (c = this.indexer.insert(a)) ? this.vectorRoot.insertBefore(a, c) : this.vectorRoot.appendChild(a) : a.parentNode !== this.vectorRoot && this.vectorRoot.appendChild(a);
+ this.postDraw(a); return b.complete
+ }, redrawBackgroundNode: function(a, b, c, d) {
+ c = OpenLayers.Util.extend({}, c); c.externalGraphic = c.backgroundGraphic; c.graphicXOffset = c.backgroundXOffset; c.graphicYOffset = c.backgroundYOffset; c.graphicZIndex = c.backgroundGraphicZIndex; c.graphicWidth = c.backgroundWidth || c.graphicWidth; c.graphicHeight = c.backgroundHeight || c.graphicHeight; c.backgroundGraphic = null; c.backgroundXOffset = null; c.backgroundYOffset = null; c.backgroundGraphicZIndex = null; return this.redrawNode(a + this.BACKGROUND_ID_SUFFIX,
+ b, c, null)
+ }, drawGeometryNode: function(a, b, c) {
+ c = c || a._style; var d = { isFilled: void 0 === c.fill ? !0 : c.fill, isStroked: void 0 === c.stroke ? !!c.strokeWidth : c.stroke }, e; switch (b.CLASS_NAME) {
+ case "OpenLayers.Geometry.Point": !1 === c.graphic && (d.isFilled = !1, d.isStroked = !1); e = this.drawPoint(a, b); break; case "OpenLayers.Geometry.LineString": d.isFilled = !1; e = this.drawLineString(a, b); break; case "OpenLayers.Geometry.LinearRing": e = this.drawLinearRing(a, b); break; case "OpenLayers.Geometry.Polygon": e = this.drawPolygon(a, b); break;
+ case "OpenLayers.Geometry.Rectangle": e = this.drawRectangle(a, b)
+ }a._options = d; return 0 != e ? { node: this.setStyle(a, c, d, b), complete: e } : !1
+ }, postDraw: function(a) { }, drawPoint: function(a, b) { }, drawLineString: function(a, b) { }, drawLinearRing: function(a, b) { }, drawPolygon: function(a, b) { }, drawRectangle: function(a, b) { }, drawCircle: function(a, b) { }, removeText: function(a) { var b = document.getElementById(a + this.LABEL_ID_SUFFIX); b && this.textRoot.removeChild(b); (a = document.getElementById(a + this.LABEL_OUTLINE_SUFFIX)) && this.textRoot.removeChild(a) },
+ getFeatureIdFromEvent: function(a) { var b = a.target, c = b && b.correspondingUseElement; return (c ? c : b || a.srcElement)._featureId }, eraseGeometry: function(a, b) {
+ if ("OpenLayers.Geometry.MultiPoint" == a.CLASS_NAME || "OpenLayers.Geometry.MultiLineString" == a.CLASS_NAME || "OpenLayers.Geometry.MultiPolygon" == a.CLASS_NAME || "OpenLayers.Geometry.Collection" == a.CLASS_NAME) for (var c = 0, d = a.components.length; c < d; c++)this.eraseGeometry(a.components[c], b); else (c = OpenLayers.Util.getElement(a.id)) && c.parentNode && (c.geometry && (c.geometry.destroy(),
+ c.geometry = null), c.parentNode.removeChild(c), this.indexer && this.indexer.remove(c), c._style.backgroundGraphic && (c = OpenLayers.Util.getElement(a.id + this.BACKGROUND_ID_SUFFIX)) && c.parentNode && c.parentNode.removeChild(c))
+ }, nodeFactory: function(a, b) { var c = OpenLayers.Util.getElement(a); c ? this.nodeTypeCompare(c, b) || (c.parentNode.removeChild(c), c = this.nodeFactory(a, b)) : c = this.createNode(b, a); return c }, nodeTypeCompare: function(a, b) { }, createNode: function(a, b) { }, moveRoot: function(a) {
+ var b = this.root; a.root.parentNode ==
+ this.rendererRoot && (b = a.root); b.parentNode.removeChild(b); a.rendererRoot.appendChild(b)
+ }, getRenderLayerId: function() { return this.root.parentNode.parentNode.id }, isComplexSymbol: function(a) { return "circle" != a && !!a }, CLASS_NAME: "OpenLayers.Renderer.Elements"
+});
+OpenLayers.Control.ArgParser = OpenLayers.Class(OpenLayers.Control, {
+ center: null, zoom: null, layers: null, displayProjection: null, getParameters: function(a) { a = a || window.location.href; var b = OpenLayers.Util.getParameters(a), c = a.indexOf("#"); 0 < c && (a = "?" + a.substring(c + 1, a.length), OpenLayers.Util.extend(b, OpenLayers.Util.getParameters(a))); return b }, setMap: function(a) {
+ OpenLayers.Control.prototype.setMap.apply(this, arguments); for (var b = 0, c = this.map.controls.length; b < c; b++) {
+ var d = this.map.controls[b]; if (d != this &&
+ "OpenLayers.Control.ArgParser" == d.CLASS_NAME) { d.displayProjection != this.displayProjection && (this.displayProjection = d.displayProjection); break }
+ } b == this.map.controls.length && (b = this.getParameters(), b.layers && (this.layers = b.layers, this.map.events.register("addlayer", this, this.configureLayers), this.configureLayers()), b.lat && b.lon && (this.center = new OpenLayers.LonLat(parseFloat(b.lon), parseFloat(b.lat)), b.zoom && (this.zoom = parseFloat(b.zoom)), this.map.events.register("changebaselayer", this, this.setCenter),
+ this.setCenter()))
+ }, setCenter: function() { this.map.baseLayer && (this.map.events.unregister("changebaselayer", this, this.setCenter), this.displayProjection && this.center.transform(this.displayProjection, this.map.getProjectionObject()), this.map.setCenter(this.center, this.zoom)) }, configureLayers: function() {
+ if (this.layers.length == this.map.layers.length) {
+ this.map.events.unregister("addlayer", this, this.configureLayers); for (var a = 0, b = this.layers.length; a < b; a++) {
+ var c = this.map.layers[a], d = this.layers.charAt(a);
+ "B" == d ? this.map.setBaseLayer(c) : "T" != d && "F" != d || c.setVisibility("T" == d)
+ }
+ }
+ }, CLASS_NAME: "OpenLayers.Control.ArgParser"
+});
+OpenLayers.Control.Permalink = OpenLayers.Class(OpenLayers.Control, {
+ argParserClass: OpenLayers.Control.ArgParser, element: null, anchor: !1, base: "", displayProjection: null, initialize: function(a, b, c) {
+ null === a || "object" != typeof a || OpenLayers.Util.isElement(a) ? (OpenLayers.Control.prototype.initialize.apply(this, [c]), this.element = OpenLayers.Util.getElement(a), this.base = b || document.location.href) : (this.base = document.location.href, OpenLayers.Control.prototype.initialize.apply(this, [a]), null != this.element && (this.element =
+ OpenLayers.Util.getElement(this.element)))
+ }, destroy: function() { this.element && this.element.parentNode == this.div && (this.div.removeChild(this.element), this.element = null); this.map && this.map.events.unregister("moveend", this, this.updateLink); OpenLayers.Control.prototype.destroy.apply(this, arguments) }, setMap: function(a) {
+ OpenLayers.Control.prototype.setMap.apply(this, arguments); for (var b = 0, c = this.map.controls.length; b < c; b++) {
+ var d = this.map.controls[b]; if (d.CLASS_NAME == this.argParserClass.CLASS_NAME) {
+ d.displayProjection !=
+ this.displayProjection && (this.displayProjection = d.displayProjection); break
+ }
+ } b == this.map.controls.length && this.map.addControl(new this.argParserClass({ displayProjection: this.displayProjection }))
+ }, draw: function() {
+ OpenLayers.Control.prototype.draw.apply(this, arguments); this.element || this.anchor || (this.element = document.createElement("a"), this.element.innerHTML = OpenLayers.i18n("Permalink"), this.element.href = "", this.div.appendChild(this.element)); this.map.events.on({
+ moveend: this.updateLink, changelayer: this.updateLink,
+ changebaselayer: this.updateLink, scope: this
+ }); this.updateLink(); return this.div
+ }, updateLink: function() { var a = this.anchor ? "#" : "?", b = this.base, c = null; -1 != b.indexOf("#") && 0 == this.anchor && (c = b.substring(b.indexOf("#"), b.length)); -1 != b.indexOf(a) && (b = b.substring(0, b.indexOf(a))); b = b.split("#")[0] + a + OpenLayers.Util.getParameterString(this.createParams()); c && (b += c); this.anchor && !this.element ? window.location.href = b : this.element.href = b }, createParams: function(a, b, c) {
+ a = a || this.map.getCenter(); var d = OpenLayers.Util.getParameters(this.base);
+ if (a) for (d.zoom = b || this.map.getZoom(), b = a.lat, a = a.lon, this.displayProjection && (b = OpenLayers.Projection.transform({ x: a, y: b }, this.map.getProjectionObject(), this.displayProjection), a = b.x, b = b.y), d.lat = Math.round(1E5 * b) / 1E5, d.lon = Math.round(1E5 * a) / 1E5, c = c || this.map.layers, d.layers = "", a = 0, b = c.length; a < b; a++) { var e = c[a]; d.layers = e.isBaseLayer ? d.layers + (e == this.map.baseLayer ? "B" : "0") : d.layers + (e.getVisibility() ? "T" : "F") } return d
+ }, CLASS_NAME: "OpenLayers.Control.Permalink"
+});
+OpenLayers.Layer.TMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ serviceVersion: "1.0.0", layername: null, type: null, isBaseLayer: !0, tileOrigin: null, serverResolutions: null, zoomOffset: 0, initialize: function(a, b, c) { var d = []; d.push(a, b, {}, c); OpenLayers.Layer.Grid.prototype.initialize.apply(this, d) }, clone: function(a) { null == a && (a = new OpenLayers.Layer.TMS(this.name, this.url, this.getOptions())); return OpenLayers.Layer.Grid.prototype.clone.apply(this, [a]) }, getURL: function(a) {
+ a = this.adjustBounds(a); var b = this.getServerResolution(),
+ c = Math.round((a.left - this.tileOrigin.lon) / (b * this.tileSize.w)); a = Math.round((a.bottom - this.tileOrigin.lat) / (b * this.tileSize.h)); b = this.getServerZoom(); c = this.serviceVersion + "/" + this.layername + "/" + b + "/" + c + "/" + a + "." + this.type; a = this.url; OpenLayers.Util.isArray(a) && (a = this.selectUrl(c, a)); return a + c
+ }, setMap: function(a) { OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments); this.tileOrigin || (this.tileOrigin = new OpenLayers.LonLat(this.map.maxExtent.left, this.map.maxExtent.bottom)) }, CLASS_NAME: "OpenLayers.Layer.TMS"
+});
+OpenLayers.Format.WCSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.1.0", CLASS_NAME: "OpenLayers.Format.WCSCapabilities" }); OpenLayers.Format.WCSCapabilities.v1 = OpenLayers.Class(OpenLayers.Format.XML, { regExes: { trimSpace: /^\s*|\s*$/g, splitSpace: /\s+/ }, defaultPrefix: "wcs", read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a, b); return b }, CLASS_NAME: "OpenLayers.Format.WCSCapabilities.v1" });
+OpenLayers.Format.WCSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.WCSCapabilities.v1, {
+ namespaces: { wcs: "http://www.opengis.net/wcs", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance", ows: "http://www.opengis.net/ows" }, errorProperty: "service", readers: {
+ wcs: {
+ WCS_Capabilities: function(a, b) { this.readChildNodes(a, b) }, Service: function(a, b) { b.service = {}; this.readChildNodes(a, b.service) }, name: function(a, b) { b.name = this.getChildValue(a) }, label: function(a, b) {
+ b.label =
+ this.getChildValue(a)
+ }, keywords: function(a, b) { b.keywords = []; this.readChildNodes(a, b.keywords) }, keyword: function(a, b) { b.push(this.getChildValue(a)) }, responsibleParty: function(a, b) { b.responsibleParty = {}; this.readChildNodes(a, b.responsibleParty) }, individualName: function(a, b) { b.individualName = this.getChildValue(a) }, organisationName: function(a, b) { b.organisationName = this.getChildValue(a) }, positionName: function(a, b) { b.positionName = this.getChildValue(a) }, contactInfo: function(a, b) {
+ b.contactInfo = {}; this.readChildNodes(a,
+ b.contactInfo)
+ }, phone: function(a, b) { b.phone = {}; this.readChildNodes(a, b.phone) }, voice: function(a, b) { b.voice = this.getChildValue(a) }, facsimile: function(a, b) { b.facsimile = this.getChildValue(a) }, address: function(a, b) { b.address = {}; this.readChildNodes(a, b.address) }, deliveryPoint: function(a, b) { b.deliveryPoint = this.getChildValue(a) }, city: function(a, b) { b.city = this.getChildValue(a) }, postalCode: function(a, b) { b.postalCode = this.getChildValue(a) }, country: function(a, b) { b.country = this.getChildValue(a) }, electronicMailAddress: function(a,
+ b) { b.electronicMailAddress = this.getChildValue(a) }, fees: function(a, b) { b.fees = this.getChildValue(a) }, accessConstraints: function(a, b) { b.accessConstraints = this.getChildValue(a) }, ContentMetadata: function(a, b) { b.contentMetadata = []; this.readChildNodes(a, b.contentMetadata) }, CoverageOfferingBrief: function(a, b) { var c = {}; this.readChildNodes(a, c); b.push(c) }, name: function(a, b) { b.name = this.getChildValue(a) }, label: function(a, b) { b.label = this.getChildValue(a) }, lonLatEnvelope: function(a, b) {
+ var c = this.getElementsByTagNameNS(a,
+ "http://www.opengis.net/gml", "pos"); if (2 == c.length) { var d = {}, e = {}; OpenLayers.Format.GML.v3.prototype.readers.gml.pos.apply(this, [c[0], d]); OpenLayers.Format.GML.v3.prototype.readers.gml.pos.apply(this, [c[1], e]); b.lonLatEnvelope = {}; b.lonLatEnvelope.srsName = a.getAttribute("srsName"); b.lonLatEnvelope.min = d.points[0]; b.lonLatEnvelope.max = e.points[0] }
+ }
+ }
+ }, CLASS_NAME: "OpenLayers.Format.WCSCapabilities.v1_0_0"
+});
+OpenLayers.Strategy.Fixed = OpenLayers.Class(OpenLayers.Strategy, {
+ preload: !1, activate: function() { var a = OpenLayers.Strategy.prototype.activate.apply(this, arguments); if (a) if (this.layer.events.on({ refresh: this.load, scope: this }), 1 == this.layer.visibility || this.preload) this.load(); else this.layer.events.on({ visibilitychanged: this.load, scope: this }); return a }, deactivate: function() {
+ var a = OpenLayers.Strategy.prototype.deactivate.call(this); a && this.layer.events.un({
+ refresh: this.load, visibilitychanged: this.load,
+ scope: this
+ }); return a
+ }, load: function(a) { var b = this.layer; b.events.triggerEvent("loadstart", { filter: b.filter }); b.protocol.read(OpenLayers.Util.applyDefaults({ callback: this.merge, filter: b.filter, scope: this }, a)); b.events.un({ visibilitychanged: this.load, scope: this }) }, merge: function(a) {
+ var b = this.layer; b.destroyFeatures(); var c = a.features; if (c && 0 < c.length) { var d = b.projection, e = b.map.getProjectionObject(); if (!e.equals(d)) for (var f, g = 0, h = c.length; g < h; ++g)(f = c[g].geometry) && f.transform(d, e); b.addFeatures(c) } b.events.triggerEvent("loadend",
+ { response: a })
+ }, CLASS_NAME: "OpenLayers.Strategy.Fixed"
+});
+OpenLayers.Control.Zoom = OpenLayers.Class(OpenLayers.Control, {
+ zoomInText: "+", zoomInId: "olZoomInLink", zoomOutText: "−", zoomOutId: "olZoomOutLink", draw: function() { var a = OpenLayers.Control.prototype.draw.apply(this), b = this.getOrCreateLinks(a), c = b.zoomIn, b = b.zoomOut, d = this.map.events; b.parentNode !== a && (d = this.events, d.attachToElement(b.parentNode)); d.register("buttonclick", this, this.onZoomClick); this.zoomInLink = c; this.zoomOutLink = b; return a }, getOrCreateLinks: function(a) {
+ var b = document.getElementById(this.zoomInId),
+ c = document.getElementById(this.zoomOutId); b || (b = document.createElement("a"), b.href = "#zoomIn", b.appendChild(document.createTextNode(this.zoomInText)), b.className = "olControlZoomIn", a.appendChild(b)); OpenLayers.Element.addClass(b, "olButton"); c || (c = document.createElement("a"), c.href = "#zoomOut", c.appendChild(document.createTextNode(this.zoomOutText)), c.className = "olControlZoomOut", a.appendChild(c)); OpenLayers.Element.addClass(c, "olButton"); return { zoomIn: b, zoomOut: c }
+ }, onZoomClick: function(a) {
+ a = a.buttonElement;
+ a === this.zoomInLink ? this.map.zoomIn() : a === this.zoomOutLink && this.map.zoomOut()
+ }, destroy: function() { this.map && this.map.events.unregister("buttonclick", this, this.onZoomClick); delete this.zoomInLink; delete this.zoomOutLink; OpenLayers.Control.prototype.destroy.apply(this) }, CLASS_NAME: "OpenLayers.Control.Zoom"
+});
+OpenLayers.Layer.PointTrack = OpenLayers.Class(OpenLayers.Layer.Vector, {
+ dataFrom: null, styleFrom: null, addNodes: function(a, b) {
+ if (2 > a.length) throw Error("At least two point features have to be added to create a line from"); for (var c = Array(a.length - 1), d, e, f, g = 0, h = a.length; g < h; g++) {
+ d = a[g]; f = d.geometry; if (!f) f = d.lonlat, f = new OpenLayers.Geometry.Point(f.lon, f.lat); else if ("OpenLayers.Geometry.Point" != f.CLASS_NAME) throw new TypeError("Only features with point geometries are supported."); if (0 < g) {
+ d = null != this.dataFrom ?
+ a[g + this.dataFrom].data || a[g + this.dataFrom].attributes : null; var k = null != this.styleFrom ? a[g + this.styleFrom].style : null; e = new OpenLayers.Geometry.LineString([e, f]); c[g - 1] = new OpenLayers.Feature.Vector(e, d, k)
+ } e = f
+ } this.addFeatures(c, b)
+ }, CLASS_NAME: "OpenLayers.Layer.PointTrack"
+}); OpenLayers.Layer.PointTrack.SOURCE_NODE = -1; OpenLayers.Layer.PointTrack.TARGET_NODE = 0; OpenLayers.Layer.PointTrack.dataFrom = { SOURCE_NODE: -1, TARGET_NODE: 0 };
+OpenLayers.Protocol.WFS = function(a) { a = OpenLayers.Util.applyDefaults(a, OpenLayers.Protocol.WFS.DEFAULTS); var b = OpenLayers.Protocol.WFS["v" + a.version.replace(/\./g, "_")]; if (!b) throw "Unsupported WFS version: " + a.version; return new b(a) };
+OpenLayers.Protocol.WFS.fromWMSLayer = function(a, b) { var c, d; c = a.params.LAYERS; c = (OpenLayers.Util.isArray(c) ? c[0] : c).split(":"); 1 < c.length && (d = c[0]); c = c.pop(); d = { url: a.url, featureType: c, featurePrefix: d, srsName: a.projection && a.projection.getCode() || a.map && a.map.getProjectionObject().getCode(), version: "1.1.0" }; return new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults(b, d)) }; OpenLayers.Protocol.WFS.DEFAULTS = { version: "1.0.0" };
+OpenLayers.Layer.Markers = OpenLayers.Class(OpenLayers.Layer, {
+ isBaseLayer: !1, markers: null, drawn: !1, initialize: function(a, b) { OpenLayers.Layer.prototype.initialize.apply(this, arguments); this.markers = [] }, destroy: function() { this.clearMarkers(); this.markers = null; OpenLayers.Layer.prototype.destroy.apply(this, arguments) }, setOpacity: function(a) { if (a != this.opacity) { this.opacity = a; a = 0; for (var b = this.markers.length; a < b; a++)this.markers[a].setOpacity(this.opacity) } }, moveTo: function(a, b, c) {
+ OpenLayers.Layer.prototype.moveTo.apply(this,
+ arguments); if (b || !this.drawn) { for (var d = 0, e = this.markers.length; d < e; d++)this.drawMarker(this.markers[d]); this.drawn = !0 }
+ }, addMarker: function(a) { this.markers.push(a); 1 > this.opacity && a.setOpacity(this.opacity); this.map && this.map.getExtent() && (a.map = this.map, this.drawMarker(a)) }, removeMarker: function(a) { this.markers && this.markers.length && (OpenLayers.Util.removeItem(this.markers, a), a.erase()) }, clearMarkers: function() { if (null != this.markers) for (; 0 < this.markers.length;)this.removeMarker(this.markers[0]) },
+ drawMarker: function(a) { var b = this.map.getLayerPxFromLonLat(a.lonlat); null == b ? a.display(!1) : a.isDrawn() ? a.icon && a.icon.moveTo(b) : (a = a.draw(b), this.div.appendChild(a)) }, getDataExtent: function() { var a = null; if (this.markers && 0 < this.markers.length) for (var a = new OpenLayers.Bounds, b = 0, c = this.markers.length; b < c; b++)a.extend(this.markers[b].lonlat); return a }, CLASS_NAME: "OpenLayers.Layer.Markers"
+});
+OpenLayers.Control.Pan = OpenLayers.Class(OpenLayers.Control.Button, {
+ slideFactor: 50, slideRatio: null, direction: null, initialize: function(a, b) { this.direction = a; this.CLASS_NAME += this.direction; OpenLayers.Control.prototype.initialize.apply(this, [b]) }, trigger: function() {
+ if (this.map) {
+ var a = OpenLayers.Function.bind(function(a) { return this.slideRatio ? this.map.getSize()[a] * this.slideRatio : this.slideFactor }, this); switch (this.direction) {
+ case OpenLayers.Control.Pan.NORTH: this.map.pan(0, -a("h")); break; case OpenLayers.Control.Pan.SOUTH: this.map.pan(0,
+ a("h")); break; case OpenLayers.Control.Pan.WEST: this.map.pan(-a("w"), 0); break; case OpenLayers.Control.Pan.EAST: this.map.pan(a("w"), 0)
+ }
+ }
+ }, CLASS_NAME: "OpenLayers.Control.Pan"
+}); OpenLayers.Control.Pan.NORTH = "North"; OpenLayers.Control.Pan.SOUTH = "South"; OpenLayers.Control.Pan.EAST = "East"; OpenLayers.Control.Pan.WEST = "West";
+OpenLayers.Format.CSWGetDomain = function(a) { a = OpenLayers.Util.applyDefaults(a, OpenLayers.Format.CSWGetDomain.DEFAULTS); var b = OpenLayers.Format.CSWGetDomain["v" + a.version.replace(/\./g, "_")]; if (!b) throw "Unsupported CSWGetDomain version: " + a.version; return new b(a) }; OpenLayers.Format.CSWGetDomain.DEFAULTS = { version: "2.0.2" };
+OpenLayers.Format.CSWGetDomain.v2_0_2 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance", csw: "http://www.opengis.net/cat/csw/2.0.2" }, defaultPrefix: "csw", version: "2.0.2", schemaLocation: "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd", PropertyName: null, ParameterName: null, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 ==
+ a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a, b); return b
+ }, readers: {
+ csw: {
+ GetDomainResponse: function(a, b) { this.readChildNodes(a, b) }, DomainValues: function(a, b) { OpenLayers.Util.isArray(b.DomainValues) || (b.DomainValues = []); for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e)d[c[e].name] = c[e].nodeValue; this.readChildNodes(a, d); b.DomainValues.push(d) }, PropertyName: function(a, b) { b.PropertyName = this.getChildValue(a) }, ParameterName: function(a, b) { b.ParameterName = this.getChildValue(a) }, ListOfValues: function(a,
+ b) { OpenLayers.Util.isArray(b.ListOfValues) || (b.ListOfValues = []); this.readChildNodes(a, b.ListOfValues) }, Value: function(a, b) { for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e)d[c[e].name] = c[e].nodeValue; d.value = this.getChildValue(a); b.push({ Value: d }) }, ConceptualScheme: function(a, b) { b.ConceptualScheme = {}; this.readChildNodes(a, b.ConceptualScheme) }, Name: function(a, b) { b.Name = this.getChildValue(a) }, Document: function(a, b) { b.Document = this.getChildValue(a) }, Authority: function(a, b) { b.Authority = this.getChildValue(a) },
+ RangeOfValues: function(a, b) { b.RangeOfValues = {}; this.readChildNodes(a, b.RangeOfValues) }, MinValue: function(a, b) { for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e)d[c[e].name] = c[e].nodeValue; d.value = this.getChildValue(a); b.MinValue = d }, MaxValue: function(a, b) { for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e)d[c[e].name] = c[e].nodeValue; d.value = this.getChildValue(a); b.MaxValue = d }
+ }
+ }, write: function(a) { a = this.writeNode("csw:GetDomain", a); return OpenLayers.Format.XML.prototype.write.apply(this, [a]) }, writers: {
+ csw: {
+ GetDomain: function(a) {
+ var b =
+ this.createElementNSPlus("csw:GetDomain", { attributes: { service: "CSW", version: this.version } }); a.PropertyName || this.PropertyName ? this.writeNode("csw:PropertyName", a.PropertyName || this.PropertyName, b) : (a.ParameterName || this.ParameterName) && this.writeNode("csw:ParameterName", a.ParameterName || this.ParameterName, b); this.readChildNodes(b, a); return b
+ }, PropertyName: function(a) { return this.createElementNSPlus("csw:PropertyName", { value: a }) }, ParameterName: function(a) {
+ return this.createElementNSPlus("csw:ParameterName",
+ { value: a })
+ }
+ }
+ }, CLASS_NAME: "OpenLayers.Format.CSWGetDomain.v2_0_2"
+}); OpenLayers.Format.ArcXML.Features = OpenLayers.Class(OpenLayers.Format.XML, { read: function(a) { return (new OpenLayers.Format.ArcXML).read(a).features.feature } });
+OpenLayers.Control.Snapping = OpenLayers.Class(OpenLayers.Control, {
+ DEFAULTS: { tolerance: 10, node: !0, edge: !0, vertex: !0 }, greedy: !0, precedence: ["node", "vertex", "edge"], resolution: null, geoToleranceCache: null, layer: null, feature: null, point: null, initialize: function(a) {
+ OpenLayers.Control.prototype.initialize.apply(this, [a]); this.options = a || {}; this.options.layer && this.setLayer(this.options.layer); a = OpenLayers.Util.extend({}, this.options.defaults); this.defaults = OpenLayers.Util.applyDefaults(a, this.DEFAULTS); this.setTargets(this.options.targets);
+ 0 === this.targets.length && this.layer && this.addTargetLayer(this.layer); this.geoToleranceCache = {}
+ }, setLayer: function(a) { this.active ? (this.deactivate(), this.layer = a, this.activate()) : this.layer = a }, setTargets: function(a) { this.targets = []; if (a && a.length) for (var b, c = 0, d = a.length; c < d; ++c)b = a[c], b instanceof OpenLayers.Layer.Vector ? this.addTargetLayer(b) : this.addTarget(b) }, addTargetLayer: function(a) { this.addTarget({ layer: a }) }, addTarget: function(a) {
+ a = OpenLayers.Util.applyDefaults(a, this.defaults); a.nodeTolerance =
+ a.nodeTolerance || a.tolerance; a.vertexTolerance = a.vertexTolerance || a.tolerance; a.edgeTolerance = a.edgeTolerance || a.tolerance; this.targets.push(a)
+ }, removeTargetLayer: function(a) { for (var b, c = this.targets.length - 1; 0 <= c; --c)b = this.targets[c], b.layer === a && this.removeTarget(b) }, removeTarget: function(a) { return OpenLayers.Util.removeItem(this.targets, a) }, activate: function() {
+ var a = OpenLayers.Control.prototype.activate.call(this); if (a && this.layer && this.layer.events) this.layer.events.on({
+ sketchstarted: this.onSketchModified,
+ sketchmodified: this.onSketchModified, vertexmodified: this.onVertexModified, scope: this
+ }); return a
+ }, deactivate: function() { var a = OpenLayers.Control.prototype.deactivate.call(this); a && this.layer && this.layer.events && this.layer.events.un({ sketchstarted: this.onSketchModified, sketchmodified: this.onSketchModified, vertexmodified: this.onVertexModified, scope: this }); this.point = this.feature = null; return a }, onSketchModified: function(a) { this.feature = a.feature; this.considerSnapping(a.vertex, a.vertex) }, onVertexModified: function(a) {
+ this.feature =
+ a.feature; var b = this.layer.map.getLonLatFromViewPortPx(a.pixel); this.considerSnapping(a.vertex, new OpenLayers.Geometry.Point(b.lon, b.lat))
+ }, considerSnapping: function(a, b) {
+ for (var c = { rank: Number.POSITIVE_INFINITY, dist: Number.POSITIVE_INFINITY, x: null, y: null }, d = !1, e, f, g = 0, h = this.targets.length; g < h; ++g)if (f = this.targets[g], e = this.testTarget(f, b)) if (this.greedy) { c = e; c.target = f; d = !0; break } else if (e.rank < c.rank || e.rank === c.rank && e.dist < c.dist) c = e, c.target = f, d = !0; d && (!1 !== this.events.triggerEvent("beforesnap",
+ { point: a, x: c.x, y: c.y, distance: c.dist, layer: c.target.layer, snapType: this.precedence[c.rank] }) ? (a.x = c.x, a.y = c.y, this.point = a, this.events.triggerEvent("snap", { point: a, snapType: this.precedence[c.rank], layer: c.target.layer, distance: c.dist })) : d = !1); this.point && !d && (a.x = b.x, a.y = b.y, this.point = null, this.events.triggerEvent("unsnap", { point: a }))
+ }, testTarget: function(a, b) {
+ var c = this.layer.map.getResolution(); if ("minResolution" in a && c < a.minResolution || "maxResolution" in a && c >= a.maxResolution) return null; for (var c =
+ { node: this.getGeoTolerance(a.nodeTolerance, c), vertex: this.getGeoTolerance(a.vertexTolerance, c), edge: this.getGeoTolerance(a.edgeTolerance, c) }, d = Math.max(c.node, c.vertex, c.edge), e = { rank: Number.POSITIVE_INFINITY, dist: Number.POSITIVE_INFINITY }, f = !1, g = a.layer.features, h, k, l, m, n, p, q = this.precedence.length, r = new OpenLayers.LonLat(b.x, b.y), t = 0, u = g.length; t < u; ++t)if (h = g[t], h !== this.feature && !h._sketch && h.state !== OpenLayers.State.DELETE && (!a.filter || a.filter.evaluate(h)) && h.atPoint(r, d, d)) for (var v = 0, w = Math.min(e.rank +
+ 1, q); v < w; ++v)if (k = this.precedence[v], a[k]) if ("edge" === k) { if (l = h.geometry.distanceTo(b, { details: !0 }), n = l.distance, n <= c[k] && n < e.dist) { e = { rank: v, dist: n, x: l.x0, y: l.y0 }; f = !0; break } } else { l = h.geometry.getVertices("node" === k); p = !1; for (var x = 0, y = l.length; x < y; ++x)m = l[x], n = m.distanceTo(b), n <= c[k] && (v < e.rank || v === e.rank && n < e.dist) && (e = { rank: v, dist: n, x: m.x, y: m.y }, p = f = !0); if (p) break } return f ? e : null
+ }, getGeoTolerance: function(a, b) {
+ b !== this.resolution && (this.resolution = b, this.geoToleranceCache = {}); var c = this.geoToleranceCache[a];
+ void 0 === c && (c = a * b, this.geoToleranceCache[a] = c); return c
+ }, destroy: function() { this.active && this.deactivate(); delete this.layer; delete this.targets; OpenLayers.Control.prototype.destroy.call(this) }, CLASS_NAME: "OpenLayers.Control.Snapping"
+});
+OpenLayers.Format.OWSCommon.v1_1_0 = OpenLayers.Class(OpenLayers.Format.OWSCommon.v1, {
+ namespaces: { ows: "http://www.opengis.net/ows/1.1", xlink: "http://www.w3.org/1999/xlink" }, readers: {
+ ows: OpenLayers.Util.applyDefaults({
+ ExceptionReport: function(a, b) { b.exceptionReport = { version: a.getAttribute("version"), language: a.getAttribute("xml:lang"), exceptions: [] }; this.readChildNodes(a, b.exceptionReport) }, AllowedValues: function(a, b) { b.allowedValues = {}; this.readChildNodes(a, b.allowedValues) }, AnyValue: function(a, b) {
+ b.anyValue =
+ !0
+ }, DataType: function(a, b) { b.dataType = this.getChildValue(a) }, Range: function(a, b) { b.range = {}; this.readChildNodes(a, b.range) }, MinimumValue: function(a, b) { b.minValue = this.getChildValue(a) }, MaximumValue: function(a, b) { b.maxValue = this.getChildValue(a) }, Identifier: function(a, b) { b.identifier = this.getChildValue(a) }, SupportedCRS: function(a, b) { b.supportedCRS = this.getChildValue(a) }
+ }, OpenLayers.Format.OWSCommon.v1.prototype.readers.ows)
+ }, writers: {
+ ows: OpenLayers.Util.applyDefaults({
+ Range: function(a) {
+ var b = this.createElementNSPlus("ows:Range",
+ { attributes: { "ows:rangeClosure": a.closure } }); this.writeNode("ows:MinimumValue", a.minValue, b); this.writeNode("ows:MaximumValue", a.maxValue, b); return b
+ }, MinimumValue: function(a) { return this.createElementNSPlus("ows:MinimumValue", { value: a }) }, MaximumValue: function(a) { return this.createElementNSPlus("ows:MaximumValue", { value: a }) }, Value: function(a) { return this.createElementNSPlus("ows:Value", { value: a }) }
+ }, OpenLayers.Format.OWSCommon.v1.prototype.writers.ows)
+ }, CLASS_NAME: "OpenLayers.Format.OWSCommon.v1_1_0"
+});
+OpenLayers.Format.WCSGetCoverage = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { ows: "http://www.opengis.net/ows/1.1", wcs: "http://www.opengis.net/wcs/1.1", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, VERSION: "1.1.2", schemaLocation: "http://www.opengis.net/wcs/1.1 http://schemas.opengis.net/wcs/1.1/wcsGetCoverage.xsd", write: function(a) {
+ a = this.writeNode("wcs:GetCoverage",
+ a); this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation); return OpenLayers.Format.XML.prototype.write.apply(this, [a])
+ }, writers: {
+ wcs: {
+ GetCoverage: function(a) { var b = this.createElementNSPlus("wcs:GetCoverage", { attributes: { version: a.version || this.VERSION, service: "WCS" } }); this.writeNode("ows:Identifier", a.identifier, b); this.writeNode("wcs:DomainSubset", a.domainSubset, b); this.writeNode("wcs:Output", a.output, b); return b }, DomainSubset: function(a) {
+ var b = this.createElementNSPlus("wcs:DomainSubset",
+ {}); this.writeNode("ows:BoundingBox", a.boundingBox, b); a.temporalSubset && this.writeNode("wcs:TemporalSubset", a.temporalSubset, b); return b
+ }, TemporalSubset: function(a) { for (var b = this.createElementNSPlus("wcs:TemporalSubset", {}), c = 0, d = a.timePeriods.length; c < d; ++c)this.writeNode("wcs:TimePeriod", a.timePeriods[c], b); return b }, TimePeriod: function(a) {
+ var b = this.createElementNSPlus("wcs:TimePeriod", {}); this.writeNode("wcs:BeginPosition", a.begin, b); this.writeNode("wcs:EndPosition", a.end, b); a.resolution && this.writeNode("wcs:TimeResolution",
+ a.resolution, b); return b
+ }, BeginPosition: function(a) { return this.createElementNSPlus("wcs:BeginPosition", { value: a }) }, EndPosition: function(a) { return this.createElementNSPlus("wcs:EndPosition", { value: a }) }, TimeResolution: function(a) { return this.createElementNSPlus("wcs:TimeResolution", { value: a }) }, Output: function(a) { var b = this.createElementNSPlus("wcs:Output", { attributes: { format: a.format, store: a.store } }); a.gridCRS && this.writeNode("wcs:GridCRS", a.gridCRS, b); return b }, GridCRS: function(a) {
+ var b = this.createElementNSPlus("wcs:GridCRS",
+ {}); this.writeNode("wcs:GridBaseCRS", a.baseCRS, b); a.type && this.writeNode("wcs:GridType", a.type, b); a.origin && this.writeNode("wcs:GridOrigin", a.origin, b); this.writeNode("wcs:GridOffsets", a.offsets, b); a.CS && this.writeNode("wcs:GridCS", a.CS, b); return b
+ }, GridBaseCRS: function(a) { return this.createElementNSPlus("wcs:GridBaseCRS", { value: a }) }, GridOrigin: function(a) { return this.createElementNSPlus("wcs:GridOrigin", { value: a }) }, GridType: function(a) { return this.createElementNSPlus("wcs:GridType", { value: a }) }, GridOffsets: function(a) {
+ return this.createElementNSPlus("wcs:GridOffsets",
+ { value: a })
+ }, GridCS: function(a) { return this.createElementNSPlus("wcs:GridCS", { value: a }) }
+ }, ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.writers.ows
+ }, CLASS_NAME: "OpenLayers.Format.WCSGetCoverage"
+});
+OpenLayers.Format.KML = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { kml: "http://www.opengis.net/kml/2.2", gx: "http://www.google.com/kml/ext/2.2" }, kmlns: "http://earth.google.com/kml/2.0", placemarksDesc: "No description available", foldersName: "OpenLayers export", foldersDesc: "Exported on " + new Date, extractAttributes: !0, kvpAttributes: !1, extractStyles: !1, extractTracks: !1, trackAttributes: null, internalns: null, features: null, styles: null, styleBaseUrl: "", fetched: null, maxDepth: 0, initialize: function(a) {
+ this.regExes =
+ { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g, kmlColor: /(\w[2])(\w[2])(\w[2])(\w[2])/, kmlIconPalette: /root:\/\/icons\/palette-(\d+)(\.\w+)/, straightBracket: /\$\[(.*?)\]/g }; this.externalProjection = new OpenLayers.Projection("EPSG:4326"); OpenLayers.Format.XML.prototype.initialize.apply(this, [a])
+ }, read: function(a) { this.features = []; this.styles = {}; this.fetched = {}; return this.parseData(a, { depth: 0, styleBaseUrl: this.styleBaseUrl }) }, parseData: function(a, b) {
+ "string" == typeof a &&
+ (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); for (var c = ["Link", "NetworkLink", "Style", "StyleMap", "Placemark"], d = 0, e = c.length; d < e; ++d) { var f = c[d], g = this.getElementsByTagNameNS(a, "*", f); if (0 != g.length) switch (f.toLowerCase()) { case "link": case "networklink": this.parseLinks(g, b); break; case "style": this.extractStyles && this.parseStyles(g, b); break; case "stylemap": this.extractStyles && this.parseStyleMaps(g, b); break; case "placemark": this.parseFeatures(g, b) } } return this.features
+ }, parseLinks: function(a,
+ b) { if (b.depth >= this.maxDepth) return !1; var c = OpenLayers.Util.extend({}, b); c.depth++; for (var d = 0, e = a.length; d < e; d++) { var f = this.parseProperty(a[d], "*", "href"); f && !this.fetched[f] && (this.fetched[f] = !0, (f = this.fetchLink(f)) && this.parseData(f, c)) } }, fetchLink: function(a) { if (a = OpenLayers.Request.GET({ url: a, async: !1 })) return a.responseText }, parseStyles: function(a, b) { for (var c = 0, d = a.length; c < d; c++) { var e = this.parseStyle(a[c]); e && (this.styles[(b.styleBaseUrl || "") + "#" + e.id] = e) } }, parseKmlColor: function(a) {
+ var b =
+ null; a && (a = a.match(this.regExes.kmlColor)) && (b = { color: "#" + a[4] + a[3] + a[2], opacity: parseInt(a[1], 16) / 255 }); return b
+ }, parseStyle: function(a) {
+ for (var b = {}, c = ["LineStyle", "PolyStyle", "IconStyle", "BalloonStyle", "LabelStyle"], d, e, f = 0, g = c.length; f < g; ++f)if (d = c[f], e = this.getElementsByTagNameNS(a, "*", d)[0]) switch (d.toLowerCase()) {
+ case "linestyle": d = this.parseProperty(e, "*", "color"); if (d = this.parseKmlColor(d)) b.strokeColor = d.color, b.strokeOpacity = d.opacity; (d = this.parseProperty(e, "*", "width")) && (b.strokeWidth =
+ d); break; case "polystyle": d = this.parseProperty(e, "*", "color"); if (d = this.parseKmlColor(d)) b.fillOpacity = d.opacity, b.fillColor = d.color; "0" == this.parseProperty(e, "*", "fill") && (b.fillColor = "none"); "0" == this.parseProperty(e, "*", "outline") && (b.strokeWidth = "0"); break; case "iconstyle": var h = parseFloat(this.parseProperty(e, "*", "scale") || 1); d = 32 * h; var k = 32 * h, l = this.getElementsByTagNameNS(e, "*", "Icon")[0]; if (l) {
+ var m = this.parseProperty(l, "*", "href"); if (m) {
+ var n = this.parseProperty(l, "*", "w"), p = this.parseProperty(l,
+ "*", "h"); !OpenLayers.String.startsWith(m, "http://maps.google.com/mapfiles/kml") || n || p || (p = n = 64, h /= 2); n = n || p; p = p || n; n && (d = parseInt(n) * h); p && (k = parseInt(p) * h); if (p = m.match(this.regExes.kmlIconPalette)) n = p[1], p = p[2], m = this.parseProperty(l, "*", "x"), l = this.parseProperty(l, "*", "y"), m = "http://maps.google.com/mapfiles/kml/pal" + n + "/icon" + (8 * (l ? 7 - l / 32 : 7) + (m ? m / 32 : 0)) + p; b.graphicOpacity = 1; b.externalGraphic = m
+ }
+ } if (e = this.getElementsByTagNameNS(e, "*", "hotSpot")[0]) m = parseFloat(e.getAttribute("x")), l = parseFloat(e.getAttribute("y")),
+ n = e.getAttribute("xunits"), "pixels" == n ? b.graphicXOffset = -m * h : "insetPixels" == n ? b.graphicXOffset = -d + m * h : "fraction" == n && (b.graphicXOffset = -d * m), e = e.getAttribute("yunits"), "pixels" == e ? b.graphicYOffset = -k + l * h + 1 : "insetPixels" == e ? b.graphicYOffset = -(l * h) + 1 : "fraction" == e && (b.graphicYOffset = -k * (1 - l) + 1); b.graphicWidth = d; b.graphicHeight = k; break; case "balloonstyle": (e = OpenLayers.Util.getXmlNodeValue(e)) && (b.balloonStyle = e.replace(this.regExes.straightBracket, "${$1}")); break; case "labelstyle": if (d = this.parseProperty(e,
+ "*", "color"), d = this.parseKmlColor(d)) b.fontColor = d.color, b.fontOpacity = d.opacity
+ }!b.strokeColor && b.fillColor && (b.strokeColor = b.fillColor); (a = a.getAttribute("id")) && b && (b.id = a); return b
+ }, parseStyleMaps: function(a, b) {
+ for (var c = 0, d = a.length; c < d; c++)for (var e = a[c], f = this.getElementsByTagNameNS(e, "*", "Pair"), e = e.getAttribute("id"), g = 0, h = f.length; g < h; g++) {
+ var k = f[g], l = this.parseProperty(k, "*", "key"); (k = this.parseProperty(k, "*", "styleUrl")) && "normal" == l && (this.styles[(b.styleBaseUrl || "") + "#" + e] = this.styles[(b.styleBaseUrl ||
+ "") + k])
+ }
+ }, parseFeatures: function(a, b) {
+ for (var c = [], d = 0, e = a.length; d < e; d++) {
+ var f = a[d], g = this.parseFeature.apply(this, [f]); if (g) {
+ this.extractStyles && g.attributes && g.attributes.styleUrl && (g.style = this.getStyle(g.attributes.styleUrl, b)); if (this.extractStyles) { var h = this.getElementsByTagNameNS(f, "*", "Style")[0]; h && (h = this.parseStyle(h)) && (g.style = OpenLayers.Util.extend(g.style, h)) } this.extractTracks ? (f = this.getElementsByTagNameNS(f, this.namespaces.gx, "Track")) && 0 < f.length && (g = { features: [], feature: g },
+ this.readNode(f[0], g), 0 < g.features.length && c.push.apply(c, g.features)) : c.push(g)
+ } else throw "Bad Placemark: " + d;
+ } this.features = this.features.concat(c)
+ }, readers: {
+ kml: { when: function(a, b) { b.whens.push(OpenLayers.Date.parse(this.getChildValue(a))) }, _trackPointAttribute: function(a, b) { var c = a.nodeName.split(":").pop(); b.attributes[c].push(this.getChildValue(a)) } }, gx: {
+ Track: function(a, b) {
+ var c = { whens: [], points: [], angles: [] }; if (this.trackAttributes) {
+ var d; c.attributes = {}; for (var e = 0, f = this.trackAttributes.length; e <
+ f; ++e)d = this.trackAttributes[e], c.attributes[d] = [], d in this.readers.kml || (this.readers.kml[d] = this.readers.kml._trackPointAttribute)
+ } this.readChildNodes(a, c); if (c.whens.length !== c.points.length) throw Error("gx:Track with unequal number of when (" + c.whens.length + ") and gx:coord (" + c.points.length + ") elements."); var g = 0 < c.angles.length; if (g && c.whens.length !== c.angles.length) throw Error("gx:Track with unequal number of when (" + c.whens.length + ") and gx:angles (" + c.angles.length + ") elements."); for (var h,
+ e = 0, f = c.whens.length; e < f; ++e) {
+ h = b.feature.clone(); h.fid = b.feature.fid || b.feature.id; d = c.points[e]; h.geometry = d; "z" in d && (h.attributes.altitude = d.z); this.internalProjection && this.externalProjection && h.geometry.transform(this.externalProjection, this.internalProjection); if (this.trackAttributes) for (var k = 0, l = this.trackAttributes.length; k < l; ++k)d = this.trackAttributes[k], h.attributes[d] = c.attributes[d][e]; h.attributes.when = c.whens[e]; h.attributes.trackId = b.feature.id; g && (d = c.angles[e], h.attributes.heading =
+ parseFloat(d[0]), h.attributes.tilt = parseFloat(d[1]), h.attributes.roll = parseFloat(d[2])); b.features.push(h)
+ }
+ }, coord: function(a, b) { var c = this.getChildValue(a).replace(this.regExes.trimSpace, "").split(/\s+/), d = new OpenLayers.Geometry.Point(c[0], c[1]); 2 < c.length && (d.z = parseFloat(c[2])); b.points.push(d) }, angles: function(a, b) { var c = this.getChildValue(a).replace(this.regExes.trimSpace, "").split(/\s+/); b.angles.push(c) }
+ }
+ }, parseFeature: function(a) {
+ for (var b = ["MultiGeometry", "Polygon", "LineString", "Point"],
+ c, d, e, f = 0, g = b.length; f < g; ++f)if (c = b[f], this.internalns = a.namespaceURI ? a.namespaceURI : this.kmlns, d = this.getElementsByTagNameNS(a, this.internalns, c), 0 < d.length) { if (b = this.parseGeometry[c.toLowerCase()]) e = b.apply(this, [d[0]]), this.internalProjection && this.externalProjection && e.transform(this.externalProjection, this.internalProjection); else throw new TypeError("Unsupported geometry type: " + c); break } var h; this.extractAttributes && (h = this.parseAttributes(a)); c = new OpenLayers.Feature.Vector(e, h); a = a.getAttribute("id") ||
+ a.getAttribute("name"); null != a && (c.fid = a); return c
+ }, getStyle: function(a, b) { var c = OpenLayers.Util.removeTail(a), d = OpenLayers.Util.extend({}, b); d.depth++; d.styleBaseUrl = c; !this.styles[a] && !OpenLayers.String.startsWith(a, "#") && d.depth <= this.maxDepth && !this.fetched[c] && (c = this.fetchLink(c)) && this.parseData(c, d); return OpenLayers.Util.extend({}, this.styles[a]) }, parseGeometry: {
+ point: function(a) {
+ var b = this.getElementsByTagNameNS(a, this.internalns, "coordinates"); a = []; if (0 < b.length) {
+ var c = b[0].firstChild.nodeValue,
+ c = c.replace(this.regExes.removeSpace, ""); a = c.split(",")
+ } if (1 < a.length) 2 == a.length && (a[2] = null), b = new OpenLayers.Geometry.Point(a[0], a[1], a[2]); else throw "Bad coordinate string: " + c; return b
+ }, linestring: function(a, b) {
+ var c = this.getElementsByTagNameNS(a, this.internalns, "coordinates"), d = null; if (0 < c.length) {
+ for (var c = this.getChildValue(c[0]), c = c.replace(this.regExes.trimSpace, ""), c = c.replace(this.regExes.trimComma, ","), d = c.split(this.regExes.splitSpace), e = d.length, f = Array(e), g, h, k = 0; k < e; ++k)if (g = d[k].split(","),
+ h = g.length, 1 < h) 2 == g.length && (g[2] = null), f[k] = new OpenLayers.Geometry.Point(g[0], g[1], g[2]); else throw "Bad LineString point coordinates: " + d[k]; if (e) d = b ? new OpenLayers.Geometry.LinearRing(f) : new OpenLayers.Geometry.LineString(f); else throw "Bad LineString coordinates: " + c;
+ } return d
+ }, polygon: function(a) {
+ a = this.getElementsByTagNameNS(a, this.internalns, "LinearRing"); var b = a.length, c = Array(b); if (0 < b) for (var d = 0, e = a.length; d < e; ++d)if (b = this.parseGeometry.linestring.apply(this, [a[d], !0])) c[d] = b; else throw "Bad LinearRing geometry: " +
+ d; return new OpenLayers.Geometry.Polygon(c)
+ }, multigeometry: function(a) { for (var b, c = [], d = a.childNodes, e = 0, f = d.length; e < f; ++e)a = d[e], 1 == a.nodeType && (b = a.prefix ? a.nodeName.split(":")[1] : a.nodeName, (b = this.parseGeometry[b.toLowerCase()]) && c.push(b.apply(this, [a]))); return new OpenLayers.Geometry.Collection(c) }
+ }, parseAttributes: function(a) {
+ var b = {}, c = a.getElementsByTagName("ExtendedData"); c.length && (b = this.parseExtendedData(c[0])); var d, e, f; a = a.childNodes; for (var c = 0, g = a.length; c < g; ++c)if (d = a[c], 1 == d.nodeType &&
+ (e = d.childNodes, 1 <= e.length && 3 >= e.length)) { switch (e.length) { case 1: f = e[0]; break; case 2: f = e[0]; e = e[1]; f = 3 == f.nodeType || 4 == f.nodeType ? f : e; break; default: f = e[1] }if (3 == f.nodeType || 4 == f.nodeType) if (d = d.prefix ? d.nodeName.split(":")[1] : d.nodeName, f = OpenLayers.Util.getXmlNodeValue(f)) f = f.replace(this.regExes.trimSpace, ""), b[d] = f } return b
+ }, parseExtendedData: function(a) {
+ var b = {}, c, d, e, f, g = a.getElementsByTagName("Data"); c = 0; for (d = g.length; c < d; c++) {
+ e = g[c]; f = e.getAttribute("name"); var h = {}, k = e.getElementsByTagName("value");
+ k.length && (h.value = this.getChildValue(k[0])); this.kvpAttributes ? b[f] = h.value : (e = e.getElementsByTagName("displayName"), e.length && (h.displayName = this.getChildValue(e[0])), b[f] = h)
+ } a = a.getElementsByTagName("SimpleData"); c = 0; for (d = a.length; c < d; c++)h = {}, e = a[c], f = e.getAttribute("name"), h.value = this.getChildValue(e), this.kvpAttributes ? b[f] = h.value : (h.displayName = f, b[f] = h); return b
+ }, parseProperty: function(a, b, c) {
+ var d; a = this.getElementsByTagNameNS(a, b, c); try { d = OpenLayers.Util.getXmlNodeValue(a[0]) } catch (e) {
+ d =
+ null
+ } return d
+ }, write: function(a) { OpenLayers.Util.isArray(a) || (a = [a]); for (var b = this.createElementNS(this.kmlns, "kml"), c = this.createFolderXML(), d = 0, e = a.length; d < e; ++d)c.appendChild(this.createPlacemarkXML(a[d])); b.appendChild(c); return OpenLayers.Format.XML.prototype.write.apply(this, [b]) }, createFolderXML: function() {
+ var a = this.createElementNS(this.kmlns, "Folder"); if (this.foldersName) { var b = this.createElementNS(this.kmlns, "name"), c = this.createTextNode(this.foldersName); b.appendChild(c); a.appendChild(b) } this.foldersDesc &&
+ (b = this.createElementNS(this.kmlns, "description"), c = this.createTextNode(this.foldersDesc), b.appendChild(c), a.appendChild(b)); return a
+ }, createPlacemarkXML: function(a) {
+ var b = this.createElementNS(this.kmlns, "name"), c = a.style && a.style.label ? a.style.label : a.id; b.appendChild(this.createTextNode(a.attributes.name || c)); var d = this.createElementNS(this.kmlns, "description"); d.appendChild(this.createTextNode(a.attributes.description || this.placemarksDesc)); c = this.createElementNS(this.kmlns, "Placemark"); null !=
+ a.fid && c.setAttribute("id", a.fid); c.appendChild(b); c.appendChild(d); b = this.buildGeometryNode(a.geometry); c.appendChild(b); a.attributes && (a = this.buildExtendedData(a.attributes)) && c.appendChild(a); return c
+ }, buildGeometryNode: function(a) { var b = a.CLASS_NAME, b = b.substring(b.lastIndexOf(".") + 1), b = this.buildGeometry[b.toLowerCase()], c = null; b && (c = b.apply(this, [a])); return c }, buildGeometry: {
+ point: function(a) { var b = this.createElementNS(this.kmlns, "Point"); b.appendChild(this.buildCoordinatesNode(a)); return b },
+ multipoint: function(a) { return this.buildGeometry.collection.apply(this, [a]) }, linestring: function(a) { var b = this.createElementNS(this.kmlns, "LineString"); b.appendChild(this.buildCoordinatesNode(a)); return b }, multilinestring: function(a) { return this.buildGeometry.collection.apply(this, [a]) }, linearring: function(a) { var b = this.createElementNS(this.kmlns, "LinearRing"); b.appendChild(this.buildCoordinatesNode(a)); return b }, polygon: function(a) {
+ var b = this.createElementNS(this.kmlns, "Polygon"); a = a.components;
+ for (var c, d, e = 0, f = a.length; e < f; ++e)c = 0 == e ? "outerBoundaryIs" : "innerBoundaryIs", c = this.createElementNS(this.kmlns, c), d = this.buildGeometry.linearring.apply(this, [a[e]]), c.appendChild(d), b.appendChild(c); return b
+ }, multipolygon: function(a) { return this.buildGeometry.collection.apply(this, [a]) }, collection: function(a) { for (var b = this.createElementNS(this.kmlns, "MultiGeometry"), c, d = 0, e = a.components.length; d < e; ++d)(c = this.buildGeometryNode.apply(this, [a.components[d]])) && b.appendChild(c); return b }
+ }, buildCoordinatesNode: function(a) {
+ var b =
+ this.createElementNS(this.kmlns, "coordinates"), c; if (c = a.components) { for (var d = c.length, e = Array(d), f = 0; f < d; ++f)a = c[f], e[f] = this.buildCoordinates(a); c = e.join(" ") } else c = this.buildCoordinates(a); c = this.createTextNode(c); b.appendChild(c); return b
+ }, buildCoordinates: function(a) { this.internalProjection && this.externalProjection && (a = a.clone(), a.transform(this.internalProjection, this.externalProjection)); return a.x + "," + a.y }, buildExtendedData: function(a) {
+ var b = this.createElementNS(this.kmlns, "ExtendedData"),
+ c; for (c in a) if (a[c] && "name" != c && "description" != c && "styleUrl" != c) { var d = this.createElementNS(this.kmlns, "Data"); d.setAttribute("name", c); var e = this.createElementNS(this.kmlns, "value"); if ("object" == typeof a[c]) { if (a[c].value && e.appendChild(this.createTextNode(a[c].value)), a[c].displayName) { var f = this.createElementNS(this.kmlns, "displayName"); f.appendChild(this.getXMLDoc().createCDATASection(a[c].displayName)); d.appendChild(f) } } else e.appendChild(this.createTextNode(a[c])); d.appendChild(e); b.appendChild(d) } return this.isSimpleContent(b) ?
+ null : b
+ }, CLASS_NAME: "OpenLayers.Format.KML"
+}); OpenLayers.Format.WMSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.1.1", profile: null, CLASS_NAME: "OpenLayers.Format.WMSCapabilities" });
+OpenLayers.Format.WMSCapabilities.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { wms: "http://www.opengis.net/wms", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, defaultPrefix: "wms", read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); var b = a; a && 9 == a.nodeType && (a = a.documentElement); var c = {}; this.readNode(a, c); void 0 === c.service && (a = new OpenLayers.Format.OGCExceptionReport, c.error = a.read(b)); return c }, readers: {
+ wms: {
+ Service: function(a,
+ b) { b.service = {}; this.readChildNodes(a, b.service) }, Name: function(a, b) { b.name = this.getChildValue(a) }, Title: function(a, b) { b.title = this.getChildValue(a) }, Abstract: function(a, b) { b["abstract"] = this.getChildValue(a) }, BoundingBox: function(a, b) {
+ var c = {}; c.bbox = [parseFloat(a.getAttribute("minx")), parseFloat(a.getAttribute("miny")), parseFloat(a.getAttribute("maxx")), parseFloat(a.getAttribute("maxy"))]; var d = { x: parseFloat(a.getAttribute("resx")), y: parseFloat(a.getAttribute("resy")) }; isNaN(d.x) && isNaN(d.y) || (c.res =
+ d); return c
+ }, OnlineResource: function(a, b) { b.href = this.getAttributeNS(a, this.namespaces.xlink, "href") }, ContactInformation: function(a, b) { b.contactInformation = {}; this.readChildNodes(a, b.contactInformation) }, ContactPersonPrimary: function(a, b) { b.personPrimary = {}; this.readChildNodes(a, b.personPrimary) }, ContactPerson: function(a, b) { b.person = this.getChildValue(a) }, ContactOrganization: function(a, b) { b.organization = this.getChildValue(a) }, ContactPosition: function(a, b) { b.position = this.getChildValue(a) }, ContactAddress: function(a,
+ b) { b.contactAddress = {}; this.readChildNodes(a, b.contactAddress) }, AddressType: function(a, b) { b.type = this.getChildValue(a) }, Address: function(a, b) { b.address = this.getChildValue(a) }, City: function(a, b) { b.city = this.getChildValue(a) }, StateOrProvince: function(a, b) { b.stateOrProvince = this.getChildValue(a) }, PostCode: function(a, b) { b.postcode = this.getChildValue(a) }, Country: function(a, b) { b.country = this.getChildValue(a) }, ContactVoiceTelephone: function(a, b) { b.phone = this.getChildValue(a) }, ContactFacsimileTelephone: function(a,
+ b) { b.fax = this.getChildValue(a) }, ContactElectronicMailAddress: function(a, b) { b.email = this.getChildValue(a) }, Fees: function(a, b) { var c = this.getChildValue(a); c && "none" != c.toLowerCase() && (b.fees = c) }, AccessConstraints: function(a, b) { var c = this.getChildValue(a); c && "none" != c.toLowerCase() && (b.accessConstraints = c) }, Capability: function(a, b) { b.capability = { nestedLayers: [], layers: [] }; this.readChildNodes(a, b.capability) }, Request: function(a, b) { b.request = {}; this.readChildNodes(a, b.request) }, GetCapabilities: function(a,
+ b) { b.getcapabilities = { formats: [] }; this.readChildNodes(a, b.getcapabilities) }, Format: function(a, b) { OpenLayers.Util.isArray(b.formats) ? b.formats.push(this.getChildValue(a)) : b.format = this.getChildValue(a) }, DCPType: function(a, b) { this.readChildNodes(a, b) }, HTTP: function(a, b) { this.readChildNodes(a, b) }, Get: function(a, b) { b.get = {}; this.readChildNodes(a, b.get); b.href || (b.href = b.get.href) }, Post: function(a, b) { b.post = {}; this.readChildNodes(a, b.post); b.href || (b.href = b.get.href) }, GetMap: function(a, b) {
+ b.getmap = { formats: [] };
+ this.readChildNodes(a, b.getmap)
+ }, GetFeatureInfo: function(a, b) { b.getfeatureinfo = { formats: [] }; this.readChildNodes(a, b.getfeatureinfo) }, Exception: function(a, b) { b.exception = { formats: [] }; this.readChildNodes(a, b.exception) }, Layer: function(a, b) {
+ var c, d; b.capability ? (d = b.capability, c = b) : d = b; var e = a.getAttributeNode("queryable"), f = e && e.specified ? a.getAttribute("queryable") : null, g = (e = a.getAttributeNode("cascaded")) && e.specified ? a.getAttribute("cascaded") : null, e = (e = a.getAttributeNode("opaque")) && e.specified ?
+ a.getAttribute("opaque") : null, h = a.getAttribute("noSubsets"), k = a.getAttribute("fixedWidth"), l = a.getAttribute("fixedHeight"), m = c || {}, n = OpenLayers.Util.extend; c = {
+ nestedLayers: [], styles: c ? [].concat(c.styles) : [], srs: c ? n({}, m.srs) : {}, metadataURLs: [], bbox: c ? n({}, m.bbox) : {}, llbbox: m.llbbox, dimensions: c ? n({}, m.dimensions) : {}, authorityURLs: c ? n({}, m.authorityURLs) : {}, identifiers: {}, keywords: [], queryable: f && "" !== f ? "1" === f || "true" === f : m.queryable || !1, cascaded: null !== g ? parseInt(g) : m.cascaded || 0, opaque: e ? "1" ===
+ e || "true" === e : m.opaque || !1, noSubsets: null !== h ? "1" === h || "true" === h : m.noSubsets || !1, fixedWidth: null != k ? parseInt(k) : m.fixedWidth || 0, fixedHeight: null != l ? parseInt(l) : m.fixedHeight || 0, minScale: m.minScale, maxScale: m.maxScale, attribution: m.attribution
+ }; b.nestedLayers.push(c); c.capability = d; this.readChildNodes(a, c); delete c.capability; c.name && (f = c.name.split(":"), g = d.request, e = g.getfeatureinfo, 0 < f.length && (c.prefix = f[0]), d.layers.push(c), void 0 === c.formats && (c.formats = g.getmap.formats), void 0 === c.infoFormats &&
+ e && (c.infoFormats = e.formats))
+ }, Attribution: function(a, b) { b.attribution = {}; this.readChildNodes(a, b.attribution) }, LogoURL: function(a, b) { b.logo = { width: a.getAttribute("width"), height: a.getAttribute("height") }; this.readChildNodes(a, b.logo) }, Style: function(a, b) { var c = {}; b.styles.push(c); this.readChildNodes(a, c) }, LegendURL: function(a, b) { var c = { width: a.getAttribute("width"), height: a.getAttribute("height") }; b.legend = c; this.readChildNodes(a, c) }, MetadataURL: function(a, b) {
+ var c = { type: a.getAttribute("type") };
+ b.metadataURLs.push(c); this.readChildNodes(a, c)
+ }, DataURL: function(a, b) { b.dataURL = {}; this.readChildNodes(a, b.dataURL) }, FeatureListURL: function(a, b) { b.featureListURL = {}; this.readChildNodes(a, b.featureListURL) }, AuthorityURL: function(a, b) { var c = a.getAttribute("name"), d = {}; this.readChildNodes(a, d); b.authorityURLs[c] = d.href }, Identifier: function(a, b) { var c = a.getAttribute("authority"); b.identifiers[c] = this.getChildValue(a) }, KeywordList: function(a, b) { this.readChildNodes(a, b) }, SRS: function(a, b) {
+ b.srs[this.getChildValue(a)] =
+ !0
+ }
+ }
+ }, CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1"
+});
+OpenLayers.Format.WMSCapabilities.v1_1 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1, {
+ readers: {
+ wms: OpenLayers.Util.applyDefaults({
+ WMT_MS_Capabilities: function(a, b) { this.readChildNodes(a, b) }, Keyword: function(a, b) { b.keywords && b.keywords.push(this.getChildValue(a)) }, DescribeLayer: function(a, b) { b.describelayer = { formats: [] }; this.readChildNodes(a, b.describelayer) }, GetLegendGraphic: function(a, b) { b.getlegendgraphic = { formats: [] }; this.readChildNodes(a, b.getlegendgraphic) }, GetStyles: function(a, b) {
+ b.getstyles =
+ { formats: [] }; this.readChildNodes(a, b.getstyles)
+ }, PutStyles: function(a, b) { b.putstyles = { formats: [] }; this.readChildNodes(a, b.putstyles) }, UserDefinedSymbolization: function(a, b) { var c = { supportSLD: 1 == parseInt(a.getAttribute("SupportSLD")), userLayer: 1 == parseInt(a.getAttribute("UserLayer")), userStyle: 1 == parseInt(a.getAttribute("UserStyle")), remoteWFS: 1 == parseInt(a.getAttribute("RemoteWFS")) }; b.userSymbols = c }, LatLonBoundingBox: function(a, b) {
+ b.llbbox = [parseFloat(a.getAttribute("minx")), parseFloat(a.getAttribute("miny")),
+ parseFloat(a.getAttribute("maxx")), parseFloat(a.getAttribute("maxy"))]
+ }, BoundingBox: function(a, b) { var c = OpenLayers.Format.WMSCapabilities.v1.prototype.readers.wms.BoundingBox.apply(this, [a, b]); c.srs = a.getAttribute("SRS"); b.bbox[c.srs] = c }, ScaleHint: function(a, b) {
+ var c = a.getAttribute("min"), d = a.getAttribute("max"), e = Math.pow(2, .5), f = OpenLayers.INCHES_PER_UNIT.m; 0 != c && (b.maxScale = parseFloat((c / e * f * OpenLayers.DOTS_PER_INCH).toPrecision(13))); d != Number.POSITIVE_INFINITY && (b.minScale = parseFloat((d / e * f *
+ OpenLayers.DOTS_PER_INCH).toPrecision(13)))
+ }, Dimension: function(a, b) { var c = { name: a.getAttribute("name").toLowerCase(), units: a.getAttribute("units"), unitsymbol: a.getAttribute("unitSymbol") }; b.dimensions[c.name] = c }, Extent: function(a, b) {
+ var c = a.getAttribute("name").toLowerCase(); if (c in b.dimensions) {
+ c = b.dimensions[c]; c.nearestVal = "1" === a.getAttribute("nearestValue"); c.multipleVal = "1" === a.getAttribute("multipleValues"); c.current = "1" === a.getAttribute("current"); c["default"] = a.getAttribute("default") ||
+ ""; var d = this.getChildValue(a); c.values = d.split(",")
+ }
+ }
+ }, OpenLayers.Format.WMSCapabilities.v1.prototype.readers.wms)
+ }, CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1"
+}); OpenLayers.Format.WMSCapabilities.v1_1_0 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_1, { version: "1.1.0", readers: { wms: OpenLayers.Util.applyDefaults({ SRS: function(a, b) { for (var c = this.getChildValue(a).split(/ +/), d = 0, e = c.length; d < e; d++)b.srs[c[d]] = !0 } }, OpenLayers.Format.WMSCapabilities.v1_1.prototype.readers.wms) }, CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1_0" });
+OpenLayers.Protocol.WFS.v1 = OpenLayers.Class(OpenLayers.Protocol, {
+ version: null, srsName: "EPSG:4326", featureType: null, featureNS: null, geometryName: "the_geom", schema: null, featurePrefix: "feature", formatOptions: null, readFormat: null, readOptions: null, initialize: function(a) {
+ OpenLayers.Protocol.prototype.initialize.apply(this, [a]); a.format || (this.format = OpenLayers.Format.WFST(OpenLayers.Util.extend({
+ version: this.version, featureType: this.featureType, featureNS: this.featureNS, featurePrefix: this.featurePrefix, geometryName: this.geometryName,
+ srsName: this.srsName, schema: this.schema
+ }, this.formatOptions))); !a.geometryName && 1 < parseFloat(this.format.version) && this.setGeometryName(null)
+ }, destroy: function() { this.options && !this.options.format && this.format.destroy(); this.format = null; OpenLayers.Protocol.prototype.destroy.apply(this) }, read: function(a) {
+ OpenLayers.Protocol.prototype.read.apply(this, arguments); a = OpenLayers.Util.extend({}, a); OpenLayers.Util.applyDefaults(a, this.options || {}); var b = new OpenLayers.Protocol.Response({ requestType: "read" }),
+ c = OpenLayers.Format.XML.prototype.write.apply(this.format, [this.format.writeNode("wfs:GetFeature", a)]); b.priv = OpenLayers.Request.POST({ url: a.url, callback: this.createCallback(this.handleRead, b, a), params: a.params, headers: a.headers, data: c }); return b
+ }, setFeatureType: function(a) { this.featureType = a; this.format.featureType = a }, setGeometryName: function(a) { this.geometryName = a; this.format.geometryName = a }, handleRead: function(a, b) {
+ b = OpenLayers.Util.extend({}, b); OpenLayers.Util.applyDefaults(b, this.options); if (b.callback) {
+ var c =
+ a.priv; 200 <= c.status && 300 > c.status ? (c = this.parseResponse(c, b.readOptions)) && !1 !== c.success ? (b.readOptions && "object" == b.readOptions.output ? OpenLayers.Util.extend(a, c) : a.features = c, a.code = OpenLayers.Protocol.Response.SUCCESS) : (a.code = OpenLayers.Protocol.Response.FAILURE, a.error = c) : a.code = OpenLayers.Protocol.Response.FAILURE; b.callback.call(b.scope, a)
+ }
+ }, parseResponse: function(a, b) {
+ var c = a.responseXML; c && c.documentElement || (c = a.responseText); if (!c || 0 >= c.length) return null; c = null !== this.readFormat ? this.readFormat.read(c) :
+ this.format.read(c, b); if (!this.featureNS) { var d = this.readFormat || this.format; this.featureNS = d.featureNS; d.autoConfig = !1; this.geometryName || this.setGeometryName(d.geometryName) } return c
+ }, commit: function(a, b) {
+ b = OpenLayers.Util.extend({}, b); OpenLayers.Util.applyDefaults(b, this.options); var c = new OpenLayers.Protocol.Response({ requestType: "commit", reqFeatures: a }); c.priv = OpenLayers.Request.POST({ url: b.url, headers: b.headers, data: this.format.write(a, b), callback: this.createCallback(this.handleCommit, c, b) });
+ return c
+ }, handleCommit: function(a, b) { if (b.callback) { var c = a.priv, d = c.responseXML; d && d.documentElement || (d = c.responseText); c = this.format.read(d) || {}; a.insertIds = c.insertIds || []; c.success ? a.code = OpenLayers.Protocol.Response.SUCCESS : (a.code = OpenLayers.Protocol.Response.FAILURE, a.error = c); b.callback.call(b.scope, a) } }, filterDelete: function(a, b) {
+ b = OpenLayers.Util.extend({}, b); OpenLayers.Util.applyDefaults(b, this.options); new OpenLayers.Protocol.Response({ requestType: "commit" }); var c = this.format.createElementNSPlus("wfs:Transaction",
+ { attributes: { service: "WFS", version: this.version } }), d = this.format.createElementNSPlus("wfs:Delete", { attributes: { typeName: (b.featureNS ? this.featurePrefix + ":" : "") + b.featureType } }); b.featureNS && d.setAttribute("xmlns:" + this.featurePrefix, b.featureNS); var e = this.format.writeNode("ogc:Filter", a); d.appendChild(e); c.appendChild(d); c = OpenLayers.Format.XML.prototype.write.apply(this.format, [c]); return OpenLayers.Request.POST({ url: this.url, callback: b.callback || function() { }, data: c })
+ }, abort: function(a) { a && a.priv.abort() },
+ CLASS_NAME: "OpenLayers.Protocol.WFS.v1"
+});
+OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
+ EVENTMAP: { click: { "in": "click", out: "clickout" }, mousemove: { "in": "over", out: "out" }, dblclick: { "in": "dblclick", out: null }, mousedown: { "in": null, out: null }, mouseup: { "in": null, out: null }, touchstart: { "in": "click", out: "clickout" } }, feature: null, lastFeature: null, down: null, up: null, clickTolerance: 4, geometryTypes: null, stopClick: !0, stopDown: !0, stopUp: !1, initialize: function(a, b, c, d) {
+ OpenLayers.Handler.prototype.initialize.apply(this, [a, c, d]); this.layer =
+ b
+ }, touchstart: function(a) { this.startTouch(); return OpenLayers.Event.isMultiTouch(a) ? !0 : this.mousedown(a) }, touchmove: function(a) { OpenLayers.Event.preventDefault(a) }, mousedown: function(a) { if (OpenLayers.Event.isLeftClick(a) || OpenLayers.Event.isSingleTouch(a)) this.down = a.xy; return this.handle(a) ? !this.stopDown : !0 }, mouseup: function(a) { this.up = a.xy; return this.handle(a) ? !this.stopUp : !0 }, click: function(a) { return this.handle(a) ? !this.stopClick : !0 }, mousemove: function(a) {
+ if (!this.callbacks.over && !this.callbacks.out) return !0;
+ this.handle(a); return !0
+ }, dblclick: function(a) { return !this.handle(a) }, geometryTypeMatches: function(a) { return null == this.geometryTypes || -1 < OpenLayers.Util.indexOf(this.geometryTypes, a.geometry.CLASS_NAME) }, handle: function(a) {
+ this.feature && !this.feature.layer && (this.feature = null); var b = a.type, c = !1, d = !!this.feature, e = "click" == b || "dblclick" == b || "touchstart" == b; (this.feature = this.layer.getFeatureFromEvent(a)) && !this.feature.layer && (this.feature = null); this.lastFeature && !this.lastFeature.layer && (this.lastFeature =
+ null); this.feature ? ("touchstart" === b && OpenLayers.Event.preventDefault(a), a = this.feature != this.lastFeature, this.geometryTypeMatches(this.feature) ? (d && a ? (this.lastFeature && this.triggerCallback(b, "out", [this.lastFeature]), this.triggerCallback(b, "in", [this.feature])) : d && !e || this.triggerCallback(b, "in", [this.feature]), this.lastFeature = this.feature, c = !0) : (this.lastFeature && (d && a || e) && this.triggerCallback(b, "out", [this.lastFeature]), this.feature = null)) : this.lastFeature && (d || e) && this.triggerCallback(b, "out",
+ [this.lastFeature]); return c
+ }, triggerCallback: function(a, b, c) { if (b = this.EVENTMAP[a][b]) "click" == a && this.up && this.down ? (Math.sqrt(Math.pow(this.up.x - this.down.x, 2) + Math.pow(this.up.y - this.down.y, 2)) <= this.clickTolerance && this.callback(b, c), this.up = this.down = null) : this.callback(b, c) }, activate: function() {
+ var a = !1; OpenLayers.Handler.prototype.activate.apply(this, arguments) && (this.moveLayerToTop(), this.map.events.on({ removelayer: this.handleMapEvents, changelayer: this.handleMapEvents, scope: this }), a = !0);
+ return a
+ }, deactivate: function() { var a = !1; OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.moveLayerBack(), this.up = this.down = this.lastFeature = this.feature = null, this.map.events.un({ removelayer: this.handleMapEvents, changelayer: this.handleMapEvents, scope: this }), a = !0); return a }, handleMapEvents: function(a) { "removelayer" != a.type && "order" != a.property || this.moveLayerToTop() }, moveLayerToTop: function() { var a = Math.max(this.map.Z_INDEX_BASE.Feature - 1, this.layer.getZIndex()) + 1; this.layer.setZIndex(a) },
+ moveLayerBack: function() { var a = this.layer.getZIndex() - 1; a >= this.map.Z_INDEX_BASE.Feature ? this.layer.setZIndex(a) : this.map.setLayerZIndex(this.layer, this.map.getLayerIndex(this.layer)) }, CLASS_NAME: "OpenLayers.Handler.Feature"
+});
+OpenLayers.Layer.Vector.RootContainer = OpenLayers.Class(OpenLayers.Layer.Vector, {
+ displayInLayerSwitcher: !1, layers: null, display: function() { }, getFeatureFromEvent: function(a) { for (var b = this.layers, c, d = 0; d < b.length; d++)if (c = b[d].getFeatureFromEvent(a)) return c }, setMap: function(a) { OpenLayers.Layer.Vector.prototype.setMap.apply(this, arguments); this.collectRoots(); a.events.register("changelayer", this, this.handleChangeLayer) }, removeMap: function(a) {
+ a.events.unregister("changelayer", this, this.handleChangeLayer);
+ this.resetRoots(); OpenLayers.Layer.Vector.prototype.removeMap.apply(this, arguments)
+ }, collectRoots: function() { for (var a, b = 0; b < this.map.layers.length; ++b)a = this.map.layers[b], -1 != OpenLayers.Util.indexOf(this.layers, a) && a.renderer.moveRoot(this.renderer) }, resetRoots: function() { for (var a, b = 0; b < this.layers.length; ++b)a = this.layers[b], this.renderer && a.renderer.getRenderLayerId() == this.id && this.renderer.moveRoot(a.renderer) }, handleChangeLayer: function(a) {
+ var b = a.layer; "order" == a.property && -1 != OpenLayers.Util.indexOf(this.layers,
+ b) && (this.resetRoots(), this.collectRoots())
+ }, CLASS_NAME: "OpenLayers.Layer.Vector.RootContainer"
+});
+OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
+ multipleKey: null, toggleKey: null, multiple: !1, clickout: !0, toggle: !1, hover: !1, highlightOnly: !1, box: !1, onBeforeSelect: function() { }, onSelect: function() { }, onUnselect: function() { }, scope: null, geometryTypes: null, layer: null, layers: null, callbacks: null, selectStyle: null, renderIntent: "select", handlers: null, initialize: function(a, b) {
+ OpenLayers.Control.prototype.initialize.apply(this, [b]); null === this.scope && (this.scope = this); this.initLayer(a); var c =
+ { click: this.clickFeature, clickout: this.clickoutFeature }; this.hover && (c.over = this.overFeature, c.out = this.outFeature); this.callbacks = OpenLayers.Util.extend(c, this.callbacks); this.handlers = { feature: new OpenLayers.Handler.Feature(this, this.layer, this.callbacks, { geometryTypes: this.geometryTypes }) }; this.box && (this.handlers.box = new OpenLayers.Handler.Box(this, { done: this.selectBox }, { boxDivClassName: "olHandlerBoxSelectFeature" }))
+ }, initLayer: function(a) {
+ OpenLayers.Util.isArray(a) ? (this.layers = a, this.layer =
+ new OpenLayers.Layer.Vector.RootContainer(this.id + "_container", { layers: a })) : this.layer = a
+ }, destroy: function() { this.active && this.layers && this.map.removeLayer(this.layer); OpenLayers.Control.prototype.destroy.apply(this, arguments); this.layers && this.layer.destroy() }, activate: function() { this.active || (this.layers && this.map.addLayer(this.layer), this.handlers.feature.activate(), this.box && this.handlers.box && this.handlers.box.activate()); return OpenLayers.Control.prototype.activate.apply(this, arguments) }, deactivate: function() {
+ this.active &&
+ (this.handlers.feature.deactivate(), this.handlers.box && this.handlers.box.deactivate(), this.layers && this.map.removeLayer(this.layer)); return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+ }, unselectAll: function(a) { var b = this.layers || [this.layer], c, d, e, f; for (e = 0; e < b.length; ++e)if (c = b[e], f = 0, null != c.selectedFeatures) for (; c.selectedFeatures.length > f;)d = c.selectedFeatures[f], a && a.except == d ? ++f : this.unselect(d) }, clickFeature: function(a) {
+ this.hover || (-1 < OpenLayers.Util.indexOf(a.layer.selectedFeatures,
+ a) ? this.toggleSelect() ? this.unselect(a) : this.multipleSelect() || this.unselectAll({ except: a }) : (this.multipleSelect() || this.unselectAll({ except: a }), this.select(a)))
+ }, multipleSelect: function() { return this.multiple || this.handlers.feature.evt && this.handlers.feature.evt[this.multipleKey] }, toggleSelect: function() { return this.toggle || this.handlers.feature.evt && this.handlers.feature.evt[this.toggleKey] }, clickoutFeature: function(a) { !this.hover && this.clickout && this.unselectAll() }, overFeature: function(a) {
+ var b =
+ a.layer; this.hover && (this.highlightOnly ? this.highlight(a) : -1 == OpenLayers.Util.indexOf(b.selectedFeatures, a) && this.select(a))
+ }, outFeature: function(a) { if (this.hover) if (this.highlightOnly) { if (a._lastHighlighter == this.id) if (a._prevHighlighter && a._prevHighlighter != this.id) { delete a._lastHighlighter; var b = this.map.getControl(a._prevHighlighter); b && b.highlight(a) } else this.unhighlight(a) } else this.unselect(a) }, highlight: function(a) {
+ var b = a.layer; !1 !== this.events.triggerEvent("beforefeaturehighlighted", { feature: a }) &&
+ (a._prevHighlighter = a._lastHighlighter, a._lastHighlighter = this.id, b.drawFeature(a, this.selectStyle || this.renderIntent), this.events.triggerEvent("featurehighlighted", { feature: a }))
+ }, unhighlight: function(a) { var b = a.layer; void 0 == a._prevHighlighter ? delete a._lastHighlighter : (a._prevHighlighter != this.id && (a._lastHighlighter = a._prevHighlighter), delete a._prevHighlighter); b.drawFeature(a, a.style || a.layer.style || "default"); this.events.triggerEvent("featureunhighlighted", { feature: a }) }, select: function(a) {
+ var b =
+ this.onBeforeSelect.call(this.scope, a), c = a.layer; !1 !== b && (b = c.events.triggerEvent("beforefeatureselected", { feature: a }), !1 !== b && (c.selectedFeatures.push(a), this.highlight(a), this.handlers.feature.lastFeature || (this.handlers.feature.lastFeature = c.selectedFeatures[0]), c.events.triggerEvent("featureselected", { feature: a }), this.onSelect.call(this.scope, a)))
+ }, unselect: function(a) {
+ var b = a.layer; this.unhighlight(a); OpenLayers.Util.removeItem(b.selectedFeatures, a); b.events.triggerEvent("featureunselected",
+ { feature: a }); this.onUnselect.call(this.scope, a)
+ }, selectBox: function(a) {
+ if (a instanceof OpenLayers.Bounds) {
+ var b = this.map.getLonLatFromPixel({ x: a.left, y: a.bottom }); a = this.map.getLonLatFromPixel({ x: a.right, y: a.top }); b = new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat); this.multipleSelect() || this.unselectAll(); a = this.multiple; this.multiple = !0; var c = this.layers || [this.layer]; this.events.triggerEvent("boxselectionstart", { layers: c }); for (var d, e = 0; e < c.length; ++e) {
+ d = c[e]; for (var f = 0, g = d.features.length; f < g; ++f) {
+ var h =
+ d.features[f]; h.getVisibility() && (null == this.geometryTypes || -1 < OpenLayers.Util.indexOf(this.geometryTypes, h.geometry.CLASS_NAME)) && b.toGeometry().intersects(h.geometry) && -1 == OpenLayers.Util.indexOf(d.selectedFeatures, h) && this.select(h)
+ }
+ } this.multiple = a; this.events.triggerEvent("boxselectionend", { layers: c })
+ }
+ }, setMap: function(a) { this.handlers.feature.setMap(a); this.box && this.handlers.box.setMap(a); OpenLayers.Control.prototype.setMap.apply(this, arguments) }, setLayer: function(a) {
+ var b = this.active; this.unselectAll();
+ this.deactivate(); this.layers && (this.layer.destroy(), this.layers = null); this.initLayer(a); this.handlers.feature.layer = this.layer; b && this.activate()
+ }, CLASS_NAME: "OpenLayers.Control.SelectFeature"
+});
+OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, {
+ point: null, layer: null, multi: !1, citeCompliant: !1, mouseDown: !1, stoppedDown: null, lastDown: null, lastUp: null, persist: !1, stopDown: !1, stopUp: !1, layerOptions: null, pixelTolerance: 5, lastTouchPx: null, initialize: function(a, b, c) { c && c.layerOptions && c.layerOptions.styleMap || (this.style = OpenLayers.Util.extend(OpenLayers.Feature.Vector.style["default"], {})); OpenLayers.Handler.prototype.initialize.apply(this, arguments) }, activate: function() {
+ if (!OpenLayers.Handler.prototype.activate.apply(this,
+ arguments)) return !1; var a = OpenLayers.Util.extend({ displayInLayerSwitcher: !1, calculateInRange: OpenLayers.Function.True, wrapDateLine: this.citeCompliant }, this.layerOptions); this.layer = new OpenLayers.Layer.Vector(this.CLASS_NAME, a); this.map.addLayer(this.layer); return !0
+ }, createFeature: function(a) {
+ a = this.layer.getLonLatFromViewPortPx(a); a = new OpenLayers.Geometry.Point(a.lon, a.lat); this.point = new OpenLayers.Feature.Vector(a); this.callback("create", [this.point.geometry, this.point]); this.point.geometry.clearBounds();
+ this.layer.addFeatures([this.point], { silent: !0 })
+ }, deactivate: function() { if (!OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) return !1; this.cancel(); null != this.layer.map && (this.destroyFeature(!0), this.layer.destroy(!1)); this.layer = null; return !0 }, destroyFeature: function(a) { !this.layer || !a && this.persist || this.layer.destroyFeatures(); this.point = null }, destroyPersistedFeature: function() { var a = this.layer; a && 1 < a.features.length && this.layer.features[0].destroy() }, finalize: function(a) {
+ this.mouseDown =
+ !1; this.lastTouchPx = this.lastUp = this.lastDown = null; this.callback(a ? "cancel" : "done", [this.geometryClone()]); this.destroyFeature(a)
+ }, cancel: function() { this.finalize(!0) }, click: function(a) { OpenLayers.Event.stop(a); return !1 }, dblclick: function(a) { OpenLayers.Event.stop(a); return !1 }, modifyFeature: function(a) {
+ this.point || this.createFeature(a); a = this.layer.getLonLatFromViewPortPx(a); this.point.geometry.x = a.lon; this.point.geometry.y = a.lat; this.callback("modify", [this.point.geometry, this.point, !1]); this.point.geometry.clearBounds();
+ this.drawFeature()
+ }, drawFeature: function() { this.layer.drawFeature(this.point, this.style) }, getGeometry: function() { var a = this.point && this.point.geometry; a && this.multi && (a = new OpenLayers.Geometry.MultiPoint([a])); return a }, geometryClone: function() { var a = this.getGeometry(); return a && a.clone() }, mousedown: function(a) { return this.down(a) }, touchstart: function(a) { this.startTouch(); this.lastTouchPx = a.xy; return this.down(a) }, mousemove: function(a) { return this.move(a) }, touchmove: function(a) {
+ this.lastTouchPx = a.xy;
+ return this.move(a)
+ }, mouseup: function(a) { return this.up(a) }, touchend: function(a) { a.xy = this.lastTouchPx; return this.up(a) }, down: function(a) { this.mouseDown = !0; this.lastDown = a.xy; this.touch || this.modifyFeature(a.xy); this.stoppedDown = this.stopDown; return !this.stopDown }, move: function(a) { this.touch || this.mouseDown && !this.stoppedDown || this.modifyFeature(a.xy); return !0 }, up: function(a) {
+ this.mouseDown = !1; this.stoppedDown = this.stopDown; if (!this.checkModifiers(a) || this.lastUp && this.lastUp.equals(a.xy) || !this.lastDown ||
+ !this.passesTolerance(this.lastDown, a.xy, this.pixelTolerance)) return !0; this.touch && this.modifyFeature(a.xy); this.persist && this.destroyPersistedFeature(); this.lastUp = a.xy; this.finalize(); return !this.stopUp
+ }, mouseout: function(a) { OpenLayers.Util.mouseLeft(a, this.map.viewPortDiv) && (this.stoppedDown = this.stopDown, this.mouseDown = !1) }, passesTolerance: function(a, b, c) { var d = !0; null != c && a && b && a.distanceTo(b) > c && (d = !1); return d }, CLASS_NAME: "OpenLayers.Handler.Point"
+});
+OpenLayers.Handler.Path = OpenLayers.Class(OpenLayers.Handler.Point, {
+ line: null, maxVertices: null, doubleTouchTolerance: 20, freehand: !1, freehandToggle: "shiftKey", timerId: null, redoStack: null, createFeature: function(a) {
+ a = this.layer.getLonLatFromViewPortPx(a); a = new OpenLayers.Geometry.Point(a.lon, a.lat); this.point = new OpenLayers.Feature.Vector(a); this.line = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([this.point.geometry])); this.callback("create", [this.point.geometry, this.getSketch()]);
+ this.point.geometry.clearBounds(); this.layer.addFeatures([this.line, this.point], { silent: !0 })
+ }, destroyFeature: function(a) { OpenLayers.Handler.Point.prototype.destroyFeature.call(this, a); this.line = null }, destroyPersistedFeature: function() { var a = this.layer; a && 2 < a.features.length && this.layer.features[0].destroy() }, removePoint: function() { this.point && this.layer.removeFeatures([this.point]) }, addPoint: function(a) {
+ this.layer.removeFeatures([this.point]); a = this.layer.getLonLatFromViewPortPx(a); this.point = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(a.lon,
+ a.lat)); this.line.geometry.addComponent(this.point.geometry, this.line.geometry.components.length); this.layer.addFeatures([this.point]); this.callback("point", [this.point.geometry, this.getGeometry()]); this.callback("modify", [this.point.geometry, this.getSketch()]); this.drawFeature(); delete this.redoStack
+ }, insertXY: function(a, b) { this.line.geometry.addComponent(new OpenLayers.Geometry.Point(a, b), this.getCurrentPointIndex()); this.drawFeature(); delete this.redoStack }, insertDeltaXY: function(a, b) {
+ var c = this.getCurrentPointIndex() -
+ 1, c = this.line.geometry.components[c]; !c || isNaN(c.x) || isNaN(c.y) || this.insertXY(c.x + a, c.y + b)
+ }, insertDirectionLength: function(a, b) { a *= Math.PI / 180; var c = b * Math.cos(a), d = b * Math.sin(a); this.insertDeltaXY(c, d) }, insertDeflectionLength: function(a, b) { var c = this.getCurrentPointIndex() - 1; if (0 < c) { var d = this.line.geometry.components[c], c = this.line.geometry.components[c - 1], d = Math.atan2(d.y - c.y, d.x - c.x); this.insertDirectionLength(180 * d / Math.PI + a, b) } }, getCurrentPointIndex: function() {
+ return this.line.geometry.components.length -
+ 1
+ }, undo: function() { var a = this.line.geometry, b = a.components, c = this.getCurrentPointIndex() - 1, d = b[c], e = a.removeComponent(d); e && (this.touch && 0 < c && (b = a.components, a = b[c - 1], c = this.getCurrentPointIndex(), b = b[c], b.x = a.x, b.y = a.y), this.redoStack || (this.redoStack = []), this.redoStack.push(d), this.drawFeature()); return e }, redo: function() { var a = this.redoStack && this.redoStack.pop(); a && (this.line.geometry.addComponent(a, this.getCurrentPointIndex()), this.drawFeature()); return !!a }, freehandMode: function(a) {
+ return this.freehandToggle &&
+ a[this.freehandToggle] ? !this.freehand : this.freehand
+ }, modifyFeature: function(a, b) { this.line || this.createFeature(a); var c = this.layer.getLonLatFromViewPortPx(a); this.point.geometry.x = c.lon; this.point.geometry.y = c.lat; this.callback("modify", [this.point.geometry, this.getSketch(), b]); this.point.geometry.clearBounds(); this.drawFeature() }, drawFeature: function() { this.layer.drawFeature(this.line, this.style); this.layer.drawFeature(this.point, this.style) }, getSketch: function() { return this.line }, getGeometry: function() {
+ var a =
+ this.line && this.line.geometry; a && this.multi && (a = new OpenLayers.Geometry.MultiLineString([a])); return a
+ }, touchstart: function(a) {
+ if (this.timerId && this.passesTolerance(this.lastTouchPx, a.xy, this.doubleTouchTolerance)) return this.finishGeometry(), window.clearTimeout(this.timerId), this.timerId = null, !1; this.timerId && (window.clearTimeout(this.timerId), this.timerId = null); this.timerId = window.setTimeout(OpenLayers.Function.bind(function() { this.timerId = null }, this), 300); return OpenLayers.Handler.Point.prototype.touchstart.call(this,
+ a)
+ }, down: function(a) { var b = this.stopDown; this.freehandMode(a) && (b = !0, this.touch && (this.modifyFeature(a.xy, !!this.lastUp), OpenLayers.Event.stop(a))); this.touch || this.lastDown && this.passesTolerance(this.lastDown, a.xy, this.pixelTolerance) || this.modifyFeature(a.xy, !!this.lastUp); this.mouseDown = !0; this.lastDown = a.xy; this.stoppedDown = b; return !b }, move: function(a) {
+ if (this.stoppedDown && this.freehandMode(a)) return this.persist && this.destroyPersistedFeature(), this.maxVertices && this.line && this.line.geometry.components.length ===
+ this.maxVertices ? (this.removePoint(), this.finalize()) : this.addPoint(a.xy), !1; this.touch || this.mouseDown && !this.stoppedDown || this.modifyFeature(a.xy, !!this.lastUp); return !0
+ }, up: function(a) {
+ !this.mouseDown || this.lastUp && this.lastUp.equals(a.xy) || (this.stoppedDown && this.freehandMode(a) ? (this.persist && this.destroyPersistedFeature(), this.removePoint(), this.finalize()) : this.passesTolerance(this.lastDown, a.xy, this.pixelTolerance) && (this.touch && this.modifyFeature(a.xy), null == this.lastUp && this.persist && this.destroyPersistedFeature(),
+ this.addPoint(a.xy), this.lastUp = a.xy, this.line.geometry.components.length === this.maxVertices + 1 && this.finishGeometry())); this.stoppedDown = this.stopDown; this.mouseDown = !1; return !this.stopUp
+ }, finishGeometry: function() { this.line.geometry.removeComponent(this.line.geometry.components[this.line.geometry.components.length - 1]); this.removePoint(); this.finalize() }, dblclick: function(a) { this.freehandMode(a) || this.finishGeometry(); return !1 }, CLASS_NAME: "OpenLayers.Handler.Path"
+});
+OpenLayers.Spherical = OpenLayers.Spherical || {}; OpenLayers.Spherical.DEFAULT_RADIUS = 6378137; OpenLayers.Spherical.computeDistanceBetween = function(a, b, c) { c = c || OpenLayers.Spherical.DEFAULT_RADIUS; var d = Math.sin(Math.PI * (b.lon - a.lon) / 360), e = Math.sin(Math.PI * (b.lat - a.lat) / 360); a = e * e + d * d * Math.cos(Math.PI * a.lat / 180) * Math.cos(Math.PI * b.lat / 180); return 2 * c * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) };
+OpenLayers.Spherical.computeHeading = function(a, b) { var c = Math.sin(Math.PI * (a.lon - b.lon) / 180) * Math.cos(Math.PI * b.lat / 180), d = Math.cos(Math.PI * a.lat / 180) * Math.sin(Math.PI * b.lat / 180) - Math.sin(Math.PI * a.lat / 180) * Math.cos(Math.PI * b.lat / 180) * Math.cos(Math.PI * (a.lon - b.lon) / 180); return 180 * Math.atan2(c, d) / Math.PI };
+OpenLayers.Control.CacheWrite = OpenLayers.Class(OpenLayers.Control, {
+ layers: null, imageFormat: "image/png", quotaRegEx: /quota/i, setMap: function(a) { OpenLayers.Control.prototype.setMap.apply(this, arguments); var b, c = this.layers || a.layers; for (b = c.length - 1; 0 <= b; --b)this.addLayer({ layer: c[b] }); if (!this.layers) a.events.on({ addlayer: this.addLayer, removeLayer: this.removeLayer, scope: this }) }, addLayer: function(a) { a.layer.events.on({ tileloadstart: this.makeSameOrigin, tileloaded: this.onTileLoaded, scope: this }) }, removeLayer: function(a) {
+ a.layer.events.un({
+ tileloadstart: this.makeSameOrigin,
+ tileloaded: this.onTileLoaded, scope: this
+ })
+ }, makeSameOrigin: function(a) { if (this.active && (a = a.tile, a instanceof OpenLayers.Tile.Image && !a.crossOriginKeyword && "data:" !== a.url.substr(0, 5))) { var b = OpenLayers.Request.makeSameOrigin(a.url, OpenLayers.ProxyHost); OpenLayers.Control.CacheWrite.urlMap[b] = a.url; a.url = b } }, onTileLoaded: function(a) { this.active && !a.aborted && a.tile instanceof OpenLayers.Tile.Image && "data:" !== a.tile.url.substr(0, 5) && (this.cache({ tile: a.tile }), delete OpenLayers.Control.CacheWrite.urlMap[a.tile.url]) },
+ cache: function(a) { if (window.localStorage) { a = a.tile; try { var b = a.getCanvasContext(); b && window.localStorage.setItem("olCache_" + (OpenLayers.Control.CacheWrite.urlMap[a.url] || a.url), b.canvas.toDataURL(this.imageFormat)) } catch (c) { (b = c.name || c.message) && this.quotaRegEx.test(b) ? this.events.triggerEvent("cachefull", { tile: a }) : OpenLayers.Console.error(c.toString()) } } }, destroy: function() {
+ if (this.layers || this.map) { var a, b = this.layers || this.map.layers; for (a = b.length - 1; 0 <= a; --a)this.removeLayer({ layer: b[a] }) } this.map &&
+ this.map.events.un({ addlayer: this.addLayer, removeLayer: this.removeLayer, scope: this }); OpenLayers.Control.prototype.destroy.apply(this, arguments)
+ }, CLASS_NAME: "OpenLayers.Control.CacheWrite"
+}); OpenLayers.Control.CacheWrite.clearCache = function() { if (window.localStorage) { var a, b; for (a = window.localStorage.length - 1; 0 <= a; --a)b = window.localStorage.key(a), "olCache_" === b.substr(0, 8) && window.localStorage.removeItem(b) } }; OpenLayers.Control.CacheWrite.urlMap = {};
+OpenLayers.Format.Context = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+ layerOptions: null, layerParams: null, read: function(a, b) { var c = OpenLayers.Format.XML.VersionedOGC.prototype.read.apply(this, arguments); if (b && b.map) if (this.context = c, b.map instanceof OpenLayers.Map) c = this.mergeContextToMap(c, b.map); else { var d = b.map; if (OpenLayers.Util.isElement(d) || "string" == typeof d) d = { div: d }; c = this.contextToMap(c, d) } return c }, getLayerFromContext: function(a) {
+ var b, c, d = {
+ queryable: a.queryable, visibility: a.visibility,
+ maxExtent: a.maxExtent, metadata: OpenLayers.Util.applyDefaults(a.metadata, { styles: a.styles, formats: a.formats, "abstract": a["abstract"], dataURL: a.dataURL }), numZoomLevels: a.numZoomLevels, units: a.units, isBaseLayer: a.isBaseLayer, opacity: a.opacity, displayInLayerSwitcher: a.displayInLayerSwitcher, singleTile: a.singleTile, tileSize: a.tileSize ? new OpenLayers.Size(a.tileSize.width, a.tileSize.height) : void 0, minScale: a.minScale || a.maxScaleDenominator, maxScale: a.maxScale || a.minScaleDenominator, srs: a.srs, dimensions: a.dimensions,
+ metadataURL: a.metadataURL
+ }; this.layerOptions && OpenLayers.Util.applyDefaults(d, this.layerOptions); var e = { layers: a.name, transparent: a.transparent, version: a.version }; if (a.formats && 0 < a.formats.length) for (e.format = a.formats[0].value, b = 0, c = a.formats.length; b < c; b++) { var f = a.formats[b]; if (1 == f.current) { e.format = f.value; break } } if (a.styles && 0 < a.styles.length) for (b = 0, c = a.styles.length; b < c; b++)if (f = a.styles[b], 1 == f.current) { f.href ? e.sld = f.href : f.body ? e.sld_body = f.body : e.styles = f.name; break } this.layerParams &&
+ OpenLayers.Util.applyDefaults(e, this.layerParams); b = null; c = a.service; c == OpenLayers.Format.Context.serviceTypes.WFS ? (d.strategies = [new OpenLayers.Strategy.BBOX], d.protocol = new OpenLayers.Protocol.WFS({ url: a.url, featurePrefix: a.name.split(":")[0], featureType: a.name.split(":").pop() }), b = new OpenLayers.Layer.Vector(a.title || a.name, d)) : c == OpenLayers.Format.Context.serviceTypes.KML ? (d.strategies = [new OpenLayers.Strategy.Fixed], d.protocol = new OpenLayers.Protocol.HTTP({ url: a.url, format: new OpenLayers.Format.KML }),
+ b = new OpenLayers.Layer.Vector(a.title || a.name, d)) : c == OpenLayers.Format.Context.serviceTypes.GML ? (d.strategies = [new OpenLayers.Strategy.Fixed], d.protocol = new OpenLayers.Protocol.HTTP({ url: a.url, format: new OpenLayers.Format.GML }), b = new OpenLayers.Layer.Vector(a.title || a.name, d)) : a.features ? (b = new OpenLayers.Layer.Vector(a.title || a.name, d), b.addFeatures(a.features)) : !0 !== a.categoryLayer && (b = new OpenLayers.Layer.WMS(a.title || a.name, a.url, e, d)); return b
+ }, getLayersFromContext: function(a) {
+ for (var b = [], c =
+ 0, d = a.length; c < d; c++) { var e = this.getLayerFromContext(a[c]); null !== e && b.push(e) } return b
+ }, contextToMap: function(a, b) {
+ b = OpenLayers.Util.applyDefaults({ maxExtent: a.maxExtent, projection: a.projection, units: a.units }, b); b.maxExtent && (b.maxResolution = b.maxExtent.getWidth() / OpenLayers.Map.TILE_WIDTH); b.metadata = { contactInformation: a.contactInformation, "abstract": a["abstract"], keywords: a.keywords, logo: a.logo, descriptionURL: a.descriptionURL }; var c = new OpenLayers.Map(b); c.addLayers(this.getLayersFromContext(a.layersContext));
+ c.setCenter(a.bounds.getCenterLonLat(), c.getZoomForExtent(a.bounds, !0)); return c
+ }, mergeContextToMap: function(a, b) { b.addLayers(this.getLayersFromContext(a.layersContext)); return b }, write: function(a, b) { a = this.toContext(a); return OpenLayers.Format.XML.VersionedOGC.prototype.write.apply(this, arguments) }, CLASS_NAME: "OpenLayers.Format.Context"
+});
+OpenLayers.Format.Context.serviceTypes = { WMS: "urn:ogc:serviceType:WMS", WFS: "urn:ogc:serviceType:WFS", WCS: "urn:ogc:serviceType:WCS", GML: "urn:ogc:serviceType:GML", SLD: "urn:ogc:serviceType:SLD", FES: "urn:ogc:serviceType:FES", KML: "urn:ogc:serviceType:KML" };
+OpenLayers.Format.WMC = OpenLayers.Class(OpenLayers.Format.Context, {
+ defaultVersion: "1.1.0", layerToContext: function(a) {
+ var b = this.getParser(), c = {
+ queryable: a.queryable, visibility: a.visibility, name: a.params.LAYERS, title: a.name, "abstract": a.metadata["abstract"], dataURL: a.metadata.dataURL, metadataURL: a.metadataURL, server: { version: a.params.VERSION, url: a.url }, maxExtent: a.maxExtent, transparent: a.params.TRANSPARENT, numZoomLevels: a.numZoomLevels, units: a.units, isBaseLayer: a.isBaseLayer, opacity: 1 == a.opacity ? void 0 :
+ a.opacity, displayInLayerSwitcher: a.displayInLayerSwitcher, singleTile: a.singleTile, tileSize: a.singleTile || !a.tileSize ? void 0 : { width: a.tileSize.w, height: a.tileSize.h }, minScale: a.options.resolutions || a.options.scales || a.options.maxResolution || a.options.minScale ? a.minScale : void 0, maxScale: a.options.resolutions || a.options.scales || a.options.minResolution || a.options.maxScale ? a.maxScale : void 0, formats: [], styles: [], srs: a.srs, dimensions: a.dimensions
+ }; a.metadata.servertitle && (c.server.title = a.metadata.servertitle);
+ if (a.metadata.formats && 0 < a.metadata.formats.length) for (var d = 0, e = a.metadata.formats.length; d < e; d++) { var f = a.metadata.formats[d]; c.formats.push({ value: f.value, current: f.value == a.params.FORMAT }) } else c.formats.push({ value: a.params.FORMAT, current: !0 }); if (a.metadata.styles && 0 < a.metadata.styles.length) for (d = 0, e = a.metadata.styles.length; d < e; d++)b = a.metadata.styles[d], b.current = b.href == a.params.SLD || b.body == a.params.SLD_BODY || b.name == a.params.STYLES ? !0 : !1, c.styles.push(b); else c.styles.push({
+ href: a.params.SLD,
+ body: a.params.SLD_BODY, name: a.params.STYLES || b.defaultStyleName, title: b.defaultStyleTitle, current: !0
+ }); return c
+ }, toContext: function(a) {
+ var b = {}, c = a.layers; if ("OpenLayers.Map" == a.CLASS_NAME) { var d = a.metadata || {}; b.size = a.getSize(); b.bounds = a.getExtent(); b.projection = a.projection; b.title = a.title; b.keywords = d.keywords; b["abstract"] = d["abstract"]; b.logo = d.logo; b.descriptionURL = d.descriptionURL; b.contactInformation = d.contactInformation; b.maxExtent = a.maxExtent } else OpenLayers.Util.applyDefaults(b, a), void 0 !=
+ b.layers && delete b.layers; void 0 == b.layersContext && (b.layersContext = []); if (void 0 != c && OpenLayers.Util.isArray(c)) for (a = 0, d = c.length; a < d; a++) { var e = c[a]; e instanceof OpenLayers.Layer.WMS && b.layersContext.push(this.layerToContext(e)) } return b
+ }, CLASS_NAME: "OpenLayers.Format.WMC"
+});
+OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { ol: "https://openlayers.org/context", wmc: "http://www.opengis.net/context", sld: "http://www.opengis.net/sld", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, schemaLocation: "", getNamespacePrefix: function(a) { var b = null; if (null == a) b = this.namespaces[this.defaultPrefix]; else for (b in this.namespaces) if (this.namespaces[b] == a) break; return b }, defaultPrefix: "wmc", rootPrefix: null, defaultStyleName: "",
+ defaultStyleTitle: "Default", initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]) }, read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a = a.documentElement; this.rootPrefix = a.prefix; var b = { version: a.getAttribute("version") }; this.runChildNodes(b, a); return b }, runChildNodes: function(a, b) {
+ for (var c = b.childNodes, d, e, f, g = 0, h = c.length; g < h; ++g)d = c[g], 1 == d.nodeType && (e = this.getNamespacePrefix(d.namespaceURI), f = d.nodeName.split(":").pop(),
+ (e = this["read_" + e + "_" + f]) && e.apply(this, [a, d]))
+ }, read_wmc_General: function(a, b) { this.runChildNodes(a, b) }, read_wmc_BoundingBox: function(a, b) { a.projection = b.getAttribute("SRS"); a.bounds = new OpenLayers.Bounds(b.getAttribute("minx"), b.getAttribute("miny"), b.getAttribute("maxx"), b.getAttribute("maxy")) }, read_wmc_LayerList: function(a, b) { a.layersContext = []; this.runChildNodes(a, b) }, read_wmc_Layer: function(a, b) {
+ var c = {
+ visibility: "1" != b.getAttribute("hidden"), queryable: "1" == b.getAttribute("queryable"), formats: [],
+ styles: [], metadata: {}
+ }; this.runChildNodes(c, b); a.layersContext.push(c)
+ }, read_wmc_Extension: function(a, b) { this.runChildNodes(a, b) }, read_ol_units: function(a, b) { a.units = this.getChildValue(b) }, read_ol_maxExtent: function(a, b) { var c = new OpenLayers.Bounds(b.getAttribute("minx"), b.getAttribute("miny"), b.getAttribute("maxx"), b.getAttribute("maxy")); a.maxExtent = c }, read_ol_transparent: function(a, b) { a.transparent = this.getChildValue(b) }, read_ol_numZoomLevels: function(a, b) { a.numZoomLevels = parseInt(this.getChildValue(b)) },
+ read_ol_opacity: function(a, b) { a.opacity = parseFloat(this.getChildValue(b)) }, read_ol_singleTile: function(a, b) { a.singleTile = "true" == this.getChildValue(b) }, read_ol_tileSize: function(a, b) { var c = { width: b.getAttribute("width"), height: b.getAttribute("height") }; a.tileSize = c }, read_ol_isBaseLayer: function(a, b) { a.isBaseLayer = "true" == this.getChildValue(b) }, read_ol_displayInLayerSwitcher: function(a, b) { a.displayInLayerSwitcher = "true" == this.getChildValue(b) }, read_wmc_Server: function(a, b) {
+ a.version = b.getAttribute("version");
+ a.url = this.getOnlineResource_href(b); a.metadata.servertitle = b.getAttribute("title")
+ }, read_wmc_FormatList: function(a, b) { this.runChildNodes(a, b) }, read_wmc_Format: function(a, b) { var c = { value: this.getChildValue(b) }; "1" == b.getAttribute("current") && (c.current = !0); a.formats.push(c) }, read_wmc_StyleList: function(a, b) { this.runChildNodes(a, b) }, read_wmc_Style: function(a, b) { var c = {}; this.runChildNodes(c, b); "1" == b.getAttribute("current") && (c.current = !0); a.styles.push(c) }, read_wmc_SLD: function(a, b) {
+ this.runChildNodes(a,
+ b)
+ }, read_sld_StyledLayerDescriptor: function(a, b) { var c = OpenLayers.Format.XML.prototype.write.apply(this, [b]); a.body = c }, read_sld_FeatureTypeStyle: function(a, b) { var c = OpenLayers.Format.XML.prototype.write.apply(this, [b]); a.body = c }, read_wmc_OnlineResource: function(a, b) { a.href = this.getAttributeNS(b, this.namespaces.xlink, "href") }, read_wmc_Name: function(a, b) { var c = this.getChildValue(b); c && (a.name = c) }, read_wmc_Title: function(a, b) { var c = this.getChildValue(b); c && (a.title = c) }, read_wmc_MetadataURL: function(a,
+ b) { a.metadataURL = this.getOnlineResource_href(b) }, read_wmc_KeywordList: function(a, b) { a.keywords = []; this.runChildNodes(a.keywords, b) }, read_wmc_Keyword: function(a, b) { a.push(this.getChildValue(b)) }, read_wmc_Abstract: function(a, b) { var c = this.getChildValue(b); c && (a["abstract"] = c) }, read_wmc_LogoURL: function(a, b) { a.logo = { width: b.getAttribute("width"), height: b.getAttribute("height"), format: b.getAttribute("format"), href: this.getOnlineResource_href(b) } }, read_wmc_DescriptionURL: function(a, b) {
+ a.descriptionURL =
+ this.getOnlineResource_href(b)
+ }, read_wmc_ContactInformation: function(a, b) { var c = {}; this.runChildNodes(c, b); a.contactInformation = c }, read_wmc_ContactPersonPrimary: function(a, b) { var c = {}; this.runChildNodes(c, b); a.personPrimary = c }, read_wmc_ContactPerson: function(a, b) { var c = this.getChildValue(b); c && (a.person = c) }, read_wmc_ContactOrganization: function(a, b) { var c = this.getChildValue(b); c && (a.organization = c) }, read_wmc_ContactPosition: function(a, b) { var c = this.getChildValue(b); c && (a.position = c) }, read_wmc_ContactAddress: function(a,
+ b) { var c = {}; this.runChildNodes(c, b); a.contactAddress = c }, read_wmc_AddressType: function(a, b) { var c = this.getChildValue(b); c && (a.type = c) }, read_wmc_Address: function(a, b) { var c = this.getChildValue(b); c && (a.address = c) }, read_wmc_City: function(a, b) { var c = this.getChildValue(b); c && (a.city = c) }, read_wmc_StateOrProvince: function(a, b) { var c = this.getChildValue(b); c && (a.stateOrProvince = c) }, read_wmc_PostCode: function(a, b) { var c = this.getChildValue(b); c && (a.postcode = c) }, read_wmc_Country: function(a, b) {
+ var c = this.getChildValue(b);
+ c && (a.country = c)
+ }, read_wmc_ContactVoiceTelephone: function(a, b) { var c = this.getChildValue(b); c && (a.phone = c) }, read_wmc_ContactFacsimileTelephone: function(a, b) { var c = this.getChildValue(b); c && (a.fax = c) }, read_wmc_ContactElectronicMailAddress: function(a, b) { var c = this.getChildValue(b); c && (a.email = c) }, read_wmc_DataURL: function(a, b) { a.dataURL = this.getOnlineResource_href(b) }, read_wmc_LegendURL: function(a, b) {
+ var c = {
+ width: b.getAttribute("width"), height: b.getAttribute("height"), format: b.getAttribute("format"),
+ href: this.getOnlineResource_href(b)
+ }; a.legend = c
+ }, read_wmc_DimensionList: function(a, b) { a.dimensions = {}; this.runChildNodes(a.dimensions, b) }, read_wmc_Dimension: function(a, b) {
+ var c = {
+ name: b.getAttribute("name").toLowerCase(), units: b.getAttribute("units") || "", unitSymbol: b.getAttribute("unitSymbol") || "", userValue: b.getAttribute("userValue") || "", nearestValue: "1" === b.getAttribute("nearestValue"), multipleValues: "1" === b.getAttribute("multipleValues"), current: "1" === b.getAttribute("current"), "default": b.getAttribute("default") ||
+ ""
+ }, d = this.getChildValue(b); c.values = d.split(","); a[c.name] = c
+ }, write: function(a, b) { var c = this.createElementDefaultNS("ViewContext"); this.setAttributes(c, { version: this.VERSION, id: b && "string" == typeof b.id ? b.id : OpenLayers.Util.createUniqueID("OpenLayers_Context_") }); this.setAttributeNS(c, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation); c.appendChild(this.write_wmc_General(a)); c.appendChild(this.write_wmc_LayerList(a)); return OpenLayers.Format.XML.prototype.write.apply(this, [c]) }, createElementDefaultNS: function(a,
+ b, c) { a = this.createElementNS(this.namespaces[this.defaultPrefix], a); b && a.appendChild(this.createTextNode(b)); c && this.setAttributes(a, c); return a }, setAttributes: function(a, b) { var c, d; for (d in b) c = b[d].toString(), c.match(/[A-Z]/) ? this.setAttributeNS(a, null, d, c) : a.setAttribute(d, c) }, write_wmc_General: function(a) {
+ var b = this.createElementDefaultNS("General"); a.size && b.appendChild(this.createElementDefaultNS("Window", null, { width: a.size.w, height: a.size.h })); var c = a.bounds; b.appendChild(this.createElementDefaultNS("BoundingBox",
+ null, { minx: c.left.toPrecision(18), miny: c.bottom.toPrecision(18), maxx: c.right.toPrecision(18), maxy: c.top.toPrecision(18), SRS: a.projection })); b.appendChild(this.createElementDefaultNS("Title", a.title)); a.keywords && b.appendChild(this.write_wmc_KeywordList(a.keywords)); a["abstract"] && b.appendChild(this.createElementDefaultNS("Abstract", a["abstract"])); a.logo && b.appendChild(this.write_wmc_URLType("LogoURL", a.logo.href, a.logo)); a.descriptionURL && b.appendChild(this.write_wmc_URLType("DescriptionURL", a.descriptionURL));
+ a.contactInformation && b.appendChild(this.write_wmc_ContactInformation(a.contactInformation)); b.appendChild(this.write_ol_MapExtension(a)); return b
+ }, write_wmc_KeywordList: function(a) { for (var b = this.createElementDefaultNS("KeywordList"), c = 0, d = a.length; c < d; c++)b.appendChild(this.createElementDefaultNS("Keyword", a[c])); return b }, write_wmc_ContactInformation: function(a) {
+ var b = this.createElementDefaultNS("ContactInformation"); a.personPrimary && b.appendChild(this.write_wmc_ContactPersonPrimary(a.personPrimary));
+ a.position && b.appendChild(this.createElementDefaultNS("ContactPosition", a.position)); a.contactAddress && b.appendChild(this.write_wmc_ContactAddress(a.contactAddress)); a.phone && b.appendChild(this.createElementDefaultNS("ContactVoiceTelephone", a.phone)); a.fax && b.appendChild(this.createElementDefaultNS("ContactFacsimileTelephone", a.fax)); a.email && b.appendChild(this.createElementDefaultNS("ContactElectronicMailAddress", a.email)); return b
+ }, write_wmc_ContactPersonPrimary: function(a) {
+ var b = this.createElementDefaultNS("ContactPersonPrimary");
+ a.person && b.appendChild(this.createElementDefaultNS("ContactPerson", a.person)); a.organization && b.appendChild(this.createElementDefaultNS("ContactOrganization", a.organization)); return b
+ }, write_wmc_ContactAddress: function(a) {
+ var b = this.createElementDefaultNS("ContactAddress"); a.type && b.appendChild(this.createElementDefaultNS("AddressType", a.type)); a.address && b.appendChild(this.createElementDefaultNS("Address", a.address)); a.city && b.appendChild(this.createElementDefaultNS("City", a.city)); a.stateOrProvince &&
+ b.appendChild(this.createElementDefaultNS("StateOrProvince", a.stateOrProvince)); a.postcode && b.appendChild(this.createElementDefaultNS("PostCode", a.postcode)); a.country && b.appendChild(this.createElementDefaultNS("Country", a.country)); return b
+ }, write_ol_MapExtension: function(a) {
+ var b = this.createElementDefaultNS("Extension"); if (a = a.maxExtent) {
+ var c = this.createElementNS(this.namespaces.ol, "ol:maxExtent"); this.setAttributes(c, {
+ minx: a.left.toPrecision(18), miny: a.bottom.toPrecision(18), maxx: a.right.toPrecision(18),
+ maxy: a.top.toPrecision(18)
+ }); b.appendChild(c)
+ } return b
+ }, write_wmc_LayerList: function(a) { for (var b = this.createElementDefaultNS("LayerList"), c = 0, d = a.layersContext.length; c < d; ++c)b.appendChild(this.write_wmc_Layer(a.layersContext[c])); return b }, write_wmc_Layer: function(a) {
+ var b = this.createElementDefaultNS("Layer", null, { queryable: a.queryable ? "1" : "0", hidden: a.visibility ? "0" : "1" }); b.appendChild(this.write_wmc_Server(a)); b.appendChild(this.createElementDefaultNS("Name", a.name)); b.appendChild(this.createElementDefaultNS("Title",
+ a.title)); a["abstract"] && b.appendChild(this.createElementDefaultNS("Abstract", a["abstract"])); a.dataURL && b.appendChild(this.write_wmc_URLType("DataURL", a.dataURL)); a.metadataURL && b.appendChild(this.write_wmc_URLType("MetadataURL", a.metadataURL)); return b
+ }, write_wmc_LayerExtension: function(a) {
+ var b = this.createElementDefaultNS("Extension"), c = a.maxExtent, d = this.createElementNS(this.namespaces.ol, "ol:maxExtent"); this.setAttributes(d, {
+ minx: c.left.toPrecision(18), miny: c.bottom.toPrecision(18), maxx: c.right.toPrecision(18),
+ maxy: c.top.toPrecision(18)
+ }); b.appendChild(d); a.tileSize && !a.singleTile && (c = this.createElementNS(this.namespaces.ol, "ol:tileSize"), this.setAttributes(c, a.tileSize), b.appendChild(c)); for (var c = "transparent numZoomLevels units isBaseLayer opacity displayInLayerSwitcher singleTile".split(" "), e = 0, f = c.length; e < f; ++e)(d = this.createOLPropertyNode(a, c[e])) && b.appendChild(d); return b
+ }, createOLPropertyNode: function(a, b) {
+ var c = null; null != a[b] && (c = this.createElementNS(this.namespaces.ol, "ol:" + b), c.appendChild(this.createTextNode(a[b].toString())));
+ return c
+ }, write_wmc_Server: function(a) { a = a.server; var b = this.createElementDefaultNS("Server"), c = { service: "OGC:WMS", version: a.version }; a.title && (c.title = a.title); this.setAttributes(b, c); b.appendChild(this.write_wmc_OnlineResource(a.url)); return b }, write_wmc_URLType: function(a, b, c) { a = this.createElementDefaultNS(a); a.appendChild(this.write_wmc_OnlineResource(b)); if (c) { b = ["width", "height", "format"]; for (var d = 0; d < b.length; d++)b[d] in c && a.setAttribute(b[d], c[b[d]]) } return a }, write_wmc_DimensionList: function(a) {
+ var b =
+ this.createElementDefaultNS("DimensionList"), c; for (c in a.dimensions) { var d = {}, e = a.dimensions[c], f; for (f in e) d[f] = "boolean" == typeof e[f] ? Number(e[f]) : e[f]; e = ""; d.values && (e = d.values.join(","), delete d.values); b.appendChild(this.createElementDefaultNS("Dimension", e, d)) } return b
+ }, write_wmc_FormatList: function(a) {
+ for (var b = this.createElementDefaultNS("FormatList"), c = 0, d = a.formats.length; c < d; c++) {
+ var e = a.formats[c]; b.appendChild(this.createElementDefaultNS("Format", e.value, e.current && 1 == e.current ? { current: "1" } :
+ null))
+ } return b
+ }, write_wmc_StyleList: function(a) {
+ var b = this.createElementDefaultNS("StyleList"); if ((a = a.styles) && OpenLayers.Util.isArray(a)) for (var c, d = 0, e = a.length; d < e; d++) {
+ var f = a[d], g = this.createElementDefaultNS("Style", null, f.current && 1 == f.current ? { current: "1" } : null); f.href ? (c = this.createElementDefaultNS("SLD"), f.name && c.appendChild(this.createElementDefaultNS("Name", f.name)), f.title && c.appendChild(this.createElementDefaultNS("Title", f.title)), f.legend && c.appendChild(this.write_wmc_URLType("LegendURL",
+ f.legend.href, f.legend)), f = this.write_wmc_OnlineResource(f.href), c.appendChild(f), g.appendChild(c)) : f.body ? (c = this.createElementDefaultNS("SLD"), f.name && c.appendChild(this.createElementDefaultNS("Name", f.name)), f.title && c.appendChild(this.createElementDefaultNS("Title", f.title)), f.legend && c.appendChild(this.write_wmc_URLType("LegendURL", f.legend.href, f.legend)), f = OpenLayers.Format.XML.prototype.read.apply(this, [f.body]).documentElement, c.ownerDocument && c.ownerDocument.importNode && (f = c.ownerDocument.importNode(f,
+ !0)), c.appendChild(f), g.appendChild(c)) : (g.appendChild(this.createElementDefaultNS("Name", f.name)), g.appendChild(this.createElementDefaultNS("Title", f.title)), f["abstract"] && g.appendChild(this.createElementDefaultNS("Abstract", f["abstract"])), f.legend && g.appendChild(this.write_wmc_URLType("LegendURL", f.legend.href, f.legend))); b.appendChild(g)
+ } return b
+ }, write_wmc_OnlineResource: function(a) {
+ var b = this.createElementDefaultNS("OnlineResource"); this.setAttributeNS(b, this.namespaces.xlink, "xlink:type",
+ "simple"); this.setAttributeNS(b, this.namespaces.xlink, "xlink:href", a); return b
+ }, getOnlineResource_href: function(a) { var b = {}; a = a.getElementsByTagName("OnlineResource"); 0 < a.length && this.read_wmc_OnlineResource(b, a[0]); return b.href }, CLASS_NAME: "OpenLayers.Format.WMC.v1"
+});
+OpenLayers.Control.PanPanel = OpenLayers.Class(OpenLayers.Control.Panel, {
+ slideFactor: 50, slideRatio: null, initialize: function(a) { OpenLayers.Control.Panel.prototype.initialize.apply(this, [a]); a = { slideFactor: this.slideFactor, slideRatio: this.slideRatio }; this.addControls([new OpenLayers.Control.Pan(OpenLayers.Control.Pan.NORTH, a), new OpenLayers.Control.Pan(OpenLayers.Control.Pan.SOUTH, a), new OpenLayers.Control.Pan(OpenLayers.Control.Pan.EAST, a), new OpenLayers.Control.Pan(OpenLayers.Control.Pan.WEST, a)]) },
+ CLASS_NAME: "OpenLayers.Control.PanPanel"
+});
+OpenLayers.Control.Attribution = OpenLayers.Class(OpenLayers.Control, {
+ separator: ", ", template: "${layers}", destroy: function() { this.map.events.un({ removelayer: this.updateAttribution, addlayer: this.updateAttribution, changelayer: this.updateAttribution, changebaselayer: this.updateAttribution, scope: this }); OpenLayers.Control.prototype.destroy.apply(this, arguments) }, draw: function() {
+ OpenLayers.Control.prototype.draw.apply(this, arguments); this.map.events.on({
+ changebaselayer: this.updateAttribution, changelayer: this.updateAttribution,
+ addlayer: this.updateAttribution, removelayer: this.updateAttribution, scope: this
+ }); this.updateAttribution(); return this.div
+ }, updateAttribution: function() { var a = []; if (this.map && this.map.layers) { for (var b = 0, c = this.map.layers.length; b < c; b++) { var d = this.map.layers[b]; d.attribution && d.getVisibility() && -1 === OpenLayers.Util.indexOf(a, d.attribution) && a.push(d.attribution) } this.div.innerHTML = OpenLayers.String.format(this.template, { layers: a.join(this.separator) }) } }, CLASS_NAME: "OpenLayers.Control.Attribution"
+});
+OpenLayers.Kinetic = OpenLayers.Class({
+ threshold: 0, deceleration: .0035, nbPoints: 100, delay: 200, points: void 0, timerId: void 0, initialize: function(a) { OpenLayers.Util.extend(this, a) }, begin: function() { OpenLayers.Animation.stop(this.timerId); this.timerId = void 0; this.points = [] }, update: function(a) { this.points.unshift({ xy: a, tick: (new Date).getTime() }); this.points.length > this.nbPoints && this.points.pop() }, end: function(a) {
+ for (var b, c = (new Date).getTime(), d = 0, e = this.points.length, f; d < e; d++) {
+ f = this.points[d]; if (c -
+ f.tick > this.delay) break; b = f
+ } if (b && (d = (new Date).getTime() - b.tick, c = Math.sqrt(Math.pow(a.x - b.xy.x, 2) + Math.pow(a.y - b.xy.y, 2)), d = c / d, !(0 == d || d < this.threshold))) return c = Math.asin((a.y - b.xy.y) / c), b.xy.x <= a.x && (c = Math.PI - c), { speed: d, theta: c }
+ }, move: function(a, b) {
+ var c = a.speed, d = Math.cos(a.theta), e = -Math.sin(a.theta), f = (new Date).getTime(), g = 0, h = 0; this.timerId = OpenLayers.Animation.start(OpenLayers.Function.bind(function() {
+ if (null != this.timerId) {
+ var a = (new Date).getTime() - f, l = -this.deceleration * Math.pow(a,
+ 2) / 2 + c * a, m = l * d, l = l * e, n, p; n = !1; 0 >= -this.deceleration * a + c && (OpenLayers.Animation.stop(this.timerId), this.timerId = null, n = !0); a = m - g; p = l - h; g = m; h = l; b(a, p, n)
+ }
+ }, this))
+ }, CLASS_NAME: "OpenLayers.Kinetic"
+});
+OpenLayers.Format.WPSExecute = OpenLayers.Class(OpenLayers.Format.XML, OpenLayers.Format.Filter.v1_1_0, {
+ namespaces: { ows: "http://www.opengis.net/ows/1.1", gml: "http://www.opengis.net/gml", wps: "http://www.opengis.net/wps/1.0.0", wfs: "http://www.opengis.net/wfs", ogc: "http://www.opengis.net/ogc", wcs: "http://www.opengis.net/wcs", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, VERSION: "1.0.0",
+ schemaLocation: "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd", schemaLocationAttr: function(a) { }, write: function(a) { var b; window.ActiveXObject ? this.xmldom = b = new ActiveXObject("Microsoft.XMLDOM") : b = document.implementation.createDocument("", "", null); a = this.writeNode("wps:Execute", a, b); this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation); return OpenLayers.Format.XML.prototype.write.apply(this, [a]) }, read: function(a) {
+ "string" == typeof a && (a =
+ OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a, b); return b
+ }, writers: {
+ wps: {
+ Execute: function(a) { var b = this.createElementNSPlus("wps:Execute", { attributes: { version: this.VERSION, service: "WPS" } }); this.writeNode("ows:Identifier", a.identifier, b); this.writeNode("wps:DataInputs", a.dataInputs, b); this.writeNode("wps:ResponseForm", a.responseForm, b); return b }, ResponseForm: function(a) {
+ var b = this.createElementNSPlus("wps:ResponseForm", {}); a.rawDataOutput &&
+ this.writeNode("wps:RawDataOutput", a.rawDataOutput, b); a.responseDocument && this.writeNode("wps:ResponseDocument", a.responseDocument, b); return b
+ }, ResponseDocument: function(a) { var b = this.createElementNSPlus("wps:ResponseDocument", { attributes: { storeExecuteResponse: a.storeExecuteResponse, lineage: a.lineage, status: a.status } }); if (a.outputs) for (var c = 0, d = a.outputs.length; c < d; c++)this.writeNode("wps:Output", a.outputs[c], b); return b }, Output: function(a) {
+ var b = this.createElementNSPlus("wps:Output", {
+ attributes: {
+ asReference: a.asReference,
+ mimeType: a.mimeType, encoding: a.encoding, schema: a.schema
+ }
+ }); this.writeNode("ows:Identifier", a.identifier, b); this.writeNode("ows:Title", a.title, b); this.writeNode("ows:Abstract", a["abstract"], b); return b
+ }, RawDataOutput: function(a) { var b = this.createElementNSPlus("wps:RawDataOutput", { attributes: { mimeType: a.mimeType, encoding: a.encoding, schema: a.schema } }); this.writeNode("ows:Identifier", a.identifier, b); return b }, DataInputs: function(a) {
+ for (var b = this.createElementNSPlus("wps:DataInputs", {}), c = 0, d = a.length; c <
+ d; ++c)this.writeNode("wps:Input", a[c], b); return b
+ }, Input: function(a) { var b = this.createElementNSPlus("wps:Input", {}); this.writeNode("ows:Identifier", a.identifier, b); a.title && this.writeNode("ows:Title", a.title, b); a.data && this.writeNode("wps:Data", a.data, b); a.reference && this.writeNode("wps:Reference", a.reference, b); a.boundingBoxData && this.writeNode("wps:BoundingBoxData", a.boundingBoxData, b); return b }, Data: function(a) {
+ var b = this.createElementNSPlus("wps:Data", {}); a.literalData ? this.writeNode("wps:LiteralData",
+ a.literalData, b) : a.complexData ? this.writeNode("wps:ComplexData", a.complexData, b) : a.boundingBoxData && this.writeNode("ows:BoundingBox", a.boundingBoxData, b); return b
+ }, LiteralData: function(a) { return this.createElementNSPlus("wps:LiteralData", { attributes: { uom: a.uom }, value: a.value }) }, ComplexData: function(a) {
+ var b = this.createElementNSPlus("wps:ComplexData", { attributes: { mimeType: a.mimeType, encoding: a.encoding, schema: a.schema } }), c = a.value; "string" === typeof c ? b.appendChild(this.getXMLDoc().createCDATASection(a.value)) :
+ b.appendChild(c); return b
+ }, Reference: function(a) { var b = this.createElementNSPlus("wps:Reference", { attributes: { mimeType: a.mimeType, "xlink:href": a.href, method: a.method, encoding: a.encoding, schema: a.schema } }); a.body && this.writeNode("wps:Body", a.body, b); return b }, BoundingBoxData: function(a, b) { this.writers.ows.BoundingBox.apply(this, [a, b, "wps:BoundingBoxData"]) }, Body: function(a) {
+ var b = this.createElementNSPlus("wps:Body", {}); a.wcs ? this.writeNode("wcs:GetCoverage", a.wcs, b) : a.wfs ? (this.featureType = a.wfs.featureType,
+ this.version = a.wfs.version, this.writeNode("wfs:GetFeature", a.wfs, b)) : this.writeNode("wps:Execute", a, b); return b
+ }
+ }, wcs: OpenLayers.Format.WCSGetCoverage.prototype.writers.wcs, wfs: OpenLayers.Format.WFST.v1_1_0.prototype.writers.wfs, ogc: OpenLayers.Format.Filter.v1_1_0.prototype.writers.ogc, ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.writers.ows
+ }, readers: {
+ wps: {
+ ExecuteResponse: function(a, b) {
+ b.executeResponse = {
+ lang: a.getAttribute("lang"), statusLocation: a.getAttribute("statusLocation"), serviceInstance: a.getAttribute("serviceInstance"),
+ service: a.getAttribute("service")
+ }; this.readChildNodes(a, b.executeResponse)
+ }, Process: function(a, b) { b.process = {}; this.readChildNodes(a, b.process) }, Status: function(a, b) { b.status = { creationTime: a.getAttribute("creationTime") }; this.readChildNodes(a, b.status) }, ProcessSucceeded: function(a, b) { b.processSucceeded = !0 }, ProcessOutputs: function(a, b) { b.processOutputs = []; this.readChildNodes(a, b.processOutputs) }, Output: function(a, b) { var c = {}; this.readChildNodes(a, c); b.push(c) }, Reference: function(a, b) {
+ b.reference =
+ { href: a.getAttribute("href"), mimeType: a.getAttribute("mimeType"), encoding: a.getAttribute("encoding"), schema: a.getAttribute("schema") }
+ }, Data: function(a, b) { b.data = {}; this.readChildNodes(a, b) }, LiteralData: function(a, b) { b.literalData = { dataType: a.getAttribute("dataType"), uom: a.getAttribute("uom"), value: this.getChildValue(a) } }, ComplexData: function(a, b) {
+ b.complexData = { mimeType: a.getAttribute("mimeType"), schema: a.getAttribute("schema"), encoding: a.getAttribute("encoding"), value: "" }; if (this.isSimpleContent(a)) {
+ var c;
+ for (c = a.firstChild; c; c = c.nextSibling)switch (c.nodeType) { case 3: case 4: b.complexData.value += c.nodeValue }
+ } else for (c = a.firstChild; c; c = c.nextSibling)1 == c.nodeType && (b.complexData.value = c)
+ }, BoundingBox: function(a, b) { b.boundingBoxData = { dimensions: a.getAttribute("dimensions"), crs: a.getAttribute("crs") }; this.readChildNodes(a, b.boundingBoxData) }
+ }, ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+ }, CLASS_NAME: "OpenLayers.Format.WPSExecute"
+});
+OpenLayers.Layer.GeoRSS = OpenLayers.Class(OpenLayers.Layer.Markers, {
+ location: null, features: null, formatOptions: null, selectedFeature: null, icon: null, popupSize: null, useFeedTitle: !0, initialize: function(a, b, c) { OpenLayers.Layer.Markers.prototype.initialize.apply(this, [a, c]); this.location = b; this.features = [] }, destroy: function() { OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments); this.clearFeatures(); this.features = null }, loadRSS: function() {
+ this.loaded || (this.events.triggerEvent("loadstart"), OpenLayers.Request.GET({
+ url: this.location,
+ success: this.parseData, scope: this
+ }), this.loaded = !0)
+ }, moveTo: function(a, b, c) { OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments); this.visibility && !this.loaded && this.loadRSS() }, parseData: function(a) {
+ var b = a.responseXML; b && b.documentElement || (b = OpenLayers.Format.XML.prototype.read(a.responseText)); if (this.useFeedTitle) { a = null; try { a = b.getElementsByTagNameNS("*", "title")[0].firstChild.nodeValue } catch (c) { a = b.getElementsByTagName("title")[0].firstChild.nodeValue } a && this.setName(a) } a = {}; OpenLayers.Util.extend(a,
+ this.formatOptions); this.map && !this.projection.equals(this.map.getProjectionObject()) && (a.externalProjection = this.projection, a.internalProjection = this.map.getProjectionObject()); b = (new OpenLayers.Format.GeoRSS(a)).read(b); a = 0; for (var d = b.length; a < d; a++) {
+ var e = {}, f = b[a]; if (f.geometry) {
+ var g = f.attributes.title ? f.attributes.title : "Untitled", h = f.attributes.description ? f.attributes.description : "No description.", k = f.attributes.link ? f.attributes.link : "", f = f.geometry.getBounds().getCenterLonLat(); e.icon =
+ null == this.icon ? OpenLayers.Marker.defaultIcon() : this.icon.clone(); e.popupSize = this.popupSize ? this.popupSize.clone() : new OpenLayers.Size(250, 120); if (g || h) {
+ e.title = g; e.description = h; var l = '\x3cdiv class\x3d"olLayerGeoRSSClose"\x3e[x]\x3c/div\x3e', l = l + '\x3cdiv class\x3d"olLayerGeoRSSTitle"\x3e'; k && (l += '\x3ca class\x3d"link" href\x3d"' + k + '" target\x3d"_blank"\x3e'); l += g; k && (l += "\x3c/a\x3e"); l += "\x3c/div\x3e"; l += '\x3cdiv style\x3d"" class\x3d"olLayerGeoRSSDescription"\x3e'; l += h; l += "\x3c/div\x3e"; e.popupContentHTML =
+ l
+ } f = new OpenLayers.Feature(this, f, e); this.features.push(f); e = f.createMarker(); e.events.register("click", f, this.markerClick); this.addMarker(e)
+ }
+ } this.events.triggerEvent("loadend")
+ }, markerClick: function(a) {
+ var b = this == this.layer.selectedFeature; this.layer.selectedFeature = b ? null : this; for (var c = 0, d = this.layer.map.popups.length; c < d; c++)this.layer.map.removePopup(this.layer.map.popups[c]); b || (b = this.createPopup(), OpenLayers.Event.observe(b.div, "click", OpenLayers.Function.bind(function() {
+ for (var a = 0, b = this.layer.map.popups.length; a <
+ b; a++)this.layer.map.removePopup(this.layer.map.popups[a])
+ }, this)), this.layer.map.addPopup(b)); OpenLayers.Event.stop(a)
+ }, clearFeatures: function() { if (null != this.features) for (; 0 < this.features.length;) { var a = this.features[0]; OpenLayers.Util.removeItem(this.features, a); a.destroy() } }, CLASS_NAME: "OpenLayers.Layer.GeoRSS"
+}); OpenLayers.Symbolizer.Point = OpenLayers.Class(OpenLayers.Symbolizer, { initialize: function(a) { OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments) }, CLASS_NAME: "OpenLayers.Symbolizer.Point" });
+OpenLayers.Symbolizer.Line = OpenLayers.Class(OpenLayers.Symbolizer, { initialize: function(a) { OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments) }, CLASS_NAME: "OpenLayers.Symbolizer.Line" }); OpenLayers.Symbolizer.Text = OpenLayers.Class(OpenLayers.Symbolizer, { initialize: function(a) { OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments) }, CLASS_NAME: "OpenLayers.Symbolizer.Text" });
+OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
+ namespaces: { sld: "http://www.opengis.net/sld", ogc: "http://www.opengis.net/ogc", gml: "http://www.opengis.net/gml", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, defaultPrefix: "sld", schemaLocation: null, multipleSymbolizers: !1, featureTypeCounter: null, defaultSymbolizer: {
+ fillColor: "#808080", fillOpacity: 1, strokeColor: "#000000", strokeOpacity: 1, strokeWidth: 1, strokeDashstyle: "solid", pointRadius: 3,
+ graphicName: "square"
+ }, read: function(a, b) { b = OpenLayers.Util.applyDefaults(b, this.options); var c = { namedLayers: !0 === b.namedLayersAsArray ? [] : {} }; this.readChildNodes(a, c); return c }, readers: OpenLayers.Util.applyDefaults({
+ sld: {
+ StyledLayerDescriptor: function(a, b) { b.version = a.getAttribute("version"); this.readChildNodes(a, b) }, Name: function(a, b) { b.name = this.getChildValue(a) }, Title: function(a, b) { b.title = this.getChildValue(a) }, Abstract: function(a, b) { b.description = this.getChildValue(a) }, NamedLayer: function(a, b) {
+ var c =
+ { userStyles: [], namedStyles: [] }; this.readChildNodes(a, c); for (var d = 0, e = c.userStyles.length; d < e; ++d)c.userStyles[d].layerName = c.name; OpenLayers.Util.isArray(b.namedLayers) ? b.namedLayers.push(c) : b.namedLayers[c.name] = c
+ }, NamedStyle: function(a, b) { b.namedStyles.push(this.getChildName(a.firstChild)) }, UserStyle: function(a, b) {
+ var c = { defaultsPerSymbolizer: !0, rules: [] }; this.featureTypeCounter = -1; this.readChildNodes(a, c); this.multipleSymbolizers ? (delete c.defaultsPerSymbolizer, c = new OpenLayers.Style2(c)) : c = new OpenLayers.Style(this.defaultSymbolizer,
+ c); b.userStyles.push(c)
+ }, IsDefault: function(a, b) { "1" == this.getChildValue(a) && (b.isDefault = !0) }, FeatureTypeStyle: function(a, b) { ++this.featureTypeCounter; var c = { rules: this.multipleSymbolizers ? b.rules : [] }; this.readChildNodes(a, c); this.multipleSymbolizers || (b.rules = c.rules) }, Rule: function(a, b) { var c; this.multipleSymbolizers && (c = { symbolizers: [] }); c = new OpenLayers.Rule(c); this.readChildNodes(a, c); b.rules.push(c) }, ElseFilter: function(a, b) { b.elseFilter = !0 }, MinScaleDenominator: function(a, b) {
+ b.minScaleDenominator =
+ parseFloat(this.getChildValue(a))
+ }, MaxScaleDenominator: function(a, b) { b.maxScaleDenominator = parseFloat(this.getChildValue(a)) }, TextSymbolizer: function(a, b) { var c = {}; this.readChildNodes(a, c); this.multipleSymbolizers ? (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Text(c))) : b.symbolizer.Text = OpenLayers.Util.applyDefaults(c, b.symbolizer.Text) }, LabelPlacement: function(a, b) { this.readChildNodes(a, b) }, PointPlacement: function(a, b) {
+ var c = {}; this.readChildNodes(a, c); c.labelRotation =
+ c.rotation; delete c.rotation; var d, e = b.labelAnchorPointX, f = b.labelAnchorPointY; e <= 1 / 3 ? d = "l" : e > 1 / 3 && e < 2 / 3 ? d = "c" : e >= 2 / 3 && (d = "r"); f <= 1 / 3 ? d += "b" : f > 1 / 3 && f < 2 / 3 ? d += "m" : f >= 2 / 3 && (d += "t"); c.labelAlign = d; OpenLayers.Util.applyDefaults(b, c)
+ }, AnchorPoint: function(a, b) { this.readChildNodes(a, b) }, AnchorPointX: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.labelAnchorPointX = c) }, AnchorPointY: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.labelAnchorPointY = c) }, Displacement: function(a,
+ b) { this.readChildNodes(a, b) }, DisplacementX: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.labelXOffset = c) }, DisplacementY: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.labelYOffset = c) }, LinePlacement: function(a, b) { this.readChildNodes(a, b) }, PerpendicularOffset: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.labelPerpendicularOffset = c) }, Label: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.label = c) }, Font: function(a, b) {
+ this.readChildNodes(a,
+ b)
+ }, Halo: function(a, b) { var c = {}; this.readChildNodes(a, c); b.haloRadius = c.haloRadius; b.haloColor = c.fillColor; b.haloOpacity = c.fillOpacity }, Radius: function(a, b) { var c = this.readers.ogc._expression.call(this, a); null != c && (b.haloRadius = c) }, RasterSymbolizer: function(a, b) { var c = {}; this.readChildNodes(a, c); this.multipleSymbolizers ? (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Raster(c))) : b.symbolizer.Raster = OpenLayers.Util.applyDefaults(c, b.symbolizer.Raster) }, Geometry: function(a,
+ b) { b.geometry = {}; this.readChildNodes(a, b.geometry) }, ColorMap: function(a, b) { b.colorMap = []; this.readChildNodes(a, b.colorMap) }, ColorMapEntry: function(a, b) { var c = a.getAttribute("quantity"), d = a.getAttribute("opacity"); b.push({ color: a.getAttribute("color"), quantity: null !== c ? parseFloat(c) : void 0, label: a.getAttribute("label") || void 0, opacity: null !== d ? parseFloat(d) : void 0 }) }, LineSymbolizer: function(a, b) {
+ var c = {}; this.readChildNodes(a, c); this.multipleSymbolizers ? (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Line(c))) :
+ b.symbolizer.Line = OpenLayers.Util.applyDefaults(c, b.symbolizer.Line)
+ }, PolygonSymbolizer: function(a, b) { var c = { fill: !1, stroke: !1 }; this.multipleSymbolizers || (c = b.symbolizer.Polygon || c); this.readChildNodes(a, c); this.multipleSymbolizers ? (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Polygon(c))) : b.symbolizer.Polygon = c }, PointSymbolizer: function(a, b) {
+ var c = { fill: !1, stroke: !1, graphic: !1 }; this.multipleSymbolizers || (c = b.symbolizer.Point || c); this.readChildNodes(a, c); this.multipleSymbolizers ?
+ (c.zIndex = this.featureTypeCounter, b.symbolizers.push(new OpenLayers.Symbolizer.Point(c))) : b.symbolizer.Point = c
+ }, Stroke: function(a, b) { b.stroke = !0; this.readChildNodes(a, b) }, Fill: function(a, b) { b.fill = !0; this.readChildNodes(a, b) }, CssParameter: function(a, b) { var c = a.getAttribute("name"), d = this.cssMap[c]; b.label && ("fill" === c ? d = "fontColor" : "fill-opacity" === c && (d = "fontOpacity")); d && (c = this.readers.ogc._expression.call(this, a)) && (b[d] = c) }, Graphic: function(a, b) {
+ b.graphic = !0; var c = {}; this.readChildNodes(a, c);
+ for (var d = "stroke strokeColor strokeWidth strokeOpacity strokeLinecap fill fillColor fillOpacity graphicName rotation graphicFormat".split(" "), e, f, g = 0, h = d.length; g < h; ++g)e = d[g], f = c[e], void 0 != f && (b[e] = f); void 0 != c.opacity && (b.graphicOpacity = c.opacity); void 0 != c.size && (isNaN(c.size / 2) ? b.graphicWidth = c.size : b.pointRadius = c.size / 2); void 0 != c.href && (b.externalGraphic = c.href); void 0 != c.rotation && (b.rotation = c.rotation)
+ }, ExternalGraphic: function(a, b) { this.readChildNodes(a, b) }, Mark: function(a, b) {
+ this.readChildNodes(a,
+ b)
+ }, WellKnownName: function(a, b) { b.graphicName = this.getChildValue(a) }, Opacity: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.opacity = c) }, Size: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.size = c) }, Rotation: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.rotation = c) }, OnlineResource: function(a, b) { b.href = this.getAttributeNS(a, this.namespaces.xlink, "href") }, Format: function(a, b) { b.graphicFormat = this.getChildValue(a) }
+ }
+ }, OpenLayers.Format.Filter.v1_0_0.prototype.readers),
+ cssMap: { stroke: "strokeColor", "stroke-opacity": "strokeOpacity", "stroke-width": "strokeWidth", "stroke-linecap": "strokeLinecap", "stroke-dasharray": "strokeDashstyle", fill: "fillColor", "fill-opacity": "fillOpacity", "font-family": "fontFamily", "font-size": "fontSize", "font-weight": "fontWeight", "font-style": "fontStyle" }, getCssProperty: function(a) { var b = null, c; for (c in this.cssMap) if (this.cssMap[c] == a) { b = c; break } return b }, getGraphicFormat: function(a) {
+ var b, c; for (c in this.graphicFormats) if (this.graphicFormats[c].test(a)) {
+ b =
+ c; break
+ } return b || this.defaultGraphicFormat
+ }, defaultGraphicFormat: "image/png", graphicFormats: { "image/jpeg": /\.jpe?g$/i, "image/gif": /\.gif$/i, "image/png": /\.png$/i }, write: function(a) { return this.writers.sld.StyledLayerDescriptor.apply(this, [a]) }, writers: OpenLayers.Util.applyDefaults({
+ sld: {
+ _OGCExpression: function(a, b) {
+ var c = this.createElementNSPlus(a), d = "string" == typeof b ? b.split("${") : [b]; c.appendChild(this.createTextNode(d[0])); for (var e, f, g = 1, h = d.length; g < h; g++)e = d[g], f = e.indexOf("}"), 0 < f ? (this.writeNode("ogc:PropertyName",
+ { property: e.substring(0, f) }, c), c.appendChild(this.createTextNode(e.substring(++f)))) : c.appendChild(this.createTextNode("${" + e)); return c
+ }, StyledLayerDescriptor: function(a) {
+ var b = this.createElementNSPlus("sld:StyledLayerDescriptor", { attributes: { version: this.VERSION, "xsi:schemaLocation": this.schemaLocation } }); b.setAttribute("xmlns:ogc", this.namespaces.ogc); b.setAttribute("xmlns:gml", this.namespaces.gml); a.name && this.writeNode("Name", a.name, b); a.title && this.writeNode("Title", a.title, b); a.description &&
+ this.writeNode("Abstract", a.description, b); if (OpenLayers.Util.isArray(a.namedLayers)) for (var c = 0, d = a.namedLayers.length; c < d; ++c)this.writeNode("NamedLayer", a.namedLayers[c], b); else for (c in a.namedLayers) this.writeNode("NamedLayer", a.namedLayers[c], b); return b
+ }, Name: function(a) { return this.createElementNSPlus("sld:Name", { value: a }) }, Title: function(a) { return this.createElementNSPlus("sld:Title", { value: a }) }, Abstract: function(a) { return this.createElementNSPlus("sld:Abstract", { value: a }) }, NamedLayer: function(a) {
+ var b =
+ this.createElementNSPlus("sld:NamedLayer"); this.writeNode("Name", a.name, b); if (a.namedStyles) for (var c = 0, d = a.namedStyles.length; c < d; ++c)this.writeNode("NamedStyle", a.namedStyles[c], b); if (a.userStyles) for (c = 0, d = a.userStyles.length; c < d; ++c)this.writeNode("UserStyle", a.userStyles[c], b); return b
+ }, NamedStyle: function(a) { var b = this.createElementNSPlus("sld:NamedStyle"); this.writeNode("Name", a, b); return b }, UserStyle: function(a) {
+ var b = this.createElementNSPlus("sld:UserStyle"); a.name && this.writeNode("Name",
+ a.name, b); a.title && this.writeNode("Title", a.title, b); a.description && this.writeNode("Abstract", a.description, b); a.isDefault && this.writeNode("IsDefault", a.isDefault, b); if (this.multipleSymbolizers && a.rules) {
+ for (var c = { 0: [] }, d = [0], e, f, g, h, k, l = 0, m = a.rules.length; l < m; ++l)if (e = a.rules[l], e.symbolizers) { f = {}; for (var n = 0, p = e.symbolizers.length; n < p; ++n)g = e.symbolizers[n], h = g.zIndex, h in f || (k = e.clone(), k.symbolizers = [], f[h] = k), f[h].symbolizers.push(g.clone()); for (h in f) h in c || (d.push(h), c[h] = []), c[h].push(f[h]) } else c[0].push(e.clone());
+ d.sort(); l = 0; for (m = d.length; l < m; ++l)e = c[d[l]], 0 < e.length && (k = a.clone(), k.rules = c[d[l]], this.writeNode("FeatureTypeStyle", k, b))
+ } else this.writeNode("FeatureTypeStyle", a, b); return b
+ }, IsDefault: function(a) { return this.createElementNSPlus("sld:IsDefault", { value: a ? "1" : "0" }) }, FeatureTypeStyle: function(a) { for (var b = this.createElementNSPlus("sld:FeatureTypeStyle"), c = 0, d = a.rules.length; c < d; ++c)this.writeNode("Rule", a.rules[c], b); return b }, Rule: function(a) {
+ var b = this.createElementNSPlus("sld:Rule"); a.name &&
+ this.writeNode("Name", a.name, b); a.title && this.writeNode("Title", a.title, b); a.description && this.writeNode("Abstract", a.description, b); a.elseFilter ? this.writeNode("ElseFilter", null, b) : a.filter && this.writeNode("ogc:Filter", a.filter, b); void 0 != a.minScaleDenominator && this.writeNode("MinScaleDenominator", a.minScaleDenominator, b); void 0 != a.maxScaleDenominator && this.writeNode("MaxScaleDenominator", a.maxScaleDenominator, b); var c, d; if (this.multipleSymbolizers && a.symbolizers) for (var e = 0, f = a.symbolizers.length; e <
+ f; ++e)d = a.symbolizers[e], c = d.CLASS_NAME.split(".").pop(), this.writeNode(c + "Symbolizer", d, b); else for (var f = OpenLayers.Style.SYMBOLIZER_PREFIXES, e = 0, g = f.length; e < g; ++e)c = f[e], (d = a.symbolizer[c]) && this.writeNode(c + "Symbolizer", d, b); return b
+ }, ElseFilter: function() { return this.createElementNSPlus("sld:ElseFilter") }, MinScaleDenominator: function(a) { return this.createElementNSPlus("sld:MinScaleDenominator", { value: a }) }, MaxScaleDenominator: function(a) {
+ return this.createElementNSPlus("sld:MaxScaleDenominator",
+ { value: a })
+ }, LineSymbolizer: function(a) { var b = this.createElementNSPlus("sld:LineSymbolizer"); this.writeNode("Stroke", a, b); return b }, Stroke: function(a) {
+ var b = this.createElementNSPlus("sld:Stroke"); void 0 != a.strokeColor && this.writeNode("CssParameter", { symbolizer: a, key: "strokeColor" }, b); void 0 != a.strokeOpacity && this.writeNode("CssParameter", { symbolizer: a, key: "strokeOpacity" }, b); void 0 != a.strokeWidth && this.writeNode("CssParameter", { symbolizer: a, key: "strokeWidth" }, b); void 0 != a.strokeDashstyle && "solid" !==
+ a.strokeDashstyle && this.writeNode("CssParameter", { symbolizer: a, key: "strokeDashstyle" }, b); void 0 != a.strokeLinecap && this.writeNode("CssParameter", { symbolizer: a, key: "strokeLinecap" }, b); return b
+ }, CssParameter: function(a) { return this.createElementNSPlus("sld:CssParameter", { attributes: { name: this.getCssProperty(a.key) }, value: a.symbolizer[a.key] }) }, TextSymbolizer: function(a) {
+ var b = this.createElementNSPlus("sld:TextSymbolizer"); null != a.label && this.writeNode("Label", a.label, b); null == a.fontFamily && null == a.fontSize &&
+ null == a.fontWeight && null == a.fontStyle || this.writeNode("Font", a, b); null == a.labelAnchorPointX && null == a.labelAnchorPointY && null == a.labelAlign && null == a.labelXOffset && null == a.labelYOffset && null == a.labelRotation && null == a.labelPerpendicularOffset || this.writeNode("LabelPlacement", a, b); null == a.haloRadius && null == a.haloColor && null == a.haloOpacity || this.writeNode("Halo", a, b); null == a.fontColor && null == a.fontOpacity || this.writeNode("Fill", { fillColor: a.fontColor, fillOpacity: a.fontOpacity }, b); return b
+ }, LabelPlacement: function(a) {
+ var b =
+ this.createElementNSPlus("sld:LabelPlacement"); null == a.labelAnchorPointX && null == a.labelAnchorPointY && null == a.labelAlign && null == a.labelXOffset && null == a.labelYOffset && null == a.labelRotation || null != a.labelPerpendicularOffset || this.writeNode("PointPlacement", a, b); null != a.labelPerpendicularOffset && this.writeNode("LinePlacement", a, b); return b
+ }, LinePlacement: function(a) { var b = this.createElementNSPlus("sld:LinePlacement"); this.writeNode("PerpendicularOffset", a.labelPerpendicularOffset, b); return b }, PerpendicularOffset: function(a) {
+ return this.createElementNSPlus("sld:PerpendicularOffset",
+ { value: a })
+ }, PointPlacement: function(a) { var b = this.createElementNSPlus("sld:PointPlacement"); null == a.labelAnchorPointX && null == a.labelAnchorPointY && null == a.labelAlign || this.writeNode("AnchorPoint", a, b); null == a.labelXOffset && null == a.labelYOffset || this.writeNode("Displacement", a, b); null != a.labelRotation && this.writeNode("Rotation", a.labelRotation, b); return b }, AnchorPoint: function(a) {
+ var b = this.createElementNSPlus("sld:AnchorPoint"), c = a.labelAnchorPointX, d = a.labelAnchorPointY; null != c && this.writeNode("AnchorPointX",
+ c, b); null != d && this.writeNode("AnchorPointY", d, b); if (null == c && null == d) { var e = a.labelAlign.substr(0, 1); a = a.labelAlign.substr(1, 1); "l" === e ? c = 0 : "c" === e ? c = .5 : "r" === e && (c = 1); "b" === a ? d = 0 : "m" === a ? d = .5 : "t" === a && (d = 1); this.writeNode("AnchorPointX", c, b); this.writeNode("AnchorPointY", d, b) } return b
+ }, AnchorPointX: function(a) { return this.createElementNSPlus("sld:AnchorPointX", { value: a }) }, AnchorPointY: function(a) { return this.createElementNSPlus("sld:AnchorPointY", { value: a }) }, Displacement: function(a) {
+ var b = this.createElementNSPlus("sld:Displacement");
+ null != a.labelXOffset && this.writeNode("DisplacementX", a.labelXOffset, b); null != a.labelYOffset && this.writeNode("DisplacementY", a.labelYOffset, b); return b
+ }, DisplacementX: function(a) { return this.createElementNSPlus("sld:DisplacementX", { value: a }) }, DisplacementY: function(a) { return this.createElementNSPlus("sld:DisplacementY", { value: a }) }, Font: function(a) {
+ var b = this.createElementNSPlus("sld:Font"); a.fontFamily && this.writeNode("CssParameter", { symbolizer: a, key: "fontFamily" }, b); a.fontSize && this.writeNode("CssParameter",
+ { symbolizer: a, key: "fontSize" }, b); a.fontWeight && this.writeNode("CssParameter", { symbolizer: a, key: "fontWeight" }, b); a.fontStyle && this.writeNode("CssParameter", { symbolizer: a, key: "fontStyle" }, b); return b
+ }, Label: function(a) { return this.writers.sld._OGCExpression.call(this, "sld:Label", a) }, Halo: function(a) {
+ var b = this.createElementNSPlus("sld:Halo"); a.haloRadius && this.writeNode("Radius", a.haloRadius, b); (a.haloColor || a.haloOpacity) && this.writeNode("Fill", { fillColor: a.haloColor, fillOpacity: a.haloOpacity }, b);
+ return b
+ }, Radius: function(a) { return this.createElementNSPlus("sld:Radius", { value: a }) }, RasterSymbolizer: function(a) { var b = this.createElementNSPlus("sld:RasterSymbolizer"); a.geometry && this.writeNode("Geometry", a.geometry, b); a.opacity && this.writeNode("Opacity", a.opacity, b); a.colorMap && this.writeNode("ColorMap", a.colorMap, b); return b }, Geometry: function(a) { var b = this.createElementNSPlus("sld:Geometry"); a.property && this.writeNode("ogc:PropertyName", a, b); return b }, ColorMap: function(a) {
+ for (var b = this.createElementNSPlus("sld:ColorMap"),
+ c = 0, d = a.length; c < d; ++c)this.writeNode("ColorMapEntry", a[c], b); return b
+ }, ColorMapEntry: function(a) { var b = this.createElementNSPlus("sld:ColorMapEntry"); b.setAttribute("color", a.color); void 0 !== a.opacity && b.setAttribute("opacity", parseFloat(a.opacity)); void 0 !== a.quantity && b.setAttribute("quantity", parseFloat(a.quantity)); void 0 !== a.label && b.setAttribute("label", a.label); return b }, PolygonSymbolizer: function(a) {
+ var b = this.createElementNSPlus("sld:PolygonSymbolizer"); !1 !== a.fill && this.writeNode("Fill",
+ a, b); !1 !== a.stroke && this.writeNode("Stroke", a, b); return b
+ }, Fill: function(a) { var b = this.createElementNSPlus("sld:Fill"); a.fillColor && this.writeNode("CssParameter", { symbolizer: a, key: "fillColor" }, b); null != a.fillOpacity && this.writeNode("CssParameter", { symbolizer: a, key: "fillOpacity" }, b); return b }, PointSymbolizer: function(a) { var b = this.createElementNSPlus("sld:PointSymbolizer"); this.writeNode("Graphic", a, b); return b }, Graphic: function(a) {
+ var b = this.createElementNSPlus("sld:Graphic"); void 0 != a.externalGraphic ?
+ this.writeNode("ExternalGraphic", a, b) : this.writeNode("Mark", a, b); void 0 != a.graphicOpacity && this.writeNode("Opacity", a.graphicOpacity, b); void 0 != a.pointRadius ? this.writeNode("Size", 2 * a.pointRadius, b) : void 0 != a.graphicWidth && this.writeNode("Size", a.graphicWidth, b); void 0 != a.rotation && this.writeNode("Rotation", a.rotation, b); return b
+ }, ExternalGraphic: function(a) {
+ var b = this.createElementNSPlus("sld:ExternalGraphic"); this.writeNode("OnlineResource", a.externalGraphic, b); a = a.graphicFormat || this.getGraphicFormat(a.externalGraphic);
+ this.writeNode("Format", a, b); return b
+ }, Mark: function(a) { var b = this.createElementNSPlus("sld:Mark"); a.graphicName && this.writeNode("WellKnownName", a.graphicName, b); !1 !== a.fill && this.writeNode("Fill", a, b); !1 !== a.stroke && this.writeNode("Stroke", a, b); return b }, WellKnownName: function(a) { return this.createElementNSPlus("sld:WellKnownName", { value: a }) }, Opacity: function(a) { return this.createElementNSPlus("sld:Opacity", { value: a }) }, Size: function(a) {
+ return this.writers.sld._OGCExpression.call(this, "sld:Size",
+ a)
+ }, Rotation: function(a) { return this.createElementNSPlus("sld:Rotation", { value: a }) }, OnlineResource: function(a) { return this.createElementNSPlus("sld:OnlineResource", { attributes: { "xlink:type": "simple", "xlink:href": a } }) }, Format: function(a) { return this.createElementNSPlus("sld:Format", { value: a }) }
+ }
+ }, OpenLayers.Format.Filter.v1_0_0.prototype.writers), CLASS_NAME: "OpenLayers.Format.SLD.v1"
+});
+OpenLayers.Layer.WMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ DEFAULT_PARAMS: { service: "WMS", version: "1.1.1", request: "GetMap", styles: "", format: "image/jpeg" }, isBaseLayer: !0, encodeBBOX: !1, noMagic: !1, yx: {}, initialize: function(a, b, c, d) {
+ var e = []; c = OpenLayers.Util.upperCaseObject(c); 1.3 <= parseFloat(c.VERSION) && !c.EXCEPTIONS && (c.EXCEPTIONS = "INIMAGE"); e.push(a, b, c, d); OpenLayers.Layer.Grid.prototype.initialize.apply(this, e); OpenLayers.Util.applyDefaults(this.params, OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));
+ !this.noMagic && this.params.TRANSPARENT && "true" == this.params.TRANSPARENT.toString().toLowerCase() && (null != d && d.isBaseLayer || (this.isBaseLayer = !1), "image/jpeg" == this.params.FORMAT && (this.params.FORMAT = OpenLayers.Util.alphaHack() ? "image/gif" : "image/png"))
+ }, clone: function(a) { null == a && (a = new OpenLayers.Layer.WMS(this.name, this.url, this.params, this.getOptions())); return OpenLayers.Layer.Grid.prototype.clone.apply(this, [a]) }, reverseAxisOrder: function() {
+ var a = this.projection.getCode(); return 1.3 <= parseFloat(this.params.VERSION) &&
+ !!(this.yx[a] || OpenLayers.Projection.defaults[a] && OpenLayers.Projection.defaults[a].yx)
+ }, getURL: function(a) { a = this.adjustBounds(a); var b = this.getImageSize(), c = {}, d = this.reverseAxisOrder(); c.BBOX = this.encodeBBOX ? a.toBBOX(null, d) : a.toArray(d); c.WIDTH = b.w; c.HEIGHT = b.h; return this.getFullRequestString(c) }, mergeNewParams: function(a) { a = [OpenLayers.Util.upperCaseObject(a)]; return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, a) }, getFullRequestString: function(a, b) {
+ var c = this.map.getProjectionObject(),
+ c = this.projection && this.projection.equals(c) ? this.projection.getCode() : c.getCode(), c = "none" == c ? null : c; 1.3 <= parseFloat(this.params.VERSION) ? this.params.CRS = c : this.params.SRS = c; "boolean" == typeof this.params.TRANSPARENT && (a.TRANSPARENT = this.params.TRANSPARENT ? "true" : "false"); return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this, arguments)
+ }, CLASS_NAME: "OpenLayers.Layer.WMS"
+});
+OpenLayers.Layer.KaMap = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ isBaseLayer: !0, DEFAULT_PARAMS: { i: "jpeg", map: "" }, initialize: function(a, b, c, d) { OpenLayers.Layer.Grid.prototype.initialize.apply(this, arguments); this.params = OpenLayers.Util.applyDefaults(this.params, this.DEFAULT_PARAMS) }, getURL: function(a) { a = this.adjustBounds(a); var b = this.map.getResolution(), c = Math.round(1E4 * this.map.getScale()) / 1E4, d = Math.round(a.left / b); a = -Math.round(a.top / b); return this.getFullRequestString({ t: a, l: d, s: c }) }, calculateGridLayout: function(a,
+ b, c) { b = c * this.tileSize.w; c *= this.tileSize.h; return { tilelon: b, tilelat: c, startcol: Math.floor(a.left / b) - this.buffer, startrow: Math.floor(a.top / c) + this.buffer } }, getTileBoundsForGridIndex: function(a, b) { this.getTileOrigin(); var c = this.gridLayout, d = c.tilelon, e = c.tilelat, f = (c.startcol + b) * d, c = (c.startrow - a) * e; return new OpenLayers.Bounds(f, c, f + d, c + e) }, clone: function(a) {
+ null == a && (a = new OpenLayers.Layer.KaMap(this.name, this.url, this.params, this.getOptions())); a = OpenLayers.Layer.Grid.prototype.clone.apply(this,
+ [a]); null != this.tileSize && (a.tileSize = this.tileSize.clone()); a.grid = []; return a
+ }, getTileBounds: function(a) { var b = this.getResolution(), c = b * this.tileSize.w, b = b * this.tileSize.h, d = this.getLonLatFromViewPortPx(a); a = c * Math.floor(d.lon / c); d = b * Math.floor(d.lat / b); return new OpenLayers.Bounds(a, d, a + c, d + b) }, CLASS_NAME: "OpenLayers.Layer.KaMap"
+});
+OpenLayers.Format.WMC.v1_1_0 = OpenLayers.Class(OpenLayers.Format.WMC.v1, {
+ VERSION: "1.1.0", schemaLocation: "http://www.opengis.net/context http://schemas.opengis.net/context/1.1.0/context.xsd", initialize: function(a) { OpenLayers.Format.WMC.v1.prototype.initialize.apply(this, [a]) }, read_sld_MinScaleDenominator: function(a, b) { var c = parseFloat(this.getChildValue(b)); 0 < c && (a.maxScale = c) }, read_sld_MaxScaleDenominator: function(a, b) { a.minScale = parseFloat(this.getChildValue(b)) }, read_wmc_SRS: function(a, b) {
+ "srs" in
+ a || (a.srs = {}); a.srs[this.getChildValue(b)] = !0
+ }, write_wmc_Layer: function(a) {
+ var b = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(this, [a]); if (a.maxScale) { var c = this.createElementNS(this.namespaces.sld, "sld:MinScaleDenominator"); c.appendChild(this.createTextNode(a.maxScale.toPrecision(16))); b.appendChild(c) } a.minScale && (c = this.createElementNS(this.namespaces.sld, "sld:MaxScaleDenominator"), c.appendChild(this.createTextNode(a.minScale.toPrecision(16))), b.appendChild(c)); if (a.srs) for (var d in a.srs) b.appendChild(this.createElementDefaultNS("SRS",
+ d)); b.appendChild(this.write_wmc_FormatList(a)); b.appendChild(this.write_wmc_StyleList(a)); a.dimensions && b.appendChild(this.write_wmc_DimensionList(a)); b.appendChild(this.write_wmc_LayerExtension(a)); return b
+ }, CLASS_NAME: "OpenLayers.Format.WMC.v1_1_0"
+}); OpenLayers.Format.XLS = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.1.0", stringifyOutput: !0, CLASS_NAME: "OpenLayers.Format.XLS" });
+OpenLayers.Format.XLS.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { xls: "http://www.opengis.net/xls", gml: "http://www.opengis.net/gml", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, xy: !0, defaultPrefix: "xls", schemaLocation: null, read: function(a, b) { OpenLayers.Util.applyDefaults(b, this.options); var c = {}; this.readChildNodes(a, c); return c }, readers: {
+ xls: {
+ XLS: function(a, b) {
+ b.version = a.getAttribute("version");
+ this.readChildNodes(a, b)
+ }, Response: function(a, b) { this.readChildNodes(a, b) }, GeocodeResponse: function(a, b) { b.responseLists = []; this.readChildNodes(a, b) }, GeocodeResponseList: function(a, b) { var c = { features: [], numberOfGeocodedAddresses: parseInt(a.getAttribute("numberOfGeocodedAddresses")) }; b.responseLists.push(c); this.readChildNodes(a, c) }, GeocodedAddress: function(a, b) { var c = new OpenLayers.Feature.Vector; b.features.push(c); this.readChildNodes(a, c); c.geometry = c.components[0] }, GeocodeMatchCode: function(a, b) {
+ b.attributes.matchCode =
+ { accuracy: parseFloat(a.getAttribute("accuracy")), matchType: a.getAttribute("matchType") }
+ }, Address: function(a, b) { var c = { countryCode: a.getAttribute("countryCode"), addressee: a.getAttribute("addressee"), street: [], place: [] }; b.attributes.address = c; this.readChildNodes(a, c) }, freeFormAddress: function(a, b) { b.freeFormAddress = this.getChildValue(a) }, StreetAddress: function(a, b) { this.readChildNodes(a, b) }, Building: function(a, b) {
+ b.building = {
+ number: a.getAttribute("number"), subdivision: a.getAttribute("subdivision"),
+ buildingName: a.getAttribute("buildingName")
+ }
+ }, Street: function(a, b) { b.street.push(this.getChildValue(a)) }, Place: function(a, b) { b.place[a.getAttribute("type")] = this.getChildValue(a) }, PostalCode: function(a, b) { b.postalCode = this.getChildValue(a) }
+ }, gml: OpenLayers.Format.GML.v3.prototype.readers.gml
+ }, write: function(a) { return this.writers.xls.XLS.apply(this, [a]) }, writers: {
+ xls: {
+ XLS: function(a) {
+ var b = this.createElementNSPlus("xls:XLS", { attributes: { version: this.VERSION, "xsi:schemaLocation": this.schemaLocation } });
+ this.writeNode("RequestHeader", a.header, b); this.writeNode("Request", a, b); return b
+ }, RequestHeader: function(a) { return this.createElementNSPlus("xls:RequestHeader") }, Request: function(a) { var b = this.createElementNSPlus("xls:Request", { attributes: { methodName: "GeocodeRequest", requestID: a.requestID || "", version: this.VERSION } }); this.writeNode("GeocodeRequest", a.addresses, b); return b }, GeocodeRequest: function(a) {
+ for (var b = this.createElementNSPlus("xls:GeocodeRequest"), c = 0, d = a.length; c < d; c++)this.writeNode("Address",
+ a[c], b); return b
+ }, Address: function(a) { var b = this.createElementNSPlus("xls:Address", { attributes: { countryCode: a.countryCode } }); a.freeFormAddress ? this.writeNode("freeFormAddress", a.freeFormAddress, b) : (a.street && this.writeNode("StreetAddress", a, b), a.municipality && this.writeNode("Municipality", a.municipality, b), a.countrySubdivision && this.writeNode("CountrySubdivision", a.countrySubdivision, b), a.postalCode && this.writeNode("PostalCode", a.postalCode, b)); return b }, freeFormAddress: function(a) {
+ return this.createElementNSPlus("freeFormAddress",
+ { value: a })
+ }, StreetAddress: function(a) { var b = this.createElementNSPlus("xls:StreetAddress"); a.building && this.writeNode(b, "Building", a.building); a = a.street; OpenLayers.Util.isArray(a) || (a = [a]); for (var c = 0, d = a.length; c < d; c++)this.writeNode("Street", a[c], b); return b }, Building: function(a) { return this.createElementNSPlus("xls:Building", { attributes: { number: a.number, subdivision: a.subdivision, buildingName: a.buildingName } }) }, Street: function(a) { return this.createElementNSPlus("xls:Street", { value: a }) }, Municipality: function(a) {
+ return this.createElementNSPlus("xls:Place",
+ { attributes: { type: "Municipality" }, value: a })
+ }, CountrySubdivision: function(a) { return this.createElementNSPlus("xls:Place", { attributes: { type: "CountrySubdivision" }, value: a }) }, PostalCode: function(a) { return this.createElementNSPlus("xls:PostalCode", { value: a }) }
+ }
+ }, CLASS_NAME: "OpenLayers.Format.XLS.v1"
+}); OpenLayers.Format.XLS.v1_1_0 = OpenLayers.Class(OpenLayers.Format.XLS.v1, { VERSION: "1.1", schemaLocation: "http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd", CLASS_NAME: "OpenLayers.Format.XLS.v1_1_0" });
+OpenLayers.Format.XLS.v1_1 = OpenLayers.Format.XLS.v1_1_0;
+OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, {
+ xmlns: "http://www.w3.org/2000/svg", xlinkns: "http://www.w3.org/1999/xlink", MAX_PIXEL: 15E3, translationParameters: null, symbolMetrics: null, initialize: function(a) { this.supported() && (OpenLayers.Renderer.Elements.prototype.initialize.apply(this, arguments), this.translationParameters = { x: 0, y: 0 }, this.symbolMetrics = {}) }, supported: function() {
+ return document.implementation && (document.implementation.hasFeature("org.w3c.svg", "1.0") || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#SVG",
+ "1.1") || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"))
+ }, inValidRange: function(a, b, c) { a += c ? 0 : this.translationParameters.x; b += c ? 0 : this.translationParameters.y; return a >= -this.MAX_PIXEL && a <= this.MAX_PIXEL && b >= -this.MAX_PIXEL && b <= this.MAX_PIXEL }, setExtent: function(a, b) {
+ var c = OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, arguments), d = this.getResolution(), e = -a.left / d, d = a.top / d; if (b) return this.left = e, this.top = d, this.rendererRoot.setAttributeNS(null,
+ "viewBox", "0 0 " + this.size.w + " " + this.size.h), this.translate(this.xOffset, 0), !0; (e = this.translate(e - this.left + this.xOffset, d - this.top)) || this.setExtent(a, !0); return c && e
+ }, translate: function(a, b) { if (this.inValidRange(a, b, !0)) { var c = ""; if (a || b) c = "translate(" + a + "," + b + ")"; this.root.setAttributeNS(null, "transform", c); this.translationParameters = { x: a, y: b }; return !0 } return !1 }, setSize: function(a) {
+ OpenLayers.Renderer.prototype.setSize.apply(this, arguments); this.rendererRoot.setAttributeNS(null, "width", this.size.w);
+ this.rendererRoot.setAttributeNS(null, "height", this.size.h)
+ }, getNodeType: function(a, b) { var c = null; switch (a.CLASS_NAME) { case "OpenLayers.Geometry.Point": c = b.externalGraphic ? "image" : this.isComplexSymbol(b.graphicName) ? "svg" : "circle"; break; case "OpenLayers.Geometry.Rectangle": c = "rect"; break; case "OpenLayers.Geometry.LineString": c = "polyline"; break; case "OpenLayers.Geometry.LinearRing": c = "polygon"; break; case "OpenLayers.Geometry.Polygon": case "OpenLayers.Geometry.Curve": c = "path" }return c }, setStyle: function(a,
+ b, c) {
+ b = b || a._style; c = c || a._options; var d = b.title || b.graphicTitle; if (d) { a.setAttributeNS(null, "title", d); var e = a.getElementsByTagName("title"); 0 < e.length ? e[0].firstChild.textContent = d : (e = this.nodeFactory(null, "title"), e.textContent = d, a.appendChild(e)) } var e = parseFloat(a.getAttributeNS(null, "r")), d = 1, f; if ("OpenLayers.Geometry.Point" == a._geometryClass && e) {
+ a.style.visibility = ""; if (!1 === b.graphic) a.style.visibility = "hidden"; else if (b.externalGraphic) {
+ f = this.getPosition(a); b.graphicWidth && b.graphicHeight &&
+ a.setAttributeNS(null, "preserveAspectRatio", "none"); var e = b.graphicWidth || b.graphicHeight, g = b.graphicHeight || b.graphicWidth, e = e ? e : 2 * b.pointRadius, g = g ? g : 2 * b.pointRadius, h = void 0 != b.graphicYOffset ? b.graphicYOffset : -(.5 * g), k = b.graphicOpacity || b.fillOpacity; a.setAttributeNS(null, "x", (f.x + (void 0 != b.graphicXOffset ? b.graphicXOffset : -(.5 * e))).toFixed()); a.setAttributeNS(null, "y", (f.y + h).toFixed()); a.setAttributeNS(null, "width", e); a.setAttributeNS(null, "height", g); a.setAttributeNS(this.xlinkns, "xlink:href",
+ b.externalGraphic); a.setAttributeNS(null, "style", "opacity: " + k); a.onclick = OpenLayers.Event.preventDefault
+ } else if (this.isComplexSymbol(b.graphicName)) {
+ var e = 3 * b.pointRadius, g = 2 * e, l = this.importSymbol(b.graphicName); f = this.getPosition(a); d = 3 * this.symbolMetrics[l.id][0] / g; h = a.parentNode; k = a.nextSibling; h && h.removeChild(a); a.firstChild && a.removeChild(a.firstChild); a.appendChild(l.firstChild.cloneNode(!0)); a.setAttributeNS(null, "viewBox", l.getAttributeNS(null, "viewBox")); a.setAttributeNS(null, "width",
+ g); a.setAttributeNS(null, "height", g); a.setAttributeNS(null, "x", f.x - e); a.setAttributeNS(null, "y", f.y - e); k ? h.insertBefore(a, k) : h && h.appendChild(a)
+ } else a.setAttributeNS(null, "r", b.pointRadius); e = b.rotation; void 0 === e && void 0 === a._rotation || !f || (a._rotation = e, e |= 0, "svg" !== a.nodeName ? a.setAttributeNS(null, "transform", "rotate(" + e + " " + f.x + " " + f.y + ")") : (f = this.symbolMetrics[l.id], a.firstChild.setAttributeNS(null, "transform", "rotate(" + e + " " + f[1] + " " + f[2] + ")")))
+ } c.isFilled ? (a.setAttributeNS(null, "fill", b.fillColor),
+ a.setAttributeNS(null, "fill-opacity", b.fillOpacity)) : a.setAttributeNS(null, "fill", "none"); c.isStroked ? (a.setAttributeNS(null, "stroke", b.strokeColor), a.setAttributeNS(null, "stroke-opacity", b.strokeOpacity), a.setAttributeNS(null, "stroke-width", b.strokeWidth * d), a.setAttributeNS(null, "stroke-linecap", b.strokeLinecap || "round"), a.setAttributeNS(null, "stroke-linejoin", "round"), b.strokeDashstyle && a.setAttributeNS(null, "stroke-dasharray", this.dashStyle(b, d))) : a.setAttributeNS(null, "stroke", "none"); b.pointerEvents &&
+ a.setAttributeNS(null, "pointer-events", b.pointerEvents); null != b.cursor && a.setAttributeNS(null, "cursor", b.cursor); return a
+ }, dashStyle: function(a, b) { var c = a.strokeWidth * b, d = a.strokeDashstyle; switch (d) { case "solid": return "none"; case "dot": return [1, 4 * c].join(); case "dash": return [4 * c, 4 * c].join(); case "dashdot": return [4 * c, 4 * c, 1, 4 * c].join(); case "longdash": return [8 * c, 4 * c].join(); case "longdashdot": return [8 * c, 4 * c, 1, 4 * c].join(); default: return OpenLayers.String.trim(d).replace(/\s+/g, ",") } }, createNode: function(a,
+ b) { var c = document.createElementNS(this.xmlns, a); b && c.setAttributeNS(null, "id", b); return c }, nodeTypeCompare: function(a, b) { return b == a.nodeName }, createRenderRoot: function() { var a = this.nodeFactory(this.container.id + "_svgRoot", "svg"); a.style.display = "block"; return a }, createRoot: function(a) { return this.nodeFactory(this.container.id + a, "g") }, createDefs: function() { var a = this.nodeFactory(this.container.id + "_defs", "defs"); this.rendererRoot.appendChild(a); return a }, drawPoint: function(a, b) {
+ return this.drawCircle(a,
+ b, 1)
+ }, drawCircle: function(a, b, c) { var d = this.getResolution(), e = (b.x - this.featureDx) / d + this.left; b = this.top - b.y / d; return this.inValidRange(e, b) ? (a.setAttributeNS(null, "cx", e), a.setAttributeNS(null, "cy", b), a.setAttributeNS(null, "r", c), a) : !1 }, drawLineString: function(a, b) { var c = this.getComponentsString(b.components); return c.path ? (a.setAttributeNS(null, "points", c.path), c.complete ? a : null) : !1 }, drawLinearRing: function(a, b) {
+ var c = this.getComponentsString(b.components); return c.path ? (a.setAttributeNS(null,
+ "points", c.path), c.complete ? a : null) : !1
+ }, drawPolygon: function(a, b) { for (var c = "", d = !0, e = !0, f, g, h = 0, k = b.components.length; h < k; h++)c += " M", f = this.getComponentsString(b.components[h].components, " "), (g = f.path) ? (c += " " + g, e = f.complete && e) : d = !1; return d ? (a.setAttributeNS(null, "d", c + " z"), a.setAttributeNS(null, "fill-rule", "evenodd"), e ? a : null) : !1 }, drawRectangle: function(a, b) {
+ var c = this.getResolution(), d = (b.x - this.featureDx) / c + this.left, e = this.top - b.y / c; return this.inValidRange(d, e) ? (a.setAttributeNS(null, "x",
+ d), a.setAttributeNS(null, "y", e), a.setAttributeNS(null, "width", b.width / c), a.setAttributeNS(null, "height", b.height / c), a) : !1
+ }, drawText: function(a, b, c) {
+ var d = !!b.labelOutlineWidth; if (d) { var e = OpenLayers.Util.extend({}, b); e.fontColor = e.labelOutlineColor; e.fontStrokeColor = e.labelOutlineColor; e.fontStrokeWidth = b.labelOutlineWidth; b.labelOutlineOpacity && (e.fontOpacity = b.labelOutlineOpacity); delete e.labelOutlineWidth; this.drawText(a, e, c) } var f = this.getResolution(), e = (c.x - this.featureDx) / f + this.left, g = c.y /
+ f - this.top, d = d ? this.LABEL_OUTLINE_SUFFIX : this.LABEL_ID_SUFFIX, f = this.nodeFactory(a + d, "text"); f.setAttributeNS(null, "x", e); f.setAttributeNS(null, "y", -g); b.fontColor && f.setAttributeNS(null, "fill", b.fontColor); b.fontStrokeColor && f.setAttributeNS(null, "stroke", b.fontStrokeColor); b.fontStrokeWidth && f.setAttributeNS(null, "stroke-width", b.fontStrokeWidth); b.fontOpacity && f.setAttributeNS(null, "opacity", b.fontOpacity); b.fontFamily && f.setAttributeNS(null, "font-family", b.fontFamily); b.fontSize && f.setAttributeNS(null,
+ "font-size", b.fontSize); b.fontWeight && f.setAttributeNS(null, "font-weight", b.fontWeight); b.fontStyle && f.setAttributeNS(null, "font-style", b.fontStyle); !0 === b.labelSelect ? (f.setAttributeNS(null, "pointer-events", "visible"), f._featureId = a) : f.setAttributeNS(null, "pointer-events", "none"); g = b.labelAlign || OpenLayers.Renderer.defaultSymbolizer.labelAlign; f.setAttributeNS(null, "text-anchor", OpenLayers.Renderer.SVG.LABEL_ALIGN[g[0]] || "middle"); !0 === OpenLayers.IS_GECKO && f.setAttributeNS(null, "dominant-baseline",
+ OpenLayers.Renderer.SVG.LABEL_ALIGN[g[1]] || "central"); for (var h = b.label.split("\n"), k = h.length; f.childNodes.length > k;)f.removeChild(f.lastChild); for (var l = 0; l < k; l++) {
+ var m = this.nodeFactory(a + d + "_tspan_" + l, "tspan"); !0 === b.labelSelect && (m._featureId = a, m._geometry = c, m._geometryClass = c.CLASS_NAME); !1 === OpenLayers.IS_GECKO && m.setAttributeNS(null, "baseline-shift", OpenLayers.Renderer.SVG.LABEL_VSHIFT[g[1]] || "-35%"); m.setAttribute("x", e); if (0 == l) {
+ var n = OpenLayers.Renderer.SVG.LABEL_VFACTOR[g[1]]; null == n &&
+ (n = -.5); m.setAttribute("dy", n * (k - 1) + "em")
+ } else m.setAttribute("dy", "1em"); m.textContent = "" === h[l] ? " " : h[l]; m.parentNode || f.appendChild(m)
+ } f.parentNode || this.textRoot.appendChild(f)
+ }, getComponentsString: function(a, b) { for (var c = [], d = !0, e = a.length, f = [], g, h = 0; h < e; h++)g = a[h], c.push(g), (g = this.getShortString(g)) ? f.push(g) : (0 < h && this.getShortString(a[h - 1]) && f.push(this.clipLine(a[h], a[h - 1])), h < e - 1 && this.getShortString(a[h + 1]) && f.push(this.clipLine(a[h], a[h + 1])), d = !1); return { path: f.join(b || ","), complete: d } },
+ clipLine: function(a, b) { if (b.equals(a)) return ""; var c = this.getResolution(), d = this.MAX_PIXEL - this.translationParameters.x, e = this.MAX_PIXEL - this.translationParameters.y, f = (b.x - this.featureDx) / c + this.left, g = this.top - b.y / c, h = (a.x - this.featureDx) / c + this.left, c = this.top - a.y / c, k; if (h < -d || h > d) k = (c - g) / (h - f), h = 0 > h ? -d : d, c = g + (h - f) * k; if (c < -e || c > e) k = (h - f) / (c - g), c = 0 > c ? -e : e, h = f + (c - g) * k; return h + "," + c }, getShortString: function(a) {
+ var b = this.getResolution(), c = (a.x - this.featureDx) / b + this.left; a = this.top - a.y / b; return this.inValidRange(c,
+ a) ? c + "," + a : !1
+ }, getPosition: function(a) { return { x: parseFloat(a.getAttributeNS(null, "cx")), y: parseFloat(a.getAttributeNS(null, "cy")) } }, importSymbol: function(a) {
+ this.defs || (this.defs = this.createDefs()); var b = this.container.id + "-" + a, c = document.getElementById(b); if (null != c) return c; var d = OpenLayers.Renderer.symbol[a]; if (!d) throw Error(a + " is not a valid symbol name"); a = this.nodeFactory(b, "symbol"); var e = this.nodeFactory(null, "polygon"); a.appendChild(e); for (var c = new OpenLayers.Bounds(Number.MAX_VALUE, Number.MAX_VALUE,
+ 0, 0), f = [], g, h, k = 0; k < d.length; k += 2)g = d[k], h = d[k + 1], c.left = Math.min(c.left, g), c.bottom = Math.min(c.bottom, h), c.right = Math.max(c.right, g), c.top = Math.max(c.top, h), f.push(g, ",", h); e.setAttributeNS(null, "points", f.join(" ")); d = c.getWidth(); e = c.getHeight(); a.setAttributeNS(null, "viewBox", [c.left - d, c.bottom - e, 3 * d, 3 * e].join(" ")); this.symbolMetrics[b] = [Math.max(d, e), c.getCenterLonLat().lon, c.getCenterLonLat().lat]; this.defs.appendChild(a); return a
+ }, getFeatureIdFromEvent: function(a) {
+ var b = OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent.apply(this,
+ arguments); b || (b = a.target, b = b.parentNode && b != this.rendererRoot ? b.parentNode._featureId : void 0); return b
+ }, CLASS_NAME: "OpenLayers.Renderer.SVG"
+}); OpenLayers.Renderer.SVG.LABEL_ALIGN = { l: "start", r: "end", b: "bottom", t: "hanging" }; OpenLayers.Renderer.SVG.LABEL_VSHIFT = { t: "-70%", b: "0" }; OpenLayers.Renderer.SVG.LABEL_VFACTOR = { t: 0, b: -1 }; OpenLayers.Renderer.SVG.preventDefault = function(a) { OpenLayers.Event.preventDefault(a) };
+OpenLayers.Format.SLD.v1_0_0 = OpenLayers.Class(OpenLayers.Format.SLD.v1, { VERSION: "1.0.0", schemaLocation: "http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd", CLASS_NAME: "OpenLayers.Format.SLD.v1_0_0" });
+OpenLayers.Format.OWSContext = OpenLayers.Class(OpenLayers.Format.Context, { defaultVersion: "0.3.1", getVersion: function(a, b) { var c = OpenLayers.Format.XML.VersionedOGC.prototype.getVersion.apply(this, arguments); "0.3.0" === c && (c = this.defaultVersion); return c }, toContext: function(a) { var b = {}; "OpenLayers.Map" == a.CLASS_NAME && (b.bounds = a.getExtent(), b.maxExtent = a.maxExtent, b.projection = a.projection, b.size = a.getSize(), b.layers = a.layers); return b }, CLASS_NAME: "OpenLayers.Format.OWSContext" });
+OpenLayers.Format.OWSContext.v0_3_1 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { owc: "http://www.opengis.net/ows-context", gml: "http://www.opengis.net/gml", kml: "http://www.opengis.net/kml/2.2", ogc: "http://www.opengis.net/ogc", ows: "http://www.opengis.net/ows", sld: "http://www.opengis.net/sld", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, VERSION: "0.3.1", schemaLocation: "http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd",
+ defaultPrefix: "owc", extractAttributes: !0, xy: !0, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, featureNS: "http://mapserver.gis.umn.edu/mapserver", featureType: "vector", geometryName: "geometry", nestingLayerLookup: null, initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]); OpenLayers.Format.GML.v2.prototype.setGeometryTypes.call(this) }, setNestingPath: function(a) {
+ if (a.layersContext) for (var b = 0, c = a.layersContext.length; b < c; b++) {
+ var d =
+ a.layersContext[b], e = [], f = a.title || ""; a.metadata && a.metadata.nestingPath && (e = a.metadata.nestingPath.slice()); "" != f && e.push(f); d.metadata.nestingPath = e; d.layersContext && this.setNestingPath(d)
+ }
+ }, decomposeNestingPath: function(a) { var b = []; if (OpenLayers.Util.isArray(a)) { for (a = a.slice(); 0 < a.length;)b.push(a.slice()), a.pop(); b.reverse() } return b }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a,
+ b); this.setNestingPath({ layersContext: b.layersContext }); a = []; this.processLayer(a, b); delete b.layersContext; b.layersContext = a; return b
+ }, processLayer: function(a, b) { if (b.layersContext) for (var c = 0, d = b.layersContext.length; c < d; c++) { var e = b.layersContext[c]; a.push(e); e.layersContext && this.processLayer(a, e) } }, write: function(a, b) {
+ this.nestingLayerLookup = {}; b = b || {}; OpenLayers.Util.applyDefaults(b, a); var c = this.writeNode("OWSContext", b); this.nestingLayerLookup = null; this.setAttributeNS(c, this.namespaces.xsi,
+ "xsi:schemaLocation", this.schemaLocation); return OpenLayers.Format.XML.prototype.write.apply(this, [c])
+ }, readers: {
+ kml: { Document: function(a, b) { b.features = (new OpenLayers.Format.KML({ kmlns: this.namespaces.kml, extractStyles: !0 })).read(a) } }, owc: {
+ OWSContext: function(a, b) { this.readChildNodes(a, b) }, General: function(a, b) { this.readChildNodes(a, b) }, ResourceList: function(a, b) { this.readChildNodes(a, b) }, Layer: function(a, b) {
+ var c = {
+ metadata: {}, visibility: "1" != a.getAttribute("hidden"), queryable: "1" == a.getAttribute("queryable"),
+ opacity: null != a.getAttribute("opacity") ? parseFloat(a.getAttribute("opacity")) : null, name: a.getAttribute("name"), categoryLayer: null == a.getAttribute("name"), formats: [], styles: []
+ }; b.layersContext || (b.layersContext = []); b.layersContext.push(c); this.readChildNodes(a, c)
+ }, InlineGeometry: function(a, b) {
+ b.features = []; var c = this.getElementsByTagNameNS(a, this.namespaces.gml, "featureMember"), d; 1 <= c.length && (d = c[0]); d && d.firstChild && (c = d.firstChild.nextSibling ? d.firstChild.nextSibling : d.firstChild, this.setNamespace("feature",
+ c.namespaceURI), this.featureType = c.localName || c.nodeName.split(":").pop(), this.readChildNodes(a, b))
+ }, Server: function(a, b) { if (!b.service && !b.version || b.service != OpenLayers.Format.Context.serviceTypes.WMS) b.service = a.getAttribute("service"), b.version = a.getAttribute("version"), this.readChildNodes(a, b) }, Name: function(a, b) { b.name = this.getChildValue(a); this.readChildNodes(a, b) }, Title: function(a, b) { b.title = this.getChildValue(a); this.readChildNodes(a, b) }, StyleList: function(a, b) { this.readChildNodes(a, b.styles) },
+ Style: function(a, b) { var c = {}; b.push(c); this.readChildNodes(a, c) }, LegendURL: function(a, b) { var c = {}; b.legend = c; this.readChildNodes(a, c) }, OnlineResource: function(a, b) { b.url = this.getAttributeNS(a, this.namespaces.xlink, "href"); this.readChildNodes(a, b) }
+ }, ows: OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows, gml: OpenLayers.Format.GML.v2.prototype.readers.gml, sld: OpenLayers.Format.SLD.v1_0_0.prototype.readers.sld, feature: OpenLayers.Format.GML.v2.prototype.readers.feature
+ }, writers: {
+ owc: {
+ OWSContext: function(a) {
+ var b =
+ this.createElementNSPlus("OWSContext", { attributes: { version: this.VERSION, id: a.id || OpenLayers.Util.createUniqueID("OpenLayers_OWSContext_") } }); this.writeNode("General", a, b); this.writeNode("ResourceList", a, b); return b
+ }, General: function(a) { var b = this.createElementNSPlus("General"); this.writeNode("ows:BoundingBox", a, b); this.writeNode("ows:Title", a.title || "OpenLayers OWSContext", b); return b }, ResourceList: function(a) {
+ for (var b = this.createElementNSPlus("ResourceList"), c = 0, d = a.layers.length; c < d; c++) {
+ var e =
+ a.layers[c], f = this.decomposeNestingPath(e.metadata.nestingPath); this.writeNode("_Layer", { layer: e, subPaths: f }, b)
+ } return b
+ }, Server: function(a) { var b = this.createElementNSPlus("Server", { attributes: { version: a.version, service: a.service } }); this.writeNode("OnlineResource", a, b); return b }, OnlineResource: function(a) { return this.createElementNSPlus("OnlineResource", { attributes: { "xlink:href": a.url } }) }, InlineGeometry: function(a) {
+ var b = this.createElementNSPlus("InlineGeometry"), c = a.getDataExtent(); null !== c && this.writeNode("gml:boundedBy",
+ c, b); for (var c = 0, d = a.features.length; c < d; c++)this.writeNode("gml:featureMember", a.features[c], b); return b
+ }, StyleList: function(a) { for (var b = this.createElementNSPlus("StyleList"), c = 0, d = a.length; c < d; c++)this.writeNode("Style", a[c], b); return b }, Style: function(a) { var b = this.createElementNSPlus("Style"); this.writeNode("Name", a, b); this.writeNode("Title", a, b); a.legend && this.writeNode("LegendURL", a, b); return b }, Name: function(a) { return this.createElementNSPlus("Name", { value: a.name }) }, Title: function(a) {
+ return this.createElementNSPlus("Title",
+ { value: a.title })
+ }, LegendURL: function(a) { var b = this.createElementNSPlus("LegendURL"); this.writeNode("OnlineResource", a.legend, b); return b }, _WMS: function(a) {
+ var b = this.createElementNSPlus("Layer", { attributes: { name: a.params.LAYERS, queryable: a.queryable ? "1" : "0", hidden: a.visibility ? "0" : "1", opacity: a.hasOwnProperty("opacity") ? a.opacity : null } }); this.writeNode("ows:Title", a.name, b); this.writeNode("ows:OutputFormat", a.params.FORMAT, b); this.writeNode("Server", {
+ service: OpenLayers.Format.Context.serviceTypes.WMS,
+ version: a.params.VERSION, url: a.url
+ }, b); a.metadata.styles && 0 < a.metadata.styles.length && this.writeNode("StyleList", a.metadata.styles, b); return b
+ }, _Layer: function(a) {
+ var b, c, d; b = a.layer; c = a.subPaths; d = null; 0 < c.length ? (b = c[0].join("/"), c = b.lastIndexOf("/"), d = this.nestingLayerLookup[b], c = 0 < c ? b.substring(c + 1, b.length) : b, d || (d = this.createElementNSPlus("Layer"), this.writeNode("ows:Title", c, d), this.nestingLayerLookup[b] = d), a.subPaths.shift(), this.writeNode("_Layer", a, d)) : (b instanceof OpenLayers.Layer.WMS ?
+ d = this.writeNode("_WMS", b) : b instanceof OpenLayers.Layer.Vector && (b.protocol instanceof OpenLayers.Protocol.WFS.v1 ? d = this.writeNode("_WFS", b) : b.protocol instanceof OpenLayers.Protocol.HTTP ? b.protocol.format instanceof OpenLayers.Format.GML ? (b.protocol.format.version = "2.1.2", d = this.writeNode("_GML", b)) : b.protocol.format instanceof OpenLayers.Format.KML && (b.protocol.format.version = "2.2", d = this.writeNode("_KML", b)) : (this.setNamespace("feature", this.featureNS), d = this.writeNode("_InlineGeometry", b))),
+ b.options.maxScale && this.writeNode("sld:MinScaleDenominator", b.options.maxScale, d), b.options.minScale && this.writeNode("sld:MaxScaleDenominator", b.options.minScale, d), this.nestingLayerLookup[b.name] = d); return d
+ }, _WFS: function(a) {
+ var b = this.createElementNSPlus("Layer", { attributes: { name: a.protocol.featurePrefix + ":" + a.protocol.featureType, hidden: a.visibility ? "0" : "1" } }); this.writeNode("ows:Title", a.name, b); this.writeNode("Server", {
+ service: OpenLayers.Format.Context.serviceTypes.WFS, version: a.protocol.version,
+ url: a.protocol.url
+ }, b); return b
+ }, _InlineGeometry: function(a) { var b = this.createElementNSPlus("Layer", { attributes: { name: this.featureType, hidden: a.visibility ? "0" : "1" } }); this.writeNode("ows:Title", a.name, b); this.writeNode("InlineGeometry", a, b); return b }, _GML: function(a) { var b = this.createElementNSPlus("Layer"); this.writeNode("ows:Title", a.name, b); this.writeNode("Server", { service: OpenLayers.Format.Context.serviceTypes.GML, url: a.protocol.url, version: a.protocol.format.version }, b); return b }, _KML: function(a) {
+ var b =
+ this.createElementNSPlus("Layer"); this.writeNode("ows:Title", a.name, b); this.writeNode("Server", { service: OpenLayers.Format.Context.serviceTypes.KML, version: a.protocol.format.version, url: a.protocol.url }, b); return b
+ }
+ }, gml: OpenLayers.Util.applyDefaults({ boundedBy: function(a) { var b = this.createElementNSPlus("gml:boundedBy"); this.writeNode("gml:Box", a, b); return b } }, OpenLayers.Format.GML.v2.prototype.writers.gml), ows: OpenLayers.Format.OWSCommon.v1_0_0.prototype.writers.ows, sld: OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld,
+ feature: OpenLayers.Format.GML.v2.prototype.writers.feature
+ }, CLASS_NAME: "OpenLayers.Format.OWSContext.v0_3_1"
+});
+OpenLayers.Popup = OpenLayers.Class({
+ events: null, id: "", lonlat: null, div: null, contentSize: null, size: null, contentHTML: null, backgroundColor: "", opacity: "", border: "", contentDiv: null, groupDiv: null, closeDiv: null, autoSize: !1, minSize: null, maxSize: null, displayClass: "olPopup", contentDisplayClass: "olPopupContent", padding: 0, disableFirefoxOverflowHack: !1, fixPadding: function() { "number" == typeof this.padding && (this.padding = new OpenLayers.Bounds(this.padding, this.padding, this.padding, this.padding)) }, panMapIfOutOfView: !1,
+ keepInMap: !1, closeOnMove: !1, map: null, initialize: function(a, b, c, d, e, f) {
+ null == a && (a = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_")); this.id = a; this.lonlat = b; this.contentSize = null != c ? c : new OpenLayers.Size(OpenLayers.Popup.WIDTH, OpenLayers.Popup.HEIGHT); null != d && (this.contentHTML = d); this.backgroundColor = OpenLayers.Popup.COLOR; this.opacity = OpenLayers.Popup.OPACITY; this.border = OpenLayers.Popup.BORDER; this.div = OpenLayers.Util.createDiv(this.id, null, null, null, null, null, "hidden"); this.div.className = this.displayClass;
+ this.groupDiv = OpenLayers.Util.createDiv(this.id + "_GroupDiv", null, null, null, "relative", null, "hidden"); a = this.div.id + "_contentDiv"; this.contentDiv = OpenLayers.Util.createDiv(a, null, this.contentSize.clone(), null, "relative"); this.contentDiv.className = this.contentDisplayClass; this.groupDiv.appendChild(this.contentDiv); this.div.appendChild(this.groupDiv); e && this.addCloseBox(f); this.registerEvents()
+ }, destroy: function() {
+ this.border = this.opacity = this.backgroundColor = this.contentHTML = this.size = this.lonlat = this.id =
+ null; this.closeOnMove && this.map && this.map.events.unregister("movestart", this, this.hide); this.events.destroy(); this.events = null; this.closeDiv && (OpenLayers.Event.stopObservingElement(this.closeDiv), this.groupDiv.removeChild(this.closeDiv)); this.closeDiv = null; this.div.removeChild(this.groupDiv); this.groupDiv = null; null != this.map && this.map.removePopup(this); this.panMapIfOutOfView = this.padding = this.maxSize = this.minSize = this.autoSize = this.div = this.map = null
+ }, draw: function(a) {
+ null == a && null != this.lonlat && null !=
+ this.map && (a = this.map.getLayerPxFromLonLat(this.lonlat)); this.closeOnMove && this.map.events.register("movestart", this, this.hide); this.disableFirefoxOverflowHack || "firefox" != OpenLayers.BROWSER_NAME || (this.map.events.register("movestart", this, function() { var a = document.defaultView.getComputedStyle(this.contentDiv, null).getPropertyValue("overflow"); "hidden" != a && (this.contentDiv._oldOverflow = a, this.contentDiv.style.overflow = "hidden") }), this.map.events.register("moveend", this, function() {
+ var a = this.contentDiv._oldOverflow;
+ a && (this.contentDiv.style.overflow = a, this.contentDiv._oldOverflow = null)
+ })); this.moveTo(a); this.autoSize || this.size || this.setSize(this.contentSize); this.setBackgroundColor(); this.setOpacity(); this.setBorder(); this.setContentHTML(); this.panMapIfOutOfView && this.panIntoView(); return this.div
+ }, updatePosition: function() { if (this.lonlat && this.map) { var a = this.map.getLayerPxFromLonLat(this.lonlat); a && this.moveTo(a) } }, moveTo: function(a) {
+ null != a && null != this.div && (this.div.style.left = a.x + "px", this.div.style.top =
+ a.y + "px")
+ }, visible: function() { return OpenLayers.Element.visible(this.div) }, toggle: function() { this.visible() ? this.hide() : this.show() }, show: function() { this.div.style.display = ""; this.panMapIfOutOfView && this.panIntoView() }, hide: function() { this.div.style.display = "none" }, setSize: function(a) {
+ this.size = a.clone(); var b = this.getContentDivPadding(), c = b.left + b.right, d = b.top + b.bottom; this.fixPadding(); c += this.padding.left + this.padding.right; d += this.padding.top + this.padding.bottom; if (this.closeDiv) var e = parseInt(this.closeDiv.style.width),
+ c = c + (e + b.right); this.size.w += c; this.size.h += d; "msie" == OpenLayers.BROWSER_NAME && (this.contentSize.w += b.left + b.right, this.contentSize.h += b.bottom + b.top); null != this.div && (this.div.style.width = this.size.w + "px", this.div.style.height = this.size.h + "px"); null != this.contentDiv && (this.contentDiv.style.width = a.w + "px", this.contentDiv.style.height = a.h + "px")
+ }, updateSize: function() {
+ var a = "\x3cdiv class\x3d'" + this.contentDisplayClass + "'\x3e" + this.contentDiv.innerHTML + "\x3c/div\x3e", b = this.map ? this.map.div : document.body,
+ c = OpenLayers.Util.getRenderedDimensions(a, null, { displayClass: this.displayClass, containerElement: b }), d = this.getSafeContentSize(c), e = null; d.equals(c) ? e = c : (c = { w: d.w < c.w ? d.w : null, h: d.h < c.h ? d.h : null }, c.w && c.h ? e = d : (a = OpenLayers.Util.getRenderedDimensions(a, c, { displayClass: this.contentDisplayClass, containerElement: b }), "hidden" != OpenLayers.Element.getStyle(this.contentDiv, "overflow") && a.equals(d) && (d = OpenLayers.Util.getScrollbarWidth(), c.w ? a.h += d : a.w += d), e = this.getSafeContentSize(a))); this.setSize(e)
+ }, setBackgroundColor: function(a) {
+ void 0 !=
+ a && (this.backgroundColor = a); null != this.div && (this.div.style.backgroundColor = this.backgroundColor)
+ }, setOpacity: function(a) { void 0 != a && (this.opacity = a); null != this.div && (this.div.style.opacity = this.opacity, this.div.style.filter = "alpha(opacity\x3d" + 100 * this.opacity + ")") }, setBorder: function(a) { void 0 != a && (this.border = a); null != this.div && (this.div.style.border = this.border) }, setContentHTML: function(a) {
+ null != a && (this.contentHTML = a); null != this.contentDiv && null != this.contentHTML && this.contentHTML != this.contentDiv.innerHTML &&
+ (this.contentDiv.innerHTML = this.contentHTML, this.autoSize && (this.registerImageListeners(), this.updateSize()))
+ }, registerImageListeners: function() {
+ for (var a = function() { null !== this.popup.id && (this.popup.updateSize(), this.popup.visible() && this.popup.panMapIfOutOfView && this.popup.panIntoView(), OpenLayers.Event.stopObserving(this.img, "load", this.img._onImgLoad)) }, b = this.contentDiv.getElementsByTagName("img"), c = 0, d = b.length; c < d; c++) {
+ var e = b[c]; if (0 == e.width || 0 == e.height) e._onImgLoad = OpenLayers.Function.bind(a,
+ { popup: this, img: e }), OpenLayers.Event.observe(e, "load", e._onImgLoad)
+ }
+ }, getSafeContentSize: function(a) {
+ a = a.clone(); var b = this.getContentDivPadding(), c = b.left + b.right, d = b.top + b.bottom; this.fixPadding(); c += this.padding.left + this.padding.right; d += this.padding.top + this.padding.bottom; if (this.closeDiv) var e = parseInt(this.closeDiv.style.width), c = c + (e + b.right); this.minSize && (a.w = Math.max(a.w, this.minSize.w - c), a.h = Math.max(a.h, this.minSize.h - d)); this.maxSize && (a.w = Math.min(a.w, this.maxSize.w - c), a.h = Math.min(a.h,
+ this.maxSize.h - d)); if (this.map && this.map.size) {
+ e = b = 0; if (this.keepInMap && !this.panMapIfOutOfView) switch (e = this.map.getPixelFromLonLat(this.lonlat), this.relativePosition) { case "tr": b = e.x; e = this.map.size.h - e.y; break; case "tl": b = this.map.size.w - e.x; e = this.map.size.h - e.y; break; case "bl": b = this.map.size.w - e.x; e = e.y; break; case "br": b = e.x; e = e.y; break; default: b = e.x, e = this.map.size.h - e.y }d = this.map.size.h - this.map.paddingForPopups.top - this.map.paddingForPopups.bottom - d - e; a.w = Math.min(a.w, this.map.size.w - this.map.paddingForPopups.left -
+ this.map.paddingForPopups.right - c - b); a.h = Math.min(a.h, d)
+ } return a
+ }, getContentDivPadding: function() {
+ var a = this._contentDivPadding; a || (null == this.div.parentNode && (this.div.style.display = "none", document.body.appendChild(this.div)), this._contentDivPadding = a = new OpenLayers.Bounds(OpenLayers.Element.getStyle(this.contentDiv, "padding-left"), OpenLayers.Element.getStyle(this.contentDiv, "padding-bottom"), OpenLayers.Element.getStyle(this.contentDiv, "padding-right"), OpenLayers.Element.getStyle(this.contentDiv,
+ "padding-top")), this.div.parentNode == document.body && (document.body.removeChild(this.div), this.div.style.display = "")); return a
+ }, addCloseBox: function(a) {
+ this.closeDiv = OpenLayers.Util.createDiv(this.id + "_close", null, { w: 17, h: 17 }); this.closeDiv.className = "olPopupCloseBox"; var b = this.getContentDivPadding(); this.closeDiv.style.right = b.right + "px"; this.closeDiv.style.top = b.top + "px"; this.groupDiv.appendChild(this.closeDiv); a = a || function(a) { this.hide(); OpenLayers.Event.stop(a) }; OpenLayers.Event.observe(this.closeDiv,
+ "touchend", OpenLayers.Function.bindAsEventListener(a, this)); OpenLayers.Event.observe(this.closeDiv, "click", OpenLayers.Function.bindAsEventListener(a, this))
+ }, panIntoView: function() {
+ var a = this.map.getSize(), b = this.map.getViewPortPxFromLayerPx(new OpenLayers.Pixel(parseInt(this.div.style.left), parseInt(this.div.style.top))), c = b.clone(); b.x < this.map.paddingForPopups.left ? c.x = this.map.paddingForPopups.left : b.x + this.size.w > a.w - this.map.paddingForPopups.right && (c.x = a.w - this.map.paddingForPopups.right - this.size.w);
+ b.y < this.map.paddingForPopups.top ? c.y = this.map.paddingForPopups.top : b.y + this.size.h > a.h - this.map.paddingForPopups.bottom && (c.y = a.h - this.map.paddingForPopups.bottom - this.size.h); this.map.pan(b.x - c.x, b.y - c.y)
+ }, registerEvents: function() {
+ this.events = new OpenLayers.Events(this, this.div, null, !0); this.events.on({
+ mousedown: this.onmousedown, mousemove: this.onmousemove, mouseup: this.onmouseup, click: this.onclick, mouseout: this.onmouseout, dblclick: this.ondblclick, touchstart: function(a) { OpenLayers.Event.stop(a, !0) },
+ scope: this
+ })
+ }, onmousedown: function(a) { this.mousedown = !0; OpenLayers.Event.stop(a, !0) }, onmousemove: function(a) { this.mousedown && OpenLayers.Event.stop(a, !0) }, onmouseup: function(a) { this.mousedown && (this.mousedown = !1, OpenLayers.Event.stop(a, !0)) }, onclick: function(a) { OpenLayers.Event.stop(a, !0) }, onmouseout: function(a) { this.mousedown = !1 }, ondblclick: function(a) { OpenLayers.Event.stop(a, !0) }, CLASS_NAME: "OpenLayers.Popup"
+}); OpenLayers.Popup.WIDTH = 200; OpenLayers.Popup.HEIGHT = 200; OpenLayers.Popup.COLOR = "white";
+OpenLayers.Popup.OPACITY = 1; OpenLayers.Popup.BORDER = "0px";
+OpenLayers.Control.ScaleLine = OpenLayers.Class(OpenLayers.Control, {
+ maxWidth: 100, topOutUnits: "km", topInUnits: "m", bottomOutUnits: "mi", bottomInUnits: "ft", eTop: null, eBottom: null, geodesic: !1, draw: function() {
+ OpenLayers.Control.prototype.draw.apply(this, arguments); this.eTop || (this.eTop = document.createElement("div"), this.eTop.className = this.displayClass + "Top", this.div.appendChild(this.eTop), this.eTop.style.visibility = "" == this.topOutUnits || "" == this.topInUnits ? "hidden" : "visible", this.eBottom = document.createElement("div"),
+ this.eBottom.className = this.displayClass + "Bottom", this.div.appendChild(this.eBottom), this.eBottom.style.visibility = "" == this.bottomOutUnits || "" == this.bottomInUnits ? "hidden" : "visible"); this.map.events.register("moveend", this, this.update); this.update(); return this.div
+ }, getBarLen: function(a) { var b = parseInt(Math.log(a) / Math.log(10)), b = Math.pow(10, b); a = parseInt(a / b); return (5 < a ? 5 : 2 < a ? 2 : 1) * b }, update: function() {
+ var a = this.map.getResolution(); if (a) {
+ var b = this.map.getUnits(), c = OpenLayers.INCHES_PER_UNIT, d = this.maxWidth *
+ a * c[b], e = 1; !0 === this.geodesic && (e = (this.map.getGeodesicPixelSize().w || 1E-6) * this.maxWidth / (d / c.km), d *= e); var f, g; 1E5 < d ? (f = this.topOutUnits, g = this.bottomOutUnits) : (f = this.topInUnits, g = this.bottomInUnits); var h = d / c[f], k = d / c[g], d = this.getBarLen(h), l = this.getBarLen(k), h = d / c[b] * c[f], k = l / c[b] * c[g], b = h / a / e; "visible" == this.eBottom.style.visibility && (this.eBottom.style.width = Math.round(k / a / e) + "px", this.eBottom.innerHTML = l + " " + g); "visible" == this.eTop.style.visibility && (this.eTop.style.width = Math.round(b) + "px",
+ this.eTop.innerHTML = d + " " + f)
+ }
+ }, CLASS_NAME: "OpenLayers.Control.ScaleLine"
+});
+OpenLayers.Icon = OpenLayers.Class({
+ url: null, size: null, offset: null, calculateOffset: null, imageDiv: null, px: null, initialize: function(a, b, c, d) { this.url = a; this.size = b || { w: 20, h: 20 }; this.offset = c || { x: -(this.size.w / 2), y: -(this.size.h / 2) }; this.calculateOffset = d; a = OpenLayers.Util.createUniqueID("OL_Icon_"); this.imageDiv = OpenLayers.Util.createAlphaImageDiv(a) }, destroy: function() { this.erase(); OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild); this.imageDiv.innerHTML = ""; this.imageDiv = null }, clone: function() {
+ return new OpenLayers.Icon(this.url,
+ this.size, this.offset, this.calculateOffset)
+ }, setSize: function(a) { null != a && (this.size = a); this.draw() }, setUrl: function(a) { null != a && (this.url = a); this.draw() }, draw: function(a) { OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, this.size, this.url, "absolute"); this.moveTo(a); return this.imageDiv }, erase: function() { null != this.imageDiv && null != this.imageDiv.parentNode && OpenLayers.Element.remove(this.imageDiv) }, setOpacity: function(a) {
+ OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, null, null, null,
+ null, null, null, a)
+ }, moveTo: function(a) { null != a && (this.px = a); null != this.imageDiv && (null == this.px ? this.display(!1) : (this.calculateOffset && (this.offset = this.calculateOffset(this.size)), OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, { x: this.px.x + this.offset.x, y: this.px.y + this.offset.y }))) }, display: function(a) { this.imageDiv.style.display = a ? "" : "none" }, isDrawn: function() { return this.imageDiv && this.imageDiv.parentNode && 11 != this.imageDiv.parentNode.nodeType }, CLASS_NAME: "OpenLayers.Icon"
+});
+OpenLayers.Marker = OpenLayers.Class({
+ icon: null, lonlat: null, events: null, map: null, initialize: function(a, b) { this.lonlat = a; var c = b ? b : OpenLayers.Marker.defaultIcon(); null == this.icon ? this.icon = c : (this.icon.url = c.url, this.icon.size = c.size, this.icon.offset = c.offset, this.icon.calculateOffset = c.calculateOffset); this.events = new OpenLayers.Events(this, this.icon.imageDiv) }, destroy: function() { this.erase(); this.map = null; this.events.destroy(); this.events = null; null != this.icon && (this.icon.destroy(), this.icon = null) },
+ draw: function(a) { return this.icon.draw(a) }, erase: function() { null != this.icon && this.icon.erase() }, moveTo: function(a) { null != a && null != this.icon && this.icon.moveTo(a); this.lonlat = this.map.getLonLatFromLayerPx(a) }, isDrawn: function() { return this.icon && this.icon.isDrawn() }, onScreen: function() { var a = !1; this.map && (a = this.map.getExtent().containsLonLat(this.lonlat)); return a }, inflate: function(a) { this.icon && this.icon.setSize({ w: this.icon.size.w * a, h: this.icon.size.h * a }) }, setOpacity: function(a) { this.icon.setOpacity(a) },
+ setUrl: function(a) { this.icon.setUrl(a) }, display: function(a) { this.icon.display(a) }, CLASS_NAME: "OpenLayers.Marker"
+}); OpenLayers.Marker.defaultIcon = function() { return new OpenLayers.Icon(OpenLayers.Util.getImageLocation("marker.png"), { w: 21, h: 25 }, { x: -10.5, y: -25 }) };
+OpenLayers.Layer.TileCache = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ isBaseLayer: !0, format: "image/png", serverResolutions: null, initialize: function(a, b, c, d) { this.layername = c; OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a, b, {}, d]); this.extension = this.format.split("/")[1].toLowerCase(); this.extension = "jpg" == this.extension ? "jpeg" : this.extension }, clone: function(a) {
+ null == a && (a = new OpenLayers.Layer.TileCache(this.name, this.url, this.layername, this.getOptions())); return OpenLayers.Layer.Grid.prototype.clone.apply(this,
+ [a])
+ }, getURL: function(a) {
+ var b = this.getServerResolution(), c = this.maxExtent, d = this.tileSize, e = Math.round((a.left - c.left) / (b * d.w)); a = Math.round((a.bottom - c.bottom) / (b * d.h)); b = null != this.serverResolutions ? OpenLayers.Util.indexOf(this.serverResolutions, b) : this.map.getZoom(); e = [this.layername, OpenLayers.Number.zeroPad(b, 2), OpenLayers.Number.zeroPad(parseInt(e / 1E6), 3), OpenLayers.Number.zeroPad(parseInt(e / 1E3) % 1E3, 3), OpenLayers.Number.zeroPad(parseInt(e) % 1E3, 3), OpenLayers.Number.zeroPad(parseInt(a / 1E6),
+ 3), OpenLayers.Number.zeroPad(parseInt(a / 1E3) % 1E3, 3), OpenLayers.Number.zeroPad(parseInt(a) % 1E3, 3) + "." + this.extension].join("/"); b = this.url; OpenLayers.Util.isArray(b) && (b = this.selectUrl(e, b)); b = "/" == b.charAt(b.length - 1) ? b : b + "/"; return b + e
+ }, CLASS_NAME: "OpenLayers.Layer.TileCache"
+});
+OpenLayers.Strategy.Paging = OpenLayers.Class(OpenLayers.Strategy, {
+ features: null, length: 10, num: null, paging: !1, activate: function() { var a = OpenLayers.Strategy.prototype.activate.call(this); if (a) this.layer.events.on({ beforefeaturesadded: this.cacheFeatures, scope: this }); return a }, deactivate: function() { var a = OpenLayers.Strategy.prototype.deactivate.call(this); a && (this.clearCache(), this.layer.events.un({ beforefeaturesadded: this.cacheFeatures, scope: this })); return a }, cacheFeatures: function(a) {
+ this.paging || (this.clearCache(),
+ this.features = a.features, this.pageNext(a))
+ }, clearCache: function() { if (this.features) for (var a = 0; a < this.features.length; ++a)this.features[a].destroy(); this.num = this.features = null }, pageCount: function() { return Math.ceil((this.features ? this.features.length : 0) / this.length) }, pageNum: function() { return this.num }, pageLength: function(a) { a && 0 < a && (this.length = a); return this.length }, pageNext: function(a) { var b = !1; this.features && (null === this.num && (this.num = -1), b = this.page((this.num + 1) * this.length, a)); return b }, pagePrevious: function() {
+ var a =
+ !1; this.features && (null === this.num && (this.num = this.pageCount()), a = this.page((this.num - 1) * this.length)); return a
+ }, page: function(a, b) { var c = !1; if (this.features && 0 <= a && a < this.features.length) { var d = Math.floor(a / this.length); d != this.num && (this.paging = !0, c = this.features.slice(a, a + this.length), this.layer.removeFeatures(this.layer.features), this.num = d, b && b.features ? b.features = c : this.layer.addFeatures(c), this.paging = !1, c = !0) } return c }, CLASS_NAME: "OpenLayers.Strategy.Paging"
+});
+OpenLayers.Control.DragFeature = OpenLayers.Class(OpenLayers.Control, {
+ geometryTypes: null, onStart: function(a, b) { }, onDrag: function(a, b) { }, onComplete: function(a, b) { }, onEnter: function(a) { }, onLeave: function(a) { }, documentDrag: !1, layer: null, feature: null, dragCallbacks: {}, featureCallbacks: {}, lastPixel: null, initialize: function(a, b) {
+ OpenLayers.Control.prototype.initialize.apply(this, [b]); this.layer = a; this.handlers = {
+ drag: new OpenLayers.Handler.Drag(this, OpenLayers.Util.extend({
+ down: this.downFeature, move: this.moveFeature,
+ up: this.upFeature, out: this.cancel, done: this.doneDragging
+ }, this.dragCallbacks), { documentDrag: this.documentDrag }), feature: new OpenLayers.Handler.Feature(this, this.layer, OpenLayers.Util.extend({ click: this.clickFeature, clickout: this.clickoutFeature, over: this.overFeature, out: this.outFeature }, this.featureCallbacks), { geometryTypes: this.geometryTypes })
+ }
+ }, clickFeature: function(a) {
+ this.handlers.feature.touch && !this.over && this.overFeature(a) && (this.handlers.drag.dragstart(this.handlers.feature.evt), this.handlers.drag.stopDown =
+ !1)
+ }, clickoutFeature: function(a) { this.handlers.feature.touch && this.over && (this.outFeature(a), this.handlers.drag.stopDown = !0) }, destroy: function() { this.layer = null; OpenLayers.Control.prototype.destroy.apply(this, []) }, activate: function() { return this.handlers.feature.activate() && OpenLayers.Control.prototype.activate.apply(this, arguments) }, deactivate: function() {
+ this.handlers.drag.deactivate(); this.handlers.feature.deactivate(); this.feature = null; this.dragging = !1; this.lastPixel = null; OpenLayers.Element.removeClass(this.map.viewPortDiv,
+ this.displayClass + "Over"); return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+ }, overFeature: function(a) { var b = !1; this.handlers.drag.dragging ? this.over = this.feature.id == a.id ? !0 : !1 : (this.feature = a, this.handlers.drag.activate(), this.over = b = !0, OpenLayers.Element.addClass(this.map.viewPortDiv, this.displayClass + "Over"), this.onEnter(a)); return b }, downFeature: function(a) { this.lastPixel = a; this.onStart(this.feature, a) }, moveFeature: function(a) {
+ var b = this.map.getResolution(); this.feature.geometry.move(b *
+ (a.x - this.lastPixel.x), b * (this.lastPixel.y - a.y)); this.layer.drawFeature(this.feature); this.lastPixel = a; this.onDrag(this.feature, a)
+ }, upFeature: function(a) { this.over || this.handlers.drag.deactivate() }, doneDragging: function(a) { this.onComplete(this.feature, a) }, outFeature: function(a) { this.handlers.drag.dragging ? this.feature.id == a.id && (this.over = !1) : (this.over = !1, this.handlers.drag.deactivate(), OpenLayers.Element.removeClass(this.map.viewPortDiv, this.displayClass + "Over"), this.onLeave(a), this.feature = null) },
+ cancel: function() { this.handlers.drag.deactivate(); this.over = !1 }, setMap: function(a) { this.handlers.drag.setMap(a); this.handlers.feature.setMap(a); OpenLayers.Control.prototype.setMap.apply(this, arguments) }, CLASS_NAME: "OpenLayers.Control.DragFeature"
+});
+OpenLayers.Control.TransformFeature = OpenLayers.Class(OpenLayers.Control, {
+ geometryTypes: null, layer: null, preserveAspectRatio: !1, rotate: !0, feature: null, renderIntent: "temporary", rotationHandleSymbolizer: null, box: null, center: null, scale: 1, ratio: 1, rotation: 0, handles: null, rotationHandles: null, dragControl: null, irregular: !1, initialize: function(a, b) {
+ OpenLayers.Control.prototype.initialize.apply(this, [b]); this.layer = a; this.rotationHandleSymbolizer || (this.rotationHandleSymbolizer = {
+ stroke: !1, pointRadius: 10, fillOpacity: 0,
+ cursor: "pointer"
+ }); this.createBox(); this.createControl()
+ }, activate: function() { var a = !1; OpenLayers.Control.prototype.activate.apply(this, arguments) && (this.dragControl.activate(), this.layer.addFeatures([this.box]), this.rotate && this.layer.addFeatures(this.rotationHandles), this.layer.addFeatures(this.handles), a = !0); return a }, deactivate: function() {
+ var a = !1; OpenLayers.Control.prototype.deactivate.apply(this, arguments) && (this.layer.removeFeatures(this.handles), this.rotate && this.layer.removeFeatures(this.rotationHandles),
+ this.layer.removeFeatures([this.box]), this.dragControl.deactivate(), a = !0); return a
+ }, setMap: function(a) { this.dragControl.setMap(a); OpenLayers.Control.prototype.setMap.apply(this, arguments) }, setFeature: function(a, b) {
+ b = OpenLayers.Util.applyDefaults(b, { rotation: 0, scale: 1, ratio: 1 }); var c = this.rotation, d = this.center; OpenLayers.Util.extend(this, b); if (!1 !== this.events.triggerEvent("beforesetfeature", { feature: a })) {
+ this.feature = a; this.activate(); this._setfeature = !0; var e = this.feature.geometry.getBounds(); this.box.move(e.getCenterLonLat());
+ this.box.geometry.rotate(-c, d); this._angle = 0; this.rotation ? (c = a.geometry.clone(), c.rotate(-this.rotation, this.center), c = new OpenLayers.Feature.Vector(c.getBounds().toGeometry()), c.geometry.rotate(this.rotation, this.center), this.box.geometry.rotate(this.rotation, this.center), this.box.move(c.geometry.getBounds().getCenterLonLat()), c = c.geometry.components[0].components[0].getBounds().getCenterLonLat()) : c = new OpenLayers.LonLat(e.left, e.bottom); this.handles[0].move(c); delete this._setfeature; this.events.triggerEvent("setfeature",
+ { feature: a })
+ }
+ }, unsetFeature: function() { this.active ? this.deactivate() : (this.feature = null, this.rotation = 0, this.ratio = this.scale = 1) }, createBox: function() {
+ var a = this; this.center = new OpenLayers.Geometry.Point(0, 0); this.box = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([new OpenLayers.Geometry.Point(-1, -1), new OpenLayers.Geometry.Point(0, -1), new OpenLayers.Geometry.Point(1, -1), new OpenLayers.Geometry.Point(1, 0), new OpenLayers.Geometry.Point(1, 1), new OpenLayers.Geometry.Point(0, 1), new OpenLayers.Geometry.Point(-1,
+ 1), new OpenLayers.Geometry.Point(-1, 0), new OpenLayers.Geometry.Point(-1, -1)]), null, "string" == typeof this.renderIntent ? null : this.renderIntent); this.box.geometry.move = function(b, c) { a._moving = !0; OpenLayers.Geometry.LineString.prototype.move.apply(this, arguments); a.center.move(b, c); delete a._moving }; for (var b = function(a, b) { OpenLayers.Geometry.Point.prototype.move.apply(this, arguments); this._rotationHandle && this._rotationHandle.geometry.move(a, b); this._handle.geometry.move(a, b) }, c = function(a, b, c) {
+ OpenLayers.Geometry.Point.prototype.resize.apply(this,
+ arguments); this._rotationHandle && this._rotationHandle.geometry.resize(a, b, c); this._handle.geometry.resize(a, b, c)
+ }, d = function(a, b) { OpenLayers.Geometry.Point.prototype.rotate.apply(this, arguments); this._rotationHandle && this._rotationHandle.geometry.rotate(a, b); this._handle.geometry.rotate(a, b) }, e = function(b, c) {
+ var d = this.x, e = this.y; OpenLayers.Geometry.Point.prototype.move.call(this, b, c); if (!a._moving) {
+ var f = a.dragControl.handlers.drag.evt, g = !(!a._setfeature && a.preserveAspectRatio) && !(f && f.shiftKey),
+ h = new OpenLayers.Geometry.Point(d, e), f = a.center; this.rotate(-a.rotation, f); h.rotate(-a.rotation, f); var k = this.x - f.x, l = this.y - f.y, m = k - (this.x - h.x), n = l - (this.y - h.y); a.irregular && !a._setfeature && (k -= (this.x - h.x) / 2, l -= (this.y - h.y) / 2); this.x = d; this.y = e; h = 1; g ? (l = 1E-5 > Math.abs(n) ? 1 : l / n, h = (1E-5 > Math.abs(m) ? 1 : k / m) / l) : (m = Math.sqrt(m * m + n * n), l = Math.sqrt(k * k + l * l) / m); a._moving = !0; a.box.geometry.rotate(-a.rotation, f); delete a._moving; a.box.geometry.resize(l, f, h); a.box.geometry.rotate(a.rotation, f); a.transformFeature({
+ scale: l,
+ ratio: h
+ }); a.irregular && !a._setfeature && (k = f.clone(), k.x += 1E-5 > Math.abs(d - f.x) ? 0 : this.x - d, k.y += 1E-5 > Math.abs(e - f.y) ? 0 : this.y - e, a.box.geometry.move(this.x - d, this.y - e), a.transformFeature({ center: k }))
+ }
+ }, f = function(b, c) {
+ var d = this.x, e = this.y; OpenLayers.Geometry.Point.prototype.move.call(this, b, c); if (!a._moving) {
+ var f = a.dragControl.handlers.drag.evt, f = f && f.shiftKey ? 45 : 1, g = a.center, h = this.x - g.x, k = this.y - g.y; this.x = d; this.y = e; d = Math.atan2(k - c, h - b); d = Math.atan2(k, h) - d; d *= 180 / Math.PI; a._angle = (a._angle + d) %
+ 360; d = a.rotation % f; if (Math.abs(a._angle) >= f || 0 !== d) d = Math.round(a._angle / f) * f - d, a._angle = 0, a.box.geometry.rotate(d, g), a.transformFeature({ rotation: d })
+ }
+ }, g = Array(8), h = Array(4), k, l, m, n = "sw s se e ne n nw w".split(" "), p = 0; 8 > p; ++p)k = this.box.geometry.components[p], l = new OpenLayers.Feature.Vector(k.clone(), { role: n[p] + "-resize" }, "string" == typeof this.renderIntent ? null : this.renderIntent), 0 == p % 2 && (m = new OpenLayers.Feature.Vector(k.clone(), { role: n[p] + "-rotate" }, "string" == typeof this.rotationHandleSymbolizer ?
+ null : this.rotationHandleSymbolizer), m.geometry.move = f, k._rotationHandle = m, h[p / 2] = m), k.move = b, k.resize = c, k.rotate = d, l.geometry.move = e, k._handle = l, g[p] = l; this.rotationHandles = h; this.handles = g
+ }, createControl: function() {
+ var a = this; this.dragControl = new OpenLayers.Control.DragFeature(this.layer, {
+ documentDrag: !0, moveFeature: function(b) { this.feature === a.feature && (this.feature = a.box); OpenLayers.Control.DragFeature.prototype.moveFeature.apply(this, arguments) }, onDrag: function(b, c) { b === a.box && a.transformFeature({ center: a.center }) },
+ onStart: function(b, c) { var d = !a.geometryTypes || -1 !== OpenLayers.Util.indexOf(a.geometryTypes, b.geometry.CLASS_NAME), e = OpenLayers.Util.indexOf(a.handles, b), e = e + OpenLayers.Util.indexOf(a.rotationHandles, b); b !== a.feature && b !== a.box && -2 == e && d && a.setFeature(b) }, onComplete: function(b, c) { a.events.triggerEvent("transformcomplete", { feature: a.feature }) }
+ })
+ }, drawHandles: function() {
+ for (var a = this.layer, b = 0; 8 > b; ++b)this.rotate && 0 === b % 2 && a.drawFeature(this.rotationHandles[b / 2], this.rotationHandleSymbolizer), a.drawFeature(this.handles[b],
+ this.renderIntent)
+ }, transformFeature: function(a) {
+ if (!this._setfeature) {
+ this.scale *= a.scale || 1; this.ratio *= a.ratio || 1; var b = this.rotation; this.rotation = (this.rotation + (a.rotation || 0)) % 360; if (!1 !== this.events.triggerEvent("beforetransform", a)) {
+ var c = this.feature, d = c.geometry, e = this.center; d.rotate(-b, e); a.scale || a.ratio ? d.resize(a.scale, e, a.ratio) : a.center && c.move(a.center.getBounds().getCenterLonLat()); d.rotate(this.rotation, e); this.layer.drawFeature(c); c.toState(OpenLayers.State.UPDATE); this.events.triggerEvent("transform",
+ a)
+ }
+ } this.layer.drawFeature(this.box, this.renderIntent); this.drawHandles()
+ }, destroy: function() { for (var a, b = 0; 8 > b; ++b)a = this.box.geometry.components[b], a._handle.destroy(), a._handle = null, a._rotationHandle && a._rotationHandle.destroy(), a._rotationHandle = null; this.rotationHandles = this.rotationHandleSymbolizer = this.handles = this.feature = this.center = null; this.box.destroy(); this.layer = this.box = null; this.dragControl.destroy(); this.dragControl = null; OpenLayers.Control.prototype.destroy.apply(this, arguments) },
+ CLASS_NAME: "OpenLayers.Control.TransformFeature"
+});
+OpenLayers.Handler.Box = OpenLayers.Class(OpenLayers.Handler, {
+ dragHandler: null, boxDivClassName: "olHandlerBoxZoomBox", boxOffsets: null, initialize: function(a, b, c) { OpenLayers.Handler.prototype.initialize.apply(this, arguments); this.dragHandler = new OpenLayers.Handler.Drag(this, { down: this.startBox, move: this.moveBox, out: this.removeBox, up: this.endBox }, { keyMask: this.keyMask }) }, destroy: function() {
+ OpenLayers.Handler.prototype.destroy.apply(this, arguments); this.dragHandler && (this.dragHandler.destroy(), this.dragHandler =
+ null)
+ }, setMap: function(a) { OpenLayers.Handler.prototype.setMap.apply(this, arguments); this.dragHandler && this.dragHandler.setMap(a) }, startBox: function(a) { this.callback("start", []); this.zoomBox = OpenLayers.Util.createDiv("zoomBox", { x: -9999, y: -9999 }); this.zoomBox.className = this.boxDivClassName; this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE.Popup - 1; this.map.viewPortDiv.appendChild(this.zoomBox); OpenLayers.Element.addClass(this.map.viewPortDiv, "olDrawBox") }, moveBox: function(a) {
+ var b = this.dragHandler.start.x,
+ c = this.dragHandler.start.y, d = Math.abs(b - a.x), e = Math.abs(c - a.y), f = this.getBoxOffsets(); this.zoomBox.style.width = d + f.width + 1 + "px"; this.zoomBox.style.height = e + f.height + 1 + "px"; this.zoomBox.style.left = (a.x < b ? b - d - f.left : b - f.left) + "px"; this.zoomBox.style.top = (a.y < c ? c - e - f.top : c - f.top) + "px"
+ }, endBox: function(a) {
+ var b; if (5 < Math.abs(this.dragHandler.start.x - a.x) || 5 < Math.abs(this.dragHandler.start.y - a.y)) {
+ var c = this.dragHandler.start; b = Math.min(c.y, a.y); var d = Math.max(c.y, a.y), e = Math.min(c.x, a.x); a = Math.max(c.x,
+ a.x); b = new OpenLayers.Bounds(e, d, a, b)
+ } else b = this.dragHandler.start.clone(); this.removeBox(); this.callback("done", [b])
+ }, removeBox: function() { this.map.viewPortDiv.removeChild(this.zoomBox); this.boxOffsets = this.zoomBox = null; OpenLayers.Element.removeClass(this.map.viewPortDiv, "olDrawBox") }, activate: function() { return OpenLayers.Handler.prototype.activate.apply(this, arguments) ? (this.dragHandler.activate(), !0) : !1 }, deactivate: function() {
+ return OpenLayers.Handler.prototype.deactivate.apply(this, arguments) ?
+ (this.dragHandler.deactivate() && this.zoomBox && this.removeBox(), !0) : !1
+ }, getBoxOffsets: function() {
+ if (!this.boxOffsets) {
+ var a = document.createElement("div"); a.style.position = "absolute"; a.style.border = "1px solid black"; a.style.width = "3px"; document.body.appendChild(a); var b = 3 == a.clientWidth; document.body.removeChild(a); var a = parseInt(OpenLayers.Element.getStyle(this.zoomBox, "border-left-width")), c = parseInt(OpenLayers.Element.getStyle(this.zoomBox, "border-right-width")), d = parseInt(OpenLayers.Element.getStyle(this.zoomBox,
+ "border-top-width")), e = parseInt(OpenLayers.Element.getStyle(this.zoomBox, "border-bottom-width")); this.boxOffsets = { left: a, right: c, top: d, bottom: e, width: !1 === b ? a + c : 0, height: !1 === b ? d + e : 0 }
+ } return this.boxOffsets
+ }, CLASS_NAME: "OpenLayers.Handler.Box"
+});
+OpenLayers.Control.ZoomBox = OpenLayers.Class(OpenLayers.Control, {
+ type: OpenLayers.Control.TYPE_TOOL, out: !1, keyMask: null, alwaysZoom: !1, zoomOnClick: !0, draw: function() { this.handler = new OpenLayers.Handler.Box(this, { done: this.zoomBox }, { keyMask: this.keyMask }) }, zoomBox: function(a) {
+ if (a instanceof OpenLayers.Bounds) {
+ var b, c = a.getCenterPixel(); if (this.out) {
+ b = Math.min(this.map.size.h / (a.bottom - a.top), this.map.size.w / (a.right - a.left)); var d = this.map.getExtent(), e = this.map.getLonLatFromPixel(c), f = e.lon - d.getWidth() /
+ 2 * b; a = e.lon + d.getWidth() / 2 * b; var g = e.lat - d.getHeight() / 2 * b; b = e.lat + d.getHeight() / 2 * b; b = new OpenLayers.Bounds(f, g, a, b)
+ } else f = this.map.getLonLatFromPixel({ x: a.left, y: a.bottom }), a = this.map.getLonLatFromPixel({ x: a.right, y: a.top }), b = new OpenLayers.Bounds(f.lon, f.lat, a.lon, a.lat); f = this.map.getZoom(); g = this.map.getSize(); a = g.w / 2; g = g.h / 2; b = this.map.getZoomForExtent(b); d = this.map.getResolution(); e = this.map.getResolutionForZoom(b); d == e ? this.map.setCenter(this.map.getLonLatFromPixel(c)) : this.map.zoomTo(b,
+ { x: (d * c.x - e * a) / (d - e), y: (d * c.y - e * g) / (d - e) }); f == this.map.getZoom() && 1 == this.alwaysZoom && this.map.zoomTo(f + (this.out ? -1 : 1))
+ } else this.zoomOnClick && (this.out ? this.map.zoomTo(this.map.getZoom() - 1, a) : this.map.zoomTo(this.map.getZoom() + 1, a))
+ }, CLASS_NAME: "OpenLayers.Control.ZoomBox"
+});
+OpenLayers.Control.DragPan = OpenLayers.Class(OpenLayers.Control, {
+ type: OpenLayers.Control.TYPE_TOOL, panned: !1, interval: 0, documentDrag: !1, kinetic: null, enableKinetic: !0, kineticInterval: 10, draw: function() {
+ if (this.enableKinetic && OpenLayers.Kinetic) { var a = { interval: this.kineticInterval }; "object" === typeof this.enableKinetic && (a = OpenLayers.Util.extend(a, this.enableKinetic)); this.kinetic = new OpenLayers.Kinetic(a) } this.handler = new OpenLayers.Handler.Drag(this, { move: this.panMap, done: this.panMapDone, down: this.panMapStart },
+ { interval: this.interval, documentDrag: this.documentDrag })
+ }, panMapStart: function() { this.kinetic && this.kinetic.begin() }, panMap: function(a) { this.kinetic && this.kinetic.update(a); this.panned = !0; this.map.pan(this.handler.last.x - a.x, this.handler.last.y - a.y, { dragging: !0, animate: !1 }) }, panMapDone: function(a) {
+ if (this.panned) {
+ var b = null; this.kinetic && (b = this.kinetic.end(a)); this.map.pan(this.handler.last.x - a.x, this.handler.last.y - a.y, { dragging: !!b, animate: !1 }); if (b) {
+ var c = this; this.kinetic.move(b, function(a, b,
+ f) { c.map.pan(a, b, { dragging: !f, animate: !1 }) })
+ } this.panned = !1
+ }
+ }, CLASS_NAME: "OpenLayers.Control.DragPan"
+});
+OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
+ dragPan: null, dragPanOptions: null, pinchZoom: null, pinchZoomOptions: null, documentDrag: !1, zoomBox: null, zoomBoxEnabled: !0, zoomWheelEnabled: !0, mouseWheelOptions: null, handleRightClicks: !1, zoomBoxKeyMask: OpenLayers.Handler.MOD_SHIFT, autoActivate: !0, initialize: function(a) { this.handlers = {}; OpenLayers.Control.prototype.initialize.apply(this, arguments) }, destroy: function() {
+ this.deactivate(); this.dragPan && this.dragPan.destroy(); this.dragPan = null;
+ this.zoomBox && this.zoomBox.destroy(); this.zoomBox = null; this.pinchZoom && this.pinchZoom.destroy(); this.pinchZoom = null; OpenLayers.Control.prototype.destroy.apply(this, arguments)
+ }, activate: function() { this.dragPan.activate(); this.zoomWheelEnabled && this.handlers.wheel.activate(); this.handlers.click.activate(); this.zoomBoxEnabled && this.zoomBox.activate(); this.pinchZoom && this.pinchZoom.activate(); return OpenLayers.Control.prototype.activate.apply(this, arguments) }, deactivate: function() {
+ this.pinchZoom && this.pinchZoom.deactivate();
+ this.zoomBox.deactivate(); this.dragPan.deactivate(); this.handlers.click.deactivate(); this.handlers.wheel.deactivate(); return OpenLayers.Control.prototype.deactivate.apply(this, arguments)
+ }, draw: function() {
+ this.handleRightClicks && (this.map.viewPortDiv.oncontextmenu = OpenLayers.Function.False); this.handlers.click = new OpenLayers.Handler.Click(this, { click: this.defaultClick, dblclick: this.defaultDblClick, dblrightclick: this.defaultDblRightClick }, { "double": !0, stopDouble: !0 }); this.dragPan = new OpenLayers.Control.DragPan(OpenLayers.Util.extend({
+ map: this.map,
+ documentDrag: this.documentDrag
+ }, this.dragPanOptions)); this.zoomBox = new OpenLayers.Control.ZoomBox({ map: this.map, keyMask: this.zoomBoxKeyMask }); this.dragPan.draw(); this.zoomBox.draw(); this.handlers.wheel = new OpenLayers.Handler.MouseWheel(this, { up: this.wheelUp, down: this.wheelDown }, OpenLayers.Util.extend(this.map.fractionalZoom ? {} : { cumulative: !1, interval: 50, maxDelta: 6 }, this.mouseWheelOptions)); OpenLayers.Control.PinchZoom && (this.pinchZoom = new OpenLayers.Control.PinchZoom(OpenLayers.Util.extend({ map: this.map },
+ this.pinchZoomOptions)))
+ }, defaultClick: function(a) { a.lastTouches && 2 == a.lastTouches.length && this.map.zoomOut() }, defaultDblClick: function(a) { this.map.zoomTo(this.map.zoom + 1, a.xy) }, defaultDblRightClick: function(a) { this.map.zoomTo(this.map.zoom - 1, a.xy) }, wheelChange: function(a, b) { this.map.fractionalZoom || (b = Math.round(b)); var c = this.map.getZoom(), d; d = Math.max(c + b, 0); d = Math.min(d, this.map.getNumZoomLevels()); d !== c && this.map.zoomTo(d, a.xy) }, wheelUp: function(a, b) { this.wheelChange(a, b || 1) }, wheelDown: function(a,
+ b) { this.wheelChange(a, b || -1) }, disableZoomBox: function() { this.zoomBoxEnabled = !1; this.zoomBox.deactivate() }, enableZoomBox: function() { this.zoomBoxEnabled = !0; this.active && this.zoomBox.activate() }, disableZoomWheel: function() { this.zoomWheelEnabled = !1; this.handlers.wheel.deactivate() }, enableZoomWheel: function() { this.zoomWheelEnabled = !0; this.active && this.handlers.wheel.activate() }, CLASS_NAME: "OpenLayers.Control.Navigation"
+});
+OpenLayers.Control.DrawFeature = OpenLayers.Class(OpenLayers.Control, {
+ layer: null, callbacks: null, multi: !1, featureAdded: function() { }, initialize: function(a, b, c) {
+ OpenLayers.Control.prototype.initialize.apply(this, [c]); this.callbacks = OpenLayers.Util.extend({ done: this.drawFeature, modify: function(a, b) { this.layer.events.triggerEvent("sketchmodified", { vertex: a, feature: b }) }, create: function(a, b) { this.layer.events.triggerEvent("sketchstarted", { vertex: a, feature: b }) } }, this.callbacks); this.layer = a; this.handlerOptions =
+ this.handlerOptions || {}; this.handlerOptions.layerOptions = OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions, { renderers: a.renderers, rendererOptions: a.rendererOptions }); "multi" in this.handlerOptions || (this.handlerOptions.multi = this.multi); if (a = this.layer.styleMap && this.layer.styleMap.styles.temporary) this.handlerOptions.layerOptions = OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions, { styleMap: new OpenLayers.StyleMap({ "default": a }) }); this.handler = new b(this, this.callbacks, this.handlerOptions)
+ },
+ drawFeature: function(a) { a = new OpenLayers.Feature.Vector(a); !1 !== this.layer.events.triggerEvent("sketchcomplete", { feature: a }) && (a.state = OpenLayers.State.INSERT, this.layer.addFeatures([a]), this.featureAdded(a), this.events.triggerEvent("featureadded", { feature: a })) }, insertXY: function(a, b) { this.handler && this.handler.line && this.handler.insertXY(a, b) }, insertDeltaXY: function(a, b) { this.handler && this.handler.line && this.handler.insertDeltaXY(a, b) }, insertDirectionLength: function(a, b) {
+ this.handler && this.handler.line &&
+ this.handler.insertDirectionLength(a, b)
+ }, insertDeflectionLength: function(a, b) { this.handler && this.handler.line && this.handler.insertDeflectionLength(a, b) }, undo: function() { return this.handler.undo && this.handler.undo() }, redo: function() { return this.handler.redo && this.handler.redo() }, finishSketch: function() { this.handler.finishGeometry() }, cancel: function() { this.handler.cancel() }, CLASS_NAME: "OpenLayers.Control.DrawFeature"
+});
+OpenLayers.Handler.Polygon = OpenLayers.Class(OpenLayers.Handler.Path, {
+ holeModifier: null, drawingHole: !1, polygon: null, createFeature: function(a) {
+ a = this.layer.getLonLatFromViewPortPx(a); a = new OpenLayers.Geometry.Point(a.lon, a.lat); this.point = new OpenLayers.Feature.Vector(a); this.line = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LinearRing([this.point.geometry])); this.polygon = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([this.line.geometry])); this.callback("create", [this.point.geometry,
+ this.getSketch()]); this.point.geometry.clearBounds(); this.layer.addFeatures([this.polygon, this.point], { silent: !0 })
+ }, addPoint: function(a) {
+ if (!this.drawingHole && this.holeModifier && this.evt && this.evt[this.holeModifier]) for (var b = this.point.geometry, c = this.control.layer.features, d, e = c.length - 1; 0 <= e; --e)if (d = c[e].geometry, (d instanceof OpenLayers.Geometry.Polygon || d instanceof OpenLayers.Geometry.MultiPolygon) && d.intersects(b)) {
+ b = c[e]; this.control.layer.removeFeatures([b], { silent: !0 }); this.control.layer.events.registerPriority("sketchcomplete",
+ this, this.finalizeInteriorRing); this.control.layer.events.registerPriority("sketchmodified", this, this.enforceTopology); b.geometry.addComponent(this.line.geometry); this.polygon = b; this.drawingHole = !0; break
+ } OpenLayers.Handler.Path.prototype.addPoint.apply(this, arguments)
+ }, getCurrentPointIndex: function() { return this.line.geometry.components.length - 2 }, enforceTopology: function(a) { a = a.vertex; var b = this.line.geometry.components; this.polygon.geometry.intersects(a) || (b = b[b.length - 3], a.x = b.x, a.y = b.y) }, finishGeometry: function() {
+ this.line.geometry.removeComponent(this.line.geometry.components[this.line.geometry.components.length -
+ 2]); this.removePoint(); this.finalize()
+ }, finalizeInteriorRing: function() { var a = this.line.geometry, b = 0 !== a.getArea(); if (b) { for (var c = this.polygon.geometry.components, d = c.length - 2; 0 <= d; --d)if (a.intersects(c[d])) { b = !1; break } if (b) a: for (d = c.length - 2; 0 < d; --d)for (var e = c[d].components, f = 0, g = e.length; f < g; ++f)if (a.containsPoint(e[f])) { b = !1; break a } } b ? this.polygon.state !== OpenLayers.State.INSERT && (this.polygon.state = OpenLayers.State.UPDATE) : this.polygon.geometry.removeComponent(a); this.restoreFeature(); return !1 },
+ cancel: function() { this.drawingHole && (this.polygon.geometry.removeComponent(this.line.geometry), this.restoreFeature(!0)); return OpenLayers.Handler.Path.prototype.cancel.apply(this, arguments) }, restoreFeature: function(a) {
+ this.control.layer.events.unregister("sketchcomplete", this, this.finalizeInteriorRing); this.control.layer.events.unregister("sketchmodified", this, this.enforceTopology); this.layer.removeFeatures([this.polygon], { silent: !0 }); this.control.layer.addFeatures([this.polygon], { silent: !0 }); this.drawingHole =
+ !1; a || this.control.layer.events.triggerEvent("sketchcomplete", { feature: this.polygon })
+ }, destroyFeature: function(a) { OpenLayers.Handler.Path.prototype.destroyFeature.call(this, a); this.polygon = null }, drawFeature: function() { this.layer.drawFeature(this.polygon, this.style); this.layer.drawFeature(this.point, this.style) }, getSketch: function() { return this.polygon }, getGeometry: function() { var a = this.polygon && this.polygon.geometry; a && this.multi && (a = new OpenLayers.Geometry.MultiPolygon([a])); return a }, CLASS_NAME: "OpenLayers.Handler.Polygon"
+});
+OpenLayers.Control.EditingToolbar = OpenLayers.Class(OpenLayers.Control.Panel, {
+ citeCompliant: !1, initialize: function(a, b) {
+ OpenLayers.Control.Panel.prototype.initialize.apply(this, [b]); this.addControls([new OpenLayers.Control.Navigation]); var c = [new OpenLayers.Control.DrawFeature(a, OpenLayers.Handler.Point, { displayClass: "olControlDrawFeaturePoint", handlerOptions: { citeCompliant: this.citeCompliant } }), new OpenLayers.Control.DrawFeature(a, OpenLayers.Handler.Path, { displayClass: "olControlDrawFeaturePath", handlerOptions: { citeCompliant: this.citeCompliant } }),
+ new OpenLayers.Control.DrawFeature(a, OpenLayers.Handler.Polygon, { displayClass: "olControlDrawFeaturePolygon", handlerOptions: { citeCompliant: this.citeCompliant } })]; this.addControls(c)
+ }, draw: function() { var a = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments); null === this.defaultControl && (this.defaultControl = this.controls[0]); return a }, CLASS_NAME: "OpenLayers.Control.EditingToolbar"
+});
+OpenLayers.Strategy.BBOX = OpenLayers.Class(OpenLayers.Strategy, {
+ bounds: null, resolution: null, ratio: 2, resFactor: null, response: null, activate: function() { var a = OpenLayers.Strategy.prototype.activate.call(this); a && (this.layer.events.on({ moveend: this.update, refresh: this.update, visibilitychanged: this.update, scope: this }), this.update()); return a }, deactivate: function() {
+ var a = OpenLayers.Strategy.prototype.deactivate.call(this); a && this.layer.events.un({
+ moveend: this.update, refresh: this.update, visibilitychanged: this.update,
+ scope: this
+ }); return a
+ }, update: function(a) { var b = this.getMapBounds(); null !== b && (a && a.force || this.layer.visibility && this.layer.calculateInRange() && this.invalidBounds(b)) && (this.calculateBounds(b), this.resolution = this.layer.map.getResolution(), this.triggerRead(a)) }, getMapBounds: function() {
+ if (null === this.layer.map) return null; var a = this.layer.map.getExtent(); a && !this.layer.projection.equals(this.layer.map.getProjectionObject()) && (a = a.clone().transform(this.layer.map.getProjectionObject(), this.layer.projection));
+ return a
+ }, invalidBounds: function(a) { a || (a = this.getMapBounds()); a = !this.bounds || !this.bounds.containsBounds(a); !a && this.resFactor && (a = this.resolution / this.layer.map.getResolution(), a = a >= this.resFactor || a <= 1 / this.resFactor); return a }, calculateBounds: function(a) { a || (a = this.getMapBounds()); var b = a.getCenterLonLat(), c = a.getWidth() * this.ratio; a = a.getHeight() * this.ratio; this.bounds = new OpenLayers.Bounds(b.lon - c / 2, b.lat - a / 2, b.lon + c / 2, b.lat + a / 2) }, triggerRead: function(a) {
+ !this.response || a && !0 === a.noAbort ||
+ (this.layer.protocol.abort(this.response), this.layer.events.triggerEvent("loadend")); var b = { filter: this.createFilter() }; this.layer.events.triggerEvent("loadstart", b); this.response = this.layer.protocol.read(OpenLayers.Util.applyDefaults({ filter: b.filter, callback: this.merge, scope: this }, a))
+ }, createFilter: function() {
+ var a = new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.BBOX, value: this.bounds, projection: this.layer.projection }); this.layer.filter && (a = new OpenLayers.Filter.Logical({
+ type: OpenLayers.Filter.Logical.AND,
+ filters: [this.layer.filter, a]
+ })); return a
+ }, merge: function(a) { this.layer.destroyFeatures(); if (a.success()) { var b = a.features; if (b && 0 < b.length) { var c = this.layer.projection, d = this.layer.map.getProjectionObject(); if (!d.equals(c)) for (var e, f = 0, g = b.length; f < g; ++f)(e = b[f].geometry) && e.transform(c, d); this.layer.addFeatures(b) } } else this.bounds = null; this.response = null; this.layer.events.triggerEvent("loadend", { response: a }) }, CLASS_NAME: "OpenLayers.Strategy.BBOX"
+});
+OpenLayers.Layer.WorldWind = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ DEFAULT_PARAMS: {}, isBaseLayer: !0, lzd: null, zoomLevels: null, initialize: function(a, b, c, d, e, f) { this.lzd = c; this.zoomLevels = d; c = []; c.push(a, b, e, f); OpenLayers.Layer.Grid.prototype.initialize.apply(this, c); this.params = OpenLayers.Util.applyDefaults(this.params, this.DEFAULT_PARAMS) }, getZoom: function() { var a = this.map.getZoom(); this.map.getMaxExtent(); return a - Math.log(this.maxResolution / (this.lzd / 512)) / Math.log(2) }, getURL: function(a) {
+ a = this.adjustBounds(a);
+ var b = this.getZoom(), c = this.map.getMaxExtent(), d = this.lzd / Math.pow(2, this.getZoom()), e = Math.floor((a.left - c.left) / d); a = Math.floor((a.bottom - c.bottom) / d); return this.map.getResolution() <= this.lzd / 512 && this.getZoom() <= this.zoomLevels ? this.getFullRequestString({ L: b, X: e, Y: a }) : OpenLayers.Util.getImageLocation("blank.gif")
+ }, CLASS_NAME: "OpenLayers.Layer.WorldWind"
+});
+OpenLayers.Protocol.CSW = function(a) { a = OpenLayers.Util.applyDefaults(a, OpenLayers.Protocol.CSW.DEFAULTS); var b = OpenLayers.Protocol.CSW["v" + a.version.replace(/\./g, "_")]; if (!b) throw "Unsupported CSW version: " + a.version; return new b(a) }; OpenLayers.Protocol.CSW.DEFAULTS = { version: "2.0.2" };
+OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {
+ defaultVersion: "1.0.0", yx: { "urn:ogc:def:crs:EPSG::4326": !0 }, createLayer: function(a, b) {
+ if (!("layer" in b)) throw Error("Missing property 'layer' in configuration."); for (var c = a.contents, d, e = 0, f = c.layers.length; e < f; ++e)if (c.layers[e].identifier === b.layer) { d = c.layers[e]; break } if (!d) throw Error("Layer not found"); var g = b.format; !g && d.formats && d.formats.length && (g = d.formats[0]); var h; b.matrixSet ? h = c.tileMatrixSets[b.matrixSet] :
+ 1 <= d.tileMatrixSetLinks.length && (h = c.tileMatrixSets[d.tileMatrixSetLinks[0].tileMatrixSet]); if (!h) throw Error("matrixSet not found"); for (var k, e = 0, f = d.styles.length; e < f && (k = d.styles[e], !k.isDefault); ++e); c = b.requestEncoding; if (!c && (c = "KVP", a.operationsMetadata.GetTile.dcp.http)) { var l = a.operationsMetadata.GetTile.dcp.http; l.get[0].constraints && (l = l.get[0].constraints.GetEncoding.allowedValues, l.KVP || !l.REST && !l.RESTful || (c = "REST")) } var l = [], m = b.params || {}; delete b.params; for (var n = 0, p = d.dimensions.length; n <
+ p; n++) { var q = d.dimensions[n]; l.push(q.identifier); m.hasOwnProperty(q.identifier) || (m[q.identifier] = q["default"]) } var n = b.projection || h.supportedCRS.replace(/urn:ogc:def:crs:(\w+):(.*:)?(\w+)$/, "$1:$3"), p = b.units || ("EPSG:4326" === n ? "degrees" : "m"), q = [], r; for (r in h.matrixIds) h.matrixIds.hasOwnProperty(r) && q.push(2.8E-4 * h.matrixIds[r].scaleDenominator / OpenLayers.METERS_PER_INCH / OpenLayers.INCHES_PER_UNIT[p]); if ("REST" === c && d.resourceUrls) {
+ r = []; for (var f = 0, t = d.resourceUrls.length; f < t; ++f)e = d.resourceUrls[f],
+ e.format === g && "tile" === e.resourceType && r.push(e.template)
+ } else { t = a.operationsMetadata.GetTile.dcp.http.get; r = []; for (var u, e = 0, f = t.length; e < f; e++)u = t[e].constraints, (!u || u && u.GetEncoding.allowedValues[c]) && r.push(t[e].url) } return new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults(b, {
+ url: r, requestEncoding: c, name: d.title, style: k.identifier, format: g, matrixIds: h.matrixIds, matrixSet: h.identifier, projection: n, units: p, resolutions: !1 === b.isBaseLayer ? void 0 : q, serverResolutions: q, tileFullExtent: h.bounds,
+ dimensions: l, params: m
+ }))
+ }, CLASS_NAME: "OpenLayers.Format.WMTSCapabilities"
+});
+OpenLayers.Layer.Google.v3 = {
+ DEFAULTS: { sphericalMercator: !0, projection: "EPSG:900913" }, animationEnabled: !0, loadMapObject: function() {
+ this.type || (this.type = google.maps.MapTypeId.ROADMAP); var a, b = OpenLayers.Layer.Google.cache[this.map.id]; b ? (a = b.mapObject, ++b.count) : (a = this.map.getCenter(), b = document.createElement("div"), b.className = "olForeignContainer", b.style.width = "100%", b.style.height = "100%", a = new google.maps.Map(b, {
+ center: a ? new google.maps.LatLng(a.lat, a.lon) : new google.maps.LatLng(0, 0), zoom: this.map.getZoom() ||
+ 0, mapTypeId: this.type, disableDefaultUI: !0, keyboardShortcuts: !1, draggable: !1, disableDoubleClickZoom: !0, scrollwheel: !1, streetViewControl: !1
+ }), b = document.createElement("div"), b.style.width = "100%", b.style.height = "100%", a.controls[google.maps.ControlPosition.TOP_LEFT].push(b), b = { googleControl: b, mapObject: a, count: 1 }, OpenLayers.Layer.Google.cache[this.map.id] = b); this.mapObject = a; this.setGMapVisibility(this.visibility)
+ }, onMapResize: function() { this.visibility && google.maps.event.trigger(this.mapObject, "resize") },
+ setGMapVisibility: function(a) {
+ var b = OpenLayers.Layer.Google.cache[this.map.id], c = this.map; if (b) {
+ for (var d = this.type, e = c.layers, f, g = e.length - 1; 0 <= g; --g)if (f = e[g], f instanceof OpenLayers.Layer.Google && !0 === f.visibility && !0 === f.inRange) { d = f.type; a = !0; break } e = this.mapObject.getDiv(); if (!0 === a) {
+ if (e.parentNode !== c.div) if (b.rendered) c.div.appendChild(e), b.googleControl.appendChild(c.viewPortDiv), google.maps.event.trigger(this.mapObject, "resize"); else {
+ var h = this; google.maps.event.addListenerOnce(this.mapObject,
+ "tilesloaded", function() { b.rendered = !0; h.setGMapVisibility(h.getVisibility()); h.moveTo(h.map.getCenter()) })
+ } this.mapObject.setMapTypeId(d)
+ } else b.googleControl.hasChildNodes() && (c.div.appendChild(c.viewPortDiv), c.div.removeChild(e))
+ }
+ }, getMapContainer: function() { return this.mapObject.getDiv() }, getMapObjectBoundsFromOLBounds: function(a) {
+ var b = null; null != a && (b = this.sphericalMercator ? this.inverseMercator(a.bottom, a.left) : new OpenLayers.LonLat(a.bottom, a.left), a = this.sphericalMercator ? this.inverseMercator(a.top,
+ a.right) : new OpenLayers.LonLat(a.top, a.right), b = new google.maps.LatLngBounds(new google.maps.LatLng(b.lat, b.lon), new google.maps.LatLng(a.lat, a.lon))); return b
+ }, getMapObjectLonLatFromMapObjectPixel: function(a) {
+ var b = this.map.getSize(), c = this.getLongitudeFromMapObjectLonLat(this.mapObject.center), d = this.getLatitudeFromMapObjectLonLat(this.mapObject.center), e = this.map.getResolution(); a = new OpenLayers.LonLat(c + (a.x - b.w / 2) * e, d - (a.y - b.h / 2) * e); this.wrapDateLine && (a = a.wrapDateLine(this.maxExtent)); return this.getMapObjectLonLatFromLonLat(a.lon,
+ a.lat)
+ }, getMapObjectPixelFromMapObjectLonLat: function(a) { var b = this.getLongitudeFromMapObjectLonLat(a); a = this.getLatitudeFromMapObjectLonLat(a); var c = this.map.getResolution(), d = this.map.getExtent(); return this.getMapObjectPixelFromXY(1 / c * (b - d.left), 1 / c * (d.top - a)) }, setMapObjectCenter: function(a, b) {
+ if (!1 === this.animationEnabled && b != this.mapObject.zoom) { var c = this.getMapContainer(); google.maps.event.addListenerOnce(this.mapObject, "idle", function() { c.style.visibility = "" }); c.style.visibility = "hidden" } this.mapObject.setOptions({
+ center: a,
+ zoom: b
+ })
+ }, getMapObjectZoomFromMapObjectBounds: function(a) { return this.mapObject.getBoundsZoomLevel(a) }, getMapObjectLonLatFromLonLat: function(a, b) { var c; this.sphericalMercator ? (c = this.inverseMercator(a, b), c = new google.maps.LatLng(c.lat, c.lon)) : c = new google.maps.LatLng(b, a); return c }, getMapObjectPixelFromXY: function(a, b) { return new google.maps.Point(a, b) }
+};
+OpenLayers.Format.WPSDescribeProcess = OpenLayers.Class(OpenLayers.Format.XML, {
+ VERSION: "1.0.0", namespaces: { wps: "http://www.opengis.net/wps/1.0.0", ows: "http://www.opengis.net/ows/1.1", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, schemaLocation: "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd", defaultPrefix: "wps", regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this,
+ [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a, b); return b
+ }, readers: {
+ wps: {
+ ProcessDescriptions: function(a, b) { b.processDescriptions = {}; this.readChildNodes(a, b.processDescriptions) }, ProcessDescription: function(a, b) { var c = { processVersion: this.getAttributeNS(a, this.namespaces.wps, "processVersion"), statusSupported: "true" === a.getAttribute("statusSupported"), storeSupported: "true" === a.getAttribute("storeSupported") }; this.readChildNodes(a, c); b[c.identifier] = c }, DataInputs: function(a,
+ b) { b.dataInputs = []; this.readChildNodes(a, b.dataInputs) }, ProcessOutputs: function(a, b) { b.processOutputs = []; this.readChildNodes(a, b.processOutputs) }, Output: function(a, b) { var c = {}; this.readChildNodes(a, c); b.push(c) }, ComplexOutput: function(a, b) { b.complexOutput = {}; this.readChildNodes(a, b.complexOutput) }, LiteralOutput: function(a, b) { b.literalOutput = {}; this.readChildNodes(a, b.literalOutput) }, Input: function(a, b) {
+ var c = { maxOccurs: parseInt(a.getAttribute("maxOccurs")), minOccurs: parseInt(a.getAttribute("minOccurs")) };
+ this.readChildNodes(a, c); b.push(c)
+ }, BoundingBoxData: function(a, b) { b.boundingBoxData = {}; this.readChildNodes(a, b.boundingBoxData) }, CRS: function(a, b) { b.CRSs || (b.CRSs = {}); b.CRSs[this.getChildValue(a)] = !0 }, LiteralData: function(a, b) { b.literalData = {}; this.readChildNodes(a, b.literalData) }, ComplexData: function(a, b) { b.complexData = {}; this.readChildNodes(a, b.complexData) }, Default: function(a, b) { b["default"] = {}; this.readChildNodes(a, b["default"]) }, Supported: function(a, b) { b.supported = {}; this.readChildNodes(a, b.supported) },
+ Format: function(a, b) { var c = {}; this.readChildNodes(a, c); b.formats || (b.formats = {}); b.formats[c.mimeType] = !0 }, MimeType: function(a, b) { b.mimeType = this.getChildValue(a) }
+ }, ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+ }, CLASS_NAME: "OpenLayers.Format.WPSDescribeProcess"
+});
+OpenLayers.Format.WKT = OpenLayers.Class(OpenLayers.Format, {
+ initialize: function(a) { this.regExes = { typeStr: /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/, spaces: /\s+/, parenComma: /\)\s*,\s*\(/, doubleParenComma: /\)\s*\)\s*,\s*\(\s*\(/, trimParens: /^\s*\(?(.*?)\)?\s*$/ }; OpenLayers.Format.prototype.initialize.apply(this, [a]) }, read: function(a) {
+ var b, c; a = a.replace(/[\n\r]/g, " "); if (c = this.regExes.typeStr.exec(a)) if (a = c[1].toLowerCase(), c = c[2], this.parse[a] && (b = this.parse[a].apply(this, [c])), this.internalProjection && this.externalProjection) if (b &&
+ "OpenLayers.Feature.Vector" == b.CLASS_NAME) b.geometry.transform(this.externalProjection, this.internalProjection); else if (b && "geometrycollection" != a && "object" == typeof b) for (a = 0, c = b.length; a < c; a++)b[a].geometry.transform(this.externalProjection, this.internalProjection); return b
+ }, write: function(a) { var b, c; a.constructor == Array ? c = !0 : (a = [a], c = !1); var d = []; c && d.push("GEOMETRYCOLLECTION("); for (var e = 0, f = a.length; e < f; ++e)c && 0 < e && d.push(","), b = a[e].geometry, d.push(this.extractGeometry(b)); c && d.push(")"); return d.join("") },
+ extractGeometry: function(a) { var b = a.CLASS_NAME.split(".")[2].toLowerCase(); if (!this.extract[b]) return null; this.internalProjection && this.externalProjection && (a = a.clone(), a.transform(this.internalProjection, this.externalProjection)); return ("collection" == b ? "GEOMETRYCOLLECTION" : b.toUpperCase()) + "(" + this.extract[b].apply(this, [a]) + ")" }, extract: {
+ point: function(a) { return a.x + " " + a.y }, multipoint: function(a) {
+ for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push("(" + this.extract.point.apply(this, [a.components[c]]) +
+ ")"); return b.join(",")
+ }, linestring: function(a) { for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push(this.extract.point.apply(this, [a.components[c]])); return b.join(",") }, multilinestring: function(a) { for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push("(" + this.extract.linestring.apply(this, [a.components[c]]) + ")"); return b.join(",") }, polygon: function(a) { for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push("(" + this.extract.linestring.apply(this, [a.components[c]]) + ")"); return b.join(",") }, multipolygon: function(a) {
+ for (var b =
+ [], c = 0, d = a.components.length; c < d; ++c)b.push("(" + this.extract.polygon.apply(this, [a.components[c]]) + ")"); return b.join(",")
+ }, collection: function(a) { for (var b = [], c = 0, d = a.components.length; c < d; ++c)b.push(this.extractGeometry.apply(this, [a.components[c]])); return b.join(",") }
+ }, parse: {
+ point: function(a) { a = OpenLayers.String.trim(a).split(this.regExes.spaces); return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(a[0], a[1])) }, multipoint: function(a) {
+ for (var b = OpenLayers.String.trim(a).split(","),
+ c = [], d = 0, e = b.length; d < e; ++d)a = b[d].replace(this.regExes.trimParens, "$1"), c.push(this.parse.point.apply(this, [a]).geometry); return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPoint(c))
+ }, linestring: function(a) { a = OpenLayers.String.trim(a).split(","); for (var b = [], c = 0, d = a.length; c < d; ++c)b.push(this.parse.point.apply(this, [a[c]]).geometry); return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(b)) }, multilinestring: function(a) {
+ for (var b = OpenLayers.String.trim(a).split(this.regExes.parenComma),
+ c = [], d = 0, e = b.length; d < e; ++d)a = b[d].replace(this.regExes.trimParens, "$1"), c.push(this.parse.linestring.apply(this, [a]).geometry); return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiLineString(c))
+ }, polygon: function(a) { var b; a = OpenLayers.String.trim(a).split(this.regExes.parenComma); for (var c = [], d = 0, e = a.length; d < e; ++d)b = a[d].replace(this.regExes.trimParens, "$1"), b = this.parse.linestring.apply(this, [b]).geometry, b = new OpenLayers.Geometry.LinearRing(b.components), c.push(b); return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon(c)) },
+ multipolygon: function(a) { for (var b = OpenLayers.String.trim(a).split(this.regExes.doubleParenComma), c = [], d = 0, e = b.length; d < e; ++d)a = b[d].replace(this.regExes.trimParens, "$1"), c.push(this.parse.polygon.apply(this, [a]).geometry); return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPolygon(c)) }, geometrycollection: function(a) {
+ a = a.replace(/,\s*([A-Za-z])/g, "|$1"); a = OpenLayers.String.trim(a).split("|"); for (var b = [], c = 0, d = a.length; c < d; ++c)b.push(OpenLayers.Format.WKT.prototype.read.apply(this, [a[c]]));
+ return b
+ }
+ }, CLASS_NAME: "OpenLayers.Format.WKT"
+});
+OpenLayers.WPSProcess = OpenLayers.Class({
+ client: null, server: null, identifier: null, description: null, localWPS: "http://geoserver/wps", formats: null, chained: 0, executeCallbacks: null, initialize: function(a) { OpenLayers.Util.extend(this, a); this.executeCallbacks = []; this.formats = { "application/wkt": new OpenLayers.Format.WKT, "application/json": new OpenLayers.Format.GeoJSON } }, describe: function(a) {
+ a = a || {}; if (!this.description) this.client.describeProcess(this.server, this.identifier, function(b) {
+ this.description || this.parseDescription(b);
+ a.callback && a.callback.call(a.scope, this.description)
+ }, this); else if (a.callback) { var b = this.description; window.setTimeout(function() { a.callback.call(a.scope, b) }, 0) }
+ }, configure: function(a) { this.describe({ callback: function() { var b = this.description, c = a.inputs, d, e, f; e = 0; for (f = b.dataInputs.length; e < f; ++e)d = b.dataInputs[e], this.setInputData(d, c[d.identifier]); a.callback && a.callback.call(a.scope) }, scope: this }); return this }, execute: function(a) {
+ this.configure({
+ inputs: a.inputs, callback: function() {
+ var b = this,
+ c = this.getOutputIndex(b.description.processOutputs, a.output); b.setResponseForm({ outputIndex: c }); (function e() {
+ OpenLayers.Util.removeItem(b.executeCallbacks, e); 0 !== b.chained ? b.executeCallbacks.push(e) : OpenLayers.Request.POST({
+ url: b.client.servers[b.server].url, data: (new OpenLayers.Format.WPSExecute).write(b.description), success: function(e) {
+ var g = b.findMimeType(b.description.processOutputs[c].complexOutput.supported.formats); e = b.formats[g].read(e.responseText); e instanceof OpenLayers.Feature.Vector &&
+ (e = [e]); a.success && (g = {}, g[a.output || "result"] = e, a.success.call(a.scope, g))
+ }, scope: b
+ })
+ })()
+ }, scope: this
+ })
+ }, output: function(a) { return new OpenLayers.WPSProcess.ChainLink({ process: this, output: a }) }, parseDescription: function(a) { a = this.client.servers[this.server]; this.description = (new OpenLayers.Format.WPSDescribeProcess).read(a.processDescription[this.identifier]).processDescriptions[this.identifier] }, setInputData: function(a, b) {
+ delete a.data; delete a.reference; if (b instanceof OpenLayers.WPSProcess.ChainLink) ++this.chained,
+ a.reference = { method: "POST", href: b.process.server === this.server ? this.localWPS : this.client.servers[b.process.server].url }, b.process.describe({ callback: function() { --this.chained; this.chainProcess(a, b) }, scope: this }); else { a.data = {}; var c = a.complexData; c ? (c = this.findMimeType(c.supported.formats), a.data.complexData = { mimeType: c, value: this.formats[c].write(this.toFeatures(b)) }) : a.data.literalData = { value: b } }
+ }, setResponseForm: function(a) {
+ a = a || {}; var b = this.description.processOutputs[a.outputIndex || 0]; this.description.responseForm =
+ { rawDataOutput: { identifier: b.identifier, mimeType: this.findMimeType(b.complexOutput.supported.formats, a.supportedFormats) } }
+ }, getOutputIndex: function(a, b) { var c; if (b) for (var d = a.length - 1; 0 <= d; --d) { if (a[d].identifier === b) { c = d; break } } else c = 0; return c }, chainProcess: function(a, b) {
+ var c = this.getOutputIndex(b.process.description.processOutputs, b.output); a.reference.mimeType = this.findMimeType(a.complexData.supported.formats, b.process.description.processOutputs[c].complexOutput.supported.formats); var d = {};
+ d[a.reference.mimeType] = !0; b.process.setResponseForm({ outputIndex: c, supportedFormats: d }); for (a.reference.body = b.process.description; 0 < this.executeCallbacks.length;)this.executeCallbacks[0]()
+ }, toFeatures: function(a) { var b = OpenLayers.Util.isArray(a); b || (a = [a]); for (var c = Array(a.length), d, e = 0, f = a.length; e < f; ++e)d = a[e], c[e] = d instanceof OpenLayers.Feature.Vector ? d : new OpenLayers.Feature.Vector(d); return b ? c : c[0] }, findMimeType: function(a, b) { b = b || this.formats; for (var c in a) if (c in b) return c }, CLASS_NAME: "OpenLayers.WPSProcess"
+});
+OpenLayers.WPSProcess.ChainLink = OpenLayers.Class({ process: null, output: null, initialize: function(a) { OpenLayers.Util.extend(this, a) }, CLASS_NAME: "OpenLayers.WPSProcess.ChainLink" });
+OpenLayers.WPSClient = OpenLayers.Class({
+ servers: null, version: "1.0.0", lazy: !1, events: null, initialize: function(a) { OpenLayers.Util.extend(this, a); this.events = new OpenLayers.Events(this); this.servers = {}; for (var b in a.servers) this.servers[b] = "string" == typeof a.servers[b] ? { url: a.servers[b], version: this.version, processDescription: {} } : a.servers[b] }, execute: function(a) { this.getProcess(a.server, a.process).execute({ inputs: a.inputs, success: a.success, scope: a.scope }) }, getProcess: function(a, b) {
+ var c = new OpenLayers.WPSProcess({
+ client: this,
+ server: a, identifier: b
+ }); this.lazy || c.describe(); return c
+ }, describeProcess: function(a, b, c, d) {
+ var e = this.servers[a]; e.processDescription[b] ? window.setTimeout(function() { c.call(d, e.processDescription[b]) }, 0) : b in e.processDescription ? this.events.register("describeprocess", this, function g(a) { a.identifier === b && (this.events.unregister("describeprocess", this, g), c.call(d, a.raw)) }) : (e.processDescription[b] = null, OpenLayers.Request.GET({
+ url: e.url, params: {
+ SERVICE: "WPS", VERSION: e.version, REQUEST: "DescribeProcess",
+ IDENTIFIER: b
+ }, success: function(a) { e.processDescription[b] = a.responseText; this.events.triggerEvent("describeprocess", { identifier: b, raw: a.responseText }) }, scope: this
+ }))
+ }, destroy: function() { this.events.destroy(); this.servers = this.events = null }, CLASS_NAME: "OpenLayers.WPSClient"
+});
+OpenLayers.Format.CSWGetRecords.v2_0_2 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { csw: "http://www.opengis.net/cat/csw/2.0.2", dc: "http://purl.org/dc/elements/1.1/", dct: "http://purl.org/dc/terms/", gmd: "http://www.isotc211.org/2005/gmd", geonet: "http://www.fao.org/geonetwork", ogc: "http://www.opengis.net/ogc", ows: "http://www.opengis.net/ows", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, defaultPrefix: "csw", version: "2.0.2", schemaLocation: "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd",
+ requestId: null, resultType: null, outputFormat: null, outputSchema: null, startPosition: null, maxRecords: null, DistributedSearch: null, ResponseHandler: null, Query: null, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]) }, read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a, b); return b },
+ readers: {
+ csw: {
+ GetRecordsResponse: function(a, b) { b.records = []; this.readChildNodes(a, b); var c = this.getAttributeNS(a, "", "version"); "" != c && (b.version = c) }, RequestId: function(a, b) { b.RequestId = this.getChildValue(a) }, SearchStatus: function(a, b) { b.SearchStatus = {}; var c = this.getAttributeNS(a, "", "timestamp"); "" != c && (b.SearchStatus.timestamp = c) }, SearchResults: function(a, b) {
+ this.readChildNodes(a, b); for (var c = a.attributes, d = {}, e = 0, f = c.length; e < f; ++e)d[c[e].name] = "numberOfRecordsMatched" == c[e].name || "numberOfRecordsReturned" ==
+ c[e].name || "nextRecord" == c[e].name ? parseInt(c[e].nodeValue) : c[e].nodeValue; b.SearchResults = d
+ }, SummaryRecord: function(a, b) { var c = { type: "SummaryRecord" }; this.readChildNodes(a, c); b.records.push(c) }, BriefRecord: function(a, b) { var c = { type: "BriefRecord" }; this.readChildNodes(a, c); b.records.push(c) }, DCMIRecord: function(a, b) { var c = { type: "DCMIRecord" }; this.readChildNodes(a, c); b.records.push(c) }, Record: function(a, b) { var c = { type: "Record" }; this.readChildNodes(a, c); b.records.push(c) }, "*": function(a, b) {
+ var c = a.localName ||
+ a.nodeName.split(":").pop(); b[c] = this.getChildValue(a)
+ }
+ }, geonet: { info: function(a, b) { var c = {}; this.readChildNodes(a, c); b.gninfo = c } }, dc: { "*": function(a, b) { var c = a.localName || a.nodeName.split(":").pop(); OpenLayers.Util.isArray(b[c]) || (b[c] = []); for (var d = {}, e = a.attributes, f = 0, g = e.length; f < g; ++f)d[e[f].name] = e[f].nodeValue; d.value = this.getChildValue(a); "" != d.value && b[c].push(d) } }, dct: { "*": function(a, b) { var c = a.localName || a.nodeName.split(":").pop(); OpenLayers.Util.isArray(b[c]) || (b[c] = []); b[c].push(this.getChildValue(a)) } },
+ ows: OpenLayers.Util.applyDefaults({ BoundingBox: function(a, b) { b.bounds && (b.BoundingBox = [{ crs: b.projection, value: [b.bounds.left, b.bounds.bottom, b.bounds.right, b.bounds.top] }], delete b.projection, delete b.bounds); OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows.BoundingBox.apply(this, arguments) } }, OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows)
+ }, write: function(a) {
+ a = this.writeNode("csw:GetRecords", a); a.setAttribute("xmlns:gmd", this.namespaces.gmd); return OpenLayers.Format.XML.prototype.write.apply(this,
+ [a])
+ }, writers: {
+ csw: {
+ GetRecords: function(a) {
+ a || (a = {}); var b = this.createElementNSPlus("csw:GetRecords", { attributes: { service: "CSW", version: this.version, requestId: a.requestId || this.requestId, resultType: a.resultType || this.resultType, outputFormat: a.outputFormat || this.outputFormat, outputSchema: a.outputSchema || this.outputSchema, startPosition: a.startPosition || this.startPosition, maxRecords: a.maxRecords || this.maxRecords } }); (a.DistributedSearch || this.DistributedSearch) && this.writeNode("csw:DistributedSearch",
+ a.DistributedSearch || this.DistributedSearch, b); var c = a.ResponseHandler || this.ResponseHandler; if (OpenLayers.Util.isArray(c) && 0 < c.length) for (var d = 0, e = c.length; d < e; d++)this.writeNode("csw:ResponseHandler", c[d], b); this.writeNode("Query", a.Query || this.Query, b); return b
+ }, DistributedSearch: function(a) { return this.createElementNSPlus("csw:DistributedSearch", { attributes: { hopCount: a.hopCount } }) }, ResponseHandler: function(a) { return this.createElementNSPlus("csw:ResponseHandler", { value: a.value }) }, Query: function(a) {
+ a ||
+ (a = {}); var b = this.createElementNSPlus("csw:Query", { attributes: { typeNames: a.typeNames || "csw:Record" } }), c = a.ElementName; if (OpenLayers.Util.isArray(c) && 0 < c.length) for (var d = 0, e = c.length; d < e; d++)this.writeNode("csw:ElementName", c[d], b); else this.writeNode("csw:ElementSetName", a.ElementSetName || { value: "summary" }, b); a.Constraint && this.writeNode("csw:Constraint", a.Constraint, b); a.SortBy && this.writeNode("ogc:SortBy", a.SortBy, b); return b
+ }, ElementName: function(a) {
+ return this.createElementNSPlus("csw:ElementName",
+ { value: a.value })
+ }, ElementSetName: function(a) { return this.createElementNSPlus("csw:ElementSetName", { attributes: { typeNames: a.typeNames }, value: a.value }) }, Constraint: function(a) { var b = this.createElementNSPlus("csw:Constraint", { attributes: { version: a.version } }); if (a.Filter) { var c = new OpenLayers.Format.Filter({ version: a.version }); b.appendChild(c.write(a.Filter)) } else a.CqlText && (a = this.createElementNSPlus("CqlText", { value: a.CqlText.value }), b.appendChild(a)); return b }
+ }, ogc: OpenLayers.Format.Filter.v1_1_0.prototype.writers.ogc
+ },
+ CLASS_NAME: "OpenLayers.Format.CSWGetRecords.v2_0_2"
+});
+OpenLayers.Marker.Box = OpenLayers.Class(OpenLayers.Marker, {
+ bounds: null, div: null, initialize: function(a, b, c) { this.bounds = a; this.div = OpenLayers.Util.createDiv(); this.div.style.overflow = "hidden"; this.events = new OpenLayers.Events(this, this.div); this.setBorder(b, c) }, destroy: function() { this.div = this.bounds = null; OpenLayers.Marker.prototype.destroy.apply(this, arguments) }, setBorder: function(a, b) { a || (a = "red"); b || (b = 2); this.div.style.border = b + "px solid " + a }, draw: function(a, b) {
+ OpenLayers.Util.modifyDOMElement(this.div,
+ null, a, b); return this.div
+ }, onScreen: function() { var a = !1; this.map && (a = this.map.getExtent().containsBounds(this.bounds, !0, !0)); return a }, display: function(a) { this.div.style.display = a ? "" : "none" }, CLASS_NAME: "OpenLayers.Marker.Box"
+});
+OpenLayers.Format.Text = OpenLayers.Class(OpenLayers.Format, {
+ defaultStyle: null, extractStyles: !0, initialize: function(a) { a = a || {}; !1 !== a.extractStyles && (a.defaultStyle = { externalGraphic: OpenLayers.Util.getImageLocation("marker.png"), graphicWidth: 21, graphicHeight: 25, graphicXOffset: -10.5, graphicYOffset: -12.5 }); OpenLayers.Format.prototype.initialize.apply(this, [a]) }, read: function(a) {
+ a = a.split("\n"); for (var b, c = [], d = 0; d < a.length - 1; d++) {
+ var e = a[d].replace(/^\s*/, "").replace(/\s*$/, ""); if ("#" != e.charAt(0)) if (b) {
+ for (var e =
+ e.split("\t"), f = new OpenLayers.Geometry.Point(0, 0), g = {}, h = this.defaultStyle ? OpenLayers.Util.applyDefaults({}, this.defaultStyle) : null, k = !1, l = 0; l < e.length; l++)if (e[l]) if ("point" == b[l]) k = e[l].split(","), f.y = parseFloat(k[0]), f.x = parseFloat(k[1]), k = !0; else if ("lat" == b[l]) f.y = parseFloat(e[l]), k = !0; else if ("lon" == b[l]) f.x = parseFloat(e[l]), k = !0; else if ("title" == b[l]) g.title = e[l]; else if ("image" == b[l] || "icon" == b[l] && h) h.externalGraphic = e[l]; else if ("iconSize" == b[l] && h) {
+ var m = e[l].split(","); h.graphicWidth =
+ parseFloat(m[0]); h.graphicHeight = parseFloat(m[1])
+ } else "iconOffset" == b[l] && h ? (m = e[l].split(","), h.graphicXOffset = parseFloat(m[0]), h.graphicYOffset = parseFloat(m[1])) : "description" == b[l] ? g.description = e[l] : "overflow" == b[l] ? g.overflow = e[l] : g[b[l]] = e[l]; k && (this.internalProjection && this.externalProjection && f.transform(this.externalProjection, this.internalProjection), e = new OpenLayers.Feature.Vector(f, g, h), c.push(e))
+ } else b = e.split("\t")
+ } return c
+ }, CLASS_NAME: "OpenLayers.Format.Text"
+});
+OpenLayers.Layer.Text = OpenLayers.Class(OpenLayers.Layer.Markers, {
+ location: null, features: null, formatOptions: null, selectedFeature: null, initialize: function(a, b) { OpenLayers.Layer.Markers.prototype.initialize.apply(this, arguments); this.features = [] }, destroy: function() { OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments); this.clearFeatures(); this.features = null }, loadText: function() {
+ this.loaded || null == this.location || (this.events.triggerEvent("loadstart"), OpenLayers.Request.GET({
+ url: this.location,
+ success: this.parseData, failure: function(a) { this.events.triggerEvent("loadend") }, scope: this
+ }), this.loaded = !0)
+ }, moveTo: function(a, b, c) { OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments); this.visibility && !this.loaded && this.loadText() }, parseData: function(a) {
+ a = a.responseText; var b = {}; OpenLayers.Util.extend(b, this.formatOptions); this.map && !this.projection.equals(this.map.getProjectionObject()) && (b.externalProjection = this.projection, b.internalProjection = this.map.getProjectionObject()); a = (new OpenLayers.Format.Text(b)).read(a);
+ for (var b = 0, c = a.length; b < c; b++) {
+ var d = {}, e = a[b], f, g, h; f = new OpenLayers.LonLat(e.geometry.x, e.geometry.y); e.style.graphicWidth && e.style.graphicHeight && (g = new OpenLayers.Size(e.style.graphicWidth, e.style.graphicHeight)); void 0 !== e.style.graphicXOffset && void 0 !== e.style.graphicYOffset && (h = new OpenLayers.Pixel(e.style.graphicXOffset, e.style.graphicYOffset)); null != e.style.externalGraphic ? d.icon = new OpenLayers.Icon(e.style.externalGraphic, g, h) : (d.icon = OpenLayers.Marker.defaultIcon(), null != g && d.icon.setSize(g));
+ null != e.attributes.title && null != e.attributes.description && (d.popupContentHTML = "\x3ch2\x3e" + e.attributes.title + "\x3c/h2\x3e\x3cp\x3e" + e.attributes.description + "\x3c/p\x3e"); d.overflow = e.attributes.overflow || "auto"; d = new OpenLayers.Feature(this, f, d); this.features.push(d); f = d.createMarker(); null != e.attributes.title && null != e.attributes.description && f.events.register("click", d, this.markerClick); this.addMarker(f)
+ } this.events.triggerEvent("loadend")
+ }, markerClick: function(a) {
+ var b = this == this.layer.selectedFeature;
+ this.layer.selectedFeature = b ? null : this; for (var c = 0, d = this.layer.map.popups.length; c < d; c++)this.layer.map.removePopup(this.layer.map.popups[c]); b || this.layer.map.addPopup(this.createPopup()); OpenLayers.Event.stop(a)
+ }, clearFeatures: function() { if (null != this.features) for (; 0 < this.features.length;) { var a = this.features[0]; OpenLayers.Util.removeItem(this.features, a); a.destroy() } }, CLASS_NAME: "OpenLayers.Layer.Text"
+});
+OpenLayers.Handler.RegularPolygon = OpenLayers.Class(OpenLayers.Handler.Drag, {
+ sides: 4, radius: null, snapAngle: null, snapToggle: "shiftKey", layerOptions: null, persist: !1, irregular: !1, citeCompliant: !1, angle: null, fixedRadius: !1, feature: null, layer: null, origin: null, initialize: function(a, b, c) { c && c.layerOptions && c.layerOptions.styleMap || (this.style = OpenLayers.Util.extend(OpenLayers.Feature.Vector.style["default"], {})); OpenLayers.Handler.Drag.prototype.initialize.apply(this, [a, b, c]); this.options = c ? c : {} }, setOptions: function(a) {
+ OpenLayers.Util.extend(this.options,
+ a); OpenLayers.Util.extend(this, a)
+ }, activate: function() { var a = !1; OpenLayers.Handler.Drag.prototype.activate.apply(this, arguments) && (a = OpenLayers.Util.extend({ displayInLayerSwitcher: !1, calculateInRange: OpenLayers.Function.True, wrapDateLine: this.citeCompliant }, this.layerOptions), this.layer = new OpenLayers.Layer.Vector(this.CLASS_NAME, a), this.map.addLayer(this.layer), a = !0); return a }, deactivate: function() {
+ var a = !1; OpenLayers.Handler.Drag.prototype.deactivate.apply(this, arguments) && (this.dragging && this.cancel(),
+ null != this.layer.map && (this.layer.destroy(!1), this.feature && this.feature.destroy()), this.feature = this.layer = null, a = !0); return a
+ }, down: function(a) {
+ this.fixedRadius = !!this.radius; a = this.layer.getLonLatFromViewPortPx(a.xy); this.origin = new OpenLayers.Geometry.Point(a.lon, a.lat); if (!this.fixedRadius || this.irregular) this.radius = this.map.getResolution(); this.persist && this.clear(); this.feature = new OpenLayers.Feature.Vector; this.createGeometry(); this.callback("create", [this.origin, this.feature]); this.layer.addFeatures([this.feature],
+ { silent: !0 }); this.layer.drawFeature(this.feature, this.style)
+ }, move: function(a) {
+ var b = this.layer.getLonLatFromViewPortPx(a.xy), b = new OpenLayers.Geometry.Point(b.lon, b.lat); this.irregular ? (a = Math.sqrt(2) * Math.abs(b.y - this.origin.y) / 2, this.radius = Math.max(this.map.getResolution() / 2, a)) : this.fixedRadius ? this.origin = b : (this.calculateAngle(b, a), this.radius = Math.max(this.map.getResolution() / 2, b.distanceTo(this.origin))); this.modifyGeometry(); if (this.irregular) {
+ a = b.x - this.origin.x; var b = b.y - this.origin.y,
+ c; c = 0 == b ? a / (this.radius * Math.sqrt(2)) : a / b; this.feature.geometry.resize(1, this.origin, c); this.feature.geometry.move(a / 2, b / 2)
+ } this.layer.drawFeature(this.feature, this.style)
+ }, up: function(a) { this.finalize(); this.start == this.last && this.callback("done", [a.xy]) }, out: function(a) { this.finalize() }, createGeometry: function() {
+ this.angle = Math.PI * (1 / this.sides - .5); this.snapAngle && (this.angle += Math.PI / 180 * this.snapAngle); this.feature.geometry = OpenLayers.Geometry.Polygon.createRegularPolygon(this.origin, this.radius,
+ this.sides, this.snapAngle)
+ }, modifyGeometry: function() { var a, b, c = this.feature.geometry.components[0]; c.components.length != this.sides + 1 && (this.createGeometry(), c = this.feature.geometry.components[0]); for (var d = 0; d < this.sides; ++d)b = c.components[d], a = this.angle + 2 * d * Math.PI / this.sides, b.x = this.origin.x + this.radius * Math.cos(a), b.y = this.origin.y + this.radius * Math.sin(a), b.clearBounds() }, calculateAngle: function(a, b) {
+ var c = Math.atan2(a.y - this.origin.y, a.x - this.origin.x); if (this.snapAngle && this.snapToggle && !b[this.snapToggle]) {
+ var d =
+ Math.PI / 180 * this.snapAngle; this.angle = Math.round(c / d) * d
+ } else this.angle = c
+ }, cancel: function() { this.callback("cancel", null); this.finalize() }, finalize: function() { this.origin = null; this.radius = this.options.radius }, clear: function() { this.layer && (this.layer.renderer.clear(), this.layer.destroyFeatures()) }, callback: function(a, b) { this.callbacks[a] && this.callbacks[a].apply(this.control, [this.feature.geometry.clone()]); this.persist || "done" != a && "cancel" != a || this.clear() }, CLASS_NAME: "OpenLayers.Handler.RegularPolygon"
+});
+OpenLayers.Control.SLDSelect = OpenLayers.Class(OpenLayers.Control, {
+ clearOnDeactivate: !1, layers: null, callbacks: null, selectionSymbolizer: { Polygon: { fillColor: "#FF0000", stroke: !1 }, Line: { strokeColor: "#FF0000", strokeWidth: 2 }, Point: { graphicName: "square", fillColor: "#FF0000", pointRadius: 5 } }, layerOptions: null, sketchStyle: null, wfsCache: {}, layerCache: {}, initialize: function(a, b) {
+ OpenLayers.Control.prototype.initialize.apply(this, [b]); this.callbacks = OpenLayers.Util.extend({ done: this.select, click: this.select }, this.callbacks);
+ this.handlerOptions = this.handlerOptions || {}; this.layerOptions = OpenLayers.Util.applyDefaults(this.layerOptions, { displayInLayerSwitcher: !1, tileOptions: { maxGetUrlLength: 2048 } }); this.sketchStyle && (this.handlerOptions.layerOptions = OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions, { styleMap: new OpenLayers.StyleMap({ "default": this.sketchStyle }) })); this.handler = new a(this, this.callbacks, this.handlerOptions)
+ }, destroy: function() {
+ for (var a in this.layerCache) delete this.layerCache[a]; for (a in this.wfsCache) delete this.wfsCache[a];
+ OpenLayers.Control.prototype.destroy.apply(this, arguments)
+ }, coupleLayerVisiblity: function(a) { this.setVisibility(a.object.getVisibility()) }, createSelectionLayer: function(a) { var b; if (this.layerCache[a.id]) b = this.layerCache[a.id]; else { b = new OpenLayers.Layer.WMS(a.name, a.url, a.params, OpenLayers.Util.applyDefaults(this.layerOptions, a.getOptions())); this.layerCache[a.id] = b; if (!1 === this.layerOptions.displayInLayerSwitcher) a.events.on({ visibilitychanged: this.coupleLayerVisiblity, scope: b }); this.map.addLayer(b) } return b },
+ createSLD: function(a, b, c) {
+ for (var d = { version: "1.0.0", namedLayers: {} }, e = ("" + a.params.LAYERS).split(","), f = 0, g = e.length; f < g; f++) {
+ var h = e[f]; d.namedLayers[h] = { name: h, userStyles: [] }; var k = this.selectionSymbolizer, l = c[f]; 0 <= l.type.indexOf("Polygon") ? k = { Polygon: this.selectionSymbolizer.Polygon } : 0 <= l.type.indexOf("LineString") ? k = { Line: this.selectionSymbolizer.Line } : 0 <= l.type.indexOf("Point") && (k = { Point: this.selectionSymbolizer.Point }); d.namedLayers[h].userStyles.push({
+ name: "default", rules: [new OpenLayers.Rule({
+ symbolizer: k,
+ filter: b[f], maxScaleDenominator: a.options.minScale
+ })]
+ })
+ } return (new OpenLayers.Format.SLD({ srsName: this.map.getProjection() })).write(d)
+ }, parseDescribeLayer: function(a) {
+ var b = new OpenLayers.Format.WMSDescribeLayer, c = a.responseXML; c && c.documentElement || (c = a.responseText); a = b.read(c); for (var b = [], c = null, d = 0, e = a.length; d < e; d++)"WFS" == a[d].owsType && (b.push(a[d].typeName), c = a[d].owsURL); OpenLayers.Request.GET({
+ url: c, params: { SERVICE: "WFS", TYPENAME: b.toString(), REQUEST: "DescribeFeatureType", VERSION: "1.0.0" },
+ callback: function(a) { var b = new OpenLayers.Format.WFSDescribeFeatureType, c = a.responseXML; c && c.documentElement || (c = a.responseText); a = b.read(c); this.control.wfsCache[this.layer.id] = a; this.control._queue && this.control.applySelection() }, scope: this
+ })
+ }, getGeometryAttributes: function(a) {
+ var b = []; a = this.wfsCache[a.id]; for (var c = 0, d = a.featureTypes.length; c < d; c++)for (var e = a.featureTypes[c].properties, f = 0, g = e.length; f < g; f++) {
+ var h = e[f], k = h.type; (0 <= k.indexOf("LineString") || 0 <= k.indexOf("GeometryAssociationType") ||
+ 0 <= k.indexOf("GeometryPropertyType") || 0 <= k.indexOf("Point") || 0 <= k.indexOf("Polygon")) && b.push(h)
+ } return b
+ }, activate: function() { var a = OpenLayers.Control.prototype.activate.call(this); if (a) for (var b = 0, c = this.layers.length; b < c; b++) { var d = this.layers[b]; d && !this.wfsCache[d.id] && OpenLayers.Request.GET({ url: d.url, params: { SERVICE: "WMS", VERSION: d.params.VERSION, LAYERS: d.params.LAYERS, REQUEST: "DescribeLayer" }, callback: this.parseDescribeLayer, scope: { layer: d, control: this } }) } return a }, deactivate: function() {
+ var a =
+ OpenLayers.Control.prototype.deactivate.call(this); if (a) for (var b = 0, c = this.layers.length; b < c; b++) { var d = this.layers[b]; if (d && !0 === this.clearOnDeactivate) { var e = this.layerCache, f = e[d.id]; f && (d.events.un({ visibilitychanged: this.coupleLayerVisiblity, scope: f }), f.destroy(), delete e[d.id]) } } return a
+ }, setLayers: function(a) { this.active ? (this.deactivate(), this.layers = a, this.activate()) : this.layers = a }, createFilter: function(a, b) {
+ var c = null; this.handler instanceof OpenLayers.Handler.RegularPolygon ? c = !0 === this.handler.irregular ?
+ new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.BBOX, property: a.name, value: b.getBounds() }) : new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.INTERSECTS, property: a.name, value: b }) : this.handler instanceof OpenLayers.Handler.Polygon ? c = new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.INTERSECTS, property: a.name, value: b }) : this.handler instanceof OpenLayers.Handler.Path ? c = 0 <= a.type.indexOf("Point") ? new OpenLayers.Filter.Spatial({
+ type: OpenLayers.Filter.Spatial.DWITHIN,
+ property: a.name, distance: .01 * this.map.getExtent().getWidth(), distanceUnits: this.map.getUnits(), value: b
+ }) : new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.INTERSECTS, property: a.name, value: b }) : this.handler instanceof OpenLayers.Handler.Click && (c = 0 <= a.type.indexOf("Polygon") ? new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.INTERSECTS, property: a.name, value: b }) : new OpenLayers.Filter.Spatial({
+ type: OpenLayers.Filter.Spatial.DWITHIN, property: a.name, distance: .01 * this.map.getExtent().getWidth(),
+ distanceUnits: this.map.getUnits(), value: b
+ })); return c
+ }, select: function(a) {
+ this._queue = function() {
+ for (var b = 0, c = this.layers.length; b < c; b++) {
+ for (var d = this.layers[b], e = this.getGeometryAttributes(d), f = [], g = 0, h = e.length; g < h; g++) { var k = e[g]; if (null !== k) { if (!(a instanceof OpenLayers.Geometry)) { var l = this.map.getLonLatFromPixel(a.xy); a = new OpenLayers.Geometry.Point(l.lon, l.lat) } k = this.createFilter(k, a); null !== k && f.push(k) } } g = this.createSelectionLayer(d); this.events.triggerEvent("selected", { layer: d, filters: f });
+ d = this.createSLD(d, f, e); g.mergeNewParams({ SLD_BODY: d }); delete this._queue
+ }
+ }; this.applySelection()
+ }, applySelection: function() { for (var a = !0, b = 0, c = this.layers.length; b < c; b++)if (!this.wfsCache[this.layers[b].id]) { a = !1; break } a && this._queue.call(this) }, CLASS_NAME: "OpenLayers.Control.SLDSelect"
+});
+OpenLayers.Control.Scale = OpenLayers.Class(OpenLayers.Control, {
+ element: null, geodesic: !1, initialize: function(a, b) { OpenLayers.Control.prototype.initialize.apply(this, [b]); this.element = OpenLayers.Util.getElement(a) }, draw: function() { OpenLayers.Control.prototype.draw.apply(this, arguments); this.element || (this.element = document.createElement("div"), this.div.appendChild(this.element)); this.map.events.register("moveend", this, this.updateScale); this.updateScale(); return this.div }, updateScale: function() {
+ var a;
+ if (!0 === this.geodesic) { if (!this.map.getUnits()) return; a = OpenLayers.INCHES_PER_UNIT; a = (this.map.getGeodesicPixelSize().w || 1E-6) * a.km * OpenLayers.DOTS_PER_INCH } else a = this.map.getScale(); a && (a = 9500 <= a && 95E4 >= a ? Math.round(a / 1E3) + "K" : 95E4 <= a ? Math.round(a / 1E6) + "M" : Math.round(a), this.element.innerHTML = OpenLayers.i18n("Scale \x3d 1 : ${scaleDenom}", { scaleDenom: a }))
+ }, CLASS_NAME: "OpenLayers.Control.Scale"
+});
+OpenLayers.Layer.MapGuide = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ isBaseLayer: !0, useHttpTile: !1, singleTile: !1, useOverlay: !1, useAsyncOverlay: !0, TILE_PARAMS: { operation: "GETTILEIMAGE", version: "1.2.0" }, SINGLE_TILE_PARAMS: { operation: "GETMAPIMAGE", format: "PNG", locale: "en", clip: "1", version: "1.0.0" }, OVERLAY_PARAMS: { operation: "GETDYNAMICMAPOVERLAYIMAGE", format: "PNG", locale: "en", clip: "1", version: "2.0.0" }, FOLDER_PARAMS: { tileColumnsPerFolder: 30, tileRowsPerFolder: 30, format: "png", querystring: null }, defaultSize: new OpenLayers.Size(300,
+ 300), tileOriginCorner: "tl", initialize: function(a, b, c, d) {
+ OpenLayers.Layer.Grid.prototype.initialize.apply(this, arguments); if (null == d || null == d.isBaseLayer) this.isBaseLayer = "true" != this.transparent && 1 != this.transparent; d && null != d.useOverlay && (this.useOverlay = d.useOverlay); this.singleTile ? this.useOverlay ? (OpenLayers.Util.applyDefaults(this.params, this.OVERLAY_PARAMS), this.useAsyncOverlay || (this.params.version = "1.0.0")) : OpenLayers.Util.applyDefaults(this.params, this.SINGLE_TILE_PARAMS) : (this.useHttpTile ?
+ OpenLayers.Util.applyDefaults(this.params, this.FOLDER_PARAMS) : OpenLayers.Util.applyDefaults(this.params, this.TILE_PARAMS), this.setTileSize(this.defaultSize))
+ }, clone: function(a) { null == a && (a = new OpenLayers.Layer.MapGuide(this.name, this.url, this.params, this.getOptions())); return OpenLayers.Layer.Grid.prototype.clone.apply(this, [a]) }, getURL: function(a) {
+ var b; b = a.getCenterLonLat(); var c = this.map.getSize(); this.singleTile ? (a = {
+ setdisplaydpi: OpenLayers.DOTS_PER_INCH, setdisplayheight: c.h * this.ratio, setdisplaywidth: c.w *
+ this.ratio, setviewcenterx: b.lon, setviewcentery: b.lat, setviewscale: this.map.getScale()
+ }, this.useOverlay && !this.useAsyncOverlay && (b = {}, b = OpenLayers.Util.extend(b, a), b.operation = "GETVISIBLEMAPEXTENT", b.version = "1.0.0", b.session = this.params.session, b.mapName = this.params.mapName, b.format = "text/xml", b = this.getFullRequestString(b), OpenLayers.Request.GET({ url: b, async: !1 })), b = this.getFullRequestString(a)) : (c = this.map.getResolution(), b = Math.floor((a.left - this.maxExtent.left) / c), b = Math.round(b / this.tileSize.w),
+ a = Math.floor((this.maxExtent.top - a.top) / c), a = Math.round(a / this.tileSize.h), b = this.useHttpTile ? this.getImageFilePath({ tilecol: b, tilerow: a, scaleindex: this.resolutions.length - this.map.zoom - 1 }) : this.getFullRequestString({ tilecol: b, tilerow: a, scaleindex: this.resolutions.length - this.map.zoom - 1 })); return b
+ }, getFullRequestString: function(a, b) {
+ var c = null == b ? this.url : b; "object" == typeof c && (c = c[Math.floor(Math.random() * c.length)]); var d = c, e = OpenLayers.Util.extend({}, this.params), e = OpenLayers.Util.extend(e, a),
+ f = OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(c)), g; for (g in e) g.toUpperCase() in f && delete e[g]; e = OpenLayers.Util.getParameterString(e); e = e.replace(/,/g, "+"); "" != e && (f = c.charAt(c.length - 1), d = "\x26" == f || "?" == f ? d + e : -1 == c.indexOf("?") ? d + ("?" + e) : d + ("\x26" + e)); return d
+ }, getImageFilePath: function(a, b) {
+ var c = null == b ? this.url : b; "object" == typeof c && (c = c[Math.floor(Math.random() * c.length)]); var d = "", e = ""; 0 > a.tilerow && (d = "-"); d = 0 == a.tilerow ? d + "0" : d + Math.floor(Math.abs(a.tilerow / this.params.tileRowsPerFolder)) *
+ this.params.tileRowsPerFolder; 0 > a.tilecol && (e = "-"); e = 0 == a.tilecol ? e + "0" : e + Math.floor(Math.abs(a.tilecol / this.params.tileColumnsPerFolder)) * this.params.tileColumnsPerFolder; d = "/S" + Math.floor(a.scaleindex) + "/" + this.params.basemaplayergroupname + "/R" + d + "/C" + e + "/" + a.tilerow % this.params.tileRowsPerFolder + "_" + a.tilecol % this.params.tileColumnsPerFolder + "." + this.params.format; this.params.querystring && (d += "?" + this.params.querystring); return c + d
+ }, CLASS_NAME: "OpenLayers.Layer.MapGuide"
+});
+OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
+ callbacks: null, displaySystem: "metric", geodesic: !1, displaySystemUnits: { geographic: ["dd"], english: ["mi", "ft", "in"], metric: ["km", "m"] }, partialDelay: 300, delayedTrigger: null, persist: !1, immediate: !1, initialize: function(a, b) {
+ OpenLayers.Control.prototype.initialize.apply(this, [b]); var c = { done: this.measureComplete, point: this.measurePartial }; this.immediate && (c.modify = this.measureImmediate); this.callbacks = OpenLayers.Util.extend(c, this.callbacks);
+ this.handlerOptions = OpenLayers.Util.extend({ persist: this.persist }, this.handlerOptions); this.handler = new a(this, this.callbacks, this.handlerOptions)
+ }, deactivate: function() { this.cancelDelay(); return OpenLayers.Control.prototype.deactivate.apply(this, arguments) }, cancel: function() { this.cancelDelay(); this.handler.cancel() }, setImmediate: function(a) { (this.immediate = a) ? this.callbacks.modify = this.measureImmediate : delete this.callbacks.modify }, updateHandler: function(a, b) {
+ var c = this.active; c && this.deactivate();
+ this.handler = new a(this, this.callbacks, b); c && this.activate()
+ }, measureComplete: function(a) { this.cancelDelay(); this.measure(a, "measure") }, measurePartial: function(a, b) { this.cancelDelay(); b = b.clone(); this.handler.freehandMode(this.handler.evt) ? this.measure(b, "measurepartial") : this.delayedTrigger = window.setTimeout(OpenLayers.Function.bind(function() { this.delayedTrigger = null; this.measure(b, "measurepartial") }, this), this.partialDelay) }, measureImmediate: function(a, b, c) {
+ c && !this.handler.freehandMode(this.handler.evt) &&
+ (this.cancelDelay(), this.measure(b.geometry, "measurepartial"))
+ }, cancelDelay: function() { null !== this.delayedTrigger && (window.clearTimeout(this.delayedTrigger), this.delayedTrigger = null) }, measure: function(a, b) { var c, d; -1 < a.CLASS_NAME.indexOf("LineString") ? (c = this.getBestLength(a), d = 1) : (c = this.getBestArea(a), d = 2); this.events.triggerEvent(b, { measure: c[0], units: c[1], order: d, geometry: a }) }, getBestArea: function(a) {
+ for (var b = this.displaySystemUnits[this.displaySystem], c, d, e = 0, f = b.length; e < f && !(c = b[e], d = this.getArea(a,
+ c), 1 < d); ++e); return [d, c]
+ }, getArea: function(a, b) { var c, d; this.geodesic ? (c = a.getGeodesicArea(this.map.getProjectionObject()), d = "m") : (c = a.getArea(), d = this.map.getUnits()); var e = OpenLayers.INCHES_PER_UNIT[b]; e && (c *= Math.pow(OpenLayers.INCHES_PER_UNIT[d] / e, 2)); return c }, getBestLength: function(a) { for (var b = this.displaySystemUnits[this.displaySystem], c, d, e = 0, f = b.length; e < f && !(c = b[e], d = this.getLength(a, c), 1 < d); ++e); return [d, c] }, getLength: function(a, b) {
+ var c, d; this.geodesic ? (c = a.getGeodesicLength(this.map.getProjectionObject()),
+ d = "m") : (c = a.getLength(), d = this.map.getUnits()); var e = OpenLayers.INCHES_PER_UNIT[b]; e && (c *= OpenLayers.INCHES_PER_UNIT[d] / e); return c
+ }, CLASS_NAME: "OpenLayers.Control.Measure"
+});
+OpenLayers.Format.WMC.v1_0_0 = OpenLayers.Class(OpenLayers.Format.WMC.v1, {
+ VERSION: "1.0.0", schemaLocation: "http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd", initialize: function(a) { OpenLayers.Format.WMC.v1.prototype.initialize.apply(this, [a]) }, read_wmc_SRS: function(a, b) { var c = this.getChildValue(b); "object" != typeof a.projections && (a.projections = {}); for (var c = c.split(/ +/), d = 0, e = c.length; d < e; d++)a.projections[c[d]] = !0 }, write_wmc_Layer: function(a) {
+ var b = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(this,
+ [a]); if (a.srs) { var c = [], d; for (d in a.srs) c.push(d); b.appendChild(this.createElementDefaultNS("SRS", c.join(" "))) } b.appendChild(this.write_wmc_FormatList(a)); b.appendChild(this.write_wmc_StyleList(a)); a.dimensions && b.appendChild(this.write_wmc_DimensionList(a)); b.appendChild(this.write_wmc_LayerExtension(a))
+ }, CLASS_NAME: "OpenLayers.Format.WMC.v1_0_0"
+});
+OpenLayers.Popup.Anchored = OpenLayers.Class(OpenLayers.Popup, {
+ relativePosition: null, keepInMap: !0, anchor: null, initialize: function(a, b, c, d, e, f, g) { OpenLayers.Popup.prototype.initialize.apply(this, [a, b, c, d, f, g]); this.anchor = null != e ? e : { size: new OpenLayers.Size(0, 0), offset: new OpenLayers.Pixel(0, 0) } }, destroy: function() { this.relativePosition = this.anchor = null; OpenLayers.Popup.prototype.destroy.apply(this, arguments) }, show: function() { this.updatePosition(); OpenLayers.Popup.prototype.show.apply(this, arguments) },
+ moveTo: function(a) { var b = this.relativePosition; this.relativePosition = this.calculateRelativePosition(a); OpenLayers.Popup.prototype.moveTo.call(this, this.calculateNewPx(a)); this.relativePosition != b && this.updateRelativePosition() }, setSize: function(a) { OpenLayers.Popup.prototype.setSize.apply(this, arguments); if (this.lonlat && this.map) { var b = this.map.getLayerPxFromLonLat(this.lonlat); this.moveTo(b) } }, calculateRelativePosition: function(a) {
+ a = this.map.getLonLatFromLayerPx(a); a = this.map.getExtent().determineQuadrant(a);
+ return OpenLayers.Bounds.oppositeQuadrant(a)
+ }, updateRelativePosition: function() { }, calculateNewPx: function(a) { a = a.offset(this.anchor.offset); var b = this.size || this.contentSize, c = "t" == this.relativePosition.charAt(0); a.y += c ? -b.h : this.anchor.size.h; c = "l" == this.relativePosition.charAt(1); a.x += c ? -b.w : this.anchor.size.w; return a }, CLASS_NAME: "OpenLayers.Popup.Anchored"
+});
+OpenLayers.Popup.Framed = OpenLayers.Class(OpenLayers.Popup.Anchored, {
+ imageSrc: null, imageSize: null, isAlphaImage: !1, positionBlocks: null, blocks: null, fixedRelativePosition: !1, initialize: function(a, b, c, d, e, f, g) {
+ OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments); this.fixedRelativePosition && (this.updateRelativePosition(), this.calculateRelativePosition = function(a) { return this.relativePosition }); this.contentDiv.style.position = "absolute"; this.contentDiv.style.zIndex = 1; f && (this.closeDiv.style.zIndex =
+ 1); this.groupDiv.style.position = "absolute"; this.groupDiv.style.top = "0px"; this.groupDiv.style.left = "0px"; this.groupDiv.style.height = "100%"; this.groupDiv.style.width = "100%"
+ }, destroy: function() {
+ this.isAlphaImage = this.imageSize = this.imageSrc = null; this.fixedRelativePosition = !1; this.positionBlocks = null; for (var a = 0; a < this.blocks.length; a++) { var b = this.blocks[a]; b.image && b.div.removeChild(b.image); b.image = null; b.div && this.groupDiv.removeChild(b.div); b.div = null } this.blocks = null; OpenLayers.Popup.Anchored.prototype.destroy.apply(this,
+ arguments)
+ }, setBackgroundColor: function(a) { }, setBorder: function() { }, setOpacity: function(a) { }, setSize: function(a) { OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments); this.updateBlocks() }, updateRelativePosition: function() { this.padding = this.positionBlocks[this.relativePosition].padding; if (this.closeDiv) { var a = this.getContentDivPadding(); this.closeDiv.style.right = a.right + this.padding.right + "px"; this.closeDiv.style.top = a.top + this.padding.top + "px" } this.updateBlocks() }, calculateNewPx: function(a) {
+ return OpenLayers.Popup.Anchored.prototype.calculateNewPx.apply(this,
+ arguments).offset(this.positionBlocks[this.relativePosition].offset)
+ }, createBlocks: function() {
+ this.blocks = []; var a = null, b; for (b in this.positionBlocks) { a = b; break } a = this.positionBlocks[a]; for (b = 0; b < a.blocks.length; b++) {
+ var c = {}; this.blocks.push(c); c.div = OpenLayers.Util.createDiv(this.id + "_FrameDecorationDiv_" + b, null, null, null, "absolute", null, "hidden", null); c.image = (this.isAlphaImage ? OpenLayers.Util.createAlphaImageDiv : OpenLayers.Util.createImage)(this.id + "_FrameDecorationImg_" + b, null, this.imageSize,
+ this.imageSrc, "absolute", null, null, null); c.div.appendChild(c.image); this.groupDiv.appendChild(c.div)
+ }
+ }, updateBlocks: function() {
+ this.blocks || this.createBlocks(); if (this.size && this.relativePosition) {
+ for (var a = this.positionBlocks[this.relativePosition], b = 0; b < a.blocks.length; b++) {
+ var c = a.blocks[b], d = this.blocks[b], e = c.anchor.left, f = c.anchor.bottom, g = c.anchor.right, h = c.anchor.top, k = isNaN(c.size.w) ? this.size.w - (g + e) : c.size.w, l = isNaN(c.size.h) ? this.size.h - (f + h) : c.size.h; d.div.style.width = (0 > k ? 0 : k) + "px";
+ d.div.style.height = (0 > l ? 0 : l) + "px"; d.div.style.left = null != e ? e + "px" : ""; d.div.style.bottom = null != f ? f + "px" : ""; d.div.style.right = null != g ? g + "px" : ""; d.div.style.top = null != h ? h + "px" : ""; d.image.style.left = c.position.x + "px"; d.image.style.top = c.position.y + "px"
+ } this.contentDiv.style.left = this.padding.left + "px"; this.contentDiv.style.top = this.padding.top + "px"
+ }
+ }, CLASS_NAME: "OpenLayers.Popup.Framed"
+});
+OpenLayers.Popup.FramedCloud = OpenLayers.Class(OpenLayers.Popup.Framed, {
+ contentDisplayClass: "olFramedCloudPopupContent", autoSize: !0, panMapIfOutOfView: !0, imageSize: new OpenLayers.Size(1276, 736), isAlphaImage: !1, fixedRelativePosition: !1, positionBlocks: {
+ tl: {
+ offset: new OpenLayers.Pixel(44, 0), padding: new OpenLayers.Bounds(8, 40, 8, 9), blocks: [{ size: new OpenLayers.Size("auto", "auto"), anchor: new OpenLayers.Bounds(0, 51, 22, 0), position: new OpenLayers.Pixel(0, 0) }, {
+ size: new OpenLayers.Size(22, "auto"), anchor: new OpenLayers.Bounds(null,
+ 50, 0, 0), position: new OpenLayers.Pixel(-1238, 0)
+ }, { size: new OpenLayers.Size("auto", 19), anchor: new OpenLayers.Bounds(0, 32, 22, null), position: new OpenLayers.Pixel(0, -631) }, { size: new OpenLayers.Size(22, 18), anchor: new OpenLayers.Bounds(null, 32, 0, null), position: new OpenLayers.Pixel(-1238, -632) }, { size: new OpenLayers.Size(81, 35), anchor: new OpenLayers.Bounds(null, 0, 0, null), position: new OpenLayers.Pixel(0, -688) }]
+ }, tr: {
+ offset: new OpenLayers.Pixel(-45, 0), padding: new OpenLayers.Bounds(8, 40, 8, 9), blocks: [{
+ size: new OpenLayers.Size("auto",
+ "auto"), anchor: new OpenLayers.Bounds(0, 51, 22, 0), position: new OpenLayers.Pixel(0, 0)
+ }, { size: new OpenLayers.Size(22, "auto"), anchor: new OpenLayers.Bounds(null, 50, 0, 0), position: new OpenLayers.Pixel(-1238, 0) }, { size: new OpenLayers.Size("auto", 19), anchor: new OpenLayers.Bounds(0, 32, 22, null), position: new OpenLayers.Pixel(0, -631) }, { size: new OpenLayers.Size(22, 19), anchor: new OpenLayers.Bounds(null, 32, 0, null), position: new OpenLayers.Pixel(-1238, -631) }, {
+ size: new OpenLayers.Size(81, 35), anchor: new OpenLayers.Bounds(0,
+ 0, null, null), position: new OpenLayers.Pixel(-215, -687)
+ }]
+ }, bl: {
+ offset: new OpenLayers.Pixel(45, 0), padding: new OpenLayers.Bounds(8, 9, 8, 40), blocks: [{ size: new OpenLayers.Size("auto", "auto"), anchor: new OpenLayers.Bounds(0, 21, 22, 32), position: new OpenLayers.Pixel(0, 0) }, { size: new OpenLayers.Size(22, "auto"), anchor: new OpenLayers.Bounds(null, 21, 0, 32), position: new OpenLayers.Pixel(-1238, 0) }, { size: new OpenLayers.Size("auto", 21), anchor: new OpenLayers.Bounds(0, 0, 22, null), position: new OpenLayers.Pixel(0, -629) }, {
+ size: new OpenLayers.Size(22,
+ 21), anchor: new OpenLayers.Bounds(null, 0, 0, null), position: new OpenLayers.Pixel(-1238, -629)
+ }, { size: new OpenLayers.Size(81, 33), anchor: new OpenLayers.Bounds(null, null, 0, 0), position: new OpenLayers.Pixel(-101, -674) }]
+ }, br: {
+ offset: new OpenLayers.Pixel(-44, 0), padding: new OpenLayers.Bounds(8, 9, 8, 40), blocks: [{ size: new OpenLayers.Size("auto", "auto"), anchor: new OpenLayers.Bounds(0, 21, 22, 32), position: new OpenLayers.Pixel(0, 0) }, {
+ size: new OpenLayers.Size(22, "auto"), anchor: new OpenLayers.Bounds(null, 21, 0, 32), position: new OpenLayers.Pixel(-1238,
+ 0)
+ }, { size: new OpenLayers.Size("auto", 21), anchor: new OpenLayers.Bounds(0, 0, 22, null), position: new OpenLayers.Pixel(0, -629) }, { size: new OpenLayers.Size(22, 21), anchor: new OpenLayers.Bounds(null, 0, 0, null), position: new OpenLayers.Pixel(-1238, -629) }, { size: new OpenLayers.Size(81, 33), anchor: new OpenLayers.Bounds(0, null, null, 0), position: new OpenLayers.Pixel(-311, -674) }]
+ }
+ }, minSize: new OpenLayers.Size(105, 10), maxSize: new OpenLayers.Size(1200, 660), initialize: function(a, b, c, d, e, f, g) {
+ this.imageSrc = OpenLayers.Util.getImageLocation("cloud-popup-relative.png");
+ OpenLayers.Popup.Framed.prototype.initialize.apply(this, arguments); this.contentDiv.className = this.contentDisplayClass
+ }, CLASS_NAME: "OpenLayers.Popup.FramedCloud"
+});
+OpenLayers.Tile.Image.IFrame = {
+ useIFrame: null, blankImageUrl: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAQAIBRAA7", draw: function() {
+ if (OpenLayers.Tile.Image.prototype.shouldDraw.call(this)) {
+ var a = this.layer.getURL(this.bounds), b = this.useIFrame; this.useIFrame = null !== this.maxGetUrlLength && !this.layer.async && a.length > this.maxGetUrlLength; a = b && !this.useIFrame; b = !b && this.useIFrame; if (a || b) this.imgDiv && this.imgDiv.parentNode === this.frame && this.frame.removeChild(this.imgDiv), this.imgDiv =
+ null, a && this.frame.removeChild(this.frame.firstChild)
+ } return OpenLayers.Tile.Image.prototype.draw.apply(this, arguments)
+ }, getImage: function() {
+ if (!0 === this.useIFrame) {
+ if (!this.frame.childNodes.length) { var a = document.createElement("div"), b = a.style; b.position = "absolute"; b.width = "100%"; b.height = "100%"; b.zIndex = 1; b.backgroundImage = "url(" + this.blankImageUrl + ")"; this.frame.appendChild(a) } a = this.id + "_iFrame"; 9 > parseFloat(navigator.appVersion.split("MSIE")[1]) ? (b = document.createElement('\x3ciframe name\x3d"' +
+ a + '"\x3e'), b.style.backgroundColor = "#FFFFFF", b.style.filter = "chroma(color\x3d#FFFFFF)") : (b = document.createElement("iframe"), b.style.backgroundColor = "transparent", b.name = a); b.scrolling = "no"; b.marginWidth = "0px"; b.marginHeight = "0px"; b.frameBorder = "0"; b.style.position = "absolute"; b.style.width = "100%"; b.style.height = "100%"; 1 > this.layer.opacity && OpenLayers.Util.modifyDOMElement(b, null, null, null, null, null, null, this.layer.opacity); this.frame.appendChild(b); return this.imgDiv = b
+ } return OpenLayers.Tile.Image.prototype.getImage.apply(this,
+ arguments)
+ }, createRequestForm: function() { var a = document.createElement("form"); a.method = "POST"; var b = this.layer.params._OLSALT, b = (b ? b + "_" : "") + this.bounds.toBBOX(); a.action = OpenLayers.Util.urlAppend(this.layer.url, b); a.target = this.id + "_iFrame"; this.layer.getImageSize(); var b = OpenLayers.Util.getParameters(this.url), c, d; for (d in b) c = document.createElement("input"), c.type = "hidden", c.name = d, c.value = b[d], a.appendChild(c); return a }, setImgSrc: function(a) {
+ if (!0 === this.useIFrame) if (a) {
+ var b = this.createRequestForm();
+ this.frame.appendChild(b); b.submit(); this.frame.removeChild(b)
+ } else this.imgDiv.parentNode === this.frame && (this.frame.removeChild(this.imgDiv), this.imgDiv = null); else OpenLayers.Tile.Image.prototype.setImgSrc.apply(this, arguments)
+ }, onImageLoad: function() { OpenLayers.Tile.Image.prototype.onImageLoad.apply(this, arguments); !0 === this.useIFrame && (this.imgDiv.style.opacity = 1, this.frame.style.opacity = this.layer.opacity) }, createBackBuffer: function() {
+ var a; !1 === this.useIFrame && (a = OpenLayers.Tile.Image.prototype.createBackBuffer.call(this));
+ return a
+ }
+}; OpenLayers.Format.SOSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.0.0", CLASS_NAME: "OpenLayers.Format.SOSCapabilities" });
+OpenLayers.Format.SOSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.SOSCapabilities, {
+ namespaces: { ows: "http://www.opengis.net/ows/1.1", sos: "http://www.opengis.net/sos/1.0", gml: "http://www.opengis.net/gml", xlink: "http://www.w3.org/1999/xlink" }, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]); this.options = a }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this,
+ [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a, b); return b
+ }, readers: {
+ gml: OpenLayers.Util.applyDefaults({ name: function(a, b) { b.name = this.getChildValue(a) }, TimePeriod: function(a, b) { b.timePeriod = {}; this.readChildNodes(a, b.timePeriod) }, beginPosition: function(a, b) { b.beginPosition = this.getChildValue(a) }, endPosition: function(a, b) { b.endPosition = this.getChildValue(a) } }, OpenLayers.Format.GML.v3.prototype.readers.gml), sos: {
+ Capabilities: function(a, b) { this.readChildNodes(a, b) }, Contents: function(a,
+ b) { b.contents = {}; this.readChildNodes(a, b.contents) }, ObservationOfferingList: function(a, b) { b.offeringList = {}; this.readChildNodes(a, b.offeringList) }, ObservationOffering: function(a, b) { var c = this.getAttributeNS(a, this.namespaces.gml, "id"); b[c] = { procedures: [], observedProperties: [], featureOfInterestIds: [], responseFormats: [], resultModels: [], responseModes: [] }; this.readChildNodes(a, b[c]) }, time: function(a, b) { b.time = {}; this.readChildNodes(a, b.time) }, procedure: function(a, b) {
+ b.procedures.push(this.getAttributeNS(a,
+ this.namespaces.xlink, "href"))
+ }, observedProperty: function(a, b) { b.observedProperties.push(this.getAttributeNS(a, this.namespaces.xlink, "href")) }, featureOfInterest: function(a, b) { b.featureOfInterestIds.push(this.getAttributeNS(a, this.namespaces.xlink, "href")) }, responseFormat: function(a, b) { b.responseFormats.push(this.getChildValue(a)) }, resultModel: function(a, b) { b.resultModels.push(this.getChildValue(a)) }, responseMode: function(a, b) { b.responseModes.push(this.getChildValue(a)) }
+ }, ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+ },
+ CLASS_NAME: "OpenLayers.Format.SOSCapabilities.v1_0_0"
+});
+OpenLayers.Handler.Pinch = OpenLayers.Class(OpenLayers.Handler, {
+ started: !1, stopDown: !1, pinching: !1, last: null, start: null, touchstart: function(a) { var b = !0; this.pinching = !1; if (OpenLayers.Event.isMultiTouch(a)) this.started = !0, this.last = this.start = { distance: this.getDistance(a.touches), delta: 0, scale: 1 }, this.callback("start", [a, this.start]), b = !this.stopDown; else { if (this.started) return !1; this.started = !1; this.last = this.start = null } OpenLayers.Event.preventDefault(a); return b }, touchmove: function(a) {
+ if (this.started &&
+ OpenLayers.Event.isMultiTouch(a)) { this.pinching = !0; var b = this.getPinchData(a); this.callback("move", [a, b]); this.last = b; OpenLayers.Event.stop(a) } else if (this.started) return !1; return !0
+ }, touchend: function(a) { return this.started && !OpenLayers.Event.isMultiTouch(a) ? (this.pinching = this.started = !1, this.callback("done", [a, this.start, this.last]), this.last = this.start = null, !1) : !0 }, activate: function() { var a = !1; OpenLayers.Handler.prototype.activate.apply(this, arguments) && (this.pinching = !1, a = !0); return a }, deactivate: function() {
+ var a =
+ !1; OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.pinching = this.started = !1, this.last = this.start = null, a = !0); return a
+ }, getDistance: function(a) { var b = a[0]; a = a[1]; return Math.sqrt(Math.pow(b.olClientX - a.olClientX, 2) + Math.pow(b.olClientY - a.olClientY, 2)) }, getPinchData: function(a) { a = this.getDistance(a.touches); return { distance: a, delta: this.last.distance - a, scale: a / this.start.distance } }, CLASS_NAME: "OpenLayers.Handler.Pinch"
+});
+OpenLayers.Control.NavToolbar = OpenLayers.Class(OpenLayers.Control.Panel, { initialize: function(a) { OpenLayers.Control.Panel.prototype.initialize.apply(this, [a]); this.addControls([new OpenLayers.Control.Navigation, new OpenLayers.Control.ZoomBox]) }, draw: function() { var a = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments); null === this.defaultControl && (this.defaultControl = this.controls[0]); return a }, CLASS_NAME: "OpenLayers.Control.NavToolbar" });
+OpenLayers.Strategy.Refresh = OpenLayers.Class(OpenLayers.Strategy, {
+ force: !1, interval: 0, timer: null, activate: function() { var a = OpenLayers.Strategy.prototype.activate.call(this); a && (!0 === this.layer.visibility && this.start(), this.layer.events.on({ visibilitychanged: this.reset, scope: this })); return a }, deactivate: function() { var a = OpenLayers.Strategy.prototype.deactivate.call(this); a && (this.stop(), this.layer.events.un({ visibilitychanged: this.reset, scope: this })); return a }, reset: function() {
+ !0 === this.layer.visibility ?
+ this.start() : this.stop()
+ }, start: function() { this.interval && "number" === typeof this.interval && 0 < this.interval && (this.timer = window.setInterval(OpenLayers.Function.bind(this.refresh, this), this.interval)) }, refresh: function() { this.layer && this.layer.refresh && "function" == typeof this.layer.refresh && this.layer.refresh({ force: this.force }) }, stop: function() { null !== this.timer && (window.clearInterval(this.timer), this.timer = null) }, CLASS_NAME: "OpenLayers.Strategy.Refresh"
+});
+OpenLayers.Layer.ArcGIS93Rest = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ DEFAULT_PARAMS: { format: "png" }, isBaseLayer: !0, initialize: function(a, b, c, d) {
+ var e = []; c = OpenLayers.Util.upperCaseObject(c); e.push(a, b, c, d); OpenLayers.Layer.Grid.prototype.initialize.apply(this, e); OpenLayers.Util.applyDefaults(this.params, OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)); this.params.TRANSPARENT && "true" == this.params.TRANSPARENT.toString().toLowerCase() && (null != d && d.isBaseLayer || (this.isBaseLayer = !1), "jpg" == this.params.FORMAT &&
+ (this.params.FORMAT = OpenLayers.Util.alphaHack() ? "gif" : "png"))
+ }, clone: function(a) { null == a && (a = new OpenLayers.Layer.ArcGIS93Rest(this.name, this.url, this.params, this.getOptions())); return OpenLayers.Layer.Grid.prototype.clone.apply(this, [a]) }, getURL: function(a) {
+ a = this.adjustBounds(a); var b = this.projection.getCode().split(":"), b = b[b.length - 1], c = this.getImageSize(); a = { BBOX: a.toBBOX(), SIZE: c.w + "," + c.h, F: "image", BBOXSR: b, IMAGESR: b }; if (this.layerDefs) {
+ var b = [], d; for (d in this.layerDefs) this.layerDefs.hasOwnProperty(d) &&
+ this.layerDefs[d] && (b.push(d), b.push(":"), b.push(this.layerDefs[d]), b.push(";")); 0 < b.length && (a.LAYERDEFS = b.join(""))
+ } return this.getFullRequestString(a)
+ }, setLayerFilter: function(a, b) { this.layerDefs || (this.layerDefs = {}); b ? this.layerDefs[a] = b : delete this.layerDefs[a] }, clearLayerFilter: function(a) { a ? delete this.layerDefs[a] : delete this.layerDefs }, mergeNewParams: function(a) { a = [OpenLayers.Util.upperCaseObject(a)]; return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, a) }, CLASS_NAME: "OpenLayers.Layer.ArcGIS93Rest"
+});
+OpenLayers.Handler.Hover = OpenLayers.Class(OpenLayers.Handler, {
+ delay: 500, pixelTolerance: null, stopMove: !1, px: null, timerId: null, mousemove: function(a) { this.passesTolerance(a.xy) && (this.clearTimer(), this.callback("move", [a]), this.px = a.xy, a = OpenLayers.Util.extend({}, a), this.timerId = window.setTimeout(OpenLayers.Function.bind(this.delayedCall, this, a), this.delay)); return !this.stopMove }, mouseout: function(a) { OpenLayers.Util.mouseLeft(a, this.map.viewPortDiv) && (this.clearTimer(), this.callback("move", [a])); return !0 },
+ passesTolerance: function(a) { var b = !0; this.pixelTolerance && this.px && Math.sqrt(Math.pow(this.px.x - a.x, 2) + Math.pow(this.px.y - a.y, 2)) < this.pixelTolerance && (b = !1); return b }, clearTimer: function() { null != this.timerId && (window.clearTimeout(this.timerId), this.timerId = null) }, delayedCall: function(a) { this.callback("pause", [a]) }, deactivate: function() { var a = !1; OpenLayers.Handler.prototype.deactivate.apply(this, arguments) && (this.clearTimer(), a = !0); return a }, CLASS_NAME: "OpenLayers.Handler.Hover"
+});
+OpenLayers.Control.GetFeature = OpenLayers.Class(OpenLayers.Control, {
+ protocol: null, multipleKey: null, toggleKey: null, modifiers: null, multiple: !1, click: !0, single: !0, clickout: !0, toggle: !1, clickTolerance: 5, hover: !1, box: !1, maxFeatures: 10, features: null, hoverFeature: null, handlers: null, hoverResponse: null, filterType: OpenLayers.Filter.Spatial.BBOX, initialize: function(a) {
+ a.handlerOptions = a.handlerOptions || {}; OpenLayers.Control.prototype.initialize.apply(this, [a]); this.features = {}; this.handlers = {}; this.click && (this.handlers.click =
+ new OpenLayers.Handler.Click(this, { click: this.selectClick }, this.handlerOptions.click || {})); this.box && (this.handlers.box = new OpenLayers.Handler.Box(this, { done: this.selectBox }, OpenLayers.Util.extend(this.handlerOptions.box, { boxDivClassName: "olHandlerBoxSelectFeature" }))); this.hover && (this.handlers.hover = new OpenLayers.Handler.Hover(this, { move: this.cancelHover, pause: this.selectHover }, OpenLayers.Util.extend(this.handlerOptions.hover, { delay: 250, pixelTolerance: 2 })))
+ }, activate: function() {
+ if (!this.active) for (var a in this.handlers) this.handlers[a].activate();
+ return OpenLayers.Control.prototype.activate.apply(this, arguments)
+ }, deactivate: function() { if (this.active) for (var a in this.handlers) this.handlers[a].deactivate(); return OpenLayers.Control.prototype.deactivate.apply(this, arguments) }, selectClick: function(a) { var b = this.pixelToBounds(a.xy); this.setModifiers(a); this.request(b, { single: this.single }) }, selectBox: function(a) {
+ var b; if (a instanceof OpenLayers.Bounds) b = this.map.getLonLatFromPixel({ x: a.left, y: a.bottom }), a = this.map.getLonLatFromPixel({
+ x: a.right,
+ y: a.top
+ }), b = new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat); else { if (this.click) return; b = this.pixelToBounds(a) } this.setModifiers(this.handlers.box.dragHandler.evt); this.request(b)
+ }, selectHover: function(a) { a = this.pixelToBounds(a.xy); this.request(a, { single: !0, hover: !0 }) }, cancelHover: function() { this.hoverResponse && (this.protocol.abort(this.hoverResponse), this.hoverResponse = null, OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait")) }, request: function(a, b) {
+ b = b || {}; var c = new OpenLayers.Filter.Spatial({
+ type: this.filterType,
+ value: a
+ }); OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait"); c = this.protocol.read({ maxFeatures: 1 == b.single ? this.maxFeatures : void 0, filter: c, callback: function(c) { c.success() && (c.features.length ? 1 == b.single ? this.selectBestFeature(c.features, a.getCenterLonLat(), b) : this.select(c.features) : b.hover ? this.hoverSelect() : (this.events.triggerEvent("clickout"), this.clickout && this.unselectAll())); OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait") }, scope: this }); 1 == b.hover && (this.hoverResponse =
+ c)
+ }, selectBestFeature: function(a, b, c) { c = c || {}; if (a.length) { b = new OpenLayers.Geometry.Point(b.lon, b.lat); for (var d, e, f, g = Number.MAX_VALUE, h = 0; h < a.length && !(d = a[h], d.geometry && (f = b.distanceTo(d.geometry, { edge: !1 }), f < g && (g = f, e = d, 0 == g))); ++h); 1 == c.hover ? this.hoverSelect(e) : this.select(e || a) } }, setModifiers: function(a) { this.modifiers = { multiple: this.multiple || this.multipleKey && a[this.multipleKey], toggle: this.toggle || this.toggleKey && a[this.toggleKey] } }, select: function(a) {
+ this.modifiers.multiple || this.modifiers.toggle ||
+ this.unselectAll(); OpenLayers.Util.isArray(a) || (a = [a]); var b = this.events.triggerEvent("beforefeaturesselected", { features: a }); if (!1 !== b) { for (var c = [], d, e = 0, f = a.length; e < f; ++e)d = a[e], this.features[d.fid || d.id] ? this.modifiers.toggle && this.unselect(this.features[d.fid || d.id]) : (b = this.events.triggerEvent("beforefeatureselected", { feature: d }), !1 !== b && (this.features[d.fid || d.id] = d, c.push(d), this.events.triggerEvent("featureselected", { feature: d }))); this.events.triggerEvent("featuresselected", { features: c }) }
+ },
+ hoverSelect: function(a) { var b = a ? a.fid || a.id : null, c = this.hoverFeature ? this.hoverFeature.fid || this.hoverFeature.id : null; c && c != b && (this.events.triggerEvent("outfeature", { feature: this.hoverFeature }), this.hoverFeature = null); b && b != c && (this.events.triggerEvent("hoverfeature", { feature: a }), this.hoverFeature = a) }, unselect: function(a) { delete this.features[a.fid || a.id]; this.events.triggerEvent("featureunselected", { feature: a }) }, unselectAll: function() { for (var a in this.features) this.unselect(this.features[a]) },
+ setMap: function(a) { for (var b in this.handlers) this.handlers[b].setMap(a); OpenLayers.Control.prototype.setMap.apply(this, arguments) }, pixelToBounds: function(a) { var b = a.add(-this.clickTolerance / 2, this.clickTolerance / 2); a = a.add(this.clickTolerance / 2, -this.clickTolerance / 2); b = this.map.getLonLatFromPixel(b); a = this.map.getLonLatFromPixel(a); return new OpenLayers.Bounds(b.lon, b.lat, a.lon, a.lat) }, CLASS_NAME: "OpenLayers.Control.GetFeature"
+});
+OpenLayers.Format.QueryStringFilter = function() {
+ function a(a) { a = a.replace(/%/g, "\\%"); a = a.replace(/\\\\\.(\*)?/g, function(a, b) { return b ? a : "\\\\_" }); a = a.replace(/\\\\\.\*/g, "\\\\%"); a = a.replace(/(\\)?\.(\*)?/g, function(a, b, c) { return b || c ? a : "_" }); a = a.replace(/(\\)?\.\*/g, function(a, b) { return b ? a : "%" }); a = a.replace(/\\\./g, "."); return a = a.replace(/(\\)?\\\*/g, function(a, b) { return b ? a : "*" }) } var b = {}; b[OpenLayers.Filter.Comparison.EQUAL_TO] = "eq"; b[OpenLayers.Filter.Comparison.NOT_EQUAL_TO] = "ne"; b[OpenLayers.Filter.Comparison.LESS_THAN] =
+ "lt"; b[OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO] = "lte"; b[OpenLayers.Filter.Comparison.GREATER_THAN] = "gt"; b[OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO] = "gte"; b[OpenLayers.Filter.Comparison.LIKE] = "ilike"; return OpenLayers.Class(OpenLayers.Format, {
+ wildcarded: !1, srsInBBOX: !1, write: function(c, d) {
+ d = d || {}; var e = c.CLASS_NAME, e = e.substring(e.lastIndexOf(".") + 1); switch (e) {
+ case "Spatial": switch (c.type) {
+ case OpenLayers.Filter.Spatial.BBOX: d.bbox = c.value.toArray(); this.srsInBBOX && c.projection &&
+ d.bbox.push(c.projection.getCode()); break; case OpenLayers.Filter.Spatial.DWITHIN: d.tolerance = c.distance; case OpenLayers.Filter.Spatial.WITHIN: d.lon = c.value.x; d.lat = c.value.y; break; default: OpenLayers.Console.warn("Unknown spatial filter type " + c.type)
+ }break; case "Comparison": e = b[c.type]; if (void 0 !== e) { var f = c.value; c.type == OpenLayers.Filter.Comparison.LIKE && (f = a(f), this.wildcarded && (f = "%" + f + "%")); d[c.property + "__" + e] = f; d.queryable = d.queryable || []; d.queryable.push(c.property) } else OpenLayers.Console.warn("Unknown comparison filter type " +
+ c.type); break; case "Logical": if (c.type === OpenLayers.Filter.Logical.AND) for (e = 0, f = c.filters.length; e < f; e++)d = this.write(c.filters[e], d); else OpenLayers.Console.warn("Unsupported logical filter type " + c.type); break; default: OpenLayers.Console.warn("Unknown filter type " + e)
+ }return d
+ }, CLASS_NAME: "OpenLayers.Format.QueryStringFilter"
+ })
+}();
+OpenLayers.Control.MousePosition = OpenLayers.Class(OpenLayers.Control, {
+ autoActivate: !0, element: null, prefix: "", separator: ", ", suffix: "", numDigits: 5, granularity: 10, emptyString: null, lastXy: null, displayProjection: null, destroy: function() { this.deactivate(); OpenLayers.Control.prototype.destroy.apply(this, arguments) }, activate: function() {
+ return OpenLayers.Control.prototype.activate.apply(this, arguments) ? (this.map.events.register("mousemove", this, this.redraw), this.map.events.register("mouseout", this, this.reset),
+ this.redraw(), !0) : !1
+ }, deactivate: function() { return OpenLayers.Control.prototype.deactivate.apply(this, arguments) ? (this.map.events.unregister("mousemove", this, this.redraw), this.map.events.unregister("mouseout", this, this.reset), this.element.innerHTML = "", !0) : !1 }, draw: function() { OpenLayers.Control.prototype.draw.apply(this, arguments); this.element || (this.div.left = "", this.div.top = "", this.element = this.div); return this.div }, redraw: function(a) {
+ var b; if (null == a) this.reset(); else if (null == this.lastXy || Math.abs(a.xy.x -
+ this.lastXy.x) > this.granularity || Math.abs(a.xy.y - this.lastXy.y) > this.granularity) this.lastXy = a.xy; else if (b = this.map.getLonLatFromPixel(a.xy)) this.displayProjection && b.transform(this.map.getProjectionObject(), this.displayProjection), this.lastXy = a.xy, a = this.formatOutput(b), a != this.element.innerHTML && (this.element.innerHTML = a)
+ }, reset: function(a) { null != this.emptyString && (this.element.innerHTML = this.emptyString) }, formatOutput: function(a) {
+ var b = parseInt(this.numDigits); return this.prefix + a.lon.toFixed(b) +
+ this.separator + a.lat.toFixed(b) + this.suffix
+ }, CLASS_NAME: "OpenLayers.Control.MousePosition"
+});
+OpenLayers.Control.Geolocate = OpenLayers.Class(OpenLayers.Control, {
+ geolocation: null, available: "geolocation" in navigator, bind: !0, watch: !1, geolocationOptions: null, destroy: function() { this.deactivate(); OpenLayers.Control.prototype.destroy.apply(this, arguments) }, activate: function() {
+ this.available && !this.geolocation && (this.geolocation = navigator.geolocation); return this.geolocation ? OpenLayers.Control.prototype.activate.apply(this, arguments) ? (this.watch ? this.watchId = this.geolocation.watchPosition(OpenLayers.Function.bind(this.geolocate,
+ this), OpenLayers.Function.bind(this.failure, this), this.geolocationOptions) : this.getCurrentLocation(), !0) : !1 : (this.events.triggerEvent("locationuncapable"), !1)
+ }, deactivate: function() { this.active && null !== this.watchId && this.geolocation.clearWatch(this.watchId); return OpenLayers.Control.prototype.deactivate.apply(this, arguments) }, geolocate: function(a) {
+ var b = (new OpenLayers.LonLat(a.coords.longitude, a.coords.latitude)).transform(new OpenLayers.Projection("EPSG:4326"), this.map.getProjectionObject()); this.bind &&
+ this.map.setCenter(b); this.events.triggerEvent("locationupdated", { position: a, point: new OpenLayers.Geometry.Point(b.lon, b.lat) })
+ }, getCurrentLocation: function() { if (!this.active || this.watch) return !1; this.geolocation.getCurrentPosition(OpenLayers.Function.bind(this.geolocate, this), OpenLayers.Function.bind(this.failure, this), this.geolocationOptions); return !0 }, failure: function(a) { this.events.triggerEvent("locationfailed", { error: a }) }, CLASS_NAME: "OpenLayers.Control.Geolocate"
+});
+OpenLayers.Tile.UTFGrid = OpenLayers.Class(OpenLayers.Tile, {
+ url: null, utfgridResolution: 2, json: null, format: null, destroy: function() { this.clear(); OpenLayers.Tile.prototype.destroy.apply(this, arguments) }, draw: function() {
+ var a = OpenLayers.Tile.prototype.draw.apply(this, arguments); if (a) if (this.isLoading ? (this.abortLoading(), this.events.triggerEvent("reload")) : (this.isLoading = !0, this.events.triggerEvent("loadstart")), this.url = this.layer.getURL(this.bounds), this.layer.useJSONP) {
+ var b = new OpenLayers.Protocol.Script({
+ url: this.url,
+ callback: function(a) { this.isLoading = !1; this.events.triggerEvent("loadend"); this.json = a.data }, scope: this
+ }); b.read(); this.request = b
+ } else this.request = OpenLayers.Request.GET({ url: this.url, callback: function(a) { this.isLoading = !1; this.events.triggerEvent("loadend"); 200 === a.status && this.parseData(a.responseText) }, scope: this }); else this.unload(); return a
+ }, abortLoading: function() { this.request && (this.request.abort(), delete this.request); this.isLoading = !1 }, getFeatureInfo: function(a, b) {
+ var c = null; if (this.json) {
+ var d =
+ this.getFeatureId(a, b); null !== d && (c = { id: d, data: this.json.data[d] })
+ } return c
+ }, getFeatureId: function(a, b) { var c = null; if (this.json) { var d = this.utfgridResolution, d = this.json.grid[Math.floor(b / d)].charCodeAt(Math.floor(a / d)), d = this.indexFromCharCode(d), e = this.json.keys; !isNaN(d) && d in e && (c = e[d]) } return c }, indexFromCharCode: function(a) { 93 <= a && a--; 35 <= a && a--; return a - 32 }, parseData: function(a) { this.format || (this.format = new OpenLayers.Format.JSON); this.json = this.format.read(a) }, clear: function() {
+ this.json =
+ null
+ }, CLASS_NAME: "OpenLayers.Tile.UTFGrid"
+});
+OpenLayers.Protocol.HTTP = OpenLayers.Class(OpenLayers.Protocol, {
+ url: null, headers: null, params: null, callback: null, scope: null, readWithPOST: !1, updateWithPOST: !1, deleteWithPOST: !1, wildcarded: !1, srsInBBOX: !1, initialize: function(a) {
+ a = a || {}; this.params = {}; this.headers = {}; OpenLayers.Protocol.prototype.initialize.apply(this, arguments); if (!this.filterToParams && OpenLayers.Format.QueryStringFilter) {
+ var b = new OpenLayers.Format.QueryStringFilter({ wildcarded: this.wildcarded, srsInBBOX: this.srsInBBOX }); this.filterToParams =
+ function(a, d) { return b.write(a, d) }
+ }
+ }, destroy: function() { this.headers = this.params = null; OpenLayers.Protocol.prototype.destroy.apply(this) }, read: function(a) {
+ OpenLayers.Protocol.prototype.read.apply(this, arguments); a = a || {}; a.params = OpenLayers.Util.applyDefaults(a.params, this.options.params); a = OpenLayers.Util.applyDefaults(a, this.options); a.filter && this.filterToParams && (a.params = this.filterToParams(a.filter, a.params)); var b = void 0 !== a.readWithPOST ? a.readWithPOST : this.readWithPOST, c = new OpenLayers.Protocol.Response({ requestType: "read" });
+ b ? (b = a.headers || {}, b["Content-Type"] = "application/x-www-form-urlencoded", c.priv = OpenLayers.Request.POST({ url: a.url, callback: this.createCallback(this.handleRead, c, a), data: OpenLayers.Util.getParameterString(a.params), headers: b })) : c.priv = OpenLayers.Request.GET({ url: a.url, callback: this.createCallback(this.handleRead, c, a), params: a.params, headers: a.headers }); return c
+ }, handleRead: function(a, b) { this.handleResponse(a, b) }, create: function(a, b) {
+ b = OpenLayers.Util.applyDefaults(b, this.options); var c = new OpenLayers.Protocol.Response({
+ reqFeatures: a,
+ requestType: "create"
+ }); c.priv = OpenLayers.Request.POST({ url: b.url, callback: this.createCallback(this.handleCreate, c, b), headers: b.headers, data: this.format.write(a) }); return c
+ }, handleCreate: function(a, b) { this.handleResponse(a, b) }, update: function(a, b) {
+ b = b || {}; var c = b.url || a.url || this.options.url + "/" + a.fid; b = OpenLayers.Util.applyDefaults(b, this.options); var d = new OpenLayers.Protocol.Response({ reqFeatures: a, requestType: "update" }); d.priv = OpenLayers.Request[this.updateWithPOST ? "POST" : "PUT"]({
+ url: c, callback: this.createCallback(this.handleUpdate,
+ d, b), headers: b.headers, data: this.format.write(a)
+ }); return d
+ }, handleUpdate: function(a, b) { this.handleResponse(a, b) }, "delete": function(a, b) {
+ b = b || {}; var c = b.url || a.url || this.options.url + "/" + a.fid; b = OpenLayers.Util.applyDefaults(b, this.options); var d = new OpenLayers.Protocol.Response({ reqFeatures: a, requestType: "delete" }), e = this.deleteWithPOST ? "POST" : "DELETE", c = { url: c, callback: this.createCallback(this.handleDelete, d, b), headers: b.headers }; this.deleteWithPOST && (c.data = this.format.write(a)); d.priv = OpenLayers.Request[e](c);
+ return d
+ }, handleDelete: function(a, b) { this.handleResponse(a, b) }, handleResponse: function(a, b) { var c = a.priv; b.callback && (200 <= c.status && 300 > c.status ? ("delete" != a.requestType && (a.features = this.parseFeatures(c)), a.code = OpenLayers.Protocol.Response.SUCCESS) : a.code = OpenLayers.Protocol.Response.FAILURE, b.callback.call(b.scope, a)) }, parseFeatures: function(a) { var b = a.responseXML; b && b.documentElement || (b = a.responseText); return !b || 0 >= b.length ? null : this.format.read(b) }, commit: function(a, b) {
+ function c(a) {
+ for (var b =
+ a.features ? a.features.length : 0, c = Array(b), e = 0; e < b; ++e)c[e] = a.features[e].fid; r.insertIds = c; d.apply(this, [a])
+ } function d(a) { this.callUserCallback(a, b); q = q && a.success(); f++; f >= p && b.callback && (r.code = q ? OpenLayers.Protocol.Response.SUCCESS : OpenLayers.Protocol.Response.FAILURE, b.callback.apply(b.scope, [r])) } b = OpenLayers.Util.applyDefaults(b, this.options); var e = [], f = 0, g = {}; g[OpenLayers.State.INSERT] = []; g[OpenLayers.State.UPDATE] = []; g[OpenLayers.State.DELETE] = []; for (var h, k, l = [], m = 0, n = a.length; m < n; ++m)if (h =
+ a[m], k = g[h.state]) k.push(h), l.push(h); var p = (0 < g[OpenLayers.State.INSERT].length ? 1 : 0) + g[OpenLayers.State.UPDATE].length + g[OpenLayers.State.DELETE].length, q = !0, r = new OpenLayers.Protocol.Response({ reqFeatures: l }); h = g[OpenLayers.State.INSERT]; 0 < h.length && e.push(this.create(h, OpenLayers.Util.applyDefaults({ callback: c, scope: this }, b.create))); h = g[OpenLayers.State.UPDATE]; for (m = h.length - 1; 0 <= m; --m)e.push(this.update(h[m], OpenLayers.Util.applyDefaults({ callback: d, scope: this }, b.update))); h = g[OpenLayers.State.DELETE];
+ for (m = h.length - 1; 0 <= m; --m)e.push(this["delete"](h[m], OpenLayers.Util.applyDefaults({ callback: d, scope: this }, b["delete"]))); return e
+ }, abort: function(a) { a && a.priv.abort() }, callUserCallback: function(a, b) { var c = b[a.requestType]; c && c.callback && c.callback.call(c.scope, a) }, CLASS_NAME: "OpenLayers.Protocol.HTTP"
+});
+OpenLayers.Strategy.Cluster = OpenLayers.Class(OpenLayers.Strategy, {
+ distance: 20, threshold: null, features: null, clusters: null, clustering: !1, resolution: null, activate: function() { var a = OpenLayers.Strategy.prototype.activate.call(this); if (a) this.layer.events.on({ beforefeaturesadded: this.cacheFeatures, featuresremoved: this.clearCache, moveend: this.cluster, scope: this }); return a }, deactivate: function() {
+ var a = OpenLayers.Strategy.prototype.deactivate.call(this); a && (this.clearCache(), this.layer.events.un({
+ beforefeaturesadded: this.cacheFeatures,
+ featuresremoved: this.clearCache, moveend: this.cluster, scope: this
+ })); return a
+ }, cacheFeatures: function(a) { var b = !0; this.clustering || (this.clearCache(), this.features = a.features, this.cluster(), b = !1); return b }, clearCache: function() { this.clustering || (this.features = null) }, cluster: function(a) {
+ if ((!a || a.zoomChanged) && this.features && (a = this.layer.map.getResolution(), a != this.resolution || !this.clustersExist())) {
+ this.resolution = a; a = []; for (var b, c, d, e = 0; e < this.features.length; ++e)if (b = this.features[e], b.geometry) {
+ c =
+ !1; for (var f = a.length - 1; 0 <= f; --f)if (d = a[f], this.shouldCluster(d, b)) { this.addToCluster(d, b); c = !0; break } c || a.push(this.createCluster(this.features[e]))
+ } this.clustering = !0; this.layer.removeAllFeatures(); this.clustering = !1; if (0 < a.length) { if (1 < this.threshold) for (b = a.slice(), a = [], e = 0, d = b.length; e < d; ++e)c = b[e], c.attributes.count < this.threshold ? Array.prototype.push.apply(a, c.cluster) : a.push(c); this.clustering = !0; this.layer.addFeatures(a); this.clustering = !1 } this.clusters = a
+ }
+ }, clustersExist: function() {
+ var a =
+ !1; if (this.clusters && 0 < this.clusters.length && this.clusters.length == this.layer.features.length) for (var a = !0, b = 0; b < this.clusters.length; ++b)if (this.clusters[b] != this.layer.features[b]) { a = !1; break } return a
+ }, shouldCluster: function(a, b) { var c = a.geometry.getBounds().getCenterLonLat(), d = b.geometry.getBounds().getCenterLonLat(); return Math.sqrt(Math.pow(c.lon - d.lon, 2) + Math.pow(c.lat - d.lat, 2)) / this.resolution <= this.distance }, addToCluster: function(a, b) { a.cluster.push(b); a.attributes.count += 1 }, createCluster: function(a) {
+ var b =
+ a.geometry.getBounds().getCenterLonLat(), b = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(b.lon, b.lat), { count: 1 }); b.cluster = [a]; return b
+ }, CLASS_NAME: "OpenLayers.Strategy.Cluster"
+});
+OpenLayers.Strategy.Filter = OpenLayers.Class(OpenLayers.Strategy, {
+ filter: null, cache: null, caching: !1, activate: function() { var a = OpenLayers.Strategy.prototype.activate.apply(this, arguments); a && (this.cache = [], this.layer.events.on({ beforefeaturesadded: this.handleAdd, beforefeaturesremoved: this.handleRemove, scope: this })); return a }, deactivate: function() {
+ this.cache = null; this.layer && this.layer.events && this.layer.events.un({ beforefeaturesadded: this.handleAdd, beforefeaturesremoved: this.handleRemove, scope: this });
+ return OpenLayers.Strategy.prototype.deactivate.apply(this, arguments)
+ }, handleAdd: function(a) { if (!this.caching && this.filter) { var b = a.features; a.features = []; for (var c, d = 0, e = b.length; d < e; ++d)c = b[d], this.filter.evaluate(c) ? a.features.push(c) : this.cache.push(c) } }, handleRemove: function(a) { this.caching || (this.cache = []) }, setFilter: function(a) {
+ this.filter = a; a = this.cache; this.cache = []; this.handleAdd({ features: this.layer.features }); 0 < this.cache.length && (this.caching = !0, this.layer.removeFeatures(this.cache.slice()),
+ this.caching = !1); 0 < a.length && (a = { features: a }, this.handleAdd(a), 0 < a.features.length && (this.caching = !0, this.layer.addFeatures(a.features), this.caching = !1))
+ }, CLASS_NAME: "OpenLayers.Strategy.Filter"
+}); OpenLayers.Protocol.SOS = function(a) { a = OpenLayers.Util.applyDefaults(a, OpenLayers.Protocol.SOS.DEFAULTS); var b = OpenLayers.Protocol.SOS["v" + a.version.replace(/\./g, "_")]; if (!b) throw "Unsupported SOS version: " + a.version; return new b(a) }; OpenLayers.Protocol.SOS.DEFAULTS = { version: "1.0.0" };
+OpenLayers.Format.WFSDescribeFeatureType = OpenLayers.Class(OpenLayers.Format.XML, {
+ regExes: { trimSpace: /^\s*|\s*$/g }, namespaces: { xsd: "http://www.w3.org/2001/XMLSchema" }, readers: {
+ xsd: {
+ schema: function(a, b) {
+ var c = [], d = {}, e, f; this.readChildNodes(a, { complexTypes: c, customTypes: d }); var g = a.attributes, h, k; e = 0; for (f = g.length; e < f; ++e)h = g[e], k = h.name, 0 === k.indexOf("xmlns") ? this.setNamespace(k.split(":")[1] || "", h.value) : b[k] = h.value; b.featureTypes = c; b.targetPrefix = this.namespaceAlias[b.targetNamespace]; e = 0; for (f =
+ c.length; e < f; ++e)g = c[e], h = d[g.typeName], d[g.typeName] && (g.typeName = h.name)
+ }, complexType: function(a, b) { var c = { typeName: a.getAttribute("name") }; this.readChildNodes(a, c); b.complexTypes.push(c) }, complexContent: function(a, b) { this.readChildNodes(a, b) }, extension: function(a, b) { this.readChildNodes(a, b) }, sequence: function(a, b) { var c = { elements: [] }; this.readChildNodes(a, c); b.properties = c.elements }, element: function(a, b) {
+ var c; if (b.elements) {
+ var d = {}; c = a.attributes; for (var e, f = 0, g = c.length; f < g; ++f)e = c[f], d[e.name] =
+ e.value; (c = d.type) || (c = {}, this.readChildNodes(a, c), d.restriction = c, d.type = c.base); d.localType = (c.base || c).split(":").pop(); b.elements.push(d); this.readChildNodes(a, d)
+ } b.complexTypes && (c = a.getAttribute("type"), d = c.split(":").pop(), b.customTypes[d] = { name: a.getAttribute("name"), type: c })
+ }, annotation: function(a, b) { b.annotation = {}; this.readChildNodes(a, b.annotation) }, appinfo: function(a, b) { b.appinfo || (b.appinfo = []); b.appinfo.push(this.getChildValue(a)) }, documentation: function(a, b) {
+ b.documentation || (b.documentation =
+ []); var c = this.getChildValue(a); b.documentation.push({ lang: a.getAttribute("xml:lang"), textContent: c.replace(this.regExes.trimSpace, "") })
+ }, simpleType: function(a, b) { this.readChildNodes(a, b) }, restriction: function(a, b) { b.base = a.getAttribute("base"); this.readRestriction(a, b) }
+ }
+ }, readRestriction: function(a, b) { for (var c = a.childNodes, d, e, f = 0, g = c.length; f < g; ++f)d = c[f], 1 == d.nodeType && (e = d.nodeName.split(":").pop(), d = d.getAttribute("value"), b[e] ? ("string" == typeof b[e] && (b[e] = [b[e]]), b[e].push(d)) : b[e] = d) }, read: function(a) {
+ "string" ==
+ typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; if ("ExceptionReport" === a.nodeName.split(":").pop()) { var c = new OpenLayers.Format.OGCExceptionReport; b.error = c.read(a) } else this.readNode(a, b); return b
+ }, CLASS_NAME: "OpenLayers.Format.WFSDescribeFeatureType"
+});
+OpenLayers.Format.GeoRSS = OpenLayers.Class(OpenLayers.Format.XML, {
+ rssns: "http://backend.userland.com/rss2", featureNS: "http://mapserver.gis.umn.edu/mapserver", georssns: "http://www.georss.org/georss", geons: "http://www.w3.org/2003/01/geo/wgs84_pos#", featureTitle: "Untitled", featureDescription: "No Description", gmlParser: null, xy: !1, createGeometryFromItem: function(a) {
+ var b = this.getElementsByTagNameNS(a, this.georssns, "point"), c = this.getElementsByTagNameNS(a, this.geons, "lat"), d = this.getElementsByTagNameNS(a,
+ this.geons, "long"), e = this.getElementsByTagNameNS(a, this.georssns, "line"), f = this.getElementsByTagNameNS(a, this.georssns, "polygon"), g = this.getElementsByTagNameNS(a, this.georssns, "where"); a = this.getElementsByTagNameNS(a, this.georssns, "box"); if (0 < b.length || 0 < c.length && 0 < d.length) {
+ 0 < b.length ? (c = OpenLayers.String.trim(b[0].firstChild.nodeValue).split(/\s+/), 2 != c.length && (c = OpenLayers.String.trim(b[0].firstChild.nodeValue).split(/\s*,\s*/))) : c = [parseFloat(c[0].firstChild.nodeValue), parseFloat(d[0].firstChild.nodeValue)];
+ var h = new OpenLayers.Geometry.Point(c[1], c[0])
+ } else if (0 < e.length) { c = OpenLayers.String.trim(this.getChildValue(e[0])).split(/\s+/); d = []; e = 0; for (f = c.length; e < f; e += 2)b = new OpenLayers.Geometry.Point(c[e + 1], c[e]), d.push(b); h = new OpenLayers.Geometry.LineString(d) } else if (0 < f.length) { c = OpenLayers.String.trim(this.getChildValue(f[0])).split(/\s+/); d = []; e = 0; for (f = c.length; e < f; e += 2)b = new OpenLayers.Geometry.Point(c[e + 1], c[e]), d.push(b); h = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(d)]) } else 0 <
+ g.length ? (this.gmlParser || (this.gmlParser = new OpenLayers.Format.GML({ xy: this.xy })), h = this.gmlParser.parseFeature(g[0]).geometry) : 0 < a.length && (c = OpenLayers.String.trim(a[0].firstChild.nodeValue).split(/\s+/), d = [], 3 < c.length && (b = new OpenLayers.Geometry.Point(c[1], c[0]), d.push(b), b = new OpenLayers.Geometry.Point(c[1], c[2]), d.push(b), b = new OpenLayers.Geometry.Point(c[3], c[2]), d.push(b), b = new OpenLayers.Geometry.Point(c[3], c[0]), d.push(b), b = new OpenLayers.Geometry.Point(c[1], c[0]), d.push(b)), h = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(d)]));
+ h && this.internalProjection && this.externalProjection && h.transform(this.externalProjection, this.internalProjection); return h
+ }, createFeatureFromItem: function(a) {
+ var b = this.createGeometryFromItem(a), c = this._getChildValue(a, "*", "title", this.featureTitle), d = this._getChildValue(a, "*", "description", this._getChildValue(a, "*", "content", this._getChildValue(a, "*", "summary", this.featureDescription))), e = this._getChildValue(a, "*", "link"); if (!e) try { e = this.getElementsByTagNameNS(a, "*", "link")[0].getAttribute("href") } catch (f) {
+ e =
+ null
+ } a = this._getChildValue(a, "*", "id", null); b = new OpenLayers.Feature.Vector(b, { title: c, description: d, link: e }); b.fid = a; return b
+ }, _getChildValue: function(a, b, c, d) { return (a = this.getElementsByTagNameNS(a, b, c)) && a[0] && a[0].firstChild && a[0].firstChild.nodeValue ? this.getChildValue(a[0]) : void 0 == d ? "" : d }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); var b = null, b = this.getElementsByTagNameNS(a, "*", "item"); 0 == b.length && (b = this.getElementsByTagNameNS(a, "*", "entry"));
+ a = b.length; for (var c = Array(a), d = 0; d < a; d++)c[d] = this.createFeatureFromItem(b[d]); return c
+ }, write: function(a) { var b; if (OpenLayers.Util.isArray(a)) { b = this.createElementNS(this.rssns, "rss"); for (var c = 0, d = a.length; c < d; c++)b.appendChild(this.createFeatureXML(a[c])) } else b = this.createFeatureXML(a); return OpenLayers.Format.XML.prototype.write.apply(this, [b]) }, createFeatureXML: function(a) {
+ var b = this.buildGeometryNode(a.geometry), c = this.createElementNS(this.rssns, "item"), d = this.createElementNS(this.rssns, "title");
+ d.appendChild(this.createTextNode(a.attributes.title ? a.attributes.title : "")); var e = this.createElementNS(this.rssns, "description"); e.appendChild(this.createTextNode(a.attributes.description ? a.attributes.description : "")); c.appendChild(d); c.appendChild(e); a.attributes.link && (d = this.createElementNS(this.rssns, "link"), d.appendChild(this.createTextNode(a.attributes.link)), c.appendChild(d)); for (var f in a.attributes) "link" != f && "title" != f && "description" != f && (d = this.createTextNode(a.attributes[f]), e = f, -1 !=
+ f.search(":") && (e = f.split(":")[1]), e = this.createElementNS(this.featureNS, "feature:" + e), e.appendChild(d), c.appendChild(e)); c.appendChild(b); return c
+ }, buildGeometryNode: function(a) {
+ this.internalProjection && this.externalProjection && (a = a.clone(), a.transform(this.internalProjection, this.externalProjection)); var b; if ("OpenLayers.Geometry.Polygon" == a.CLASS_NAME) b = this.createElementNS(this.georssns, "georss:polygon"), b.appendChild(this.buildCoordinatesNode(a.components[0])); else if ("OpenLayers.Geometry.LineString" ==
+ a.CLASS_NAME) b = this.createElementNS(this.georssns, "georss:line"), b.appendChild(this.buildCoordinatesNode(a)); else if ("OpenLayers.Geometry.Point" == a.CLASS_NAME) b = this.createElementNS(this.georssns, "georss:point"), b.appendChild(this.buildCoordinatesNode(a)); else throw "Couldn't parse " + a.CLASS_NAME; return b
+ }, buildCoordinatesNode: function(a) { var b = null; a.components && (b = a.components); if (b) { a = b.length; for (var c = Array(a), d = 0; d < a; d++)c[d] = b[d].y + " " + b[d].x; b = c.join(" ") } else b = a.y + " " + a.x; return this.createTextNode(b) },
+ CLASS_NAME: "OpenLayers.Format.GeoRSS"
+}); OpenLayers.Format.WPSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, { defaultVersion: "1.0.0", CLASS_NAME: "OpenLayers.Format.WPSCapabilities" });
+OpenLayers.Format.WPSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { ows: "http://www.opengis.net/ows/1.1", wps: "http://www.opengis.net/wps/1.0.0", xlink: "http://www.w3.org/1999/xlink" }, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]) }, read: function(a) {
+ "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement);
+ var b = {}; this.readNode(a, b); return b
+ }, readers: {
+ wps: {
+ Capabilities: function(a, b) { this.readChildNodes(a, b) }, ProcessOfferings: function(a, b) { b.processOfferings = {}; this.readChildNodes(a, b.processOfferings) }, Process: function(a, b) { var c = { processVersion: this.getAttributeNS(a, this.namespaces.wps, "processVersion") }; this.readChildNodes(a, c); b[c.identifier] = c }, Languages: function(a, b) { b.languages = []; this.readChildNodes(a, b.languages) }, Default: function(a, b) { var c = { isDefault: !0 }; this.readChildNodes(a, c); b.push(c) },
+ Supported: function(a, b) { var c = {}; this.readChildNodes(a, c); b.push(c) }
+ }, ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+ }, CLASS_NAME: "OpenLayers.Format.WPSCapabilities.v1_0_0"
+});
+OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
+ type: OpenLayers.Control.TYPE_TOOL, pinchOrigin: null, currentCenter: null, autoActivate: !0, preserveCenter: !1, initialize: function(a) { OpenLayers.Control.prototype.initialize.apply(this, arguments); this.handler = new OpenLayers.Handler.Pinch(this, { start: this.pinchStart, move: this.pinchMove, done: this.pinchDone }, this.handlerOptions) }, pinchStart: function(a, b) {
+ this.currentCenter = this.pinchOrigin = this.preserveCenter ? this.map.getPixelFromLonLat(this.map.getCenter()) :
+ a.xy
+ }, pinchMove: function(a, b) { var c = b.scale, d = this.map.layerContainerOriginPx, e = this.pinchOrigin, f = this.preserveCenter ? this.map.getPixelFromLonLat(this.map.getCenter()) : a.xy, g = Math.round(d.x + f.x - e.x + (c - 1) * (d.x - e.x)), d = Math.round(d.y + f.y - e.y + (c - 1) * (d.y - e.y)); this.map.applyTransform(g, d, c); this.currentCenter = f }, pinchDone: function(a, b, c) {
+ this.map.applyTransform(); a = this.map.getZoomForResolution(this.map.getResolution() / c.scale, !0); if (a !== this.map.getZoom() || !this.currentCenter.equals(this.pinchOrigin)) {
+ b =
+ this.map.getResolutionForZoom(a); c = this.map.getLonLatFromPixel(this.pinchOrigin); var d = this.currentCenter, e = this.map.getSize(); c.lon += b * (e.w / 2 - d.x); c.lat -= b * (e.h / 2 - d.y); this.map.div.clientWidth = this.map.div.clientWidth; this.map.setCenter(c, a)
+ }
+ }, CLASS_NAME: "OpenLayers.Control.PinchZoom"
+});
+OpenLayers.Control.TouchNavigation = OpenLayers.Class(OpenLayers.Control, {
+ dragPan: null, dragPanOptions: null, pinchZoom: null, pinchZoomOptions: null, clickHandlerOptions: null, documentDrag: !1, autoActivate: !0, initialize: function(a) { this.handlers = {}; OpenLayers.Control.prototype.initialize.apply(this, arguments) }, destroy: function() {
+ this.deactivate(); this.dragPan && this.dragPan.destroy(); this.dragPan = null; this.pinchZoom && (this.pinchZoom.destroy(), delete this.pinchZoom); OpenLayers.Control.prototype.destroy.apply(this,
+ arguments)
+ }, activate: function() { return OpenLayers.Control.prototype.activate.apply(this, arguments) ? (this.dragPan.activate(), this.handlers.click.activate(), this.pinchZoom.activate(), !0) : !1 }, deactivate: function() { return OpenLayers.Control.prototype.deactivate.apply(this, arguments) ? (this.dragPan.deactivate(), this.handlers.click.deactivate(), this.pinchZoom.deactivate(), !0) : !1 }, draw: function() {
+ var a = { click: this.defaultClick, dblclick: this.defaultDblClick }, b = OpenLayers.Util.extend({
+ "double": !0, stopDouble: !0,
+ pixelTolerance: 2
+ }, this.clickHandlerOptions); this.handlers.click = new OpenLayers.Handler.Click(this, a, b); this.dragPan = new OpenLayers.Control.DragPan(OpenLayers.Util.extend({ map: this.map, documentDrag: this.documentDrag }, this.dragPanOptions)); this.dragPan.draw(); this.pinchZoom = new OpenLayers.Control.PinchZoom(OpenLayers.Util.extend({ map: this.map }, this.pinchZoomOptions))
+ }, defaultClick: function(a) { a.lastTouches && 2 == a.lastTouches.length && this.map.zoomOut() }, defaultDblClick: function(a) {
+ this.map.zoomTo(this.map.zoom +
+ 1, a.xy)
+ }, CLASS_NAME: "OpenLayers.Control.TouchNavigation"
+}); OpenLayers.Console.warn("OpenLayers.Rico is deprecated"); OpenLayers.Rico = OpenLayers.Rico || {};
+OpenLayers.Rico.Color = OpenLayers.Class({
+ initialize: function(a, b, c) { this.rgb = { r: a, g: b, b: c } }, setRed: function(a) { this.rgb.r = a }, setGreen: function(a) { this.rgb.g = a }, setBlue: function(a) { this.rgb.b = a }, setHue: function(a) { var b = this.asHSB(); b.h = a; this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, b.b) }, setSaturation: function(a) { var b = this.asHSB(); b.s = a; this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, b.b) }, setBrightness: function(a) { var b = this.asHSB(); b.b = a; this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, b.b) },
+ darken: function(a) { var b = this.asHSB(); this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, Math.max(b.b - a, 0)) }, brighten: function(a) { var b = this.asHSB(); this.rgb = OpenLayers.Rico.Color.HSBtoRGB(b.h, b.s, Math.min(b.b + a, 1)) }, blend: function(a) { this.rgb.r = Math.floor((this.rgb.r + a.rgb.r) / 2); this.rgb.g = Math.floor((this.rgb.g + a.rgb.g) / 2); this.rgb.b = Math.floor((this.rgb.b + a.rgb.b) / 2) }, isBright: function() { this.asHSB(); return .5 < this.asHSB().b }, isDark: function() { return !this.isBright() }, asRGB: function() {
+ return "rgb(" +
+ this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")"
+ }, asHex: function() { return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart() }, asHSB: function() { return OpenLayers.Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b) }, toString: function() { return this.asHex() }
+});
+OpenLayers.Rico.Color.createFromHex = function(a) { if (4 == a.length) { var b = a; a = "#"; for (var c = 1; 4 > c; c++)a += b.charAt(c) + b.charAt(c) } 0 == a.indexOf("#") && (a = a.substring(1)); b = a.substring(0, 2); c = a.substring(2, 4); a = a.substring(4, 6); return new OpenLayers.Rico.Color(parseInt(b, 16), parseInt(c, 16), parseInt(a, 16)) };
+OpenLayers.Rico.Color.createColorFromBackground = function(a) {
+ var b = OpenLayers.Element.getStyle(OpenLayers.Util.getElement(a), "backgroundColor"); return "transparent" == b && a.parentNode ? OpenLayers.Rico.Color.createColorFromBackground(a.parentNode) : null == b ? new OpenLayers.Rico.Color(255, 255, 255) : 0 == b.indexOf("rgb(") ? (a = b.substring(4, b.length - 1).split(","), new OpenLayers.Rico.Color(parseInt(a[0]), parseInt(a[1]), parseInt(a[2]))) : 0 == b.indexOf("#") ? OpenLayers.Rico.Color.createFromHex(b) : new OpenLayers.Rico.Color(255,
+ 255, 255)
+};
+OpenLayers.Rico.Color.HSBtoRGB = function(a, b, c) {
+ var d = 0, e = 0, f = 0; if (0 == b) f = e = d = parseInt(255 * c + .5); else { a = 6 * (a - Math.floor(a)); var g = a - Math.floor(a), h = c * (1 - b), k = c * (1 - b * g); b = c * (1 - b * (1 - g)); switch (parseInt(a)) { case 0: d = 255 * c + .5; e = 255 * b + .5; f = 255 * h + .5; break; case 1: d = 255 * k + .5; e = 255 * c + .5; f = 255 * h + .5; break; case 2: d = 255 * h + .5; e = 255 * c + .5; f = 255 * b + .5; break; case 3: d = 255 * h + .5; e = 255 * k + .5; f = 255 * c + .5; break; case 4: d = 255 * b + .5; e = 255 * h + .5; f = 255 * c + .5; break; case 5: d = 255 * c + .5, e = 255 * h + .5, f = 255 * k + .5 } } return {
+ r: parseInt(d), g: parseInt(e),
+ b: parseInt(f)
+ }
+}; OpenLayers.Rico.Color.RGBtoHSB = function(a, b, c) { var d, e = a > b ? a : b; c > e && (e = c); var f = a < b ? a : b; c < f && (f = c); d = 0 != e ? (e - f) / e : 0; if (0 == d) a = 0; else { var g = (e - a) / (e - f), h = (e - b) / (e - f); c = (e - c) / (e - f); a = (a == e ? c - h : b == e ? 2 + g - c : 4 + h - g) / 6; 0 > a && (a += 1) } return { h: a, s: d, b: e / 255 } };
+OpenLayers.Style2 = OpenLayers.Class({
+ id: null, name: null, title: null, description: null, layerName: null, isDefault: !1, rules: null, initialize: function(a) { OpenLayers.Util.extend(this, a); this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_") }, destroy: function() { for (var a = 0, b = this.rules.length; a < b; a++)this.rules[a].destroy(); delete this.rules }, clone: function() { var a = OpenLayers.Util.extend({}, this); if (this.rules) { a.rules = []; for (var b = 0, c = this.rules.length; b < c; ++b)a.rules.push(this.rules[b].clone()) } return new OpenLayers.Style2(a) },
+ CLASS_NAME: "OpenLayers.Style2"
+});
+OpenLayers.Format.WFS = OpenLayers.Class(OpenLayers.Format.GML, {
+ layer: null, wfsns: "http://www.opengis.net/wfs", ogcns: "http://www.opengis.net/ogc", initialize: function(a, b) { OpenLayers.Format.GML.prototype.initialize.apply(this, [a]); this.layer = b; this.layer.featureNS && (this.featureNS = this.layer.featureNS); this.layer.options.geometry_column && (this.geometryName = this.layer.options.geometry_column); this.layer.options.typename && (this.featureName = this.layer.options.typename) }, write: function(a) {
+ var b = this.createElementNS(this.wfsns,
+ "wfs:Transaction"); b.setAttribute("version", "1.0.0"); b.setAttribute("service", "WFS"); for (var c = 0; c < a.length; c++)switch (a[c].state) { case OpenLayers.State.INSERT: b.appendChild(this.insert(a[c])); break; case OpenLayers.State.UPDATE: b.appendChild(this.update(a[c])); break; case OpenLayers.State.DELETE: b.appendChild(this.remove(a[c])) }return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+ }, createFeatureXML: function(a) {
+ var b = this.buildGeometryNode(a.geometry), c = this.createElementNS(this.featureNS, "feature:" +
+ this.geometryName); c.appendChild(b); b = this.createElementNS(this.featureNS, "feature:" + this.featureName); b.appendChild(c); for (var d in a.attributes) { var c = this.createTextNode(a.attributes[d]), e = d; -1 != d.search(":") && (e = d.split(":")[1]); e = this.createElementNS(this.featureNS, "feature:" + e); e.appendChild(c); b.appendChild(e) } return b
+ }, insert: function(a) { var b = this.createElementNS(this.wfsns, "wfs:Insert"); b.appendChild(this.createFeatureXML(a)); return b }, update: function(a) {
+ a.fid || OpenLayers.Console.userError(OpenLayers.i18n("noFID"));
+ var b = this.createElementNS(this.wfsns, "wfs:Update"); b.setAttribute("typeName", this.featurePrefix + ":" + this.featureName); b.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); var c = this.createElementNS(this.wfsns, "wfs:Property"), d = this.createElementNS(this.wfsns, "wfs:Name"), e = this.createTextNode(this.geometryName); d.appendChild(e); c.appendChild(d); d = this.createElementNS(this.wfsns, "wfs:Value"); e = this.buildGeometryNode(a.geometry); a.layer && e.setAttribute("srsName", a.layer.projection.getCode());
+ d.appendChild(e); c.appendChild(d); b.appendChild(c); for (var f in a.attributes) c = this.createElementNS(this.wfsns, "wfs:Property"), d = this.createElementNS(this.wfsns, "wfs:Name"), d.appendChild(this.createTextNode(f)), c.appendChild(d), d = this.createElementNS(this.wfsns, "wfs:Value"), d.appendChild(this.createTextNode(a.attributes[f])), c.appendChild(d), b.appendChild(c); c = this.createElementNS(this.ogcns, "ogc:Filter"); f = this.createElementNS(this.ogcns, "ogc:FeatureId"); f.setAttribute("fid", a.fid); c.appendChild(f);
+ b.appendChild(c); return b
+ }, remove: function(a) { if (!a.fid) return OpenLayers.Console.userError(OpenLayers.i18n("noFID")), !1; var b = this.createElementNS(this.wfsns, "wfs:Delete"); b.setAttribute("typeName", this.featurePrefix + ":" + this.featureName); b.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); var c = this.createElementNS(this.ogcns, "ogc:Filter"), d = this.createElementNS(this.ogcns, "ogc:FeatureId"); d.setAttribute("fid", a.fid); c.appendChild(d); b.appendChild(c); return b }, destroy: function() {
+ this.layer =
+ null
+ }, CLASS_NAME: "OpenLayers.Format.WFS"
+});
+OpenLayers.Format.SLD.v1_0_0_GeoServer = OpenLayers.Class(OpenLayers.Format.SLD.v1_0_0, {
+ version: "1.0.0", profile: "GeoServer", readers: OpenLayers.Util.applyDefaults({
+ sld: OpenLayers.Util.applyDefaults({
+ Priority: function(a, b) { var c = this.readers.ogc._expression.call(this, a); c && (b.priority = c) }, VendorOption: function(a, b) { b.vendorOptions || (b.vendorOptions = {}); b.vendorOptions[a.getAttribute("name")] = this.getChildValue(a) }, TextSymbolizer: function(a, b) {
+ OpenLayers.Format.SLD.v1_0_0.prototype.readers.sld.TextSymbolizer.apply(this, arguments);
+ var c = this.multipleSymbolizers ? b.symbolizers[b.symbolizers.length - 1] : b.symbolizer.Text; void 0 === c.graphic && (c.graphic = !1)
+ }
+ }, OpenLayers.Format.SLD.v1_0_0.prototype.readers.sld)
+ }, OpenLayers.Format.SLD.v1_0_0.prototype.readers), writers: OpenLayers.Util.applyDefaults({
+ sld: OpenLayers.Util.applyDefaults({
+ Priority: function(a) { return this.writers.sld._OGCExpression.call(this, "sld:Priority", a) }, VendorOption: function(a) { return this.createElementNSPlus("sld:VendorOption", { attributes: { name: a.name }, value: a.value }) },
+ TextSymbolizer: function(a) { var b = OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld.TextSymbolizer.apply(this, arguments); !1 !== a.graphic && (a.externalGraphic || a.graphicName) && this.writeNode("Graphic", a, b); "priority" in a && this.writeNode("Priority", a.priority, b); return this.addVendorOptions(b, a) }, PointSymbolizer: function(a) { var b = OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld.PointSymbolizer.apply(this, arguments); return this.addVendorOptions(b, a) }, LineSymbolizer: function(a) {
+ var b = OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld.LineSymbolizer.apply(this,
+ arguments); return this.addVendorOptions(b, a)
+ }, PolygonSymbolizer: function(a) { var b = OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld.PolygonSymbolizer.apply(this, arguments); return this.addVendorOptions(b, a) }
+ }, OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld)
+ }, OpenLayers.Format.SLD.v1_0_0.prototype.writers), addVendorOptions: function(a, b) { if (b.vendorOptions) for (var c in b.vendorOptions) this.writeNode("VendorOption", { name: c, value: b.vendorOptions[c] }, a); return a }, CLASS_NAME: "OpenLayers.Format.SLD.v1_0_0_GeoServer"
+});
+OpenLayers.Layer.Boxes = OpenLayers.Class(OpenLayers.Layer.Markers, {
+ drawMarker: function(a) { var b = this.map.getLayerPxFromLonLat({ lon: a.bounds.left, lat: a.bounds.top }), c = this.map.getLayerPxFromLonLat({ lon: a.bounds.right, lat: a.bounds.bottom }); null == c || null == b ? a.display(!1) : (b = a.draw(b, { w: Math.max(1, c.x - b.x), h: Math.max(1, c.y - b.y) }), a.drawn || (this.div.appendChild(b), a.drawn = !0)) }, removeMarker: function(a) { OpenLayers.Util.removeItem(this.markers, a); null != a.div && a.div.parentNode == this.div && this.div.removeChild(a.div) },
+ CLASS_NAME: "OpenLayers.Layer.Boxes"
+});
+OpenLayers.Format.WFSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.WFSCapabilities.v1, {
+ readers: {
+ wfs: OpenLayers.Util.applyDefaults({
+ Service: function(a, b) { b.service = {}; this.readChildNodes(a, b.service) }, Fees: function(a, b) { var c = this.getChildValue(a); c && "none" != c.toLowerCase() && (b.fees = c) }, AccessConstraints: function(a, b) { var c = this.getChildValue(a); c && "none" != c.toLowerCase() && (b.accessConstraints = c) }, OnlineResource: function(a, b) {
+ var c = this.getChildValue(a); c && "none" != c.toLowerCase() && (b.onlineResource =
+ c)
+ }, Keywords: function(a, b) { var c = this.getChildValue(a); c && "none" != c.toLowerCase() && (b.keywords = c.split(", ")) }, Capability: function(a, b) { b.capability = {}; this.readChildNodes(a, b.capability) }, Request: function(a, b) { b.request = {}; this.readChildNodes(a, b.request) }, GetFeature: function(a, b) { b.getfeature = { href: {}, formats: [] }; this.readChildNodes(a, b.getfeature) }, ResultFormat: function(a, b) { for (var c = a.childNodes, d, e = 0; e < c.length; e++)d = c[e], 1 == d.nodeType && b.formats.push(d.nodeName) }, DCPType: function(a, b) {
+ this.readChildNodes(a,
+ b)
+ }, HTTP: function(a, b) { this.readChildNodes(a, b.href) }, Get: function(a, b) { b.get = a.getAttribute("onlineResource") }, Post: function(a, b) { b.post = a.getAttribute("onlineResource") }, SRS: function(a, b) { var c = this.getChildValue(a); c && (b.srs = c) }
+ }, OpenLayers.Format.WFSCapabilities.v1.prototype.readers.wfs)
+ }, CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1_0_0"
+});
+OpenLayers.Format.WMSCapabilities.v1_3 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1, {
+ readers: {
+ wms: OpenLayers.Util.applyDefaults({
+ WMS_Capabilities: function(a, b) { this.readChildNodes(a, b) }, LayerLimit: function(a, b) { b.layerLimit = parseInt(this.getChildValue(a)) }, MaxWidth: function(a, b) { b.maxWidth = parseInt(this.getChildValue(a)) }, MaxHeight: function(a, b) { b.maxHeight = parseInt(this.getChildValue(a)) }, BoundingBox: function(a, b) {
+ var c = OpenLayers.Format.WMSCapabilities.v1.prototype.readers.wms.BoundingBox.apply(this,
+ [a, b]); c.srs = a.getAttribute("CRS"); b.bbox[c.srs] = c
+ }, CRS: function(a, b) { this.readers.wms.SRS.apply(this, [a, b]) }, EX_GeographicBoundingBox: function(a, b) { b.llbbox = []; this.readChildNodes(a, b.llbbox) }, westBoundLongitude: function(a, b) { b[0] = this.getChildValue(a) }, eastBoundLongitude: function(a, b) { b[2] = this.getChildValue(a) }, southBoundLatitude: function(a, b) { b[1] = this.getChildValue(a) }, northBoundLatitude: function(a, b) { b[3] = this.getChildValue(a) }, MinScaleDenominator: function(a, b) { b.maxScale = parseFloat(this.getChildValue(a)).toPrecision(16) },
+ MaxScaleDenominator: function(a, b) { b.minScale = parseFloat(this.getChildValue(a)).toPrecision(16) }, Dimension: function(a, b) { var c = { name: a.getAttribute("name").toLowerCase(), units: a.getAttribute("units"), unitsymbol: a.getAttribute("unitSymbol"), nearestVal: "1" === a.getAttribute("nearestValue"), multipleVal: "1" === a.getAttribute("multipleValues"), "default": a.getAttribute("default") || "", current: "1" === a.getAttribute("current"), values: this.getChildValue(a).split(",") }; b.dimensions[c.name] = c }, Keyword: function(a,
+ b) { var c = { value: this.getChildValue(a), vocabulary: a.getAttribute("vocabulary") }; b.keywords && b.keywords.push(c) }
+ }, OpenLayers.Format.WMSCapabilities.v1.prototype.readers.wms), sld: {
+ UserDefinedSymbolization: function(a, b) { this.readers.wms.UserDefinedSymbolization.apply(this, [a, b]); b.userSymbols.inlineFeature = 1 == parseInt(a.getAttribute("InlineFeature")); b.userSymbols.remoteWCS = 1 == parseInt(a.getAttribute("RemoteWCS")) }, DescribeLayer: function(a, b) { this.readers.wms.DescribeLayer.apply(this, [a, b]) }, GetLegendGraphic: function(a,
+ b) { this.readers.wms.GetLegendGraphic.apply(this, [a, b]) }
+ }
+ }, CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_3"
+});
+OpenLayers.Layer.Zoomify = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ size: null, isBaseLayer: !0, standardTileSize: 256, tileOriginCorner: "tl", numberOfTiers: 0, tileCountUpToTier: null, tierSizeInTiles: null, tierImageSize: null, initialize: function(a, b, c, d) { this.initializeZoomify(c); OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a, b, c, {}, d]) }, initializeZoomify: function(a) {
+ var b = a.clone(); this.size = a.clone(); a = new OpenLayers.Size(Math.ceil(b.w / this.standardTileSize), Math.ceil(b.h / this.standardTileSize)); this.tierSizeInTiles =
+ [a]; for (this.tierImageSize = [b]; b.w > this.standardTileSize || b.h > this.standardTileSize;)b = new OpenLayers.Size(Math.floor(b.w / 2), Math.floor(b.h / 2)), a = new OpenLayers.Size(Math.ceil(b.w / this.standardTileSize), Math.ceil(b.h / this.standardTileSize)), this.tierSizeInTiles.push(a), this.tierImageSize.push(b); this.tierSizeInTiles.reverse(); this.tierImageSize.reverse(); this.numberOfTiers = this.tierSizeInTiles.length; b = [1]; this.tileCountUpToTier = [0]; for (a = 1; a < this.numberOfTiers; a++)b.unshift(Math.pow(2, a)), this.tileCountUpToTier.push(this.tierSizeInTiles[a -
+ 1].w * this.tierSizeInTiles[a - 1].h + this.tileCountUpToTier[a - 1]); this.serverResolutions || (this.serverResolutions = b)
+ }, destroy: function() { OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments); this.tileCountUpToTier.length = 0; this.tierSizeInTiles.length = 0; this.tierImageSize.length = 0 }, clone: function(a) { null == a && (a = new OpenLayers.Layer.Zoomify(this.name, this.url, this.size, this.options)); return OpenLayers.Layer.Grid.prototype.clone.apply(this, [a]) }, getURL: function(a) {
+ a = this.adjustBounds(a); var b = this.getServerResolution(),
+ c = Math.round((a.left - this.tileOrigin.lon) / (b * this.tileSize.w)); a = Math.round((this.tileOrigin.lat - a.top) / (b * this.tileSize.h)); b = this.getZoomForResolution(b); c = "TileGroup" + Math.floor((c + a * this.tierSizeInTiles[b].w + this.tileCountUpToTier[b]) / 256) + "/" + b + "-" + c + "-" + a + ".jpg"; b = this.url; OpenLayers.Util.isArray(b) && (b = this.selectUrl(c, b)); return b + c
+ }, getImageSize: function() {
+ if (0 < arguments.length) {
+ var a = this.adjustBounds(arguments[0]), b = this.getServerResolution(), c = Math.round((a.left - this.tileOrigin.lon) / (b *
+ this.tileSize.w)), a = Math.round((this.tileOrigin.lat - a.top) / (b * this.tileSize.h)), b = this.getZoomForResolution(b), d = this.standardTileSize, e = this.standardTileSize; c == this.tierSizeInTiles[b].w - 1 && (d = this.tierImageSize[b].w % this.standardTileSize); a == this.tierSizeInTiles[b].h - 1 && (e = this.tierImageSize[b].h % this.standardTileSize); return new OpenLayers.Size(d, e)
+ } return this.tileSize
+ }, setMap: function(a) {
+ OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments); this.tileOrigin = new OpenLayers.LonLat(this.map.maxExtent.left,
+ this.map.maxExtent.top)
+ }, CLASS_NAME: "OpenLayers.Layer.Zoomify"
+});
+OpenLayers.Layer.MapServer = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ DEFAULT_PARAMS: { mode: "map", map_imagetype: "png" }, initialize: function(a, b, c, d) { OpenLayers.Layer.Grid.prototype.initialize.apply(this, arguments); this.params = OpenLayers.Util.applyDefaults(this.params, this.DEFAULT_PARAMS); if (null == d || null == d.isBaseLayer) this.isBaseLayer = "true" != this.params.transparent && 1 != this.params.transparent }, clone: function(a) {
+ null == a && (a = new OpenLayers.Layer.MapServer(this.name, this.url, this.params, this.getOptions()));
+ return OpenLayers.Layer.Grid.prototype.clone.apply(this, [a])
+ }, getURL: function(a) { a = this.adjustBounds(a); a = [a.left, a.bottom, a.right, a.top]; var b = this.getImageSize(); return this.getFullRequestString({ mapext: a, imgext: a, map_size: [b.w, b.h], imgx: b.w / 2, imgy: b.h / 2, imgxy: [b.w, b.h] }) }, getFullRequestString: function(a, b) {
+ var c = null == b ? this.url : b, d = OpenLayers.Util.extend({}, this.params), d = OpenLayers.Util.extend(d, a), e = OpenLayers.Util.getParameterString(d); OpenLayers.Util.isArray(c) && (c = this.selectUrl(e, c)); var e =
+ OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(c)), f; for (f in d) f.toUpperCase() in e && delete d[f]; e = OpenLayers.Util.getParameterString(d); d = c; e = e.replace(/,/g, "+"); "" != e && (f = c.charAt(c.length - 1), d = "\x26" == f || "?" == f ? d + e : -1 == c.indexOf("?") ? d + ("?" + e) : d + ("\x26" + e)); return d
+ }, CLASS_NAME: "OpenLayers.Layer.MapServer"
+});
+OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
+ xmlns: "urn:schemas-microsoft-com:vml", symbolCache: {}, offset: null, initialize: function(a) {
+ if (this.supported()) {
+ if (!document.namespaces.olv) { document.namespaces.add("olv", this.xmlns); for (var b = document.createStyleSheet(), c = "shape rect oval fill stroke imagedata group textbox".split(" "), d = 0, e = c.length; d < e; d++)b.addRule("olv\\:" + c[d], "behavior: url(#default#VML); position: absolute; display: inline-block;") } OpenLayers.Renderer.Elements.prototype.initialize.apply(this,
+ arguments)
+ }
+ }, supported: function() { return !!document.namespaces }, setExtent: function(a, b) { var c = OpenLayers.Renderer.Elements.prototype.setExtent.apply(this, arguments), d = this.getResolution(), e = a.left / d | 0, d = a.top / d - this.size.h | 0; b || !this.offset ? (this.offset = { x: e, y: d }, d = e = 0) : (e -= this.offset.x, d -= this.offset.y); this.root.coordorigin = e - this.xOffset + " " + d; for (var e = [this.root, this.vectorRoot, this.textRoot], f = 0, g = e.length; f < g; ++f)d = e[f], d.coordsize = this.size.w + " " + this.size.h; this.root.style.flip = "y"; return c },
+ setSize: function(a) { OpenLayers.Renderer.prototype.setSize.apply(this, arguments); for (var b = [this.rendererRoot, this.root, this.vectorRoot, this.textRoot], c = this.size.w + "px", d = this.size.h + "px", e, f = 0, g = b.length; f < g; ++f)e = b[f], e.style.width = c, e.style.height = d }, getNodeType: function(a, b) {
+ var c = null; switch (a.CLASS_NAME) {
+ case "OpenLayers.Geometry.Point": c = b.externalGraphic ? "olv:rect" : this.isComplexSymbol(b.graphicName) ? "olv:shape" : "olv:oval"; break; case "OpenLayers.Geometry.Rectangle": c = "olv:rect"; break; case "OpenLayers.Geometry.LineString": case "OpenLayers.Geometry.LinearRing": case "OpenLayers.Geometry.Polygon": case "OpenLayers.Geometry.Curve": c =
+ "olv:shape"
+ }return c
+ }, setStyle: function(a, b, c, d) {
+ b = b || a._style; c = c || a._options; var e = b.fillColor, f = b.title || b.graphicTitle; f && (a.title = f); if ("OpenLayers.Geometry.Point" === a._geometryClass) if (b.externalGraphic) {
+ c.isFilled = !0; var e = b.graphicWidth || b.graphicHeight, f = b.graphicHeight || b.graphicWidth, e = e ? e : 2 * b.pointRadius, f = f ? f : 2 * b.pointRadius, g = this.getResolution(), h = void 0 != b.graphicXOffset ? b.graphicXOffset : -(.5 * e), k = void 0 != b.graphicYOffset ? b.graphicYOffset : -(.5 * f); a.style.left = ((d.x - this.featureDx) /
+ g - this.offset.x + h | 0) + "px"; a.style.top = (d.y / g - this.offset.y - (k + f) | 0) + "px"; a.style.width = e + "px"; a.style.height = f + "px"; a.style.flip = "y"; e = "none"; c.isStroked = !1
+ } else this.isComplexSymbol(b.graphicName) ? (f = this.importSymbol(b.graphicName), a.path = f.path, a.coordorigin = f.left + "," + f.bottom, f = f.size, a.coordsize = f + "," + f, this.drawCircle(a, d, b.pointRadius), a.style.flip = "y") : this.drawCircle(a, d, b.pointRadius); c.isFilled ? a.fillcolor = e : a.filled = "false"; d = a.getElementsByTagName("fill"); d = 0 == d.length ? null : d[0]; c.isFilled ?
+ (d || (d = this.createNode("olv:fill", a.id + "_fill")), d.opacity = b.fillOpacity, "OpenLayers.Geometry.Point" === a._geometryClass && b.externalGraphic && (b.graphicOpacity && (d.opacity = b.graphicOpacity), d.src = b.externalGraphic, d.type = "frame", b.graphicWidth && b.graphicHeight || (d.aspect = "atmost")), d.parentNode != a && a.appendChild(d)) : d && a.removeChild(d); e = b.rotation; if (void 0 !== e || void 0 !== a._rotation) a._rotation = e, b.externalGraphic ? (this.graphicRotate(a, h, k, b), d.opacity = 0) : "OpenLayers.Geometry.Point" === a._geometryClass &&
+ (a.style.rotation = e || 0); h = a.getElementsByTagName("stroke"); h = 0 == h.length ? null : h[0]; c.isStroked ? (h || (h = this.createNode("olv:stroke", a.id + "_stroke"), a.appendChild(h)), h.on = !0, h.color = b.strokeColor, h.weight = b.strokeWidth + "px", h.opacity = b.strokeOpacity, h.endcap = "butt" == b.strokeLinecap ? "flat" : b.strokeLinecap || "round", b.strokeDashstyle && (h.dashstyle = this.dashStyle(b))) : (a.stroked = !1, h && (h.on = !1)); "inherit" != b.cursor && null != b.cursor && (a.style.cursor = b.cursor); return a
+ }, graphicRotate: function(a, b, c, d) {
+ d =
+ d || a._style; var e = d.rotation || 0, f, g; if (d.graphicWidth && d.graphicHeight) {
+ g = Math.max(d.graphicWidth, d.graphicHeight); f = d.graphicWidth / d.graphicHeight; var h = Math.round(d.graphicWidth || g * f), k = Math.round(d.graphicHeight || g); a.style.width = h + "px"; a.style.height = k + "px"; var l = document.getElementById(a.id + "_image"); l || (l = this.createNode("olv:imagedata", a.id + "_image"), a.appendChild(l)); l.style.width = h + "px"; l.style.height = k + "px"; l.src = d.externalGraphic; l.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src\x3d'', sizingMethod\x3d'scale')";
+ l = e * Math.PI / 180; e = Math.sin(l); l = Math.cos(l); e = "progid:DXImageTransform.Microsoft.Matrix(M11\x3d" + l + ",M12\x3d" + -e + ",M21\x3d" + e + ",M22\x3d" + l + ",SizingMethod\x3d'auto expand')\n"; (l = d.graphicOpacity || d.fillOpacity) && 1 != l && (e += "progid:DXImageTransform.Microsoft.BasicImage(opacity\x3d" + l + ")\n"); a.style.filter = e; e = new OpenLayers.Geometry.Point(-b, -c); h = (new OpenLayers.Bounds(0, 0, h, k)).toGeometry(); h.rotate(d.rotation, e); h = h.getBounds(); a.style.left = Math.round(parseInt(a.style.left) + h.left) + "px"; a.style.top =
+ Math.round(parseInt(a.style.top) - h.bottom) + "px"
+ } else { var m = new Image; m.onreadystatechange = OpenLayers.Function.bind(function() { if ("complete" == m.readyState || "interactive" == m.readyState) f = m.width / m.height, g = Math.max(2 * d.pointRadius, d.graphicWidth || 0, d.graphicHeight || 0), b *= f, d.graphicWidth = g * f, d.graphicHeight = g, this.graphicRotate(a, b, c, d) }, this); m.src = d.externalGraphic }
+ }, postDraw: function(a) {
+ a.style.visibility = "visible"; var b = a._style.fillColor, c = a._style.strokeColor; "none" == b && a.fillcolor != b && (a.fillcolor =
+ b); "none" == c && a.strokecolor != c && (a.strokecolor = c)
+ }, setNodeDimension: function(a, b) { var c = b.getBounds(); if (c) { var d = this.getResolution(), c = new OpenLayers.Bounds((c.left - this.featureDx) / d - this.offset.x | 0, c.bottom / d - this.offset.y | 0, (c.right - this.featureDx) / d - this.offset.x | 0, c.top / d - this.offset.y | 0); a.style.left = c.left + "px"; a.style.top = c.top + "px"; a.style.width = c.getWidth() + "px"; a.style.height = c.getHeight() + "px"; a.coordorigin = c.left + " " + c.top; a.coordsize = c.getWidth() + " " + c.getHeight() } }, dashStyle: function(a) {
+ a =
+ a.strokeDashstyle; switch (a) { case "solid": case "dot": case "dash": case "dashdot": case "longdash": case "longdashdot": return a; default: return a = a.split(/[ ,]/), 2 == a.length ? 1 * a[0] >= 2 * a[1] ? "longdash" : 1 == a[0] || 1 == a[1] ? "dot" : "dash" : 4 == a.length ? 1 * a[0] >= 2 * a[1] ? "longdashdot" : "dashdot" : "solid" }
+ }, createNode: function(a, b) { var c = document.createElement(a); b && (c.id = b); c.unselectable = "on"; c.onselectstart = OpenLayers.Function.False; return c }, nodeTypeCompare: function(a, b) {
+ var c = b, d = c.indexOf(":"); -1 != d && (c = c.substr(d +
+ 1)); var e = a.nodeName, d = e.indexOf(":"); -1 != d && (e = e.substr(d + 1)); return c == e
+ }, createRenderRoot: function() { return this.nodeFactory(this.container.id + "_vmlRoot", "div") }, createRoot: function(a) { return this.nodeFactory(this.container.id + a, "olv:group") }, drawPoint: function(a, b) { return this.drawCircle(a, b, 1) }, drawCircle: function(a, b, c) {
+ if (!isNaN(b.x) && !isNaN(b.y)) {
+ var d = this.getResolution(); a.style.left = ((b.x - this.featureDx) / d - this.offset.x | 0) - c + "px"; a.style.top = (b.y / d - this.offset.y | 0) - c + "px"; b = 2 * c; a.style.width =
+ b + "px"; a.style.height = b + "px"; return a
+ } return !1
+ }, drawLineString: function(a, b) { return this.drawLine(a, b, !1) }, drawLinearRing: function(a, b) { return this.drawLine(a, b, !0) }, drawLine: function(a, b, c) { this.setNodeDimension(a, b); for (var d = this.getResolution(), e = b.components.length, f = Array(e), g, h, k = 0; k < e; k++)g = b.components[k], h = (g.x - this.featureDx) / d - this.offset.x | 0, g = g.y / d - this.offset.y | 0, f[k] = " " + h + "," + g + " l "; b = c ? " x e" : " e"; a.path = "m" + f.join("") + b; return a }, drawPolygon: function(a, b) {
+ this.setNodeDimension(a,
+ b); var c = this.getResolution(), d = [], e, f, g, h, k, l, m, n, p, q; e = 0; for (f = b.components.length; e < f; e++) { d.push("m"); g = b.components[e].components; h = 0 === e; l = k = null; m = 0; for (n = g.length; m < n; m++)p = g[m], q = (p.x - this.featureDx) / c - this.offset.x | 0, p = p.y / c - this.offset.y | 0, q = " " + q + "," + p, d.push(q), 0 == m && d.push(" l"), h || (k ? k != q && (l ? l != q && (h = !0) : l = q) : k = q); d.push(h ? " x " : " ") } d.push("e"); a.path = d.join(""); return a
+ }, drawRectangle: function(a, b) {
+ var c = this.getResolution(); a.style.left = ((b.x - this.featureDx) / c - this.offset.x | 0) +
+ "px"; a.style.top = (b.y / c - this.offset.y | 0) + "px"; a.style.width = (b.width / c | 0) + "px"; a.style.height = (b.height / c | 0) + "px"; return a
+ }, drawText: function(a, b, c) {
+ var d = this.nodeFactory(a + this.LABEL_ID_SUFFIX, "olv:rect"), e = this.nodeFactory(a + this.LABEL_ID_SUFFIX + "_textbox", "olv:textbox"), f = this.getResolution(); d.style.left = ((c.x - this.featureDx) / f - this.offset.x | 0) + "px"; d.style.top = (c.y / f - this.offset.y | 0) + "px"; d.style.flip = "y"; e.innerText = b.label; "inherit" != b.cursor && null != b.cursor && (e.style.cursor = b.cursor); b.fontColor &&
+ (e.style.color = b.fontColor); b.fontOpacity && (e.style.filter = "alpha(opacity\x3d" + 100 * b.fontOpacity + ")"); b.fontFamily && (e.style.fontFamily = b.fontFamily); b.fontSize && (e.style.fontSize = b.fontSize); b.fontWeight && (e.style.fontWeight = b.fontWeight); b.fontStyle && (e.style.fontStyle = b.fontStyle); !0 === b.labelSelect && (d._featureId = a, e._featureId = a, e._geometry = c, e._geometryClass = c.CLASS_NAME); e.style.whiteSpace = "nowrap"; e.inset = "1px,0px,0px,0px"; d.parentNode || (d.appendChild(e), this.textRoot.appendChild(d)); b = b.labelAlign ||
+ "cm"; 1 == b.length && (b += "m"); a = e.clientWidth * OpenLayers.Renderer.VML.LABEL_SHIFT[b.substr(0, 1)]; e = e.clientHeight * OpenLayers.Renderer.VML.LABEL_SHIFT[b.substr(1, 1)]; d.style.left = parseInt(d.style.left) - a - 1 + "px"; d.style.top = parseInt(d.style.top) + e + "px"
+ }, moveRoot: function(a) { var b = this.map.getLayer(a.container.id); b instanceof OpenLayers.Layer.Vector.RootContainer && (b = this.map.getLayer(this.container.id)); b && b.renderer.clear(); OpenLayers.Renderer.Elements.prototype.moveRoot.apply(this, arguments); b && b.redraw() },
+ importSymbol: function(a) {
+ var b = this.container.id + "-" + a, c = this.symbolCache[b]; if (c) return c; c = OpenLayers.Renderer.symbol[a]; if (!c) throw Error(a + " is not a valid symbol name"); a = new OpenLayers.Bounds(Number.MAX_VALUE, Number.MAX_VALUE, 0, 0); for (var d = ["m"], e = 0; e < c.length; e += 2) { var f = c[e], g = c[e + 1]; a.left = Math.min(a.left, f); a.bottom = Math.min(a.bottom, g); a.right = Math.max(a.right, f); a.top = Math.max(a.top, g); d.push(f); d.push(g); 0 == e && d.push("l") } d.push("x e"); c = d.join(" "); d = (a.getWidth() - a.getHeight()) / 2;
+ 0 < d ? (a.bottom -= d, a.top += d) : (a.left += d, a.right -= d); c = { path: c, size: a.getWidth(), left: a.left, bottom: a.bottom }; return this.symbolCache[b] = c
+ }, CLASS_NAME: "OpenLayers.Renderer.VML"
+}); OpenLayers.Renderer.VML.LABEL_SHIFT = { l: 0, c: .5, r: 1, t: 0, m: .5, b: 1 };
+OpenLayers.Control.CacheRead = OpenLayers.Class(OpenLayers.Control, {
+ fetchEvent: "tileloadstart", layers: null, autoActivate: !0, setMap: function(a) { OpenLayers.Control.prototype.setMap.apply(this, arguments); var b, c = this.layers || a.layers; for (b = c.length - 1; 0 <= b; --b)this.addLayer({ layer: c[b] }); if (!this.layers) a.events.on({ addlayer: this.addLayer, removeLayer: this.removeLayer, scope: this }) }, addLayer: function(a) { a.layer.events.register(this.fetchEvent, this, this.fetch) }, removeLayer: function(a) {
+ a.layer.events.unregister(this.fetchEvent,
+ this, this.fetch)
+ }, fetch: function(a) { if (this.active && window.localStorage && a.tile instanceof OpenLayers.Tile.Image) { var b = a.tile, c = b.url; !b.layer.crossOriginKeyword && OpenLayers.ProxyHost && 0 === c.indexOf(OpenLayers.ProxyHost) && (c = OpenLayers.Control.CacheWrite.urlMap[c]); if (c = window.localStorage.getItem("olCache_" + c)) b.url = c, "tileerror" === a.type && b.setImgSrc(c) } }, destroy: function() {
+ if (this.layers || this.map) { var a, b = this.layers || this.map.layers; for (a = b.length - 1; 0 <= a; --a)this.removeLayer({ layer: b[a] }) } this.map &&
+ this.map.events.un({ addlayer: this.addLayer, removeLayer: this.removeLayer, scope: this }); OpenLayers.Control.prototype.destroy.apply(this, arguments)
+ }, CLASS_NAME: "OpenLayers.Control.CacheRead"
+}); OpenLayers.Protocol.WFS.v1_0_0 = OpenLayers.Class(OpenLayers.Protocol.WFS.v1, { version: "1.0.0", CLASS_NAME: "OpenLayers.Protocol.WFS.v1_0_0" });
+OpenLayers.Format.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Format.XML, {
+ layerIdentifier: "_layer", featureIdentifier: "_feature", regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, gmlFormat: null, read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); var b = a.documentElement; if (b) { var c = this["read_" + b.nodeName]; a = c ? c.call(this, b) : (new OpenLayers.Format.GML(this.options ? this.options : {})).read(a) } return a }, read_msGMLOutput: function(a) {
+ var b =
+ []; if (a = this.getSiblingNodesByTagCriteria(a, this.layerIdentifier)) for (var c = 0, d = a.length; c < d; ++c) { var e = a[c], f = e.nodeName; e.prefix && (f = f.split(":")[1]); f = f.replace(this.layerIdentifier, ""); if (e = this.getSiblingNodesByTagCriteria(e, this.featureIdentifier)) for (var g = 0; g < e.length; g++) { var h = e[g], k = this.parseGeometry(h), h = this.parseAttributes(h), h = new OpenLayers.Feature.Vector(k.geometry, h, null); h.bounds = k.bounds; h.type = f; b.push(h) } } return b
+ }, read_FeatureInfoResponse: function(a) {
+ var b = []; a = this.getElementsByTagNameNS(a,
+ "*", "FIELDS"); for (var c = 0, d = a.length; c < d; c++) { var e = a[c], f = {}, g, h = e.attributes.length; if (0 < h) for (g = 0; g < h; g++) { var k = e.attributes[g]; f[k.nodeName] = k.nodeValue } else for (e = e.childNodes, g = 0, h = e.length; g < h; ++g)k = e[g], 3 != k.nodeType && (f[k.getAttribute("name")] = k.getAttribute("value")); b.push(new OpenLayers.Feature.Vector(null, f, null)) } return b
+ }, getSiblingNodesByTagCriteria: function(a, b) {
+ var c = [], d, e, f, g; if (a && a.hasChildNodes()) {
+ d = a.childNodes; f = d.length; for (var h = 0; h < f; h++) {
+ for (g = d[h]; g && 1 != g.nodeType;)g =
+ g.nextSibling, h++; e = g ? g.nodeName : ""; 0 < e.length && -1 < e.indexOf(b) ? c.push(g) : (e = this.getSiblingNodesByTagCriteria(g, b), 0 < e.length && (0 == c.length ? c = e : c.push(e)))
+ }
+ } return c
+ }, parseAttributes: function(a) { var b = {}; if (1 == a.nodeType) { a = a.childNodes; for (var c = a.length, d = 0; d < c; ++d) { var e = a[d]; if (1 == e.nodeType) { var f = e.childNodes, e = e.prefix ? e.nodeName.split(":")[1] : e.nodeName; 0 == f.length ? b[e] = null : 1 == f.length && (f = f[0], 3 == f.nodeType || 4 == f.nodeType) && (f = f.nodeValue.replace(this.regExes.trimSpace, ""), b[e] = f) } } } return b },
+ parseGeometry: function(a) { this.gmlFormat || (this.gmlFormat = new OpenLayers.Format.GML); a = this.gmlFormat.parseFeature(a); var b, c = null; a && (b = a.geometry && a.geometry.clone(), c = a.bounds && a.bounds.clone(), a.destroy()); return { geometry: b, bounds: c } }, CLASS_NAME: "OpenLayers.Format.WMSGetFeatureInfo"
+});
+OpenLayers.Control.WMTSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
+ hover: !1, requestEncoding: "KVP", drillDown: !1, maxFeatures: 10, clickCallback: "click", layers: null, queryVisible: !0, infoFormat: "text/html", vendorParams: {}, format: null, formatOptions: null, handler: null, hoverRequest: null, pending: 0, initialize: function(a) {
+ a = a || {}; a.handlerOptions = a.handlerOptions || {}; OpenLayers.Control.prototype.initialize.apply(this, [a]); this.format || (this.format = new OpenLayers.Format.WMSGetFeatureInfo(a.formatOptions));
+ !0 === this.drillDown && (this.hover = !1); this.hover ? this.handler = new OpenLayers.Handler.Hover(this, { move: this.cancelHover, pause: this.getInfoForHover }, OpenLayers.Util.extend(this.handlerOptions.hover || {}, { delay: 250 })) : (a = {}, a[this.clickCallback] = this.getInfoForClick, this.handler = new OpenLayers.Handler.Click(this, a, this.handlerOptions.click || {}))
+ }, getInfoForClick: function(a) { this.request(a.xy, {}) }, getInfoForHover: function(a) { this.request(a.xy, { hover: !0 }) }, cancelHover: function() {
+ this.hoverRequest && (--this.pending,
+ 0 >= this.pending && (OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait"), this.pending = 0), this.hoverRequest.abort(), this.hoverRequest = null)
+ }, findLayers: function() { for (var a = this.layers || this.map.layers, b = [], c, d = a.length - 1; 0 <= d && (c = a[d], !(c instanceof OpenLayers.Layer.WMTS) || c.requestEncoding !== this.requestEncoding || this.queryVisible && !c.getVisibility() || (b.push(c), this.drillDown && !this.hover)); --d); return b }, buildRequestOptions: function(a, b) {
+ var c = this.map.getLonLatFromPixel(b), d = a.getURL(new OpenLayers.Bounds(c.lon,
+ c.lat, c.lon, c.lat)), d = OpenLayers.Util.getParameters(d), c = a.getTileInfo(c); OpenLayers.Util.extend(d, { service: "WMTS", version: a.version, request: "GetFeatureInfo", infoFormat: this.infoFormat, i: c.i, j: c.j }); OpenLayers.Util.applyDefaults(d, this.vendorParams); return { url: OpenLayers.Util.isArray(a.url) ? a.url[0] : a.url, params: OpenLayers.Util.upperCaseObject(d), callback: function(c) { this.handleResponse(b, c, a) }, scope: this }
+ }, request: function(a, b) {
+ b = b || {}; var c = this.findLayers(); if (0 < c.length) {
+ for (var d, e, f = 0, g = c.length; f <
+ g; f++)e = c[f], d = this.events.triggerEvent("beforegetfeatureinfo", { xy: a, layer: e }), !1 !== d && (++this.pending, d = this.buildRequestOptions(e, a), d = OpenLayers.Request.GET(d), !0 === b.hover && (this.hoverRequest = d)); 0 < this.pending && OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait")
+ }
+ }, handleResponse: function(a, b, c) {
+ --this.pending; 0 >= this.pending && (OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait"), this.pending = 0); if (b.status && (200 > b.status || 300 <= b.status)) this.events.triggerEvent("exception",
+ { xy: a, request: b, layer: c }); else { var d = b.responseXML; d && d.documentElement || (d = b.responseText); var e, f; try { e = this.format.read(d) } catch (g) { f = !0, this.events.triggerEvent("exception", { xy: a, request: b, error: g, layer: c }) } f || this.events.triggerEvent("getfeatureinfo", { text: b.responseText, features: e, request: b, xy: a, layer: c }) }
+ }, CLASS_NAME: "OpenLayers.Control.WMTSGetFeatureInfo"
+});
+OpenLayers.Protocol.CSW.v2_0_2 = OpenLayers.Class(OpenLayers.Protocol, {
+ formatOptions: null, initialize: function(a) { OpenLayers.Protocol.prototype.initialize.apply(this, [a]); a.format || (this.format = new OpenLayers.Format.CSWGetRecords.v2_0_2(OpenLayers.Util.extend({}, this.formatOptions))) }, destroy: function() { this.options && !this.options.format && this.format.destroy(); this.format = null; OpenLayers.Protocol.prototype.destroy.apply(this) }, read: function(a) {
+ a = OpenLayers.Util.extend({}, a); OpenLayers.Util.applyDefaults(a,
+ this.options || {}); var b = new OpenLayers.Protocol.Response({ requestType: "read" }), c = this.format.write(a.params || a); b.priv = OpenLayers.Request.POST({ url: a.url, callback: this.createCallback(this.handleRead, b, a), params: a.params, headers: a.headers, data: c }); return b
+ }, handleRead: function(a, b) { if (b.callback) { var c = a.priv; 200 <= c.status && 300 > c.status ? (a.data = this.parseData(c), a.code = OpenLayers.Protocol.Response.SUCCESS) : a.code = OpenLayers.Protocol.Response.FAILURE; b.callback.call(b.scope, a) } }, parseData: function(a) {
+ var b =
+ a.responseXML; b && b.documentElement || (b = a.responseText); return !b || 0 >= b.length ? null : this.format.read(b)
+ }, CLASS_NAME: "OpenLayers.Protocol.CSW.v2_0_2"
+});
+OpenLayers.Format.WCSCapabilities.v1_1_0 = OpenLayers.Class(OpenLayers.Format.WCSCapabilities.v1, {
+ namespaces: { wcs: "http://www.opengis.net/wcs/1.1", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance", ows: "http://www.opengis.net/ows/1.1" }, errorProperty: "operationsMetadata", readers: {
+ wcs: OpenLayers.Util.applyDefaults({
+ Capabilities: function(a, b) { this.readChildNodes(a, b) }, Contents: function(a, b) { b.contentMetadata = []; this.readChildNodes(a, b.contentMetadata) }, CoverageSummary: function(a,
+ b) { var c = {}; this.readChildNodes(a, c); b.push(c) }, Identifier: function(a, b) { b.identifier = this.getChildValue(a) }, Title: function(a, b) { b.title = this.getChildValue(a) }, Abstract: function(a, b) { b["abstract"] = this.getChildValue(a) }, SupportedCRS: function(a, b) { var c = this.getChildValue(a); c && (b.supportedCRS || (b.supportedCRS = []), b.supportedCRS.push(c)) }, SupportedFormat: function(a, b) { var c = this.getChildValue(a); c && (b.supportedFormat || (b.supportedFormat = []), b.supportedFormat.push(c)) }
+ }, OpenLayers.Format.WCSCapabilities.v1.prototype.readers.wcs),
+ ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+ }, CLASS_NAME: "OpenLayers.Format.WCSCapabilities.v1_1_0"
+});
+OpenLayers.Control.Graticule = OpenLayers.Class(OpenLayers.Control, {
+ autoActivate: !0, intervals: [45, 30, 20, 10, 5, 2, 1, .5, .2, .1, .05, .01, .005, .002, .001], displayInLayerSwitcher: !0, visible: !0, numPoints: 50, targetSize: 200, layerName: null, labelled: !0, labelFormat: "dm", lineSymbolizer: { strokeColor: "#333", strokeWidth: 1, strokeOpacity: .5 }, labelSymbolizer: {}, gratLayer: null, initialize: function(a) {
+ a = a || {}; a.layerName = a.layerName || OpenLayers.i18n("Graticule"); OpenLayers.Control.prototype.initialize.apply(this, [a]); this.labelSymbolizer.stroke =
+ !1; this.labelSymbolizer.fill = !1; this.labelSymbolizer.label = "${label}"; this.labelSymbolizer.labelAlign = "${labelAlign}"; this.labelSymbolizer.labelXOffset = "${xOffset}"; this.labelSymbolizer.labelYOffset = "${yOffset}"
+ }, destroy: function() { this.deactivate(); OpenLayers.Control.prototype.destroy.apply(this, arguments); this.gratLayer && (this.gratLayer.destroy(), this.gratLayer = null) }, draw: function() {
+ OpenLayers.Control.prototype.draw.apply(this, arguments); if (!this.gratLayer) {
+ var a = new OpenLayers.Style({}, {
+ rules: [new OpenLayers.Rule({
+ symbolizer: {
+ Point: this.labelSymbolizer,
+ Line: this.lineSymbolizer
+ }
+ })]
+ }); this.gratLayer = new OpenLayers.Layer.Vector(this.layerName, { styleMap: new OpenLayers.StyleMap({ "default": a }), visibility: this.visible, displayInLayerSwitcher: this.displayInLayerSwitcher })
+ } return this.div
+ }, activate: function() { return OpenLayers.Control.prototype.activate.apply(this, arguments) ? (this.map.addLayer(this.gratLayer), this.map.events.register("moveend", this, this.update), this.update(), !0) : !1 }, deactivate: function() {
+ return OpenLayers.Control.prototype.deactivate.apply(this,
+ arguments) ? (this.map.events.unregister("moveend", this, this.update), this.map.removeLayer(this.gratLayer), !0) : !1
+ }, update: function() {
+ var a = this.map.getExtent(); if (a) {
+ this.gratLayer.destroyFeatures(); var b = new OpenLayers.Projection("EPSG:4326"), c = this.map.getProjectionObject(), d = this.map.getResolution(); c.proj && "longlat" == c.proj.projName && (this.numPoints = 1); var e = this.map.getCenter(), f = new OpenLayers.Pixel(e.lon, e.lat); OpenLayers.Projection.transform(f, c, b); for (var e = this.targetSize * d, e = e * e, g, d = 0; d < this.intervals.length; ++d) {
+ g =
+ this.intervals[d]; var h = g / 2, k = f.offset({ x: -h, y: -h }), h = f.offset({ x: h, y: h }); OpenLayers.Projection.transform(k, b, c); OpenLayers.Projection.transform(h, b, c); if ((k.x - h.x) * (k.x - h.x) + (k.y - h.y) * (k.y - h.y) <= e) break
+ } f.x = Math.floor(f.x / g) * g; f.y = Math.floor(f.y / g) * g; var d = 0, e = [f.clone()], h = f.clone(), l; do h = h.offset({ x: 0, y: g }), l = OpenLayers.Projection.transform(h.clone(), b, c), e.unshift(h); while (a.containsPixel(l) && 1E3 > ++d); h = f.clone(); do h = h.offset({ x: 0, y: -g }), l = OpenLayers.Projection.transform(h.clone(), b, c), e.push(h);
+ while (a.containsPixel(l) && 1E3 > ++d); d = 0; k = [f.clone()]; h = f.clone(); do h = h.offset({ x: -g, y: 0 }), l = OpenLayers.Projection.transform(h.clone(), b, c), k.unshift(h); while (a.containsPixel(l) && 1E3 > ++d); h = f.clone(); do h = h.offset({ x: g, y: 0 }), l = OpenLayers.Projection.transform(h.clone(), b, c), k.push(h); while (a.containsPixel(l) && 1E3 > ++d); g = []; for (d = 0; d < k.length; ++d) {
+ l = k[d].x; for (var f = [], m = null, n = Math.min(e[0].y, 90), h = Math.max(e[e.length - 1].y, -90), p = (n - h) / this.numPoints, n = h, h = 0; h <= this.numPoints; ++h) {
+ var q = new OpenLayers.Geometry.Point(l,
+ n); q.transform(b, c); f.push(q); n += p; q.y >= a.bottom && !m && (m = q)
+ } this.labelled && (m = new OpenLayers.Geometry.Point(m.x, a.bottom), l = { value: l, label: this.labelled ? OpenLayers.Util.getFormattedLonLat(l, "lon", this.labelFormat) : "", labelAlign: "cb", xOffset: 0, yOffset: 2 }, this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(m, l))); f = new OpenLayers.Geometry.LineString(f); g.push(new OpenLayers.Feature.Vector(f))
+ } for (h = 0; h < e.length; ++h)if (n = e[h].y, !(-90 > n || 90 < n)) {
+ f = []; d = k[0].x; p = (k[k.length - 1].x - d) / this.numPoints;
+ l = d; m = null; for (d = 0; d <= this.numPoints; ++d)q = new OpenLayers.Geometry.Point(l, n), q.transform(b, c), f.push(q), l += p, q.x < a.right && (m = q); this.labelled && (m = new OpenLayers.Geometry.Point(a.right, m.y), l = { value: n, label: this.labelled ? OpenLayers.Util.getFormattedLonLat(n, "lat", this.labelFormat) : "", labelAlign: "rb", xOffset: -2, yOffset: 2 }, this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(m, l))); f = new OpenLayers.Geometry.LineString(f); g.push(new OpenLayers.Feature.Vector(f))
+ } this.gratLayer.addFeatures(g)
+ }
+ }, CLASS_NAME: "OpenLayers.Control.Graticule"
+});
+OpenLayers.Console.warn("OpenLayers.Rico is deprecated"); OpenLayers.Rico = OpenLayers.Rico || {};
+OpenLayers.Rico.Corner = {
+ round: function(a, b) { a = OpenLayers.Util.getElement(a); this._setOptions(b); var c = this.options.color; "fromElement" == this.options.color && (c = this._background(a)); var d = this.options.bgColor; "fromParent" == this.options.bgColor && (d = this._background(a.offsetParent)); this._roundCornersImpl(a, c, d) }, changeColor: function(a, b) { a.style.backgroundColor = b; for (var c = a.parentNode.getElementsByTagName("span"), d = 0; d < c.length; d++)c[d].style.backgroundColor = b }, changeOpacity: function(a, b) {
+ var c = "alpha(opacity\x3d" +
+ 100 * b + ")"; a.style.opacity = b; a.style.filter = c; for (var d = a.parentNode.getElementsByTagName("span"), e = 0; e < d.length; e++)d[e].style.opacity = b, d[e].style.filter = c
+ }, reRound: function(a, b) { var c = a.parentNode.childNodes[2]; a.parentNode.removeChild(a.parentNode.childNodes[0]); a.parentNode.removeChild(c); this.round(a.parentNode, b) }, _roundCornersImpl: function(a, b, c) {
+ this.options.border && this._renderBorder(a, c); this._isTopRounded() && this._roundTopCorners(a, b, c); this._isBottomRounded() && this._roundBottomCorners(a,
+ b, c)
+ }, _renderBorder: function(a, b) { var c = "1px solid " + this._borderColor(b); a.innerHTML = "\x3cdiv " + ("style\x3d'border-left: " + c + ";" + ("border-right: " + c) + "'") + "\x3e" + a.innerHTML + "\x3c/div\x3e" }, _roundTopCorners: function(a, b, c) { for (var d = this._createCorner(c), e = 0; e < this.options.numSlices; e++)d.appendChild(this._createCornerSlice(b, c, e, "top")); a.style.paddingTop = 0; a.insertBefore(d, a.firstChild) }, _roundBottomCorners: function(a, b, c) {
+ for (var d = this._createCorner(c), e = this.options.numSlices - 1; 0 <= e; e--)d.appendChild(this._createCornerSlice(b,
+ c, e, "bottom")); a.style.paddingBottom = 0; a.appendChild(d)
+ }, _createCorner: function(a) { var b = document.createElement("div"); b.style.backgroundColor = this._isTransparent() ? "transparent" : a; return b }, _createCornerSlice: function(a, b, c, d) {
+ var e = document.createElement("span"), f = e.style; f.backgroundColor = a; f.display = "block"; f.height = "1px"; f.overflow = "hidden"; f.fontSize = "1px"; a = this._borderColor(a, b); this.options.border && 0 == c ? (f.borderTopStyle = "solid", f.borderTopWidth = "1px", f.borderLeftWidth = "0px", f.borderRightWidth =
+ "0px", f.borderBottomWidth = "0px", f.height = "0px", f.borderColor = a) : a && (f.borderColor = a, f.borderStyle = "solid", f.borderWidth = "0px 1px"); this.options.compact || c != this.options.numSlices - 1 || (f.height = "2px"); this._setMargin(e, c, d); this._setBorder(e, c, d); return e
+ }, _setOptions: function(a) {
+ this.options = { corners: "all", color: "fromElement", bgColor: "fromParent", blend: !0, border: !1, compact: !1 }; OpenLayers.Util.extend(this.options, a || {}); this.options.numSlices = this.options.compact ? 2 : 4; this._isTransparent() && (this.options.blend =
+ !1)
+ }, _whichSideTop: function() { return this._hasString(this.options.corners, "all", "top") || 0 <= this.options.corners.indexOf("tl") && 0 <= this.options.corners.indexOf("tr") ? "" : 0 <= this.options.corners.indexOf("tl") ? "left" : 0 <= this.options.corners.indexOf("tr") ? "right" : "" }, _whichSideBottom: function() {
+ return this._hasString(this.options.corners, "all", "bottom") || 0 <= this.options.corners.indexOf("bl") && 0 <= this.options.corners.indexOf("br") ? "" : 0 <= this.options.corners.indexOf("bl") ? "left" : 0 <= this.options.corners.indexOf("br") ?
+ "right" : ""
+ }, _borderColor: function(a, b) { return "transparent" == a ? b : this.options.border ? this.options.border : this.options.blend ? this._blend(b, a) : "" }, _setMargin: function(a, b, c) { b = this._marginSize(b); c = "top" == c ? this._whichSideTop() : this._whichSideBottom(); "left" == c ? (a.style.marginLeft = b + "px", a.style.marginRight = "0px") : "right" == c ? (a.style.marginRight = b + "px", a.style.marginLeft = "0px") : (a.style.marginLeft = b + "px", a.style.marginRight = b + "px") }, _setBorder: function(a, b, c) {
+ b = this._borderSize(b); c = "top" == c ? this._whichSideTop() :
+ this._whichSideBottom(); "left" == c ? (a.style.borderLeftWidth = b + "px", a.style.borderRightWidth = "0px") : "right" == c ? (a.style.borderRightWidth = b + "px", a.style.borderLeftWidth = "0px") : (a.style.borderLeftWidth = b + "px", a.style.borderRightWidth = b + "px"); 0 != this.options.border && (a.style.borderLeftWidth = b + "px", a.style.borderRightWidth = b + "px")
+ }, _marginSize: function(a) {
+ if (this._isTransparent()) return 0; var b = [5, 3, 2, 1], c = [3, 2, 1, 0], d = [2, 1], e = [1, 0]; return this.options.compact && this.options.blend ? e[a] : this.options.compact ?
+ d[a] : this.options.blend ? c[a] : b[a]
+ }, _borderSize: function(a) { var b = [5, 3, 2, 1], c = [2, 1, 1, 1], d = [1, 0], e = [0, 2, 0, 0]; return this.options.compact && (this.options.blend || this._isTransparent()) ? 1 : this.options.compact ? d[a] : this.options.blend ? c[a] : this.options.border ? e[a] : this._isTransparent() ? b[a] : 0 }, _hasString: function(a) { for (var b = 1; b < arguments.length; b++)if (0 <= a.indexOf(arguments[b])) return !0; return !1 }, _blend: function(a, b) {
+ var c = OpenLayers.Rico.Color.createFromHex(a); c.blend(OpenLayers.Rico.Color.createFromHex(b));
+ return c
+ }, _background: function(a) { try { return OpenLayers.Rico.Color.createColorFromBackground(a).asHex() } catch (b) { return "#ffffff" } }, _isTransparent: function() { return "transparent" == this.options.color }, _isTopRounded: function() { return this._hasString(this.options.corners, "all", "top", "tl", "tr") }, _isBottomRounded: function() { return this._hasString(this.options.corners, "all", "bottom", "bl", "br") }, _hasSingleTextChild: function(a) { return 1 == a.childNodes.length && 3 == a.childNodes[0].nodeType }
+};
+OpenLayers.Control.NavigationHistory = OpenLayers.Class(OpenLayers.Control, {
+ type: OpenLayers.Control.TYPE_TOGGLE, previous: null, previousOptions: null, next: null, nextOptions: null, limit: 50, autoActivate: !0, clearOnDeactivate: !1, registry: null, nextStack: null, previousStack: null, listeners: null, restoring: !1, initialize: function(a) {
+ OpenLayers.Control.prototype.initialize.apply(this, [a]); this.registry = OpenLayers.Util.extend({ moveend: this.getState }, this.registry); a = {
+ trigger: OpenLayers.Function.bind(this.previousTrigger,
+ this), displayClass: this.displayClass + " " + this.displayClass + "Previous"
+ }; OpenLayers.Util.extend(a, this.previousOptions); this.previous = new OpenLayers.Control.Button(a); a = { trigger: OpenLayers.Function.bind(this.nextTrigger, this), displayClass: this.displayClass + " " + this.displayClass + "Next" }; OpenLayers.Util.extend(a, this.nextOptions); this.next = new OpenLayers.Control.Button(a); this.clear()
+ }, onPreviousChange: function(a, b) { a && !this.previous.active ? this.previous.activate() : !a && this.previous.active && this.previous.deactivate() },
+ onNextChange: function(a, b) { a && !this.next.active ? this.next.activate() : !a && this.next.active && this.next.deactivate() }, destroy: function() { OpenLayers.Control.prototype.destroy.apply(this); this.previous.destroy(); this.next.destroy(); this.deactivate(); for (var a in this) this[a] = null }, setMap: function(a) { this.map = a; this.next.setMap(a); this.previous.setMap(a) }, draw: function() { OpenLayers.Control.prototype.draw.apply(this, arguments); this.next.draw(); this.previous.draw() }, previousTrigger: function() {
+ var a = this.previousStack.shift(),
+ b = this.previousStack.shift(); void 0 != b ? (this.nextStack.unshift(a), this.previousStack.unshift(b), this.restoring = !0, this.restore(b), this.restoring = !1, this.onNextChange(this.nextStack[0], this.nextStack.length), this.onPreviousChange(this.previousStack[1], this.previousStack.length - 1)) : this.previousStack.unshift(a); return b
+ }, nextTrigger: function() {
+ var a = this.nextStack.shift(); void 0 != a && (this.previousStack.unshift(a), this.restoring = !0, this.restore(a), this.restoring = !1, this.onNextChange(this.nextStack[0],
+ this.nextStack.length), this.onPreviousChange(this.previousStack[1], this.previousStack.length - 1)); return a
+ }, clear: function() { this.previousStack = []; this.previous.deactivate(); this.nextStack = []; this.next.deactivate() }, getState: function() { return { center: this.map.getCenter(), resolution: this.map.getResolution(), projection: this.map.getProjectionObject(), units: this.map.getProjectionObject().getUnits() || this.map.units || this.map.baseLayer.units } }, restore: function(a) {
+ var b, c; if (this.map.getProjectionObject() ==
+ a.projection) c = this.map.getZoomForResolution(a.resolution), b = a.center; else { b = a.center.clone(); b.transform(a.projection, this.map.getProjectionObject()); c = a.units; var d = this.map.getProjectionObject().getUnits() || this.map.units || this.map.baseLayer.units; c = this.map.getZoomForResolution((c && d ? OpenLayers.INCHES_PER_UNIT[c] / OpenLayers.INCHES_PER_UNIT[d] : 1) * a.resolution) } this.map.setCenter(b, c)
+ }, setListeners: function() {
+ this.listeners = {}; for (var a in this.registry) this.listeners[a] = OpenLayers.Function.bind(function() {
+ if (!this.restoring) {
+ var b =
+ this.registry[a].apply(this, arguments); this.previousStack.unshift(b); if (1 < this.previousStack.length) this.onPreviousChange(this.previousStack[1], this.previousStack.length - 1); this.previousStack.length > this.limit + 1 && this.previousStack.pop(); 0 < this.nextStack.length && (this.nextStack = [], this.onNextChange(null, 0))
+ } return !0
+ }, this)
+ }, activate: function() {
+ var a = !1; if (this.map && OpenLayers.Control.prototype.activate.apply(this)) {
+ null == this.listeners && this.setListeners(); for (var b in this.listeners) this.map.events.register(b,
+ this, this.listeners[b]); a = !0; 0 == this.previousStack.length && this.initStack()
+ } return a
+ }, initStack: function() { this.map.getCenter() && this.listeners.moveend() }, deactivate: function() { var a = !1; if (this.map && OpenLayers.Control.prototype.deactivate.apply(this)) { for (var b in this.listeners) this.map.events.unregister(b, this, this.listeners[b]); this.clearOnDeactivate && this.clear(); a = !0 } return a }, CLASS_NAME: "OpenLayers.Control.NavigationHistory"
+});
+OpenLayers.Layer.UTFGrid = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+ isBaseLayer: !1, projection: new OpenLayers.Projection("EPSG:900913"), useJSONP: !1, tileClass: OpenLayers.Tile.UTFGrid, initialize: function(a) { OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a.name, a.url, {}, a]); this.tileOptions = OpenLayers.Util.extend({ utfgridResolution: this.utfgridResolution }, this.tileOptions) }, createBackBuffer: function() { }, clone: function(a) {
+ null == a && (a = new OpenLayers.Layer.UTFGrid(this.getOptions())); return OpenLayers.Layer.Grid.prototype.clone.apply(this,
+ [a])
+ }, getFeatureInfo: function(a) { var b = null; (a = this.getTileData(a)) && a.tile && (b = a.tile.getFeatureInfo(a.i, a.j)); return b }, getFeatureId: function(a) { var b = null; a = this.getTileData(a); a.tile && (b = a.tile.getFeatureId(a.i, a.j)); return b }, CLASS_NAME: "OpenLayers.Layer.UTFGrid"
+});
+OpenLayers.TileManager = OpenLayers.Class({
+ cacheSize: 256, tilesPerFrame: 2, frameDelay: 16, moveDelay: 100, zoomDelay: 200, maps: null, tileQueueId: null, tileQueue: null, tileCache: null, tileCacheIndex: null, initialize: function(a) { OpenLayers.Util.extend(this, a); this.maps = []; this.tileQueueId = {}; this.tileQueue = {}; this.tileCache = {}; this.tileCacheIndex = [] }, addMap: function(a) {
+ if (!this._destroyed && OpenLayers.Layer.Grid) {
+ this.maps.push(a); this.tileQueue[a.id] = []; for (var b = 0, c = a.layers.length; b < c; ++b)this.addLayer({ layer: a.layers[b] });
+ a.events.on({ move: this.move, zoomend: this.zoomEnd, changelayer: this.changeLayer, addlayer: this.addLayer, preremovelayer: this.removeLayer, scope: this })
+ }
+ }, removeMap: function(a) {
+ if (!this._destroyed && OpenLayers.Layer.Grid) {
+ window.clearTimeout(this.tileQueueId[a.id]); if (a.layers) for (var b = 0, c = a.layers.length; b < c; ++b)this.removeLayer({ layer: a.layers[b] }); a.events && a.events.un({ move: this.move, zoomend: this.zoomEnd, changelayer: this.changeLayer, addlayer: this.addLayer, preremovelayer: this.removeLayer, scope: this });
+ delete this.tileQueue[a.id]; delete this.tileQueueId[a.id]; OpenLayers.Util.removeItem(this.maps, a)
+ }
+ }, move: function(a) { this.updateTimeout(a.object, this.moveDelay, !0) }, zoomEnd: function(a) { this.updateTimeout(a.object, this.zoomDelay) }, changeLayer: function(a) { "visibility" !== a.property && "params" !== a.property || this.updateTimeout(a.object, 0) }, addLayer: function(a) {
+ a = a.layer; if (a instanceof OpenLayers.Layer.Grid) {
+ a.events.on({ addtile: this.addTile, retile: this.clearTileQueue, scope: this }); var b, c, d; for (b = a.grid.length -
+ 1; 0 <= b; --b)for (c = a.grid[b].length - 1; 0 <= c; --c)d = a.grid[b][c], this.addTile({ tile: d }), d.url && !d.imgDiv && this.manageTileCache({ object: d })
+ }
+ }, removeLayer: function(a) { a = a.layer; if (a instanceof OpenLayers.Layer.Grid && (this.clearTileQueue({ object: a }), a.events && a.events.un({ addtile: this.addTile, retile: this.clearTileQueue, scope: this }), a.grid)) { var b, c, d; for (b = a.grid.length - 1; 0 <= b; --b)for (c = a.grid[b].length - 1; 0 <= c; --c)d = a.grid[b][c], this.unloadTile({ object: d }) } }, updateTimeout: function(a, b, c) {
+ window.clearTimeout(this.tileQueueId[a.id]);
+ var d = this.tileQueue[a.id]; if (!c || d.length) this.tileQueueId[a.id] = window.setTimeout(OpenLayers.Function.bind(function() { this.drawTilesFromQueue(a); d.length && this.updateTimeout(a, this.frameDelay) }, this), b)
+ }, addTile: function(a) { if (a.tile instanceof OpenLayers.Tile.Image) a.tile.events.on({ beforedraw: this.queueTileDraw, beforeload: this.manageTileCache, loadend: this.addToCache, unload: this.unloadTile, scope: this }); else this.removeLayer({ layer: a.tile.layer }) }, unloadTile: function(a) {
+ a = a.object; a.events.un({
+ beforedraw: this.queueTileDraw,
+ beforeload: this.manageTileCache, loadend: this.addToCache, unload: this.unloadTile, scope: this
+ }); OpenLayers.Util.removeItem(this.tileQueue[a.layer.map.id], a)
+ }, queueTileDraw: function(a) { a = a.object; var b = !1, c = a.layer, d = c.getURL(a.bounds), e = this.tileCache[d]; e && "olTileImage" !== e.className && (delete this.tileCache[d], OpenLayers.Util.removeItem(this.tileCacheIndex, d), e = null); !c.url || !c.async && e || (b = this.tileQueue[c.map.id], ~OpenLayers.Util.indexOf(b, a) || b.push(a), b = !0); return !b }, drawTilesFromQueue: function(a) {
+ var b =
+ this.tileQueue[a.id], c = this.tilesPerFrame; for (a = a.zoomTween && a.zoomTween.playing; !a && b.length && c;)b.shift().draw(!0), --c
+ }, manageTileCache: function(a) { a = a.object; var b = this.tileCache[a.url]; b && (b.parentNode && OpenLayers.Element.hasClass(b.parentNode, "olBackBuffer") && (b.parentNode.removeChild(b), b.id = null), b.parentNode || (b.style.visibility = "hidden", b.style.opacity = 0, a.setImage(b), OpenLayers.Util.removeItem(this.tileCacheIndex, a.url), this.tileCacheIndex.push(a.url))) }, addToCache: function(a) {
+ a = a.object;
+ this.tileCache[a.url] || OpenLayers.Element.hasClass(a.imgDiv, "olImageLoadError") || (this.tileCacheIndex.length >= this.cacheSize && (delete this.tileCache[this.tileCacheIndex[0]], this.tileCacheIndex.shift()), this.tileCache[a.url] = a.imgDiv, this.tileCacheIndex.push(a.url))
+ }, clearTileQueue: function(a) { a = a.object; for (var b = this.tileQueue[a.map.id], c = b.length - 1; 0 <= c; --c)b[c].layer === a && b.splice(c, 1) }, destroy: function() {
+ for (var a = this.maps.length - 1; 0 <= a; --a)this.removeMap(this.maps[a]); this.tileCacheIndex = this.tileCache =
+ this.tileQueueId = this.tileQueue = this.maps = null; this._destroyed = !0
+ }
+});
+OpenLayers.Layer.ArcGISCache = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+ url: null, tileOrigin: null, tileSize: new OpenLayers.Size(256, 256), useArcGISServer: !0, type: "png", useScales: !1, overrideDPI: !1, initialize: function(a, b, c) {
+ OpenLayers.Layer.XYZ.prototype.initialize.apply(this, arguments); this.resolutions && (this.serverResolutions = this.resolutions, this.maxExtent = this.getMaxExtentForResolution(this.resolutions[0])); if (this.layerInfo) {
+ var d = this.layerInfo, e = new OpenLayers.Bounds(d.fullExtent.xmin, d.fullExtent.ymin,
+ d.fullExtent.xmax, d.fullExtent.ymax); this.projection = "EPSG:" + d.spatialReference.wkid; this.sphericalMercator = 102100 == d.spatialReference.wkid; this.units = "esriFeet" == d.units ? "ft" : "m"; if (d.tileInfo) {
+ this.tileSize = new OpenLayers.Size(d.tileInfo.width || d.tileInfo.cols, d.tileInfo.height || d.tileInfo.rows); this.tileOrigin = new OpenLayers.LonLat(d.tileInfo.origin.x, d.tileInfo.origin.y); var f = new OpenLayers.Geometry.Point(e.left, e.top), e = new OpenLayers.Geometry.Point(e.right, e.bottom); this.useScales ? this.scales =
+ [] : this.resolutions = []; this.lods = []; for (var g in d.tileInfo.lods) if (d.tileInfo.lods.hasOwnProperty(g)) { var h = d.tileInfo.lods[g]; this.useScales ? this.scales.push(h.scale) : this.resolutions.push(h.resolution); var k = this.getContainingTileCoords(f, h.resolution); h.startTileCol = k.x; h.startTileRow = k.y; k = this.getContainingTileCoords(e, h.resolution); h.endTileCol = k.x; h.endTileRow = k.y; this.lods.push(h) } this.maxExtent = this.calculateMaxExtentWithLOD(this.lods[0]); this.serverResolutions = this.resolutions; this.overrideDPI &&
+ d.tileInfo.dpi && (OpenLayers.DOTS_PER_INCH = d.tileInfo.dpi)
+ }
+ }
+ }, getContainingTileCoords: function(a, b) { return new OpenLayers.Pixel(Math.max(Math.floor((a.x - this.tileOrigin.lon) / (this.tileSize.w * b)), 0), Math.max(Math.floor((this.tileOrigin.lat - a.y) / (this.tileSize.h * b)), 0)) }, calculateMaxExtentWithLOD: function(a) {
+ var b = this.tileOrigin.lon + a.startTileCol * this.tileSize.w * a.resolution, c = this.tileOrigin.lat - a.startTileRow * this.tileSize.h * a.resolution; return new OpenLayers.Bounds(b, c - (a.endTileRow - a.startTileRow +
+ 1) * this.tileSize.h * a.resolution, b + (a.endTileCol - a.startTileCol + 1) * this.tileSize.w * a.resolution, c)
+ }, calculateMaxExtentWithExtent: function(a, b) { var c = new OpenLayers.Geometry.Point(a.left, a.top), d = new OpenLayers.Geometry.Point(a.right, a.bottom), c = this.getContainingTileCoords(c, b), d = this.getContainingTileCoords(d, b); return this.calculateMaxExtentWithLOD({ resolution: b, startTileCol: c.x, startTileRow: c.y, endTileCol: d.x, endTileRow: d.y }) }, getUpperLeftTileCoord: function(a) {
+ var b = new OpenLayers.Geometry.Point(this.maxExtent.left,
+ this.maxExtent.top); return this.getContainingTileCoords(b, a)
+ }, getLowerRightTileCoord: function(a) { var b = new OpenLayers.Geometry.Point(this.maxExtent.right, this.maxExtent.bottom); return this.getContainingTileCoords(b, a) }, getMaxExtentForResolution: function(a) {
+ var b = this.getUpperLeftTileCoord(a), c = this.getLowerRightTileCoord(a), d = this.tileOrigin.lon + b.x * this.tileSize.w * a, e = this.tileOrigin.lat - b.y * this.tileSize.h * a; return new OpenLayers.Bounds(d, e - (c.y - b.y + 1) * this.tileSize.h * a, d + (c.x - b.x + 1) * this.tileSize.w *
+ a, e)
+ }, clone: function(a) { null == a && (a = new OpenLayers.Layer.ArcGISCache(this.name, this.url, this.options)); return OpenLayers.Layer.XYZ.prototype.clone.apply(this, [a]) }, initGriddedTiles: function(a) { delete this._tileOrigin; OpenLayers.Layer.XYZ.prototype.initGriddedTiles.apply(this, arguments) }, getMaxExtent: function() { var a = this.map.getResolution(); return this.maxExtent = this.getMaxExtentForResolution(a) }, getTileOrigin: function() {
+ if (!this._tileOrigin) {
+ var a = this.getMaxExtent(); this._tileOrigin = new OpenLayers.LonLat(a.left,
+ a.bottom)
+ } return this._tileOrigin
+ }, getURL: function(a) {
+ var b = this.getResolution(), c = this.tileOrigin.lon + b * this.tileSize.w / 2, d = this.tileOrigin.lat - b * this.tileSize.h / 2; a = a.getCenterLonLat(); c = Math.round(Math.abs((a.lon - c) / (b * this.tileSize.w))); d = Math.round(Math.abs((d - a.lat) / (b * this.tileSize.h))); a = this.map.getZoom(); if (this.lods) { if (b = this.lods[this.map.getZoom()], c < b.startTileCol || c > b.endTileCol || d < b.startTileRow || d > b.endTileRow) return null } else {
+ var e = this.getUpperLeftTileCoord(b), b = this.getLowerRightTileCoord(b);
+ if (c < e.x || c >= b.x || d < e.y || d >= b.y) return null
+ } b = this.url; e = "" + c + d + a; OpenLayers.Util.isArray(b) && (b = this.selectUrl(e, b)); this.useArcGISServer ? b += "/tile/${z}/${y}/${x}" : (c = "C" + OpenLayers.Number.zeroPad(c, 8, 16), d = "R" + OpenLayers.Number.zeroPad(d, 8, 16), a = "L" + OpenLayers.Number.zeroPad(a, 2, 10), b = b + "/${z}/${y}/${x}." + this.type); b = OpenLayers.String.format(b, { x: c, y: d, z: a }); return OpenLayers.Util.urlAppend(b, OpenLayers.Util.getParameterString(this.params))
+ }, CLASS_NAME: "OpenLayers.Layer.ArcGISCache"
+});
+OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
+ hover: !1, drillDown: !1, maxFeatures: 10, clickCallback: "click", output: "features", layers: null, queryVisible: !1, url: null, layerUrls: null, infoFormat: "text/html", vendorParams: {}, format: null, formatOptions: null, handler: null, hoverRequest: null, initialize: function(a) {
+ a = a || {}; a.handlerOptions = a.handlerOptions || {}; OpenLayers.Control.prototype.initialize.apply(this, [a]); this.format || (this.format = new OpenLayers.Format.WMSGetFeatureInfo(a.formatOptions));
+ !0 === this.drillDown && (this.hover = !1); this.hover ? this.handler = new OpenLayers.Handler.Hover(this, { move: this.cancelHover, pause: this.getInfoForHover }, OpenLayers.Util.extend(this.handlerOptions.hover || {}, { delay: 250 })) : (a = {}, a[this.clickCallback] = this.getInfoForClick, this.handler = new OpenLayers.Handler.Click(this, a, this.handlerOptions.click || {}))
+ }, getInfoForClick: function(a) {
+ this.events.triggerEvent("beforegetfeatureinfo", { xy: a.xy }); OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait"); this.request(a.xy,
+ {})
+ }, getInfoForHover: function(a) { this.events.triggerEvent("beforegetfeatureinfo", { xy: a.xy }); this.request(a.xy, { hover: !0 }) }, cancelHover: function() { this.hoverRequest && (this.hoverRequest.abort(), this.hoverRequest = null) }, findLayers: function() {
+ for (var a = this.layers || this.map.layers, b = [], c, d, e = a.length - 1; 0 <= e; --e)c = a[e], c instanceof OpenLayers.Layer.WMS && (!this.queryVisible || c.getVisibility()) && (d = OpenLayers.Util.isArray(c.url) ? c.url[0] : c.url, !1 !== this.drillDown || this.url || (this.url = d), (!0 === this.drillDown ||
+ this.urlMatches(d)) && b.push(c)); return b
+ }, urlMatches: function(a) { var b = OpenLayers.Util.isEquivalentUrl(this.url, a); if (!b && this.layerUrls) for (var c = 0, d = this.layerUrls.length; c < d; ++c)if (OpenLayers.Util.isEquivalentUrl(this.layerUrls[c], a)) { b = !0; break } return b }, buildWMSOptions: function(a, b, c, d) {
+ for (var e = [], f = [], g = 0, h = b.length; g < h; g++)null != b[g].params.LAYERS && (e = e.concat(b[g].params.LAYERS), f = f.concat(this.getStyleNames(b[g]))); b = b[0]; g = this.map.getProjection(); (h = b.projection) && h.equals(this.map.getProjectionObject()) &&
+ (g = h.getCode()); d = OpenLayers.Util.extend({ service: "WMS", version: b.params.VERSION, request: "GetFeatureInfo", exceptions: b.params.EXCEPTIONS, bbox: this.map.getExtent().toBBOX(null, b.reverseAxisOrder()), feature_count: this.maxFeatures, height: this.map.getSize().h, width: this.map.getSize().w, format: d, info_format: b.params.INFO_FORMAT || this.infoFormat }, 1.3 <= parseFloat(b.params.VERSION) ? { crs: g, i: parseInt(c.x), j: parseInt(c.y) } : { srs: g, x: parseInt(c.x), y: parseInt(c.y) }); 0 != e.length && (d = OpenLayers.Util.extend({
+ layers: e,
+ query_layers: e, styles: f
+ }, d)); OpenLayers.Util.applyDefaults(d, this.vendorParams); return { url: a, params: OpenLayers.Util.upperCaseObject(d), callback: function(b) { this.handleResponse(c, b, a) }, scope: this }
+ }, getStyleNames: function(a) { return a.params.STYLES ? a.params.STYLES : OpenLayers.Util.isArray(a.params.LAYERS) ? Array(a.params.LAYERS.length) : a.params.LAYERS.replace(/[^,]/g, "") }, request: function(a, b) {
+ var c = this.findLayers(); if (0 == c.length) this.events.triggerEvent("nogetfeatureinfo"), OpenLayers.Element.removeClass(this.map.viewPortDiv,
+ "olCursorWait"); else if (b = b || {}, !1 === this.drillDown) { var c = this.buildWMSOptions(this.url, c, a, c[0].params.FORMAT), d = OpenLayers.Request.GET(c); !0 === b.hover && (this.hoverRequest = d) } else { this._numRequests = this._requestCount = 0; this.features = []; for (var d = {}, e, f = 0, g = c.length; f < g; f++) { var h = c[f]; e = OpenLayers.Util.isArray(h.url) ? h.url[0] : h.url; e in d ? d[e].push(h) : (this._numRequests++, d[e] = [h]) } for (e in d) c = d[e], c = this.buildWMSOptions(e, c, a, c[0].params.FORMAT), OpenLayers.Request.GET(c) }
+ }, triggerGetFeatureInfo: function(a,
+ b, c) { this.events.triggerEvent("getfeatureinfo", { text: a.responseText, features: c, request: a, xy: b }); OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait") }, handleResponse: function(a, b, c) {
+ var d = b.responseXML; d && d.documentElement || (d = b.responseText); d = this.format.read(d); !1 === this.drillDown ? this.triggerGetFeatureInfo(b, a, d) : (this._requestCount++, this._features = "object" === this.output ? (this._features || []).concat({ url: c, features: d }) : (this._features || []).concat(d), this._requestCount === this._numRequests &&
+ (this.triggerGetFeatureInfo(b, a, this._features.concat()), delete this._features, delete this._requestCount, delete this._numRequests))
+ }, CLASS_NAME: "OpenLayers.Control.WMSGetFeatureInfo"
+}); OpenLayers.Format.WMSCapabilities.v1_3_0 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_3, { version: "1.3.0", CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_3_0" });
+OpenLayers.Format.SOSGetFeatureOfInterest = OpenLayers.Class(OpenLayers.Format.XML, {
+ VERSION: "1.0.0", namespaces: { sos: "http://www.opengis.net/sos/1.0", gml: "http://www.opengis.net/gml", sa: "http://www.opengis.net/sampling/1.0", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, schemaLocation: "http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd", defaultPrefix: "sos", regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, read: function(a) {
+ "string" ==
+ typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = { features: [] }; this.readNode(a, b); a = []; for (var c = 0, d = b.features.length; c < d; c++) { var e = b.features[c]; this.internalProjection && this.externalProjection && e.components[0] && e.components[0].transform(this.externalProjection, this.internalProjection); e = new OpenLayers.Feature.Vector(e.components[0], e.attributes); a.push(e) } return a
+ }, readers: {
+ sa: {
+ SamplingPoint: function(a, b) {
+ if (!b.attributes) {
+ var c =
+ { attributes: {} }; b.features.push(c); b = c
+ } b.attributes.id = this.getAttributeNS(a, this.namespaces.gml, "id"); this.readChildNodes(a, b)
+ }, position: function(a, b) { this.readChildNodes(a, b) }
+ }, gml: OpenLayers.Util.applyDefaults({
+ FeatureCollection: function(a, b) { this.readChildNodes(a, b) }, featureMember: function(a, b) { var c = { attributes: {} }; b.features.push(c); this.readChildNodes(a, c) }, name: function(a, b) { b.attributes.name = this.getChildValue(a) }, pos: function(a, b) {
+ this.externalProjection || (this.externalProjection = new OpenLayers.Projection(a.getAttribute("srsName")));
+ OpenLayers.Format.GML.v3.prototype.readers.gml.pos.apply(this, [a, b])
+ }
+ }, OpenLayers.Format.GML.v3.prototype.readers.gml)
+ }, writers: { sos: { GetFeatureOfInterest: function(a) { for (var b = this.createElementNSPlus("GetFeatureOfInterest", { attributes: { version: this.VERSION, service: "SOS", "xsi:schemaLocation": this.schemaLocation } }), c = 0, d = a.fois.length; c < d; c++)this.writeNode("FeatureOfInterestId", { foi: a.fois[c] }, b); return b }, FeatureOfInterestId: function(a) { return this.createElementNSPlus("FeatureOfInterestId", { value: a.foi }) } } },
+ CLASS_NAME: "OpenLayers.Format.SOSGetFeatureOfInterest"
+});
+OpenLayers.Format.SOSGetObservation = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { ows: "http://www.opengis.net/ows", gml: "http://www.opengis.net/gml", sos: "http://www.opengis.net/sos/1.0", ogc: "http://www.opengis.net/ogc", om: "http://www.opengis.net/om/1.0", sa: "http://www.opengis.net/sampling/1.0", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance" }, regExes: { trimSpace: /^\s*|\s*$/g, removeSpace: /\s*/g, splitSpace: /\s+/, trimComma: /\s*,\s*/g }, VERSION: "1.0.0", schemaLocation: "http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd",
+ defaultPrefix: "sos", read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = { measurements: [], observations: [] }; this.readNode(a, b); return b }, write: function(a) {
+ a = this.writeNode("sos:GetObservation", a); a.setAttribute("xmlns:om", this.namespaces.om); a.setAttribute("xmlns:ogc", this.namespaces.ogc); this.setAttributeNS(a, this.namespaces.xsi, "xsi:schemaLocation", this.schemaLocation); return OpenLayers.Format.XML.prototype.write.apply(this,
+ [a])
+ }, readers: {
+ om: {
+ ObservationCollection: function(a, b) { b.id = this.getAttributeNS(a, this.namespaces.gml, "id"); this.readChildNodes(a, b) }, member: function(a, b) { this.readChildNodes(a, b) }, Measurement: function(a, b) { var c = {}; b.measurements.push(c); this.readChildNodes(a, c) }, Observation: function(a, b) { var c = {}; b.observations.push(c); this.readChildNodes(a, c) }, samplingTime: function(a, b) { var c = {}; b.samplingTime = c; this.readChildNodes(a, c) }, observedProperty: function(a, b) {
+ b.observedProperty = this.getAttributeNS(a, this.namespaces.xlink,
+ "href"); this.readChildNodes(a, b)
+ }, procedure: function(a, b) { b.procedure = this.getAttributeNS(a, this.namespaces.xlink, "href"); this.readChildNodes(a, b) }, featureOfInterest: function(a, b) { var c = { features: [] }; b.fois = []; b.fois.push(c); this.readChildNodes(a, c); for (var d = [], e = 0, f = c.features.length; e < f; e++) { var g = c.features[e]; d.push(new OpenLayers.Feature.Vector(g.components[0], g.attributes)) } c.features = d }, result: function(a, b) {
+ var c = {}; b.result = c; "" !== this.getChildValue(a) ? (c.value = this.getChildValue(a), c.uom =
+ a.getAttribute("uom")) : this.readChildNodes(a, c)
+ }
+ }, sa: OpenLayers.Format.SOSGetFeatureOfInterest.prototype.readers.sa, gml: OpenLayers.Util.applyDefaults({ TimeInstant: function(a, b) { var c = {}; b.timeInstant = c; this.readChildNodes(a, c) }, timePosition: function(a, b) { b.timePosition = this.getChildValue(a) } }, OpenLayers.Format.SOSGetFeatureOfInterest.prototype.readers.gml)
+ }, writers: {
+ sos: {
+ GetObservation: function(a) {
+ var b = this.createElementNSPlus("GetObservation", { attributes: { version: this.VERSION, service: "SOS" } }); this.writeNode("offering",
+ a, b); a.eventTime && this.writeNode("eventTime", a, b); for (var c in a.procedures) this.writeNode("procedure", a.procedures[c], b); for (var d in a.observedProperties) this.writeNode("observedProperty", a.observedProperties[d], b); a.foi && this.writeNode("featureOfInterest", a.foi, b); this.writeNode("responseFormat", a, b); a.resultModel && this.writeNode("resultModel", a, b); a.responseMode && this.writeNode("responseMode", a, b); return b
+ }, featureOfInterest: function(a) {
+ var b = this.createElementNSPlus("featureOfInterest"); this.writeNode("ObjectID",
+ a.objectId, b); return b
+ }, ObjectID: function(a) { return this.createElementNSPlus("ObjectID", { value: a }) }, responseFormat: function(a) { return this.createElementNSPlus("responseFormat", { value: a.responseFormat }) }, procedure: function(a) { return this.createElementNSPlus("procedure", { value: a }) }, offering: function(a) { return this.createElementNSPlus("offering", { value: a.offering }) }, observedProperty: function(a) { return this.createElementNSPlus("observedProperty", { value: a }) }, eventTime: function(a) {
+ var b = this.createElementNSPlus("eventTime");
+ "latest" === a.eventTime && this.writeNode("ogc:TM_Equals", a, b); return b
+ }, resultModel: function(a) { return this.createElementNSPlus("resultModel", { value: a.resultModel }) }, responseMode: function(a) { return this.createElementNSPlus("responseMode", { value: a.responseMode }) }
+ }, ogc: {
+ TM_Equals: function(a) { var b = this.createElementNSPlus("ogc:TM_Equals"); this.writeNode("ogc:PropertyName", { property: "urn:ogc:data:time:iso8601" }, b); "latest" === a.eventTime && this.writeNode("gml:TimeInstant", { value: "latest" }, b); return b }, PropertyName: function(a) {
+ return this.createElementNSPlus("ogc:PropertyName",
+ { value: a.property })
+ }
+ }, gml: { TimeInstant: function(a) { var b = this.createElementNSPlus("gml:TimeInstant"); this.writeNode("gml:timePosition", a, b); return b }, timePosition: function(a) { return this.createElementNSPlus("gml:timePosition", { value: a.value }) } }
+ }, CLASS_NAME: "OpenLayers.Format.SOSGetObservation"
+});
+OpenLayers.Control.UTFGrid = OpenLayers.Class(OpenLayers.Control, {
+ autoActivate: !0, layers: null, defaultHandlerOptions: { delay: 300, pixelTolerance: 4, stopMove: !1, single: !0, "double": !1, stopSingle: !1, stopDouble: !1 }, handlerMode: "click", setHandler: function(a) { this.handlerMode = a; this.resetHandler() }, resetHandler: function() {
+ this.handler && (this.handler.deactivate(), this.handler.destroy(), this.handler = null); "hover" == this.handlerMode ? this.handler = new OpenLayers.Handler.Hover(this, { pause: this.handleEvent, move: this.reset },
+ this.handlerOptions) : "click" == this.handlerMode ? this.handler = new OpenLayers.Handler.Click(this, { click: this.handleEvent }, this.handlerOptions) : "move" == this.handlerMode && (this.handler = new OpenLayers.Handler.Hover(this, { pause: this.handleEvent, move: this.handleEvent }, this.handlerOptions)); return this.handler ? !0 : !1
+ }, initialize: function(a) { a = a || {}; a.handlerOptions = a.handlerOptions || this.defaultHandlerOptions; OpenLayers.Control.prototype.initialize.apply(this, [a]); this.resetHandler() }, handleEvent: function(a) {
+ if (null ==
+ a) this.reset(); else { var b = this.map.getLonLatFromPixel(a.xy); if (b) { var c = this.findLayers(); if (0 < c.length) { for (var d = {}, e, f, g = 0, h = c.length; g < h; g++)e = c[g], f = OpenLayers.Util.indexOf(this.map.layers, e), d[f] = e.getFeatureInfo(b); this.callback(d, b, a.xy) } } }
+ }, callback: function(a) { }, reset: function(a) { this.callback(null) }, findLayers: function() { for (var a = this.layers || this.map.layers, b = [], c, d = a.length - 1; 0 <= d; --d)c = a[d], c instanceof OpenLayers.Layer.UTFGrid && b.push(c); return b }, CLASS_NAME: "OpenLayers.Control.UTFGrid"
+});
+OpenLayers.Format.CQL = function() {
+ function a(a) {
+ function b() {
+ var a = e.pop(); switch (a.type) {
+ case "LOGICAL": var c = b(), g = b(); return new OpenLayers.Filter.Logical({ filters: [g, c], type: f[a.text.toUpperCase()] }); case "NOT": return a = b(), new OpenLayers.Filter.Logical({ filters: [a], type: OpenLayers.Filter.Logical.NOT }); case "BETWEEN": return e.pop(), g = b(), a = b(), c = b(), new OpenLayers.Filter.Comparison({ property: c, lowerBoundary: a, upperBoundary: g, type: OpenLayers.Filter.Comparison.BETWEEN }); case "COMPARISON": return g =
+ b(), c = b(), new OpenLayers.Filter.Comparison({ property: c, value: g, type: d[a.text.toUpperCase()] }); case "IS_null": return c = b(), new OpenLayers.Filter.Comparison({ property: c, type: d[a.text.toUpperCase()] }); case "VALUE": return (c = a.text.match(/^'(.*)'$/)) ? c[1].replace(/''/g, "'") : Number(a.text); case "SPATIAL": switch (a.text.toUpperCase()) {
+ case "BBOX": var a = b(), c = b(), g = b(), h = b(), k = b(); return new OpenLayers.Filter.Spatial({
+ type: OpenLayers.Filter.Spatial.BBOX, property: k, value: OpenLayers.Bounds.fromArray([h, g, c,
+ a])
+ }); case "INTERSECTS": return g = b(), c = b(), new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.INTERSECTS, property: c, value: g }); case "WITHIN": return g = b(), c = b(), new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.WITHIN, property: c, value: g }); case "CONTAINS": return g = b(), c = b(), new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.CONTAINS, property: c, value: g }); case "DWITHIN": return a = b(), g = b(), c = b(), new OpenLayers.Filter.Spatial({
+ type: OpenLayers.Filter.Spatial.DWITHIN, value: g,
+ property: c, distance: Number(a)
+ })
+ }case "GEOMETRY": return OpenLayers.Geometry.fromWKT(a.text); default: return a.text
+ }
+ } for (var c = [], e = []; a.length;) {
+ var g = a.shift(); switch (g.type) {
+ case "PROPERTY": case "GEOMETRY": case "VALUE": e.push(g); break; case "COMPARISON": case "BETWEEN": case "IS_null": case "LOGICAL": for (var k = h[g.type]; 0 < c.length && h[c[c.length - 1].type] <= k;)e.push(c.pop()); c.push(g); break; case "SPATIAL": case "NOT": case "LPAREN": c.push(g); break; case "RPAREN": for (; 0 < c.length && "LPAREN" != c[c.length - 1].type;)e.push(c.pop());
+ c.pop(); 0 < c.length && "SPATIAL" == c[c.length - 1].type && e.push(c.pop()); case "COMMA": case "END": break; default: throw Error("Unknown token type " + g.type);
+ }
+ } for (; 0 < c.length;)e.push(c.pop()); a = b(); if (0 < e.length) { a = "Remaining tokens after building AST: \n"; for (c = e.length - 1; 0 <= c; c--)a += e[c].type + ": " + e[c].text + "\n"; throw Error(a); } return a
+ } var b = {
+ PROPERTY: /^[_a-zA-Z]\w*/, COMPARISON: /^(=|<>|<=|<|>=|>|LIKE)/i, IS_null: /^IS null/i, COMMA: /^,/, LOGICAL: /^(AND|OR)/i, VALUE: /^('([^']|'')*'|\d+(\.\d*)?|\.\d+)/, LPAREN: /^\(/,
+ RPAREN: /^\)/, SPATIAL: /^(BBOX|INTERSECTS|DWITHIN|WITHIN|CONTAINS)/i, NOT: /^NOT/i, BETWEEN: /^BETWEEN/i, GEOMETRY: function(a) { var b = /^(POINT|LINESTRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)/.exec(a); if (b) { var c = a.length, b = a.indexOf("(", b[0].length); if (-1 < b) for (var d = 1; b < c && 0 < d;)switch (b++, a.charAt(b)) { case "(": d++; break; case ")": d-- }return [a.substr(0, b + 1)] } }, END: /^$/
+ }, c = {
+ LPAREN: ["GEOMETRY", "SPATIAL", "PROPERTY", "VALUE", "LPAREN"], RPAREN: ["NOT", "LOGICAL", "END", "RPAREN"], PROPERTY: ["COMPARISON",
+ "BETWEEN", "COMMA", "IS_null"], BETWEEN: ["VALUE"], IS_null: ["END"], COMPARISON: ["VALUE"], COMMA: ["GEOMETRY", "VALUE", "PROPERTY"], VALUE: ["LOGICAL", "COMMA", "RPAREN", "END"], SPATIAL: ["LPAREN"], LOGICAL: ["NOT", "VALUE", "SPATIAL", "PROPERTY", "LPAREN"], NOT: ["PROPERTY", "LPAREN"], GEOMETRY: ["COMMA", "RPAREN"]
+ }, d = {
+ "\x3d": OpenLayers.Filter.Comparison.EQUAL_TO, "\x3c\x3e": OpenLayers.Filter.Comparison.NOT_EQUAL_TO, "\x3c": OpenLayers.Filter.Comparison.LESS_THAN, "\x3c\x3d": OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO, "\x3e": OpenLayers.Filter.Comparison.GREATER_THAN,
+ "\x3e\x3d": OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO, LIKE: OpenLayers.Filter.Comparison.LIKE, BETWEEN: OpenLayers.Filter.Comparison.BETWEEN, "IS null": OpenLayers.Filter.Comparison.IS_null
+ }, e = {}, f = { AND: OpenLayers.Filter.Logical.AND, OR: OpenLayers.Filter.Logical.OR }, g = {}, h = { RPAREN: 3, LOGICAL: 2, COMPARISON: 1 }, k; for (k in d) d.hasOwnProperty(k) && (e[d[k]] = k); for (k in f) f.hasOwnProperty(k) && (g[f[k]] = k); return OpenLayers.Class(OpenLayers.Format, {
+ read: function(d) {
+ var e = d; d = []; var f, g = ["NOT", "GEOMETRY",
+ "SPATIAL", "PROPERTY", "LPAREN"]; do { a: { f = g; for (var h = void 0, k = f.length, h = 0; h < k; h++) { var g = f[h], t = b[g] instanceof RegExp ? b[g].exec(e) : (0, b[g])(e); if (t) { f = t[0]; e = e.substr(f.length).replace(/^\s*/, ""); f = { type: g, text: f, remainder: e }; break a } } d = "ERROR: In parsing: [" + e + "], expected one of: "; for (h = 0; h < k; h++)g = f[h], d += "\n " + g + ": " + b[g]; throw Error(d); } e = f.remainder; g = c[f.type]; if ("END" != f.type && !g) throw Error("No follows list for " + f.type); d.push(f) } while ("END" != f.type); d = a(d); this.keepData && (this.data =
+ d); return d
+ }, write: function(a) {
+ if (a instanceof OpenLayers.Geometry) return a.toString(); switch (a.CLASS_NAME) {
+ case "OpenLayers.Filter.Spatial": switch (a.type) {
+ case OpenLayers.Filter.Spatial.BBOX: return "BBOX(" + a.property + "," + a.value.toBBOX() + ")"; case OpenLayers.Filter.Spatial.DWITHIN: return "DWITHIN(" + a.property + ", " + this.write(a.value) + ", " + a.distance + ")"; case OpenLayers.Filter.Spatial.WITHIN: return "WITHIN(" + a.property + ", " + this.write(a.value) + ")"; case OpenLayers.Filter.Spatial.INTERSECTS: return "INTERSECTS(" +
+ a.property + ", " + this.write(a.value) + ")"; case OpenLayers.Filter.Spatial.CONTAINS: return "CONTAINS(" + a.property + ", " + this.write(a.value) + ")"; default: throw Error("Unknown spatial filter type: " + a.type);
+ }case "OpenLayers.Filter.Logical": if (a.type == OpenLayers.Filter.Logical.NOT) return "NOT (" + this.write(a.filters[0]) + ")"; for (var b = "(", c = !0, d = 0; d < a.filters.length; d++)c ? c = !1 : b += ") " + g[a.type] + " (", b += this.write(a.filters[d]); return b + ")"; case "OpenLayers.Filter.Comparison": return a.type == OpenLayers.Filter.Comparison.BETWEEN ?
+ a.property + " BETWEEN " + this.write(a.lowerBoundary) + " AND " + this.write(a.upperBoundary) : null !== a.value ? a.property + " " + e[a.type] + " " + this.write(a.value) : a.property + " " + e[a.type]; case void 0: if ("string" === typeof a) return "'" + a.replace(/'/g, "''") + "'"; if ("number" === typeof a) return String(a); default: throw Error("Can't encode: " + a.CLASS_NAME + " " + a);
+ }
+ }, CLASS_NAME: "OpenLayers.Format.CQL"
+ })
+}();
+OpenLayers.Control.Split = OpenLayers.Class(OpenLayers.Control, {
+ layer: null, source: null, sourceOptions: null, tolerance: null, edge: !0, deferDelete: !1, mutual: !0, targetFilter: null, sourceFilter: null, handler: null, initialize: function(a) { OpenLayers.Control.prototype.initialize.apply(this, [a]); this.options = a || {}; this.options.source && this.setSource(this.options.source) }, setSource: function(a) {
+ this.active ? (this.deactivate(), this.handler && (this.handler.destroy(), delete this.handler), this.source = a, this.activate()) : this.source =
+ a
+ }, activate: function() { var a = OpenLayers.Control.prototype.activate.call(this); if (a) if (!this.source) this.handler || (this.handler = new OpenLayers.Handler.Path(this, { done: function(a) { this.onSketchComplete({ feature: new OpenLayers.Feature.Vector(a) }) } }, { layerOptions: this.sourceOptions })), this.handler.activate(); else if (this.source.events) this.source.events.on({ sketchcomplete: this.onSketchComplete, afterfeaturemodified: this.afterFeatureModified, scope: this }); return a }, deactivate: function() {
+ var a = OpenLayers.Control.prototype.deactivate.call(this);
+ a && this.source && this.source.events && this.source.events.un({ sketchcomplete: this.onSketchComplete, afterfeaturemodified: this.afterFeatureModified, scope: this }); return a
+ }, onSketchComplete: function(a) { this.feature = null; return !this.considerSplit(a.feature) }, afterFeatureModified: function(a) { a.modified && "function" === typeof a.feature.geometry.split && (this.feature = a.feature, this.considerSplit(a.feature)) }, removeByGeometry: function(a, b) { for (var c = 0, d = a.length; c < d; ++c)if (a[c].geometry === b) { a.splice(c, 1); break } },
+ isEligible: function(a) { return a.geometry ? a.state !== OpenLayers.State.DELETE && "function" === typeof a.geometry.split && this.feature !== a && (!this.targetFilter || this.targetFilter.evaluate(a.attributes)) : !1 }, considerSplit: function(a) {
+ var b = !1, c = !1; if (!this.sourceFilter || this.sourceFilter.evaluate(a.attributes)) {
+ for (var d = this.layer && this.layer.features || [], e, f, g = [], h = [], k = this.layer === this.source && this.mutual, l = { edge: this.edge, tolerance: this.tolerance, mutual: k }, m = [a.geometry], n, p, q, r = 0, t = d.length; r < t; ++r)if (n =
+ d[r], this.isEligible(n)) {
+ p = [n.geometry]; for (var u = 0; u < m.length; ++u) { q = m[u]; for (var v = 0; v < p.length; ++v)if (e = p[v], q.getBounds().intersectsBounds(e.getBounds()) && (e = q.split(e, l))) f = this.events.triggerEvent("beforesplit", { source: a, target: n }), !1 !== f && (k && (f = e[0], 1 < f.length && (f.unshift(u, 1), Array.prototype.splice.apply(m, f), u += f.length - 3), e = e[1]), 1 < e.length && (e.unshift(v, 1), Array.prototype.splice.apply(p, e), v += e.length - 3)) } p && 1 < p.length && (this.geomsToFeatures(n, p), this.events.triggerEvent("split", {
+ original: n,
+ features: p
+ }), Array.prototype.push.apply(g, p), h.push(n), c = !0)
+ } m && 1 < m.length && (this.geomsToFeatures(a, m), this.events.triggerEvent("split", { original: a, features: m }), Array.prototype.push.apply(g, m), h.push(a), b = !0); if (b || c) {
+ if (this.deferDelete) { d = []; r = 0; for (t = h.length; r < t; ++r)c = h[r], c.state === OpenLayers.State.INSERT ? d.push(c) : (c.state = OpenLayers.State.DELETE, this.layer.drawFeature(c)); this.layer.destroyFeatures(d, { silent: !0 }); r = 0; for (t = g.length; r < t; ++r)g[r].state = OpenLayers.State.INSERT } else this.layer.destroyFeatures(h,
+ { silent: !0 }); this.layer.addFeatures(g, { silent: !0 }); this.events.triggerEvent("aftersplit", { source: a, features: g })
+ }
+ } return b
+ }, geomsToFeatures: function(a, b) { var c = a.clone(); delete c.geometry; for (var d, e = 0, f = b.length; e < f; ++e)d = c.clone(), d.geometry = b[e], d.state = OpenLayers.State.INSERT, b[e] = d }, destroy: function() { this.active && this.deactivate(); OpenLayers.Control.prototype.destroy.call(this) }, CLASS_NAME: "OpenLayers.Control.Split"
+});
+OpenLayers.Layer.WMTS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+ isBaseLayer: !0, version: "1.0.0", requestEncoding: "KVP", url: null, layer: null, matrixSet: null, style: null, format: "image/jpeg", tileOrigin: null, tileFullExtent: null, formatSuffix: null, matrixIds: null, dimensions: null, params: null, zoomOffset: 0, serverResolutions: null, formatSuffixMap: { "image/png": "png", "image/png8": "png", "image/png24": "png", "image/png32": "png", png: "png", "image/jpeg": "jpg", "image/jpg": "jpg", jpeg: "jpg", jpg: "jpg" }, matrix: null, initialize: function(a) {
+ var b =
+ { url: !0, layer: !0, style: !0, matrixSet: !0 }, c; for (c in b) if (!(c in a)) throw Error("Missing property '" + c + "' in layer configuration."); a.params = OpenLayers.Util.upperCaseObject(a.params); OpenLayers.Layer.Grid.prototype.initialize.apply(this, [a.name, a.url, a.params, a]); this.formatSuffix || (this.formatSuffix = this.formatSuffixMap[this.format] || this.format.split("/").pop()); if (this.matrixIds && (a = this.matrixIds.length) && "string" === typeof this.matrixIds[0]) for (b = this.matrixIds, this.matrixIds = Array(a), c = 0; c < a; ++c)this.matrixIds[c] =
+ { identifier: b[c] }
+ }, setMap: function() { OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments) }, updateMatrixProperties: function() {
+ if (this.matrix = this.getMatrix()) this.matrix.topLeftCorner && (this.tileOrigin = this.matrix.topLeftCorner), this.matrix.tileWidth && this.matrix.tileHeight && (this.tileSize = new OpenLayers.Size(this.matrix.tileWidth, this.matrix.tileHeight)), this.tileOrigin || (this.tileOrigin = new OpenLayers.LonLat(this.maxExtent.left, this.maxExtent.top)), this.tileFullExtent || (this.tileFullExtent =
+ this.maxExtent)
+ }, moveTo: function(a, b, c) { !b && this.matrix || this.updateMatrixProperties(); return OpenLayers.Layer.Grid.prototype.moveTo.apply(this, arguments) }, clone: function(a) { null == a && (a = new OpenLayers.Layer.WMTS(this.options)); return OpenLayers.Layer.Grid.prototype.clone.apply(this, [a]) }, getIdentifier: function() { return this.getServerZoom() }, getMatrix: function() {
+ var a; if (this.matrixIds && 0 !== this.matrixIds.length) if ("scaleDenominator" in this.matrixIds[0]) for (var b = OpenLayers.METERS_PER_INCH * OpenLayers.INCHES_PER_UNIT[this.units] *
+ this.getServerResolution() / 2.8E-4, c = Number.POSITIVE_INFINITY, d, e = 0, f = this.matrixIds.length; e < f; ++e)d = Math.abs(1 - this.matrixIds[e].scaleDenominator / b), d < c && (c = d, a = this.matrixIds[e]); else a = this.matrixIds[this.getIdentifier()]; else a = { identifier: this.getIdentifier() }; return a
+ }, getTileInfo: function(a) {
+ var b = this.getServerResolution(), c = (a.lon - this.tileOrigin.lon) / (b * this.tileSize.w); a = (this.tileOrigin.lat - a.lat) / (b * this.tileSize.h); var b = Math.floor(c), d = Math.floor(a); return {
+ col: b, row: d, i: Math.floor((c -
+ b) * this.tileSize.w), j: Math.floor((a - d) * this.tileSize.h)
+ }
+ }, getURL: function(a) {
+ a = this.adjustBounds(a); var b = ""; if (!this.tileFullExtent || this.tileFullExtent.intersectsBounds(a)) {
+ a = a.getCenterLonLat(); var c = this.getTileInfo(a); a = this.dimensions; var d, b = OpenLayers.Util.isArray(this.url) ? this.selectUrl([this.version, this.style, this.matrixSet, this.matrix.identifier, c.row, c.col].join(), this.url) : this.url; if ("REST" === this.requestEncoding.toUpperCase()) if (d = this.params, -1 !== b.indexOf("{")) {
+ b = b.replace(/\{/g,
+ "${"); c = { style: this.style, Style: this.style, TileMatrixSet: this.matrixSet, TileMatrix: this.matrix.identifier, TileRow: c.row, TileCol: c.col }; if (a) { var e, f; for (f = a.length - 1; 0 <= f; --f)e = a[f], c[e] = d[e.toUpperCase()] } b = OpenLayers.String.format(b, c)
+ } else { e = this.version + "/" + this.layer + "/" + this.style + "/"; if (a) for (f = 0; f < a.length; f++)d[a[f]] && (e = e + d[a[f]] + "/"); e = e + this.matrixSet + "/" + this.matrix.identifier + "/" + c.row + "/" + c.col + "." + this.formatSuffix; b.match(/\/$/) || (b += "/"); b += e } else "KVP" === this.requestEncoding.toUpperCase() &&
+ (d = { SERVICE: "WMTS", REQUEST: "GetTile", VERSION: this.version, LAYER: this.layer, STYLE: this.style, TILEMATRIXSET: this.matrixSet, TILEMATRIX: this.matrix.identifier, TILEROW: c.row, TILECOL: c.col, FORMAT: this.format }, b = OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this, [d]))
+ } return b
+ }, mergeNewParams: function(a) { if ("KVP" === this.requestEncoding.toUpperCase()) return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, [OpenLayers.Util.upperCaseObject(a)]) }, CLASS_NAME: "OpenLayers.Layer.WMTS"
+});
+OpenLayers.Protocol.SOS.v1_0_0 = OpenLayers.Class(OpenLayers.Protocol, {
+ fois: null, formatOptions: null, initialize: function(a) { OpenLayers.Protocol.prototype.initialize.apply(this, [a]); a.format || (this.format = new OpenLayers.Format.SOSGetFeatureOfInterest(this.formatOptions)) }, destroy: function() { this.options && !this.options.format && this.format.destroy(); this.format = null; OpenLayers.Protocol.prototype.destroy.apply(this) }, read: function(a) {
+ a = OpenLayers.Util.extend({}, a); OpenLayers.Util.applyDefaults(a, this.options ||
+ {}); var b = new OpenLayers.Protocol.Response({ requestType: "read" }), c = this.format, c = OpenLayers.Format.XML.prototype.write.apply(c, [c.writeNode("sos:GetFeatureOfInterest", { fois: this.fois })]); b.priv = OpenLayers.Request.POST({ url: a.url, callback: this.createCallback(this.handleRead, b, a), data: c }); return b
+ }, handleRead: function(a, b) {
+ if (b.callback) {
+ var c = a.priv; 200 <= c.status && 300 > c.status ? (a.features = this.parseFeatures(c), a.code = OpenLayers.Protocol.Response.SUCCESS) : a.code = OpenLayers.Protocol.Response.FAILURE;
+ b.callback.call(b.scope, a)
+ }
+ }, parseFeatures: function(a) { var b = a.responseXML; b && b.documentElement || (b = a.responseText); return !b || 0 >= b.length ? null : this.format.read(b) }, CLASS_NAME: "OpenLayers.Protocol.SOS.v1_0_0"
+});
+OpenLayers.Layer.KaMapCache = OpenLayers.Class(OpenLayers.Layer.KaMap, {
+ IMAGE_EXTENSIONS: { jpeg: "jpg", gif: "gif", png: "png", png8: "png", png24: "png", dithered: "png" }, DEFAULT_FORMAT: "jpeg", initialize: function(a, b, c, d) { OpenLayers.Layer.KaMap.prototype.initialize.apply(this, arguments); this.extension = this.IMAGE_EXTENSIONS[this.params.i.toLowerCase() || this.DEFAULT_FORMAT] }, getURL: function(a) {
+ a = this.adjustBounds(a); var b = this.map.getResolution(), c = Math.round(1E4 * this.map.getScale()) / 1E4, d = Math.round(a.left / b); a =
+ -Math.round(a.top / b); var b = Math.floor(d / this.tileSize.w / this.params.metaTileSize.w) * this.tileSize.w * this.params.metaTileSize.w, e = Math.floor(a / this.tileSize.h / this.params.metaTileSize.h) * this.tileSize.h * this.params.metaTileSize.h, c = ["/", this.params.map, "/", c, "/", this.params.g.replace(/\s/g, "_"), "/def/t", e, "/l", b, "/t", a, "l", d, ".", this.extension], d = this.url; OpenLayers.Util.isArray(d) && (d = this.selectUrl(c.join(""), d)); return d + c.join("")
+ }, CLASS_NAME: "OpenLayers.Layer.KaMapCache"
+});
+OpenLayers.Protocol.WFS.v1_1_0 = OpenLayers.Class(OpenLayers.Protocol.WFS.v1, { version: "1.1.0", initialize: function(a) { OpenLayers.Protocol.WFS.v1.prototype.initialize.apply(this, arguments); this.outputFormat && !this.readFormat && ("gml2" == this.outputFormat.toLowerCase() ? this.readFormat = new OpenLayers.Format.GML.v2({ featureType: this.featureType, featureNS: this.featureNS, geometryName: this.geometryName }) : "json" == this.outputFormat.toLowerCase() && (this.readFormat = new OpenLayers.Format.GeoJSON)) }, CLASS_NAME: "OpenLayers.Protocol.WFS.v1_1_0" });
+OpenLayers.Format.WMSCapabilities.v1_1_1 = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_1, { version: "1.1.1", readers: { wms: OpenLayers.Util.applyDefaults({ SRS: function(a, b) { b.srs[this.getChildValue(a)] = !0 } }, OpenLayers.Format.WMSCapabilities.v1_1.prototype.readers.wms) }, CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1_1" });
+OpenLayers.Format.WMSCapabilities.v1_1_1_WMSC = OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_1_1, {
+ version: "1.1.1", profile: "WMSC", readers: {
+ wms: OpenLayers.Util.applyDefaults({
+ VendorSpecificCapabilities: function(a, b) { b.vendorSpecific = { tileSets: [] }; this.readChildNodes(a, b.vendorSpecific) }, TileSet: function(a, b) { var c = { srs: {}, bbox: {}, resolutions: [] }; this.readChildNodes(a, c); b.tileSets.push(c) }, Resolutions: function(a, b) { for (var c = this.getChildValue(a).split(" "), d = 0, e = c.length; d < e; d++)"" != c[d] && b.resolutions.push(parseFloat(c[d])) },
+ Width: function(a, b) { b.width = parseInt(this.getChildValue(a)) }, Height: function(a, b) { b.height = parseInt(this.getChildValue(a)) }, Layers: function(a, b) { b.layers = this.getChildValue(a) }, Styles: function(a, b) { b.styles = this.getChildValue(a) }
+ }, OpenLayers.Format.WMSCapabilities.v1_1_1.prototype.readers.wms)
+ }, CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1_1_WMSC"
+});
+OpenLayers.Control.LayerSwitcher = OpenLayers.Class(OpenLayers.Control, {
+ layerStates: null, layersDiv: null, baseLayersDiv: null, baseLayers: null, dataLbl: null, dataLayersDiv: null, dataLayers: null, minimizeDiv: null, maximizeDiv: null, ascending: !0, initialize: function(a) { OpenLayers.Control.prototype.initialize.apply(this, arguments); this.layerStates = [] }, destroy: function() {
+ this.clearLayersArray("base"); this.clearLayersArray("data"); this.map.events.un({
+ buttonclick: this.onButtonClick, addlayer: this.redraw, changelayer: this.redraw,
+ removelayer: this.redraw, changebaselayer: this.redraw, scope: this
+ }); this.events.unregister("buttonclick", this, this.onButtonClick); OpenLayers.Control.prototype.destroy.apply(this, arguments)
+ }, setMap: function(a) {
+ OpenLayers.Control.prototype.setMap.apply(this, arguments); this.map.events.on({ addlayer: this.redraw, changelayer: this.redraw, removelayer: this.redraw, changebaselayer: this.redraw, scope: this }); this.outsideViewport ? (this.events.attachToElement(this.div), this.events.register("buttonclick", this, this.onButtonClick)) :
+ this.map.events.register("buttonclick", this, this.onButtonClick)
+ }, draw: function() { OpenLayers.Control.prototype.draw.apply(this); this.loadContents(); this.outsideViewport || this.minimizeControl(); this.redraw(); return this.div }, onButtonClick: function(a) {
+ a = a.buttonElement; a === this.minimizeDiv ? this.minimizeControl() : a === this.maximizeDiv ? this.maximizeControl() : a._layerSwitcher === this.id && (a["for"] && (a = document.getElementById(a["for"])), a.disabled || ("radio" == a.type ? (a.checked = !0, this.map.setBaseLayer(this.map.getLayer(a._layer))) :
+ (a.checked = !a.checked, this.updateMap())))
+ }, clearLayersArray: function(a) { this[a + "LayersDiv"].innerHTML = ""; this[a + "Layers"] = [] }, checkRedraw: function() { if (!this.layerStates.length || this.map.layers.length != this.layerStates.length) return !0; for (var a = 0, b = this.layerStates.length; a < b; a++) { var c = this.layerStates[a], d = this.map.layers[a]; if (c.name != d.name || c.inRange != d.inRange || c.id != d.id || c.visibility != d.visibility) return !0 } return !1 }, redraw: function() {
+ if (!this.checkRedraw()) return this.div; this.clearLayersArray("base");
+ this.clearLayersArray("data"); var a = !1, b = !1, c = this.map.layers.length; this.layerStates = Array(c); for (var d = 0; d < c; d++) { var e = this.map.layers[d]; this.layerStates[d] = { name: e.name, visibility: e.visibility, inRange: e.inRange, id: e.id } } var f = this.map.layers.slice(); this.ascending || f.reverse(); d = 0; for (c = f.length; d < c; d++) {
+ var e = f[d], g = e.isBaseLayer; if (e.displayInLayerSwitcher) {
+ g ? b = !0 : a = !0; var h = g ? e == this.map.baseLayer : e.getVisibility(), k = document.createElement("input"), l = OpenLayers.Util.createUniqueID(this.id +
+ "_input_"); k.id = l; k.name = g ? this.id + "_baseLayers" : e.name; k.type = g ? "radio" : "checkbox"; k.value = e.name; k.checked = h; k.defaultChecked = h; k.className = "olButton"; k._layer = e.id; k._layerSwitcher = this.id; g || e.inRange || (k.disabled = !0); h = document.createElement("label"); h["for"] = k.id; OpenLayers.Element.addClass(h, "labelSpan olButton"); h._layer = e.id; h._layerSwitcher = this.id; g || e.inRange || (h.style.color = "gray"); h.innerHTML = e.name; h.style.verticalAlign = g ? "bottom" : "baseline"; l = document.createElement("br"); (g ? this.baseLayers :
+ this.dataLayers).push({ layer: e, inputElem: k, labelSpan: h }); e = g ? this.baseLayersDiv : this.dataLayersDiv; e.appendChild(k); e.appendChild(h); e.appendChild(l)
+ }
+ } this.dataLbl.style.display = a ? "" : "none"; this.baseLbl.style.display = b ? "" : "none"; return this.div
+ }, updateMap: function() { for (var a = 0, b = this.baseLayers.length; a < b; a++) { var c = this.baseLayers[a]; c.inputElem.checked && this.map.setBaseLayer(c.layer, !1) } a = 0; for (b = this.dataLayers.length; a < b; a++)c = this.dataLayers[a], c.layer.setVisibility(c.inputElem.checked) }, maximizeControl: function(a) {
+ this.div.style.width =
+ ""; this.div.style.height = ""; this.showControls(!1); null != a && OpenLayers.Event.stop(a)
+ }, minimizeControl: function(a) { this.div.style.width = "0px"; this.div.style.height = "0px"; this.showControls(!0); null != a && OpenLayers.Event.stop(a) }, showControls: function(a) { this.maximizeDiv.style.display = a ? "" : "none"; this.minimizeDiv.style.display = a ? "none" : ""; this.layersDiv.style.display = a ? "none" : "" }, loadContents: function() {
+ this.layersDiv = document.createElement("div"); this.layersDiv.id = this.id + "_layersDiv"; OpenLayers.Element.addClass(this.layersDiv,
+ "layersDiv"); this.baseLbl = document.createElement("div"); this.baseLbl.innerHTML = OpenLayers.i18n("Base Layer"); OpenLayers.Element.addClass(this.baseLbl, "baseLbl"); this.baseLayersDiv = document.createElement("div"); OpenLayers.Element.addClass(this.baseLayersDiv, "baseLayersDiv"); this.dataLbl = document.createElement("div"); this.dataLbl.innerHTML = OpenLayers.i18n("Overlays"); OpenLayers.Element.addClass(this.dataLbl, "dataLbl"); this.dataLayersDiv = document.createElement("div"); OpenLayers.Element.addClass(this.dataLayersDiv,
+ "dataLayersDiv"); this.ascending ? (this.layersDiv.appendChild(this.baseLbl), this.layersDiv.appendChild(this.baseLayersDiv), this.layersDiv.appendChild(this.dataLbl), this.layersDiv.appendChild(this.dataLayersDiv)) : (this.layersDiv.appendChild(this.dataLbl), this.layersDiv.appendChild(this.dataLayersDiv), this.layersDiv.appendChild(this.baseLbl), this.layersDiv.appendChild(this.baseLayersDiv)); this.div.appendChild(this.layersDiv); var a = OpenLayers.Util.getImageLocation("layer-switcher-maximize.png"); this.maximizeDiv =
+ OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MaximizeDiv", null, null, a, "absolute"); OpenLayers.Element.addClass(this.maximizeDiv, "maximizeDiv olButton"); this.maximizeDiv.style.display = "none"; this.div.appendChild(this.maximizeDiv); a = OpenLayers.Util.getImageLocation("layer-switcher-minimize.png"); this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MinimizeDiv", null, null, a, "absolute"); OpenLayers.Element.addClass(this.minimizeDiv, "minimizeDiv olButton"); this.minimizeDiv.style.display =
+ "none"; this.div.appendChild(this.minimizeDiv)
+ }, CLASS_NAME: "OpenLayers.Control.LayerSwitcher"
+});
+OpenLayers.Format.Atom = OpenLayers.Class(OpenLayers.Format.XML, {
+ namespaces: { atom: "http://www.w3.org/2005/Atom", georss: "http://www.georss.org/georss" }, feedTitle: "untitled", defaultEntryTitle: "untitled", gmlParser: null, xy: !1, read: function(a) { "string" == typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); return this.parseFeatures(a) }, write: function(a) {
+ var b; if (OpenLayers.Util.isArray(a)) {
+ b = this.createElementNSPlus("atom:feed"); b.appendChild(this.createElementNSPlus("atom:title", { value: this.feedTitle }));
+ for (var c = 0, d = a.length; c < d; c++)b.appendChild(this.buildEntryNode(a[c]))
+ } else b = this.buildEntryNode(a); return OpenLayers.Format.XML.prototype.write.apply(this, [b])
+ }, buildContentNode: function(a) {
+ var b = this.createElementNSPlus("atom:content", { attributes: { type: a.type || null } }); if (a.src) b.setAttribute("src", a.src); else if ("text" == a.type || null == a.type) b.appendChild(this.createTextNode(a.value)); else if ("html" == a.type) { if ("string" != typeof a.value) throw "HTML content must be in form of an escaped string"; b.appendChild(this.createTextNode(a.value)) } else "xhtml" ==
+ a.type ? b.appendChild(a.value) : "xhtml" == a.type || a.type.match(/(\+|\/)xml$/) ? b.appendChild(a.value) : b.appendChild(this.createTextNode(a.value)); return b
+ }, buildEntryNode: function(a) {
+ var b = a.attributes, c = b.atom || {}, d = this.createElementNSPlus("atom:entry"); if (c.authors) for (var e = OpenLayers.Util.isArray(c.authors) ? c.authors : [c.authors], f = 0, g = e.length; f < g; f++)d.appendChild(this.buildPersonConstructNode("author", e[f])); if (c.categories) for (var e = OpenLayers.Util.isArray(c.categories) ? c.categories : [c.categories],
+ h, f = 0, g = e.length; f < g; f++)h = e[f], d.appendChild(this.createElementNSPlus("atom:category", { attributes: { term: h.term, scheme: h.scheme || null, label: h.label || null } })); c.content && d.appendChild(this.buildContentNode(c.content)); if (c.contributors) for (e = OpenLayers.Util.isArray(c.contributors) ? c.contributors : [c.contributors], f = 0, g = e.length; f < g; f++)d.appendChild(this.buildPersonConstructNode("contributor", e[f])); a.fid && d.appendChild(this.createElementNSPlus("atom:id", { value: a.fid })); if (c.links) for (e = OpenLayers.Util.isArray(c.links) ?
+ c.links : [c.links], f = 0, g = e.length; f < g; f++)h = e[f], d.appendChild(this.createElementNSPlus("atom:link", { attributes: { href: h.href, rel: h.rel || null, type: h.type || null, hreflang: h.hreflang || null, title: h.title || null, length: h.length || null } })); c.published && d.appendChild(this.createElementNSPlus("atom:published", { value: c.published })); c.rights && d.appendChild(this.createElementNSPlus("atom:rights", { value: c.rights })); (c.summary || b.description) && d.appendChild(this.createElementNSPlus("atom:summary", {
+ value: c.summary ||
+ b.description
+ })); d.appendChild(this.createElementNSPlus("atom:title", { value: c.title || b.title || this.defaultEntryTitle })); c.updated && d.appendChild(this.createElementNSPlus("atom:updated", { value: c.updated })); a.geometry && (b = this.createElementNSPlus("georss:where"), b.appendChild(this.buildGeometryNode(a.geometry)), d.appendChild(b)); return d
+ }, initGmlParser: function() {
+ this.gmlParser = new OpenLayers.Format.GML.v3({
+ xy: this.xy, featureNS: "http://example.com#feature", internalProjection: this.internalProjection,
+ externalProjection: this.externalProjection
+ })
+ }, buildGeometryNode: function(a) { this.gmlParser || this.initGmlParser(); return this.gmlParser.writeNode("feature:_geometry", a).firstChild }, buildPersonConstructNode: function(a, b) { var c = ["uri", "email"], d = this.createElementNSPlus("atom:" + a); d.appendChild(this.createElementNSPlus("atom:name", { value: b.name })); for (var e = 0, f = c.length; e < f; e++)b[c[e]] && d.appendChild(this.createElementNSPlus("atom:" + c[e], { value: b[c[e]] })); return d }, getFirstChildValue: function(a, b, c,
+ d) { return (a = this.getElementsByTagNameNS(a, b, c)) && 0 < a.length ? this.getChildValue(a[0], d) : d }, parseFeature: function(a) {
+ var b = {}, c = null, d = null, e = null, f = this.namespaces.atom; this.parsePersonConstructs(a, "author", b); d = this.getElementsByTagNameNS(a, f, "category"); 0 < d.length && (b.categories = []); for (var g = 0, h = d.length; g < h; g++) { c = {}; c.term = d[g].getAttribute("term"); if (e = d[g].getAttribute("scheme")) c.scheme = e; if (e = d[g].getAttribute("label")) c.label = e; b.categories.push(c) } d = this.getElementsByTagNameNS(a, f, "content");
+ if (0 < d.length) { c = {}; if (e = d[0].getAttribute("type")) c.type = e; (e = d[0].getAttribute("src")) ? c.src = e : ("text" == c.type || "html" == c.type || null == c.type ? c.value = this.getFirstChildValue(a, f, "content", null) : "xhtml" == c.type || c.type.match(/(\+|\/)xml$/) ? c.value = this.getChildEl(d[0]) : c.value = this.getFirstChildValue(a, f, "content", null), b.content = c) } this.parsePersonConstructs(a, "contributor", b); b.id = this.getFirstChildValue(a, f, "id", null); d = this.getElementsByTagNameNS(a, f, "link"); 0 < d.length && (b.links = Array(d.length));
+ for (var k = ["rel", "type", "hreflang", "title", "length"], g = 0, h = d.length; g < h; g++) { c = {}; c.href = d[g].getAttribute("href"); for (var l = 0, m = k.length; l < m; l++)(e = d[g].getAttribute(k[l])) && (c[k[l]] = e); b.links[g] = c } if (c = this.getFirstChildValue(a, f, "published", null)) b.published = c; if (c = this.getFirstChildValue(a, f, "rights", null)) b.rights = c; if (c = this.getFirstChildValue(a, f, "summary", null)) b.summary = c; b.title = this.getFirstChildValue(a, f, "title", null); b.updated = this.getFirstChildValue(a, f, "updated", null); c = {
+ title: b.title,
+ description: b.summary, atom: b
+ }; a = this.parseLocations(a)[0]; a = new OpenLayers.Feature.Vector(a, c); a.fid = b.id; return a
+ }, parseFeatures: function(a) { var b = [], c = this.getElementsByTagNameNS(a, this.namespaces.atom, "entry"); 0 == c.length && (c = [a]); a = 0; for (var d = c.length; a < d; a++)b.push(this.parseFeature(c[a])); return b }, parseLocations: function(a) {
+ var b = this.namespaces.georss, c = { components: [] }, d = this.getElementsByTagNameNS(a, b, "where"); if (d && 0 < d.length) {
+ this.gmlParser || this.initGmlParser(); for (var e = 0, f = d.length; e <
+ f; e++)this.gmlParser.readChildNodes(d[e], c)
+ } c = c.components; if ((d = this.getElementsByTagNameNS(a, b, "point")) && 0 < d.length) for (e = 0, f = d.length; e < f; e++) { var g = OpenLayers.String.trim(d[e].firstChild.nodeValue).split(/\s+/); 2 != g.length && (g = OpenLayers.String.trim(d[e].firstChild.nodeValue).split(/\s*,\s*/)); c.push(new OpenLayers.Geometry.Point(g[1], g[0])) } var h = this.getElementsByTagNameNS(a, b, "line"); if (h && 0 < h.length) for (var k, e = 0, f = h.length; e < f; e++) {
+ d = OpenLayers.String.trim(h[e].firstChild.nodeValue).split(/\s+/);
+ k = []; for (var l = 0, m = d.length; l < m; l += 2)g = new OpenLayers.Geometry.Point(d[l + 1], d[l]), k.push(g); c.push(new OpenLayers.Geometry.LineString(k))
+ } if ((a = this.getElementsByTagNameNS(a, b, "polygon")) && 0 < a.length) for (e = 0, f = a.length; e < f; e++) { d = OpenLayers.String.trim(a[e].firstChild.nodeValue).split(/\s+/); k = []; l = 0; for (m = d.length; l < m; l += 2)g = new OpenLayers.Geometry.Point(d[l + 1], d[l]), k.push(g); c.push(new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(k)])) } if (this.internalProjection && this.externalProjection) for (e =
+ 0, f = c.length; e < f; e++)c[e] && c[e].transform(this.externalProjection, this.internalProjection); return c
+ }, parsePersonConstructs: function(a, b, c) { var d = [], e = this.namespaces.atom; a = this.getElementsByTagNameNS(a, e, b); for (var f = ["uri", "email"], g = 0, h = a.length; g < h; g++) { var k = {}; k.name = this.getFirstChildValue(a[g], e, "name", null); for (var l = 0, m = f.length; l < m; l++) { var n = this.getFirstChildValue(a[g], e, f[l], null); n && (k[f[l]] = n) } d.push(k) } 0 < d.length && (c[b + "s"] = d) }, CLASS_NAME: "OpenLayers.Format.Atom"
+});
+OpenLayers.Control.KeyboardDefaults = OpenLayers.Class(OpenLayers.Control, {
+ autoActivate: !0, slideFactor: 75, observeElement: null, draw: function() { this.handler = new OpenLayers.Handler.Keyboard(this, { keydown: this.defaultKeyPress }, { observeElement: this.observeElement || document }) }, defaultKeyPress: function(a) {
+ var b, c = !0; b = OpenLayers.Event.element(a); if (!b || "INPUT" != b.tagName && "TEXTAREA" != b.tagName && "SELECT" != b.tagName) {
+ switch (a.keyCode) {
+ case OpenLayers.Event.KEY_LEFT: this.map.pan(-this.slideFactor, 0); break; case OpenLayers.Event.KEY_RIGHT: this.map.pan(this.slideFactor,
+ 0); break; case OpenLayers.Event.KEY_UP: this.map.pan(0, -this.slideFactor); break; case OpenLayers.Event.KEY_DOWN: this.map.pan(0, this.slideFactor); break; case 33: b = this.map.getSize(); this.map.pan(0, -.75 * b.h); break; case 34: b = this.map.getSize(); this.map.pan(0, .75 * b.h); break; case 35: b = this.map.getSize(); this.map.pan(.75 * b.w, 0); break; case 36: b = this.map.getSize(); this.map.pan(-.75 * b.w, 0); break; case 43: case 61: case 187: case 107: this.map.zoomIn(); break; case 45: case 109: case 189: case 95: this.map.zoomOut(); break;
+ default: c = !1
+ }c && OpenLayers.Event.stop(a)
+ }
+ }, CLASS_NAME: "OpenLayers.Control.KeyboardDefaults"
+});
+OpenLayers.Format.WMTSCapabilities.v1_0_0 = OpenLayers.Class(OpenLayers.Format.OWSCommon.v1_1_0, {
+ version: "1.0.0", namespaces: { ows: "http://www.opengis.net/ows/1.1", wmts: "http://www.opengis.net/wmts/1.0", xlink: "http://www.w3.org/1999/xlink" }, yx: null, defaultPrefix: "wmts", initialize: function(a) { OpenLayers.Format.XML.prototype.initialize.apply(this, [a]); this.options = a; a = OpenLayers.Util.extend({}, OpenLayers.Format.WMTSCapabilities.prototype.yx); this.yx = OpenLayers.Util.extend(a, this.yx) }, read: function(a) {
+ "string" ==
+ typeof a && (a = OpenLayers.Format.XML.prototype.read.apply(this, [a])); a && 9 == a.nodeType && (a = a.documentElement); var b = {}; this.readNode(a, b); b.version = this.version; return b
+ }, readers: {
+ wmts: {
+ Capabilities: function(a, b) { this.readChildNodes(a, b) }, Contents: function(a, b) { b.contents = {}; b.contents.layers = []; b.contents.tileMatrixSets = {}; this.readChildNodes(a, b.contents) }, Layer: function(a, b) { var c = { styles: [], formats: [], dimensions: [], tileMatrixSetLinks: [], layers: [] }; this.readChildNodes(a, c); b.layers.push(c) }, Style: function(a,
+ b) { var c = {}; c.isDefault = "true" === a.getAttribute("isDefault"); this.readChildNodes(a, c); b.styles.push(c) }, Format: function(a, b) { b.formats.push(this.getChildValue(a)) }, TileMatrixSetLink: function(a, b) { var c = {}; this.readChildNodes(a, c); b.tileMatrixSetLinks.push(c) }, TileMatrixSet: function(a, b) { if (b.layers) { var c = { matrixIds: [] }; this.readChildNodes(a, c); b.tileMatrixSets[c.identifier] = c } else b.tileMatrixSet = this.getChildValue(a) }, TileMatrix: function(a, b) {
+ var c = { supportedCRS: b.supportedCRS }; this.readChildNodes(a,
+ c); b.matrixIds.push(c)
+ }, ScaleDenominator: function(a, b) { b.scaleDenominator = parseFloat(this.getChildValue(a)) }, TopLeftCorner: function(a, b) { var c = this.getChildValue(a).split(" "), d; b.supportedCRS && (d = b.supportedCRS.replace(/urn:ogc:def:crs:(\w+):.+:(\w+)$/, "urn:ogc:def:crs:$1::$2"), d = !!this.yx[d]); b.topLeftCorner = d ? new OpenLayers.LonLat(c[1], c[0]) : new OpenLayers.LonLat(c[0], c[1]) }, TileWidth: function(a, b) { b.tileWidth = parseInt(this.getChildValue(a)) }, TileHeight: function(a, b) { b.tileHeight = parseInt(this.getChildValue(a)) },
+ MatrixWidth: function(a, b) { b.matrixWidth = parseInt(this.getChildValue(a)) }, MatrixHeight: function(a, b) { b.matrixHeight = parseInt(this.getChildValue(a)) }, ResourceURL: function(a, b) { b.resourceUrl = b.resourceUrl || {}; var c = a.getAttribute("resourceType"); b.resourceUrls || (b.resourceUrls = []); c = b.resourceUrl[c] = { format: a.getAttribute("format"), template: a.getAttribute("template"), resourceType: c }; b.resourceUrls.push(c) }, WSDL: function(a, b) { b.wsdl = {}; b.wsdl.href = a.getAttribute("xlink:href") }, ServiceMetadataURL: function(a,
+ b) { b.serviceMetadataUrl = {}; b.serviceMetadataUrl.href = a.getAttribute("xlink:href") }, LegendURL: function(a, b) { b.legend = {}; b.legend.href = a.getAttribute("xlink:href"); b.legend.format = a.getAttribute("format") }, Dimension: function(a, b) { var c = { values: [] }; this.readChildNodes(a, c); b.dimensions.push(c) }, Default: function(a, b) { b["default"] = this.getChildValue(a) }, Value: function(a, b) { b.values.push(this.getChildValue(a)) }
+ }, ows: OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers.ows
+ }, CLASS_NAME: "OpenLayers.Format.WMTSCapabilities.v1_0_0"
+}); \ No newline at end of file
diff --git a/plugins/OpenStreet/images/gg.png b/plugins/OpenStreet/images/gg.png
new file mode 100755
index 0000000..3c38bfd
--- /dev/null
+++ b/plugins/OpenStreet/images/gg.png
Binary files differ
diff --git a/plugins/OpenStreet/key.txt b/plugins/OpenStreet/key.txt
new file mode 100755
index 0000000..8b13789
--- /dev/null
+++ b/plugins/OpenStreet/key.txt
@@ -0,0 +1 @@
+
diff --git a/plugins/OpenStreet/save.php b/plugins/OpenStreet/save.php
new file mode 100755
index 0000000..72ac4dc
--- /dev/null
+++ b/plugins/OpenStreet/save.php
@@ -0,0 +1,10 @@
+<?php
+$post_data = $_POST["key"];
+ $filename ="./key.txt";
+ $handle = fopen($filename, "w");
+if (!empty($post_data)) {
+ fwrite($handle,$post_data);
+}
+ fclose($handle);
+ return 1;
+?>
diff --git a/plugins/a11yhelp/dialogs/a11yhelp.js b/plugins/a11yhelp/dialogs/a11yhelp.js
new file mode 100755
index 0000000..7f8c04a
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/a11yhelp.js
@@ -0,0 +1,26 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("a11yHelp", function(f) {
+ function m(a) { for (var b, c, h = [], d = 0; d < g.length; d++)c = g[d], b = a / g[d], 1 < b && 2 >= b && (a -= c, h.push(e[c])); h.push(e[a] || String.fromCharCode(a)); return h.join("+") } function t(a, b) { var c = f.getCommandKeystroke(b, !0); return c.length ? CKEDITOR.tools.array.map(c, m).join(" / ") : a } var a = f.lang.a11yhelp, b = f.lang.common.keyboard, p = CKEDITOR.tools.getNextId(), q = /\$\{(.*?)\}/g, g = [CKEDITOR.ALT, CKEDITOR.SHIFT, CKEDITOR.CTRL], e = {
+ 8: b[8], 9: a.tab, 13: b[13], 16: b[16], 17: b[17], 18: b[18], 19: a.pause,
+ 20: a.capslock, 27: a.escape, 33: a.pageUp, 34: a.pageDown, 35: b[35], 36: b[36], 37: a.leftArrow, 38: a.upArrow, 39: a.rightArrow, 40: a.downArrow, 45: a.insert, 46: b[46], 91: a.leftWindowKey, 92: a.rightWindowKey, 93: a.selectKey, 96: a.numpad0, 97: a.numpad1, 98: a.numpad2, 99: a.numpad3, 100: a.numpad4, 101: a.numpad5, 102: a.numpad6, 103: a.numpad7, 104: a.numpad8, 105: a.numpad9, 106: a.multiply, 107: a.add, 109: a.subtract, 110: a.decimalPoint, 111: a.divide, 112: a.f1, 113: a.f2, 114: a.f3, 115: a.f4, 116: a.f5, 117: a.f6, 118: a.f7, 119: a.f8, 120: a.f9, 121: a.f10,
+ 122: a.f11, 123: a.f12, 144: a.numLock, 145: a.scrollLock, 186: a.semiColon, 187: a.equalSign, 188: a.comma, 189: a.dash, 190: a.period, 191: a.forwardSlash, 192: a.graveAccent, 219: a.openBracket, 220: a.backSlash, 221: a.closeBracket, 222: a.singleQuote
+ }; e[CKEDITOR.ALT] = b[18]; e[CKEDITOR.SHIFT] = b[16]; e[CKEDITOR.CTRL] = CKEDITOR.env.mac ? b[224] : b[17]; return {
+ title: a.title, minWidth: 600, minHeight: 400, contents: [{
+ id: "info", label: f.lang.common.generalTab, expand: !0, elements: [{
+ type: "html", id: "legends", style: "white-space:normal;", focus: function() { this.getElement().focus() },
+ html: function() {
+ for (var b = '\x3cdiv class\x3d"cke_accessibility_legend" role\x3d"document" aria-labelledby\x3d"' + p + '_arialbl" tabIndex\x3d"-1"\x3e%1\x3c/div\x3e\x3cspan id\x3d"' + p + '_arialbl" class\x3d"cke_voice_label"\x3e' + a.contents + " \x3c/span\x3e", e = [], c = a.legend, h = c.length, d = 0; d < h; d++) {
+ for (var f = c[d], g = [], r = f.items, m = r.length, n = 0; n < m; n++) {
+ var k = r[n], l = CKEDITOR.env.edge && k.legendEdge ? k.legendEdge : k.legend, l = l.replace(q, t); l.match(q) || g.push("\x3cdt\x3e%1\x3c/dt\x3e\x3cdd\x3e%2\x3c/dd\x3e".replace("%1",
+ k.name).replace("%2", l))
+ } e.push("\x3ch1\x3e%1\x3c/h1\x3e\x3cdl\x3e%2\x3c/dl\x3e".replace("%1", f.name).replace("%2", g.join("")))
+ } return b.replace("%1", e.join(""))
+ }() + '\x3cstyle type\x3d"text/css"\x3e.cke_accessibility_legend{width:600px;height:400px;padding-right:5px;overflow-y:auto;overflow-x:hidden;}.cke_browser_quirks .cke_accessibility_legend,{height:390px}.cke_accessibility_legend *{white-space:normal;}.cke_accessibility_legend h1{font-size: 20px;border-bottom: 1px solid #AAA;margin: 5px 0px 15px;}.cke_accessibility_legend dl{margin-left: 5px;}.cke_accessibility_legend dt{font-size: 13px;font-weight: bold;}.cke_accessibility_legend dd{margin:10px}\x3c/style\x3e'
+ }]
+ }],
+ buttons: [CKEDITOR.dialog.cancelButton]
+ }
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/_translationstatus.txt b/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
new file mode 100755
index 0000000..27b8bd8
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,25 @@
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+
+cs.js Found: 30 Missing: 0
+cy.js Found: 30 Missing: 0
+da.js Found: 12 Missing: 18
+de.js Found: 30 Missing: 0
+el.js Found: 25 Missing: 5
+eo.js Found: 30 Missing: 0
+fa.js Found: 30 Missing: 0
+fi.js Found: 30 Missing: 0
+fr.js Found: 30 Missing: 0
+gu.js Found: 12 Missing: 18
+he.js Found: 30 Missing: 0
+it.js Found: 30 Missing: 0
+mk.js Found: 5 Missing: 25
+nb.js Found: 30 Missing: 0
+nl.js Found: 30 Missing: 0
+no.js Found: 30 Missing: 0
+pt-br.js Found: 30 Missing: 0
+ro.js Found: 6 Missing: 24
+tr.js Found: 30 Missing: 0
+ug.js Found: 27 Missing: 3
+vi.js Found: 6 Missing: 24
+zh-cn.js Found: 30 Missing: 0
diff --git a/plugins/a11yhelp/dialogs/lang/af.js b/plugins/a11yhelp/dialogs/lang/af.js
new file mode 100755
index 0000000..91499cb
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/af.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "af", {
+ title: "Toeganglikheid instruksies", contents: "Hulp inhoud. Druk ESC om toe te maak.", legend: [{
+ name: "Algemeen", items: [{ name: "Bewerker balk", legend: "Druk ${toolbarFocus} om op die werkbalk te land. Beweeg na die volgende en voorige wekrbalkgroep met TAB and SHIFT+TAB. Beweeg na die volgende en voorige werkbalkknop met die regter of linker pyl. Druk SPASIE of ENTER om die knop te bevestig." }, { name: "Bewerker dialoog", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Bewerkerinhoudmenu", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "Editor List Box", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "Commands", items: [{ name: " Undo command", legend: "Press ${undo}" }, { name: " Redo command", legend: "Press ${redo}" }, { name: " Bold command", legend: "Press ${bold}" }, { name: " Italic command", legend: "Press ${italic}" }, {
+ name: " Underline command",
+ legend: "Press ${underline}"
+ }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pouse", capslock: "Hoofletterslot", escape: "Ontsnap", pageUp: "Blaaiop", pageDown: "Blaaiaf", leftArrow: "Linkspyl", upArrow: "Oppyl", rightArrow: "Regterpyl", downArrow: "Afpyl", insert: "Toevoeg", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Nommerblok 0", numpad1: "Nommerblok 1",
+ numpad2: "Nommerblok 2", numpad3: "Nommerblok 3", numpad4: "Nommerblok 4", numpad5: "Nommerblok 5", numpad6: "Nommerblok 6", numpad7: "Nommerblok 7", numpad8: "Nommerblok 8", numpad9: "Nommerblok 9", multiply: "Maal", add: "Plus", subtract: "Minus", decimalPoint: "Desimaalepunt", divide: "Gedeeldeur", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Nommervergrendel", scrollLock: "Rolvergrendel", semiColon: "Kommapunt", equalSign: "Isgelykaan", comma: "Komma", dash: "Koppelteken",
+ period: "Punt", forwardSlash: "Skuinsstreep", graveAccent: "Aksentteken", openBracket: "Oopblokhakkie", backSlash: "Trustreep", closeBracket: "Toeblokhakkie", singleQuote: "Enkelaanhaalingsteken"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/ar.js b/plugins/a11yhelp/dialogs/lang/ar.js
new file mode 100755
index 0000000..874f9f0
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/ar.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "ar", {
+ title: "Accessibility Instructions", contents: "Help Contents. To close this dialog press ESC.", legend: [{
+ name: "عام", items: [{ name: "Editor Toolbar", legend: "Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button." }, { name: "Editor Dialog", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Editor Context Menu", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "Editor List Box", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "Commands", items: [{ name: " Undo command", legend: "Press ${undo}" }, { name: " Redo command", legend: "Press ${redo}" }, { name: " Bold command", legend: "Press ${bold}" }, { name: " Italic command", legend: "Press ${italic}" }, {
+ name: " Underline command",
+ legend: "Press ${underline}"
+ }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "إضافة", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "تقسيم", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "فاصلة", dash: "Dash", period: "نقطة", forwardSlash: "Forward Slash",
+ graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/az.js b/plugins/a11yhelp/dialogs/lang/az.js
new file mode 100755
index 0000000..f2c7f23
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/az.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "az", {
+ title: "Əlillərə dəstək üzrə təlimat", contents: "Kömək. Pəncərəni bağlamaq üçün ESC basın.", legend: [{
+ name: "Əsas", items: [{ name: "Düzəliş edənin alətlər çubuğu", legend: "Panelə keçmək üçün ${toolbarFocus} basın. Növbəti panelə TAB, əvvəlki panelə isə SHIFT+TAB düyməsi vasitəsi ilə keçə bilərsiz. Paneldəki düymələr arasında sol və sağ ox düyməsi ilə keçid edə bilərsiz. Seçilmiş düyməsi SPACE və ya ENTER ilə işlədə bilərsiniz." }, { name: "Redaktorun pəncərəsi", legend: "Pəncərə içində növbəti element seçmək üçün TAB düyməni basın, əvvəlki isə - SHIFT+TAB. Təsdiq edilməsi üçün ENTER, imtina edilməsi isə ESC diymələri istifadə edin. Pəncərədə bir neçə vərəq olanda olnarın siyahı ALT+F10 ilə aça bilərsiz. Vərəqlərin siyahı fokus altında olanda ox düymələr vasitəsi ilə onların arasında keçid edə bilərsiz." },
+ { name: "Redaktorun seçimlərin menyusu", legend: "Seçimləri redaktə etmək üçün ${contextMenu} ya da APPLICATION KEY basın. Növbəti seçimə keçmək üçün TAB ya AŞAĞI OX düyməsini basın, əvvəlki isə - SHIFT+TAB ya YUXARI OX. Seçimi arımaq SPACE ya ENTER düymələri istifadə edin. Alt menyunu açmaq üçün SPACE, ENTER ya SAĞA OX basın. ESC ya SOLA OX ilə geriyə qayıda bilərsiz. Bütün menyunu ESC ilə bağlıyın." }, { name: "Düzəliş edənin siyahı qutusu", legend: "Siyahı qutusu içində növbəti bənd seçmək üçün TAB ya AŞAĞI OX, əvvəlki isə SHIFT+TAB ya YUXARI OX basın. Seçimi arımaq SPACE ya ENTER düymələri istifadə edin. Siyahı qutusu ESC ilə bağlıyın." },
+ { name: "Redaktor elementin cığır paneli", legend: "Elementin cığır paneli seçmək üçün ${elementsPathFocus} basın. Növbəti element seçmək üçün TAB ya SAĞA OX, əvvəlki isə SHIFT+TAB ya SOLA OX istifadə edin. Elementi arımaq SPACE ya ENTER düymələri mövcuddur." }]
+ }, {
+ name: "Əmrlər", items: [{ name: "Əmri geri qaytar", legend: "${undo} basın" }, { name: "Geri əmri", legend: "${redo} basın" }, { name: "Qalın əmri", legend: "${bold} basın" }, { name: "Kursiv əmri", legend: "${italic} basın" }, { name: "Altdan xətt əmri", legend: "${underline} basın" },
+ { name: "Link əmri", legend: "${link} basın" }, { name: "Paneli gizlət əmri", legend: "${toolbarCollapse} basın" }, { name: "Əvvəlki fokus sahəsi seç əmrı", legend: "Kursordan əvvəl ən yaxın əlçatmaz yerə dəymək üçün ${accessPreviousSpace} basın, misal üçün: iki dal-badal HR teg. Uzaq yerlərə dəymək üçün bir neçə dəfə basın." }, { name: "Növbəti fokus sahəsi seç əmrı", legend: "Kursordan sonra ən yaxın əlçatmaz yerə dəymək üçün ${accessNextSpace} basın, misal üçün: iki dal-badal HR teg. Uzaq yerlərə dəymək üçün bir neçə dəfə basın." },
+ { name: "Hərtərəfli Kömək", legend: "${a11yHelp} basın" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Sola ox işarəsi", upArrow: "Yuxarı ox işarəsi", rightArrow: "Sağa ox işarəsi", downArrow: "Aşağı ox işarəsi", insert: "Insert", leftWindowKey: "Soldaki Windows düyməsi", rightWindowKey: "Sağdaki Windows düyməsi", selectKey: "Düyməni seçin",
+ numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Vurma", add: "Əlavə et", subtract: "Çıxma", decimalPoint: "Onluq kəsri tam ədəddən ayıran nöqtə", divide: "Bölüşdürmə", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Nöqtəli verqül", equalSign: "Barəbərlik işarəsi",
+ comma: "Vergül", dash: "Defis", period: "Nöqtə", forwardSlash: "Çəp xətt", graveAccent: "Vurğu işarəsi", openBracket: "Açılan mötərizə", backSlash: "Tərs çəpəki xətt", closeBracket: "Bağlanan mötərizə", singleQuote: "Tək dırnaq"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/bg.js b/plugins/a11yhelp/dialogs/lang/bg.js
new file mode 100755
index 0000000..6fb8ee8
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/bg.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","bg",{title:"Инструкции за достъпност",contents:"Съдържание на помощта. За да затворите този диалогов прозорец, натиснете ESC.",legend:[{name:"Общо",items:[{name:"Лента с инструменти за редактора",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Диалог на редактора",
+legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},{name:"Контекстно меню на редактора",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},
+{name:"Списъчно меню на редактора",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},{name:"Лента с път на елемент на редактора",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},
+{name:"Команди",items:[{name:"Команда за отмяна",legend:"Натисни ${undo}"},{name:"Команда за пренаправяне",legend:"Натисни ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Accessibility Help",legend:"Press ${a11yHelp}"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",
+leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert",leftWindowKey:"Left Windows key",rightWindowKey:"Right Windows key",selectKey:"Select key",numpad0:"Numpad 0",numpad1:"Numpad 1",numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Multiply",add:"Add",subtract:"Subtract",decimalPoint:"Decimal Point",divide:"Divide",f1:"F1",f2:"F2",f3:"F3",
+f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semicolon",equalSign:"Equal Sign",comma:"Comma",dash:"Dash",period:"Period",forwardSlash:"Forward Slash",graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/ca.js b/plugins/a11yhelp/dialogs/lang/ca.js
new file mode 100755
index 0000000..5bb1e92
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/ca.js
@@ -0,0 +1,21 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "ca", {
+ title: "Instruccions d'Accessibilitat", contents: "Continguts de l'Ajuda. Per tancar aquest quadre de diàleg premi ESC.", legend: [{
+ name: "General", items: [{ name: "Editor de barra d'eines", legend: "Premi ${toolbarFocus} per desplaçar-se per la barra d'eines. Vagi en el següent i anterior grup de barra d'eines amb TAB i SHIFT+TAB. Vagi en el següent i anterior botó de la barra d'eines amb RIGHT ARROW i LEFT ARROW. Premi SPACE o ENTER per activar el botó de la barra d'eines." },
+ { name: "Editor de quadre de diàleg", legend: "Dins d'un quadre de diàleg, premi la tecla TAB per desplaçar-se fins al següent element del quadre de diàleg, premi la tecla Shift + TAB per desplaçar-se a l'anterior element del quadre de diàleg, premi la tecla ENTER per confirmar el quadre de diàleg, premi la tecla ESC per cancel·lar el quadre de diàleg. Quan un quadre de diàleg té diverses pestanyes, la llista de pestanyes pot ser assolit ja sigui amb ALT + F10 o TAB, com a part de l'ordre de tabulació del quadre de diàleg. Amb la llista de pestanyes seleccionada, pot anar a la fitxa següent i anterior amb la tecla FLETXA DRETA i ESQUERRA, respectivament." },
+ { name: "Editor de menú contextual", legend: "Premi ${contextMenu} o APPLICATION KEY per obrir el menú contextual. Després desplacis a la següent opció del menú amb TAB o DOWN ARROW. Desplacis a l'anterior opció amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l'opció del menú. Obri el submenú de l'actual opció utilitzant SPACE o ENTER o RIGHT ARROW. Pot tornar a l'opció del menú pare amb ESC o LEFT ARROW. Tanqui el menú contextual amb ESC." }, { name: "Editor de caixa de llista", legend: "Dins d'un quadre de llista, desplacis al següent element de la llista amb TAB o DOWN ARROW. Desplacis a l'anterior element de la llista amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l'opció de la llista. Premi ESC per tancar el quadre de llista." },
+ { name: "Editor de barra de ruta de l'element", legend: "Premi ${elementsPathFocus} per anar als elements de la barra de ruta. Desplacis al botó de l'element següent amb TAB o RIGHT ARROW. Desplacis a l'anterior botó amb SHIFT+TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar l'element a l'editor." }]
+ }, {
+ name: "Ordres", items: [{ name: "Desfer ordre", legend: "Premi ${undo}" }, { name: "Refer ordre", legend: "Premi ${redo}" }, { name: "Ordre negreta", legend: "Premi ${bold}" }, { name: "Ordre cursiva", legend: "Premi ${italic}" },
+ { name: "Ordre subratllat", legend: "Premi ${underline}" }, { name: "Ordre enllaç", legend: "Premi ${link}" }, { name: "Ordre amagar barra d'eines", legend: "Premi ${toolbarCollapse}" }, { name: "Ordre per accedir a l'anterior espai enfocat", legend: "Premi ${accessPreviousSpace} per accedir a l'enfocament d'espai més proper inabastable abans del símbol d'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d'espais distants." }, {
+ name: "Ordre per accedir al següent espai enfocat",
+ legend: "Premi ${accessNextSpace} per accedir a l'enfocament d'espai més proper inabastable després del símbol d'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d'espais distants."
+ }, { name: "Ajuda d'accessibilitat", legend: "Premi ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tabulació", pause: "Pausa", capslock: "Bloqueig de majúscules", escape: "Escape", pageUp: "Pàgina Amunt",
+ pageDown: "Pàgina Avall", leftArrow: "Fletxa Esquerra", upArrow: "Fletxa Amunt", rightArrow: "Fletxa Dreta", downArrow: "Fletxa Avall", insert: "Inserir", leftWindowKey: "Tecla Windows Esquerra", rightWindowKey: "Tecla Windows Dreta", selectKey: "Tecla Seleccionar", numpad0: "Teclat Numèric 0", numpad1: "Teclat Numèric 1", numpad2: "Teclat Numèric 2", numpad3: "Teclat Numèric 3", numpad4: "Teclat Numèric 4", numpad5: "Teclat Numèric 5", numpad6: "Teclat Numèric 6", numpad7: "Teclat Numèric 7", numpad8: "Teclat Numèric 8", numpad9: "Teclat Numèric 9",
+ multiply: "Multiplicació", add: "Suma", subtract: "Resta", decimalPoint: "Punt Decimal", divide: "Divisió", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Bloqueig Teclat Numèric", scrollLock: "Bloqueig de Desplaçament", semiColon: "Punt i Coma", equalSign: "Símbol Igual", comma: "Coma", dash: "Guió", period: "Punt", forwardSlash: "Barra Diagonal", graveAccent: "Accent Obert", openBracket: "Claudàtor Obert", backSlash: "Barra Invertida", closeBracket: "Claudàtor Tancat",
+ singleQuote: "Cometa Simple"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/cs.js b/plugins/a11yhelp/dialogs/lang/cs.js
new file mode 100755
index 0000000..a3def5d
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/cs.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "cs", {
+ title: "Instrukce pro přístupnost", contents: "Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.", legend: [{
+ name: "Obecné", items: [{ name: "Panel nástrojů editoru", legend: "Stiskněte${toolbarFocus} k procházení panelu nástrojů. Přejděte na další a předchozí skupiny pomocí TAB a SHIFT+TAB. Přechod na další a předchozí tlačítko panelu nástrojů je pomocí ŠIPKA VPRAVO nebo ŠIPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlačítko aktivujete." }, {
+ name: "Dialogové okno editoru",
+ legend: "Uvnitř dialogového okna stiskněte TAB pro přesunutí na další prvek okna, stiskněte SHIFT+TAB pro přesun na předchozí prvek okna, stiskněte ENTER pro odeslání dialogu, stiskněte ESC pro jeho zrušení. Pro dialogová okna, která mají mnoho karet stiskněte ALT+F10 pro zaměření seznamu karet, nebo TAB, pro posun podle pořadí karet.Při zaměření seznamu karet se můžete jimi posouvat pomocí ŠIPKY VPRAVO a VLEVO."
+ }, { name: "Kontextové menu editoru", legend: "Stiskněte ${contextMenu} nebo klávesu APPLICATION k otevření kontextového menu. Pak se přesuňte na další možnost menu pomocí TAB nebo ŠIPKY DOLŮ. Přesuňte se na předchozí možnost pomocí SHIFT+TAB nebo ŠIPKY NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti menu. Podmenu současné možnosti otevřete pomocí MEZERNÍKU nebo ENTER či ŠIPKY DOLEVA. Kontextové menu uzavřete stiskem ESC." },
+ { name: "Rámeček seznamu editoru", legend: "Uvnitř rámečku seznamu se přesunete na další položku menu pomocí TAB nebo ŠIPKA DOLŮ. Na předchozí položku se přesunete SHIFT+TAB nebo ŠIPKA NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti seznamu. Stiskněte ESC pro uzavření seznamu." }, { name: "Lišta cesty prvku v editoru", legend: "Stiskněte ${elementsPathFocus} pro procházení lišty cesty prvku. Na další tlačítko prvku se přesunete pomocí TAB nebo ŠIPKA VPRAVO. Na předchozí tlačítko se přesunete pomocí SHIFT+TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání prvku v editoru." }]
+ },
+ {
+ name: "Příkazy", items: [{ name: " Příkaz Zpět", legend: "Stiskněte ${undo}" }, { name: " Příkaz Znovu", legend: "Stiskněte ${redo}" }, { name: " Příkaz Tučné", legend: "Stiskněte ${bold}" }, { name: " Příkaz Kurzíva", legend: "Stiskněte ${italic}" }, { name: " Příkaz Podtržení", legend: "Stiskněte ${underline}" }, { name: " Příkaz Odkaz", legend: "Stiskněte ${link}" }, { name: " Příkaz Skrýt panel nástrojů", legend: "Stiskněte ${toolbarCollapse}" }, { name: "Příkaz pro přístup k předchozímu prostoru zaměření", legend: "Stiskněte ${accessPreviousSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření před stříškou, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte." },
+ { name: "Příkaz pro přístup k dalšímu prostoru zaměření", legend: "Stiskněte ${accessNextSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření po stříšce, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte." }, { name: " Nápověda přístupnosti", legend: "Stiskněte ${a11yHelp}" }, { name: "Vložit jako čistý text", legend: "Stiskněte ${pastetext}", legendEdge: "Stiskněte ${pastetext} a pak ${paste}" }]
+ }], tab: "Tabulátor", pause: "Pauza", capslock: "Caps lock",
+ escape: "Escape", pageUp: "Stránka nahoru", pageDown: "Stránka dolů", leftArrow: "Šipka vlevo", upArrow: "Šipka nahoru", rightArrow: "Šipka vpravo", downArrow: "Šipka dolů", insert: "Vložit", leftWindowKey: "Levá klávesa Windows", rightWindowKey: "Pravá klávesa Windows", selectKey: "Vyberte klávesu", numpad0: "Numerická klávesa 0", numpad1: "Numerická klávesa 1", numpad2: "Numerická klávesa 2", numpad3: "Numerická klávesa 3", numpad4: "Numerická klávesa 4", numpad5: "Numerická klávesa 5", numpad6: "Numerická klávesa 6", numpad7: "Numerická klávesa 7",
+ numpad8: "Numerická klávesa 8", numpad9: "Numerická klávesa 9", multiply: "Numerická klávesa násobení", add: "Přidat", subtract: "Numerická klávesa odečítání", decimalPoint: "Desetinná tečka", divide: "Numerická klávesa dělení", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num lock", scrollLock: "Scroll lock", semiColon: "Středník", equalSign: "Rovnítko", comma: "Čárka", dash: "Pomlčka", period: "Tečka", forwardSlash: "Lomítko", graveAccent: "Přízvuk", openBracket: "Otevřená hranatá závorka",
+ backSlash: "Obrácené lomítko", closeBracket: "Uzavřená hranatá závorka", singleQuote: "Jednoduchá uvozovka"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/cy.js b/plugins/a11yhelp/dialogs/lang/cy.js
new file mode 100755
index 0000000..f95ebcd
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/cy.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "cy", {
+ title: "Canllawiau Hygyrchedd", contents: "Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.", legend: [{
+ name: "Cyffredinol", items: [{ name: "Bar Offer y Golygydd", legend: "Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT+TAB. Symudwch i'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol." }, { name: "Deialog y Golygydd", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Dewislen Cyd-destun y Golygydd", legend: "Pwyswch $ {contextMenu} neu'r ALLWEDD 'APPLICATION' i agor y ddewislen cyd-destun. Yna symudwch i'r opsiwn ddewislen nesaf gyda'r TAB neu'r SAETH I LAWR. Symudwch i'r opsiwn blaenorol gyda SHIFT+TAB neu'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC." },
+ { name: "Blwch Rhestr y Golygydd", legend: "Tu mewn y blwch rhestr, ewch i'r eitem rhestr nesaf gyda TAB neu'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT+TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o'r rhestr. Pwyswch ESC i gau'r rhestr." }, { name: "Bar Llwybr Elfen y Golygydd", legend: "Pwyswch ${elementsPathFocus} i fynd i'r bar llwybr elfennau. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT+TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd." }]
+ },
+ {
+ name: "Gorchmynion", items: [{ name: "Gorchymyn dadwneud", legend: "Pwyswch ${undo}" }, { name: "Gorchymyn ailadrodd", legend: "Pwyswch ${redo}" }, { name: "Gorchymyn Bras", legend: "Pwyswch ${bold}" }, { name: "Gorchymyn italig", legend: "Pwyswch ${italig}" }, { name: "Gorchymyn tanlinellu", legend: "Pwyso ${underline}" }, { name: "Gorchymyn dolen", legend: "Pwyswch ${link}" }, { name: "Gorchymyn Cwympo'r Dewislen", legend: "Pwyswch ${toolbarCollapse}" }, { name: "Myned i orchymyn bwlch ffocws blaenorol", legend: "Pwyswch ${accessPreviousSpace} i fyned i'r \"blwch ffocws sydd methu ei gyrraedd\" cyn y caret, er enghraifft: dwy elfen HR drws nesaf i'w gilydd. AIladroddwch y cyfuniad allwedd i gyrraedd bylchau ffocws pell." },
+ { name: "Ewch i'r gorchymyn blwch ffocws nesaf", legend: "Pwyswch ${accessNextSpace} i fyned i'r blwch ffocws agosaf nad oes modd ei gyrraedd ar ôl y caret, er enghraifft: dwy elfen HR drws nesaf i'w gilydd. Ailadroddwch y cyfuniad allwedd i gyrraedd blychau ffocws pell." }, { name: "Cymorth Hygyrchedd", legend: "Pwyswch ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape",
+ pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point",
+ divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash", graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/da.js b/plugins/a11yhelp/dialogs/lang/da.js
new file mode 100755
index 0000000..95bc781
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/da.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","da",{title:"Tilgængelighedsinstrukser",contents:"Onlinehjælp. For at lukke dette vindue klik ESC",legend:[{name:"Generelt",items:[{name:"Editor værktøjslinje",legend:"Tryk ${toolbarFocus} for at navigere til værktøjslinjen. Flyt til næste eller forrige værktøjsline gruppe ved hjælp af TAB eller SHIFT+TAB. Flyt til næste eller forrige værktøjslinje knap med venstre- eller højre piltast. Tryk på SPACE eller ENTER for at aktivere værktøjslinje knappen."},{name:"Editor dialogboks",
+legend:"Inde i en dialogboks kan du, trykke på TAB for at navigere til næste element, trykke på SHIFT+TAB for at navigere til forrige element, trykke på ENTER for at afsende eller trykke på ESC for at lukke dialogboksen.\r\nNår en dialogboks har flere faner, fanelisten kan tilgås med ALT+F10 eller med TAB. Hvis fanelisten er i fokus kan du skifte til næste eller forrige tab, med højre- og venstre piltast."},{name:"Redaktør kontekstmenu",legend:"Tryk ${contextMenu} eller APPLICATION KEY for at åbne kontekstmenuen. Flyt derefter til næste menuvalg med TAB eller PIL NED. Flyt til forrige valg med SHIFT+TAB eller PIL OP. Tryk MELLEMRUM eller RETUR for at vælge menu-muligheder. Åben under-menu af aktuelle valg med MELLEMRUM eller RETUR eller HØJRE PIL. Gå tilbage til overliggende menu-emne med ESC eller VENSTRE PIL. Luk kontekstmenu med ESC."},
+{name:"Redaktør listeboks",legend:"Flyt til næste emne med TAB eller PIL NED inde i en listeboks. Flyt til forrige listeemne med SHIFT+TAB eller PIL OP. Tryk MELLEMRUM eller RETUR for at vælge liste-muligheder. Tryk ESC for at lukke liste-boksen."},{name:"Redaktør elementsti-bar",legend:"Tryk ${elementsPathFocus} for at navigere til elementernes sti-bar. Flyt til næste element-knap med TAB eller HØJRE PIL. Flyt til forrige knap med SHIFT+TAB eller VENSTRE PIL. Klik MELLEMRUM eller RETUR for at vælge element i editoren."}]},
+{name:"Kommandoer",items:[{name:"Fortryd kommando",legend:"Klik på ${undo}"},{name:"Gentag kommando",legend:"Klik ${redo}"},{name:"Fed kommando",legend:"Klik ${bold}"},{name:"Kursiv kommando",legend:"Klik ${italic}"},{name:"Understregnings kommando",legend:"Klik ${underline}"},{name:"Link kommando",legend:"Klik ${link}"},{name:"Klap værktøjslinje sammen kommando ",legend:"Klik ${toolbarCollapse}"},{name:"Adgang til forrige fokusområde kommando",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Tilgængelighedshjælp",legend:"Kilk ${a11yHelp}"},{name:"Indsæt som ren tekst",legend:"Klik ${pastetext}",legendEdge:"Klik ${pastetext}, efterfult af ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",
+leftArrow:"Venstre pil",upArrow:"Pil op",rightArrow:"Højre pil",downArrow:"Pil ned",insert:"Insert",leftWindowKey:"Venstre Windows tast",rightWindowKey:"Højre Windows tast",selectKey:"Select-knap",numpad0:"Numpad 0",numpad1:"Numpad 1",numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Gange",add:"Plus",subtract:"Minus",decimalPoint:"Komma",divide:"Divider",f1:"F1",f2:"F2",f3:"F3",f4:"F4",
+f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semikolon",equalSign:"Lighedstegn",comma:"Komma",dash:"Bindestreg",period:"Punktum",forwardSlash:"Skråstreg",graveAccent:"Accent grave",openBracket:"Start klamme",backSlash:"Omvendt skråstreg",closeBracket:"Slut klamme",singleQuote:"Enkelt citationstegn"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/de-ch.js b/plugins/a11yhelp/dialogs/lang/de-ch.js
new file mode 100755
index 0000000..ca06a48
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/de-ch.js
@@ -0,0 +1,18 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "de-ch", {
+ title: "Barrierefreiheitinformationen", contents: "Hilfeinhalt. Um den Dialog zu schliessen die Taste ESC drücken.", legend: [{
+ name: "Allgemein", items: [{ name: "Editorwerkzeugleiste", legend: "Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT+TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren." },
+ { name: "Editordialog", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." }, { name: "Editor-Kontextmenü", legend: "Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste." },
+ { name: "Editor-Listenbox", legend: "Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der SHIFT+TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs." }, { name: "Editor-Elementpfadleiste", legend: "Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT+TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen." }]
+ },
+ {
+ name: "Befehle", items: [{ name: "Rückgängig-Befehl", legend: "Drücken Sie ${undo}" }, { name: "Wiederherstellen-Befehl", legend: "Drücken Sie ${redo}" }, { name: "Fettschrift-Befehl", legend: "Drücken Sie ${bold}" }, { name: "Kursiv-Befehl", legend: "Drücken Sie ${italic}" }, { name: "Unterstreichen-Befehl", legend: "Drücken Sie ${underline}" }, { name: "Link-Befehl", legend: "Drücken Sie ${link}" }, { name: "Werkzeugleiste einklappen-Befehl", legend: "Drücken Sie ${toolbarCollapse}" }, { name: "Zugang bisheriger Fokussierung Raumbefehl ", legend: "Drücken Sie ${accessPreviousSpace} auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. " },
+ { name: "Zugang nächster Schwerpunkt Raumbefehl ", legend: "Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. " }, { name: "Eingabehilfen", legend: "Drücken Sie ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Feststell", escape: "Escape",
+ pageUp: "Bild auf", pageDown: "Bild ab", leftArrow: "Linke Pfeiltaste", upArrow: "Obere Pfeiltaste", rightArrow: "Rechte Pfeiltaste", downArrow: "Untere Pfeiltaste", insert: "Einfügen", leftWindowKey: "Linke Windowstaste", rightWindowKey: "Rechte Windowstaste", selectKey: "Taste auswählen", numpad0: "Ziffernblock 0", numpad1: "Ziffernblock 1", numpad2: "Ziffernblock 2", numpad3: "Ziffernblock 3", numpad4: "Ziffernblock 4", numpad5: "Ziffernblock 5", numpad6: "Ziffernblock 6", numpad7: "Ziffernblock 7", numpad8: "Ziffernblock 8", numpad9: "Ziffernblock 9",
+ multiply: "Multiplizieren", add: "Addieren", subtract: "Subtrahieren", decimalPoint: "Punkt", divide: "Dividieren", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Ziffernblock feststellen", scrollLock: "Rollen", semiColon: "Semikolon", equalSign: "Gleichheitszeichen", comma: "Komma", dash: "Bindestrich", period: "Punkt", forwardSlash: "Schrägstrich", graveAccent: "Gravis", openBracket: "Öffnende eckige Klammer", backSlash: "Rückwärtsgewandter Schrägstrich", closeBracket: "Schliessende eckige Klammer",
+ singleQuote: "Einfaches Anführungszeichen"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/de.js b/plugins/a11yhelp/dialogs/lang/de.js
new file mode 100755
index 0000000..73f90a8
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/de.js
@@ -0,0 +1,23 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "de", {
+ title: "Barrierefreiheitinformationen", contents: "Hilfeinhalt. Um den Dialog zu schliessen die Taste ESC drücken.", legend: [{
+ name: "Allgemein", items: [{ name: "Editorwerkzeugleiste", legend: "Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT+TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren." },
+ { name: "Editordialog", legend: "Drücke innerhalb eines Dialogs TAB, um zum nächsten Element zu springen. Drücke SHIFT+TAB, um zum vorigen Element zu springen, drücke ENTER um das Formular im Dialog abzusenden, drücke ESC, um den Dialog zu schließen. Hat der Dialog mehrere Tabs, dann kannst du durch ALT+F10 die Tab-Liste aufrufen or mittels TAB als Teil der Dialog-Tab-Reihenfolge. Ist die Tab-Liste fokussiert, dann mithilfe der Pfeiltasten (LINKS und RECHTS) zwischen den Tabs gewechselt werden." }, {
+ name: "Editor-Kontextmenü",
+ legend: "Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste."
+ }, { name: "Editor-Listenbox", legend: "Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der SHIFT+TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs." },
+ { name: "Editor-Elementpfadleiste", legend: "Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT+TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen." }]
+ }, {
+ name: "Befehle", items: [{ name: "Rückgängig-Befehl", legend: "Drücken Sie ${undo}" }, { name: "Wiederherstellen-Befehl", legend: "Drücken Sie ${redo}" }, {
+ name: "Fettschrift-Befehl",
+ legend: "Drücken Sie ${bold}"
+ }, { name: "Kursiv-Befehl", legend: "Drücken Sie ${italic}" }, { name: "Unterstreichen-Befehl", legend: "Drücken Sie ${underline}" }, { name: "Link-Befehl", legend: "Drücken Sie ${link}" }, { name: "Werkzeugleiste einklappen-Befehl", legend: "Drücken Sie ${toolbarCollapse}" }, { name: "Zugang bisheriger Fokussierung Raumbefehl ", legend: "Drücken Sie ${accessPreviousSpace} auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. " },
+ { name: "Zugang nächster Schwerpunkt Raumbefehl ", legend: "Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. " }, { name: "Eingabehilfen", legend: "Drücken Sie ${a11yHelp}" }, { name: "Einfügen als unformatierter Text. ", legend: "Drücke ${pastetext}", legendEdge: "Drücke ${pastetext} und anschließend ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Feststell",
+ escape: "Escape", pageUp: "Bild auf", pageDown: "Bild ab", leftArrow: "Linke Pfeiltaste", upArrow: "Obere Pfeiltaste", rightArrow: "Rechte Pfeiltaste", downArrow: "Untere Pfeiltaste", insert: "Einfügen", leftWindowKey: "Linke Windowstaste", rightWindowKey: "Rechte Windowstaste", selectKey: "Taste auswählen", numpad0: "Ziffernblock 0", numpad1: "Ziffernblock 1", numpad2: "Ziffernblock 2", numpad3: "Ziffernblock 3", numpad4: "Ziffernblock 4", numpad5: "Ziffernblock 5", numpad6: "Ziffernblock 6", numpad7: "Ziffernblock 7", numpad8: "Ziffernblock 8",
+ numpad9: "Ziffernblock 9", multiply: "Multiplizieren", add: "Addieren", subtract: "Subtrahieren", decimalPoint: "Punkt", divide: "Dividieren", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Ziffernblock feststellen", scrollLock: "Rollen", semiColon: "Semikolon", equalSign: "Gleichheitszeichen", comma: "Komma", dash: "Bindestrich", period: "Punkt", forwardSlash: "Schrägstrich", graveAccent: "Gravis", openBracket: "Öffnende eckige Klammer", backSlash: "Rückwärtsgewandter Schrägstrich",
+ closeBracket: "Schließende eckige Klammer", singleQuote: "Einfaches Anführungszeichen"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/el.js b/plugins/a11yhelp/dialogs/lang/el.js
new file mode 100755
index 0000000..b889e67
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/el.js
@@ -0,0 +1,21 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "el", {
+ title: "Οδηγίες Προσβασιμότητας", contents: "Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.", legend: [{
+ name: "Γενικά", items: [{ name: "Εργαλειοθήκη Επεξεργαστή", legend: "Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και SHIFT+TAB. Μετακινηθείτε ανάμεσα στα κουμπιά εργαλείων με το ΔΕΞΙ ή ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου." }, {
+ name: "Παράθυρο Διαλόγου Επεξεργαστή",
+ legend: "Μέσα σε έναν διάλογο, πιέσετε TAB για να πλοηγηθείτε στο επόμενο στοιχείο του διαλόγου, πιέστε SHIFT+TAB για αν πλοηγηθείτε στο προηγούμενο στοιχείο του διαλόγου, πιέστε ENTER για να υποβάλετε τον διάλογο, πιέστε ESC για να ακυρώσετε τον διάλογο. Όταν ένας διάλογος έχει πολλαπλές παραγράφους, η λίστα των παραγράφων μπορεί να προσπεραστεί είτε με ALT+F10 είτε με TAB σαν μέρος της σειράς παραγράφων του διαλόγου. Με την λίστα των παραγράφων επιλεγμένη, προχωρήστε στην επόμενη και προηγούμενη παράγραφο με τα βέλη ΔΕΞΙΑ και ΑΡΙΣΤΕΡΑ, αντίστοιχα."
+ },
+ { name: "Αναδυόμενο Μενού Επεξεργαστή", legend: "Πατήστε ${contextMenu} ή APPLICATION KEY για να ανοίξετε το αναδυόμενο μενού. Μετά μετακινηθείτε στην επόμενη επιλογή του μενού με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στην προηγούμενη επιλογή με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξτε το τρέχων στοιχείο. Ανοίξτε το αναδυόμενο μενού της τρέχουσας επιλογής με ΔΙΑΣΤΗΜΑ ή ENTER ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μεταβείτε πίσω στο αρχικό στοιχείο μενού με το ESC ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Κλείστε το αναδυόμενο μενού με ESC." },
+ { name: "Κουτί Λίστας Επεξεργαστών", legend: "Μέσα σε ένα κουτί λίστας, μετακινηθείτε στο επόμενο στοιχείο με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στο προηγούμενο στοιχείο με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε ένα στοιχείο. Πατήστε ESC για να κλείσετε το κουτί της λίστας." }, { name: "Μπάρα Διαδρομών Στοιχείων Επεξεργαστή", legend: "Πατήστε ${elementsPathFocus} για να περιηγηθείτε στην μπάρα διαδρομών στοιχείων του επεξεργαστή. Μετακινηθείτε στο κουμπί του επόμενου στοιχείου με το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μετακινηθείτε στο κουμπί του προηγούμενου στοιχείου με το SHIFT+TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το στοιχείο στον επεξεργαστή." }]
+ },
+ {
+ name: "Εντολές", items: [{ name: "Εντολή αναίρεσης", legend: "Πατήστε ${undo}" }, { name: "Εντολή επανάληψης", legend: "Πατήστε ${redo}" }, { name: "Εντολή έντονης γραφής", legend: "Πατήστε ${bold}" }, { name: "Εντολή πλάγιας γραφής", legend: "Πατήστε ${italic}" }, { name: "Εντολή υπογράμμισης", legend: "Πατήστε ${underline}" }, { name: "Εντολή συνδέσμου", legend: "Πατήστε ${link}" }, { name: "Εντολή Σύμπτηξης Εργαλειοθήκης", legend: "Πατήστε ${toolbarCollapse}" }, { name: "Πρόσβαση στην προηγούμενη εντολή του χώρου εστίασης ", legend: "Πατήστε ${accessPreviousSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης πριν το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για να φθάσετε στους χώρους μακρινής εστίασης. " },
+ { name: "Πρόσβαση στην επόμενη εντολή του χώρου εστίασης", legend: "Πατήστε ${accessNextSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης μετά το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για τους χώρους μακρινής εστίασης. " }, { name: "Βοήθεια Προσβασιμότητας", legend: "Πατήστε ${a11yHelp}" }, { name: "Επικολλήστε ως απλό κείμενο.", legend: "Πιέστε $(pastetext)", legendEdge: "Πιέστε $(pastetext), ακολουθούμενο με (paste)_" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock",
+ escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Αριστερό Βέλος", upArrow: "Πάνω Βέλος", rightArrow: "Δεξί Βέλος", downArrow: "Κάτω Βέλος", insert: "Insert ", leftWindowKey: "Αριστερό Πλήκτρο Windows", rightWindowKey: "Δεξί Πλήκτρο Windows", selectKey: "Πλήκτρο Select", numpad0: "Αριθμητικό πληκτρολόγιο 0", numpad1: "Αριθμητικό Πληκτρολόγιο 1", numpad2: "Αριθμητικό πληκτρολόγιο 2", numpad3: "Αριθμητικό πληκτρολόγιο 3", numpad4: "Αριθμητικό πληκτρολόγιο 4", numpad5: "Αριθμητικό πληκτρολόγιο 5", numpad6: "Αριθμητικό πληκτρολόγιο 6",
+ numpad7: "Αριθμητικό πληκτρολόγιο 7", numpad8: "Αριθμητικό πληκτρολόγιο 8", numpad9: "Αριθμητικό πληκτρολόγιο 9", multiply: "Πολλαπλασιασμός", add: "Πρόσθεση", subtract: "Αφαίρεση", decimalPoint: "Υποδιαστολή", divide: "Διαίρεση", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "6", f7: "7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Ερωτηματικό", equalSign: "Σύμβολο Ισότητας", comma: "Κόμμα", dash: "Παύλα", period: "Τελεία", forwardSlash: "Κάθετος", graveAccent: "Βαρεία", openBracket: "Άνοιγμα Παρένθεσης",
+ backSlash: "Ανάστροφη Κάθετος", closeBracket: "Κλείσιμο Παρένθεσης", singleQuote: "Απόστροφος"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/en-au.js b/plugins/a11yhelp/dialogs/lang/en-au.js
new file mode 100755
index 0000000..20fafcb
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/en-au.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","en-au",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"General",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert",leftWindowKey:"Left Windows key",rightWindowKey:"Right Windows key",selectKey:"Select key",numpad0:"Numpad 0",numpad1:"Numpad 1",
+numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Multiply",add:"Add",subtract:"Subtract",decimalPoint:"Decimal Point",divide:"Divide",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semicolon",equalSign:"Equal Sign",comma:"Comma",dash:"Dash",period:"Period",forwardSlash:"Forward Slash",
+graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/en-gb.js b/plugins/a11yhelp/dialogs/lang/en-gb.js
new file mode 100755
index 0000000..43fce17
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/en-gb.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "en-gb", {
+ title: "Accessibility Instructions", contents: "Help Contents. To close this dialog press ESC.", legend: [{
+ name: "General", items: [{ name: "Editor Toolbar", legend: "Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button." }, { name: "Editor Dialog", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Editor Context Menu", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "Editor List Box", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "Commands", items: [{ name: " Undo command", legend: "Press ${undo}" }, { name: " Redo command", legend: "Press ${redo}" }, { name: " Bold command", legend: "Press ${bold}" }, { name: " Italic command", legend: "Press ${italic}" }, {
+ name: " Underline command",
+ legend: "Press ${underline}"
+ }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash",
+ graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/en.js b/plugins/a11yhelp/dialogs/lang/en.js
new file mode 100755
index 0000000..2c781a3
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/en.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "en", {
+ title: "Accessibility Instructions", contents: "Help Contents. To close this dialog press ESC.", legend: [{
+ name: "General", items: [{ name: "Editor Toolbar", legend: "Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button." }, { name: "Editor Dialog", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Editor Context Menu", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "Editor List Box", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "Commands", items: [{ name: " Undo command", legend: "Press ${undo}" }, { name: " Redo command", legend: "Press ${redo}" }, { name: " Bold command", legend: "Press ${bold}" }, { name: " Italic command", legend: "Press ${italic}" }, {
+ name: " Underline command",
+ legend: "Press ${underline}"
+ }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash",
+ graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/eo.js b/plugins/a11yhelp/dialogs/lang/eo.js
new file mode 100755
index 0000000..27c8fa8
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/eo.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "eo", {
+ title: "Uzindikoj pri atingeblo", contents: "Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.", legend: [{
+ name: "Ĝeneralaĵoj", items: [{ name: "Ilbreto de la redaktilo", legend: "Premu ${toolbarFocus} por atingi la ilbreton. Moviĝu al la sekva aŭ antaŭa grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA+TABA. Moviĝu al la sekva aŭ antaŭa butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por aktivigi la ilbretbutonon." },
+ { name: "Redaktildialogo", legend: "En dialogo, premu la TABAN klavon por navigi al la sekva dialogelemento, premu la MAJUSKLIGAN+TABAN klavon por iri al la antaŭa dialogelemento, premu la ENEN klavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Kiam dialogo havas multajn langetojn, eblas atingi la langetliston aŭ per ALT+F10 aŭ per la TABA klavo kiel parton de la dialoga taba ordo. En langetlisto, moviĝu al la sekva kaj antaŭa langeto per la klavoj SAGO DEKSTREN KAJ MALDEKSTREN respektive." },
+ { name: "Kunteksta menuo de la redaktilo", legend: "Premu ${contextMenu} aŭ entajpu la KLAVKOMBINAĴON por malfermi la kuntekstan menuon. Poste moviĝu al la sekva opcio de la menuo per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa opcio per la klavoj MAJUSKLGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aŭ la ENENklavo aŭ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aŭ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo." },
+ { name: "Fallisto de la redaktilo", legend: "En fallisto, moviĝu al la sekva listelemento per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa listelemento per la klavoj MAJUSKLIGA+TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon." }, { name: "Breto indikanta la vojon al la redaktilelementoj", legend: "Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. Moviĝu al la butono de la sekva elemento per la klavoj TABA aŭ SAGO DEKSTREN. Moviĝu al la butono de la antaŭa elemento per la klavoj MAJUSKLIGA+TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ ENENklavon por selekti la elementon en la redaktilo." }]
+ },
+ {
+ name: "Komandoj", items: [{ name: "Komando malfari", legend: "Premu ${undo}" }, { name: "Komando refari", legend: "Premu ${redo}" }, { name: "Komando grasa", legend: "Premu ${bold}" }, { name: "Komando kursiva", legend: "Premu ${italic}" }, { name: "Komando substreki", legend: "Premu ${underline}" }, { name: "Komando ligilo", legend: "Premu ${link}" }, { name: "Komando faldi la ilbreton", legend: "Premu ${toolbarCollapse}" }, { name: "Komando por atingi la antaŭan fokusan spacon", legend: "Press ${accessPreviousSpace} por atingi la plej proksiman neatingeblan fokusan spacon antaŭ la kursoro, ekzemple : du kuntuŝiĝajn HR elementojn. Ripetu la klavkombinaĵon por atingi malproksimajn fokusajn spacojn." },
+ { name: "Komando por atingi la sekvan fokusan spacon", legend: "Press ${accessNextSpace} por atingi la plej proksiman neatingeblan fokusan spacon post la kursoro, ekzemple : du kuntuŝiĝajn HR elementojn. Ripetu la klavkombinajôn por atingi malproksimajn fokusajn spacojn" }, { name: "Helpilo pri atingeblo", legend: "Premu ${a11yHelp}" }, { name: "Algluu kiel platan tekston", legend: "Presu ${pastetext}", legendEdge: "Presu ${pastetext}, sekvatan de ${paste}" }]
+ }], tab: "Tabo", pause: "Paŭzo", capslock: "Majuskla baskulo",
+ escape: "Eskapa klavo", pageUp: "Antaŭa Paĝo", pageDown: "Sekva Paĝo", leftArrow: "Sago Maldekstren", upArrow: "Sago Supren", rightArrow: "Sago Dekstren", downArrow: "Sago Suben", insert: "Enmeti", leftWindowKey: "Maldekstra Windows-klavo", rightWindowKey: "Dekstra Windows-klavo", selectKey: "Selektklavo", numpad0: "Nombra Klavaro 0", numpad1: "Nombra Klavaro 1", numpad2: "Nombra Klavaro 2", numpad3: "Nombra Klavaro 3", numpad4: "Nombra Klavaro 4", numpad5: "Nombra Klavaro 5", numpad6: "Nombra Klavaro 6", numpad7: "Nombra Klavaro 7",
+ numpad8: "Nombra Klavaro 8", numpad9: "Nombra Klavaro 9", multiply: "Obligi", add: "Almeti", subtract: "Subtrahi", decimalPoint: "Dekuma Punkto", divide: "Dividi", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Nombra Baskulo", scrollLock: "Ruluma Baskulo", semiColon: "Punktokomo", equalSign: "Egalsigno", comma: "Komo", dash: "Haltostreko", period: "Punkto", forwardSlash: "Oblikvo", graveAccent: "Malakuto", openBracket: "Malferma Krampo", backSlash: "Retroklino", closeBracket: "Ferma Krampo",
+ singleQuote: "Citilo"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/es-mx.js b/plugins/a11yhelp/dialogs/lang/es-mx.js
new file mode 100755
index 0000000..cfb1a5b
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/es-mx.js
@@ -0,0 +1,21 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "es-mx", {
+ title: "Instrucciones de accesibilidad", contents: "Contenidos de ayuda. Para cerrar este cuadro de diálogo presione ESC.", legend: [{
+ name: "General", items: [{ name: "Barra de herramientas del editor", legend: "Presione ${toolbarFocus} para navegar a la barra de herramientas. Desplácese al grupo de barras de herramientas siguiente y anterior con SHIFT + TAB. Desplácese al botón siguiente y anterior de la barra de herramientas con FLECHA DERECHA o FLECHA IZQUIERDA. Presione SPACE o ENTER para activar el botón de la barra de herramientas." },
+ { name: "Editor de diálogo", legend: "Dentro de un cuadro de diálogo, pulse TAB para desplazarse hasta el siguiente elemento de diálogo, pulse MAYÚS + TAB para desplazarse al elemento de diálogo anterior, pulse ENTER para enviar el diálogo, pulse ESC para cancelar el diálogo. Cuando un cuadro de diálogo tiene varias pestañas, se puede acceder a la lista de pestañas con ALT + F10 o con TAB como parte del orden de tabulación del diálogo. Con la lista de tabuladores enfocada, mueva a la pestaña siguiente y anterior con las flechas DERECHA y IZQUIERDA, respectivamente." },
+ { name: "Menú contextual del editor", legend: "Presione ${contextMenu} o CLAVE DE APLICACIÓN para abrir el menú contextual. A continuación, vaya a la siguiente opción del menú con TAB o DOWN ARROW. Desplácese a la opción anterior con SHIFT + TAB o FLECHA ARRIBA. Presione SPACE o ENTER para seleccionar la opción del menú. Abra el submenú de la opción actual con ESPACIO o ENTER o FLECHA DERECHA. Vuelva al elemento de menú principal con ESC o FLECHA IZQUIERDA. Cerrar el menú contextual con ESC." }, {
+ name: "Editor de cuadro de lista",
+ legend: "Dentro de un cuadro de lista, mueva al siguiente elemento de lista con TAB O FLECHA ABAJO. Mueva al elemento anterior de la lista con MAYÚS + TAB o FLECHA ARRIBA. Presione SPACE o ENTER para seleccionar la opción de lista. Presione ESC para cerrar el cuadro de lista."
+ }, { name: "Barra de ruta del elemento del editor", legend: "Presione ${elementsPathFocus} para navegar a la barra de ruta de elementos. Desplácese al siguiente botón de elemento con TAB o FLECHA DERECHA. Desplácese al botón anterior con SHIFT + TAB o FLECHA IZQUIERDA. Presione SPACE o ENTER para seleccionar el elemento en el editor." }]
+ },
+ {
+ name: "Comandos", items: [{ name: "Comando deshacer", legend: "Presiona ${undo}" }, { name: "Comando rehacer", legend: "Presiona ${redo}" }, { name: "Comando negrita", legend: "Presiona ${bold}" }, { name: "Comando cursiva", legend: "Presiona {italic}" }, { name: "Comando subrayado", legend: "Presiona ${underline}" }, { name: "Comando enlace", legend: "Presiona ${link}" }, { name: "Comando colapsar barra de herramientas", legend: "Presiona ${toolbarCollapse}" }, { name: "Acceda al comando de espacio de enfoque anterior", legend: "Presione ${accessPreviousSpace} para acceder al espacio de enfoque inaccesible más cercano antes del cursor, por ejemplo: dos elementos HR adyacentes. Repita la combinación de teclas para alcanzar los espacios de enfoque distantes." },
+ { name: "Acceder al siguiente comando de espacio de enfoque", legend: "Pulse ${accessNextSpace} para acceder al espacio de enfoque más cercano inaccesible después del cursor, por ejemplo: dos elementos HR adyacentes. Repita la combinación de teclas para alcanzar los espacios de enfoque distantes." }, { name: "Ayuda de accesibilidad", legend: "Presiona ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tabulador", pause: "Pausa",
+ capslock: "Mayúsculas", escape: "Escape", pageUp: "Página arriba", pageDown: "Página abajo", leftArrow: "Flecha izquierda", upArrow: "Flecha arriba", rightArrow: "Flecha derecha", downArrow: "Flecha abajo", insert: "Insertar", leftWindowKey: "Tecla izquierda de Windows", rightWindowKey: "Tecla derecha de Windows", selectKey: "Tecla de selección", numpad0: "Teclado numérico 0", numpad1: "Teclado numérico 1", numpad2: "Teclado numérico 2", numpad3: "Teclado numérico 3", numpad4: "Teclado numérico 4", numpad5: "Teclado numérico 5", numpad6: "Teclado numérico 6",
+ numpad7: "Teclado numérico 7", numpad8: "Teclado numérico 8", numpad9: "Teclado numérico 9", multiply: "Multiplicar", add: "Sumar", subtract: "Restar", decimalPoint: "Punto decimal", divide: "Dividir", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Números", scrollLock: "Bloqueo de desplazamiento", semiColon: "punto y coma", equalSign: "Signo igual", comma: "Coma", dash: "Guión", period: "Espacio", forwardSlash: "Diagonal", graveAccent: "Acento grave", openBracket: "Abrir paréntesis",
+ backSlash: "Diagonal invertida", closeBracket: "Cerrar paréntesis", singleQuote: "Comillas simple"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/es.js b/plugins/a11yhelp/dialogs/lang/es.js
new file mode 100755
index 0000000..e026518
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/es.js
@@ -0,0 +1,23 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "es", {
+ title: "Instrucciones de accesibilidad", contents: "Ayuda. Para cerrar presione ESC.", legend: [{
+ name: "General", items: [{ name: "Barra de herramientas del editor", legend: 'Presiona ${toolbarFocus} para navegar por la barra de herramientas. Para moverse por los distintos grupos de herramientas usa las teclas TAB y MAY+TAB. Para moverse por las distintas herramientas usa FLECHA DERECHA o FECHA IZQUIERDA. Presiona "espacio" o "intro" para activar la herramienta.' }, {
+ name: "Editor de diálogo",
+ legend: "Dentro del diálogo, presione TAB para navegar a los siguientes elementos de diálogo, presione SHIFT+TAB para moverse a los anteriores elementos de diálogo, presione ENTER para enviar el diálogo, presiona ESC para cancelar el diálogo. Cuando el diálogo tiene multiples pestañas, la lista de pestañas puede ser abarcada con ALT + F10 or con TAB como parte del orden de pestañas del diálogo. ECon la pestaña enfocada, puede moverse a la siguiente o anterior pestaña con las FLECHAS IZQUIRDA y DERECHA respectivamente."
+ },
+ { name: "Editor del menú contextual", legend: "Presiona ${contextMenu} o TECLA MENÚ para abrir el menú contextual. Entonces muévete a la siguiente opción del menú con TAB o FLECHA ABAJO. Muévete a la opción previa con SHIFT + TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para seleccionar la opción del menú. Abre el submenú de la opción actual con ESPACIO o ENTER o FLECHA DERECHA. Regresa al elemento padre del menú con ESC o FLECHA IZQUIERDA. Cierra el menú contextual con ESC." }, {
+ name: "Lista del Editor",
+ legend: "Dentro de una lista, te mueves al siguiente elemento de la lista con TAB o FLECHA ABAJO. Te mueves al elemento previo de la lista con SHIFT+TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para elegir la opción de la lista. Presiona ESC para cerrar la lista."
+ }, { name: "Barra de Ruta del Elemento en el Editor", legend: "Presiona ${elementsPathFocus} para navegar a los elementos de la barra de ruta. Te mueves al siguiente elemento botón con TAB o FLECHA DERECHA. Te mueves al botón previo con SHIFT+TAB o FLECHA IZQUIERDA. Presiona ESPACIO o ENTER para seleccionar el elemento en el editor." }]
+ },
+ {
+ name: "Comandos", items: [{ name: "Comando deshacer", legend: "Presiona ${undo}" }, { name: "Comando rehacer", legend: "Presiona ${redo}" }, { name: "Comando negrita", legend: "Presiona ${bold}" }, { name: "Comando itálica", legend: "Presiona ${italic}" }, { name: "Comando subrayar", legend: "Presiona ${underline}" }, { name: "Comando liga", legend: "Presiona ${liga}" }, { name: "Comando colapsar barra de herramientas", legend: "Presiona ${toolbarCollapse}" }, { name: "Comando accesar el anterior espacio de foco", legend: "Presiona ${accessPreviousSpace} para accesar el espacio de foco no disponible más cercano anterior al cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes." },
+ { name: "Comando accesar el siguiente spacio de foco", legend: "Presiona ${accessNextSpace} para accesar el espacio de foco no disponible más cercano después del cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes." }, { name: "Ayuda de Accesibilidad", legend: "Presiona ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tabulador", pause: "Pausa", capslock: "Bloq. Mayús.",
+ escape: "Escape", pageUp: "Regresar Página", pageDown: "Avanzar Página", leftArrow: "Flecha Izquierda", upArrow: "Flecha Arriba", rightArrow: "Flecha Derecha", downArrow: "Flecha Abajo", insert: "Insertar", leftWindowKey: "Tecla Windows Izquierda", rightWindowKey: "Tecla Windows Derecha", selectKey: "Tecla de Selección", numpad0: "Tecla 0 del teclado numérico", numpad1: "Tecla 1 del teclado numérico", numpad2: "Tecla 2 del teclado numérico", numpad3: "Tecla 3 del teclado numérico", numpad4: "Tecla 4 del teclado numérico", numpad5: "Tecla 5 del teclado numérico",
+ numpad6: "Tecla 6 del teclado numérico", numpad7: "Tecla 7 del teclado numérico", numpad8: "Tecla 8 del teclado numérico", numpad9: "Tecla 9 del teclado numérico", multiply: "Multiplicar", add: "Sumar", subtract: "Restar", decimalPoint: "Punto Decimal", divide: "Dividir", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Punto y coma", equalSign: "Signo de Igual", comma: "Coma", dash: "Guión", period: "Punto", forwardSlash: "Diagonal",
+ graveAccent: "Acento Grave", openBracket: "Abrir llave", backSlash: "Diagonal Invertida", closeBracket: "Cerrar llave", singleQuote: "Comillas simples"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/et.js b/plugins/a11yhelp/dialogs/lang/et.js
new file mode 100755
index 0000000..2e1b39d
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/et.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","et",{title:"Accessibility Instructions",contents:"Abi sisu. Selle dialoogi sulgemiseks vajuta ESC klahvi.",legend:[{name:"Üldine",items:[{name:"Redaktori tööriistariba",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Muuda dialoogi",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},
+{name:"Redaktori kontekstimenüü",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Käsud",items:[{name:"Tühista käsk",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"},{name:"Asetamine tavalise tekstina",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Paus",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"Nool vasakule",upArrow:"Nool üles",rightArrow:"Nool paremale",downArrow:"Nool alla",insert:"Insert",leftWindowKey:"Left Windows key",rightWindowKey:"Right Windows key",selectKey:"Select key",numpad0:"Numpad 0",numpad1:"Numpad 1",
+numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Multiply",add:"Lisa",subtract:"Subtract",decimalPoint:"Decimal Point",divide:"Divide",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semicolon",equalSign:"Equal Sign",comma:"Koma",dash:"Sidekriips",period:"Punkt",forwardSlash:"Forward Slash",
+graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/eu.js b/plugins/a11yhelp/dialogs/lang/eu.js
new file mode 100755
index 0000000..b084c8d
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/eu.js
@@ -0,0 +1,22 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "eu", {
+ title: "Erabilerraztasunaren argibideak", contents: "Laguntzaren edukiak. Elkarrizketa-koadro hau ixteko sakatu ESC.", legend: [{
+ name: "Orokorra", items: [{ name: "Editorearen tresna-barra", legend: "Sakatu ${toolbarFocus} tresna-barrara nabigatzeko. Tresna-barrako aurreko eta hurrengo taldera joateko erabili TAB eta MAIUS+TAB. Tresna-barrako aurreko eta hurrengo botoira joateko erabili ESKUIN-GEZIA eta EZKER-GEZIA. Sakatu ZURIUNEA edo SARTU tresna-barrako botoia aktibatzeko." },
+ { name: "Editorearen elkarrizketa-koadroa", legend: "Elkarrizketa-koadro baten barruan sakatu TAB hurrengo elementura nabigatzeko, sakatu MAIUS+TAB aurreko elementura joateko, sakatu SARTU elkarrizketa-koadroa bidaltzeko eta sakatu ESC uzteko. Elkarrizketa-koadro batek hainbat fitxa dituenean, ALT+F10 erabiliz irits daiteke fitxen zerrendara, edo TAB erabiliz. Fokoa fitxen zerrendak duenean, aurreko eta hurrengo fitxetara joateko erabili EZKER-GEZIA eta ESKUIN-GEZIA." }, {
+ name: "Editorearen testuinguru-menua",
+ legend: "Sakatu ${contextMenu} edo APLIKAZIO TEKLA testuinguru-menua irekitzeko. Menuko hurrengo aukerara joateko erabili TAB edo BEHERA GEZIA. Aurreko aukerara nabigatzeko erabili MAIUS+TAB edo GORA GEZIA. Sakatu ZURIUNEA edo SARTU menuko aukera hautatzeko. Ireki uneko aukeraren azpi-menua ZURIUNEA edo SARTU edo ESKUIN-GEZIA erabiliz. Menuko aukera gurasora itzultzeko erabili ESC edo EZKER-GEZIA. Testuinguru-menua ixteko sakatu ESC."
+ }, { name: "Editorearen zerrenda-koadroa", legend: "Zerrenda-koadro baten barruan, zerrendako hurrengo elementura joateko erabili TAB edo BEHERA GEZIA. Zerrendako aurreko elementura nabigatzeko MAIUS+TAB edo GORA GEZIA. Sakatu ZURIUNEA edo SARTU zerrendako aukera hautatzeko. Sakatu ESC zerrenda-koadroa ixteko." },
+ { name: "Editorearen elementuaren bide-barra", legend: "Sakatu ${elementsPathFocus} elementuaren bide-barrara nabigatzeko. Hurrengo elementuaren botoira joateko erabili TAB edo ESKUIN-GEZIA. Aurreko botoira joateko aldiz erabili MAIUS+TAB edo EZKER-GEZIA. Elementua editorean hautatzeko sakatu ZURIUNEA edo SARTU." }]
+ }, {
+ name: "Komandoak", items: [{ name: "Desegin komandoa", legend: "Sakatu ${undo}" }, { name: "Berregin komandoa", legend: "Sakatu ${redo}" }, { name: "Lodia komandoa", legend: "Sakatu ${bold}" }, {
+ name: "Etzana komandoa",
+ legend: "Sakatu ${italic}"
+ }, { name: "Azpimarratu komandoa", legend: "Sakatu ${underline}" }, { name: "Esteka komandoa", legend: "Sakatu ${link}" }, { name: "Tolestu tresna-barra komandoa", legend: "Sakatu ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: "Erabilerraztasunaren laguntza", legend: "Sakatu ${a11yHelp}" }, { name: "Itsatsi testu arrunt bezala", legend: "Sakatu ${pastetext}", legendEdge: "Sakatu ${pastetext} eta jarraian ${paste}" }]
+ }], tab: "Tabuladorea", pause: "Pausatu", capslock: "Blok Maius", escape: "Ihes", pageUp: "Orria gora", pageDown: "Orria behera", leftArrow: "Ezker-gezia", upArrow: "Gora gezia", rightArrow: "Eskuin-gezia", downArrow: "Behera gezia", insert: "Txertatu", leftWindowKey: "Ezkerreko Windows tekla", rightWindowKey: "Eskuineko Windows tekla", selectKey: "Hautatu tekla",
+ numpad0: "Zenbakizko teklatua 0", numpad1: "Zenbakizko teklatua 1", numpad2: "Zenbakizko teklatua 2", numpad3: "Zenbakizko teklatua 3", numpad4: "Zenbakizko teklatua 4", numpad5: "Zenbakizko teklatua 5", numpad6: "Zenbakizko teklatua 6", numpad7: "Zenbakizko teklatua 7", numpad8: "Zenbakizko teklatua 8", numpad9: "Zenbakizko teklatua 9", multiply: "Biderkatu", add: "Gehitu", subtract: "Kendu", decimalPoint: "Koma hamartarra", divide: "Zatitu", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11",
+ f12: "F12", numLock: "Blok Zenb", scrollLock: "Blok Korr", semiColon: "Puntu eta koma", equalSign: "Berdin zeinua", comma: "Koma", dash: "Marratxoa", period: "Puntua", forwardSlash: "Barra", graveAccent: "Azentu kamutsa", openBracket: "Parentesia ireki", backSlash: "Alderantzizko barra", closeBracket: "Itxi parentesia", singleQuote: "Komatxo bakuna"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/fa.js b/plugins/a11yhelp/dialogs/lang/fa.js
new file mode 100755
index 0000000..62f5fd0
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/fa.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "fa", {
+ title: "دستورالعمل‌های دسترسی", contents: "راهنمای فهرست مطالب. برای بستن این کادر محاوره‌ای ESC را فشار دهید.", legend: [{
+ name: "عمومی", items: [{ name: "نوار ابزار ویرایشگر", legend: "${toolbarFocus} را برای باز کردن نوار ابزار بفشارید. با کلید Tab و Shift+Tab در مجموعه نوار ابزار بعدی و قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی و بعدی با کلید جهت‌نمای راست و چپ جابجا شوید. کلید Space یا Enter را برای فعال کردن کلید نوار ابزار بفشارید." }, {
+ name: "پنجره محاورهای ویرایشگر",
+ legend: "در داخل یک پنجره محاوره‌ای، کلید Tab را بفشارید تا به پنجره‌ی بعدی بروید، Shift+Tab برای حرکت به فیلد قبلی، فشردن Enter برای ثبت اطلاعات پنجره‌، فشردن Esc برای لغو پنجره محاوره‌ای و برای پنجره‌هایی که چندین برگه دارند، فشردن Alt+F10 یا Tab برای حرکت در برگه ها. وقتی بر فهرست برگه ها هستید، به صفحه بعدی و قبلی با کلید های راستی و چپ حرکت کنید."
+ }, { name: "منوی متنی ویرایشگر", legend: "${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc." },
+ { name: "جعبه فهرست ویرایشگر", legend: "در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید." }, { name: "ویرایشگر عنصر نوار راه", legend: "برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهت‌نمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهت‌نمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر." }]
+ },
+ {
+ name: "فرمان‌ها", items: [{ name: "بازگشت به آخرین فرمان", legend: "فشردن ${undo}" }, { name: "انجام مجدد فرمان", legend: "فشردن ${redo}" }, { name: "فرمان درشت کردن متن", legend: "فشردن ${bold}" }, { name: "فرمان کج کردن متن", legend: "فشردن ${italic}" }, { name: "فرمان زیرخطدار کردن متن", legend: "فشردن ${underline}" }, { name: "فرمان پیوند دادن", legend: "فشردن ${link}" }, { name: "بستن نوار ابزار فرمان", legend: "فشردن ${toolbarCollapse}" }, { name: "دسترسی به فرمان محل تمرکز قبلی", legend: "فشردن ${accessPreviousSpace} برای دسترسی به نزدیک‌ترین فضای قابل دسترسی تمرکز قبل از هشتک، برای مثال: دو عنصر مجاور HR -خط افقی-. تکرار کلید ترکیبی برای رسیدن به فضاهای تمرکز از راه دور." },
+ { name: "دسترسی به فضای دستور بعدی", legend: "برای دسترسی به نزدیک‌ترین فضای تمرکز غیر قابل دسترس، ${accessNextSpace} را پس از علامت هشتک بفشارید، برای مثال: دو عنصر مجاور HR -خط افقی-. کلید ترکیبی را برای رسیدن به فضای تمرکز تکرار کنید." }, { name: "راهنمای دسترسی", legend: "فشردن ${a11yHelp}" }, { name: "چسباندن به عنوان متن ساده", legend: "فشردن ${pastetext}", legendEdge: "فشردن ${pastetext}، همراه با ${paste}" }]
+ }], tab: "برگه", pause: "توقف", capslock: "Caps Lock", escape: "گریز", pageUp: "صفحه به بالا", pageDown: "صفحه به پایین",
+ leftArrow: "پیکان چپ", upArrow: "پیکان بالا", rightArrow: "پیکان راست", downArrow: "پیکان پایین", insert: "ورود", leftWindowKey: "کلید چپ ویندوز", rightWindowKey: "کلید راست ویندوز", selectKey: "انتخاب کلید", numpad0: "کلید شماره 0", numpad1: "کلید شماره 1", numpad2: "کلید شماره 2", numpad3: "کلید شماره 3", numpad4: "کلید شماره 4", numpad5: "کلید شماره 5", numpad6: "کلید شماره 6", numpad7: "کلید شماره 7", numpad8: "کلید شماره 8", numpad9: "کلید شماره 9", multiply: "ضرب", add: "افزودن", subtract: "تفریق", decimalPoint: "نقطه‌ی اعشار", divide: "جدا کردن",
+ f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "علامت تساوی", comma: "کاما", dash: "خط تیره", period: "دوره", forwardSlash: "Forward Slash", graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/fi.js b/plugins/a11yhelp/dialogs/lang/fi.js
new file mode 100755
index 0000000..7bba376
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/fi.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "fi", {
+ title: "Saavutettavuus ohjeet", contents: "Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.", legend: [{
+ name: "Yleinen", items: [{ name: "Editorin työkalupalkki", legend: "Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT+TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen." },
+ { name: "Editorin dialogi", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." }, { name: "Editorin oheisvalikko", legend: "Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella." },
+ { name: "Editorin listalaatikko", legend: "Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon." }, { name: "Editorin elementtipolun palkki", legend: "Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa." }]
+ },
+ {
+ name: "Komennot", items: [{ name: "Peruuta komento", legend: "Paina ${undo}" }, { name: "Tee uudelleen komento", legend: "Paina ${redo}" }, { name: "Lihavoi komento", legend: "Paina ${bold}" }, { name: "Kursivoi komento", legend: "Paina ${italic}" }, { name: "Alleviivaa komento", legend: "Paina ${underline}" }, { name: "Linkki komento", legend: "Paina ${link}" }, { name: "Pienennä työkalupalkki komento", legend: "Paina ${toolbarCollapse}" }, { name: "Siirry aiempaan fokustilaan komento", legend: "Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin edellä olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin." },
+ { name: "Siirry seuraavaan fokustilaan komento", legend: "Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin jälkeen olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin." }, { name: "Saavutettavuus ohjeet", legend: "Paina ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape",
+ pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numeronäppäimistö 0", numpad1: "Numeronäppäimistö 1", numpad2: "Numeronäppäimistö 2", numpad3: "Numeronäppäimistö 3", numpad4: "Numeronäppäimistö 4", numpad5: "Numeronäppäimistö 5", numpad6: "Numeronäppäimistö 6", numpad7: "Numeronäppäimistö 7", numpad8: "Numeronäppäimistö 8",
+ numpad9: "Numeronäppäimistö 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Puolipiste", equalSign: "Equal Sign", comma: "Pilkku", dash: "Dash", period: "Piste", forwardSlash: "Forward Slash", graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/fo.js b/plugins/a11yhelp/dialogs/lang/fo.js
new file mode 100755
index 0000000..009e6aa
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/fo.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fo",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"General",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert",leftWindowKey:"Left Windows key",rightWindowKey:"Right Windows key",selectKey:"Select key",numpad0:"Numpad 0",numpad1:"Numpad 1",
+numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Falda",add:"Pluss",subtract:"Frádráttar",decimalPoint:"Decimal Point",divide:"Býta",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semikolon",equalSign:"Javnatekn",comma:"Komma",dash:"Dash",period:"Punktum",forwardSlash:"Forward Slash",
+graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/fr-ca.js b/plugins/a11yhelp/dialogs/lang/fr-ca.js
new file mode 100755
index 0000000..d546b41
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/fr-ca.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "fr-ca", {
+ title: "Instructions d'accessibilité", contents: "Contenu de l'aide. Pour fermer cette fenêtre, appuyez sur ESC.", legend: [{
+ name: "Général", items: [{ name: "Barre d'outil de l'éditeur", legend: "Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT+TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils." },
+ { name: "Dialogue de l'éditeur", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." }, { name: "Menu contextuel de l'éditeur", legend: "Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC." },
+ { name: "Menu déroulant de l'éditeur", legend: "A l'intérieur d'une liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches SHIFT+TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant." }, { name: "Barre d'emplacement des éléments de l'éditeur", legend: "Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de léditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur." }]
+ },
+ {
+ name: "Commandes", items: [{ name: "Annuler", legend: "Appuyer sur ${undo}" }, { name: "Refaire", legend: "Appuyer sur ${redo}" }, { name: "Gras", legend: "Appuyer sur ${bold}" }, { name: "Italique", legend: "Appuyer sur ${italic}" }, { name: "Souligné", legend: "Appuyer sur ${underline}" }, { name: "Lien", legend: "Appuyer sur ${link}" }, { name: "Enrouler la barre d'outils", legend: "Appuyer sur ${toolbarCollapse}" }, { name: "Accéder à l'objet de focus précédent", legend: "Appuyer ${accessPreviousSpace} pour accéder au prochain espace disponible avant le curseur, par exemple: deux éléments HR adjacents. Répéter la combinaison pour joindre les éléments d'espaces distantes." },
+ { name: "Accéder au prochain objet de focus", legend: "Appuyer ${accessNextSpace} pour accéder au prochain espace disponible après le curseur, par exemple: deux éléments HR adjacents. Répéter la combinaison pour joindre les éléments d'espaces distantes." }, { name: "Aide d'accessibilité", legend: "Appuyer sur ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up",
+ pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide",
+ f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash", graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/fr.js b/plugins/a11yhelp/dialogs/lang/fr.js
new file mode 100755
index 0000000..68721f6
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/fr.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fr",{title:"Instructions d'accessibilité",contents:"Contenu de l'aide. Pour fermer cette fenêtre, appuyez sur la touche Échap.",legend:[{name:"Général",items:[{name:"Barre d'outils de l'éditeur",legend:"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers le groupe suivant ou précédent de la barre d'outils avec les touches Tab et Maj+Tab. Se déplacer vers le bouton suivant ou précédent de la barre d'outils avec les touches Flèche droite et Flèche gauche. Appuyer sur la barre d'espace ou la touche Entrée pour activer le bouton de barre d'outils."},
+{name:"Fenêtre de l'éditeur",legend:"Dans une boîte de dialogue, appuyer sur Tab pour passer à l'élément suivant, appuyer sur Maj+Tab pour passer à l'élément précédent, appuyer sur Entrée pour valider, appuyer sur Échap pour annuler. Quand une boîte de dialogue possède des onglets, la liste peut être atteinte avec Alt+F10 ou avec Tab. Dans la liste des onglets, se déplacer vers le suivant et le précédent avec les touches Flèche droite et Flèche gauche respectivement."},{name:"Menu contextuel de l'éditeur",
+legend:"Appuyer sur ${contextMenu} ou sur la touche Menu pour ouvrir le menu contextuel. Se déplacer ensuite vers l'option suivante du menu avec les touches Tab ou Flèche bas. Se déplacer vers l'option précédente avec les touches Maj+Tab ou Flèche haut. Appuyer sur la barre d'espace ou la touche Entrée pour sélectionner l'option du menu. Appuyer sur la barre d'espace, la touche Entrée ou Flèche droite pour ouvrir le sous-menu de l'option sélectionnée. Revenir à l'élément de menu parent avec la touche Échap ou Flèche gauche. Fermer le menu contextuel avec Échap."},
+{name:"Zone de liste de l'éditeur",legend:"Dans une liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches Tab ou Flèche bas. Se déplacer vers l'élément précédent de la liste avec les touches Maj+Tab ou Flèche haut. Appuyer sur la barre d'espace ou sur Entrée pour sélectionner l'option dans la liste. Appuyer sur Échap pour fermer le menu déroulant."},{name:"Barre du chemin d'éléments de l'éditeur",legend:"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre du fil d'Ariane des éléments. Se déplacer vers le bouton de l'élément suivant avec les touches Tab ou Flèche droite. Se déplacer vers le bouton précédent avec les touches Maj+Tab ou Flèche gauche. Appuyer sur la barre d'espace ou sur Entrée pour sélectionner l'élément dans l'éditeur."}]},
+{name:"Commandes",items:[{name:" Annuler la commande",legend:"Appuyer sur ${undo}"},{name:"Commande restaurer",legend:"Appuyer sur ${redo}"},{name:" Commande gras",legend:"Appuyer sur ${bold}"},{name:" Commande italique",legend:"Appuyer sur ${italic}"},{name:" Commande souligné",legend:"Appuyer sur ${underline}"},{name:" Commande lien",legend:"Appuyer sur ${link}"},{name:" Commande enrouler la barre d'outils",legend:"Appuyer sur ${toolbarCollapse}"},{name:"Commande d'accès à l'élément sélectionnable précédent",
+legend:"Appuyer sur ${accessNextSpace} pour accéder à l'élément sélectionnable inatteignable le plus proche avant le curseur, par exemple : deux lignes horizontales adjacentes. Répéter la combinaison de touches pour atteindre les éléments sélectionnables précédents."},{name:"Commande d'accès à l'élément sélectionnable suivant",legend:"Appuyer sur ${accessNextSpace} pour accéder à l'élément sélectionnable inatteignable le plus proche après le curseur, par exemple : deux lignes horizontales adjacentes. Répéter la combinaison de touches pour atteindre les éléments sélectionnables suivants."},
+{name:" Aide sur l'accessibilité",legend:"Appuyer sur ${a11yHelp}"},{name:"Coller comme texte sans mise en forme",legend:"Appuyer sur ${pastetext}",legendEdge:"Enfoncez ${pastetext}, suivi par ${paste}"}]}],tab:"Tabulation",pause:"Pause",capslock:"Verr. Maj.",escape:"Échap",pageUp:"Page supérieure",pageDown:"Page suivante",leftArrow:"Flèche gauche",upArrow:"Flèche haut",rightArrow:"Flèche droite",downArrow:"Flèche basse",insert:"Inser",leftWindowKey:"Touche Windows gauche",rightWindowKey:"Touche Windows droite",
+selectKey:"Touche Sélectionner",numpad0:"0 du pavé numérique",numpad1:"1 du pavé numérique",numpad2:"2 du pavé numérique",numpad3:"3 du pavé numérique",numpad4:"4 du pavé numérique",numpad5:"5 du pavé numérique",numpad6:"6 du pavé numérique",numpad7:"7 du pavé numérique",numpad8:"Pavé numérique 8",numpad9:"9 du pavé numérique",multiply:"Multiplier",add:"Plus",subtract:"Moins",decimalPoint:"Point décimal",divide:"Diviser",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",
+f11:"F11",f12:"F12",numLock:"Verr. Num.",scrollLock:"Arrêt défil.",semiColon:"Point-virgule",equalSign:"Signe égal",comma:"Virgule",dash:"Tiret",period:"Point",forwardSlash:"Barre oblique",graveAccent:"Accent grave",openBracket:"Parenthèse ouvrante",backSlash:"Barre oblique inverse",closeBracket:"Parenthèse fermante",singleQuote:"Apostrophe"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/gl.js b/plugins/a11yhelp/dialogs/lang/gl.js
new file mode 100755
index 0000000..abcc125
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/gl.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "gl", {
+ title: "Instrucións de accesibilidade", contents: "Axuda. Para pechar este diálogo prema ESC.", legend: [{
+ name: "Xeral", items: [{ name: "Barra de ferramentas do editor", legend: "Prema ${toolbarFocus} para navegar pola barra de ferramentas. Para moverse polos distintos grupos de ferramentas use as teclas TAB e MAIÚS+TAB. Para moverse polas distintas ferramentas use FRECHA DEREITA ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para activar o botón da barra de ferramentas." },
+ { name: "Editor de diálogo", legend: "Dentro do diálogo, prema TAB para navegar cara os seguintes elementos de diálogo, prema MAIÚS+TAB para moverse cara os anteriores elementos de diálogo, prema INTRO para enviar o diálogo, prema ESC para cancelar o diálogo. Cando o diálogo ten múltiples lapelas, a lista de lapelas pode cinguirse con ALT+F10 ou con TAB como parte da orde de lapelas do diálogo. Coa lapela en foco, pode moverse cara a seguinte ou a anterior lapela coas FRECHAS ESQUERDA e DEREICHA respectivamente." },
+ { name: "Editor do menú contextual", legend: "Prema ${contextMenu} ou a TECLA MENÚ para abrir o menú contextual. A seguir móvase á seguinte opción do menú con TAB ou FRECHA ABAIXO. Móvase á opción anterior con MAIÚS + TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para seleccionar a opción do menú. Abra o submenú da opción actual con ESPAZO ou INTRO ou FRECHA DEREITA. Regrese ao elemento principal do menú con ESC ou FRECHA ESQUERDA. Peche o menú contextual con ESC." }, { name: "Lista do editor", legend: "Dentro dunha lista, móvase ao seguinte elemento da lista con TAB ou FRECHA ABAIXO. Móvase ao elemento anterior da lista con MAIÚS+TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para escoller a opción da lista. Prema ESC para pechar a lista." },
+ { name: "Barra da ruta ao elemento no editor", legend: "Prema ${elementsPathFocus} para navegar ata os elementos da barra de ruta. Móvase ao seguinte elemento botón con TAB ou FRECHA DEREITA. Móvase ao botón anterior con MAIÚS+TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar o elemento no editor." }]
+ }, {
+ name: "Ordes", items: [{ name: "Orde «desfacer»", legend: "Prema ${undo}" }, { name: "Orde «refacer»", legend: "Prema ${redo}" }, { name: "Orde «negra»", legend: "Prema ${bold}" }, { name: "Orde «cursiva»", legend: "Prema ${italic}" },
+ { name: "Orde «subliñar»", legend: "Prema ${underline}" }, { name: "Orde «ligazón»", legend: "Prema ${link}" }, { name: "Orde «contraer a barra de ferramentas»", legend: "Prema ${toolbarCollapse}" }, { name: "Orde «acceder ao anterior espazo en foco»", legend: "Prema ${accessPreviousSpace} para acceder ao espazo máis próximo de foco inalcanzábel anterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes." }, {
+ name: "Orde «acceder ao seguinte espazo en foco»",
+ legend: "Prema ${accessNextSpace} para acceder ao espazo máis próximo de foco inalcanzábel posterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes."
+ }, { name: "Axuda da accesibilidade", legend: "Prema ${a11yHelp}" }, { name: "Pegar como texto simple", legend: "Prema ${pastetext}", legendEdge: "Prema ${pastetext}, seguido de ${paste}" }]
+ }], tab: "Tabulador", pause: "Pausa", capslock: "Bloq. Maiús", escape: "Escape", pageUp: "Páxina arriba", pageDown: "Páxina abaixo",
+ leftArrow: "Frecha esquerda", upArrow: "Frecha arriba", rightArrow: "Frecha dereita", downArrow: "Frecha abaixo", insert: "Inserir", leftWindowKey: "Tecla Windows esquerda", rightWindowKey: "Tecla Windows dereita", selectKey: "Escolla a tecla", numpad0: "Tec. numérico 0", numpad1: "Tec. numérico 1", numpad2: "Tec. numérico 2", numpad3: "Tec. numérico 3", numpad4: "Tec. numérico 4", numpad5: "Tec. numérico 5", numpad6: "Tec. numérico 6", numpad7: "Tec. numérico 7", numpad8: "Tec. numérico 8", numpad9: "Tec. numérico 9", multiply: "Multiplicar",
+ add: "Sumar", subtract: "Restar", decimalPoint: "Punto decimal", divide: "Dividir", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Bloq. num.", scrollLock: "Bloq. despraz.", semiColon: "Punto e coma", equalSign: "Signo igual", comma: "Coma", dash: "Guión", period: "Punto", forwardSlash: "Barra inclinada", graveAccent: "Acento grave", openBracket: "Abrir corchete", backSlash: "Barra invertida", closeBracket: "Pechar corchete", singleQuote: "Comiña simple"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/gu.js b/plugins/a11yhelp/dialogs/lang/gu.js
new file mode 100755
index 0000000..ab3290a
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/gu.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "gu", {
+ title: "એક્ક્ષેબિલિટી ની વિગતો", contents: "હેલ્પ. આ બંધ કરવા ESC દબાવો.", legend: [{
+ name: "જનરલ", items: [{ name: "એડિટર ટૂલબાર", legend: "Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button." }, { name: "એડિટર ડાયલોગ", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Editor Context Menu", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "Editor List Box", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "કમાંડસ", items: [{ name: "અન્ડું કમાંડ", legend: "$ દબાવો {undo}" }, { name: "ફરી કરો કમાંડ", legend: "$ દબાવો {redo}" }, { name: "બોલ્દનો કમાંડ", legend: "$ દબાવો {bold}" }, { name: " Italic command", legend: "Press ${italic}" }, {
+ name: " Underline command",
+ legend: "Press ${underline}"
+ }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash",
+ graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/he.js b/plugins/a11yhelp/dialogs/lang/he.js
new file mode 100755
index 0000000..ca5246e
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/he.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "he", {
+ title: "הוראות נגישות", contents: "הוראות נגישות. לסגירה לחץ אסקייפ (ESC).", legend: [{
+ name: "כללי", items: [{ name: "סרגל הכלים", legend: "לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר." }, { name: "דיאלוגים (חלונות תשאול)", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "תפריט ההקשר (Context Menu)", legend: "לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC)." }, { name: "תפריטים צפים (List boxes)", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "עץ אלמנטים (Elements Path)", legend: "לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך." }]
+ }, {
+ name: "פקודות", items: [{ name: " ביטול צעד אחרון", legend: "לחץ ${undo}" }, { name: " חזרה על צעד אחרון", legend: "לחץ ${redo}" }, { name: " הדגשה", legend: "לחץ ${bold}" }, { name: " הטייה", legend: "לחץ ${italic}" }, { name: " הוספת קו תחתון", legend: "לחץ ${underline}" }, {
+ name: " הוספת לינק",
+ legend: "לחץ ${link}"
+ }, { name: " כיווץ סרגל הכלים", legend: "לחץ ${toolbarCollapse}" }, { name: "גישה למיקום המיקוד הקודם", legend: "לחץ ${accessPreviousSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב לפני הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר." }, { name: "גישה למיקום המיקוד הבא", legend: "לחץ ${accessNextSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב אחרי הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר." },
+ { name: " הוראות נגישות", legend: "לחץ ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "חץ שמאלה", upArrow: "חץ למעלה", rightArrow: "חץ ימינה", downArrow: "חץ למטה", insert: "הכנס", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "בחר מקש", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2",
+ numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "הוסף", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "סלאש", graveAccent: "Grave Accent",
+ openBracket: "Open Bracket", backSlash: "סלאש הפוך", closeBracket: "Close Bracket", singleQuote: "ציטוט יחיד"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/hi.js b/plugins/a11yhelp/dialogs/lang/hi.js
new file mode 100755
index 0000000..c988867
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/hi.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","hi",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"सामान्य",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert",leftWindowKey:"Left Windows key",rightWindowKey:"Right Windows key",selectKey:"Select key",numpad0:"Numpad 0",numpad1:"Numpad 1",
+numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Multiply",add:"Add",subtract:"Subtract",decimalPoint:"Decimal Point",divide:"Divide",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semicolon",equalSign:"Equal Sign",comma:"Comma",dash:"Dash",period:"Period",forwardSlash:"Forward Slash",
+graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/hr.js b/plugins/a11yhelp/dialogs/lang/hr.js
new file mode 100755
index 0000000..18a9608
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/hr.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "hr", {
+ title: "Upute dostupnosti", contents: "Sadržaj pomoći. Za zatvaranje pritisnite ESC.", legend: [{
+ name: "Općenito", items: [{ name: "Alatna traka", legend: "Pritisni ${toolbarFocus} za navigaciju do alatne trake. Pomicanje do prethodne ili sljedeće alatne grupe vrši se pomoću SHIFT+TAB i TAB. Pomicanje do prethodnog ili sljedećeg gumba u alatnoj traci vrši se pomoću lijeve i desne strelice kursora. Pritisnite SPACE ili ENTER za aktivaciju alatne trake." }, {
+ name: "Dijalog",
+ legend: "Unutar dijaloga, pritisnite TAB kako bi navigirali do sljedećeg elementa dijaloga, pritisnite SHIFT+TAB kako bi se pomaknuli do prethodnog elementa, pritisnite ENTER kako bi poslali dijalog, pritisnite ESC za gašenje dijaloga. Kada dijalog ima više kartica, listi kartica se može pristupiti pomoću ALT+F10 ili sa TAB. Kada je fokusirana lista kartica, pomaknite se naprijed ili nazad pomoću strelica LIJEVO ili DESNO."
+ }, { name: "Kontekstni izbornik", legend: "Pritisnite ${contextMenu} ili APPLICATION tipku za otvaranje kontekstnog izbornika. Pomicanje se vrši TAB ili strelicom kursora prema dolje ili SHIFT+TAB ili strelica kursora prema gore. SPACE ili ENTER odabiru opciju izbornika. Otvorite podizbornik trenutne opcije sa SPACE, ENTER ili desna strelica kursora. Povratak na prethodni izbornik vrši se sa ESC ili lijevom strelicom kursora. Zatvaranje se vrši pritiskom na tipku ESC." },
+ { name: "Lista", legend: "Unutar list-boxa, pomicanje na sljedeću stavku vrši se sa TAB ili strelica kursora prema dolje. Na prethodnu sa SHIFT+TAB ili strelica prema gore. Pritiskom na SPACE ili ENTER odabire se stavka ili ESC za zatvaranje." }, { name: "Traka putanje elemenata", legend: "Pritisnite ${elementsPathFocus} za navigaciju po putanji elemenata. Pritisnite TAB ili desnu strelicu kursora za pomicanje na sljedeći element ili SHIFT+TAB ili lijeva strelica kursora za pomicanje na prethodni element. Pritiskom na SPACE ili ENTER vrši se odabir elementa." }]
+ },
+ {
+ name: "Naredbe", items: [{ name: "Vrati naredbu", legend: "Pritisni ${undo}" }, { name: "Ponovi naredbu", legend: "Pritisni ${redo}" }, { name: "Bold naredba", legend: "Pritisni ${bold}" }, { name: "Italic naredba", legend: "Pritisni ${italic}" }, { name: "Underline naredba", legend: "Pritisni ${underline}" }, { name: "Link naredba", legend: "Pritisni ${link}" }, { name: "Smanji alatnu traku naredba", legend: "Pritisni ${toolbarCollapse}" }, { name: "Naredba za pristupi prethodnom prostoru fokusa", legend: "Pritisni ${accessPreviousSpace} za pristup najbližem nedostupnom razmaku prije kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak." },
+ { name: "Naredba za pristup sljedećem prostoru fokusa", legend: "Pritisni ${accessNextSpace} za pristup najbližem nedostupnom razmaku nakon kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak." }, { name: "Pomoć za dostupnost", legend: "Pritisni ${a11yHelp}" }, { name: "Zalijepi kao čisti tekst", legend: "Pritisnite ${pastetext}", legendEdge: "Pritisnite ${pastetext}, zatim ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up",
+ pageDown: "Page Down", leftArrow: "Lijev strelica", upArrow: "Strelica gore", rightArrow: "Desna strelica", downArrow: "Strelica dolje", insert: "Insert", leftWindowKey: "Lijeva Windows tipka", rightWindowKey: "Desna Windows tipka", selectKey: "Tipka Select", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "umpad 8", numpad9: "Numpad 9", multiply: "Množenje", add: "Zbrajanje", subtract: "Oduzimanje", decimalPoint: "Decimalna točka",
+ divide: "Dijeljenje", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Točka zarez", equalSign: "Jednako", comma: "Zarez", dash: "Crtica", period: "Točka", forwardSlash: "Kosa crta", graveAccent: "Akcent", openBracket: "Otvorena uglata zagrada", backSlash: "Obrnuta kosa crta", closeBracket: "Zatvorena uglata zagrada", singleQuote: "Jednostruki navodnik"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/hu.js b/plugins/a11yhelp/dialogs/lang/hu.js
new file mode 100755
index 0000000..895ea82
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/hu.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "hu", {
+ title: "Kisegítő utasítások", contents: "Súgó tartalmak. A párbeszédablak bezárásához nyomjon ESC-et.", legend: [{
+ name: "Általános", items: [{ name: "Szerkesztő Eszköztár", legend: "Nyomjon ${toolbarFocus} hogy kijelölje az eszköztárat. A következő és előző eszköztár csoporthoz a TAB és SHIFT+TAB-al juthat el. A következő és előző eszköztár gombhoz a BAL NYÍL vagy JOBB NYÍL gombbal juthat el. Nyomjon SPACE-t vagy ENTER-t hogy aktiválja az eszköztár gombot." }, {
+ name: "Szerkesző párbeszéd ablak",
+ legend: "Párbeszédablakban nyomjon TAB-ot a következő párbeszédmezőhöz ugráshoz, nyomjon SHIFT + TAB-ot az előző mezőhöz ugráshoz, nyomjon ENTER-t a párbeszédablak elfogadásához, nyomjon ESC-et a párbeszédablak elvetéséhez. Azokhoz a párbeszédablakokhoz, amik több fület tartalmaznak, nyomjon ALT + F10-et vagy TAB-ot hogy a fülekre ugorjon. Ezután a TAB-al vagy a JOBB NYÍLLAL a következő fülre ugorhat."
+ }, { name: "Szerkesztő helyi menü", legend: "Nyomjon ${contextMenu}-t vagy ALKALMAZÁS BILLENTYŰT a helyi menü megnyitásához. Ezután a következő menüpontra léphet a TAB vagy LEFELÉ NYÍLLAL. Az előző opciót a SHIFT+TAB vagy FELFELÉ NYÍLLAL érheti el. Nyomjon SPACE-t vagy ENTER-t a menüpont kiválasztásához. A jelenlegi menüpont almenüjének megnyitásához nyomjon SPACE-t vagy ENTER-t, vagy JOBB NYILAT. A főmenühöz való visszatéréshez nyomjon ESC-et vagy BAL NYILAT. A helyi menü bezárása az ESC billentyűvel lehetséges." },
+ { name: "Szerkesztő lista", legend: "A listán belül a következő elemre a TAB vagy LEFELÉ NYÍLLAL mozoghat. Az előző elem kiválasztásához nyomjon SHIFT+TAB-ot vagy FELFELÉ NYILAT. Nyomjon SPACE-t vagy ENTER-t az elem kiválasztásához. Az ESC billentyű megnyomásával bezárhatja a listát." }, { name: "Szerkesztő elem utak sáv", legend: "Nyomj ${elementsPathFocus} hogy kijelöld a elemek út sávját. A következő elem gombhoz a TAB-al vagy a JOBB NYÍLLAL juthatsz el. Az előző gombhoz a SHIFT+TAB vagy BAL NYÍLLAL mehetsz. A SPACE vagy ENTER billentyűvel kiválaszthatod az elemet a szerkesztőben." }]
+ },
+ {
+ name: "Parancsok", items: [{ name: "Parancs visszavonása", legend: "Nyomj ${undo}" }, { name: "Parancs megismétlése", legend: "Nyomjon ${redo}" }, { name: "Félkövér parancs", legend: "Nyomjon ${bold}" }, { name: "Dőlt parancs", legend: "Nyomjon ${italic}" }, { name: "Aláhúzott parancs", legend: "Nyomjon ${underline}" }, { name: "Link parancs", legend: "Nyomjon ${link}" }, { name: "Szerkesztősáv összecsukása parancs", legend: "Nyomjon ${toolbarCollapse}" }, { name: "Hozzáférés az előző fókusz helyhez parancs", legend: "Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel előtt, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket." },
+ { name: "Hozzáférés a következő fókusz helyhez parancs", legend: "Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel után, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket." }, { name: "Kisegítő súgó", legend: "Nyomjon ${a11yHelp}" }, { name: "Beillesztés egyszerű szövegként", legend: "Nyomja meg: ${pastetext}", legendEdge: "Nyomjon ${pastetext}-t, majd ${paste}-t" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock",
+ escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "balra nyíl", upArrow: "felfelé nyíl", rightArrow: "jobbra nyíl", downArrow: "lefelé nyíl", insert: "Insert", leftWindowKey: "bal Windows-billentyű", rightWindowKey: "jobb Windows-billentyű", selectKey: "Billentyű választása", numpad0: "Számbillentyűk 0", numpad1: "Számbillentyűk 1", numpad2: "Számbillentyűk 2", numpad3: "Számbillentyűk 3", numpad4: "Számbillentyűk 4", numpad5: "Számbillentyűk 5", numpad6: "Számbillentyűk 6", numpad7: "Számbillentyűk 7", numpad8: "Számbillentyűk 8",
+ numpad9: "Számbillentyűk 9", multiply: "Szorzás", add: "Hozzáadás", subtract: "Kivonás", decimalPoint: "Tizedespont", divide: "Osztás", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Pontosvessző", equalSign: "Egyenlőségjel", comma: "Vessző", dash: "Kötőjel", period: "Pont", forwardSlash: "Perjel", graveAccent: "Visszafelé dőlő ékezet", openBracket: "Nyitó szögletes zárójel", backSlash: "fordított perjel", closeBracket: "Záró szögletes zárójel",
+ singleQuote: "szimpla idézőjel"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/id.js b/plugins/a11yhelp/dialogs/lang/id.js
new file mode 100755
index 0000000..c021542
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/id.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "id", {
+ title: "Instruksi Accessibility", contents: "Bantuan. Tekan ESC untuk menutup dialog ini.", legend: [{
+ name: "Umum", items: [{ name: "Toolbar Editor", legend: "Tekan ${toolbarFocus} untuk berpindah ke toolbar. Untuk berpindah ke group toolbar selanjutnya dan sebelumnya gunakan TAB dan SHIFT+TAB. Untuk berpindah ke tombol toolbar selanjutnya dan sebelumnya gunakan RIGHT ARROW atau LEFT ARROW. Tekan SPASI atau ENTER untuk mengaktifkan tombol toolbar." }, {
+ name: "Dialog Editor",
+ legend: "Pada jendela dialog, tekan TAB untuk berpindah pada elemen dialog selanjutnya, tekan SHIFT+TAB untuk berpindah pada elemen dialog sebelumnya, tekan ENTER untuk submit dialog, tekan ESC untuk membatalkan dialog. Pada dialog dengan multi tab, daftar tab dapat diakses dengan ALT+F10 ataupun dengan tombol TAB sesuai urutan tab pada dialog. Jika daftar tab aktif terpilih, untuk berpindah tab dapat menggunakan RIGHT dan LEFT ARROW."
+ }, { name: "Context Menu Editor", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." },
+ { name: "List Box Editor", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." }, { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ },
+ {
+ name: "Commands", items: [{ name: " Undo command", legend: "Press ${undo}" }, { name: " Redo command", legend: "Press ${redo}" }, { name: " Bold command", legend: "Press ${bold}" }, { name: " Italic command", legend: "Press ${italic}" }, { name: " Underline command", legend: "Press ${underline}" }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down",
+ leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3",
+ f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash", graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/it.js b/plugins/a11yhelp/dialogs/lang/it.js
new file mode 100755
index 0000000..1c30508
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/it.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "it", {
+ title: "Istruzioni di Accessibilità", contents: "Contenuti di Aiuto. Per chiudere questa finestra premi ESC.", legend: [{
+ name: "Generale", items: [{ name: "Barra degli strumenti Editor", legend: "Premere ${toolbarFocus} per passare alla barra degli strumenti. Usare TAB per spostarsi al gruppo successivo, MAIUSC+TAB per spostarsi a quello precedente. Usare FRECCIA DESTRA per spostarsi al pulsante successivo, FRECCIA SINISTRA per spostarsi a quello precedente. Premere SPAZIO o INVIO per attivare il pulsante della barra degli strumenti." },
+ { name: "Finestra Editor", legend: "All'interno di una finestra di dialogo è possibile premere TAB per passare all'elemento successivo della finestra, MAIUSC+TAB per passare a quello precedente; premere INVIO per inviare i dati della finestra, oppure ESC per annullare l'operazione. Quando una finestra di dialogo ha più schede, è possibile passare all'elenco delle schede sia con ALT+F10 che con TAB, in base all'ordine delle tabulazioni della finestra. Quando l'elenco delle schede è attivo, premere la FRECCIA DESTRA o la FRECCIA SINISTRA per passare rispettivamente alla scheda successiva o a quella precedente." },
+ { name: "Menù contestuale Editor", legend: "Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all'opzione precedente con MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l'opzione di menu. Apri il sottomenu dell'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC." },
+ { name: "Box Lista Editor", legend: "All'interno di un elenco di opzioni, per spostarsi all'elemento successivo premere TAB oppure FRECCIA GIÙ. Per spostarsi all'elemento precedente usare SHIFT+TAB oppure FRECCIA SU. Premere SPAZIO o INVIO per selezionare l'elemento della lista. Premere ESC per chiudere l'elenco di opzioni." }, { name: "Barra percorso elementi editor", legend: "Premere ${elementsPathFocus} per passare agli elementi della barra del percorso. Usare TAB o FRECCIA DESTRA per passare al pulsante successivo. Per passare al pulsante precedente premere MAIUSC+TAB o FRECCIA SINISTRA. Premere SPAZIO o INVIO per selezionare l'elemento nell'editor." }]
+ },
+ {
+ name: "Comandi", items: [{ name: " Annulla comando", legend: "Premi ${undo}" }, { name: " Ripeti comando", legend: "Premi ${redo}" }, { name: " Comando Grassetto", legend: "Premi ${bold}" }, { name: " Comando Corsivo", legend: "Premi ${italic}" }, { name: " Comando Sottolineato", legend: "Premi ${underline}" }, { name: " Comando Link", legend: "Premi ${link}" }, { name: " Comando riduci barra degli strumenti", legend: "Premi ${toolbarCollapse}" }, { name: "Comando di accesso al precedente spazio di focus", legend: "Premi ${accessPreviousSpace} per accedere il più vicino spazio di focus non raggiungibile prima del simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti." },
+ { name: "Comando di accesso al prossimo spazio di focus", legend: "Premi ${accessNextSpace} per accedere il più vicino spazio di focus non raggiungibile dopo il simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti." }, { name: " Aiuto Accessibilità", legend: "Premi ${a11yHelp}" }, { name: "Incolla come testo semplice", legend: "Premi ${pastetext}", legendEdge: "Premi ${pastetext}, seguito da ${paste}" }]
+ }], tab: "Tab", pause: "Pausa", capslock: "Bloc Maiusc",
+ escape: "Esc", pageUp: "Pagina sù", pageDown: "Pagina giù", leftArrow: "Freccia sinistra", upArrow: "Freccia su", rightArrow: "Freccia destra", downArrow: "Freccia giù", insert: "Ins", leftWindowKey: "Tasto di Windows sinistro", rightWindowKey: "Tasto di Windows destro", selectKey: "Tasto di selezione", numpad0: "0 sul tastierino numerico", numpad1: "1 sul tastierino numerico", numpad2: "2 sul tastierino numerico", numpad3: "3 sul tastierino numerico", numpad4: "4 sul tastierino numerico", numpad5: "5 sul tastierino numerico", numpad6: "6 sul tastierino numerico",
+ numpad7: "7 sul tastierino numerico", numpad8: "8 sul tastierino numerico", numpad9: "9 sul tastierino numerico", multiply: "Moltiplicazione", add: "Più", subtract: "Sottrazione", decimalPoint: "Punto decimale", divide: "Divisione", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Bloc Num", scrollLock: "Bloc Scorr", semiColon: "Punto-e-virgola", equalSign: "Segno di uguale", comma: "Virgola", dash: "Trattino", period: "Punto", forwardSlash: "Barra", graveAccent: "Accento grave",
+ openBracket: "Parentesi quadra aperta", backSlash: "Barra rovesciata", closeBracket: "Parentesi quadra chiusa", singleQuote: "Apostrofo"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/ja.js b/plugins/a11yhelp/dialogs/lang/ja.js
new file mode 100755
index 0000000..e1a49d7
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/ja.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ja",{title:"ユーザー補助の説明",contents:"ヘルプ このダイアログを閉じるには ESCを押してください。",legend:[{name:"全般",items:[{name:"エディターツールバー",legend:"${toolbarFocus} を押すとツールバーのオン/オフ操作ができます。カーソルをツールバーのグループで移動させるにはTabかSHIFT+Tabを押します。グループ内でカーソルを移動させるには、右カーソルか左カーソルを押します。スペースキーやエンターを押すとボタンを有効/無効にすることができます。"},{name:"編集ダイアログ",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},
+{name:"エディターのメニュー",legend:"${contextMenu} キーかAPPLICATION KEYを押すとコンテキストメニューが開きます。Tabか下カーソルでメニューのオプション選択が下に移動します。戻るには、SHIFT+Tabか上カーソルです。スペースもしくはENTERキーでメニューオプションを決定できます。現在選んでいるオプションのサブメニューを開くには、スペース、もしくは右カーソルを押します。サブメニューから親メニューに戻るには、ESCか左カーソルを押してください。ESCでコンテキストメニュー自体をキャンセルできます。"},{name:"エディターリストボックス",legend:"リストボックス内で移動するには、Tabか下カーソルで次のアイテムへ移動します。SHIFT+Tabで前のアイテムに戻ります。リストのオプションを選択するには、スペースもしくは、ENTERを押してください。リストボックスを閉じるには、ESCを押してください。"},{name:"エディター要素パスバー",legend:"${elementsPathFocus} を押すとエレメントパスバーを操作出来ます。Tabか右カーソルで次のエレメントを選択できます。前のエレメントを選択するには、SHIFT+Tabか左カーソルです。スペースもしくは、ENTERでエディタ内の対象エレメントを選択出来ます。"}]},
+{name:"コマンド",items:[{name:"元に戻す",legend:"${undo} をクリック"},{name:"やり直し",legend:"${redo} をクリック"},{name:"太字",legend:"${bold} をクリック"},{name:"斜体 ",legend:"${italic} をクリック"},{name:"下線",legend:"${underline} をクリック"},{name:"リンク",legend:"${link} をクリック"},{name:"ツールバーをたたむ",legend:"${toolbarCollapse} をクリック"},{name:"前のカーソル移動のできないポイントへ",legend:"${accessPreviousSpace} を押すとカーソルより前にあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。"},{name:"次のカーソルポイントへ移動する",legend:"${accessNextSpace} を押すとカーソルより後ろにあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。"},
+{name:"ユーザー補助ヘルプ",legend:"${a11yHelp} をクリック"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"左矢印",upArrow:"上矢印",rightArrow:"右矢印",downArrow:"下矢印",insert:"Insert",leftWindowKey:"左Windowキー",rightWindowKey:"右のWindowキー",selectKey:"Select",numpad0:"Num 0",numpad1:"Num 1",numpad2:"Num 2",numpad3:"Num 3",numpad4:"Num 4",numpad5:"Num 5",
+numpad6:"Num 6",numpad7:"Num 7",numpad8:"Num 8",numpad9:"Num 9",multiply:"掛ける",add:"足す",subtract:"引く",decimalPoint:"小数点",divide:"割る",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"セミコロン",equalSign:"イコール記号",comma:"カンマ",dash:"ダッシュ",period:"ピリオド",forwardSlash:"フォワードスラッシュ",graveAccent:"グレイヴアクセント",openBracket:"開きカッコ",backSlash:"バックスラッシュ",closeBracket:"閉じカッコ",singleQuote:"シングルクォート"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/km.js b/plugins/a11yhelp/dialogs/lang/km.js
new file mode 100755
index 0000000..64be697
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/km.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "km", {
+ title: "Accessibility Instructions", contents: "មាតិកា​ជំនួយ។ ដើម្បី​បិទ​ផ្ទាំង​នេះ សូម​ចុច ESC ។", legend: [{
+ name: "ទូទៅ", items: [{ name: "របារ​ឧបករណ៍​កម្មវិធី​និពន្ធ", legend: "Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button." }, { name: "ផ្ទាំង​កម្មវិធីនិពន្ធ", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "ម៉ីនុយបរិបទអ្នកកែសម្រួល", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "ប្រអប់បញ្ជីអ្នកកែសម្រួល", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "ពាក្យបញ្ជា", items: [{ name: "ការ​បញ្ជា​មិនធ្វើវិញ", legend: "ចុច ${undo}" }, { name: "ការបញ្ជា​ធ្វើវិញ", legend: "ចុច ${redo}" }, { name: "ការបញ្ជា​អក្សរ​ដិត", legend: "ចុច ${bold}" }, { name: "ការបញ្ជា​អក្សរ​ទ្រេត", legend: "ចុច ${italic}" }, {
+ name: "ពាក្យបញ្ជា​បន្ទាត់​ពីក្រោម",
+ legend: "ចុច ${underline}"
+ }, { name: "ពាក្យបញ្ជា​តំណ", legend: "ចុច ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: "ជំនួយ​ពី​ភាព​ងាយស្រួល", legend: "ជួយ ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "ផ្អាក", capslock: "Caps Lock", escape: "ចាកចេញ", pageUp: "ទំព័រ​លើ", pageDown: "ទំព័រ​ក្រោម", leftArrow: "ព្រួញ​ឆ្វេង", upArrow: "ព្រួញ​លើ", rightArrow: "ព្រួញ​ស្ដាំ", downArrow: "ព្រួញ​ក្រោម", insert: "បញ្ចូល", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "ជ្រើស​គ្រាប់​ចុច", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "គុណ", add: "បន្ថែម", subtract: "ដក", decimalPoint: "ចំណុចទសភាគ", divide: "ចែក", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "បិទ​រំកិល", semiColon: "ចុច​ក្បៀស", equalSign: "សញ្ញា​អឺរ៉ូ", comma: "ក្បៀស", dash: "Dash", period: "ចុច", forwardSlash: "Forward Slash", graveAccent: "Grave Accent",
+ openBracket: "តង្កៀប​បើក", backSlash: "Backslash", closeBracket: "តង្កៀប​បិទ", singleQuote: "បន្តក់​មួយ"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/ko.js b/plugins/a11yhelp/dialogs/lang/ko.js
new file mode 100755
index 0000000..b4a376a
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/ko.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ko",{title:"접근성 설명",contents:"도움말. 이 창을 닫으시려면 ESC 를 누르세요.",legend:[{name:"일반",items:[{name:"편집기 툴바",legend:"툴바를 탐색하시려면 ${toolbarFocus} 를 투르세요. 이전/다음 툴바 그룹으로 이동하시려면 TAB 키 또는 SHIFT+TAB 키를 누르세요. 이전/다음 툴바 버튼으로 이동하시려면 오른쪽 화살표 키 또는 왼쪽 화살표 키를 누르세요. 툴바 버튼을 활성화 하려면 SPACE 키 또는 ENTER 키를 누르세요."},{name:"편집기 다이얼로그",legend:"TAB 키를 누르면 다음 대화상자로 이동하고, SHIFT+TAB 키를 누르면 이전 대화상자로 이동합니다. 대화상자를 제출하려면 ENTER 키를 누르고, ESC 키를 누르면 대화상자를 취소합니다. 대화상자에 탭이 여러개 있을 때, ALT+F10 키 또는 TAB 키를 누르면 순서에 따라 탭 목록에 도달할 수 있습니다. 탭 목록에 초점이 맞을 때, 오른쪽과 왼쪽 화살표 키를 이용하면 각각 다음과 이전 탭으로 이동할 수 있습니다."},
+{name:"편집기 환경 메뉴",legend:"${contextMenu} 또는 어플리케이션 키를 누르면 환경-메뉴를 열 수 있습니다. 환경-메뉴에서 TAB 키 또는 아래 화살표 키를 누르면 다음 메뉴 옵션으로 이동할 수 있습니다. 이전 옵션으로 이동은 SHIFT+TAB 키 또는 위 화살표 키를 눌러서 할 수 있습니다. 스페이스 키 또는 ENTER 키를 눌러서 메뉴 옵션을 선택할 수 있습니다. 스페이스 키 또는 ENTER 키 또는 오른쪽 화살표 키를 눌러서 하위 메뉴를 열 수 있습니다. 부모 메뉴 항목으로 돌아가려면 ESC 키 또는 왼쪽 화살표 키를 누릅니다. ESC 키를 눌러서 환경-메뉴를 닫습니다."},{name:"편집기 목록 박스",legend:"리스트-박스 내에서, 목록의 다음 항목으로 이동하려면 TAB 키 또는 아래쪽 화살표 키를 누릅니다. 목록의 이전 항목으로 이동하려면 SHIFT+TAB 키 또는 위쪽 화살표 키를 누릅니다. 스페이스 키 또는 ENTER 키를 누르면 목록의 해당 옵션을 선택합니다. ESC 키를 눌러서 리스트-박스를 닫을 수 있습니다."},
+{name:"편집기 요소 경로 막대",legend:"${elementsPathFocus}를 눌러서 요소 경로 막대를 탐색할 수 있습니다. 다음 요소로 이동하려면 TAB 키 또는 오른쪽 화살표 키를 누릅니다. SHIFT+TAB 키 또는 왼쪽 화살표 키를 누르면 이전 버튼으로 이동할 수 있습니다. 스페이스 키나 ENTER 키를 누르면 편집기의 해당 항목을 선택합니다."}]},{name:"명령",items:[{name:" 명령 실행 취소",legend:"${undo} 누르시오"},{name:" 명령 다시 실행",legend:"${redo} 누르시오"},{name:" 굵게 명령",legend:"${bold} 누르시오"},{name:" 기울임 꼴 명령",legend:"${italic} 누르시오"},{name:" 밑줄 명령",legend:"${underline} 누르시오"},{name:" 링크 명령",legend:"${link} 누르시오"},{name:" 툴바 줄이기 명령",legend:"${toolbarCollapse} 누르시오"},
+{name:" 이전 포커스 공간 접근 명령",legend:"탈자 기호(^) 이전에 ${accessPreviousSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다."},{name:"다음 포커스 공간 접근 명령",legend:"탈자 기호(^) 다음에 ${accessNextSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다. "},{name:" 접근성 도움말",legend:"${a11yHelp} 누르시오"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],
+tab:"탭 키",pause:"일시정지 키",capslock:"캡스 록 키",escape:"이스케이프 키",pageUp:"페이지 업 키",pageDown:"페이지 다운 키",leftArrow:"왼쪽 화살표 키",upArrow:"위쪽 화살표 키",rightArrow:"오른쪽 화살표 키",downArrow:"아래쪽 화살표 키",insert:"인서트 키",leftWindowKey:"왼쪽 윈도우 키",rightWindowKey:"오른쪽 윈도우 키",selectKey:"셀렉트 키",numpad0:"숫자 패드 0 키",numpad1:"숫자 패드 1 키",numpad2:"숫자 패드 2 키",numpad3:"숫자 패드 3 키",numpad4:"숫자 패드 4 키",numpad5:"숫자 패드 5 키",numpad6:"숫자 패드 6 키",numpad7:"숫자 패드 7 키",numpad8:"숫자 패드 8 키",numpad9:"숫자 패드 9 키",multiply:"곱셈(*) 키",add:"덧셈(+) 키",subtract:"뺄셈(-) 키",
+decimalPoint:"온점(.) 키",divide:"나눗셈(/) 키",f1:"F1 키",f2:"F2 키",f3:"F3 키",f4:"F4 키",f5:"F5 키",f6:"F6 키",f7:"F7 키",f8:"F8 키",f9:"F9 키",f10:"F10 키",f11:"F11 키",f12:"F12 키",numLock:"Num Lock 키",scrollLock:"Scroll Lock 키",semiColon:"세미콜론(;) 키",equalSign:"등호(\x3d) 키",comma:"쉼표(,) 키",dash:"대시(-) 키",period:"온점(.) 키",forwardSlash:"슬래시(/) 키",graveAccent:"억음 악센트(`) 키",openBracket:"브라켓 열기([) 키",backSlash:"역슬래시(\\\\) 키",closeBracket:"브라켓 닫기(]) 키",singleQuote:"외 따옴표(') 키"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/ku.js b/plugins/a11yhelp/dialogs/lang/ku.js
new file mode 100755
index 0000000..6bb3d0a
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/ku.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "ku", {
+ title: "ڕێنمای لەبەردەستدابوون", contents: "پێکهاتەی یارمەتی. کلیك ESC بۆ داخستنی ئەم دیالۆگه.", legend: [{
+ name: "گشتی", items: [{ name: "تووڵامرازی دەستكاریكەر", legend: "کلیك ${toolbarFocus} بۆ ڕابەری تووڵامراز. بۆ گواستنەوەی پێشوو داهاتووی گرووپی تووڵامرازی داگرتنی کلیلی TAB لەگەڵ‌ SHIFT+TAB. بۆ گواستنەوەی پێشوو داهاتووی دووگمەی تووڵامرازی لەڕێی کلیلی تیری دەستی ڕاست یان کلیلی تیری دەستی چەپ. کلیکی کلیلی SPACE یان ENTER بۆ چالاککردنی دووگمەی تووڵامراز." }, {
+ name: "دیالۆگی دەستكاریكەر",
+ legend: "لەناوەوەی دیالۆگ, کلیکی کلیلی TAB بۆ ڕابەری دیالۆگێکی تر, داگرتنی کلیلی SHIFT + TAB بۆ گواستنەوەی بۆ دیالۆگی پێشووتر, کلیكی کلیلی ENTER بۆ ڕازیکردنی دیالۆگەکە, کلیكی کلیلی ESC بۆ هەڵوەشاندنەوەی دیالۆگەکە. بۆ دیالۆگی بازدەری (تابی) زیاتر, کلیكی کلیلی ALT + F10 بۆ ڕابه‌ری لیستی بازده‌ره‌کان، یان کلیكی کلیلی TAB. بۆچوونه‌ بازده‌ری تابی پێشوو یان دوواتر کلیلی تیری دەستی ڕاست یان چەپ بکە."
+ }, { name: "پێڕستی سەرنووسەر", legend: "کلیك ${contextMenu} یان دوگمەی لیسته‌(Menu) بۆ کردنەوەی لیستەی دەق. بۆ چوونە هەڵبژاردەیەکی تر له‌ لیسته‌ کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوارەوه‌ بۆ چوون بۆ هەڵبژاردەی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو له‌ سەرەوە. داگرتنی کلیلی SPACE یان ENTER بۆ هەڵبژاردنی هەڵبژاردەی لیسته‌. بۆ کردنەوەی لقی ژێر لیسته‌ لەهەڵبژاردەی لیستە کلیکی کلیلی SPACE یان ENTER یان کلیلی تیری دەستی ڕاست. بۆ گەڕانەوه بۆ سەرەوەی لیسته‌ کلیکی کلیلی ESC یان کلیلی تیری دەستی چەپ. بۆ داخستنی لیستە کلیكی کلیلی ESC بکە." },
+ { name: "لیستی سنووقی سەرنووسەر", legend: "لەناو سنوقی لیست, چۆن بۆ هەڵنبژاردەی لیستێکی تر کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوار. چوون بۆ هەڵبژاردەی لیستی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو لەسەرەوه‌. کلیکی کلیلی SPACE یان ENTER بۆ دیاریکردنی ‌هەڵبژاردەی لیست. کلیکی کلیلی ESC بۆ داخستنی سنوقی لیست." }, { name: "تووڵامرازی توخم", legend: "کلیك ${elementsPathFocus} بۆ ڕابەری تووڵامرازی توخمەکان. چوون بۆ دوگمەی توخمێکی تر کلیکی کلیلی TAB یان کلیلی تیری دەستی ڕاست. چوون بۆ دوگمەی توخمی پێشوو کلیلی SHIFT+TAB یان کلیکی کلیلی تیری دەستی چەپ. داگرتنی کلیلی SPACE یان ENTER بۆ دیاریکردنی توخمەکه‌ لەسەرنووسه." }]
+ },
+ {
+ name: "فەرمانەکان", items: [{ name: "پووچکردنەوەی فەرمان", legend: "کلیك ${undo}" }, { name: "هەڵگەڕانەوەی فەرمان", legend: "کلیك ${redo}" }, { name: "فەرمانی دەقی قەڵەو", legend: "کلیك ${bold}" }, { name: "فەرمانی دەقی لار", legend: "کلیك ${italic}" }, { name: "فەرمانی ژێرهێڵ", legend: "کلیك ${underline}" }, { name: "فەرمانی به‌ستەر", legend: "کلیك ${link}" }, { name: "شاردەنەوەی تووڵامراز", legend: "کلیك ${toolbarCollapse}" }, { name: "چوونەناو سەرنجدانی پێشوی فەرمانی بۆشایی", legend: "کلیک ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: "چوونەناو سەرنجدانی داهاتووی فەرمانی بۆشایی", legend: "کلیک ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: "دەستپێگەیشتنی یارمەتی", legend: "کلیك ${a11yHelp}" }, { name: "لکاندنی وەك دەقی ڕوون", legend: "کلیکی ${pastetext}", legendEdge: "کلیکی ${pastetext}، شوێنکەوتکراوە بە ${paste}" }]
+ }], tab: "تاب", pause: "پشوو", capslock: "قفڵدانی پیتی گەورە", escape: "چوونە دەرەوە", pageUp: "پەڕە بەرەوسەر",
+ pageDown: "پەڕە بەرەوخوار", leftArrow: "تیری دەستی چەپ", upArrow: "تیری بەرەوسەر", rightArrow: "تیری دەستی ڕاست", downArrow: "تیری بەرەوخوار", insert: "خستنە ناو", leftWindowKey: "پەنجەرەی چەپ", rightWindowKey: "پەنجەرەی ڕاست", selectKey: "هەڵبژێرە", numpad0: "Numpad 0", numpad1: "1", numpad2: "2", numpad3: "3", numpad4: "4", numpad5: "5", numpad6: "6", numpad7: "7", numpad8: "8", numpad9: "9", multiply: "*", add: "+", subtract: "-", decimalPoint: ".", divide: "/", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10",
+ f11: "F11", f12: "F12", numLock: "قفڵدانی ژمارە", scrollLock: "قفڵدانی هێڵی هاتووچۆپێکردن", semiColon: ";", equalSign: "\x3d", comma: ",", dash: "-", period: ".", forwardSlash: "/", graveAccent: "`", openBracket: "[", backSlash: "\\\\", closeBracket: "}", singleQuote: "'"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/lt.js b/plugins/a11yhelp/dialogs/lang/lt.js
new file mode 100755
index 0000000..b92bb16
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/lt.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","lt",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Bendros savybės",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert",leftWindowKey:"Left Windows key",rightWindowKey:"Right Windows key",selectKey:"Select key",numpad0:"Numpad 0",numpad1:"Numpad 1",
+numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Multiply",add:"Add",subtract:"Subtract",decimalPoint:"Decimal Point",divide:"Divide",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semicolon",equalSign:"Equal Sign",comma:"Comma",dash:"Dash",period:"Period",forwardSlash:"Forward Slash",
+graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/lv.js b/plugins/a11yhelp/dialogs/lang/lv.js
new file mode 100755
index 0000000..4b26339
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/lv.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "lv", {
+ title: "Pieejamības instrukcija", contents: "Palīdzības saturs. Lai aizvērtu ciet šo dialogu nospiediet ESC.", legend: [{
+ name: "Galvenais", items: [{ name: "Redaktora rīkjosla", legend: "Nospiediet ${toolbarFocus} lai pārvietotos uz rīkjoslu. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas grupu izmantojiet pogu TAB un SHIFT+TAB. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas pogu izmantojiet Kreiso vai Labo bultiņu. Nospiediet Atstarpi vai ENTER lai aktivizētu rīkjosla pogu." },
+ { name: "Redaktora dialoga logs", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." }, { name: "Redaktora satura izvēle", legend: "Nospiediet ${contextMenu} vai APPLICATION KEY lai atvērtu satura izvēlni. Lai pārvietotos uz nākošo izvēlnes opciju izmantojiet pogu TAB vai pogu Bultiņu uz leju. Lai pārvietotos uz iepriekšējo opciju izmantojiet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvelētos izvēlnes opciju. Atveriet tekošajā opcija apakšizvēlni ar SAPCE vai ENTER ka ari to var izdarīt ar Labo bultiņu. Lai atgrieztos atpakaļ uz sakuma izvēlni nospiediet ESC vai Kreiso bultiņu. Lai aizvērtu ciet izvēlnes saturu nospiediet ESC." },
+ { name: "Redaktora saraksta lauks", legend: "Saraksta laukā, lai pārvietotos uz nākošo saraksta elementu nospiediet TAB vai pogu Bultiņa uz leju. Lai pārvietotos uz iepriekšējo saraksta elementu nospiediet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvēlētos saraksta opcijas. Nospiediet ESC lai aizvērtu saraksta lauku." }, { name: "Redaktora elementa ceļa josla", legend: "Nospiediet ${elementsPathFocus} lai pārvietotos uz elementa ceļa joslu. Lai pārvietotos uz nākošo elementa pogu izmantojiet TAB vai Labo bultiņu. Lai pārvietotos uz iepriekšējo elementa pogu izmantojiet SHIFT+TAB vai Kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvēlētos elementu redaktorā." }]
+ },
+ {
+ name: "Komandas", items: [{ name: "Komanda atcelt darbību", legend: "Nospiediet ${undo}" }, { name: "Komanda atkārtot darbību", legend: "Nospiediet ${redo}" }, { name: "Treknraksta komanda", legend: "Nospiediet ${bold}" }, { name: "Kursīva komanda", legend: "Nospiediet ${italic}" }, { name: "Apakšsvītras komanda ", legend: "Nospiediet ${underline}" }, { name: "Hipersaites komanda", legend: "Nospiediet ${link}" }, { name: "Rīkjoslas aizvēršanas komanda", legend: "Nospiediet ${toolbarCollapse}" }, {
+ name: "Piekļūt iepriekšējai fokusa vietas komandai",
+ legend: "Nospiediet ${accessPreviousSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pirms kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām."
+ }, { name: "Piekļūt nākošā fokusa apgabala komandai", legend: "Nospiediet ${accessNextSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pēc kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām." },
+ { name: "Pieejamības palīdzība", legend: "Nospiediet ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash",
+ graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/mk.js b/plugins/a11yhelp/dialogs/lang/mk.js
new file mode 100755
index 0000000..86e0e7c
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/mk.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","mk",{title:"Инструкции за пристапност",contents:"Содржина на делот за помош. За да го затворите овој дијалог притиснете ESC.",legend:[{name:"Општо",items:[{name:"Мени за уредувачот",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Дијалот за едиторот",
+legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},{name:"Контекст-мени на уредувачот",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},
+{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},
+{name:"Наредби",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Accessibility Help",legend:"Press ${a11yHelp}"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Пауза",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Up",
+leftArrow:"Стрелка лево",upArrow:"Стрелка горе",rightArrow:"Стрелка десно",downArrow:"Стрелка доле",insert:"Insert",leftWindowKey:"Лево Windows копче",rightWindowKey:"Десно Windows копче",selectKey:"Select копче",numpad0:"Нум. таст. 0",numpad1:"Нум. таст. 1",numpad2:"Нум. таст. 2",numpad3:"Нум. таст. 3",numpad4:"Нум. таст. 4",numpad5:"Нум. таст. 5",numpad6:"Нум. таст. 6",numpad7:"Нум. таст. 7",numpad8:"Нум. таст. 8",numpad9:"Нум. таст. 9",multiply:"Multiply",add:"Add",subtract:"Subtract",decimalPoint:"Decimal Point",
+divide:"Divide",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semicolon",equalSign:"Equal Sign",comma:"Comma",dash:"Dash",period:"Period",forwardSlash:"Forward Slash",graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/mn.js b/plugins/a11yhelp/dialogs/lang/mn.js
new file mode 100755
index 0000000..16ed466
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/mn.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "mn", {
+ title: "Accessibility Instructions", contents: "Help Contents. To close this dialog press ESC.", legend: [{
+ name: "Ерөнхий", items: [{ name: "Editor Toolbar", legend: "Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button." }, { name: "Editor Dialog", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Editor Context Menu", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "Editor List Box", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "Commands", items: [{ name: " Undo command", legend: "Press ${undo}" }, { name: " Redo command", legend: "Press ${redo}" }, { name: " Bold command", legend: "Press ${bold}" }, { name: " Italic command", legend: "Press ${italic}" }, {
+ name: " Underline command",
+ legend: "Press ${underline}"
+ }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash",
+ graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/nb.js b/plugins/a11yhelp/dialogs/lang/nb.js
new file mode 100755
index 0000000..c79e4b7
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/nb.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","nb",{title:"Instruksjoner for tilgjengelighet",contents:"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.",legend:[{name:"Generelt",items:[{name:"Verktøylinje for editor",legend:"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT+TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen."},{name:"Dialog for editor",
+legend:"Mens du er i en dialog, trykk TAB for å navigere til neste dialogelement, trykk SHIFT+TAB for å flytte til forrige dialogelement, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. Når en dialog har flere faner, kan fanelisten nås med enten ALT+F10 eller med TAB. Når fanelisten er fokusert, går man til neste og forrige fane med henholdsvis HØYRE og VENSTRE PILTAST."},{name:"Kontekstmeny for editor",legend:"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC."},
+{name:"Listeboks for editor",legend:"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen."},{name:"Verktøylinje for elementsti",legend:"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren."}]},
+{name:"Hurtigtaster",items:[{name:"Angre",legend:"Trykk ${undo}"},{name:"Gjør om",legend:"Trykk ${redo}"},{name:"Fet tekst",legend:"Trykk ${bold}"},{name:"Kursiv tekst",legend:"Trykk ${italic}"},{name:"Understreking",legend:"Trykk ${underline}"},{name:"Lenke",legend:"Trykk ${link}"},{name:"Skjul verktøylinje",legend:"Trykk ${toolbarCollapse}"},{name:"Gå til forrige fokusområde",legend:"Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."},
+{name:"Gå til neste fokusområde",legend:"Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."},{name:"Hjelp for tilgjengelighet",legend:"Trykk ${a11yHelp}"},{name:"Lim inn som ren tekst",legend:"Trykk ${pastetext}",legendEdge:"Trykk ${pastetext}, etterfulgt av ${past}"}]}],tab:"Tabulator",pause:"Pause",capslock:"Caps Lock",
+escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"Venstre piltast",upArrow:"Opp-piltast",rightArrow:"Høyre piltast",downArrow:"Ned-piltast",insert:"Insert",leftWindowKey:"Venstre Windows-tast",rightWindowKey:"Høyre Windows-tast",selectKey:"Velg nøkkel",numpad0:"Numerisk tastatur 0",numpad1:"Numerisk tastatur 1",numpad2:"Numerisk tastatur 2",numpad3:"Numerisk tastatur 3",numpad4:"Numerisk tastatur 4",numpad5:"Numerisk tastatur 5",numpad6:"Numerisk tastatur 6",numpad7:"Numerisk tastatur 7",
+numpad8:"Numerisk tastatur 8",numpad9:"Numerisk tastatur 9",multiply:"Multipliser",add:"Legg til",subtract:"Trekk fra",decimalPoint:"Desimaltegn",divide:"Divider",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semikolon",equalSign:"Likhetstegn",comma:"Komma",dash:"Bindestrek",period:"Punktum",forwardSlash:"Forover skråstrek",graveAccent:"Grav aksent",openBracket:"Åpne parentes",backSlash:"Bakover skråstrek",
+closeBracket:"Lukk parentes",singleQuote:"Enkelt sitattegn"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/nl.js b/plugins/a11yhelp/dialogs/lang/nl.js
new file mode 100755
index 0000000..4ee71e1
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/nl.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "nl", {
+ title: "Toegankelijkheidsinstructies", contents: "Help-inhoud. Druk op ESC om dit dialoog te sluiten.", legend: [{
+ name: "Algemeen", items: [{ name: "Werkbalk tekstverwerker", legend: "Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren." },
+ { name: "Dialoog tekstverwerker", legend: "In een dialoogvenster, druk op TAB om te navigeren naar het volgende veld. Druk op SHIFT+TAB om naar het vorige veld te navigeren. Druk op ENTER om het dialoogvenster te verzenden. Druk op ESC om het dialoogvenster te sluiten. Bij dialoogvensters met meerdere tabbladen kan de tabset bereikt worden met ALT+F10 of met TAB als onderdeel van de tabvolgorde in het dialoogvenster. Als de tabset focus heeft, kun je schakalen naar het volgende en vorige tabblad met respectievelijk PIJL RECHTS en PIJL LINKS." },
+ { name: "Contextmenu tekstverwerker", legend: "Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC." }, { name: "Keuzelijst tekstverwerker", legend: "In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten." },
+ { name: "Elementenpad werkbalk tekstverwerker", legend: "Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker." }]
+ }, {
+ name: "Opdrachten", items: [{ name: "Ongedaan maken opdracht", legend: "Druk op ${undo}" }, { name: "Opnieuw uitvoeren opdracht", legend: "Druk op ${redo}" }, {
+ name: "Vetgedrukt opdracht",
+ legend: "Druk op ${bold}"
+ }, { name: "Cursief opdracht", legend: "Druk op ${italic}" }, { name: "Onderstrepen opdracht", legend: "Druk op ${underline}" }, { name: "Link opdracht", legend: "Druk op ${link}" }, { name: "Werkbalk inklappen opdracht", legend: "Druk op ${toolbarCollapse}" }, { name: "Ga naar vorige focus spatie commando", legend: "Druk ${accessPreviousSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie voor de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken." },
+ { name: "Ga naar volgende focus spatie commando", legend: "Druk ${accessNextSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie na de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken." }, { name: "Toegankelijkheidshulp", legend: "Druk op ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock",
+ escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Pijl naar links", upArrow: "Pijl omhoog", rightArrow: "Pijl naar rechts", downArrow: "Pijl naar beneden", insert: "Invoegen", leftWindowKey: "Linker Windows-toets", rightWindowKey: "Rechter Windows-toets", selectKey: "Selecteer toets", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Vermenigvuldigen",
+ add: "Toevoegen", subtract: "Aftrekken", decimalPoint: "Decimaalteken", divide: "Delen", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Puntkomma", equalSign: "Is gelijk-teken", comma: "Komma", dash: "Koppelteken", period: "Punt", forwardSlash: "Slash", graveAccent: "Accent grave", openBracket: "Vierkant haakje openen", backSlash: "Backslash", closeBracket: "Vierkant haakje sluiten", singleQuote: "Apostrof"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/no.js b/plugins/a11yhelp/dialogs/lang/no.js
new file mode 100755
index 0000000..4dcc792
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/no.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "no", {
+ title: "Instruksjoner for tilgjengelighet", contents: "Innhold for hjelp. Trykk ESC for å lukke denne dialogen.", legend: [{
+ name: "Generelt", items: [{ name: "Verktøylinje for editor", legend: "Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT+TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen." }, {
+ name: "Dialog for editor",
+ legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."
+ }, { name: "Kontekstmeny for editor", legend: "Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC." },
+ { name: "Listeboks for editor", legend: "I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen." }, { name: "Verktøylinje for elementsti", legend: "Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren." }]
+ },
+ {
+ name: "Kommandoer", items: [{ name: "Angre", legend: "Trykk ${undo}" }, { name: "Gjør om", legend: "Trykk ${redo}" }, { name: "Fet tekst", legend: "Trykk ${bold}" }, { name: "Kursiv tekst", legend: "Trykk ${italic}" }, { name: "Understreking", legend: "Trykk ${underline}" }, { name: "Link", legend: "Trykk ${link}" }, { name: "Skjul verktøylinje", legend: "Trykk ${toolbarCollapse}" }, { name: "Gå til forrige fokusområde", legend: "Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet." },
+ { name: "Gå til neste fokusområde", legend: "Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet." }, { name: "Hjelp for tilgjengelighet", legend: "Trykk ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock",
+ escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point",
+ divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash", graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/oc.js b/plugins/a11yhelp/dialogs/lang/oc.js
new file mode 100755
index 0000000..66c9436
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/oc.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "oc", {
+ title: "Instruccions d'accessibilitat", contents: "Contengut de l'ajuda. Per tampar aquesta fenèstra, quichatz sus la tòca Escap.", legend: [{
+ name: "General", items: [{ name: "Barra d'aisinas de l'editor", legend: "Quichar sus ${toolbarFocus} per accedir a la barra d'aisinas. Se desplaçar cap al groupe seguent o precedent de la barra d'aisinas amb las tòcas Tab e Maj+Tab. Se desplaçar cap al boton seguent o precedent de la barra d'aisinas amb las tòcas Sageta dreita e Sageta esquèrra. Quichar sus la barra d'espaci o la tòca Entrada per activer lo boton de barra d'aisinas." },
+ { name: "Fenèstra de l'editor", legend: "Dins una bóstia de dialòg, quichar sus Tab per passar a l'element seguent, quichar sus Maj+Tab per passar a l'element precedent, quichar sus Entrada per validar, quichar sus Escap per anullar. Quand una bóstia de dialòg possedís des onglets, la lista pòt èsser atenta amb Alt+F10 o amb Tab. Dins la lista dels onglets, se desplaçar cap al seguent e lo precedent amb las tòcas Sageta dreita e Sageta esquèrra respectivament." }, { name: "Menú contextual de l'editor", legend: "Quichar sus ${contextMenu} o sus la tòca Menú per dobrir lo menú contextual. Se desplaçar ensuite cap a l'opcion seguenta del menú amb las tòcas Tab o Sageta bas. Se desplaçar cap a l'opcion precedenta amb las tòcas Maj+Tab o Sageta naut. Quichar sus la barra d'espaci o la tòca Entrada per seleccionar l'opcion del menu. Quichar sus la barra d'espaci, la tòca Entrada o Sageta dreita per dobrir lo sosmenú de l'opcion seleccionada. Tornar a l'element de menú parent amb la tòca Escap o Sageta esquèrra. Tampar lo menú contextual amb Escap." },
+ { name: "Zòna de lista de l'editor", legend: "Dins una lista en menú desenrotlant, se desplaçar cap a l'element seguent de la lista amb las tòcas Tab o Sageta bas. Se desplaçar cap a l'element precedent de la lista amb las tòcas Maj+Tab o Sageta naut. Quichar sus la barra d'espaci o sus Entrada per seleccionar l'opcion dins la lista. Quichar sus Escap per tampar lo menú desenrotlant." }, { name: "Barra del camin d'elements de l'editor", legend: "Quichar sus ${elementsPathFocus} per naviguer cap a la barra del fial d'Ariana dels elements. Se desplaçar cap al boton de l'element seguent amb las tòcas Tab o Sageta dreita. Se desplaçar cap al boton precedent amb las tòcas Maj+Tab o Sageta esquèrra. Quichar sus la barra d'espaci o sus Entrada per seleccionar l'element dins l'editor." }]
+ },
+ {
+ name: "Comandas", items: [{ name: "Anullar la comanda", legend: "Quichar sus ${undo}" }, { name: "Comanda restablir", legend: "Quichar sus ${redo}" }, { name: " Comanda gras", legend: "Quichar sus ${bold}" }, { name: " Comanda italica", legend: "Quichar sus ${italic}" }, { name: " Comanda solinhat", legend: "Quichar sus ${underline}" }, { name: " Comanda ligam", legend: "Quichar sus ${link}" }, { name: "Comanda enrotlar la barra d'aisinas", legend: "Quichar sus ${toolbarCollapse}" }, {
+ name: "Comanda d'accès a l'element seleccionable precedent",
+ legend: "Quichar sus ${accessNextSpace} per accedir a l'element seleccionable inategnible lo mai pròche abans lo cursor, per exemple : doas linhas orizontalas adjacentas. Repetir la combinason de tòcas per aténher los elements seleccionables precedents."
+ }, { name: "Comanda d'accès a l'element seleccionable seguent", legend: "Quichar sus ${accessNextSpace} per accedir a l'element seleccionable inatenhible lo mai pròche aprèp lo cursor, per exemple : doas linhas orizontalas adjacentas. Repetir la combinason de tòcas per aténher los elements seleccionables seguents." },
+ { name: " Ajuda sus l'accessibilitat", legend: "Quichar sus ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tabulacion", pause: "Pausa", capslock: "Verr. Maj.", escape: "Escap", pageUp: "Pagina superiora", pageDown: "Pagina seguenta", leftArrow: "Sageta esquèrra", upArrow: "Sageta naut", rightArrow: "Sageta dreita", downArrow: "Sageta bassa", insert: "Inser", leftWindowKey: "Tòca Windows esquèrra", rightWindowKey: "Tòca Windows dreita", selectKey: "Tòca Seleccionar",
+ numpad0: "0 del pavat numeric", numpad1: "1 del pavat numeric", numpad2: "2 del pavat numeric", numpad3: "3 del pavat numeric", numpad4: "4 del pavat numeric", numpad5: "5 del pavat numeric", numpad6: "6 del pavat numeric", numpad7: "7 del pavat numeric", numpad8: "Pavat numeric 8", numpad9: "9 del pavat numeric", multiply: "Multiplicar", add: "Plus", subtract: "Mens", decimalPoint: "Punt decimal", divide: "Devesir", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Verr. Num.",
+ scrollLock: "Arrèst desfil.", semiColon: "Punt-virgula", equalSign: "Signe egal", comma: "Virgula", dash: "Jonhent", period: "Punt", forwardSlash: "Barra oblica", graveAccent: "Accent grèu", openBracket: "Parentèsi dobèrta", backSlash: "Barra oblica invèrsa", closeBracket: "Parentèsi tampanta", singleQuote: "Apostròfa"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/pl.js b/plugins/a11yhelp/dialogs/lang/pl.js
new file mode 100755
index 0000000..894e72e
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/pl.js
@@ -0,0 +1,23 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "pl", {
+ title: "Instrukcje dotyczące dostępności", contents: "Zawartość pomocy. Wciśnij ESC, aby zamknąć to okno.", legend: [{
+ name: "Informacje ogólne", items: [{ name: "Pasek narzędzi edytora", legend: "Naciśnij ${toolbarFocus}, by przejść do paska narzędzi. Przejdź do następnej i poprzedniej grupy narzędzi używając TAB oraz SHIFT+TAB. Przejdź do następnego i poprzedniego przycisku paska narzędzi za pomocą STRZAŁKI W PRAWO lub STRZAŁKI W LEWO. Naciśnij SPACJĘ lub ENTER by aktywować przycisk paska narzędzi." },
+ { name: "Okno dialogowe edytora", legend: "Wewnątrz okna dialogowego naciśnij TAB, by przejść do kolejnego elementu tego okna lub SHIFT+TAB, by przejść do poprzedniego elementu okna. Naciśnij ENTER w celu zatwierdzenia opcji okna dialogowego lub ESC w celu anulowania zmian. Jeśli okno dialogowe ma kilka zakładek, do listy zakładek można przejść za pomocą ALT+F10 lub TAB. Gdy lista zakładek jest aktywna, możesz przejść do kolejnej i poprzedniej zakładki za pomocą STRZAŁKI W PRAWO i STRZAŁKI W LEWO." },
+ { name: "Menu kontekstowe edytora", legend: "Wciśnij ${contextMenu} lub PRZYCISK APLIKACJI aby otworzyć menu kontekstowe. Przejdź do następnej pozycji menu wciskając TAB lub STRZAŁKĘ W DÓŁ. Przejdź do poprzedniej pozycji menu wciskając SHIFT + TAB lub STRZAŁKĘ W GÓRĘ. Wciśnij SPACJĘ lub ENTER aby wygrać pozycję menu. Otwórz pod-menu obecnej pozycji wciskając SPACJĘ lub ENTER lub STRZAŁKĘ W PRAWO. Wróć do pozycji nadrzędnego menu wciskając ESC lub STRZAŁKĘ W LEWO. Zamknij menu wciskając ESC." }, {
+ name: "Lista w edytorze",
+ legend: "Wewnątrz listy przejdź do kolejnego elementu listy za pomocą przycisku TAB lub STRZAŁKI W DÓŁ. Przejdź do poprzedniego elementu listy za pomocą SHIFT+TAB lub STRZAŁKI W GÓRĘ. Naciśnij SPACJĘ lub ENTER w celu wybrania opcji z listy. Naciśnij ESC, by zamknąć listę."
+ }, { name: "Pasek ścieżki elementów edytora", legend: "Naciśnij ${elementsPathFocus} w celu przejścia do paska ścieżki elementów edytora. W celu przejścia do kolejnego elementu naciśnij klawisz TAB lub STRZAŁKI W PRAWO. W celu przejścia do poprzedniego elementu naciśnij klawisze SHIFT+TAB lub STRZAŁKI W LEWO. By wybrać element w edytorze, użyj klawisza SPACJI lub ENTER." }]
+ },
+ {
+ name: "Polecenia", items: [{ name: "Polecenie Cofnij", legend: "Naciśnij ${undo}" }, { name: "Polecenie Ponów", legend: "Naciśnij ${redo}" }, { name: "Polecenie Pogrubienie", legend: "Naciśnij ${bold}" }, { name: "Polecenie Kursywa", legend: "Naciśnij ${italic}" }, { name: "Polecenie Podkreślenie", legend: "Naciśnij ${underline}" }, { name: "Polecenie Wstaw/ edytuj odnośnik", legend: "Naciśnij ${link}" }, { name: "Polecenie schowaj pasek narzędzi", legend: "Naciśnij ${toolbarCollapse}" }, {
+ name: "Przejdź do poprzedniego miejsca, w którym można ustawić focus",
+ legend: "Naciśnij ${accessPreviousSpace}, aby przejść do najbliższego niedostępnego miejsca przed kursorem, w którym można ustawić focus. Przykład: dwa przylegające elementy HR. Powtórz ten skrót klawiaturowy, by dotrzeć do kolejnych takich miejsc."
+ }, { name: "Przejdź do następnego miejsca, w którym można ustawić focus", legend: "Naciśnij ${accessNextSpace}, aby przejść do najbliższego niedostępnego miejsca po kursorze, w którym można ustawić focus. Przykład: dwa przylegające elementy HR. Powtórz ten skrót klawiaturowy, by dotrzeć do kolejnych takich miejsc." },
+ { name: "Pomoc dotycząca dostępności", legend: "Naciśnij ${a11yHelp}" }, { name: "Wklej jako tekst", legend: "Naciśnij ${pastetext}", legendEdge: "Naciśnij ${pastetext}, a następnie ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Strzałka w lewo", upArrow: "Strzałka w górę", rightArrow: "Strzałka w prawo", downArrow: "Strzałka w dół", insert: "Insert", leftWindowKey: "Lewy klawisz Windows", rightWindowKey: "Prawy klawisz Windows", selectKey: "Klawisz wyboru",
+ numpad0: "Klawisz 0 na klawiaturze numerycznej", numpad1: "Klawisz 1 na klawiaturze numerycznej", numpad2: "Klawisz 2 na klawiaturze numerycznej", numpad3: "Klawisz 3 na klawiaturze numerycznej", numpad4: "Klawisz 4 na klawiaturze numerycznej", numpad5: "Klawisz 5 na klawiaturze numerycznej", numpad6: "Klawisz 6 na klawiaturze numerycznej", numpad7: "Klawisz 7 na klawiaturze numerycznej", numpad8: "Klawisz 8 na klawiaturze numerycznej", numpad9: "Klawisz 9 na klawiaturze numerycznej", multiply: "Przemnóż", add: "Plus",
+ subtract: "Minus", decimalPoint: "Separator dziesiętny", divide: "Podziel", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Średnik", equalSign: "Znak równości", comma: "Przecinek", dash: "Pauza", period: "Kropka", forwardSlash: "Ukośnik prawy", graveAccent: "Akcent słaby", openBracket: "Nawias kwadratowy otwierający", backSlash: "Ukośnik lewy", closeBracket: "Nawias kwadratowy zamykający", singleQuote: "Apostrof"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/pt-br.js b/plugins/a11yhelp/dialogs/lang/pt-br.js
new file mode 100755
index 0000000..a855e45
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/pt-br.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "pt-br", {
+ title: "Instruções de Acessibilidade", contents: "Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.", legend: [{
+ name: "Geral", items: [{ name: "Barra de Ferramentas do Editor", legend: "Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT+TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas." },
+ { name: "Diálogo do Editor", legend: "Dentro de um diálogo, pressione TAB para navegar para o próximo elemento. Pressione SHIFT+TAB para mover para o elemento anterior. Pressione ENTER ara enviar o diálogo. pressione ESC para cancelar o diálogo. Quando um diálogo tem múltiplas abas, a lista de abas pode ser acessada com ALT+F10 ou TAB, como parte da ordem de tabulação do diálogo. Com a lista de abas em foco, mova para a próxima aba e para a aba anterior com a SETA DIREITA ou SETA ESQUERDA, respectivamente." },
+ { name: "Menu de Contexto do Editor", legend: "Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC." }, { name: "Caixa de Lista do Editor", legend: "Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista." },
+ { name: "Barra de Caminho do Elementos do Editor", legend: "Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor." }]
+ }, {
+ name: "Comandos", items: [{ name: " Comando Desfazer", legend: "Pressione ${undo}" }, { name: " Comando Refazer", legend: "Pressione ${redo}" }, { name: " Comando Negrito", legend: "Pressione ${bold}" },
+ { name: " Comando Itálico", legend: "Pressione ${italic}" }, { name: " Comando Sublinhado", legend: "Pressione ${underline}" }, { name: " Comando Link", legend: "Pressione ${link}" }, { name: " Comando Fechar Barra de Ferramentas", legend: "Pressione ${toolbarCollapse}" }, { name: "Acessar o comando anterior de spaço de foco", legend: "Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo antes do cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes." },
+ { name: "Acessar próximo fomando de spaço de foco", legend: "Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo após o cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes." }, { name: " Ajuda de Acessibilidade", legend: "Pressione ${a11yHelp}" }, { name: "Colar como texto sem formatação", legend: "Pressione ${pastetext}", legendEdge: "Pressione ${pastetext}, seguido de ${paste}" }]
+ }], tab: "Tecla Tab", pause: "Pause",
+ capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Seta à Esquerda", upArrow: "Seta à Cima", rightArrow: "Seta à Direita", downArrow: "Seta à Baixo", insert: "Insert", leftWindowKey: "Tecla do Windows Esquerda", rightWindowKey: "Tecla do Windows Direita", selectKey: "Tecla Selecionar", numpad0: "0 do Teclado Numérico", numpad1: "1 do Teclado Numérico", numpad2: "2 do Teclado Numérico", numpad3: "3 do Teclado Numérico", numpad4: "4 do Teclado Numérico", numpad5: "5 do Teclado Numérico", numpad6: "6 do Teclado Numérico",
+ numpad7: "7 do Teclado Numérico", numpad8: "8 do Teclado Numérico", numpad9: "9 do Teclado Numérico", multiply: "Multiplicar", add: "Mais", subtract: "Subtrair", decimalPoint: "Ponto", divide: "Dividir", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Ponto-e-vírgula", equalSign: "Igual", comma: "Vírgula", dash: "Hífen", period: "Ponto", forwardSlash: "Barra", graveAccent: "Acento Grave", openBracket: "Abrir Conchetes",
+ backSlash: "Contra-barra", closeBracket: "Fechar Colchetes", singleQuote: "Aspas Simples"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/pt.js b/plugins/a11yhelp/dialogs/lang/pt.js
new file mode 100755
index 0000000..59ab904
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/pt.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","pt",{title:"Instruções de acessibilidade",contents:"Conteúdo de ajuda. Use a tecla ESC para fechar esta janela.",legend:[{name:"Geral",items:[{name:"Barra de ferramentas do editor",legend:"Clique em ${toolbarFocus} para navegar na barra de ferramentas. Para navegar entre o grupo da barra de ferramentas anterior e seguinte use TAB e SHIFT+TAB. Para navegar entre o botão da barra de ferramentas seguinte e anterior use a SETA DIREITA ou SETA ESQUERDA. Carregue em ESPAÇO ou ENTER para ativar o botão da barra de ferramentas."},
+{name:"Janela do editor",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},{name:"Menu de contexto do editor",legend:"Clique em ${contextMenu} ou TECLA APLICAÇÃO para abrir o menu de contexto. Depois vá para a opção do menu seguinte com TAB ou SETA PARA BAIXO. Vá para a opção anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO, ENTER ou SETA DIREITA. Vá para o item do menu contentor com ESC ou SETA ESQUERDA. Feche o menu de contexto com ESC."},
+{name:"Editor de caixa em lista",legend:"Dentro de uma lista, para navegar para o item seguinte da lista use TAB ou SETA PARA BAIXO. Para o item anterior da lista use SHIFT+TAB ou SETA PARA BAIXO. Carregue em ESPAÇO ou ENTER para selecionar a opção lista. Carregue em ESC para fechar a caixa da lista."},{name:"Editor da barra de caminho dos elementos",legend:"Clique em ${elementsPathFocus} para navegar na barra de caminho dos elementos. Para o botão do elemento seguinte use TAB ou SETA DIREITA. para o botão anterior use SHIFT+TAB ou SETA ESQUERDA. Carregue em ESPAÇO ou ENTER para selecionar o elemento no editor."}]},
+{name:"Comandos",items:[{name:"Comando de anular",legend:"Carregar ${undo}"},{name:"Comando de refazer",legend:"Clique ${redo}"},{name:"Comando de negrito",legend:"Pressione ${bold}"},{name:"Comando de itálico",legend:"Pressione ${italic}"},{name:"Comando de sublinhado",legend:"Pressione ${underline}"},{name:"Comando de hiperligação",legend:"Pressione ${link}"},{name:"Comando de ocultar barra de ferramentas",legend:"Pressione ${toolbarCollapse}"},{name:"Aceder ao comando espaço de foco anterior",
+legend:"Clique em ${accessPreviousSpace} para aceder ao espaço do focos inalcançável mais perto antes do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes."},{name:"Acesso comando do espaço focus seguinte",legend:"Pressione ${accessNextSpace} para aceder ao espaço do focos inalcançável mais perto depois do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes."},
+{name:"Ajuda a acessibilidade",legend:"Pressione ${a11yHelp}"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Separador",pause:"Pausa",capslock:"Maiúsculas",escape:"Esc",pageUp:"Subir página",pageDown:"Descer página",leftArrow:"Seta esquerda",upArrow:"Seta para cima",rightArrow:"Seta direita",downArrow:"Seta para baixo",insert:"Inserir",leftWindowKey:"Tecla esquerda Windows",rightWindowKey:"Tecla direita Windows",selectKey:"Selecionar tecla",
+numpad0:"Numpad 0",numpad1:"Numpad 1",numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Multiplicar",add:"Adicionar",subtract:"Subtrair",decimalPoint:"Ponto decimal",divide:"Separar",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Ponto e vírgula",equalSign:"Sinald e igual",comma:"Vírgula",
+dash:"Cardinal",period:"Ponto",forwardSlash:"Forward Slash",graveAccent:"Acento grave",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Plica"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/ro.js b/plugins/a11yhelp/dialogs/lang/ro.js
new file mode 100755
index 0000000..3df928b
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/ro.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ro",{title:"Instrucțiuni Accesibilitate",contents:"Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.",legend:[{name:"General",items:[{name:"Editor bară de instrumente.",legend:"Apasă ${toolbarFocus} pentru a naviga pe de instrumente. Pentru deplasarea la următorul sau anteriorul grup de instrumente se folosesc tastele TAB și SHIFT+TAB. Pentru deplasare pe urmatorul sau anteriorul instrument se folosesc tastele SĂGEATĂ DREAPTA sau SĂGEATĂ STÂNGA. Tasta SPAȚIU sau ENTER activează instrumentul."},
+{name:"Dialog editor",legend:"În interiorul unui dialog, se apasă TAB pentru navigarea la următorul element de dialog, SHIFT+TAB pentru deplasarea la anteriorul element de dialog, ENTER pentru validare dialog, ESC pentru anulare dialog. Când un dialog are secțiuni multiple, lista secțiunilor este accesibilă cu ALT+F10 sau cu TAB ca parte a ordonării secționării dialogului. Cu lista secțiunii activată, deplasarea înainte înapoi se face cu tastele SĂGEATĂ DREAPTA și respectiv STÂNGA."},{name:"Editor meniu contextual",
+legend:"Apasă ${contextMenu} sau TASTA MENIU pentru a deschide meniul contextual. Se trece la următoarea opțiune din meniu cu TAB sau SĂGEATĂ JOS. La opțiunea anterioară cu SHIFT+TAB sau SĂGEATĂ SUS. Se apasă SPAȚIU sau ENTER pentru a selecta opțiunea. Deschide sub-meniul opțiunii curente cu SPAȚIU sau ENTER sau SĂGEATĂ DREAPTA. Se revine la elementul din meniul părinte cu ESC sau SĂGEATĂ STÂNGA. Închide meniul de context cu ESC."},{name:"Caseta listă a editorului",legend:"În interiorul unei liste, treci la următorull element cu TAB sau SĂGEATĂ JOS. Treci la elementul anterior din listă cu SHIFT+TAB sau SĂGEATĂ SUS. Apasă SPAȚIU sau ENTER pentru a selecta opțiunea din listă. Apasă ESC pentru a închide lista."},
+{name:"Bara căii editorului de elemente",legend:"Apasă ${elementsPathFocus} pentru navigare pe elementele barei. Mergi la următorul buton cu TAB sau SĂGEATĂ JOS. Treci la butonul anterior din listă cu SHIFT+TAB sau SĂGEATĂ SUS. Apasă SPAȚIU sau ENTER pentru a selecta butonul în editor."}]},{name:"Comenzi",items:[{name:"Revino anterior (Undo)",legend:"Apasă ${undo}"},{name:"Comanda precedentă",legend:"Apasă ${redo}"},{name:"Îngroșat (Bold)",legend:"Apasă ${bold}"},{name:"Înclinat (Italic)",legend:"Apasă ${italic}"},
+{name:"Subliniere (Underline)",legend:"Apasă ${underline}"},{name:"Legatură (Link)",legend:"Apasă ${link}"},{name:"Desfășurare Bară instrumente",legend:"Apasă ${toolbarCollapse}"},{name:"Accesare spațiu focus anterior",legend:"Apasă ${accessPreviousSpace} pentru a accesa cel mai apropiat spațiu focus indisponibil înaintea cursorului, de exemplu: 2 elemente adiacente HR. Repetă combinația de taste pentru a accesa spațiile îndepărtate de focus."},{name:"Accesare spațiu focus următor",legend:"Apasă ${accessNextSpace} pentru a accesa cel mai apropiat spațiu focus indisponibil după cursor, de exemplu: 2 elemente adiacente HR. Repetă combinația de taste pentru a accesa spațiile îndepărtate de focus."},
+{name:"Ajutor Accesibilitate",legend:"Apasă ${a11yHelp}"},{name:"Adaugă ca Text simplu (Plain Text)",legend:"Apasă ${pastetext}",legendEdge:"Apasă ${pastetext}, urmat de ${paste}"}]}],tab:"TAB",pause:"Pauză",capslock:"Majuscule",escape:"Esc - renunță",pageUp:"Pagină sus",pageDown:"Săgeată jos",leftArrow:"Săgeată stânga",upArrow:"Săgeată sus",rightArrow:"Săgeată dreapta",downArrow:"Săgeată jos",insert:"Inserează",leftWindowKey:"Windows stânga",rightWindowKey:"Windows dreapta",selectKey:"Tasta Selecție",
+numpad0:"0 Numeric",numpad1:"1 Numeric",numpad2:"2 Numeric",numpad3:"3 Numeric",numpad4:"4 Numeric",numpad5:"5 Numeric",numpad6:"6 Numeric",numpad7:"7 Numeric",numpad8:"8 Numeric",numpad9:"9 Numeric",multiply:"Înmulțire",add:"Adunare",subtract:"Scădere",decimalPoint:"Punct zecimal",divide:"Împărțire",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"NumLock",scrollLock:"Scroll Lock",semiColon:"Punct și virgulă",equalSign:"Egal",comma:"Virgulă",
+dash:"Linie",period:"Punct",forwardSlash:"Slash",graveAccent:"Accent grav",openBracket:"Paranteză dreaptă stânga",backSlash:"Backslash",closeBracket:"Paranteză dreaptă dreapta",singleQuote:"Ghilimea simplă"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/ru.js b/plugins/a11yhelp/dialogs/lang/ru.js
new file mode 100755
index 0000000..3735eee
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/ru.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "ru", {
+ title: "Горячие клавиши", contents: "Помощь. Для закрытия этого окна нажмите ESC.", legend: [{
+ name: "Основное", items: [{ name: "Панель инструментов", legend: "Нажмите ${toolbarFocus} для перехода к панели инструментов. Для перемещения между группами панели инструментов используйте TAB и SHIFT+TAB. Для перемещения между кнопками панели иструментов используйте кнопки ВПРАВО или ВЛЕВО. Нажмите ПРОБЕЛ или ENTER для запуска кнопки панели инструментов." }, { name: "Диалоги", legend: 'Внутри диалога, нажмите TAB чтобы перейти к следующему элементу диалога, нажмите SHIFT+TAB чтобы перейти к предыдущему элементу диалога, нажмите ENTER чтобы отправить диалог, нажмите ESC чтобы отменить диалог. Когда диалоговое окно имеет несколько вкладок, получить доступ к панели вкладок как части диалога можно нажатием или сочетания ALT+F10 или TAB, при этом активные элементы диалога будут перебираться с учетом порядка табуляции. При активной панели вкладок, переход к следующей или предыдущей вкладке осуществляется нажатием стрелки "ВПРАВО" или стрелки "ВЛЕВО" соответственно.' },
+ { name: "Контекстное меню", legend: 'Нажмите ${contextMenu} или клавишу APPLICATION, чтобы открыть контекстное меню. Затем перейдите к следующему пункту меню с помощью TAB или стрелкой "ВНИЗ". Переход к предыдущей опции - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию меню. Открыть подменю текущей опции - SPACE или ENTER или стрелкой "ВПРАВО". Возврат к родительскому пункту меню - ESC или стрелкой "ВЛЕВО". Закрытие контекстного меню - ESC.' }, {
+ name: "Редактор списка",
+ legend: 'Внутри окна списка, переход к следующему пункту списка - TAB или стрелкой "ВНИЗ". Переход к предыдущему пункту списка - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию списка. Нажмите ESC, чтобы закрыть окно списка.'
+ }, { name: "Путь к элементу", legend: 'Нажмите ${elementsPathFocus}, чтобы перейти к панели пути элементов. Переход к следующей кнопке элемента - TAB или стрелкой "ВПРАВО". Переход к предыдущей кнопку - SHIFT+TAB или стрелкой "ВЛЕВО". Нажмите SPACE, или ENTER, чтобы выбрать элемент в редакторе.' }]
+ },
+ {
+ name: "Команды", items: [{ name: "Отменить", legend: "Нажмите ${undo}" }, { name: "Повторить", legend: "Нажмите ${redo}" }, { name: "Полужирный", legend: "Нажмите ${bold}" }, { name: "Курсив", legend: "Нажмите ${italic}" }, { name: "Подчеркнутый", legend: "Нажмите ${underline}" }, { name: "Гиперссылка", legend: "Нажмите ${link}" }, { name: "Свернуть панель инструментов", legend: "Нажмите ${toolbarCollapse}" }, { name: "Команды доступа к предыдущему фокусному пространству", legend: 'Нажмите ${accessPreviousSpace}, чтобы обратиться к ближайшему недостижимому фокусному пространству перед символом "^", например: два смежных HR элемента. Повторите комбинацию клавиш, чтобы достичь отдаленных фокусных пространств.' },
+ { name: "Команды доступа к следующему фокусному пространству", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: "Справка по горячим клавишам", legend: "Нажмите ${a11yHelp}" }, { name: "Вставить только текст", legend: "Нажмите ${pastetext}", legendEdge: "Нажмите ${pastetext} и затем ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Esc", pageUp: "Page Up",
+ pageDown: "Page Down", leftArrow: "Стрелка влево", upArrow: "Стрелка вверх", rightArrow: "Стрелка вправо", downArrow: "Стрелка вниз", insert: "Insert", leftWindowKey: "Левая клавиша Windows", rightWindowKey: "Правая клавиша Windows", selectKey: "Выбрать", numpad0: "Цифра 0", numpad1: "Цифра 1", numpad2: "Цифра 2", numpad3: "Цифра 3", numpad4: "Цифра 4", numpad5: "Цифра 5", numpad6: "Цифра 6", numpad7: "Цифра 7", numpad8: "Цифра 8", numpad9: "Цифра 9", multiply: "Умножить", add: "Плюс", subtract: "Вычесть", decimalPoint: "Десятичная точка", divide: "Делить",
+ f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Точка с запятой", equalSign: "Равно", comma: "Запятая", dash: "Тире", period: "Точка", forwardSlash: "Наклонная черта", graveAccent: "Апостроф", openBracket: "Открыть скобку", backSlash: "Обратная наклонная черта", closeBracket: "Закрыть скобку", singleQuote: "Одинарная кавычка"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/si.js b/plugins/a11yhelp/dialogs/lang/si.js
new file mode 100755
index 0000000..4f80e3a
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/si.js
@@ -0,0 +1,16 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "si", {
+ title: "ළඟා වියහැකි ", contents: "උදව් සඳහා අන්තර්ගතය.නික්මයෙමට ESC බොත්තම ඔබන්න", legend: [{
+ name: "පොදු කරුණු", items: [{ name: "සංස්කරණ මෙවලම් ", legend: "ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න." }, { name: "සංස්කරණ ", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "සංස්කරණ අඩංගුවට ", legend: "ඔබන්න ${අන්තර්ගත මෙනුව} හෝ APPLICATION KEY අන්තර්ගත-මෙනුව විවුරතකිරීමට. ඊළඟ මෙනුව-ව්කල්පයන්ට යෑමට TAB හෝ DOWN ARROW බොත්තම ද, පෙර විකල්පයන්ටයෑමට SHIFT+TAB හෝ UP ARROW බොත්තම ද, මෙනුව-ව්කල්පයන් තේරීමට SPACE හෝ ENTER බොත්තම ද, දැනට විවුර්තව ඇති උප-මෙනුවක වීකල්ප තේරීමට SPACE හෝ ENTER හෝ RIGHT ARROW ද, නැවත පෙර ප්‍රධාන මෙනුවට යෑමට ESC හෝ LEFT ARROW බොත්තම ද. අන්තර්ගත-මෙනුව වැසීමට ESC බොත්තම ද ඔබන්න." }, { name: "සංස්කරණ තේරුම් ", legend: "තේරුම් කොටුව තුළ , ඊළඟ අයිතමයට යෑමට TAB හෝ DOWN ARROW , පෙර අයිතමයට යෑමට SHIFT+TAB හෝ UP ARROW . අයිතම විකල්පයන් තේරීමට SPACE හෝ ENTER ,තේරුම් කොටුව වැසීමට ESC බොත්තම් ද ඔබන්න." },
+ { name: "සංස්කරණ අංග සහිත ", legend: "ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න." }]
+ }, {
+ name: "විධාන", items: [{ name: "විධානය වෙනස් ", legend: "ඔබන්න ${වෙනස් කිරීම}" }, { name: "විධාන නැවත් පෙර පරිදිම වෙනස්කර ගැනීම.", legend: "ඔබන්න ${නැවත් පෙර පරිදිම වෙනස්කර ගැනීම}" }, { name: "තද අකුරින් විධාන", legend: "ඔබන්න ${තද }" },
+ { name: "බැධී අකුරු විධාන", legend: "ඔබන්න ${බැධී අකුරු }" }, { name: "යටින් ඉරි ඇද ඇති විධාන.", legend: "ඔබන්න ${යටින් ඉරි ඇද ඇති}" }, { name: "සම්බන්ධිත විධාන", legend: "ඔබන්න ${සම්බන්ධ }" }, { name: "මෙවලම් තීරු හැකුලුම් විධාන", legend: "ඔබන්න ${මෙවලම් තීරු හැකුලුම් }" }, { name: "යොමුවීමට පෙර වැදගත් විධාන", legend: "ඔබන්න ${යොමුවීමට ඊළඟ }" }, { name: "යොමුවීමට ඊළග වැදගත් විධාන", legend: "ඔබන්න ${යොමුවීමට ඊළඟ }" }, { name: "ප්‍රවේශ ", legend: "ඔබන්න ${a11y }" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }],
+ tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply",
+ add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash", graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/sk.js b/plugins/a11yhelp/dialogs/lang/sk.js
new file mode 100755
index 0000000..8783227
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/sk.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "sk", {
+ title: "Inštrukcie prístupnosti", contents: "Pomocný obsah. Pre zatvorenie tohto okna, stlačte ESC.", legend: [{
+ name: "Všeobecne", items: [{ name: "Lišta nástrojov editora", legend: "Stlačte ${toolbarFocus} pre navigáciu na lištu nástrojov. Medzi ďalšou a predchádzajúcou lištou nástrojov sa pohybujete s TAB a SHIFT+TAB. Medzi ďalším a predchádzajúcim tlačidlom na lište nástrojov sa pohybujete s pravou šípkou a ľavou šípkou. Stlačte medzerník alebo ENTER pre aktiváciu tlačidla lišty nástrojov." },
+ { name: "Editorový dialóg", legend: "V dialógovom okne stlačte TAB pre presun na ďalší prvok, SHIFT+TAB pre presun na predchádzajúci prvok, ENTER pre odoslanie, ESC pre zrušenie. Keď má dialógové okno viacero kariet, zoznam kariet dosiahnete buď stlačením ALT+F10 alebo s TAB v príslušnom poradí kariet. So zameraným zoznamom kariet sa pohybujte k ďalšej alebo predchádzajúcej karte cez PRAVÚ a ĽAVÚ ŠÍPKU." }, { name: "Editorové kontextové menu", legend: "Stlačte ${contextMenu} alebo APPLICATION KEY pre otvorenie kontextového menu. Potom sa presúvajte na ďalšie možnosti menu s TAB alebo dolnou šípkou. Presunte sa k predchádzajúcej možnosti s SHIFT+TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti menu. Otvorte pod-menu danej možnosti s medzerníkom, alebo ENTER, alebo pravou šípkou. Vráťte sa späť do položky rodičovského menu s ESC alebo ľavou šípkou. Zatvorte kontextové menu s ESC." },
+ { name: "Editorov box zoznamu", legend: "V boxe zoznamu, presuňte sa na ďalšiu položku v zozname s TAB alebo dolnou šípkou. Presuňte sa k predchádzajúcej položke v zozname so SHIFT+TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti zoznamu. Stlačte ESC pre zatvorenie boxu zoznamu." }, { name: "Editorove pásmo cesty prvku", legend: "Stlačte ${elementsPathFocus} pre navigovanie na pásmo cesty elementu. Presuňte sa na tlačidlo ďalšieho prvku s TAB alebo pravou šípkou. Presuňte sa k predchádzajúcemu tlačidlu s SHIFT+TAB alebo ľavou šípkou. Stlačte medzerník alebo ENTER pre výber prvku v editore." }]
+ },
+ {
+ name: "Príkazy", items: [{ name: "Vrátiť príkazy", legend: "Stlačte ${undo}" }, { name: "Nanovo vrátiť príkaz", legend: "Stlačte ${redo}" }, { name: "Príkaz na stučnenie", legend: "Stlačte ${bold}" }, { name: "Príkaz na kurzívu", legend: "Stlačte ${italic}" }, { name: "Príkaz na podčiarknutie", legend: "Stlačte ${underline}" }, { name: "Príkaz na odkaz", legend: "Stlačte ${link}" }, { name: "Príkaz na zbalenie lišty nástrojov", legend: "Stlačte ${toolbarCollapse}" }, { name: "Prejsť na predchádzajúcu zamerateľnú medzeru príkazu", legend: "Stlačte ${accessPreviousSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery pred vsuvkuo. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier." },
+ { name: "Prejsť na ďalší ", legend: "Stlačte ${accessNextSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery po vsuvke. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier." }, { name: "Pomoc prístupnosti", legend: "Stlačte ${a11yHelp}" }, { name: "Vložiť ako čistý text", legend: "Stlačte ${pastetext}", legendEdge: "Stlačte ${pastetext} a potom ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Stránka hore",
+ pageDown: "Stránka dole", leftArrow: "Šípka naľavo", upArrow: "Šípka hore", rightArrow: "Šípka napravo", downArrow: "Šípka dole", insert: "Insert", leftWindowKey: "Ľavé Windows tlačidlo", rightWindowKey: "Pravé Windows tlačidlo", selectKey: "Tlačidlo Select", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Násobenie", add: "Sčítanie", subtract: "Odčítanie", decimalPoint: "Desatinná čiarka",
+ divide: "Delenie", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Bodkočiarka", equalSign: "Rovná sa", comma: "Čiarka", dash: "Pomĺčka", period: "Bodka", forwardSlash: "Lomítko", graveAccent: "Zdôrazňovanie prízvuku", openBracket: "Hranatá zátvorka otváracia", backSlash: "Backslash", closeBracket: "Hranatá zátvorka zatváracia", singleQuote: "Jednoduché úvodzovky"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/sl.js b/plugins/a11yhelp/dialogs/lang/sl.js
new file mode 100755
index 0000000..a214fdb
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/sl.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "sl", {
+ title: "Navodila za dostopnost", contents: "Vsebina pomoči. Če želite zapreti pogovorno okno, pritisnite ESC.", legend: [{
+ name: "Splošno", items: [{ name: "Orodna vrstica urejevalnika", legend: "Pritisnite ${toolbarFocus} za pomik v orodno vrstico. Z TAB in SHIFT+TAB se pomikate na naslednjo in prejšnjo skupino orodne vrstice. Z DESNO PUŠČICO ali LEVO PUŠČICO se pomikate na naslednji in prejšnji gumb orodne vrstice. Pritisnite SPACE ali ENTER, da aktivirate gumb orodne vrstice." },
+ { name: "Urejevalno Pogovorno Okno", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." }, { name: "Kontekstni meni urejevalnika", legend: "Pritisnite ${contextMenu} ali APPLICATION KEY, da odprete kontekstni meni. Nato se premaknite na naslednjo možnost menija s tipko TAB ali PUŠČICA DOL. Premakniti se na prejšnjo možnost z SHIFT + TAB ali PUŠČICA GOR. Pritisnite SPACE ali ENTER za izbiro možnosti menija. Odprite podmeni trenutne možnosti menija s tipko SPACE ali ENTER ali DESNA PUŠČICA. Vrnite se na matični element menija s tipko ESC ali LEVA PUŠČICA. Zaprite kontekstni meni z ESC." },
+ { name: "Urejevalno Seznamsko Polje", legend: "Znotraj seznama, se premaknete na naslednji element seznama s tipko TAB ali PUŠČICO DOL. Z SHIFT+TAB ali PUŠČICO GOR se premaknete na prejšnji element seznama. Pritisnite tipko SPACE ali ENTER za izbiro elementa. Pritisnite tipko ESC, da zaprete seznam." }, { name: "Urejevalna vrstica poti elementa", legend: "Pritisnite ${elementsPathFocus} za pomikanje po vrstici elementnih poti. S TAB ali DESNA PUŠČICA se premaknete na naslednji gumb elementa. Z SHIFT+TAB ali LEVO PUŠČICO se premaknete na prejšnji gumb elementa. Pritisnite SPACE ali ENTER za izbiro elementa v urejevalniku." }]
+ },
+ {
+ name: "Ukazi", items: [{ name: "Razveljavi ukaz", legend: "Pritisnite ${undo}" }, { name: "Ponovi ukaz", legend: "Pritisnite ${redo}" }, { name: "Krepki ukaz", legend: "Pritisnite ${bold}" }, { name: "Ležeči ukaz", legend: "Pritisnite ${italic}" }, { name: "Poudarni ukaz", legend: "Pritisnite ${underline}" }, { name: "Ukaz povezave", legend: "Pritisnite ${link}" }, { name: "Skrči Orodno Vrstico Ukaz", legend: "Pritisnite ${toolbarCollapse}" }, { name: "Dostop do prejšnjega ukaza ostrenja", legend: "Pritisnite ${accessPreviousSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora pred strešico, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore." },
+ { name: "Dostop do naslednjega ukaza ostrenja", legend: "Pritisnite ${accessNextSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora po strešici, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore." }, { name: "Pomoč dostopnosti", legend: "Pritisnite ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape",
+ pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Puščica levo", upArrow: "Puščica gor", rightArrow: "Puščica desno", downArrow: "Puščica dol", insert: "Insert", leftWindowKey: "Leva tipka Windows", rightWindowKey: "Desna tipka Windows", selectKey: "Select tipka", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Zmnoži", add: "Dodaj", subtract: "Odštej", decimalPoint: "Decimalna vejica",
+ divide: "Deli", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Podpičje", equalSign: "Enačaj", comma: "Vejica", dash: "Vezaj", period: "Pika", forwardSlash: "Desna poševnica", graveAccent: "Krativec", openBracket: "Oklepaj", backSlash: "Leva poševnica", closeBracket: "Zaklepaj", singleQuote: "Opuščaj"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/sq.js b/plugins/a11yhelp/dialogs/lang/sq.js
new file mode 100755
index 0000000..d761d53
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/sq.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sq",{title:"Udhëzimet e Qasjes",contents:"Përmbajtja ndihmëse. Për ta mbyllur dialogun shtyp ESC.",legend:[{name:"Të përgjithshme",items:[{name:"Shiriti i Redaktuesit",legend:"Shtyp ${toolbarFocus} për të shfletuar kokështrirjen. Kalo tek grupi paraprak ose pasues i shiritit përmes kombinacionit TAB dhe SHIFT+TAB, në tastierë. Kalo tek pulla paraprake ose pasuese e kokështrirjes përmes SHIGJETË DJATHTAS ose SHIGJETËS MAJTAS, në tastierë. Shtyp HAPËSIRË ose ENTER Move to the next and previous toolbar button with RIGHT ARROW për të aktivizuar pullën e kokështrirjes."},
+{name:"Dialogu i Redaktuesit",legend:"Në brendi të dialogut, shtyp TAB për të kaluar tek elementi tjetër i dialogut, shtyp SHIFT+TAB për të kaluar tek elementi paraprak i dialogut, shtyp ENTER për të shtuar dialogun, shtyp ESC për të anuluar dialogun. Kur një dialog ka më shumë fletë, lista e fletëve mund të hapet përmes ALT+F10 ose përmes TAB si pjesë e radhitjes së fletëve të dialogut. Me listën e fokusuar të fletëve,kalo tek fleta paraprake dhe pasuese përmes SHIGJETËS MAJSA ose DJATHTAS."},{name:"Menyja Kontestuese e Redaktorit",
+legend:"Shtyp ${contextMenu} ose APPLICATION KEY për të hapur menynë kontekstuale. Pastaj kalo tek mundësia tjetër e menysë përmes TAB ose SHIGJETËS POSHTË. Kalo tek mundësia paraprake përmes SHIFT+TAB ose SHIGJETA SIPËR. Shtyp SPACE ose ENTER për të përzgjedhur mundësinë e menysë. Hape nënmenynë e mundësisë aktuale përmes tastës HAPËSIRË ose ENTER ose SHIGJETËS DJATHTAS. Kalo prapa tek artikulli i menysë prind përmes ESC ose SHIGJETËS MAJTAS. Mbylle menynë kontekstuale përmes ESC."},{name:"Kutiza e Listës së Redaktuesit",
+legend:"Brenda kutisë së listës, kalo tek artikulli pasues i listës përmes TAB ose SHIGJETËS POSHTË. Kalo tek artikulli paraprak i listës përmes SHIFT+TAB ose SHIGJETËS SIPËR. Shtyp tastën HAPËSIRË ose ENTER për të përzgjedhur mundësitë e listës. Shtyp ESC për të mbyllur kutinë e listës."},{name:"Shiriti i Rrugës së Elementeve të Redaktorit",legend:"Shtyp ${elementsPathFocus} për të lëvizur tek shiriti i elementeve. Kalo tek pulla pasuese e elementit përmes TAB ose SHIGJETËS DJATHTAS. Kalo tek pulla paraprake përmes SHIFT+TAB ose SHIGJETËS MAJTAS. Shtyp tastën HAPËSIRË ose ENTER për të përzgjedhur elementin tek redaktuesi."}]},
+{name:"Komandat",items:[{name:"Rikthe komandën",legend:"Shtyp ${undo}"},{name:"Ribëj komandën",legend:"Shtyp ${redo}"},{name:"Komanda e trashjes së tekstit",legend:"Shtyp ${bold}"},{name:"Komanda kursive",legend:"Shtyp ${italic}"},{name:"Komanda e nënvijëzimit",legend:"Shtyp ${underline}"},{name:"Komanda e Nyjes",legend:"Shtyp ${link}"},{name:"Komanda e Mbjedhjes së Kokështrirjes",legend:"Shtyp ${toolbarCollapse}"},{name:"Qasu komandës paraprake të hapësirës së fokusimit",legend:"Shtyp ${accessPreviousSpace} për t'iu qasur hapësirës më të afërt të paarritshme të fokusimit para simbolit ^, për shembull: dy elemente të afërt HR. Përsërit kombinacionin e tasteve për të arritur hapësirë të largët fokusimi."},
+{name:"Qasu komandës pasuese të hapësirës së fokusimit",legend:"Shtyp ${accessNextSpace} për t'iu qasur hapësirës më të afërt të paarritshme të fokusimit pas shenjës ^, për shembull: dy elemente të afërt HR. Përsërit kombinacionin e tasteve për të arritur hapësirën e largët të fokusimit."},{name:"Ndihmë Qasjeje",legend:"Shtyp ${a11yHelp}"},{name:"Hidhe si tekst të thjeshtë",legend:"Shtyp ${pastetext}",legendEdge:"Shtyp ${pastetext}, pasuar nga ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",
+escape:"Escape",pageUp:"Faqja sipër",pageDown:"Faqja poshtë",leftArrow:"Shigjeta majtas",upArrow:"Shigjeta sipër",rightArrow:"Shigjeta djathtas",downArrow:"Shigjeta poshtë",insert:"Insert",leftWindowKey:"Pulla Majtas e Windows-it",rightWindowKey:"Pulla Djathtas e Windows-it",selectKey:"Pulla Përzgjedhëse",numpad0:"Numpad 0",numpad1:"Numpad 1",numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Shumëzo",
+add:"Shto",subtract:"Zbrit",decimalPoint:"Pika Decimale",divide:"Pjesëto",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Pikëpresje",equalSign:"Shenja e Barazimit",comma:"Presje",dash:"minus",period:"Pikë",forwardSlash:"Vija e pjerrët përpara",graveAccent:"Shenja e theksit",openBracket:"Hape kllapën",backSlash:"Vija e pjerrët prapa",closeBracket:"Mbylle kllapën",singleQuote:"Thonjëz e vetme"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/sr-latn.js b/plugins/a11yhelp/dialogs/lang/sr-latn.js
new file mode 100755
index 0000000..6a3726f
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/sr-latn.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "sr-latn", {
+ title: "Accessibility Instructions", contents: "Help Contents. To close this dialog press ESC.", legend: [{
+ name: "Opšte", items: [{ name: "Editor Toolbar", legend: "Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button." }, { name: "Editor Dialog", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Editor Context Menu", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "Editor List Box", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "Commands", items: [{ name: " Undo command", legend: "Press ${undo}" }, { name: " Redo command", legend: "Press ${redo}" }, { name: " Bold command", legend: "Press ${bold}" }, { name: " Italic command", legend: "Press ${italic}" }, {
+ name: " Underline command",
+ legend: "Press ${underline}"
+ }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash",
+ graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/sr.js b/plugins/a11yhelp/dialogs/lang/sr.js
new file mode 100755
index 0000000..d40bcce
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/sr.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "sr", {
+ title: "Accessibility Instructions", contents: "Help Contents. To close this dialog press ESC.", legend: [{
+ name: "Опште", items: [{ name: "Editor Toolbar", legend: "Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button." }, { name: "Editor Dialog", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Editor Context Menu", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC." }, { name: "Editor List Box", legend: "Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box." },
+ { name: "Editor Element Path Bar", legend: "Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor." }]
+ }, {
+ name: "Commands", items: [{ name: " Undo command", legend: "Press ${undo}" }, { name: " Redo command", legend: "Press ${redo}" }, { name: " Bold command", legend: "Press ${bold}" }, { name: " Italic command", legend: "Press ${italic}" }, {
+ name: " Underline command",
+ legend: "Press ${underline}"
+ }, { name: " Link command", legend: "Press ${link}" }, { name: " Toolbar Collapse command", legend: "Press ${toolbarCollapse}" }, { name: " Access previous focus space command", legend: "Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." }, { name: " Access next focus space command", legend: "Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces." },
+ { name: " Accessibility Help", legend: "Press ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Left Arrow", upArrow: "Up Arrow", rightArrow: "Right Arrow", downArrow: "Down Arrow", insert: "Insert", leftWindowKey: "Left Windows key", rightWindowKey: "Right Windows key", selectKey: "Select key", numpad0: "Numpad 0", numpad1: "Numpad 1",
+ numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Multiply", add: "Add", subtract: "Subtract", decimalPoint: "Decimal Point", divide: "Divide", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semicolon", equalSign: "Equal Sign", comma: "Comma", dash: "Dash", period: "Period", forwardSlash: "Forward Slash",
+ graveAccent: "Grave Accent", openBracket: "Open Bracket", backSlash: "Backslash", closeBracket: "Close Bracket", singleQuote: "Single Quote"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/sv.js b/plugins/a11yhelp/dialogs/lang/sv.js
new file mode 100755
index 0000000..2ef1659
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/sv.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "sv", {
+ title: "Hjälpmedelsinstruktioner", contents: "Hjälpinnehåll. För att stänga denna dialogruta trycker du på ESC.", legend: [{
+ name: "Allmänt", items: [{ name: "Editor verktygsfält", legend: "Tryck på ${toolbarFocus} för att navigera till verktygsfältet. Flytta till nästa och föregående verktygsfältsgrupp med TAB och SHIFT+TAB. Flytta till nästa och föregående knapp i verktygsfältet med HÖGERPIL eller VÄNSTERPIL. Tryck SPACE eller ENTER för att aktivera knappen i verktygsfältet." },
+ { name: "Dialogeditor", legend: "Inuti en dialogruta, tryck TAB för att navigera till nästa fält i dialogrutan, tryck SKIFT+TAB för att flytta till föregående fält, tryck ENTER för att skicka. Du avbryter och stänger dialogen med ESC. För dialogrutor som har flera flikar, tryck ALT+F10 eller TAB för att navigera till fliklistan. med fliklistan vald flytta till nästa och föregående flik med HÖGER- eller VÄNSTERPIL." }, { name: "Editor för innehållsmeny", legend: "Tryck på $ {contextMenu} eller PROGRAMTANGENTEN för att öppna snabbmenyn. Flytta sedan till nästa menyalternativ med TAB eller NEDPIL. Flytta till föregående alternativ med SHIFT + TABB eller UPPIL. Tryck Space eller ENTER för att välja menyalternativ. Öppna undermeny av nuvarande alternativ med SPACE eller ENTER eller HÖGERPIL. Gå tillbaka till överordnade menyalternativ med ESC eller VÄNSTERPIL. Stäng snabbmenyn med ESC." },
+ { name: "Editor för list-box", legend: "Inuti en list-box, gå till nästa listobjekt med TAB eller NEDPIL. Flytta till föregående listobjekt med SHIFT+TAB eller UPPIL. Tryck SPACE eller ENTER för att välja listan alternativet. Tryck ESC för att stänga list-boxen." }, { name: "Editor för elementens sökväg", legend: "Tryck på ${elementsPathFocus} för att navigera till verktygsfältet för elementens sökvägar. Flytta till nästa elementknapp med TAB eller HÖGERPIL. Flytta till föregående knapp med SKIFT+TAB eller VÄNSTERPIL. Tryck SPACE eller ENTER för att välja element i redigeraren." }]
+ },
+ {
+ name: "Kommandon", items: [{ name: "Ångra kommando", legend: "Tryck på ${undo}" }, { name: "Gör om kommando", legend: "Tryck på ${redo}" }, { name: "Kommandot fet stil", legend: "Tryck på ${bold}" }, { name: "Kommandot kursiv", legend: "Tryck på ${italic}" }, { name: "Kommandot understruken", legend: "Tryck på ${underline}" }, { name: "Kommandot länk", legend: "Tryck på ${link}" }, { name: "Verktygsfält Dölj kommandot", legend: "Tryck på ${toolbarCollapse}" }, { name: "Gå till föregående fokus plats", legend: "Tryck på ${accessPreviousSpace} för att gå till närmast onåbara utrymme före markören, exempel: två intilliggande HR element. Repetera tangentkombinationen för att gå till nästa." },
+ { name: "Tillgå nästa fokuskommandots utrymme", legend: "Tryck ${accessNextSpace} på för att komma åt den närmaste onåbar fokus utrymme efter cirkumflex, till exempel: två intilliggande HR element. Upprepa tangentkombinationen för att nå avlägsna fokus utrymmen." }, { name: "Hjälp om tillgänglighet", legend: "Tryck ${a11yHelp}" }, { name: "Klistra in som vanlig text", legend: "Tryck ${pastetext}", legendEdge: "Tryck ${pastetext}, följt av ${paste}" }]
+ }], tab: "Tab", pause: "Paus", capslock: "Caps lock", escape: "Escape", pageUp: "Sida Up",
+ pageDown: "Sida Ned", leftArrow: "Vänsterpil", upArrow: "Uppil", rightArrow: "Högerpil", downArrow: "Nedåtpil", insert: "Infoga", leftWindowKey: "Vänster Windowstangent", rightWindowKey: "Höger Windowstangent", selectKey: "Välj tangent", numpad0: "Nummer 0", numpad1: "Nummer 1", numpad2: "Nummer 2", numpad3: "Nummer 3", numpad4: "Nummer 4", numpad5: "Nummer 5", numpad6: "Nummer 6", numpad7: "Nummer 7", numpad8: "Nummer 8", numpad9: "Nummer 9", multiply: "Multiplicera", add: "Addera", subtract: "Minus", decimalPoint: "Decimalpunkt", divide: "Dividera",
+ f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Semikolon", equalSign: "Lika med tecken", comma: "Komma", dash: "Minus", period: "Punkt", forwardSlash: "Snedstreck framåt", graveAccent: "Accent", openBracket: "Öppningsparentes", backSlash: "Snedstreck bakåt", closeBracket: "Slutparentes", singleQuote: "Enkelt Citattecken"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/th.js b/plugins/a11yhelp/dialogs/lang/th.js
new file mode 100755
index 0000000..ed9bf04
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/th.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","th",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"ทั่วไป",items:[{name:"แถบเครื่องมือสำหรับเครื่องมือช่วยพิมพ์",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"คำสั่ง",items:[{name:"เลิกทำคำสั่ง",legend:"วาง ${undo}"},{name:"คำสั่งสำหรับทำซ้ำ",legend:"วาง ${redo}"},{name:"คำสั่งสำหรับตัวหนา",legend:"วาง ${bold}"},{name:"คำสั่งสำหรับตัวเอียง",legend:"วาง ${italic}"},{name:"คำสั่งสำหรับขีดเส้นใต้",
+legend:"วาง ${underline}"},{name:"คำสั่งสำหรับลิงก์",legend:"วาง ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert",leftWindowKey:"Left Windows key",rightWindowKey:"Right Windows key",selectKey:"Select key",numpad0:"Numpad 0",numpad1:"Numpad 1",
+numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Multiply",add:"Add",subtract:"Subtract",decimalPoint:"Decimal Point",divide:"Divide",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Semicolon",equalSign:"Equal Sign",comma:"Comma",dash:"Dash",period:"Period",forwardSlash:"Forward Slash",
+graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/tr.js b/plugins/a11yhelp/dialogs/lang/tr.js
new file mode 100755
index 0000000..a04d97d
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/tr.js
@@ -0,0 +1,18 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "tr", {
+ title: "Erişilebilirlik Talimatları", contents: "Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.", legend: [{
+ name: "Genel", items: [{ name: "Düzenleyici Araç Çubuğu", legend: "Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT+TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın." },
+ { name: "Diyalog Düzenleyici", legend: "Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın." },
+ { name: "İçerik Menü Editörü", legend: "İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın." }, { name: "Liste Kutusu Editörü", legend: "Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT+TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın." },
+ { name: "Element Yol Çubuğu Editörü", legend: "Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT+TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın." }]
+ }, {
+ name: "Komutlar", items: [{ name: "Komutu geri al", legend: "$(undo)'ya basın" }, { name: "Komutu geri al", legend: "${redo} basın" }, { name: " Kalın komut", legend: "${bold} basın" }, { name: " İtalik komutu", legend: "${italic} basın" },
+ { name: " Alttan çizgi komutu", legend: "${underline} basın" }, { name: " Bağlantı komutu", legend: "${link} basın" }, { name: " Araç çubuğu Toplama komutu", legend: "${toolbarCollapse} basın" }, { name: "Önceki komut alanına odaklan", legend: "Düzeltme imleçinden önce, en yakın uzaktaki alana erişmek için ${accessPreviousSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın." }, { name: "Sonraki komut alanına odaklan", legend: "Düzeltme imleçinden sonra, en yakın uzaktaki alana erişmek için ${accessNextSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın." },
+ { name: "Erişilebilirlik Yardımı", legend: "${a11yHelp}'e basın" }, { name: "Düz Metin Olarak Yapıştır", legend: "${pastetext} basın", legendEdge: "Önce ${pastetext} ardından${paste} basın" }]
+ }], tab: "Sekme tuşu", pause: "Durdurma tuşu", capslock: "Büyük harf tuşu", escape: "Vazgeç tuşu", pageUp: "Sayfa Yukarı", pageDown: "Sayfa Aşağı", leftArrow: "Sol ok", upArrow: "Yukarı ok", rightArrow: "Sağ ok", downArrow: "Aşağı ok", insert: "Araya gir", leftWindowKey: "Sol windows tuşu", rightWindowKey: "Sağ windows tuşu", selectKey: "Seçme tuşu",
+ numpad0: "Nümerik 0", numpad1: "Nümerik 1", numpad2: "Nümerik 2", numpad3: "Nümerik 3", numpad4: "Nümerik 4", numpad5: "Nümerik 5", numpad6: "Nümerik 6", numpad7: "Nümerik 7", numpad8: "Nümerik 8", numpad9: "Nümerik 9", multiply: "Çarpma", add: "Toplama", subtract: "Çıkarma", decimalPoint: "Ondalık işareti", divide: "Bölme", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lk", scrollLock: "Scr Lk", semiColon: "Noktalı virgül", equalSign: "Eşittir", comma: "Virgül", dash: "Eksi",
+ period: "Nokta", forwardSlash: "İleri eğik çizgi", graveAccent: "Üst tırnak", openBracket: "Parantez aç", backSlash: "Ters eğik çizgi", closeBracket: "Parantez kapa", singleQuote: "Tek tırnak"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/tt.js b/plugins/a11yhelp/dialogs/lang/tt.js
new file mode 100755
index 0000000..2609051
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/tt.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","tt",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Гомуми",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Командалар",items:[{name:"Кайтару",legend:"${undo} басыгыз"},{name:"Кабатлау",legend:"${redo} басыгыз"},{name:"Калын",legend:"${bold} басыгыз"},{name:"Курсив",legend:"${italic} басыгыз"},{name:"Астына сызылган",legend:"${underline} басыгыз"},
+{name:"Сылталама",legend:"${link} басыгыз"},{name:" Toolbar Collapse command",legend:"${toolbarCollapse} басыгыз"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"${a11yHelp} басыгыз"},{name:" Paste as plain text",legend:"Press ${pastetext}",legendEdge:"Press ${pastetext}, followed by ${paste}"}]}],tab:"Tab",pause:"Тыныш",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",leftArrow:"Сул якка ук",upArrow:"Өскә таба ук",rightArrow:"Уң якка ук",downArrow:"Аска таба ук",insert:"Өстәү",leftWindowKey:"Сул Windows төймəсе",rightWindowKey:"Уң Windows төймəсе",selectKey:"Select төймəсе",numpad0:"Numpad 0",
+numpad1:"Numpad 1",numpad2:"Numpad 2",numpad3:"Numpad 3",numpad4:"Numpad 4",numpad5:"Numpad 5",numpad6:"Numpad 6",numpad7:"Numpad 7",numpad8:"Numpad 8",numpad9:"Numpad 9",multiply:"Тапкырлау",add:"Кушу",subtract:"Алу",decimalPoint:"Унарлы нокта",divide:"Бүлү",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",numLock:"Num Lock",scrollLock:"Scroll Lock",semiColon:"Нокталы өтер",equalSign:"Тигезлек билгесе",comma:"Өтер",dash:"Сызык",period:"Дәрәҗә",
+forwardSlash:"Кыек сызык",graveAccent:"Гравис",openBracket:"Җәя ачу",backSlash:"Кире кыек сызык",closeBracket:"Җәя ябу",singleQuote:"Бер иңле куштырнаклар"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/ug.js b/plugins/a11yhelp/dialogs/lang/ug.js
new file mode 100755
index 0000000..d2088ae
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/ug.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "ug", {
+ title: "قوشۇمچە چۈشەندۈرۈش", contents: "ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.", legend: [{
+ name: "ئادەتتىكى", items: [{ name: "قورال بالداق تەھرىر", legend: "${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ." }, { name: "تەھرىرلىگۈچ سۆزلەشكۈسى", legend: "سۆزلەشكۈدە TAB كۇنۇپكىسىدا كېيىنكى سۆز بۆلىكىگە يۆتكىلىدۇ، SHIFT+TAB بىرىكمە كۇنۇپكىسىدا ئالدىنقى سۆز بۆلىكىگە يۆتكىلىدۇ، ENTER كۇنۇپكىسىدا سۆزلەشكۈنى تاپشۇرىدۇ، ESC كۇنۇپكىسى سۆزلەشكۈدىن ۋاز كېچىدۇ. كۆپ بەتكۈچلۈك سۆزلەشكۈگە نىسبەتەن، ALT+F10 دا بەتكۈچ تىزىمىغا يۆتكەيدۇ. ئاندىن TAB كۇنۇپكىسى ياكى ئوڭ يا ئوق كۇنۇپكىسى كېيىنكى بەتكۈچكە يۆتكەيدۇ؛SHIFT+ TAB كۇنۇپكىسى ياكى سول يا ئوق كۇنۇپكىسى ئالدىنقى بەتكۈچكە يۆتكەيدۇ. بوشلۇق كۇنۇپكىسى ياكى ENTER كۇنۇپكىسى بەتكۈچنى تاللايدۇ." },
+ { name: "تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى", legend: "${contextMenu} ياكى ئەپ كۇنۇپكىسىدا تىل مۇھىت تىزىملىكىنى ئاچىدۇ. ئاندىن TAB ياكى ئاستى يا ئوق كۇنۇپكىسىدا كېيىنكى تىزىملىك تۈرىگە يۆتكەيدۇ؛ SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسىدا ئالدىنقى تىزىملىك تۈرىگە يۆتكەيدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىملىك تۈرىنى تاللايدۇ. بوشلۇق، ENTER ياكى ئوڭ يا ئوق كۇنۇپكىسىدا تارماق تىزىملىكنى ئاچىدۇ. قايتىش تىزىملىكىگە ESC ياكى سول يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ESC كۇنۇپكىسىدا تىل مۇھىت تىزىملىكى تاقىلىدۇ." }, {
+ name: "تەھرىرلىگۈچ تىزىمى",
+ legend: "تىزىم قۇتىسىدا، كېيىنكى تىزىم تۈرىگە يۆتكەشتە TAB ياكى ئاستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ئالدىنقى تىزىم تۈرىگە يۆتكەشتە SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىم تۈرىنى تاللايدۇ.ESC كۇنۇپكىسىدا تىزىم قۇتىسىنى يىغىدۇ."
+ }, { name: "تەھرىرلىگۈچ ئېلېمېنت يول بالداق", legend: "${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ." }]
+ },
+ {
+ name: "بۇيرۇق", items: [{ name: "بۇيرۇقتىن يېنىۋال", legend: "${undo} نى بېسىڭ" }, { name: "قايتىلاش بۇيرۇقى", legend: "${redo} نى بېسىڭ" }, { name: "توملىتىش بۇيرۇقى", legend: "${bold} نى بېسىڭ" }, { name: "يانتۇ بۇيرۇقى", legend: "${italic} نى بېسىڭ" }, { name: "ئاستى سىزىق بۇيرۇقى", legend: "${underline} نى بېسىڭ" }, { name: "ئۇلانما بۇيرۇقى", legend: "${link} نى بېسىڭ" }, { name: "قورال بالداق قاتلاش بۇيرۇقى", legend: "${toolbarCollapse} نى بېسىڭ" }, { name: "ئالدىنقى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق", legend: "${accessPreviousSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ ئالدىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ." },
+ { name: "كېيىنكى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق", legend: "${accessNextSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ كەينىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ." }, { name: "توسالغۇسىز لايىھە چۈشەندۈرۈشى", legend: "${a11yHelp} نى بېسىڭ" }, { name: "ساپ تېكىست چاپلاش", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause",
+ capslock: "Caps Lock", escape: "Escape", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "سول يا ئوق", upArrow: "ئۈستى يا ئوق", rightArrow: "ئوڭ يا ئوق", downArrow: "ئاستى يا ئوق", insert: "قىستۇر", leftWindowKey: "سول Windows كۇنۇپكىسى", rightWindowKey: "ئوڭ Windows كۇنۇپكىسى", selectKey: "تاللاش كۇنۇپكىسى", numpad0: "سان تاختا 0", numpad1: "سان تاختا 1", numpad2: "سان تاختا 2", numpad3: "سان تاختا 3", numpad4: "سان تاختا 4", numpad5: "سان تاختا 5", numpad6: "سان تاختا 6", numpad7: "سان تاختا 7", numpad8: "سان تاختا 8", numpad9: "سان تاختا 9",
+ multiply: "يۇلتۇز كۇنۇپكىسى", add: "قوشۇش", subtract: "ئېلىش", decimalPoint: "كەسىر چېكىت", divide: "بۆلۈش", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "سان قۇلۇپ كۇنۇپكىسى", scrollLock: "سۈرگۈچ قۇلۇپ كۇنۇپكىسى", semiColon: "چېكىتلىك پەش", equalSign: "تەڭلىك بەلگىسى", comma: "پەش", dash: "سىزىقچە", period: "چېكىت", forwardSlash: "سولغا يانتۇ سىزىق", graveAccent: "ئۇرغۇ بەلگىسى", openBracket: "ئېچىلغان تىرناق", backSlash: "ئوڭغا يانتۇ سىزىق", closeBracket: "يېپىلغان تىرناق",
+ singleQuote: "يالاڭ پەش"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/uk.js b/plugins/a11yhelp/dialogs/lang/uk.js
new file mode 100755
index 0000000..3a58f82
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/uk.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "uk", {
+ title: "Спеціальні Інструкції", contents: "Довідка. Натисніть ESC і вона зникне.", legend: [{
+ name: "Основне", items: [{ name: "Панель Редактора", legend: "Натисніть ${toolbarFocus} для переходу до панелі інструментів. Для переміщення між групами панелі інструментів використовуйте TAB і SHIFT+TAB. Для переміщення між кнопками панелі іструментів використовуйте кнопки СТРІЛКА ВПРАВО або ВЛІВО. Натисніть ПРОПУСК або ENTER для запуску кнопки панелі інструментів." }, {
+ name: "Діалог Редактора",
+ legend: 'Усередині діалогу, натисніть TAB щоб перейти до наступного елементу діалогу, натисніть SHIFT+TAB щоб перейти до попереднього елемента діалогу, натисніть ENTER щоб відправити діалог, натисніть ESC щоб скасувати діалог. Коли діалогове вікно має декілька вкладок, отримати доступ до панелі вкладок як частині діалогу можна натисканням або поєднання ALT+F10 або TAB, при цьому активні елементи діалогу будуть перебиратися з урахуванням порядку табуляції. При активній панелі вкладок, перехід до наступної або попередньої вкладці здійснюється натисканням стрілки "ВПРАВО" або стрілки "ВЛЕВО" відповідно.'
+ },
+ { name: "Контекстне Меню Редактора", legend: "Press ${contextMenu} or APPLICATION KEY to open context-menu. Потім перейдіть до наступного пункту меню за допомогою TAB або СТРІЛКИ ВНИЗ. Натисніть ПРОПУСК або ENTER для вибору параметру меню. Відкрийте підменю поточного параметру, натиснувши ПРОПУСК або ENTER або СТРІЛКУ ВПРАВО. Перейдіть до батьківського елемента меню, натиснувши ESC або СТРІЛКУ ВЛІВО. Закрийте контекстне меню, натиснувши ESC." }, { name: "Скринька Списків Редактора", legend: "Усередині списку, перехід до наступного пункту списку виконується клавішею TAB або СТРІЛКА ВНИЗ. Перехід до попереднього елемента списку клавішею SHIFT+TAB або СТРІЛКА ВГОРУ. Натисніть ПРОПУСК або ENTER, щоб вибрати параметр списку. Натисніть клавішу ESC, щоб закрити список." },
+ { name: "Шлях до елемента редактора", legend: "Натисніть ${elementsPathFocus} для навігації між елементами панелі. Перейдіть до наступного елемента кнопкою TAB або СТРІЛКА ВПРАВО. Перейдіть до попереднього елемента кнопкою SHIFT+TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER для вибору елемента в редакторі." }]
+ }, {
+ name: "Команди", items: [{ name: "Відмінити команду", legend: "Натисніть ${undo}" }, { name: "Повторити", legend: "Натисніть ${redo}" }, { name: "Жирний", legend: "Натисніть ${bold}" }, { name: "Курсив", legend: "Натисніть ${italic}" },
+ { name: "Підкреслений", legend: "Натисніть ${underline}" }, { name: "Посилання", legend: "Натисніть ${link}" }, { name: "Згорнути панель інструментів", legend: "Натисніть ${toolbarCollapse}" }, { name: "Доступ до попереднього місця фокусування", legend: "Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування перед кареткою, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування." }, { name: "Доступ до наступного місця фокусування", legend: "Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування після каретки, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування." },
+ { name: "Допомога з доступності", legend: "Натисніть ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Esc", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "Ліва стрілка", upArrow: "Стрілка вгору", rightArrow: "Права стрілка", downArrow: "Стрілка вниз", insert: "Вставити", leftWindowKey: "Ліва клавіша Windows", rightWindowKey: "Права клавіша Windows", selectKey: "Виберіть клавішу", numpad0: "Numpad 0",
+ numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "Множення", add: "Додати", subtract: "Віднімання", decimalPoint: "Десяткова кома", divide: "Ділення", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Крапка з комою", equalSign: "Знак рівності", comma: "Кома", dash: "Тире", period: "Період",
+ forwardSlash: "Коса риска", graveAccent: "Гравіс", openBracket: "Відкрити дужку", backSlash: "Зворотна коса риска", closeBracket: "Закрити дужку", singleQuote: "Одинарні лапки"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/vi.js b/plugins/a11yhelp/dialogs/lang/vi.js
new file mode 100755
index 0000000..3d5a850
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/vi.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "vi", {
+ title: "Hướng dẫn trợ năng", contents: "Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.", legend: [{
+ name: "Chung", items: [{ name: "Thanh công cụ soạn thảo", legend: "Nhấn ${toolbarFocus} để điều hướng đến thanh công cụ. Nhấn TAB và SHIFT+TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÁI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÍM CÁCH hoặc ENTER để kích hoạt nút trên thanh công cụ." }, { name: "Hộp thoại Biên t", legend: "Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively." },
+ { name: "Trình đơn Ngữ cảnh cBộ soạn thảo", legend: "Nhấn ${contextMenu} hoặc PHÍM ỨNG DỤNG để mở thực đơn ngữ cảnh. Sau đó nhấn TAB hoặc MŨI TÊN XUỐNG để di chuyển đến tuỳ chọn tiếp theo của thực đơn. Nhấn SHIFT+TAB hoặc MŨI TÊN LÊN để quay lại tuỳ chọn trước. Nhấn DẤU CÁCH hoặc ENTER để chọn tuỳ chọn của thực đơn. Nhấn DẤU CÁCH hoặc ENTER hoặc MŨI TÊN SANG PHẢI để mở thực đơn con của tuỳ chọn hiện tại. Nhấn ESC hoặc MŨI TÊN SANG TRÁI để quay trở lại thực đơn gốc. Nhấn ESC để đóng thực đơn ngữ cảnh." },
+ { name: "Hộp danh sách trình biên tập", legend: "Trong một danh sách chọn, di chuyển đối tượng tiếp theo với phím TAB hoặc phím mũi tên hướng xuống. Di chuyển đến đối tượng trước đó bằng cách nhấn tổ hợp phím SHIFT+TAB hoặc mũi tên hướng lên. Phím khoảng cách hoặc phím ENTER để chọn các tùy chọn trong danh sách. Nhấn phím ESC để đóng lại danh sách chọn." }, { name: "Thanh đường dẫn các đối tượng", legend: "Nhấn ${elementsPathFocus} để điều hướng các đối tượng trong thanh đường dẫn. Di chuyển đến đối tượng tiếp theo bằng phím TAB hoặc phím mũi tên bên phải. Di chuyển đến đối tượng trước đó bằng tổ hợp phím SHIFT+TAB hoặc phím mũi tên bên trái. Nhấn phím khoảng cách hoặc ENTER để chọn đối tượng trong trình soạn thảo." }]
+ },
+ {
+ name: "Lệnh", items: [{ name: "Làm lại lện", legend: "Ấn ${undo}" }, { name: "Làm lại lệnh", legend: "Ấn ${redo}" }, { name: "Lệnh in đậm", legend: "Ấn ${bold}" }, { name: "Lệnh in nghiêng", legend: "Ấn ${italic}" }, { name: "Lệnh gạch dưới", legend: "Ấn ${underline}" }, { name: "Lệnh liên kết", legend: "Nhấn ${link}" }, { name: "Lệnh hiển thị thanh công cụ", legend: "Nhấn${toolbarCollapse}" }, { name: "Truy cập đến lệnh tập trung vào khoảng cách trước đó", legend: "Ấn ${accessPreviousSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách." },
+ { name: "Truy cập phần đối tượng lệnh khoảng trống", legend: "Ấn ${accessNextSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách." }, { name: "Trợ giúp liên quan", legend: "Nhấn ${a11yHelp}" }, { name: " Paste as plain text", legend: "Press ${pastetext}", legendEdge: "Press ${pastetext}, followed by ${paste}" }]
+ }], tab: "Phím Tab", pause: "Phím Pause", capslock: "Phím Caps Lock",
+ escape: "Phím Escape", pageUp: "Phím Page Up", pageDown: "Phím Page Down", leftArrow: "Phím Left Arrow", upArrow: "Phím Up Arrow", rightArrow: "Phím Right Arrow", downArrow: "Phím Down Arrow", insert: "Chèn", leftWindowKey: "Phím Left Windows", rightWindowKey: "Phím Right Windows ", selectKey: "Chọn phím", numpad0: "Phím 0", numpad1: "Phím 1", numpad2: "Phím 2", numpad3: "Phím 3", numpad4: "Phím 4", numpad5: "Phím 5", numpad6: "Phím 6", numpad7: "Phím 7", numpad8: "Phím 8", numpad9: "Phím 9", multiply: "Nhân", add: "Thêm", subtract: "Trừ", decimalPoint: "Điểm số thập phân",
+ divide: "Chia", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock", scrollLock: "Scroll Lock", semiColon: "Dấu chấm phẩy", equalSign: "Đăng nhập bằng", comma: "Dấu phẩy", dash: "Dấu gạch ngang", period: "Phím .", forwardSlash: "Phím /", graveAccent: "Phím `", openBracket: "Open Bracket", backSlash: "Dấu gạch chéo ngược", closeBracket: "Gần giá đỡ", singleQuote: "Trích dẫn"
+}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/zh-cn.js b/plugins/a11yhelp/dialogs/lang/zh-cn.js
new file mode 100755
index 0000000..3f5ad01
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/zh-cn.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","zh-cn",{title:"辅助功能说明",contents:"帮助内容。要关闭此对话框请按 ESC 键。",legend:[{name:"常规",items:[{name:"编辑器工具栏",legend:"按 ${toolbarFocus} 切换到工具栏,使用 TAB 键和 SHIFT+TAB 组合键移动到上一个和下一个工具栏组。使用左右箭头键移动到上一个或下一个工具栏按钮。按空格键或回车键以选中工具栏按钮。"},{name:"编辑器对话框",legend:"在对话框内,按 TAB 键移动到下一个字段,按 SHIFT + TAB 组合键移动到上一个字段,按 ENTER 键提交对话框,按 ESC 键取消对话框。对于有多选项卡的对话框,可以按 ALT + F10 直接切换到或者按 TAB 键逐步移到选项卡列表,当焦点移到选项卡列表时可以用左右箭头键来移动到前后的选项卡。"},{name:"编辑器上下文菜单",legend:"用 ${contextMenu} 或者“应用程序键”打开上下文菜单。然后用 TAB 键或者下箭头键来移动到下一个菜单项;SHIFT + TAB 组合键或者上箭头键移动到上一个菜单项。用 SPACE 键或者 ENTER 键选择菜单项。用 SPACE 键,ENTER 键或者右箭头键打开子菜单。返回菜单用 ESC 键或者左箭头键。用 ESC 键关闭上下文菜单。"},
+{name:"编辑器列表框",legend:"在列表框中,移到下一列表项用 TAB 键或者下箭头键。移到上一列表项用SHIFT+TAB 组合键或者上箭头键,用 SPACE 键或者 ENTER 键选择列表项。用 ESC 键收起列表框。"},{name:"编辑器元素路径栏",legend:"按 ${elementsPathFocus} 以导航到元素路径栏,使用 TAB 键或右箭头键选择下一个元素,使用 SHIFT+TAB 组合键或左箭头键选择上一个元素,按空格键或回车键以选定编辑器里的元素。"}]},{name:"命令",items:[{name:" 撤消命令",legend:"按 ${undo}"},{name:" 重做命令",legend:"按 ${redo}"},{name:" 加粗命令",legend:"按 ${bold}"},{name:" 倾斜命令",legend:"按 ${italic}"},{name:" 下划线命令",legend:"按 ${underline}"},{name:" 链接命令",legend:"按 ${link}"},{name:" 工具栏折叠命令",legend:"按 ${toolbarCollapse}"},
+{name:"访问前一个焦点区域的命令",legend:"按 ${accessPreviousSpace} 访问^符号前最近的不可访问的焦点区域,例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。"},{name:"访问下一个焦点区域命令",legend:"按 ${accessNextSpace} 以访问^符号后最近的不可访问的焦点区域。例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。"},{name:"辅助功能帮助",legend:"按 ${a11yHelp}"},{name:"粘贴为纯文本",legend:"按 ${pastetext}",legendEdge:"按 ${pastetext},然后再按 ${paste}"}]}],tab:"Tab 键",pause:"暂停键",capslock:"大写锁定键",escape:"Esc 键",pageUp:"上翻页键",pageDown:"下翻页键",leftArrow:"向左箭头键",upArrow:"向上箭头键",rightArrow:"向右箭头键",downArrow:"向下箭头键",insert:"插入键",
+leftWindowKey:"左 WIN 键",rightWindowKey:"右 WIN 键",selectKey:"选择键",numpad0:"小键盘 0 键",numpad1:"小键盘 1 键",numpad2:"小键盘 2 键",numpad3:"小键盘 3 键",numpad4:"小键盘 4 键",numpad5:"小键盘 5 键",numpad6:"小键盘 6 键",numpad7:"小键盘 7 键",numpad8:"小键盘 8 键",numpad9:"小键盘 9 键",multiply:"星号键",add:"加号键",subtract:"减号键",decimalPoint:"小数点键",divide:"除号键",f1:"F1 键",f2:"F2 键",f3:"F3 键",f4:"F4 键",f5:"F5 键",f6:"F6 键",f7:"F7 键",f8:"F8 键",f9:"F9 键",f10:"F10 键",f11:"F11 键",f12:"F12 键",numLock:"数字锁定键",scrollLock:"滚动锁定键",semiColon:"分号键",equalSign:"等号键",
+comma:"逗号键",dash:"短划线键",period:"句号键",forwardSlash:"斜杠键",graveAccent:"重音符键",openBracket:"左中括号键",backSlash:"反斜杠键",closeBracket:"右中括号键",singleQuote:"单引号键"}); \ No newline at end of file
diff --git a/plugins/a11yhelp/dialogs/lang/zh.js b/plugins/a11yhelp/dialogs/lang/zh.js
new file mode 100755
index 0000000..d521ef8
--- /dev/null
+++ b/plugins/a11yhelp/dialogs/lang/zh.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("a11yhelp", "zh", {
+ title: "輔助工具指南", contents: "說明內容。若要關閉此對話框請按「ESC」。", legend: [{
+ name: "一般", items: [{ name: "編輯器工具列", legend: "請按 ${toolbarFocus} 以導覽到工具列。利用 TAB 或 SHIFT+TAB 以便移動到下一個及前一個工具列群組。利用右方向鍵或左方向鍵以便移動到下一個及上一個工具列按鈕。按下空白鍵或 ENTER 鍵啟用工具列按鈕。" }, { name: "編輯器對話方塊", legend: "在對話框中,按下 TAB 鍵以導覽到下一個對話框元素,按下 SHIFT+TAB 以移動到上一個對話框元素,按下 ENTER 以遞交對話框,按下 ESC 以取消對話框。當對話框有多個分頁時,可以使用 ALT+F10 或是在對話框分頁順序中的一部份按下 TAB 以使用分頁列表。焦點在分頁列表上時,分別使用右方向鍵及左方向鍵移動到下一個及上一個分頁。" }, { name: "編輯器內容功能表", legend: "請按下「${contextMenu}」或是「應用程式鍵」以開啟內容選單。以「TAB」或是「↓」鍵移動到下一個選單選項。以「SHIFT + TAB」或是「↑」鍵移動到上一個選單選項。按下「空白鍵」或是「ENTER」鍵以選取選單選項。以「空白鍵」或「ENTER」或「→」開啟目前選項之子選單。以「ESC」或「←」回到父選單。以「ESC」鍵關閉內容選單」。" },
+ { name: "編輯器清單方塊", legend: "在清單方塊中,使用 TAB 或下方向鍵移動到下一個列表項目。使用 SHIFT+TAB 或上方向鍵移動到上一個列表項目。按下空白鍵或 ENTER 以選取列表選項。按下 ESC 以關閉清單方塊。" }, { name: "編輯器元件路徑工具列", legend: "請按 ${elementsPathFocus} 以瀏覽元素路徑列。利用 TAB 或右方向鍵以便移動到下一個元素按鈕。利用 SHIFT 或左方向鍵以便移動到上一個按鈕。按下空白鍵或 ENTER 鍵來選取在編輯器中的元素。" }]
+ }, {
+ name: "命令", items: [{ name: "復原命令", legend: "請按下「${undo}」" }, { name: "重複命令", legend: "請按下「 ${redo}」" }, { name: "粗體命令", legend: "請按下「${bold}」" }, { name: "斜體", legend: "請按下「${italic}」" }, { name: "底線命令", legend: "請按下「${underline}」" }, { name: "連結", legend: "請按下「${link}」" },
+ { name: "隱藏工具列", legend: "請按下「${toolbarCollapse}」" }, { name: "存取前一個焦點空間命令", legend: "請按下 ${accessPreviousSpace} 以存取最近但無法靠近之插字符號前的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。" }, { name: "存取下一個焦點空間命令", legend: "請按下 ${accessNextSpace} 以存取最近但無法靠近之插字符號後的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。" }, { name: "協助工具說明", legend: "請按下「${a11yHelp}」" }, { name: "以純文字貼上", legend: "按 ${pastetext}", legendEdge: "按 ${pastetext},再來是 ${paste}" }]
+ }], tab: "Tab", pause: "Pause", capslock: "Caps Lock", escape: "Esc", pageUp: "Page Up", pageDown: "Page Down", leftArrow: "向左箭號",
+ upArrow: "向上鍵號", rightArrow: "向右鍵號", downArrow: "向下鍵號", insert: "插入", leftWindowKey: "左方 Windows 鍵", rightWindowKey: "右方 Windows 鍵", selectKey: "選擇鍵", numpad0: "Numpad 0", numpad1: "Numpad 1", numpad2: "Numpad 2", numpad3: "Numpad 3", numpad4: "Numpad 4", numpad5: "Numpad 5", numpad6: "Numpad 6", numpad7: "Numpad 7", numpad8: "Numpad 8", numpad9: "Numpad 9", multiply: "乘號", add: "新增", subtract: "減號", decimalPoint: "小數點", divide: "除號", f1: "F1", f2: "F2", f3: "F3", f4: "F4", f5: "F5", f6: "F6", f7: "F7", f8: "F8", f9: "F9", f10: "F10", f11: "F11", f12: "F12", numLock: "Num Lock",
+ scrollLock: "Scroll Lock", semiColon: "分號", equalSign: "等號", comma: "逗號", dash: "虛線", period: "句點", forwardSlash: "斜線", graveAccent: "抑音符號", openBracket: "左方括號", backSlash: "反斜線", closeBracket: "右方括號", singleQuote: "單引號"
+}); \ No newline at end of file
diff --git a/plugins/about/dialogs/about.js b/plugins/about/dialogs/about.js
new file mode 100755
index 0000000..90e5fb2
--- /dev/null
+++ b/plugins/about/dialogs/about.js
@@ -0,0 +1,16 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("about", function(a) {
+ a = a.lang.about; var b = CKEDITOR.getUrl(CKEDITOR.plugins.get("about").path + "dialogs/" + (CKEDITOR.env.hidpi ? "hidpi/" : "") + "logo_ckeditor.png"); return {
+ title: a.dlgTitle, minWidth: 390, minHeight: 210, contents: [{
+ id: "tab1", label: "", title: "", expand: !0, padding: 0, elements: [{
+ type: "html", html: '\x3cstyle type\x3d"text/css"\x3e.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url(' +
+ b + ");" + (CKEDITOR.env.hidpi ? "background-size:194px 58px;" : "") + 'background-position:center; background-repeat:no-repeat;margin-bottom:10px;}.cke_about_container a{cursor:pointer !important;color:#00B2CE !important;text-decoration:underline !important;}.cke_about_container \x3e p,.cke_rtl .cke_about_container \x3e p{text-align:center;}\x3c/style\x3e\x3cdiv class\x3d"cke_about_container"\x3e\x3cdiv class\x3d"cke_about_logo"\x3e\x3c/div\x3e\x3cp\x3eCKEditor ' + CKEDITOR.version + " (revision " + CKEDITOR.revision +
+ ')\x3cbr\x3e\x3ca target\x3d"_blank" rel\x3d"noopener noreferrer" href\x3d"https://ckeditor.com/"\x3ehttps://ckeditor.com\x3c/a\x3e\x3c/p\x3e\x3cp\x3e' + a.moreInfo + '\x3cbr\x3e\x3ca target\x3d"_blank" rel\x3d"noopener noreferrer" href\x3d"https://ckeditor.com/legal/ckeditor-oss-license/"\x3ehttps://ckeditor.com/legal/ckeditor-oss-license/\x3c/a\x3e\x3c/p\x3e\x3cp\x3e' + a.copy.replace("$1", '\x3ca target\x3d"_blank" rel\x3d"noopener noreferrer" href\x3d"https://cksource.com/"\x3eCKSource\x3c/a\x3e - Frederico Knabben') +
+ "\x3c/p\x3e\x3c/div\x3e"
+ }]
+ }], buttons: [CKEDITOR.dialog.cancelButton]
+ }
+}); \ No newline at end of file
diff --git a/plugins/about/dialogs/hidpi/logo_ckeditor.png b/plugins/about/dialogs/hidpi/logo_ckeditor.png
new file mode 100755
index 0000000..d6c8839
--- /dev/null
+++ b/plugins/about/dialogs/hidpi/logo_ckeditor.png
Binary files differ
diff --git a/plugins/about/dialogs/logo_ckeditor.png b/plugins/about/dialogs/logo_ckeditor.png
new file mode 100755
index 0000000..cdf17c0
--- /dev/null
+++ b/plugins/about/dialogs/logo_ckeditor.png
Binary files differ
diff --git a/plugins/accordionList/LICENSE b/plugins/accordionList/LICENSE
new file mode 100755
index 0000000..9cecc1d
--- /dev/null
+++ b/plugins/accordionList/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {one line to give the program's name and a brief idea of what it does.}
+ Copyright (C) {year} {name of author}
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ {project} Copyright (C) {year} {fullname}
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/plugins/accordionList/README.md b/plugins/accordionList/README.md
new file mode 100755
index 0000000..18dfafc
--- /dev/null
+++ b/plugins/accordionList/README.md
@@ -0,0 +1,14 @@
+# Bootstrap Accordion List
+A plugin for ckeditor to allow creation of bootstrap accordion list (grouped collapsible items).
+
+This allows grouping of collapsible elements in a accordion list.
+Requires the following ckeditor Plugins:
+ - Widget
+ - [Bootstrap Collapsible Item](https://github.com/pkerspe/ckeditor-bootstrap-collapsibleItem)
+
+This plugin will add a new widget to allow you to create an accordion list in ckeditor without the need to work in source-code view.
+Allows drag and drop rearrangement of collapsible items in one group.
+
+# Version history:
+
+- __V 0.1__: First version with basic functionality
diff --git a/plugins/accordionList/icons/accordionlist.png b/plugins/accordionList/icons/accordionlist.png
new file mode 100755
index 0000000..5e21705
--- /dev/null
+++ b/plugins/accordionList/icons/accordionlist.png
Binary files differ
diff --git a/plugins/accordionList/icons/hidpi/accordionlist.png b/plugins/accordionList/icons/hidpi/accordionlist.png
new file mode 100755
index 0000000..7a14db8
--- /dev/null
+++ b/plugins/accordionList/icons/hidpi/accordionlist.png
Binary files differ
diff --git a/plugins/accordionList/plugin.js b/plugins/accordionList/plugin.js
new file mode 100755
index 0000000..7b5383d
--- /dev/null
+++ b/plugins/accordionList/plugin.js
@@ -0,0 +1,60 @@
+CKEDITOR.plugins.add('accordionList', {
+ requires: 'widget,collapsibleItem',
+ icons: 'accordionlist',
+ hidpi: true,
+ init: function(editor) {
+ editor.widgets.add('accordionList', {
+ button: 'Insert a new Accordion List',
+ template: '<div class="accordion-list">' +
+ ' <div class="panel-group accordion-list-group accordion-list-items" id="unknown" role="tablist" aria-multiselectable="true"></div>' +
+ '</div>',
+ editables: {
+ content: {
+ selector: 'div.accordion-list-items',
+ allowedContent: 'div(!collapsible-item*,panel*,collapse)[*];h4(!collapsible-item*,panel*)[*];a(!collapsible-item*,panel*,collapsed,pull-right*)[*];p;br;ul;ol;li;strong;em;u;table[*];tbody;theader;tr;td;th;hr;a;a(*)[*];span(*)[*];img(*)[*]'
+ }
+ },
+ allowedContent: 'div(!accordion-list*)[*];',
+ requiredContent: 'div(accordion-list)',
+ upcast: function(element) {
+ return element.name == 'div' && element.hasClass('accordion-list');
+ },
+ init: function() {
+ var idPrefix = 'accordion';
+
+ this.setData('accordionId', idPrefix + (new Date()).getTime());
+
+ var editable = this.editables.content;
+ var editorForElement = editable.editor;
+
+ editable.enterMode = 2;
+ editorForElement.setActiveEnterMode(CKEDITOR.ENTER_BR, CKEDITOR.ENTER_BR);
+
+ //prevent entering any data via keyboard, since we only want nested widgets in here
+ editable.on('keydown', function(event) {
+ console.log("down", event);
+ if (event.data.$.target.id.indexOf(idPrefix) == 0) {
+ event.data.$.preventDefault();
+ event.data.$.stopPropagation();
+ }
+ });
+ },
+ data: function() {
+ //called whenever the data is updated
+ var accordionElement = this.element.find('.accordion-list-items').$[0];
+
+ if (accordionElement.getAttribute('id') == 'unknown') {
+ accordionElement.setAttribute('id', this.data.accordionId);
+ }
+ },
+ });
+ },
+ onLoad: function() {
+ CKEDITOR.addCss(
+ '.accordion-list::before {font-size:10px;color:#000;content: "Bootstrap Accordion"} ' +
+ '.accordion-list {padding: 8px;background: #eee;border-radius: 8px;border: 1px solid #ddd;box-shadow: 0 1px 1px #fff inset, 0 -1px 0px #ccc inset;}' +
+ '.accordion-list-items {padding: 0 8px;box-shadow: 0 1px 1px #ddd inset;border: 1px solid #cccccc;border-radius: 5px;background: #fff;}' +
+ '.accordion-list-items::before {font-size:14px;color:#ccc;content: "Insert collapsible items here"; position:relative;} '
+ );
+ }
+});
diff --git a/plugins/bootstrapMediaEmbed/icons/bootstrapmediaembed.png b/plugins/bootstrapMediaEmbed/icons/bootstrapmediaembed.png
new file mode 100755
index 0000000..50cfbf9
--- /dev/null
+++ b/plugins/bootstrapMediaEmbed/icons/bootstrapmediaembed.png
Binary files differ
diff --git a/plugins/bootstrapMediaEmbed/icons/hidpi/bootstrapmediaembed.png b/plugins/bootstrapMediaEmbed/icons/hidpi/bootstrapmediaembed.png
new file mode 100755
index 0000000..ab7112c
--- /dev/null
+++ b/plugins/bootstrapMediaEmbed/icons/hidpi/bootstrapmediaembed.png
Binary files differ
diff --git a/plugins/bootstrapMediaEmbed/lang/en.js b/plugins/bootstrapMediaEmbed/lang/en.js
new file mode 100755
index 0000000..54164a2
--- /dev/null
+++ b/plugins/bootstrapMediaEmbed/lang/en.js
@@ -0,0 +1,19 @@
+/***
+ * @author Domenico Gigante [reloadlab.it]
+ * @version 1.0
+ ***/
+
+// set CKeditor lang
+CKEDITOR.plugins.setLang('bootstrapMediaEmbed', 'en', {
+ toolbar: 'Embed Media',
+ dialogTitle: 'Embed Media',
+ dialogRatio: 'Choose media ratio',
+ selectRatio: [
+ 'Original size',
+ 'Ratio 21:9',
+ 'Ratio 16:9',
+ 'Ratio 4:3',
+ 'Ratio 1:1'
+ ],
+ dialogArea: 'Paste Embed Code Here'
+}); \ No newline at end of file
diff --git a/plugins/bootstrapMediaEmbed/lang/it.js b/plugins/bootstrapMediaEmbed/lang/it.js
new file mode 100755
index 0000000..61262e7
--- /dev/null
+++ b/plugins/bootstrapMediaEmbed/lang/it.js
@@ -0,0 +1,19 @@
+/***
+ * @author Domenico Gigante [reloadlab.it]
+ * @version 1.0
+ ***/
+
+// set CKeditor lang
+CKEDITOR.plugins.setLang('bootstrapMediaEmbed', 'it', {
+ toolbar: 'Incorporamento codice video',
+ dialogTitle: 'Incorpora codice video',
+ dialogRatio: 'Scegli le proporzioni del video',
+ selectRatio: [
+ 'Dimensioni originali',
+ 'Proporzione 21:9',
+ 'Proporzione 16:9',
+ 'Proporzione 4:3',
+ 'Proporzione 1:1'
+ ],
+ dialogArea: 'Incolla qui il codice da incorporare'
+}); \ No newline at end of file
diff --git a/plugins/bootstrapMediaEmbed/plugin.js b/plugins/bootstrapMediaEmbed/plugin.js
new file mode 100755
index 0000000..56eebca
--- /dev/null
+++ b/plugins/bootstrapMediaEmbed/plugin.js
@@ -0,0 +1,159 @@
+/***
+ * Bootstrap 4 Embed Media Dialog for ckEditor 4 based on Fabian Vogelsteller's Embed Media Dialog on https://github.com/frozeman/MediaEmbed
+ *
+ * Wrap any embed like an <iframe> in a parent element with .embed-responsive and an aspect ratio.
+ * The plugin allows you to insert multiple iframes at the same time, managed as separate elements.
+ * Bootstrap classes for responsive embed are applied only to iframe, video, embed and object tags.
+ * The other tags are not modified in any way.
+ *
+ * Plugin name: bootstrapMediaEmbed
+ * Menu button name: BootstrapMediaEmbed
+ *
+ * Youtube Editor Icon
+ * http://paulrobertlloyd.com/
+ *
+ * @author Domenico Gigante [reloadlab.it]
+ * @version 1.0
+ ***/
+(function() {
+ CKEDITOR.plugins.add('bootstrapMediaEmbed',
+ {
+ icons: 'bootstrapmediaembed', // %REMOVE_LINE_CORE%
+ hidpi: true, // %REMOVE_LINE_CORE%
+ lang: 'en,it',
+ init: function(editor) {
+
+ // Bootstrap Embedable element
+ var embedable = [
+ 'iframe',
+ 'embed',
+ 'video',
+ 'object'
+ ];
+
+ // Bootstrap embed responsive ratio
+ var ratio = [
+ 'embed-responsive-21by9',
+ 'embed-responsive-16by9',
+ 'embed-responsive-4by3',
+ 'embed-responsive-1by1'
+ ];
+
+ var me = this;
+ CKEDITOR.dialog.add('BootstrapMediaEmbedDialog', function(instance) {
+
+ return {
+ title: editor.lang.bootstrapMediaEmbed.dialogTitle,
+ minWidth: 550,
+ minHeight: 200,
+ contents: [
+ {
+ id: 'iframe',
+ expand: true,
+ elements: [
+ {
+ id: 'embedArea',
+ type: 'textarea',
+ label: editor.lang.bootstrapMediaEmbed.dialogArea,
+ 'autofocus': 'autofocus',
+ setup: function(element) {
+ },
+ commit: function(element) {
+ }
+ },
+ {
+ id: 'selectRatio',
+ type: 'select',
+ label: editor.lang.bootstrapMediaEmbed.dialogRatio,
+ items: [
+ [editor.lang.bootstrapMediaEmbed.selectRatio[0], 'none'],
+ [editor.lang.bootstrapMediaEmbed.selectRatio[1], 0],
+ [editor.lang.bootstrapMediaEmbed.selectRatio[2], 1],
+ [editor.lang.bootstrapMediaEmbed.selectRatio[3], 2],
+ [editor.lang.bootstrapMediaEmbed.selectRatio[4], 3]
+ ],
+ 'default': 'none'
+ }
+ ]
+ }
+ ],
+ onOk: function() {
+
+ // Embed Textarea value
+ var ea = this.getContentElement('iframe', 'embedArea').getValue();
+
+ // Responsive Ratio Select value
+ var rr = this.getContentElement('iframe', 'selectRatio').getValue();
+
+ if (ea && ea.trim() != '') {
+
+ // Temporary div container
+ var tmp = instance.document.createElement('div');
+
+ tmp.setHtml(ea);
+
+ // Elements to insert in Editor
+ var ch = tmp.getChildren();
+
+ var elem;
+ while (elem = ch.getItem(0)) {
+
+ // Node name equal to iframe, video, embed or object
+ if (embedable.indexOf(elem.getName()) != -1) {
+
+ // Container div
+ var div = instance.document.createElement('div');
+
+ // Add Bootstrap's css class for responsive design
+ if (ratio[rr]) {
+
+ div.setAttribute('class', 'embed-responsive ' + ratio[rr]);
+
+ elem.setAttribute('class', 'embed-responsive-item');
+ }
+
+ // Append element to container
+ div.append(elem);
+
+ // Insert into Editor
+ instance.insertElement(div);
+ }
+ // None of embedable elements
+ else {
+
+ // Container div
+ var div = instance.document.createElement('div');
+
+ // Append element to container
+ div.append(elem);
+
+ // Insert into Editor
+ instance.insertElement(div);
+ }
+ }
+
+ // Remove temporary div to free memory
+ tmp.remove();
+ }
+ }
+ };
+ });
+
+ editor.addCommand('BootstrapMediaEmbed',
+ new CKEDITOR.dialogCommand('BootstrapMediaEmbedDialog',
+ {
+ allowedContent: 'iframe[*],video[*],audio[*],source[*],embed[*],object[*]'
+ }
+ )
+ );
+
+ editor.ui.addButton('BootstrapMediaEmbed',
+ {
+ label: editor.lang.bootstrapMediaEmbed.toolbar,
+ command: 'BootstrapMediaEmbed',
+ toolbar: 'bootstrapMediaEmbed'
+ }
+ );
+ }
+ });
+})();
diff --git a/plugins/bootstrapTabs/LICENSE-GPL b/plugins/bootstrapTabs/LICENSE-GPL
new file mode 100755
index 0000000..9cecc1d
--- /dev/null
+++ b/plugins/bootstrapTabs/LICENSE-GPL
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {one line to give the program's name and a brief idea of what it does.}
+ Copyright (C) {year} {name of author}
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ {project} Copyright (C) {year} {fullname}
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/plugins/bootstrapTabs/LICENSE-LGPL b/plugins/bootstrapTabs/LICENSE-LGPL
new file mode 100755
index 0000000..65c5ca8
--- /dev/null
+++ b/plugins/bootstrapTabs/LICENSE-LGPL
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/plugins/bootstrapTabs/LICENSE-MPL b/plugins/bootstrapTabs/LICENSE-MPL
new file mode 100755
index 0000000..a612ad9
--- /dev/null
+++ b/plugins/bootstrapTabs/LICENSE-MPL
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/plugins/bootstrapTabs/README.md b/plugins/bootstrapTabs/README.md
new file mode 100755
index 0000000..e2cee89
--- /dev/null
+++ b/plugins/bootstrapTabs/README.md
@@ -0,0 +1,11 @@
+# ckeditor-bootstrap-tabs
+A plugin for CKEditor that allows for the user to insert and edit a specified number of Bootstrap tabs.
+
+![ckeditor-bootstrap-tabs screenshot](#)
+
+## Demo
+Check out the demo at #
+
+## Installation
+1. Download the zip file.
+- Extract the contents to your CKEditor plugins directory: `/path/to/ckeditor/plugins/bootstrapTabs`.
diff --git a/plugins/bootstrapTabs/dialogs/bootstrapTabs.js b/plugins/bootstrapTabs/dialogs/bootstrapTabs.js
new file mode 100755
index 0000000..503c605
--- /dev/null
+++ b/plugins/bootstrapTabs/dialogs/bootstrapTabs.js
@@ -0,0 +1,30 @@
+CKEDITOR.dialog.add("bootstrapTabsDialog", function(b) {
+ return {
+ title: b.lang.bootstrapTabs.dialogTitle, minWidth: 310, minHeight: 280, contents: [{
+ id: "tab-basic", label: b.lang.bootstrapTabs.tabBasicLabel, elements: [{ type: "html", html: b.lang.bootstrapTabs.infoHtml }, { type: "text", id: "tab-set-title", label: b.lang.bootstrapTabs.tabSetTitleLabel, validate: CKEDITOR.dialog.validate.notEmpty(b.lang.bootstrapTabs.invalidTabSetTitle), setup: function(a) { a = a.data("tab-set-title"); this.setValue(a) } }, {
+ type: "select", id: "number-of-tabs",
+ label: b.lang.bootstrapTabs.numberOfTabsLabel, "default": 4, items: [["2"], ["3"], ["4"], ["5"], ["6"], ["7"], ["8"], ["9"]], validate: CKEDITOR.dialog.validate.notEmpty(b.lang.bootstrapTabs.invalidNumberOfTabs), setup: function(a) { a = a.find(".nav.nav-tabs li a.tab-link").count(); this.setValue(a) }
+ }, { type: "html", html: '\x3chr style\x3d"display: block;position: relative;padding: 0;margin: 8px auto;width: 100%;max-height: 0;font-size: 1px;line-height: 0;clear: both;border: none;border-top: 1px solid #aaaaaa;border-bottom: 1px solid #ffffff;"/\x3e' },
+ { type: "select", id: "tab-to-remove", label: b.lang.bootstrapTabs.removeTabLabel, "default": b.lang.bootstrapTabs.removeTabDefault, items: [[b.lang.bootstrapTabs.removeTabDefault]], setup: function(a) { this.clear().add(b.lang.bootstrapTabs.removeTabDefault); a = a.findOne(".nav.nav-tabs").find("li"); for (i = 0; i < a.count(); i++)this.add(a.getItem(i).findOne("a.tab-link").getText()) } }]
+ }], onShow: function() {
+ var a = b.getSelection().getStartElement(); a && (ascendant = a.getAscendant(function(a) {
+ return a instanceof CKEDITOR.dom.document ?
+ !1 : a.hasClass("bootstrap-tabs")
+ })); ascendant ? (this.insertMode = !1, a = ascendant) : this.insertMode = !0; this.element = a; this.insertMode || this.setupContent(a)
+ }, onOk: function() {
+ var a = this.getValueOf("tab-basic", "number-of-tabs"), e = this.getValueOf("tab-basic", "tab-set-title"), g = this.getValueOf("tab-basic", "tab-to-remove"); if (this.insertMode) {
+ d = CKEDITOR.dom.element.createFromHtml('\x3cdiv class\x3d"bootstrap-tabs"\x3e\x3cul class\x3d"nav nav-tabs" role\x3d"tablist"\x3e\x3c!-- add tabs here --\x3e\x3c/ul\x3e\x3cdiv class\x3d"tab-content"\x3e\x3c!-- add tab panels here --\x3e\x3c/div\x3e\x3c/div\x3e');
+ for (c = 1; c <= a; c++)appendTabToElement(b, this, d, a, c); b.insertElement(d)
+ } else {
+ var d = this.element, f = d.find(".nav.nav-tabs li a.tab-link").count(); d.data("tab-set-title"); for (var k = d.findOne("ul.nav.nav-tabs"), l = d.findOne("div.tab-content"), h = k.find("li"), m = l.find("div.tab-pane"), c = 0; c < h.count(); c++)g === h.getItem(c).findOne("a.tab-link").getText() && h.count() === m.count() && (h.getItem(c).remove(), m.getItem(c).remove()); if (a > f) {
+ k.findOne(".active").removeClass("active"); l.findOne(".active").removeClass("active");
+ for (var c = f + 1; c <= a; c++)appendTabToElement(b, this, d, a, c)
+ }
+ } d.data("tab-set-title", e)
+ }
+ }
+});
+function appendTabToElement(b, a, e, g, d) {
+ a = a.getValueOf("tab-basic", "tab-set-title"); b = "Tab " + d; var f = (a + " " + b).replace(/(\W+|\s+|_|-+)/g, "-").replace(/-+/g, "-").toLowerCase(); a = '\x3cdiv role\x3d"tabpanel" class\x3d"tab-pane" id\x3d"' + f + '"\x3e' + ('\x3cdiv class\x3d"tab-pane-content"\x3e' + b + " Content\x3c/div\x3e") + "\x3c/div\x3e"; b = new CKEDITOR.dom.element.createFromHtml('\x3cli role\x3d"presentation"\x3e\x3ca class\x3d"tab-link" href\x3d"#' + f + '" aria-controls\x3d"' + f + '" role\x3d"tab" data-toggle\x3d"tab"\x3e' +
+ b + " Name\x3c/a\x3e\x3c/li\x3e"); a = new CKEDITOR.dom.element.createFromHtml(a); d == g && (b.addClass("active"), a.addClass("active")); g = e.findOne("ul.nav.nav-tabs"); e = e.findOne("div.tab-content"); g.append(b); e.append(a)
+}; \ No newline at end of file
diff --git a/plugins/bootstrapTabs/icons/bootstrapTabs.png b/plugins/bootstrapTabs/icons/bootstrapTabs.png
new file mode 100755
index 0000000..a1d57e0
--- /dev/null
+++ b/plugins/bootstrapTabs/icons/bootstrapTabs.png
Binary files differ
diff --git a/plugins/bootstrapTabs/sample/bootstrapTabs.html b/plugins/bootstrapTabs/sample/bootstrapTabs.html
new file mode 100755
index 0000000..7fd8a68
--- /dev/null
+++ b/plugins/bootstrapTabs/sample/bootstrapTabs.html
@@ -0,0 +1,36 @@
+<div class="bootstrap-tabs" data-number-of-tabs="4" data-tab-set-title="sample">
+ <ul class="nav nav-tabs" role="tablist">
+ <!-- add tabs here -->
+ <li class="active" role="presentation">
+ <a aria-controls="sample-tab-1" class="tab-link" data-toggle="tab" href="#sample-tab-1" role="tab">Tab 1
+ Name</a>
+ </li>
+ <li role="presentation">
+ <a aria-controls="sample-tab-2" class="tab-link" data-toggle="tab" href="#sample-tab-2" role="tab">Tab 2
+ Name</a>
+ </li>
+ <li role="presentation">
+ <a aria-controls="sample-tab-3" class="tab-link" data-toggle="tab" href="#sample-tab-3" role="tab">Tab 3
+ Name</a>
+ </li>
+ <li role="presentation">
+ <a aria-controls="sample-tab-4" class="tab-link" data-toggle="tab" href="#sample-tab-4" role="tab">Tab 4
+ Name</a>
+ </li>
+ </ul>
+ <div class="tab-content">
+ <!-- add tab panels here -->
+ <div class="tab-pane active" id="sample-tab-1" role="tabpanel">
+ <div class="tab-pane-content">Tab 1 Content</div>
+ </div>
+ <div class="tab-pane" id="sample-tab-2" role="tabpanel">
+ <div class="tab-pane-content">Tab 2 Content</div>
+ </div>
+ <div class="tab-pane" id="sample-tab-3" role="tabpanel">
+ <div class="tab-pane-content">Tab 3 Content</div>
+ </div>
+ <div class="tab-pane" id="sample-tab-4" role="tabpanel">
+ <div class="tab-pane-content">Tab 4 Content</div>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/plugins/bt_table/LICENSE b/plugins/bt_table/LICENSE
new file mode 100755
index 0000000..8cdb845
--- /dev/null
+++ b/plugins/bt_table/LICENSE
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {description}
+ Copyright (C) {year} {fullname}
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ {signature of Ty Coon}, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
diff --git a/plugins/bt_table/README.md b/plugins/bt_table/README.md
new file mode 100755
index 0000000..7d83ef2
--- /dev/null
+++ b/plugins/bt_table/README.md
@@ -0,0 +1,18 @@
+# Bootstrap 3 table plugin for CKEditor 4
+
+This plugin is built on top original table plugin. This is really 80% same code with lots of modifications some simplifications.
+
+It will just replace some original table plugin functionality and adds Bootstrap 3 options.
+
+##Installation
+
+Add this plugin to CKEditor folder/plugins
+
+config.extraPlugins = 'language';
+
+You may read more about manual installation at http://docs.ckeditor.com/#!/guide/dev_plugins
+
+## Other Bootstrap 3 software for CKEditor 4
+Bootstrap 3 Quicktable https://github.com/kaido24/btquicktable
+
+Bootstrap 3 grid https://github.com/kaido24/btgrid
diff --git a/plugins/bt_table/dialogs/table.js b/plugins/bt_table/dialogs/table.js
new file mode 100755
index 0000000..ebc4761
--- /dev/null
+++ b/plugins/bt_table/dialogs/table.js
@@ -0,0 +1,58 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function() {
+ function t(d) { for (var e = 0, m = 0, a = 0, n, b = d.$.rows.length; a < b; a++) { n = d.$.rows[a]; for (var c = e = 0, p, g = n.cells.length; c < g; c++)p = n.cells[c], e += p.colSpan; e > m && (m = e) } return m } function q(d) { return function() { var e = this.getValue(), e = !!(CKEDITOR.dialog.validate.integer()(e) && 0 < e); e || (alert(d), this.select()); return e } } function r(d, e) {
+ var m = function(a) { return new CKEDITOR.dom.element(a, d.document) }; d.editable(); return {
+ title: d.lang.table.title, minWidth: 310, minHeight: CKEDITOR.env.ie ? 310 : 280, onShow: function() {
+ var a =
+ d.getSelection(), n = a.getRanges(), b, c = this.getContentElement("info", "txtRows"), p = this.getContentElement("info", "txtCols"); "tableProperties" == e && ((a = a.getSelectedElement()) && a.is("table") ? b = a : 0 < n.length && (CKEDITOR.env.webkit && n[0].shrink(CKEDITOR.NODE_ELEMENT), b = d.elementPath(n[0].getCommonAncestor(!0)).contains("table", 1)), this._.selectedElement = b); b ? (this.setupContent(b), c && c.disable(), p && p.disable()) : (c && c.enable(), p && p.enable())
+ }, onOk: function() {
+ var a = d.getSelection(), n = this._.selectedElement &&
+ a.createBookmarks(), b = this._.selectedElement || m("table"), c = {}; this.commitContent(c, b); if (c.info) {
+ var e = c.info; if (!this._.selectedElement) for (var g = b.append(m("tbody")), l = parseInt(e.txtRows, 10) || 0, f = parseInt(e.txtCols, 10) || 0, c = 0; c < l; c++)for (var h = g.append(m("tr")), k = 0; k < f; k++)h.append(m("td")).appendBogus(); l = e.selHeaders; if (!b.$.tHead && ("row" == l || "both" == l)) {
+ h = new CKEDITOR.dom.element(b.$.createTHead()); g = b.getElementsByTag("tbody").getItem(0); g = g.getElementsByTag("tr").getItem(0); for (c = 0; c < g.getChildCount(); c++)f =
+ g.getChild(c), f.type != CKEDITOR.NODE_ELEMENT || f.data("cke-bookmark") || (f.renameNode("th"), f.setAttribute("scope", "col")); h.append(g.remove())
+ } if (null !== b.$.tHead && "row" != l && "both" != l) { h = new CKEDITOR.dom.element(b.$.tHead); g = b.getElementsByTag("tbody").getItem(0); for (k = g.getFirst(); 0 < h.getChildCount();) { g = h.getFirst(); for (c = 0; c < g.getChildCount(); c++)f = g.getChild(c), f.type == CKEDITOR.NODE_ELEMENT && (f.renameNode("td"), f.removeAttribute("scope")); g.insertBefore(k) } h.remove() } if (!this.hasColumnHeaders &&
+ ("col" == l || "both" == l)) for (h = 0; h < b.$.rows.length; h++)f = new CKEDITOR.dom.element(b.$.rows[h].cells[0]), f.renameNode("th"), f.setAttribute("scope", "row"); if (this.hasColumnHeaders && "col" != l && "both" != l) for (c = 0; c < b.$.rows.length; c++)h = new CKEDITOR.dom.element(b.$.rows[c]), "tbody" == h.getParent().getName() && (f = new CKEDITOR.dom.element(h.$.cells[0]), f.renameNode("td"), f.removeAttribute("scope"))
+ } if (this._.selectedElement) try { a.selectBookmarks(n) } catch (q) { } else d.insertElement(b), setTimeout(function() {
+ var a =
+ new CKEDITOR.dom.element(b.$.rows[0].cells[0]), c = d.createRange(); c.moveToPosition(a, CKEDITOR.POSITION_AFTER_START); c.select()
+ }, 0); b.addClass("table"); b.addClass("cke_show_border"); b.setStyle("width", "100%"); e.tableStriped ? b.addClass("table-striped") : b.removeClass("table-striped"); e.tableHover ? b.addClass("table-hover") : b.removeClass("table-hover"); e.tableBordered ? b.addClass("table-bordered") : b.removeClass("table-bordered"); e.tableCondensed ? b.addClass("table-condensed") : b.removeClass("table-condensed");
+ b.getParent().hasClass("table-responsive") || (a = m("div"), a.addClass("table-responsive"), a.append(b), d.insertElement(a))
+ }, contents: [{
+ id: "info", label: d.lang.table.title, elements: [{
+ type: "hbox", widths: [null, null], styles: ["vertical-align:top"], children: [{
+ type: "vbox", padding: 0, children: [{ type: "text", id: "txtRows", "default": 3, label: d.lang.table.rows, required: !0, controlStyle: "width:5em", validate: q(d.lang.table.invalidRows), setup: function(a) { this.setValue(a.$.rows.length) }, commit: k }, {
+ type: "text", id: "txtCols",
+ "default": 2, label: d.lang.table.columns, required: !0, controlStyle: "width:5em", validate: q(d.lang.table.invalidCols), setup: function(a) { this.setValue(t(a)) }, commit: k
+ }, { type: "html", html: "\x26nbsp;" }, {
+ type: "select", id: "selHeaders", requiredContent: "th", "default": "", label: d.lang.table.headers, items: [[d.lang.table.headersNone, ""], [d.lang.table.headersRow, "row"], [d.lang.table.headersColumn, "col"], [d.lang.table.headersBoth, "both"]], setup: function(a) {
+ var d = this.getDialog(); d.hasColumnHeaders = !0; for (var b = 0; b <
+ a.$.rows.length; b++) { var c = a.$.rows[b].cells[0]; if (c && "th" != c.nodeName.toLowerCase()) { d.hasColumnHeaders = !1; break } } null !== a.$.tHead ? this.setValue(d.hasColumnHeaders ? "both" : "row") : this.setValue(d.hasColumnHeaders ? "col" : "")
+ }, commit: k
+ }, { type: "html", id: "txtBorder", html: "\x26nbsp;", commit: function() { } }]
+ }, {
+ type: "hbox", padding: 0, children: [{
+ type: "vbox", widths: ["10em"], children: [{
+ type: "checkbox", id: "tableStriped", label: "Add stripes", "default": "", setup: function(a) { a = a.hasClass("table-striped"); this.setValue(a) },
+ commit: k
+ }, { type: "checkbox", id: "tableHover", label: "Add hover effect", "default": "", setup: function(a) { a = a.hasClass("table-hover"); this.setValue(a) }, commit: k }, { type: "checkbox", id: "tableBordered", label: "Add borders", "default": "", setup: function(a) { a = a.hasClass("table-bordered"); this.setValue(a) }, commit: k }, { type: "checkbox", id: "tableCondensed", label: "Compact style table", "default": "", setup: function(a) { this.enable(); a = a.hasClass("table-condensed"); this.setValue(a) }, commit: k }]
+ }]
+ }]
+ }, {
+ type: "vbox", padding: 0, children: [{
+ type: "text",
+ id: "txtCaption", requiredContent: "caption", label: d.lang.table.caption, setup: function(a) { this.enable(); a = a.getElementsByTag("caption"); if (0 < a.count()) { a = a.getItem(0); var d = a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT)); d && !d.equals(a.getBogus()) ? (this.disable(), this.setValue(a.getText())) : (a = CKEDITOR.tools.trim(a.getText()), this.setValue(a)) } }, commit: function(a, e) {
+ if (this.isEnabled()) {
+ var b = this.getValue(), c = e.getElementsByTag("caption"); if (b) 0 < c.count() ? (c = c.getItem(0), c.setHtml("")) :
+ (c = new CKEDITOR.dom.element("caption", d.document), e.getChildCount() ? c.insertBefore(e.getFirst()) : c.appendTo(e)), c.append(new CKEDITOR.dom.text(b, d.document)); else if (0 < c.count()) for (b = c.count() - 1; 0 <= b; b--)c.getItem(b).remove()
+ }
+ }
+ }]
+ }]
+ }]
+ }
+ } var k = function(d) { var e = this.id; d.info || (d.info = {}); d.info[e] = this.getValue() }; CKEDITOR.dialog.add("bt_table", function(d) { return r(d, "table") }); CKEDITOR.dialog.add("bt_tableProperties", function(d) { return r(d, "tableProperties") })
+})(); \ No newline at end of file
diff --git a/plugins/clipboard/dialogs/paste.js b/plugins/clipboard/dialogs/paste.js
new file mode 100755
index 0000000..c9cf28f
--- /dev/null
+++ b/plugins/clipboard/dialogs/paste.js
@@ -0,0 +1,29 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("paste", function(c) {
+ function k(a) {
+ var b = new CKEDITOR.dom.document(a.document), g = b.getBody(), d = b.getById("cke_actscrpt"); d && d.remove(); g.setAttribute("contenteditable", !0); g.on(e.mainPasteEvent, function(a) { a = e.initPasteDataTransfer(a); f ? a != f && (f = e.initPasteDataTransfer()) : f = a }); if (CKEDITOR.env.ie && 8 > CKEDITOR.env.version) b.getWindow().on("blur", function() { b.$.selection.empty() }); b.on("keydown", function(a) {
+ a = a.data; var b; switch (a.getKeystroke()) {
+ case 27: this.hide(); b = 1; break; case 9: case CKEDITOR.SHIFT +
+ 9: this.changeFocus(1), b = 1
+ }b && a.preventDefault()
+ }, this); c.fire("ariaWidget", new CKEDITOR.dom.element(a.frameElement)); b.getWindow().getFrame().removeCustomData("pendingFocus") && g.focus()
+ } var h = c.lang.clipboard, e = CKEDITOR.plugins.clipboard, f; c.on("pasteDialogCommit", function(a) { a.data && c.fire("paste", { type: "auto", dataValue: a.data.dataValue, method: "paste", dataTransfer: a.data.dataTransfer || e.initPasteDataTransfer() }) }, null, null, 1E3); return {
+ title: h.paste, minWidth: CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 :
+ 350, minHeight: CKEDITOR.env.quirks ? 250 : 245, onShow: function() { this.parts.dialog.$.offsetHeight; this.setupContent(); this._.committed = !1 }, onLoad: function() { (CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat) && "rtl" == c.lang.dir && this.parts.contents.setStyle("overflow", "hidden") }, onOk: function() { this.commitContent() }, contents: [{
+ id: "general", label: c.lang.common.generalTab, elements: [{ type: "html", id: "pasteMsg", html: '\x3cdiv style\x3d"white-space:normal;width:340px"\x3e' + h.pasteMsg + "\x3c/div\x3e" }, {
+ type: "html",
+ id: "editing_area", style: "width:100%;height:100%", html: "", focus: function() { var a = this.getInputElement(), b = a.getFrameDocument().getBody(); !b || b.isReadOnly() ? a.setCustomData("pendingFocus", 1) : b.focus() }, setup: function() {
+ var a = this.getDialog(), b = '\x3chtml dir\x3d"' + c.config.contentsLangDirection + '" lang\x3d"' + (c.config.contentsLanguage || c.langCode) + '"\x3e\x3chead\x3e\x3cstyle\x3ebody{margin:3px;height:95%;word-break:break-all;}\x3c/style\x3e\x3c/head\x3e\x3cbody\x3e\x3cscript id\x3d"cke_actscrpt" type\x3d"text/javascript"\x3ewindow.parent.CKEDITOR.tools.callFunction(' +
+ CKEDITOR.tools.addFunction(k, a) + ",this);\x3c/script\x3e\x3c/body\x3e\x3c/html\x3e", g = CKEDITOR.env.air ? "javascript:void(0)" : CKEDITOR.env.ie && !CKEDITOR.env.edge ? "javascript:void((function(){" + encodeURIComponent("document.open();(" + CKEDITOR.tools.fixDomain + ")();document.close();") + '})())"' : "", d = CKEDITOR.dom.element.createFromHtml('\x3ciframe class\x3d"cke_pasteframe" frameborder\x3d"0" allowTransparency\x3d"true" src\x3d"' + g + '" aria-label\x3d"' + h.pasteArea + '" aria-describedby\x3d"' + a.getContentElement("general",
+ "pasteMsg").domId + '"\x3e\x3c/iframe\x3e'); f = null; d.on("load", function(a) { a.removeListener(); a = d.getFrameDocument(); a.write(b); c.focusManager.add(a.getBody()); CKEDITOR.env.air && k.call(this, a.getWindow().$) }, a); d.setCustomData("dialog", a); a = this.getElement(); a.setHtml(""); a.append(d); if (CKEDITOR.env.ie && !CKEDITOR.env.edge) {
+ var e = CKEDITOR.dom.element.createFromHtml('\x3cspan tabindex\x3d"-1" style\x3d"position:absolute" role\x3d"presentation"\x3e\x3c/span\x3e'); e.on("focus", function() { setTimeout(function() { d.$.contentWindow.focus() }) });
+ a.append(e); this.focus = function() { e.focus(); this.fire("focus") }
+ } this.getInputElement = function() { return d }; CKEDITOR.env.ie && (a.setStyle("display", "block"), a.setStyle("height", d.$.offsetHeight + 2 + "px"))
+ }, commit: function() { var a = this.getDialog().getParentEditor(), b = this.getInputElement().getFrameDocument().getBody(), c = b.getBogus(); c && c.remove(); b = b.getHtml(); this.getDialog()._.committed = !0; a.fire("pasteDialogCommit", { dataValue: b, dataTransfer: f || e.initPasteDataTransfer() }) }
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/colordialog/dialogs/colordialog.css b/plugins/colordialog/dialogs/colordialog.css
new file mode 100755
index 0000000..3e2f449
--- /dev/null
+++ b/plugins/colordialog/dialogs/colordialog.css
@@ -0,0 +1,23 @@
+/**
+ * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+.cke_colordialog_colorcell {
+ width: 12px;
+ /* All cells have equal width which depends on parent width (in this case table parent). Width works more like max-width. */
+ height: 14px;
+ padding: 1px;
+ /* Padding is replaced by border for focused cells. Prevents 'jumping' when adding borders. */
+}
+
+.cke_colordialog_colorcell.cke_colordialog_focused_light,
+.cke_colordialog_colorcell.cke_colordialog_focused_dark {
+ padding: 0;
+ /* Shrink cell to allow 1px border indicating focus. */
+ border: 1px dotted #000;
+}
+
+.cke_colordialog_colorcell.cke_colordialog_focused_dark {
+ border-color: #FFF;
+} \ No newline at end of file
diff --git a/plugins/colordialog/dialogs/colordialog.js b/plugins/colordialog/dialogs/colordialog.js
new file mode 100755
index 0000000..aefb13d
--- /dev/null
+++ b/plugins/colordialog/dialogs/colordialog.js
@@ -0,0 +1,44 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("colordialog", function(x) {
+ function m() { e.getById(n).removeStyle("background-color"); p.getContentElement("picker", "selectedColor").setValue(""); y() } function z(a) { a = a.data.getTarget(); var c; "td" == a.getName() && (c = a.getChild(0).getHtml()) && (y(), f = a, f.setAttribute("aria-selected", !0), f.addClass("cke_colordialog_selected"), p.getContentElement("picker", "selectedColor").setValue(c)) } function y() { f && (f.removeClass("cke_colordialog_selected"), f.removeAttribute("aria-selected"), f = null) } function D(a) {
+ a =
+ a.replace(/^#/, ""); for (var c = 0, b = []; 2 >= c; c++)b[c] = parseInt(a.substr(2 * c, 2), 16); return 165 <= .2126 * b[0] + .7152 * b[1] + .0722 * b[2]
+ } function A(a) { !a.name && (a = new CKEDITOR.event(a)); var c = !/mouse/.test(a.name), b = a.data.getTarget(), k; "td" == b.getName() && (k = b.getChild(0).getHtml()) && (q(a), c ? d = b : B = b, c && b.addClass(D(k) ? "cke_colordialog_focused_light" : "cke_colordialog_focused_dark"), r(k)) } function q(a) {
+ if (a = !/mouse/.test(a.name) && d) a.removeClass("cke_colordialog_focused_light"), a.removeClass("cke_colordialog_focused_dark");
+ d || B || r(!1)
+ } function r(a) { a ? (e.getById(t).setStyle("background-color", a), e.getById(u).setHtml(a)) : (e.getById(t).removeStyle("background-color"), e.getById(u).setHtml("\x26nbsp;")) } function E(a) {
+ var c = a.data, b = c.getTarget(), k = c.getKeystroke(), d = "rtl" == x.lang.dir; switch (k) {
+ case 38: if (a = b.getParent().getPrevious()) a = a.getChild([b.getIndex()]), a.focus(); c.preventDefault(); break; case 40: (a = b.getParent().getNext()) && (a = a.getChild([b.getIndex()])) && 1 == a.type && a.focus(); c.preventDefault(); break; case 32: case 13: z(a);
+ c.preventDefault(); break; case d ? 37 : 39: (a = b.getNext()) ? 1 == a.type && (a.focus(), c.preventDefault(!0)) : (a = b.getParent().getNext()) && (a = a.getChild([0])) && 1 == a.type && (a.focus(), c.preventDefault(!0)); break; case d ? 39 : 37: if (a = b.getPrevious()) a.focus(), c.preventDefault(!0); else if (a = b.getParent().getPrevious()) a = a.getLast(), a.focus(), c.preventDefault(!0)
+ }
+ } var v = CKEDITOR.dom.element, e = CKEDITOR.document, g = x.lang.colordialog, p, f, C = { type: "html", html: "\x26nbsp;" }, l = function(a) {
+ return CKEDITOR.tools.getNextId() + "_" +
+ a
+ }, t = l("hicolor"), u = l("hicolortext"), n = l("selhicolor"), h, d, B; (function() {
+ function a(a, d) { for (var w = a; w < a + 3; w++) { var e = new v(h.$.insertRow(-1)); e.setAttribute("role", "row"); for (var f = d; f < d + 3; f++)for (var g = 0; 6 > g; g++)c(e.$, "#" + b[f] + b[g] + b[w]) } } function c(a, c) {
+ var b = new v(a.insertCell(-1)); b.setAttribute("class", "ColorCell cke_colordialog_colorcell"); b.setAttribute("tabIndex", -1); b.setAttribute("role", "gridcell"); b.on("keydown", E); b.on("click", z); b.on("focus", A); b.on("blur", q); b.setStyle("background-color",
+ c); var d = l("color_table_cell"); b.setAttribute("aria-labelledby", d); b.append(CKEDITOR.dom.element.createFromHtml('\x3cspan id\x3d"' + d + '" class\x3d"cke_voice_label"\x3e' + c + "\x3c/span\x3e", CKEDITOR.document))
+ } h = CKEDITOR.dom.element.createFromHtml('\x3ctable tabIndex\x3d"-1" class\x3d"cke_colordialog_table" aria-label\x3d"' + g.options + '" role\x3d"grid" style\x3d"border-collapse:separate;" cellspacing\x3d"0"\x3e\x3ccaption class\x3d"cke_voice_label"\x3e' + g.options + '\x3c/caption\x3e\x3ctbody role\x3d"presentation"\x3e\x3c/tbody\x3e\x3c/table\x3e');
+ h.on("mouseover", A); h.on("mouseout", q); var b = "00 33 66 99 cc ff".split(" "); a(0, 0); a(3, 0); a(0, 3); a(3, 3); var d = new v(h.$.insertRow(-1)); d.setAttribute("role", "row"); c(d.$, "#000000"); for (var f = 0; 16 > f; f++) { var e = f.toString(16); c(d.$, "#" + e + e + e + e + e + e) } c(d.$, "#ffffff")
+ })(); CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl(CKEDITOR.plugins.get("colordialog").path + "dialogs/colordialog.css")); return {
+ title: g.title, minWidth: 360, minHeight: 220, onLoad: function() { p = this }, onHide: function() {
+ m(); d && (d.removeClass("cke_colordialog_focused_light"),
+ d.removeClass("cke_colordialog_focused_dark")); r(!1); d = null
+ }, contents: [{
+ id: "picker", label: g.title, accessKey: "I", elements: [{
+ type: "hbox", padding: 0, widths: ["70%", "10%", "30%"], children: [{ type: "html", html: "\x3cdiv\x3e\x3c/div\x3e", onLoad: function() { CKEDITOR.document.getById(this.domId).append(h) }, focus: function() { (d || this.getElement().getElementsByTag("td").getItem(0)).focus() } }, C, {
+ type: "vbox", padding: 0, widths: ["70%", "5%", "25%"], children: [{
+ type: "html", html: "\x3cspan\x3e" + g.highlight + '\x3c/span\x3e\x3cdiv id\x3d"' +
+ t + '" style\x3d"border: 1px solid; height: 74px; width: 74px;"\x3e\x3c/div\x3e\x3cdiv id\x3d"' + u + '"\x3e\x26nbsp;\x3c/div\x3e\x3cspan\x3e' + g.selected + '\x3c/span\x3e\x3cdiv id\x3d"' + n + '" style\x3d"border: 1px solid; height: 20px; width: 74px;"\x3e\x3c/div\x3e'
+ }, { type: "text", label: g.selected, labelStyle: "display:none", id: "selectedColor", style: "width: 76px;margin-top:4px", onChange: function() { try { e.getById(n).setStyle("background-color", this.getValue()) } catch (a) { m() } } }, C, {
+ type: "button", id: "clear", label: g.clear,
+ onClick: m
+ }]
+ }]
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/copyformatting/cursors/cursor-disabled.svg b/plugins/copyformatting/cursors/cursor-disabled.svg
new file mode 100755
index 0000000..9298aef
--- /dev/null
+++ b/plugins/copyformatting/cursors/cursor-disabled.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="16px" height="16px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+
+ <title>cursor_disabled</title>
+ <desc></desc>
+ <defs></defs>
+ <g id="Page-4" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="cursor_disabled_5">
+ <g id="cursor_disabled_illustrator" transform="translate(24.000000, 2.000000)">
+ <g id="Layer_1">
+ <path d="M225,14 C227.8,14 230,11.8 230,9 L230,5 C230,2.2 227.8,0 225,0 L127,0 C124.2,0 122,2.2 122,5 L122,9 C122,11.8 124.2,14 127,14 L158,14 L158,26.3 C172.4,34 185,44.6 195,57.4 L195,14 L225,14 L225,14 Z" id="Shape" fill="#000000"></path>
+ <path d="M158,228.7 L158,238 L134.5,238 C130.6,239.1 126.7,239.9 122.6,240.6 C122.2,241.3 121.9,242.1 121.9,243 L121.9,247 C121.9,249.8 124.1,252 126.9,252 L224.9,252 C227.7,252 229.9,249.8 229.9,247 L229.9,243 C229.9,240.2 227.7,238 224.9,238 L194.9,238 L194.9,197.6 C185,210.4 172.4,221 158,228.7 L158,228.7 Z" id="Shape" fill="#000000"></path>
+ <path d="M54.7,107.6 C53.9,110.7 51.1,112.9 41.8,116.1 C35.6,118.3 31.9,121.1 29.5,124.5 C29.5,125.5 29.4,126.4 29.4,127.4 C29.4,134.1 30.3,140.7 32,146.9 L93.9,146.9 L54.7,107.6 L54.7,107.6 Z" id="Shape" fill="#000000"></path>
+ <path d="M70.8,13 C70.7,13 70.6,13.1 70.5,13.3 C65.9,13.7 58.9,15.5 54.6,24.4 C63.2,20.2 72.5,17.1 82.2,15.1 C77.4,12.7 72.6,13 70.8,13 L70.8,13 Z" id="Shape" fill="#000000"></path>
+ <path d="M55,170 L55,183.7 C58.7,187 62.7,189.9 67,192.3 L67,170 L78,170 L78,197.6 C81.9,199.1 85.9,200.2 90,201 L90,170 L101,170 L101,202.4 C102.2,202.5 103.3,202.5 104.5,202.5 C109.4,202.5 114.3,202 119.1,201.1 C119.3,193.5 119.5,182.8 119.6,172.6 L105.1,158 L36.1,158 C38.3,162.8 40.9,167.4 44,171.7 L44,170 L55,170 L55,170 Z" id="Shape" fill="#000000"></path>
+ <path d="M26.3,211.5 C26.3,211.5 24.6,222.6 36.8,222.6 L40.8,222.6 C35.7,219.1 30.8,215.3 26.3,211.1 L26.3,211.5 L26.3,211.5 Z" id="Shape" fill="#000000"></path>
+ <path d="M172.1,159.8 C176.9,149.8 179.4,138.7 179.4,127.5 C179.4,107.1 171.2,88.6 158,75.1 L158,145.7 L172.1,159.8 L172.1,159.8 Z" id="Shape" fill="#000000"></path>
+ <path d="M72.2,59.9 L91.2,78.9 C92.3,73 93.7,65.4 94.1,53.3 C86.5,54.3 79.1,56.6 72.2,59.9 L72.2,59.9 Z" id="Shape" fill="#000000"></path>
+ <path d="M119.7,158 L119.2,158 L119.7,158.5 L119.7,158 L119.7,158 Z" id="Shape" fill="#FF0000"></path>
+ <path d="M195,75.3 C186.1,59.9 173.3,46.9 158,37.8 C142.3,28.4 124,23 104.5,23 C99.7,23 95,23.3 90.4,24 C86.3,24.6 82.3,25.3 78.3,26.4 C73.4,27.7 68.7,29.3 64.1,31.2 C59.6,33.1 55.3,35.3 51.2,37.7 C20.6,55.9 0,89.3 0,127.5 C0,153.8 9.8,177.9 25.9,196.3 C31.3,202.4 37.3,207.9 44,212.6 C47.5,215.1 51.2,217.4 55,219.5 C57,220.6 59,221.6 61.1,222.5 C74.3,228.6 89,231.9 104.5,231.9 C124,231.9 142.3,226.5 158,217.1 C173.3,207.9 186.1,195 195,179.6 C203.9,164.2 209,146.4 209,127.4 C209,108.5 203.9,90.7 195,75.3 L195,75.3 Z M151.2,198.5 C141.4,205 130.4,209.3 118.9,211.3 C114.2,212.1 109.4,212.5 104.5,212.5 C103.3,212.5 102.2,212.5 101,212.4 C97.3,212.2 93.6,211.8 90,211.2 C85.9,210.5 81.9,209.5 78,208.2 C74.2,207 70.5,205.5 67,203.7 C62.8,201.6 58.8,199.2 55,196.5 C51.1,193.7 47.4,190.5 44,187.1 C36,179 29.6,169.2 25.4,158.4 C21.6,148.8 19.6,138.4 19.6,127.5 C19.6,110.8 24.4,94.7 33.6,80.8 L37,75.7 L55.7,94.4 L108.4,147.1 L119.4,158.1 L119.9,158.1 L119.9,158.6 L156.5,195.2 L151.2,198.5 L151.2,198.5 Z M177.7,170.7 L174.4,176.2 L158,159.9 L89.4,91.3 L55.8,57.6 L61.3,54.3 C71.4,48.3 82.6,44.6 94.2,43.1 C97.6,42.7 101,42.5 104.5,42.5 C124.8,42.5 143.4,49.6 158,61.5 C177.2,77.1 189.4,100.8 189.4,127.4 C189.4,142.7 185.4,157.7 177.7,170.7 L177.7,170.7 Z" id="Shape" fill="#FF0000"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/plugins/copyformatting/cursors/cursor.svg b/plugins/copyformatting/cursors/cursor.svg
new file mode 100755
index 0000000..9595147
--- /dev/null
+++ b/plugins/copyformatting/cursors/cursor.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="16px" height="16px" viewBox="0 0 205 252" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>cursor</title>
+ <desc></desc>
+ <defs></defs>
+ <g id="Page-4" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Artboard-1" transform="translate(-49.000000, -2.000000)" fill="#000000">
+ <g id="cursor" transform="translate(49.000000, 2.000000)">
+ <path d="M170,14 L200.007537,14 C202.769057,14 205,11.7636493 205,9.00497092 L205,4.99502908 C205,2.23382212 202.764798,0 200.007537,0 L101.992463,0 C99.2309431,0 97,2.23635069 97,4.99502908 L97,9.00497092 C97,11.7661779 99.2352017,14 101.992463,14 L133,14 L133,238 L101.992463,238 C99.2309431,238 97,240.236351 97,242.995029 L97,247.004971 C97,249.766178 99.2352017,252 101.992463,252 L200.007537,252 C202.769057,252 205,249.763649 205,247.004971 L205,242.995029 C205,240.233822 202.764798,238 200.007537,238 L170,238 L170,14 Z" id="Combined-Shape"></path>
+ <path d="M65,222.280829 C60.6131176,222.280829 56.3742162,222.280828 52.9999995,222.280828 L53,170 L42,170 L42,222.560593 C38.6130246,222.560593 34.3763308,222.560593 30.0000005,222.560594 L30,170 L19,170 L19,222.560595 C16.324865,222.560595 13.8463369,222.560595 11.7612725,222.560596 C-0.369586438,222.560599 1.28381746,211.509313 1.28381746,211.509313 C1.28381746,211.509313 0.389689944,177.756 0.396571277,158 L94.7408232,158 C94.7392736,177.793089 93.8535396,211.229548 93.8535396,211.229548 C93.8535396,211.229548 95.5069435,222.280834 83.3760845,222.280831 C81.2553782,222.28083 78.7276415,222.28083 76.0000002,222.28083 L76,170 L65,170 L65,222.280829 Z M0.574534036,147 C0.579768387,146.896149 0.585131638,146.794755 0.590625514,146.695866 C1.28381748,134.218409 -0.797112286,122.434146 16.8792816,116.195422 C34.5556755,109.956698 28.6662536,107.530522 30.3978792,95.7462576 C32.1295048,83.961993 25.8921298,78.069863 25.8921315,44.7966496 C25.892133,17.9607206 38.5169467,13.9220173 45.5220939,13.3637617 C45.6089814,13.1340727 45.7002506,13.0164391 45.7960631,13.0164391 C49.8372056,13.0164389 69.2452237,11.2436713 69.2452255,44.5168847 C69.2452273,77.7900982 63.0078523,83.6822281 64.7394778,95.4664928 C66.4711034,107.250757 60.5816815,109.676933 78.2580754,115.915657 C95.9344693,122.154381 93.8535395,133.938644 94.5467315,146.416101 C94.5570586,146.601989 94.5669242,146.796724 94.5763397,147 L0.574534036,147 Z M47.5,41 C52.1944204,41 56,37.1944204 56,32.5 C56,27.8055796 52.1944204,24 47.5,24 C42.8055796,24 39,27.8055796 39,32.5 C39,37.1944204 42.8055796,41 47.5,41 Z" id="Combined-Shape"></path>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/plugins/copyformatting/styles/copyformatting.css b/plugins/copyformatting/styles/copyformatting.css
new file mode 100755
index 0000000..a29a08b
--- /dev/null
+++ b/plugins/copyformatting/styles/copyformatting.css
@@ -0,0 +1,45 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+
+html.cke_copyformatting_active {
+ min-height: 100%;
+}
+
+/* There is no cursor in CUR format for IE/Edge as that browser
+ does not support custom cursor in [contenteditable] area.
+ Ticket for this issue:
+ https://connect.microsoft.com/IE/feedback/details/1070215/cant-change-cursor-in-contenteditable-using-css */
+.cke_copyformatting_disabled,
+.cke_copyformatting_disabled a,
+.cke_copyformatting_disabled .cke_editable {
+ cursor: url(../cursors/cursor-disabled.svg) 12 1, auto;
+}
+
+.cke_copyformatting_disabled .cke_top a,
+.cke_copyformatting_disabled .cke_bottom a {
+ cursor: default;
+}
+
+/* Added `!important` rule as a fix for overriding the cursor by the Table Resize plugin.
+ The `!important` rule is used because the Table Resize plugin creates a `<div>` which changes the cursor using inlined styles. */
+.cke_copyformatting_active,
+.cke_copyformatting_active.cke_editable,
+.cke_copyformatting_active .cke_editable,
+.cke_copyformatting_active a,
+.cke_copyformatting_active table,
+.cke_copyformatting_active div[data-cke-temp],
+.cke_copyformatting_tableresize_cursor div[data-cke-temp] {
+ cursor: url(../cursors/cursor.svg) 12 1, auto !important;
+}
+
+.cke_screen_reader_only {
+ position: absolute;
+ clip: rect(1px, 1px, 1px, 1px);
+ padding: 0;
+ border: 0;
+ height: 1px;
+ width: 1px;
+ overflow: hidden;
+} \ No newline at end of file
diff --git a/plugins/dialog/dialogDefinition.js b/plugins/dialog/dialogDefinition.js
new file mode 100755
index 0000000..d8ac273
--- /dev/null
+++ b/plugins/dialog/dialogDefinition.js
@@ -0,0 +1,4 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
diff --git a/plugins/div/dialogs/div.js b/plugins/div/dialogs/div.js
new file mode 100755
index 0000000..c7c25ec
--- /dev/null
+++ b/plugins/div/dialogs/div.js
@@ -0,0 +1,43 @@
+(function() {
+ function t(a, m, r) { m.is && m.getCustomData("block_processed") || (m.is && CKEDITOR.dom.element.setMarker(r, m, "block_processed", !0), a.push(m)) } function q(a, m) {
+ function r() { this.foreach(function(a) { /^(?!vbox|hbox)/.test(a.type) && (a.setup || (a.setup = function(c) { a.setValue(c.getAttribute(a.id) || "", 1) }), a.commit || (a.commit = function(c) { var g = this.getValue(); if ("dir" != a.id || c.getComputedStyle("direction") != g) g ? c.setAttribute(a.id, g) : c.removeAttribute(a.id) })) }) } var q = function() {
+ var f = CKEDITOR.tools.extend({},
+ CKEDITOR.dtd.$blockLimit); a.config.div_wrapTable && (delete f.td, delete f.th); return f
+ }(), u = CKEDITOR.dtd.div, n = {}, p = []; return {
+ title: a.lang.div.title, minWidth: 400, minHeight: 165, contents: [{
+ id: "info", label: a.lang.common.generalTab, title: a.lang.common.generalTab, elements: [{
+ type: "hbox", widths: ["50%", "50%"], children: [{
+ id: "elementStyle", type: "select", style: "width: 100%;", label: a.lang.div.styleSelectLabel, "default": "", items: [[a.lang.common.notSet, ""]], onChange: function() {
+ var f = ["info:elementStyle", "info:class",
+ "advanced:dir", "advanced:style"], c = this.getDialog(), g = c._element && c._element.clone() || new CKEDITOR.dom.element("div", a.document); this.commit(g, !0); for (var f = [].concat(f), b = f.length, k, e = 0; e < b; e++)(k = c.getContentElement.apply(c, f[e].split(":"))) && k.setup && k.setup(g, !0)
+ }, setup: function(f) { for (var c in n) n[c].checkElementRemovable(f, !0, a) && this.setValue(c, 1) }, commit: function(f) { var c; (c = this.getValue()) ? n[c].applyToObject(f, a) : f.removeAttribute("style") }
+ }, {
+ id: "class", type: "text", requiredContent: "div(cke-xyz)",
+ label: a.lang.common.cssClass, "default": ""
+ }]
+ }]
+ }, {
+ id: "advanced", label: a.lang.common.advancedTab, title: a.lang.common.advancedTab, elements: [{
+ type: "vbox", padding: 1, children: [{ type: "hbox", widths: ["50%", "50%"], children: [{ type: "text", id: "id", requiredContent: "div[id]", label: a.lang.common.id, "default": "" }, { type: "text", id: "lang", requiredContent: "div[lang]", label: a.lang.common.langCode, "default": "" }] }, {
+ type: "hbox", children: [{
+ type: "text", id: "style", requiredContent: "div{cke-xyz}", style: "width: 100%;", label: a.lang.common.cssStyle,
+ "default": "", commit: function(a) { a.setAttribute("style", this.getValue()) }
+ }]
+ }, { type: "hbox", children: [{ type: "text", id: "title", requiredContent: "div[title]", style: "width: 100%;", label: a.lang.common.advisoryTitle, "default": "" }] }, { type: "select", id: "dir", requiredContent: "div[dir]", style: "width: 100%;", label: a.lang.common.langDir, "default": "", items: [[a.lang.common.notSet, ""], [a.lang.common.langDirLtr, "ltr"], [a.lang.common.langDirRtl, "rtl"]] }]
+ }]
+ }], onLoad: function() {
+ r.call(this); var f = this, c = this.getContentElement("info",
+ "elementStyle"); a.getStylesSet(function(g) { var b, k; if (g) for (var e = 0; e < g.length; e++)k = g[e], k.element && "div" == k.element && (b = k.name, n[b] = k = new CKEDITOR.style(k), a.filter.check(k) && (c.items.push([b, b]), c.add(b, b))); c[1 < c.items.length ? "enable" : "disable"](); setTimeout(function() { f._element && c.setup(f._element) }, 0) })
+ }, onShow: function() { "editdiv" == m && this.setupContent(this._element = CKEDITOR.plugins.div.getSurroundDiv(a)) }, onOk: function() {
+ if ("editdiv" == m) p = [this._element]; else {
+ var f = [], c = {}, g = [], b, k = a.getSelection(),
+ e = k.getRanges(), n = k.createBookmarks(), h, l; for (h = 0; h < e.length; h++)for (l = e[h].createIterator(); b = l.getNextParagraph();)if (b.getName() in q && !b.isReadOnly()) { var d = b.getChildren(); for (b = 0; b < d.count(); b++)t(g, d.getItem(b), c) } else { for (; !u[b.getName()] && !b.equals(e[h].root);)b = b.getParent(); t(g, b, c) } CKEDITOR.dom.element.clearAllMarkers(c); e = []; h = null; for (l = 0; l < g.length; l++)b = g[l], d = a.elementPath(b).blockLimit, d.isReadOnly() && (d = d.getParent()), a.config.div_wrapTable && d.is(["td", "th"]) && (d = a.elementPath(d.getParent()).blockLimit),
+ d.equals(h) || (h = d, e.push([])), b.getParent() && e[e.length - 1].push(b); for (h = 0; h < e.length; h++)if (e[h].length) {
+ d = e[h][0]; g = d.getParent(); for (b = 1; b < e[h].length; b++)g = g.getCommonAncestor(e[h][b]); g || (g = a.editable()); l = new CKEDITOR.dom.element("div", a.document); for (b = 0; b < e[h].length; b++) { for (d = e[h][b]; d.getParent() && !d.getParent().equals(g);)d = d.getParent(); e[h][b] = d } for (b = 0; b < e[h].length; b++)d = e[h][b], d.getCustomData && d.getCustomData("block_processed") || (d.is && CKEDITOR.dom.element.setMarker(c, d, "block_processed",
+ !0), b || l.insertBefore(d), l.append(d)); CKEDITOR.dom.element.clearAllMarkers(c); f.push(l)
+ } k.selectBookmarks(n); p = f
+ } f = p.length; for (c = 0; c < f; c++)this.commitContent(p[c]), !p[c].getAttribute("style") && p[c].removeAttribute("style"); this.hide()
+ }, onHide: function() { "editdiv" == m && this._element.removeCustomData("elementStyle"); delete this._element }
+ }
+ } CKEDITOR.dialog.add("creatediv", function(a) { return q(a, "creatediv") }); CKEDITOR.dialog.add("editdiv", function(a) { return q(a, "editdiv") })
+})(); \ No newline at end of file
diff --git a/plugins/find/dialogs/find.js b/plugins/find/dialogs/find.js
new file mode 100755
index 0000000..cd699f6
--- /dev/null
+++ b/plugins/find/dialogs/find.js
@@ -0,0 +1,95 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+(function() {
+ function C(c) { return c.type == CKEDITOR.NODE_TEXT && 0 < c.getLength() && (!m || !c.isReadOnly()) } function v(c) { return !(c.type == CKEDITOR.NODE_ELEMENT && c.isBlockBoundary(CKEDITOR.tools.extend({}, CKEDITOR.dtd.$empty, CKEDITOR.dtd.$nonEditable))) } var m, w = function() { return { textNode: this.textNode, offset: this.offset, character: this.textNode ? this.textNode.getText().charAt(this.offset) : null, hitMatchBoundary: this._.matchBoundary } }, x = ["find", "replace"], q = [["txtFindFind", "txtFindReplace"], ["txtFindCaseChk",
+ "txtReplaceCaseChk"], ["txtFindWordChk", "txtReplaceWordChk"], ["txtFindCyclic", "txtReplaceCyclic"]]; CKEDITOR.dialog.add("find", function(c) {
+ function n(a, b) { var d = this, c = new CKEDITOR.dom.walker(a); c.guard = b ? v : function(a) { !v(a) && (d._.matchBoundary = !0) }; c.evaluator = C; c.breakOnFalse = 1; a.startContainer.type == CKEDITOR.NODE_TEXT && (this.textNode = a.startContainer, this.offset = a.startOffset - 1); this._ = { matchWord: b, walker: c, matchBoundary: !1 } } function y(a, b) {
+ var d = c.createRange(); d.setStart(a.textNode, b ? a.offset :
+ a.offset + 1); d.setEndAt(c.editable(), CKEDITOR.POSITION_BEFORE_END); return d
+ } function r(a) { var b = c.getSelection().getRanges()[0], d = c.editable(); b && !a ? (a = b.clone(), a.collapse(!0)) : (a = c.createRange(), a.setStartAt(d, CKEDITOR.POSITION_AFTER_START)); a.setEndAt(d, CKEDITOR.POSITION_BEFORE_END); return a } var z = new CKEDITOR.style(CKEDITOR.tools.extend({ attributes: { "data-cke-highlight": 1 }, fullMatch: 1, ignoreReadonly: 1, childRule: function() { return 0 } }, c.config.find_highlight, !0)); n.prototype = {
+ next: function() { return this.move() },
+ back: function() { return this.move(!0) }, move: function(a) { var b = this.textNode; if (null === b) return w.call(this); this._.matchBoundary = !1; if (b && a && 0 < this.offset) this.offset--; else if (b && this.offset < b.getLength() - 1) this.offset++; else { for (b = null; !b && !(b = this._.walker[a ? "previous" : "next"].call(this._.walker), this._.matchWord && !b || this._.walker._.end);); this.offset = (this.textNode = b) ? a ? b.getLength() - 1 : 0 : 0 } return w.call(this) }
+ }; var t = function(a, b) {
+ this._ = {
+ walker: a, cursors: [], rangeLength: b, highlightRange: null,
+ isMatched: 0
+ }
+ }; t.prototype = {
+ toDomRange: function() { var a = c.createRange(), b = this._.cursors; if (1 > b.length) { var d = this._.walker.textNode; if (d) a.setStartAfter(d); else return null } else d = b[0], b = b[b.length - 1], a.setStart(d.textNode, d.offset), a.setEnd(b.textNode, b.offset + 1); return a }, updateFromDomRange: function(a) { var b = new n(a); this._.cursors = []; do a = b.next(), a.character && this._.cursors.push(a); while (a.character); this._.rangeLength = this._.cursors.length }, setMatched: function() { this._.isMatched = !0 }, clearMatched: function() {
+ this._.isMatched =
+ !1
+ }, isMatched: function() { return this._.isMatched }, highlight: function() { if (!(1 > this._.cursors.length)) { this._.highlightRange && this.removeHighlight(); var a = this.toDomRange(), b = a.createBookmark(); z.applyToRange(a, c); a.moveToBookmark(b); this._.highlightRange = a; b = a.startContainer; b.type != CKEDITOR.NODE_ELEMENT && (b = b.getParent()); b.scrollIntoView(); this.updateFromDomRange(a) } }, removeHighlight: function() {
+ if (this._.highlightRange) {
+ var a = this._.highlightRange.createBookmark(); z.removeFromRange(this._.highlightRange,
+ c); this._.highlightRange.moveToBookmark(a); this.updateFromDomRange(this._.highlightRange); this._.highlightRange = null
+ }
+ }, isReadOnly: function() { return this._.highlightRange ? this._.highlightRange.startContainer.isReadOnly() : 0 }, moveBack: function() { var a = this._.walker.back(), b = this._.cursors; a.hitMatchBoundary && (this._.cursors = b = []); b.unshift(a); b.length > this._.rangeLength && b.pop(); return a }, moveNext: function() {
+ var a = this._.walker.next(), b = this._.cursors; a.hitMatchBoundary && (this._.cursors = b = []); b.push(a);
+ b.length > this._.rangeLength && b.shift(); return a
+ }, getEndCharacter: function() { var a = this._.cursors; return 1 > a.length ? null : a[a.length - 1].character }, getNextCharacterRange: function(a) { var b, d; d = this._.cursors; d = (b = d[d.length - 1]) && b.textNode ? new n(y(b)) : this._.walker; return new t(d, a) }, getCursors: function() { return this._.cursors }
+ }; var A = function(a, b) {
+ var d = [-1]; b && (a = a.toLowerCase()); for (var c = 0; c < a.length; c++)for (d.push(d[c] + 1); 0 < d[c + 1] && a.charAt(c) != a.charAt(d[c + 1] - 1);)d[c + 1] = d[d[c + 1] - 1] + 1; this._ = {
+ overlap: d,
+ state: 0, ignoreCase: !!b, pattern: a
+ }
+ }; A.prototype = { feedCharacter: function(a) { for (this._.ignoreCase && (a = a.toLowerCase()); ;) { if (a == this._.pattern.charAt(this._.state)) return this._.state++, this._.state == this._.pattern.length ? (this._.state = 0, 2) : 1; if (this._.state) this._.state = this._.overlap[this._.state]; else return 0 } }, reset: function() { this._.state = 0 } }; var D = /[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/, B = function(a) {
+ if (!a) return !0; var b = a.charCodeAt(0); return 9 <= b && 13 >= b || 8192 <= b &&
+ 8202 >= b || D.test(a)
+ }, f = {
+ searchRange: null, matchRange: null, find: function(a, b, d, e, f, u) {
+ this.matchRange ? (this.matchRange.removeHighlight(), this.matchRange = this.matchRange.getNextCharacterRange(a.length)) : this.matchRange = new t(new n(this.searchRange), a.length); for (var h = new A(a, !b), k = 0, l = "%"; null !== l;) {
+ for (this.matchRange.moveNext(); l = this.matchRange.getEndCharacter();) { k = h.feedCharacter(l); if (2 == k) break; this.matchRange.moveNext().hitMatchBoundary && h.reset() } if (2 == k) {
+ if (d) {
+ var g = this.matchRange.getCursors(),
+ p = g[g.length - 1], g = g[0], m = c.createRange(); m.setStartAt(c.editable(), CKEDITOR.POSITION_AFTER_START); m.setEnd(g.textNode, g.offset); g = m; p = y(p); g.trim(); p.trim(); g = new n(g, !0); p = new n(p, !0); if (!B(g.back().character) || !B(p.next().character)) continue
+ } this.matchRange.setMatched(); !1 !== f && this.matchRange.highlight(); return !0
+ }
+ } this.matchRange.clearMatched(); this.matchRange.removeHighlight(); return e && !u ? (this.searchRange = r(1), this.matchRange = null, arguments.callee.apply(this, Array.prototype.slice.call(arguments).concat([!0]))) :
+ !1
+ }, replaceCounter: 0, replace: function(a, b, d, e, f, u, h) {
+ m = 1; a = 0; a = this.hasMatchOptionsChanged(b, e, f); if (!this.matchRange || !this.matchRange.isMatched() || this.matchRange._.isReplaced || this.matchRange.isReadOnly() || a) a && this.matchRange && (this.matchRange.clearMatched(), this.matchRange.removeHighlight(), this.matchRange = null), a = this.find(b, e, f, u, !h); else {
+ this.matchRange.removeHighlight(); b = this.matchRange.toDomRange(); d = c.document.createText(d); if (!h) { var k = c.getSelection(); k.selectRanges([b]); c.fire("saveSnapshot") } b.deleteContents();
+ b.insertNode(d); h || (k.selectRanges([b]), c.fire("saveSnapshot")); this.matchRange.updateFromDomRange(b); h || this.matchRange.highlight(); this.matchRange._.isReplaced = !0; this.replaceCounter++; a = 1
+ } m = 0; return a
+ }, matchOptions: null, hasMatchOptionsChanged: function(a, b, d) { a = [a, b, d].join("."); b = this.matchOptions && this.matchOptions != a; this.matchOptions = a; return b }
+ }, e = c.lang.find; return {
+ title: e.title, resizable: CKEDITOR.DIALOG_RESIZE_NONE, minWidth: 350, minHeight: 170, buttons: [CKEDITOR.dialog.cancelButton(c, { label: c.lang.common.close })],
+ contents: [{
+ id: "find", label: e.find, title: e.find, accessKey: "", elements: [{ type: "hbox", widths: ["230px", "90px"], children: [{ type: "text", id: "txtFindFind", label: e.findWhat, isChanged: !1, labelLayout: "horizontal", accessKey: "F" }, { type: "button", id: "btnFind", align: "left", style: "width:100%", label: e.find, onClick: function() { var a = this.getDialog(); f.find(a.getValueOf("find", "txtFindFind"), a.getValueOf("find", "txtFindCaseChk"), a.getValueOf("find", "txtFindWordChk"), a.getValueOf("find", "txtFindCyclic")) || alert(e.notFoundMsg) } }] },
+ { type: "fieldset", className: "cke_dialog_find_fieldset", label: CKEDITOR.tools.htmlEncode(e.findOptions), style: "margin-top:29px", children: [{ type: "vbox", padding: 0, children: [{ type: "checkbox", id: "txtFindCaseChk", isChanged: !1, label: e.matchCase }, { type: "checkbox", id: "txtFindWordChk", isChanged: !1, label: e.matchWord }, { type: "checkbox", id: "txtFindCyclic", isChanged: !1, "default": !0, label: e.matchCyclic }] }] }]
+ }, {
+ id: "replace", label: e.replace, accessKey: "M", elements: [{
+ type: "hbox", widths: ["230px", "90px"], children: [{
+ type: "text",
+ id: "txtFindReplace", label: e.findWhat, isChanged: !1, labelLayout: "horizontal", accessKey: "F"
+ }, { type: "button", id: "btnFindReplace", align: "left", style: "width:100%", label: e.replace, onClick: function() { var a = this.getDialog(); f.replace(a, a.getValueOf("replace", "txtFindReplace"), a.getValueOf("replace", "txtReplace"), a.getValueOf("replace", "txtReplaceCaseChk"), a.getValueOf("replace", "txtReplaceWordChk"), a.getValueOf("replace", "txtReplaceCyclic")) || alert(e.notFoundMsg) } }]
+ }, {
+ type: "hbox", widths: ["230px", "90px"], children: [{
+ type: "text",
+ id: "txtReplace", label: e.replaceWith, isChanged: !1, labelLayout: "horizontal", accessKey: "R"
+ }, {
+ type: "button", id: "btnReplaceAll", align: "left", style: "width:100%", label: e.replaceAll, isChanged: !1, onClick: function() {
+ var a = this.getDialog(); f.replaceCounter = 0; f.searchRange = r(1); f.matchRange && (f.matchRange.removeHighlight(), f.matchRange = null); for (c.fire("saveSnapshot"); f.replace(a, a.getValueOf("replace", "txtFindReplace"), a.getValueOf("replace", "txtReplace"), a.getValueOf("replace", "txtReplaceCaseChk"), a.getValueOf("replace",
+ "txtReplaceWordChk"), !1, !0);); f.replaceCounter ? (alert(e.replaceSuccessMsg.replace(/%1/, f.replaceCounter)), c.fire("saveSnapshot")) : alert(e.notFoundMsg)
+ }
+ }]
+ }, { type: "fieldset", label: CKEDITOR.tools.htmlEncode(e.findOptions), children: [{ type: "vbox", padding: 0, children: [{ type: "checkbox", id: "txtReplaceCaseChk", isChanged: !1, label: e.matchCase }, { type: "checkbox", id: "txtReplaceWordChk", isChanged: !1, label: e.matchWord }, { type: "checkbox", id: "txtReplaceCyclic", isChanged: !1, "default": !0, label: e.matchCyclic }] }] }]
+ }], onLoad: function() {
+ var a =
+ this, b, d = 0; this.on("hide", function() { d = 0 }); this.on("show", function() { d = 1 }); this.selectPage = CKEDITOR.tools.override(this.selectPage, function(c) {
+ return function(e) {
+ c.call(a, e); var f = a._.tabs[e], h; h = "find" === e ? "txtFindWordChk" : "txtReplaceWordChk"; b = a.getContentElement(e, "find" === e ? "txtFindFind" : "txtFindReplace"); a.getContentElement(e, h); f.initialized || (CKEDITOR.document.getById(b._.inputId), f.initialized = !0); if (d) {
+ var k; e = "find" === e ? 1 : 0; var f = 1 - e, l, g = q.length; for (l = 0; l < g; l++)h = this.getContentElement(x[e],
+ q[l][e]), k = this.getContentElement(x[f], q[l][f]), k.setValue(h.getValue())
+ }
+ }
+ })
+ }, onShow: function() { f.searchRange = r(); var a = this._.currentTabId, b = this.getParentEditor().getSelection().getSelectedText(), c = this.getContentElement(a, "find" == a ? "txtFindFind" : "txtFindReplace"); c.setValue(b); c.select(); this[("find" == a && this._.editor.readOnly ? "hide" : "show") + "Page"]("replace") }, onHide: function() {
+ var a; f.matchRange && f.matchRange.isMatched() && (f.matchRange.removeHighlight(), (a = f.matchRange.toDomRange()) && c.getSelection().selectRanges([a]),
+ c.focus()); delete f.matchRange
+ }, onFocus: function() { return "replace" == this._.currentTabId ? this.getContentElement("replace", "txtFindReplace") : this.getContentElement("find", "txtFindFind") }
+ }
+ })
+})(); \ No newline at end of file
diff --git a/plugins/forms/dialogs/button.js b/plugins/forms/dialogs/button.js
new file mode 100755
index 0000000..1735b97
--- /dev/null
+++ b/plugins/forms/dialogs/button.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("button", function(b) {
+ function d(a) { var b = this.getValue(); b ? (a.attributes[this.id] = b, "name" == this.id && (a.attributes["data-cke-saved-name"] = b)) : (delete a.attributes[this.id], "name" == this.id && delete a.attributes["data-cke-saved-name"]) } return {
+ title: b.lang.forms.button.title, minWidth: 350, minHeight: 150, onShow: function() {
+ delete this.button; var a = this.getParentEditor().getSelection().getSelectedElement(); a && a.is("input") && a.getAttribute("type") in { button: 1, reset: 1, submit: 1 } && (this.button =
+ a, this.setupContent(a))
+ }, onOk: function() { var a = this.getParentEditor(), b = this.button, d = !b, c = b ? CKEDITOR.htmlParser.fragment.fromHtml(b.getOuterHtml()).children[0] : new CKEDITOR.htmlParser.element("input"); this.commitContent(c); var e = new CKEDITOR.htmlParser.basicWriter; c.writeHtml(e); c = CKEDITOR.dom.element.createFromHtml(e.getHtml(), a.document); d ? a.insertElement(c) : (c.replace(b), a.getSelection().selectElement(c)) }, contents: [{
+ id: "info", label: b.lang.forms.button.title, title: b.lang.forms.button.title, elements: [{
+ id: "name",
+ type: "text", bidi: !0, label: b.lang.common.name, "default": "", setup: function(a) { this.setValue(a.data("cke-saved-name") || a.getAttribute("name") || "") }, commit: d
+ }, { id: "value", type: "text", label: b.lang.forms.button.text, accessKey: "V", "default": "", setup: function(a) { this.setValue(a.getAttribute("value") || "") }, commit: d }, {
+ id: "type", type: "select", label: b.lang.forms.button.type, "default": "button", accessKey: "T", items: [[b.lang.forms.button.typeBtn, "button"], [b.lang.forms.button.typeSbm, "submit"], [b.lang.forms.button.typeRst,
+ "reset"]], setup: function(a) { this.setValue(a.getAttribute("type") || "") }, commit: d
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/forms/dialogs/checkbox.js b/plugins/forms/dialogs/checkbox.js
new file mode 100755
index 0000000..d56fb78
--- /dev/null
+++ b/plugins/forms/dialogs/checkbox.js
@@ -0,0 +1,21 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("checkbox", function(d) {
+ return {
+ title: d.lang.forms.checkboxAndRadio.checkboxTitle, minWidth: 350, minHeight: 140, onShow: function() { delete this.checkbox; var a = this.getParentEditor().getSelection().getSelectedElement(); a && "checkbox" == a.getAttribute("type") && (this.checkbox = a, this.setupContent(a)) }, onOk: function() { var a, b = this.checkbox; b || (a = this.getParentEditor(), b = a.document.createElement("input"), b.setAttribute("type", "checkbox"), a.insertElement(b)); this.commitContent({ element: b }) }, contents: [{
+ id: "info",
+ label: d.lang.forms.checkboxAndRadio.checkboxTitle, title: d.lang.forms.checkboxAndRadio.checkboxTitle, startupFocus: "txtName", elements: [{ id: "txtName", type: "text", label: d.lang.common.name, "default": "", accessKey: "N", setup: function(a) { this.setValue(a.data("cke-saved-name") || a.getAttribute("name") || "") }, commit: function(a) { a = a.element; this.getValue() ? a.data("cke-saved-name", this.getValue()) : (a.data("cke-saved-name", !1), a.removeAttribute("name")) } }, {
+ id: "txtValue", type: "text", label: d.lang.forms.checkboxAndRadio.value,
+ "default": "", accessKey: "V", setup: function(a) { a = a.getAttribute("value"); this.setValue(CKEDITOR.env.ie && "on" == a ? "" : a) }, commit: function(a) { var b = a.element, c = this.getValue(); !c || CKEDITOR.env.ie && "on" == c ? CKEDITOR.env.ie ? (c = new CKEDITOR.dom.element("input", b.getDocument()), b.copyAttributes(c, { value: 1 }), c.replace(b), d.getSelection().selectElement(c), a.element = c) : b.removeAttribute("value") : b.setAttribute("value", c) }
+ }, {
+ id: "cmbSelected", type: "checkbox", label: d.lang.forms.checkboxAndRadio.selected, "default": "",
+ accessKey: "S", value: "checked", setup: function(a) { this.setValue(a.getAttribute("checked")) }, commit: function(a) {
+ var b = a.element; if (CKEDITOR.env.ie) { var c = !!b.getAttribute("checked"), e = !!this.getValue(); c != e && (c = CKEDITOR.dom.element.createFromHtml('\x3cinput type\x3d"checkbox"' + (e ? ' checked\x3d"checked"' : "") + "/\x3e", d.document), b.copyAttributes(c, { type: 1, checked: 1 }), c.replace(b), d.getSelection().selectElement(c), a.element = c) } else a = this.getValue(), CKEDITOR.env.webkit && (b.$.checked = a), a ? b.setAttribute("checked",
+ "checked") : b.removeAttribute("checked")
+ }
+ }, { id: "required", type: "checkbox", label: d.lang.forms.checkboxAndRadio.required, "default": "", accessKey: "Q", value: "required", setup: CKEDITOR.plugins.forms._setupRequiredAttribute, commit: function(a) { a = a.element; this.getValue() ? a.setAttribute("required", "required") : a.removeAttribute("required") } }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/forms/dialogs/form.js b/plugins/forms/dialogs/form.js
new file mode 100755
index 0000000..aedd44a
--- /dev/null
+++ b/plugins/forms/dialogs/form.js
@@ -0,0 +1,26 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("form", function(a) {
+ var d = { action: 1, id: 1, method: 1, enctype: 1, target: 1 }; return {
+ title: a.lang.forms.form.title, minWidth: 350, minHeight: 200, onShow: function() { delete this.form; var b = this.getParentEditor().elementPath().contains("form", 1); b && (this.form = b, this.setupContent(b)) }, onOk: function() { var b, a = this.form, c = !a; c && (b = this.getParentEditor(), a = b.document.createElement("form"), a.appendBogus()); c && b.insertElement(a); this.commitContent(a) }, onLoad: function() {
+ function a(b) {
+ this.setValue(b.getAttribute(this.id) ||
+ "")
+ } function e(a) { this.getValue() ? a.setAttribute(this.id, this.getValue()) : a.removeAttribute(this.id) } this.foreach(function(c) { d[c.id] && (c.setup = a, c.commit = e) })
+ }, contents: [{
+ id: "info", label: a.lang.forms.form.title, title: a.lang.forms.form.title, elements: [{
+ id: "txtName", bidi: !0, type: "text", label: a.lang.common.name, "default": "", accessKey: "N", setup: function(a) { this.setValue(a.data("cke-saved-name") || a.getAttribute("name") || "") }, commit: function(a) {
+ this.getValue() ? a.data("cke-saved-name", this.getValue()) :
+ (a.data("cke-saved-name", !1), a.removeAttribute("name"))
+ }
+ }, { id: "action", type: "text", label: a.lang.forms.form.action, "default": "", accessKey: "T" }, { type: "hbox", widths: ["45%", "55%"], children: [{ id: "id", type: "text", label: a.lang.common.id, "default": "", accessKey: "I" }, { id: "enctype", type: "select", label: a.lang.forms.form.encoding, style: "width:100%", accessKey: "E", "default": "", items: [[""], ["text/plain"], ["multipart/form-data"], ["application/x-www-form-urlencoded"]] }] }, {
+ type: "hbox", widths: ["45%", "55%"], children: [{
+ id: "target",
+ type: "select", label: a.lang.common.target, style: "width:100%", accessKey: "M", "default": "", items: [[a.lang.common.notSet, ""], [a.lang.common.targetNew, "_blank"], [a.lang.common.targetTop, "_top"], [a.lang.common.targetSelf, "_self"], [a.lang.common.targetParent, "_parent"]]
+ }, { id: "method", type: "select", label: a.lang.forms.form.method, accessKey: "M", "default": "GET", items: [["GET", "get"], ["POST", "post"]] }]
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/forms/dialogs/hiddenfield.js b/plugins/forms/dialogs/hiddenfield.js
new file mode 100755
index 0000000..076b0fe
--- /dev/null
+++ b/plugins/forms/dialogs/hiddenfield.js
@@ -0,0 +1,7 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("hiddenfield",function(d){return{title:d.lang.forms.hidden.title,hiddenField:null,minWidth:350,minHeight:110,onShow:function(){delete this.hiddenField;var a=this.getParentEditor(),b=a.getSelection(),c=b.getSelectedElement();c&&c.data("cke-real-element-type")&&"hiddenfield"==c.data("cke-real-element-type")&&(this.hiddenField=c,c=a.restoreRealElement(this.hiddenField),this.setupContent(c),b.selectElement(this.hiddenField))},onOk:function(){var a=this.getValueOf("info","_cke_saved_name"),
+b=this.getParentEditor(),a=CKEDITOR.env.ie&&8>CKEDITOR.document.$.documentMode?b.document.createElement('\x3cinput name\x3d"'+CKEDITOR.tools.htmlEncode(a)+'"\x3e'):b.document.createElement("input");a.setAttribute("type","hidden");this.commitContent(a);a=b.createFakeElement(a,"cke_hidden","hiddenfield");this.hiddenField?(a.replace(this.hiddenField),b.getSelection().selectElement(a)):b.insertElement(a);return!0},contents:[{id:"info",label:d.lang.forms.hidden.title,title:d.lang.forms.hidden.title,elements:[{id:"_cke_saved_name",
+type:"text",label:d.lang.forms.hidden.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.setAttribute("name",this.getValue()):a.removeAttribute("name")}},{id:"value",type:"text",label:d.lang.forms.hidden.value,"default":"",accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}}]}]}}); \ No newline at end of file
diff --git a/plugins/forms/dialogs/radio.js b/plugins/forms/dialogs/radio.js
new file mode 100755
index 0000000..c05da27
--- /dev/null
+++ b/plugins/forms/dialogs/radio.js
@@ -0,0 +1,25 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("radio", function(c) {
+ return {
+ title: c.lang.forms.checkboxAndRadio.radioTitle, minWidth: 350, minHeight: 140, onShow: function() { delete this.radioButton; var a = this.getParentEditor().getSelection().getSelectedElement(); a && "input" == a.getName() && "radio" == a.getAttribute("type") && (this.radioButton = a, this.setupContent(a)) }, onOk: function() { var a, b = this.radioButton; b || (a = this.getParentEditor(), b = a.document.createElement("input"), b.setAttribute("type", "radio"), a.insertElement(b)); this.commitContent({ element: b }) },
+ contents: [{
+ id: "info", label: c.lang.forms.checkboxAndRadio.radioTitle, title: c.lang.forms.checkboxAndRadio.radioTitle, elements: [{ id: "name", type: "text", label: c.lang.common.name, "default": "", accessKey: "N", setup: function(a) { this.setValue(a.data("cke-saved-name") || a.getAttribute("name") || "") }, commit: function(a) { a = a.element; this.getValue() ? a.data("cke-saved-name", this.getValue()) : (a.data("cke-saved-name", !1), a.removeAttribute("name")) } }, {
+ id: "value", type: "text", label: c.lang.forms.checkboxAndRadio.value, "default": "",
+ accessKey: "V", setup: function(a) { this.setValue(a.getAttribute("value") || "") }, commit: function(a) { a = a.element; this.getValue() ? a.setAttribute("value", this.getValue()) : a.removeAttribute("value") }
+ }, {
+ id: "checked", type: "checkbox", label: c.lang.forms.checkboxAndRadio.selected, "default": "", accessKey: "S", value: "checked", setup: function(a) { this.setValue(a.getAttribute("checked")) }, commit: function(a) {
+ var b = a.element; if (CKEDITOR.env.ie) {
+ var d = b.getAttribute("checked"), e = !!this.getValue(); d != e && (d = CKEDITOR.dom.element.createFromHtml('\x3cinput type\x3d"radio"' +
+ (e ? ' checked\x3d"checked"' : "") + "\x3e\x3c/input\x3e", c.document), b.copyAttributes(d, { type: 1, checked: 1 }), d.replace(b), e && d.setAttribute("checked", "checked"), c.getSelection().selectElement(d), a.element = d)
+ } else a = this.getValue(), CKEDITOR.env.webkit && (b.$.checked = a), a ? b.setAttribute("checked", "checked") : b.removeAttribute("checked")
+ }
+ }, {
+ id: "required", type: "checkbox", label: c.lang.forms.checkboxAndRadio.required, "default": "", accessKey: "Q", value: "required", setup: CKEDITOR.plugins.forms._setupRequiredAttribute,
+ commit: function(a) { a = a.element; this.getValue() ? a.setAttribute("required", "required") : a.removeAttribute("required") }
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/forms/dialogs/select.js b/plugins/forms/dialogs/select.js
new file mode 100755
index 0000000..22afbb7
--- /dev/null
+++ b/plugins/forms/dialogs/select.js
@@ -0,0 +1,85 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("select", function(c) {
+ function h(a, b, e, d, c) { a = f(a); d = d ? d.createElement("OPTION") : document.createElement("OPTION"); if (a && d && "option" == d.getName()) CKEDITOR.env.ie ? (isNaN(parseInt(c, 10)) ? a.$.options.add(d.$) : a.$.options.add(d.$, c), d.$.innerHTML = 0 < b.length ? b : "", d.$.value = e) : (null !== c && c < a.getChildCount() ? a.getChild(0 > c ? 0 : c).insertBeforeMe(d) : a.append(d), d.setText(0 < b.length ? b : ""), d.setValue(e)); else return !1; return d } function p(a) {
+ a = f(a); for (var b = g(a), e = a.getChildren().count() - 1; 0 <=
+ e; e--)a.getChild(e).$.selected && a.getChild(e).remove(); k(a, b)
+ } function q(a, b, e, d) { a = f(a); if (0 > b) return !1; a = a.getChild(b); a.setText(e); a.setValue(d); return a } function m(a) { for (a = f(a); a.getChild(0) && a.getChild(0).remove();); } function l(a, b, e) { a = f(a); var d = g(a); if (0 > d) return !1; b = d + b; b = 0 > b ? 0 : b; b = b >= a.getChildCount() ? a.getChildCount() - 1 : b; if (d == b) return !1; var d = a.getChild(d), c = d.getText(), r = d.getValue(); d.remove(); d = h(a, c, r, e ? e : null, b); k(a, b); return d } function g(a) { return (a = f(a)) ? a.$.selectedIndex : -1 }
+ function k(a, b) { a = f(a); if (0 > b) return null; var e = a.getChildren().count(); a.$.selectedIndex = b >= e ? e - 1 : b; return a } function n(a) { return (a = f(a)) ? a.getChildren() : !1 } function f(a) { return a && a.domId && a.getInputElement().$ ? a.getInputElement() : a && a.$ ? a : !1 } return {
+ title: c.lang.forms.select.title, minWidth: CKEDITOR.env.ie ? 460 : 395, minHeight: CKEDITOR.env.ie ? 320 : 300, onShow: function() {
+ delete this.selectBox; this.setupContent("clear"); var a = this.getParentEditor().getSelection().getSelectedElement(); if (a && "select" == a.getName()) {
+ this.selectBox =
+ a; this.setupContent(a.getName(), a); for (var a = n(a), b = 0; b < a.count(); b++)this.setupContent("option", a.getItem(b))
+ }
+ }, onOk: function() { var a = this.getParentEditor(), b = this.selectBox, e = !b; e && (b = a.document.createElement("select")); this.commitContent(b); if (e && (a.insertElement(b), CKEDITOR.env.ie)) { var d = a.getSelection(), c = d.createBookmarks(); setTimeout(function() { d.selectBookmarks(c) }, 0) } }, contents: [{
+ id: "info", label: c.lang.forms.select.selectInfo, title: c.lang.forms.select.selectInfo, accessKey: "", elements: [{
+ id: "txtName",
+ type: "text", widths: ["25%", "75%"], labelLayout: "horizontal", label: c.lang.common.name, "default": "", accessKey: "N", style: "width:350px", setup: function(a, b) { "clear" == a ? this.setValue(this["default"] || "") : "select" == a && this.setValue(b.data("cke-saved-name") || b.getAttribute("name") || "") }, commit: function(a) { this.getValue() ? a.data("cke-saved-name", this.getValue()) : (a.data("cke-saved-name", !1), a.removeAttribute("name")) }
+ }, {
+ id: "txtValue", type: "text", widths: ["25%", "75%"], labelLayout: "horizontal", label: c.lang.forms.select.value,
+ style: "width:350px", "default": "", className: "cke_disabled", onLoad: function() { this.getInputElement().setAttribute("readOnly", !0) }, setup: function(a, b) { "clear" == a ? this.setValue("") : "option" == a && b.getAttribute("selected") && this.setValue(b.$.value) }
+ }, {
+ type: "hbox", className: "cke_dialog_forms_select_order_txtsize", widths: ["175px", "170px"], children: [{
+ id: "txtSize", type: "text", labelLayout: "horizontal", label: c.lang.forms.select.size, "default": "", accessKey: "S", style: "width:175px", validate: function() {
+ var a = CKEDITOR.dialog.validate.integer(c.lang.common.validateNumberFailed);
+ return "" === this.getValue() || a.apply(this)
+ }, setup: function(a, b) { "select" == a && this.setValue(b.getAttribute("size") || ""); CKEDITOR.env.webkit && this.getInputElement().setStyle("width", "86px") }, commit: function(a) { this.getValue() ? a.setAttribute("size", this.getValue()) : a.removeAttribute("size") }
+ }, { type: "html", html: "\x3cspan\x3e" + CKEDITOR.tools.htmlEncode(c.lang.forms.select.lines) + "\x3c/span\x3e" }]
+ }, { type: "html", html: "\x3cspan\x3e" + CKEDITOR.tools.htmlEncode(c.lang.forms.select.opAvail) + "\x3c/span\x3e" }, {
+ type: "hbox",
+ widths: ["115px", "115px", "100px"], className: "cke_dialog_forms_select_order", children: [{
+ type: "vbox", children: [{ id: "txtOptName", type: "text", label: c.lang.forms.select.opText, style: "width:115px", setup: function(a) { "clear" == a && this.setValue("") } }, {
+ type: "select", id: "cmbName", label: "", title: "", size: 5, style: "width:115px;height:75px", items: [], onChange: function() {
+ var a = this.getDialog(), b = a.getContentElement("info", "cmbValue"), e = a.getContentElement("info", "txtOptName"), a = a.getContentElement("info", "txtOptValue"),
+ d = g(this); k(b, d); e.setValue(this.getValue()); a.setValue(b.getValue())
+ }, setup: function(a, b) { "clear" == a ? m(this) : "option" == a && h(this, b.getText(), b.getText(), this.getDialog().getParentEditor().document) }, commit: function(a) {
+ var b = this.getDialog(), e = n(this), d = n(b.getContentElement("info", "cmbValue")), c = b.getContentElement("info", "txtValue").getValue(); m(a); for (var f = 0; f < e.count(); f++) {
+ var g = h(a, e.getItem(f).getValue(), d.getItem(f).getValue(), b.getParentEditor().document); d.getItem(f).getValue() == c && (g.setAttribute("selected",
+ "selected"), g.selected = !0)
+ }
+ }
+ }]
+ }, {
+ type: "vbox", children: [{ id: "txtOptValue", type: "text", label: c.lang.forms.select.opValue, style: "width:115px", setup: function(a) { "clear" == a && this.setValue("") } }, {
+ type: "select", id: "cmbValue", label: "", size: 5, style: "width:115px;height:75px", items: [], onChange: function() { var a = this.getDialog(), b = a.getContentElement("info", "cmbName"), e = a.getContentElement("info", "txtOptName"), a = a.getContentElement("info", "txtOptValue"), d = g(this); k(b, d); e.setValue(b.getValue()); a.setValue(this.getValue()) },
+ setup: function(a, b) { if ("clear" == a) m(this); else if ("option" == a) { var e = b.getValue(); h(this, e, e, this.getDialog().getParentEditor().document); "selected" == b.getAttribute("selected") && this.getDialog().getContentElement("info", "txtValue").setValue(e) } }
+ }]
+ }, {
+ type: "vbox", padding: 5, children: [{
+ type: "button", id: "btnAdd", label: c.lang.forms.select.btnAdd, title: c.lang.forms.select.btnAdd, style: "width:100%;", onClick: function() {
+ var a = this.getDialog(), b = a.getContentElement("info", "txtOptName"), e = a.getContentElement("info",
+ "txtOptValue"), d = a.getContentElement("info", "cmbName"), c = a.getContentElement("info", "cmbValue"); h(d, b.getValue(), b.getValue(), a.getParentEditor().document); h(c, e.getValue(), e.getValue(), a.getParentEditor().document); b.setValue(""); e.setValue("")
+ }
+ }, {
+ type: "button", id: "btnModify", label: c.lang.forms.select.btnModify, title: c.lang.forms.select.btnModify, style: "width:100%;", onClick: function() {
+ var a = this.getDialog(), b = a.getContentElement("info", "txtOptName"), e = a.getContentElement("info", "txtOptValue"), d =
+ a.getContentElement("info", "cmbName"), a = a.getContentElement("info", "cmbValue"), c = g(d); 0 <= c && (q(d, c, b.getValue(), b.getValue()), q(a, c, e.getValue(), e.getValue()))
+ }
+ }, { type: "button", id: "btnUp", style: "width:100%;", label: c.lang.forms.select.btnUp, title: c.lang.forms.select.btnUp, onClick: function() { var a = this.getDialog(), b = a.getContentElement("info", "cmbName"), c = a.getContentElement("info", "cmbValue"); l(b, -1, a.getParentEditor().document); l(c, -1, a.getParentEditor().document) } }, {
+ type: "button", id: "btnDown", style: "width:100%;",
+ label: c.lang.forms.select.btnDown, title: c.lang.forms.select.btnDown, onClick: function() { var a = this.getDialog(), b = a.getContentElement("info", "cmbName"), c = a.getContentElement("info", "cmbValue"); l(b, 1, a.getParentEditor().document); l(c, 1, a.getParentEditor().document) }
+ }]
+ }]
+ }, {
+ type: "hbox", widths: ["40%", "20%", "40%"], children: [{
+ type: "button", id: "btnSetValue", label: c.lang.forms.select.btnSetValue, title: c.lang.forms.select.btnSetValue, onClick: function() {
+ var a = this.getDialog(), b = a.getContentElement("info", "cmbValue");
+ a.getContentElement("info", "txtValue").setValue(b.getValue())
+ }
+ }, { type: "button", id: "btnDelete", label: c.lang.forms.select.btnDelete, title: c.lang.forms.select.btnDelete, onClick: function() { var a = this.getDialog(), b = a.getContentElement("info", "cmbName"), c = a.getContentElement("info", "cmbValue"), d = a.getContentElement("info", "txtOptName"), a = a.getContentElement("info", "txtOptValue"); p(b); p(c); d.setValue(""); a.setValue("") } }, {
+ type: "vbox", children: [{
+ id: "chkMulti", type: "checkbox", label: c.lang.forms.select.chkMulti,
+ "default": "", accessKey: "M", value: "checked", setup: function(a, b) { "select" == a && this.setValue(b.getAttribute("multiple")) }, commit: function(a) { this.getValue() ? a.setAttribute("multiple", this.getValue()) : a.removeAttribute("multiple") }
+ }, {
+ id: "required", type: "checkbox", label: c.lang.forms.select.required, "default": "", accessKey: "Q", value: "checked", setup: function(a, b) { "select" == a && CKEDITOR.plugins.forms._setupRequiredAttribute.call(this, b) }, commit: function(a) {
+ this.getValue() ? a.setAttribute("required", "required") :
+ a.removeAttribute("required")
+ }
+ }]
+ }]
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/forms/dialogs/textarea.js b/plugins/forms/dialogs/textarea.js
new file mode 100755
index 0000000..f5208e8
--- /dev/null
+++ b/plugins/forms/dialogs/textarea.js
@@ -0,0 +1,22 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("textarea", function(b) {
+ return {
+ title: b.lang.forms.textarea.title, minWidth: 350, minHeight: 220, onShow: function() { delete this.textarea; var a = this.getParentEditor().getSelection().getSelectedElement(); a && "textarea" == a.getName() && (this.textarea = a, this.setupContent(a)) }, onOk: function() { var a, b = this.textarea, c = !b; c && (a = this.getParentEditor(), b = a.document.createElement("textarea")); this.commitContent(b); c && a.insertElement(b) }, contents: [{
+ id: "info", label: b.lang.forms.textarea.title, title: b.lang.forms.textarea.title,
+ elements: [{ id: "_cke_saved_name", type: "text", label: b.lang.common.name, "default": "", accessKey: "N", setup: function(a) { this.setValue(a.data("cke-saved-name") || a.getAttribute("name") || "") }, commit: function(a) { this.getValue() ? a.data("cke-saved-name", this.getValue()) : (a.data("cke-saved-name", !1), a.removeAttribute("name")) } }, {
+ type: "hbox", widths: ["50%", "50%"], children: [{
+ id: "cols", type: "text", label: b.lang.forms.textarea.cols, "default": "", accessKey: "C", style: "width:50px", validate: CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed),
+ setup: function(a) { a = a.hasAttribute("cols") && a.getAttribute("cols"); this.setValue(a || "") }, commit: function(a) { this.getValue() ? a.setAttribute("cols", this.getValue()) : a.removeAttribute("cols") }
+ }, {
+ id: "rows", type: "text", label: b.lang.forms.textarea.rows, "default": "", accessKey: "R", style: "width:50px", validate: CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed), setup: function(a) { a = a.hasAttribute("rows") && a.getAttribute("rows"); this.setValue(a || "") }, commit: function(a) {
+ this.getValue() ? a.setAttribute("rows",
+ this.getValue()) : a.removeAttribute("rows")
+ }
+ }]
+ }, { id: "value", type: "textarea", label: b.lang.forms.textfield.value, "default": "", setup: function(a) { this.setValue(a.$.defaultValue) }, commit: function(a) { a.$.value = a.$.defaultValue = this.getValue() } }, { id: "required", type: "checkbox", label: b.lang.forms.textfield.required, "default": "", accessKey: "Q", value: "required", setup: CKEDITOR.plugins.forms._setupRequiredAttribute, commit: function(a) { this.getValue() ? a.setAttribute("required", "required") : a.removeAttribute("required") } }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/forms/dialogs/textfield.js b/plugins/forms/dialogs/textfield.js
new file mode 100755
index 0000000..4ac11d6
--- /dev/null
+++ b/plugins/forms/dialogs/textfield.js
@@ -0,0 +1,33 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("textfield", function(b) {
+ function e(a) { a = a.element; var b = this.getValue(); b ? a.setAttribute(this.id, b) : a.removeAttribute(this.id) } function f(a) { a = a.hasAttribute(this.id) && a.getAttribute(this.id); this.setValue(a || "") } var g = { email: 1, password: 1, search: 1, tel: 1, text: 1, url: 1 }; return {
+ title: b.lang.forms.textfield.title, minWidth: 350, minHeight: 150, onShow: function() {
+ delete this.textField; var a = this.getParentEditor().getSelection().getSelectedElement(); !a || "input" != a.getName() || !g[a.getAttribute("type")] &&
+ a.getAttribute("type") || (this.textField = a, this.setupContent(a))
+ }, onOk: function() { var a = this.getParentEditor(), b = this.textField, c = !b; c && (b = a.document.createElement("input"), b.setAttribute("type", "text")); b = { element: b }; c && a.insertElement(b.element); this.commitContent(b); c || a.getSelection().selectElement(b.element) }, onLoad: function() { this.foreach(function(a) { a.getValue && (a.setup || (a.setup = f), a.commit || (a.commit = e)) }) }, contents: [{
+ id: "info", label: b.lang.forms.textfield.title, title: b.lang.forms.textfield.title,
+ elements: [{
+ type: "hbox", widths: ["50%", "50%"], children: [{ id: "_cke_saved_name", type: "text", label: b.lang.forms.textfield.name, "default": "", accessKey: "N", setup: function(a) { this.setValue(a.data("cke-saved-name") || a.getAttribute("name") || "") }, commit: function(a) { a = a.element; this.getValue() ? a.data("cke-saved-name", this.getValue()) : (a.data("cke-saved-name", !1), a.removeAttribute("name")) } }, {
+ id: "value", type: "text", label: b.lang.forms.textfield.value, "default": "", accessKey: "V", commit: function(a) {
+ if (CKEDITOR.env.ie &&
+ !this.getValue()) { var d = a.element, c = new CKEDITOR.dom.element("input", b.document); d.copyAttributes(c, { value: 1 }); c.replace(d); a.element = c } else e.call(this, a)
+ }
+ }]
+ }, {
+ type: "hbox", widths: ["50%", "50%"], children: [{ id: "size", type: "text", label: b.lang.forms.textfield.charWidth, "default": "", accessKey: "C", style: "width:50px", validate: CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed) }, {
+ id: "maxLength", type: "text", label: b.lang.forms.textfield.maxChars, "default": "", accessKey: "M", style: "width:50px",
+ validate: CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)
+ }], onLoad: function() { CKEDITOR.env.ie7Compat && this.getElement().setStyle("zoom", "100%") }
+ }, {
+ id: "type", type: "select", label: b.lang.forms.textfield.type, "default": "text", accessKey: "M", items: [[b.lang.forms.textfield.typeEmail, "email"], [b.lang.forms.textfield.typePass, "password"], [b.lang.forms.textfield.typeSearch, "search"], [b.lang.forms.textfield.typeTel, "tel"], [b.lang.forms.textfield.typeText, "text"], [b.lang.forms.textfield.typeUrl,
+ "url"]], setup: function(a) { this.setValue(a.getAttribute("type")) }, commit: function(a) { var d = a.element; if (CKEDITOR.env.ie) { var c = d.getAttribute("type"), e = this.getValue(); c != e && (c = CKEDITOR.dom.element.createFromHtml('\x3cinput type\x3d"' + e + '"\x3e\x3c/input\x3e', b.document), d.copyAttributes(c, { type: 1 }), c.replace(d), a.element = c) } else d.setAttribute("type", this.getValue()) }
+ }, {
+ id: "required", type: "checkbox", label: b.lang.forms.textfield.required, "default": "", accessKey: "Q", value: "required", setup: CKEDITOR.plugins.forms._setupRequiredAttribute,
+ commit: function(a) { a = a.element; this.getValue() ? a.setAttribute("required", "required") : a.removeAttribute("required") }
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/forms/images/hiddenfield.gif b/plugins/forms/images/hiddenfield.gif
new file mode 100755
index 0000000..988d956
--- /dev/null
+++ b/plugins/forms/images/hiddenfield.gif
Binary files differ
diff --git a/plugins/html5validation/CHANGELOG.txt b/plugins/html5validation/CHANGELOG.txt
new file mode 100755
index 0000000..87ce8d0
--- /dev/null
+++ b/plugins/html5validation/CHANGELOG.txt
@@ -0,0 +1,9 @@
+Version 1.0.0.3 (published 4/24/2015)
+ - Added regular expression examples onto Validation tabs.
+Version 1.0.0.2 (published 4/3/2015)
+ - Moved files from html5validation/ directory to root directory
+Version 1.0.0.1 (published 4/3/2015)
+ - Added CHANGELOG.txt
+ - Updted README.md - Added "Credits / Tribute" section
+Version 1.0 (published 4/2/2015)
+ - Created plugin
diff --git a/plugins/html5validation/LICENSE b/plugins/html5validation/LICENSE
new file mode 100755
index 0000000..733c072
--- /dev/null
+++ b/plugins/html5validation/LICENSE
@@ -0,0 +1,675 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {one line to give the program's name and a brief idea of what it does.}
+ Copyright (C) {year} {name of author}
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ {project} Copyright (C) {year} {fullname}
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/plugins/html5validation/README.md b/plugins/html5validation/README.md
new file mode 100755
index 0000000..e2c5f1b
--- /dev/null
+++ b/plugins/html5validation/README.md
@@ -0,0 +1,29 @@
+# HTML5Validation Plugin for CKEditor
+The HTML5Validation plugin for CKEditor extends the core Forms plugin adding a Form Validation tab onto several elements. This allows you to add HTML5 Form Validation attributes onto your forms inside of CKEditor.
+
+## Features Overview
+* Adds Form Validation tab to textfield, textarea, radio, checkbox, and select form dialogs. The Form Validation tab allows you to set the HTML5 Required & Pattern attributes
+* Adds Form Validation tab to form dialog. This allows you to add a novalidate HTML5 attribute to the form tag to disable HTML5 form validation
+
+## Requirements
+1. CKEditor version 4.4.7 or greater [http://ckeditor.com/](http://ckeditor.com/)
+1. The Forms plugin for CKEditor (normally installed by default)
+
+## Installation Instructions
+1. Extract the downloaded repository
+1. Copy the **html5validation** folder to your **"ckeditor/plugins/"** folder
+1. Open the **"ckeditor/config.js"** file in your favorite text editor
+1. Add **html5validation** to **config.extraPlugins** and save your changes. If that line isn't found, add it. EX:
+
+> config.extraPlugins = 'html5validation';
+
+## Credits / Tribute
+This plugin was developed and is maintained by the [https://totalwebservices.net/](Total Web Services team).
+
+A big thanks goes out to the following people & organizations:
+[http://www.websiterelevance.com](WebsiteRelevance.com) - for supporting the development of the plugin.
+[http://www.ckeditor.com](CKEditor) - For providing CKEditor so we could build this plugin for it.
+Piotrek Reinmar Koszuliński - A developer on the CKEditor team who pointed us in the right direction with a bug we encountered during development.
+
+## License
+Licensed under GPL Version 3.0. For additional details please see the LICENSE.md file.
diff --git a/plugins/html5video/dialogs/html5video.js b/plugins/html5video/dialogs/html5video.js
new file mode 100755
index 0000000..dfb7369
--- /dev/null
+++ b/plugins/html5video/dialogs/html5video.js
@@ -0,0 +1,48 @@
+CKEDITOR.dialog.add("html5video", function(b) {
+ return {
+ title: b.lang.html5video.title, minWidth: 500, minHeight: 100, contents: [{
+ id: "info", label: b.lang.html5video.infoLabel, elements: [{
+ type: "vbox", padding: 0, children: [{
+ type: "hbox", widths: ["365px", "110px"], align: "right", children: [{ type: "text", id: "url", label: b.lang.html5video.allowed, required: !0, validate: CKEDITOR.dialog.validate.notEmpty(b.lang.html5video.urlMissing), setup: function(a) { this.setValue(a.data.src) }, commit: function(a) { a.setData("src", this.getValue()) } },
+ { type: "button", id: "browse", style: "display:inline-block;margin-top:14px;", align: "center", label: b.lang.common.browseServer, hidden: !0, filebrowser: "info:url" }]
+ }]
+ }, { type: "checkbox", id: "responsive", label: b.lang.html5video.responsive, setup: function(a) { this.setValue(a.data.responsive) }, commit: function(a) { a.setData("responsive", this.getValue() ? "true" : "") } }, {
+ type: "vbox", padding: 0, children: [{
+ type: "hbox", widths: ["365px", "110px"], align: "right", children: [{
+ type: "text", id: "poster", label: b.lang.html5video.poster,
+ setup: function(a) { this.setValue(a.data.poster) }, commit: function(a) { a.setData("poster", this.getValue()) }
+ }, { type: "button", id: "browseposter", style: "display:inline-block;margin-top:14px;", align: "center", label: b.lang.common.browseServer, hidden: !0, filebrowser: { action: "Browse", target: "info:poster", url: b.config.filebrowserImageBrowseUrl } }]
+ }]
+ }, {
+ type: "checkbox", id: "controls", label: b.lang.html5video.controls, setup: function(a) { this.setValue(a.data.controls) }, commit: function(a) {
+ a.setData("controls", this.getValue() ?
+ "true" : "")
+ }
+ }, { type: "hbox", id: "size", children: [{ type: "text", id: "width", label: b.lang.common.width, setup: function(a) { a.data.width && this.setValue(a.data.width) }, commit: function(a) { a.setData("width", this.getValue()) } }, { type: "text", id: "height", label: b.lang.common.height, setup: function(a) { a.data.height && this.setValue(a.data.height) }, commit: function(a) { a.setData("height", this.getValue()) } }] }, {
+ type: "hbox", id: "alignment", children: [{
+ type: "radio", id: "align", label: b.lang.common.align, items: [[b.lang.common.alignCenter,
+ "center"], [b.lang.common.alignLeft, "left"], [b.lang.common.alignRight, "right"], [b.lang.common.alignNone, "none"]], "default": "center", setup: function(a) { a.data.align && this.setValue(a.data.align) }, commit: function(a) { a.setData("align", this.getValue()) }
+ }]
+ }]
+ }, {
+ id: "Upload", hidden: !0, filebrowser: "uploadButton", label: b.lang.html5video.upload, elements: [{ type: "file", id: "upload", label: b.lang.html5video.btnUpload, style: "height:40px", size: 38 }, {
+ type: "fileButton", id: "uploadButton", filebrowser: "info:url", label: b.lang.html5video.btnUpload,
+ "for": ["Upload", "upload"]
+ }]
+ }, {
+ id: "advanced", label: b.lang.html5video.advanced, elements: [{
+ type: "vbox", padding: 10, children: [{
+ type: "hbox", widths: ["33%", "33%", "33%"], children: [{ type: "radio", id: "autoplay", label: b.lang.html5video.autoplay, items: [[b.lang.html5video.yes, "yes"], [b.lang.html5video.no, "no"]], "default": "no", setup: function(a) { a.data.autoplay && this.setValue(a.data.autoplay) }, commit: function(a) { a.setData("autoplay", this.getValue()) } }, {
+ type: "radio", id: "loop", label: b.lang.html5video.loop, items: [[b.lang.html5video.yes,
+ "yes"], [b.lang.html5video.no, "no"]], "default": "no", setup: function(a) { a.data.loop && this.setValue(a.data.loop) }, commit: function(a) { a.setData("loop", this.getValue()) }
+ }, { type: "radio", id: "allowdownload", label: b.lang.html5video.allowdownload, items: [[b.lang.html5video.yes, "yes"], [b.lang.html5video.no, "no"]], "default": "no", setup: function(a) { a.data.allowdownload && this.setValue(a.data.allowdownload) }, commit: function(a) { a.setData("allowdownload", this.getValue()) } }]
+ }, {
+ type: "hbox", children: [{
+ type: "text", id: "advisorytitle",
+ label: b.lang.html5video.advisorytitle, "default": "", setup: function(a) { a.data.advisorytitle && this.setValue(a.data.advisorytitle) }, commit: function(a) { a.setData("advisorytitle", this.getValue()) }
+ }]
+ }]
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/icons.png b/plugins/icons.png
new file mode 100755
index 0000000..60baf20
--- /dev/null
+++ b/plugins/icons.png
Binary files differ
diff --git a/plugins/icons_hidpi.png b/plugins/icons_hidpi.png
new file mode 100755
index 0000000..d3be197
--- /dev/null
+++ b/plugins/icons_hidpi.png
Binary files differ
diff --git a/plugins/iframe/dialogs/iframe.js b/plugins/iframe/dialogs/iframe.js
new file mode 100755
index 0000000..4184281
--- /dev/null
+++ b/plugins/iframe/dialogs/iframe.js
@@ -0,0 +1,30 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+(function() {
+ function c(b) { var c = this instanceof CKEDITOR.ui.dialog.checkbox; b.hasAttribute(this.id) && (b = b.getAttribute(this.id), c ? this.setValue(e[this.id]["true"] == b.toLowerCase()) : this.setValue(b)) } function d(b) { var c = "" === this.getValue(), a = this instanceof CKEDITOR.ui.dialog.checkbox, d = this.getValue(); c ? b.removeAttribute(this.att || this.id) : a ? b.setAttribute(this.id, e[this.id][d]) : b.setAttribute(this.att || this.id, d) } var e = { scrolling: { "true": "yes", "false": "no" }, frameborder: { "true": "1", "false": "0" } };
+ CKEDITOR.dialog.add("iframe", function(b) {
+ var f = b.lang.iframe, a = b.lang.common, e = b.plugins.dialogadvtab; return {
+ title: f.title, minWidth: 350, minHeight: 260, onShow: function() { this.fakeImage = this.iframeNode = null; var a = this.getSelectedElement(); a && a.data("cke-real-element-type") && "iframe" == a.data("cke-real-element-type") && (this.fakeImage = a, this.iframeNode = a = b.restoreRealElement(a), this.setupContent(a)) }, onOk: function() {
+ var a; a = this.fakeImage ? this.iframeNode : new CKEDITOR.dom.element("iframe"); var c = {}, d = {};
+ this.commitContent(a, c, d); a = b.createFakeElement(a, "cke_iframe", "iframe", !0); a.setAttributes(d); a.setStyles(c); this.fakeImage ? (a.replace(this.fakeImage), b.getSelection().selectElement(a)) : b.insertElement(a)
+ }, contents: [{
+ id: "info", label: a.generalTab, accessKey: "I", elements: [{ type: "vbox", padding: 0, children: [{ id: "src", type: "text", label: a.url, required: !0, validate: CKEDITOR.dialog.validate.notEmpty(f.noUrl), setup: c, commit: d }] }, {
+ type: "hbox", children: [{
+ id: "width", type: "text", requiredContent: "iframe[width]",
+ style: "width:100%", labelLayout: "vertical", label: a.width, validate: CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1", a.width)), setup: c, commit: d
+ }, { id: "height", type: "text", requiredContent: "iframe[height]", style: "width:100%", labelLayout: "vertical", label: a.height, validate: CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1", a.height)), setup: c, commit: d }, {
+ id: "align", type: "select", requiredContent: "iframe[align]", "default": "", items: [[a.notSet, ""], [a.left, "left"], [a.right,
+ "right"], [a.alignTop, "top"], [a.alignMiddle, "middle"], [a.alignBottom, "bottom"]], style: "width:100%", labelLayout: "vertical", label: a.align, setup: function(a, b) { c.apply(this, arguments); if (b) { var d = b.getAttribute("align"); this.setValue(d && d.toLowerCase() || "") } }, commit: function(a, b, c) { d.apply(this, arguments); this.getValue() && (c.align = this.getValue()) }
+ }]
+ }, {
+ type: "hbox", widths: ["50%", "50%"], children: [{ id: "scrolling", type: "checkbox", requiredContent: "iframe[scrolling]", label: f.scrolling, setup: c, commit: d }, {
+ id: "frameborder",
+ type: "checkbox", requiredContent: "iframe[frameborder]", label: f.border, setup: c, commit: d
+ }]
+ }, { type: "hbox", widths: ["50%", "50%"], children: [{ id: "name", type: "text", requiredContent: "iframe[name]", label: a.name, setup: c, commit: d }, { id: "title", type: "text", requiredContent: "iframe[title]", label: a.advisoryTitle, setup: c, commit: d }] }, { id: "longdesc", type: "text", requiredContent: "iframe[longdesc]", label: a.longDescr, setup: c, commit: d }]
+ }, e && e.createAdvancedTab(b, { id: 1, classes: 1, styles: 1 }, "iframe")]
+ }
+ })
+})(); \ No newline at end of file
diff --git a/plugins/iframe/images/placeholder.png b/plugins/iframe/images/placeholder.png
new file mode 100755
index 0000000..4af0956
--- /dev/null
+++ b/plugins/iframe/images/placeholder.png
Binary files differ
diff --git a/plugins/image/dialogs/image.js b/plugins/image/dialogs/image.js
new file mode 100755
index 0000000..69125bc
--- /dev/null
+++ b/plugins/image/dialogs/image.js
@@ -0,0 +1,162 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+(function() {
+ var u = function(d, k) {
+ function u() { var a = arguments, b = this.getContentElement("advanced", "txtdlgGenStyle"); b && b.commit.apply(b, a); this.foreach(function(b) { b.commit && "txtdlgGenStyle" != b.id && b.commit.apply(b, a) }) } function g(a) { if (!v) { v = 1; var b = this.getDialog(), c = b.imageElement; if (c) { this.commit(1, c); a = [].concat(a); for (var d = a.length, h, e = 0; e < d; e++)(h = b.getContentElement.apply(b, a[e].split(":"))) && h.setup(1, c) } v = 0 } } var l = /^\s*(\d+)((px)|\%)?\s*$/i, y = /(^\s*(\d+)((px)|\%)?\s*$)|^$/i, q = /^\d+px$/,
+ z = function() { var a = this.getValue(), b = this.getDialog(), c = a.match(l); c && ("%" == c[2] && m(b, !1), a = c[1]); b.lockRatio && (c = b.originalElement, "true" == c.getCustomData("isReady") && ("txtHeight" == this.id ? (a && "0" != a && (a = Math.round(a / c.$.height * c.$.width)), isNaN(a) || b.setValueOf("info", "txtWidth", a)) : (a && "0" != a && (a = Math.round(a / c.$.width * c.$.height)), isNaN(a) || b.setValueOf("info", "txtHeight", a)))); e(b) }, e = function(a) { if (!a.originalElement || !a.preview) return 1; a.commitContent(4, a.preview); return 0 }, v, m = function(a,
+ b) {
+ if (!a.getContentElement("info", "ratioLock")) return null; var c = a.originalElement; if (!c) return null; if ("check" == b) { if (!a.userlockRatio && "true" == c.getCustomData("isReady")) { var d = a.getValueOf("info", "txtWidth"), h = a.getValueOf("info", "txtHeight"), c = c.$.width / c.$.height, e = d / h; a.lockRatio = !1; d || h ? 1 == Math.round(c / e * 100) / 100 && (a.lockRatio = !0) : a.lockRatio = !0 } } else void 0 !== b ? a.lockRatio = b : (a.userlockRatio = 1, a.lockRatio = !a.lockRatio); d = CKEDITOR.document.getById(r); a.lockRatio ? d.removeClass("cke_btn_unlocked") :
+ d.addClass("cke_btn_unlocked"); d.setAttribute("aria-checked", a.lockRatio); CKEDITOR.env.hc && d.getChild(0).setHtml(a.lockRatio ? CKEDITOR.env.ie ? "■" : "▣" : CKEDITOR.env.ie ? "□" : "▢"); return a.lockRatio
+ }, A = function(a, b) { var c = a.originalElement; if ("true" == c.getCustomData("isReady")) { var d = a.getContentElement("info", "txtWidth"), h = a.getContentElement("info", "txtHeight"), f; b ? c = f = 0 : (f = c.$.width, c = c.$.height); d && d.setValue(f); h && h.setValue(c) } e(a) }, B = function(a, b) {
+ function c(a, b) {
+ var c = a.match(l); return c ? ("%" ==
+ c[2] && (c[1] += "%", m(d, !1)), c[1]) : b
+ } if (1 == a) { var d = this.getDialog(), e = "", f = "txtWidth" == this.id ? "width" : "height", g = b.getAttribute(f); g && (e = c(g, e)); e = c(b.getStyle(f), e); this.setValue(e) }
+ }, w, t = function() {
+ var a = this.originalElement, b = CKEDITOR.document.getById(n); a.setCustomData("isReady", "true"); a.removeListener("load", t); a.removeListener("error", f); a.removeListener("abort", f); b && b.setStyle("display", "none"); this.dontResetSize || A(this, !1 === d.config.image_prefillDimensions); this.firstLoad && CKEDITOR.tools.setTimeout(function() {
+ m(this,
+ "check")
+ }, 0, this); this.dontResetSize = this.firstLoad = !1; e(this)
+ }, f = function() { var a = this.originalElement, b = CKEDITOR.document.getById(n); a.removeListener("load", t); a.removeListener("error", f); a.removeListener("abort", f); a = CKEDITOR.getUrl(CKEDITOR.plugins.get("image").path + "images/noimage.png"); this.preview && this.preview.setAttribute("src", a); b && b.setStyle("display", "none"); m(this, !1) }, p = function(a) { return CKEDITOR.tools.getNextId() + "_" + a }, r = p("btnLockSizes"), x = p("btnResetSize"), n = p("ImagePreviewLoader"),
+ D = p("previewLink"), C = p("previewImage"); return {
+ title: d.lang.image["image" == k ? "title" : "titleButton"], minWidth: "moono-lisa" == (CKEDITOR.skinName || d.config.skin) ? 500 : 420, minHeight: 360, onShow: function() {
+ this.linkEditMode = this.imageEditMode = this.linkElement = this.imageElement = !1; this.lockRatio = !0; this.userlockRatio = 0; this.dontResetSize = !1; this.firstLoad = !0; this.addLink = !1; var a = this.getParentEditor(), b = a.getSelection(), c = (b = b && b.getSelectedElement()) && a.elementPath(b).contains("a", 1), d = CKEDITOR.document.getById(n);
+ d && d.setStyle("display", "none"); w = new CKEDITOR.dom.element("img", a.document); this.preview = CKEDITOR.document.getById(C); this.originalElement = a.document.createElement("img"); this.originalElement.setAttribute("alt", ""); this.originalElement.setCustomData("isReady", "false"); c && (this.linkElement = c, this.addLink = this.linkEditMode = !0, a = c.getChildren(), 1 == a.count() && (d = a.getItem(0), d.type == CKEDITOR.NODE_ELEMENT && (d.is("img") || d.is("input")) && (this.imageElement = a.getItem(0), this.imageElement.is("img") ? this.imageEditMode =
+ "img" : this.imageElement.is("input") && (this.imageEditMode = "input"))), "image" == k && this.setupContent(2, c)); if (this.customImageElement) this.imageEditMode = "img", this.imageElement = this.customImageElement, delete this.customImageElement; else if (b && "img" == b.getName() && !b.data("cke-realelement") || b && "input" == b.getName() && "image" == b.getAttribute("type")) this.imageEditMode = b.getName(), this.imageElement = b; this.imageEditMode && (this.cleanImageElement = this.imageElement, this.imageElement = this.cleanImageElement.clone(!0,
+ !0), this.setupContent(1, this.imageElement)); m(this, !0); CKEDITOR.tools.trim(this.getValueOf("info", "txtUrl")) || (this.preview.removeAttribute("src"), this.preview.setStyle("display", "none"))
+ }, onOk: function() {
+ if (this.imageEditMode) {
+ var a = this.imageEditMode; "image" == k && "input" == a && confirm(d.lang.image.button2Img) ? (this.imageElement = d.document.createElement("img"), this.imageElement.setAttribute("alt", ""), d.insertElement(this.imageElement)) : "image" != k && "img" == a && confirm(d.lang.image.img2Button) ? (this.imageElement =
+ d.document.createElement("input"), this.imageElement.setAttributes({ type: "image", alt: "" }), d.insertElement(this.imageElement)) : (this.imageElement = this.cleanImageElement, delete this.cleanImageElement)
+ } else "image" == k ? this.imageElement = d.document.createElement("img") : (this.imageElement = d.document.createElement("input"), this.imageElement.setAttribute("type", "image")), this.imageElement.setAttribute("alt", ""); this.linkEditMode || (this.linkElement = d.document.createElement("a")); this.commitContent(1, this.imageElement);
+ this.commitContent(2, this.linkElement); this.imageElement.getAttribute("style") || this.imageElement.removeAttribute("style"); this.imageEditMode ? !this.linkEditMode && this.addLink ? (d.insertElement(this.linkElement), this.imageElement.appendTo(this.linkElement)) : this.linkEditMode && !this.addLink && (d.getSelection().selectElement(this.linkElement), d.insertElement(this.imageElement)) : this.addLink ? this.linkEditMode ? this.linkElement.equals(d.getSelection().getSelectedElement()) ? (this.linkElement.setHtml(""), this.linkElement.append(this.imageElement,
+ !1)) : d.insertElement(this.imageElement) : (d.insertElement(this.linkElement), this.linkElement.append(this.imageElement, !1)) : d.insertElement(this.imageElement)
+ }, onLoad: function() { "image" != k && this.hidePage("Link"); var a = this._.element.getDocument(); this.getContentElement("info", "ratioLock") && (this.addFocusable(a.getById(x), 5), this.addFocusable(a.getById(r), 5)); this.commitContent = u }, onHide: function() {
+ this.preview && this.commitContent(8, this.preview); this.originalElement && (this.originalElement.removeListener("load",
+ t), this.originalElement.removeListener("error", f), this.originalElement.removeListener("abort", f), this.originalElement.remove(), this.originalElement = !1); delete this.imageElement
+ }, contents: [{
+ id: "info", label: d.lang.image.infoTab, accessKey: "I", elements: [{
+ type: "vbox", padding: 0, children: [{
+ type: "hbox", widths: ["280px", "110px"], align: "right", className: "cke_dialog_image_url", children: [{
+ id: "txtUrl", type: "text", label: d.lang.common.url, required: !0, onChange: function() {
+ var a = this.getDialog(), b = this.getValue(); if (0 <
+ b.length) { var a = this.getDialog(), c = a.originalElement; a.preview && a.preview.removeStyle("display"); c.setCustomData("isReady", "false"); var d = CKEDITOR.document.getById(n); d && d.setStyle("display", ""); c.on("load", t, a); c.on("error", f, a); c.on("abort", f, a); c.setAttribute("src", b); a.preview && (w.setAttribute("src", b), a.preview.setAttribute("src", w.$.src), e(a)) } else a.preview && (a.preview.removeAttribute("src"), a.preview.setStyle("display", "none"))
+ }, setup: function(a, b) {
+ if (1 == a) {
+ var c = b.data("cke-saved-src") ||
+ b.getAttribute("src"); this.getDialog().dontResetSize = !0; this.setValue(c); this.setInitValue()
+ }
+ }, commit: function(a, b) { 1 == a && (this.getValue() || this.isChanged()) ? (b.data("cke-saved-src", this.getValue()), b.setAttribute("src", this.getValue())) : 8 == a && (b.setAttribute("src", ""), b.removeAttribute("src")) }, validate: CKEDITOR.dialog.validate.notEmpty(d.lang.image.urlMissing)
+ }, { type: "button", id: "browse", style: "display:inline-block;margin-top:14px;", align: "center", label: d.lang.common.browseServer, hidden: !0, filebrowser: "info:txtUrl" }]
+ }]
+ },
+ { id: "txtAlt", type: "text", label: d.lang.image.alt, accessKey: "T", "default": "", onChange: function() { e(this.getDialog()) }, setup: function(a, b) { 1 == a && this.setValue(b.getAttribute("alt")) }, commit: function(a, b) { 1 == a ? (this.getValue() || this.isChanged()) && b.setAttribute("alt", this.getValue()) : 4 == a ? b.setAttribute("alt", this.getValue()) : 8 == a && b.removeAttribute("alt") } }, {
+ type: "hbox", children: [{
+ id: "basic", type: "vbox", children: [{
+ type: "hbox", requiredContent: "img{width,height}", widths: ["50%", "50%"], children: [{
+ type: "vbox",
+ padding: 1, children: [{
+ type: "text", width: "45px", id: "txtWidth", label: d.lang.common.width, onKeyUp: z, onChange: function() { g.call(this, "advanced:txtdlgGenStyle") }, validate: function() { var a = this.getValue().match(y); (a = !(!a || 0 === parseInt(a[1], 10))) || alert(d.lang.common.invalidLength.replace("%1", d.lang.common.width).replace("%2", "px, %")); return a }, setup: B, commit: function(a, b) {
+ var c = this.getValue(); 1 == a ? (c && d.activeFilter.check("img{width,height}") ? b.setStyle("width", CKEDITOR.tools.cssLength(c)) : b.removeStyle("width"),
+ b.removeAttribute("width")) : 4 == a ? c.match(l) ? b.setStyle("width", CKEDITOR.tools.cssLength(c)) : (c = this.getDialog().originalElement, "true" == c.getCustomData("isReady") && b.setStyle("width", c.$.width + "px")) : 8 == a && (b.removeAttribute("width"), b.removeStyle("width"))
+ }
+ }, {
+ type: "text", id: "txtHeight", width: "45px", label: d.lang.common.height, onKeyUp: z, onChange: function() { g.call(this, "advanced:txtdlgGenStyle") }, validate: function() {
+ var a = this.getValue().match(y); (a = !(!a || 0 === parseInt(a[1], 10))) || alert(d.lang.common.invalidLength.replace("%1",
+ d.lang.common.height).replace("%2", "px, %")); return a
+ }, setup: B, commit: function(a, b) { var c = this.getValue(); 1 == a ? (c && d.activeFilter.check("img{width,height}") ? b.setStyle("height", CKEDITOR.tools.cssLength(c)) : b.removeStyle("height"), b.removeAttribute("height")) : 4 == a ? c.match(l) ? b.setStyle("height", CKEDITOR.tools.cssLength(c)) : (c = this.getDialog().originalElement, "true" == c.getCustomData("isReady") && b.setStyle("height", c.$.height + "px")) : 8 == a && (b.removeAttribute("height"), b.removeStyle("height")) }
+ }]
+ }, {
+ id: "ratioLock",
+ type: "html", className: "cke_dialog_image_ratiolock", style: "margin-top:30px;width:40px;height:40px;", onLoad: function() {
+ var a = CKEDITOR.document.getById(x), b = CKEDITOR.document.getById(r); a && (a.on("click", function(a) { A(this); a.data && a.data.preventDefault() }, this.getDialog()), a.on("mouseover", function() { this.addClass("cke_btn_over") }, a), a.on("mouseout", function() { this.removeClass("cke_btn_over") }, a)); b && (b.on("click", function(a) {
+ m(this); var b = this.originalElement, d = this.getValueOf("info", "txtWidth"); "true" ==
+ b.getCustomData("isReady") && d && (b = b.$.height / b.$.width * d, isNaN(b) || (this.setValueOf("info", "txtHeight", Math.round(b)), e(this))); a.data && a.data.preventDefault()
+ }, this.getDialog()), b.on("mouseover", function() { this.addClass("cke_btn_over") }, b), b.on("mouseout", function() { this.removeClass("cke_btn_over") }, b))
+ }, html: '\x3cdiv\x3e\x3ca href\x3d"javascript:void(0)" tabindex\x3d"-1" title\x3d"' + d.lang.image.lockRatio + '" class\x3d"cke_btn_locked" id\x3d"' + r + '" role\x3d"checkbox"\x3e\x3cspan class\x3d"cke_icon"\x3e\x3c/span\x3e\x3cspan class\x3d"cke_label"\x3e' +
+ d.lang.image.lockRatio + '\x3c/span\x3e\x3c/a\x3e\x3ca href\x3d"javascript:void(0)" tabindex\x3d"-1" title\x3d"' + d.lang.image.resetSize + '" class\x3d"cke_btn_reset" id\x3d"' + x + '" role\x3d"button"\x3e\x3cspan class\x3d"cke_label"\x3e' + d.lang.image.resetSize + "\x3c/span\x3e\x3c/a\x3e\x3c/div\x3e"
+ }]
+ }, {
+ type: "vbox", padding: 1, children: [{
+ type: "text", id: "txtBorder", requiredContent: "img{border-width}", width: "60px", label: d.lang.image.border, "default": "", onKeyUp: function() { e(this.getDialog()) }, onChange: function() {
+ g.call(this,
+ "advanced:txtdlgGenStyle")
+ }, validate: CKEDITOR.dialog.validate.integer(d.lang.image.validateBorder), setup: function(a, b) { if (1 == a) { var c; c = (c = (c = b.getStyle("border-width")) && c.match(/^(\d+px)(?: \1 \1 \1)?$/)) && parseInt(c[1], 10); isNaN(parseInt(c, 10)) && (c = b.getAttribute("border")); this.setValue(c) } }, commit: function(a, b) {
+ var c = parseInt(this.getValue(), 10); 1 == a || 4 == a ? (isNaN(c) ? !c && this.isChanged() && b.removeStyle("border") : (b.setStyle("border-width", CKEDITOR.tools.cssLength(c)), b.setStyle("border-style",
+ "solid")), 1 == a && b.removeAttribute("border")) : 8 == a && (b.removeAttribute("border"), b.removeStyle("border-width"), b.removeStyle("border-style"), b.removeStyle("border-color"))
+ }
+ }, {
+ type: "text", id: "txtHSpace", requiredContent: "img{margin-left,margin-right}", width: "60px", label: d.lang.image.hSpace, "default": "", onKeyUp: function() { e(this.getDialog()) }, onChange: function() { g.call(this, "advanced:txtdlgGenStyle") }, validate: CKEDITOR.dialog.validate.integer(d.lang.image.validateHSpace), setup: function(a, b) {
+ if (1 == a) {
+ var c,
+ d; c = b.getStyle("margin-left"); d = b.getStyle("margin-right"); c = c && c.match(q); d = d && d.match(q); c = parseInt(c, 10); d = parseInt(d, 10); c = c == d && c; isNaN(parseInt(c, 10)) && (c = b.getAttribute("hspace")); this.setValue(c)
+ }
+ }, commit: function(a, b) {
+ var c = parseInt(this.getValue(), 10); 1 == a || 4 == a ? (isNaN(c) ? !c && this.isChanged() && (b.removeStyle("margin-left"), b.removeStyle("margin-right")) : (b.setStyle("margin-left", CKEDITOR.tools.cssLength(c)), b.setStyle("margin-right", CKEDITOR.tools.cssLength(c))), 1 == a && b.removeAttribute("hspace")) :
+ 8 == a && (b.removeAttribute("hspace"), b.removeStyle("margin-left"), b.removeStyle("margin-right"))
+ }
+ }, {
+ type: "text", id: "txtVSpace", requiredContent: "img{margin-top,margin-bottom}", width: "60px", label: d.lang.image.vSpace, "default": "", onKeyUp: function() { e(this.getDialog()) }, onChange: function() { g.call(this, "advanced:txtdlgGenStyle") }, validate: CKEDITOR.dialog.validate.integer(d.lang.image.validateVSpace), setup: function(a, b) {
+ if (1 == a) {
+ var c, d; c = b.getStyle("margin-top"); d = b.getStyle("margin-bottom"); c = c && c.match(q);
+ d = d && d.match(q); c = parseInt(c, 10); d = parseInt(d, 10); c = c == d && c; isNaN(parseInt(c, 10)) && (c = b.getAttribute("vspace")); this.setValue(c)
+ }
+ }, commit: function(a, b) { var c = parseInt(this.getValue(), 10); 1 == a || 4 == a ? (isNaN(c) ? !c && this.isChanged() && (b.removeStyle("margin-top"), b.removeStyle("margin-bottom")) : (b.setStyle("margin-top", CKEDITOR.tools.cssLength(c)), b.setStyle("margin-bottom", CKEDITOR.tools.cssLength(c))), 1 == a && b.removeAttribute("vspace")) : 8 == a && (b.removeAttribute("vspace"), b.removeStyle("margin-top"), b.removeStyle("margin-bottom")) }
+ },
+ {
+ id: "cmbAlign", requiredContent: "img{float}", type: "select", widths: ["35%", "65%"], style: "width:90px", label: d.lang.common.align, "default": "", items: [[d.lang.common.notSet, ""], [d.lang.common.left, "left"], [d.lang.common.right, "right"]], onChange: function() { e(this.getDialog()); g.call(this, "advanced:txtdlgGenStyle") }, setup: function(a, b) { if (1 == a) { var c = b.getStyle("float"); switch (c) { case "inherit": case "none": c = "" }!c && (c = (b.getAttribute("align") || "").toLowerCase()); this.setValue(c) } }, commit: function(a, b) {
+ var c =
+ this.getValue(); if (1 == a || 4 == a) { if (c ? b.setStyle("float", c) : b.removeStyle("float"), 1 == a) switch (c = (b.getAttribute("align") || "").toLowerCase(), c) { case "left": case "right": b.removeAttribute("align") } } else 8 == a && b.removeStyle("float")
+ }
+ }]
+ }]
+ }, {
+ type: "vbox", height: "250px", children: [{
+ type: "html", id: "htmlPreview", style: "width:95%;", html: "\x3cdiv\x3e" + CKEDITOR.tools.htmlEncode(d.lang.common.preview) + '\x3cbr\x3e\x3cdiv id\x3d"' + n + '" class\x3d"ImagePreviewLoader" style\x3d"display:none"\x3e\x3cdiv class\x3d"loading"\x3e\x26nbsp;\x3c/div\x3e\x3c/div\x3e\x3cdiv class\x3d"ImagePreviewBox"\x3e\x3ctable\x3e\x3ctr\x3e\x3ctd\x3e\x3ca href\x3d"javascript:void(0)" target\x3d"_blank" onclick\x3d"return false;" id\x3d"' +
+ D + '"\x3e\x3cimg id\x3d"' + C + '" alt\x3d"" /\x3e\x3c/a\x3e' + (d.config.image_previewText || "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.") +
+ "\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/div\x3e\x3c/div\x3e"
+ }]
+ }]
+ }]
+ }, {
+ id: "Link", requiredContent: "a[href]", label: d.lang.image.linkTab, padding: 0, elements: [{
+ id: "txtUrl", type: "text", label: d.lang.common.url, style: "width: 100%", "default": "", setup: function(a, b) { if (2 == a) { var c = b.data("cke-saved-href"); c || (c = b.getAttribute("href")); this.setValue(c) } }, commit: function(a, b) {
+ if (2 == a && (this.getValue() || this.isChanged())) {
+ var c = this.getValue(); b.data("cke-saved-href", c); b.setAttribute("href", c); this.getValue() ||
+ !d.config.image_removeLinkByEmptyURL ? this.getDialog().addLink = !0 : this.getDialog().addLink = !1
+ }
+ }
+ }, { type: "button", id: "browse", className: "cke_dialog_image_browse", filebrowser: { action: "Browse", target: "Link:txtUrl", url: d.config.filebrowserImageBrowseLinkUrl }, style: "float:right", hidden: !0, label: d.lang.common.browseServer }, {
+ id: "cmbTarget", type: "select", requiredContent: "a[target]", label: d.lang.common.target, "default": "", items: [[d.lang.common.notSet, ""], [d.lang.common.targetNew, "_blank"], [d.lang.common.targetTop,
+ "_top"], [d.lang.common.targetSelf, "_self"], [d.lang.common.targetParent, "_parent"]], setup: function(a, b) { 2 == a && this.setValue(b.getAttribute("target") || "") }, commit: function(a, b) { 2 == a && (this.getValue() || this.isChanged()) && b.setAttribute("target", this.getValue()) }
+ }]
+ }, {
+ id: "Upload", hidden: !0, filebrowser: "uploadButton", label: d.lang.image.upload, elements: [{ type: "file", id: "upload", label: d.lang.image.btnUpload, style: "height:40px", size: 38 }, {
+ type: "fileButton", id: "uploadButton", filebrowser: "info:txtUrl", label: d.lang.image.btnUpload,
+ "for": ["Upload", "upload"]
+ }]
+ }, {
+ id: "advanced", label: d.lang.common.advancedTab, elements: [{
+ type: "hbox", widths: ["50%", "25%", "25%"], children: [{ type: "text", id: "linkId", requiredContent: "img[id]", label: d.lang.common.id, setup: function(a, b) { 1 == a && this.setValue(b.getAttribute("id")) }, commit: function(a, b) { 1 == a && (this.getValue() || this.isChanged()) && b.setAttribute("id", this.getValue()) } }, {
+ id: "cmbLangDir", type: "select", requiredContent: "img[dir]", style: "width : 100px;", label: d.lang.common.langDir, "default": "", items: [[d.lang.common.notSet,
+ ""], [d.lang.common.langDirLtr, "ltr"], [d.lang.common.langDirRtl, "rtl"]], setup: function(a, b) { 1 == a && this.setValue(b.getAttribute("dir")) }, commit: function(a, b) { 1 == a && (this.getValue() || this.isChanged()) && b.setAttribute("dir", this.getValue()) }
+ }, { type: "text", id: "txtLangCode", requiredContent: "img[lang]", label: d.lang.common.langCode, "default": "", setup: function(a, b) { 1 == a && this.setValue(b.getAttribute("lang")) }, commit: function(a, b) { 1 == a && (this.getValue() || this.isChanged()) && b.setAttribute("lang", this.getValue()) } }]
+ },
+ { type: "text", id: "txtGenLongDescr", requiredContent: "img[longdesc]", label: d.lang.common.longDescr, setup: function(a, b) { 1 == a && this.setValue(b.getAttribute("longDesc")) }, commit: function(a, b) { 1 == a && (this.getValue() || this.isChanged()) && b.setAttribute("longDesc", this.getValue()) } }, {
+ type: "hbox", widths: ["50%", "50%"], children: [{
+ type: "text", id: "txtGenClass", requiredContent: "img(cke-xyz)", label: d.lang.common.cssClass, "default": "", setup: function(a, b) { 1 == a && this.setValue(b.getAttribute("class")) }, commit: function(a,
+ b) { 1 == a && (this.getValue() || this.isChanged()) && b.setAttribute("class", this.getValue()) }
+ }, { type: "text", id: "txtGenTitle", requiredContent: "img[title]", label: d.lang.common.advisoryTitle, "default": "", onChange: function() { e(this.getDialog()) }, setup: function(a, b) { 1 == a && this.setValue(b.getAttribute("title")) }, commit: function(a, b) { 1 == a ? (this.getValue() || this.isChanged()) && b.setAttribute("title", this.getValue()) : 4 == a ? b.setAttribute("title", this.getValue()) : 8 == a && b.removeAttribute("title") } }]
+ }, {
+ type: "text", id: "txtdlgGenStyle",
+ requiredContent: "img{cke-xyz}", label: d.lang.common.cssStyle, validate: CKEDITOR.dialog.validate.inlineStyle(d.lang.common.invalidInlineStyle), "default": "", setup: function(a, b) { if (1 == a) { var c = b.getAttribute("style"); !c && b.$.style.cssText && (c = b.$.style.cssText); this.setValue(c); var d = b.$.style.height, c = b.$.style.width, d = (d ? d : "").match(l), c = (c ? c : "").match(l); this.attributesInStyle = { height: !!d, width: !!c } } }, onChange: function() {
+ g.call(this, "info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));
+ e(this)
+ }, commit: function(a, b) { 1 == a && (this.getValue() || this.isChanged()) && b.setAttribute("style", this.getValue()) }
+ }]
+ }]
+ }
+ }; CKEDITOR.dialog.add("image", function(d) { return u(d, "image") }); CKEDITOR.dialog.add("imagebutton", function(d) { return u(d, "imagebutton") })
+})(); \ No newline at end of file
diff --git a/plugins/image/images/noimage.png b/plugins/image/images/noimage.png
new file mode 100755
index 0000000..74c6ee9
--- /dev/null
+++ b/plugins/image/images/noimage.png
Binary files differ
diff --git a/plugins/leaflet/CHANGELOG.md b/plugins/leaflet/CHANGELOG.md
new file mode 100755
index 0000000..0064298
--- /dev/null
+++ b/plugins/leaflet/CHANGELOG.md
@@ -0,0 +1,74 @@
+###CHANGELOG
+
+####Version 1.7 Released (August 13, 2016)
+
+ - Fix issue in autocomplete feature not working on some website domains due to the Google's recent policy changes regarding access keys, effective since June 22, 2016. See their [official announcement](http://googlegeodevelopers.blogspot.com.au/2016/06/building-for-scale-updates-to-google.html). Thanks to [@smartcorestudio](https://github.com/smartcorestudio) for bringing this up.
+ - Refactor the code to load the Google Maps JS API script only when the plugin's dialog window pops-out to minimize the Google Maps JS API key usage. Thanks to [@smartcorestudio](https://github.com/smartcorestudio) for the suggestion.
+ - Update [Installation Guide](https://github.com/ranelpadon/ckeditor-leaflet/blob/master/Installation%20Guide.txt) regarding the usage/integration of Google Maps JS API key and how to [create your own key](https://developers.google.com/maps/documentation/javascript/get-api-key). Make sure to enable the **Google Maps JavaScript API** in your **Google API Console** to activate your key.
+ - Update the demo page to illustrate the use of the Google Maps JS API key.
+ - Implement **dynamic language switcher mechanism** in the [demo page](http://www.ranelpadon.com/sites/all/libraries/ckeditor/plugins/leaflet/demo/index.html) to showcase the translation support and the available translation files.
+ - Add the German language support/translation, thanks to Stefan Berger (stefan@berger.net).
+ - Utilize the CKEditor's native translation strings for **Alignment**, **Align Right**, **Align Left**, and **Center** for more accurate translation and smaller plugin's translation files.
+
+####Version 1.6 Released (August 9, 2016)
+
+ - Remove **MapQuest** from the available map tiles since it now requires access key and the previous setup causes rendering errors. Thanks to [@howellcc](https://github.com/howellcc) for bringing it up.
+ - Make the *existing* **MapQuest** tiles auto-redirect to **OpenStreetMap.Mapnik** tiles for back compatibility and prevent manual conversion of MapQuest tiles.
+ - Make the **OpenStreetMap.Mapnik** as the default map tile provider for *new* widgets.
+ - Include a demo page featuring the latest CDN-hosted `ckeditor.js` file. The **Leaflet Maps** plugin folder is all you need now to render the bundled demo page since all dependencies (including languages) will be pulled from the CDN-hosted files. Note that you need to put the plugin folder in a web server context (e.g. localhost or virtual host setup) to render the demo page properly; opening the **demo/index.html** file directly in a browser as a regular file will not work.
+ - Update the default jQuery version to the latest 1.x version (1.12.4)
+ - Prevent unnecessary loading of external scripts when the plugin is already disabled via `config.removePlugins`. Thanks to [@SDKiller](https://github.com/SDKiller) for bringing this up.
+
+####Version 1.5 Released (February 12, 2016)
+
+ - Integrate language localization mechanisms.
+ - Bundle the Russian and Basque versions/translations.
+ - Thanks to [@smartcorestudio](https://github.com/smartcorestudio) for the Russian translation.
+ - Thanks to [@aldatsa](https://github.com/aldatsa) for the Basque translation.
+ - Set default plugin language to English (will be automatically overriden depending on the user's locale and if the user's localization is available in the plugin).
+
+####Version 1.4 Released (December 30, 2015)
+
+ - Implement draggable marker so that the latitude and longitude of a place could be
+ more precise and refined, especially when the Google's predicted location is not in
+ has saved the page or when the user opens the widget's dialog options and then
+ clicked the OK button (w/ or w/out changing any of the dialog options).
+
+ - Recenter the map (and with panning animation) for better UX
+ if the user drags the marker to a new position
+
+ - Update Leaflet's JS/CSS files to the latest stable build, version [0.7.7](http://leafletjs.com/download.html),
+ which was released on October 26, 2015.
+
+ - Remove the unnecessary files (especially the files/assets in the **leaflet/scripts** folder)
+ so that the plugin's folder is as lean as possible.
+
+####Version 1.3.3 Released (December 25, 2015)
+Same as Version 1.3.2, but re-uploaded in CKEditor.com just to indicate compatibility with CKEditor 4.5.x on its plugin page. Not a significant release actually.
+
+####Version 1.3.2 Released (December 13, 2015)
+Update the Leaflet Maps installation documentation with respect to version 7.x-1.16 of Drupal's CKEditor module. Adjust the plugin's license for compatibility with GPLv2+ open-source projects.
+
+####Version 1.3.1 Released (December 27, 2014)
+Add a conditional check to load only the jQuery library if it's not already loaded to boost performance and avoid overriding jQuery bindings with other 3rd-party plugins.
+
+####Version 1.3 Released (December 27, 2014)
+The user could now specify if the map should be responsive. The widget should now work also for both http and https protocols. Installation guide now includes some notes regarding markup filtering.
+> In the Options tab of the Dialog window, there's now a 'Responsive Map' checkbox option.
+
+> - Assuming you have a responsive site theme or page styling, this will make the map to have 100% width with the typical 16:9 aspect ratio.
+> - Responsive behavior will override the widget alignment settings since it will always be centered.
+> - The width and height will also be auto-computed depending on the dimensions of the device's screen.
+> - The map's responsive behavior will not have effect if you have don't have a responsive site theme or page styling.
+
+> Handle HTTPS/Secured Protocol
+
+> - The widget should now work for both http or https protocols.
+
+> Add notes in **Installation Guide** about possible issues in markup filtering.
+
+> - Some systems like Drupal blocks IFRAME tag by default and discard any inline styling. See the workarounds in [IV. CAVEATS AND SURPRISES](https://github.com/ranelpadon/ckeditor-leaflet/blob/master/Installation%20Guide.txt/)
+
+####Version 1.2 Released (August 9, 2014):
+
+The user could now specify the marker's popup text.
diff --git a/plugins/leaflet/Creating and Editing Leaflet Maps.txt b/plugins/leaflet/Creating and Editing Leaflet Maps.txt
new file mode 100755
index 0000000..b93041f
--- /dev/null
+++ b/plugins/leaflet/Creating and Editing Leaflet Maps.txt
@@ -0,0 +1,56 @@
+CKEditor Leaflet Map Plugin
+
+
+I. CREATING NEW MAP
+
+1.) Click the Leaflet Map icon in the CKEditor Toolbar. The Dialog window will now pop-up.
+
+Then, it is EITHER of the 2 steps:
+2) Input the Place name (for example: Manila, Philippines).
+
+3.) Input the Latitude and Longitude values of a Place in their corresponding text fields.
+(for example: Latitude = 14.123456 and Longitude = 121.654321)
+
+Then click the OK button. After that, a map will be created, centered on that specified coordinates, with the following default values:
+Width: 400px
+Height: 400px
+Zoom Level: 10
+Map Tile: MapQuestOpen.OSM
+Overview Map (MiniMap): Enabled
+Alignment: Left
+
+Note that if you do BOTH #2 and #3 (which is I think will rarely happen), the value in #2 will be ignored and the values/coordinates in #3 will be used.
+
+
+II. EDITING EXISTING MAP
+
+It is either of the 2 steps:
+
+1.) If you hover the mouse on the map, you will see the map's handle bar (cross hair) in the UPPER LEFT corner of the map,
+you could then double-click that to view or edit the map properties.
+
+2.) With your mouse, select the map to be edited (to set the focus away from other CKEditor objects). Then click the Leaflet Map icon in the CKEditor toolbar.
+
+The Dialog will pop-up and will be set to the properties of the currently selected map.
+Note that the #1 is the preferred way.
+
+To set the current map in a NEW location, either specify a new Place name value in the Search field, or specify a new Lat/Lon values in the corresponding text fields. Note that if you change BOTH the values in the Search field and the Lat/Lon fields (which is I think will rarely happen), the values in the Lat/Lon fields will be used.
+
+You might be wondering why the #1 step has to be done that way.
+The main reason is that CKEditor Leaflet Maps uses the Widget API (introduced in CKEditor 4.3).
+The Widget API introduces innovative features and more plugin flexibility.
+
+For one, the map could have a Map Mode and Widget Mode.
+Map mode uses the mouse wheel or double-click for zooming the map,
+Left-Click+Hold+Drag for panning the map,
+and the possibility to use the map's '+/-' zoom UI buttons.
+
+We could have opted to bind the double-click for showing the map's option
+at the expense of lesser map interaction. However, since I believe that map interaction
+is relatively more important compared to widget's interaction, we need to compromise a bit.
+That's why in order to edit the map's options, we have to do a mouse hover onto the map
+and double-click the default widget's handle bars in the map's upper left corner
+so that the default map's behavior and mouse and key bindings could still be preserved.
+
+Later, we might include the option to edit the map widget's option
+using the Right-Click or Ctrl+Left-Click event bindings.
diff --git a/plugins/leaflet/Installation Guide.txt b/plugins/leaflet/Installation Guide.txt
new file mode 100755
index 0000000..2741d88
--- /dev/null
+++ b/plugins/leaflet/Installation Guide.txt
@@ -0,0 +1,235 @@
+I. OVERVIEW
+
+This Leaflet Maps plugin requires CKEditor 4.3 or later versions, and it leverages the power and flexibility
+of Widget API. Hence, the 'widget' plugin is also a hard dependency (which also depends on Line Utilities
+and Clipboard plugins). The Clipboard plugin is already loaded by default in all presets/pre-built packages of CKEditor
+(Basic, Standard, and Full). Hence, we only need to download the Widget plugin (http://ckeditor.com/addon/widget),
+the Line Utilities plugin (http://ckeditor.com/addon/lineutils), and this Leaflet Maps plugin (http://ckeditor.com/addon/leaflet).
+
+For Linux users, after downloading, make sure that the zipped folders or the target CKEditor folders
+ have right read/write/execute permissions, otherwise you might encounter loading issues
+ like the "File x could not be found" notice. You might need to run "sudo chmod 777 -R leaflet",
+ "sudo chmod 777 -R lineutils", and "sudo chmod 777 -R widget" before or after copying them
+ in the appropriate CKEditor folders.
+
+IMPORTANT NOTE:
+Leaflet Maps plugin uses the "Autocomplete" and "GeoCoding" components of "Google Places API". However as of June 22, 2016, Google will now require access key, especially for new website domains. See the Goggle's official announcement:
+ http://googlegeodevelopers.blogspot.com.au/2016/06/building-for-scale-updates-to-google.html
+
+Create your own Google Maps JS API key w/ this guide:
+ https://developers.google.com/maps/documentation/javascript/get-api-key
+
+Make sure to ENABLE the "Google Maps JavaScript API" in your "Google API Console" account/dashboard to activate your key.
+Note that the plugin uses my personal key by default, so Google API's standard usage quota will apply, especially if many users will simultaneously use my plugin. Hence, it's strongly recommended that the user create his own Google API key asap (see link above), and set his personal key via CKEditor's config file (config.js) in this manner:
+ config.leaflet_maps_google_api_key = '<YOUR GOOGLE API KEY HERE>';
+
+See further instructions on it below.
+
+
+II. STANDARD INSTALLATION (Usual Setup)
+
+1) After unzipping the folder, paste the three folders ("lineutils", "leaflet", and "widget")
+ to "ckeditor/plugins" folder. After that, you should have the following folder structures:
+ "ckeditor/plugins/leaflet"
+ "ckeditor/plugins/lineutils"
+ "ckeditor/plugins/widget"
+
+2) Edit the "ckeditor/config.js" file, and add the following:
+ if there's no existing line yet:
+ config.extraPlugins = "lineutils,widget,leaflet";
+ config.leaflet_maps_google_api_key = 'GOOGLE_API_KEY_REMOVED';
+
+ otherwise, append it to the existing list, no extra spaces are allowed:
+ config.extraPlugins = "existing_plugin,another_existing_plugin,lineutils,widget,leaflet";
+ config.leaflet_maps_google_api_key = 'GOOGLE_API_KEY_REMOVED';
+
+3.) Just to make sure, clear the web browser's cache after modifying your configuration.
+ Clearing the browser's cache is also very important
+ since the CKEditor's JS and CSS assets/components are cached also in the browser.
+
+
+III. DRUPAL INSTALLATION
+
+In Drupal, the typical way to embed the CKEditor WSYIWYG is
+through the CKEditor module (https://drupal.org/project/ckeditor),
+and then loading the corresponding CKEditor JS library (http://ckeditor.com/).
+
+Drupal's CKEditor module is typically installed to have this internal path:
+ sites/all/modules/ckeditor or sites/all/modules/contrib/ckeditor.
+
+Moreover, the CKeditor JS Library is typically installed to have this internal path:
+ "sites/all/modules/ckeditor/ckeditor/ckeditor.js" or
+ "sites/all/modules/contrib/ckeditor/ckeditor/ckeditor.js" or
+ "sites/all/libraries/ckeditor/ckeditor.js."
+
+With Drupal's latest CKEditor (https://www.drupal.org/project/ckeditor, 7.x-1.16),
+the Widget and Lineutils plugins are already bundled and enabled by default which is indicated
+as the "Full" CKEditor.js build in you check in the the CKEditor Global Profile admin page
+ "admin/config/content/ckeditor/editg"
+ Path to CKEditor: //cdn.ckeditor.com/4.4.3/full-all
+
+so the Widget and Lineutils plugins should not be downloaded anymore; actually, it will cause conflicts and console error like this if you do:
+ Uncaught TypeError: CKEDITOR.tools.getIndex is not a function
+
+Hence, it is highly recommended that you use the latest Drupal CKEditor module
+since it would be the easiest to setup, especially in the context of Leaflet Maps plugin.
+
+These are the possible plugin setups, the idea is to copy the plugin folder, enable it,
+and make it visible in the toolbar:
+
+
+A. DRUPAL INSTALLATION OPTION 1 (EASIER SETUP)
+
+ 1.) Download and unzip the plugin here (depending on your setup):
+ "sites/all/modules/ckeditor/plugins" or
+ "sites/all/modules/contrib/ckeditor/plugins".
+
+ After that, you should have this folder structure:
+ "ckeditor/plugins/leaflet"
+
+ 2.) We should now activate the new plugin and add them to the toolbar.
+ This is done by configuring the CKEditor Profile Settings,
+ in which by default is located in:
+ "admin/config/content/ckeditor/edit/Advanced"
+
+ A. Activate the Plugin
+ In EDITOR APPEARANCE >>> Plugins section:
+ Enable the corresponding checkboxes for the Leaflet Map.
+ This is the text displayed adjacent to its checkbox:
+ "Plugin file: leaflet"
+
+ B. Add them to the Toolbar
+ We should then make the activated plugin visible in the toolbar,
+ skipping this step will make the Leaflet Maps plugin inaccessible in the toolbar.
+
+ In EDITOR APPEARANCE >>> Toolbar section:
+ Drag the Leaflet Maps icon (black-colored) from the 'All Buttons' section
+ to the 'Used Buttons' section.
+
+ C. Specify the Google API key (used mainly for autocomplete/geocoding functionalities):
+ As indicated in the OVERVIEW section above, Google API key is now required.
+ In ADVANCED OPTIONS >>> Custom JavaScript Configuration:
+ Set your personal Google API key (I've provided my personal key as sample):
+ config.leaflet_maps_google_api_key = 'GOOGLE_API_KEY_REMOVED';
+
+ 3.) Then, click the Save button. Clear the Drupal's overall cache AND
+ clear the browser's cache. Clearing the browser's cache is also
+ very important since the CKEditor's JS and CSS assets/components
+ are cached also in the browser.
+
+ As indicated above, using the "sites/all/modules/ckeditor/plugins" or
+ "sites/all/modules/contrib/ckeditor/plugins"
+ will work with no additional custom hooks programming since by default
+ CKEditor utilize that folder in the CKEditor Global Profile Settings:
+ "admin/config/content/ckeditor/editg".
+
+ If you go that Global Profile Settings page, this will be indicated
+ (unless you override the default configuration):
+ Path to the CKEditor plugins directory: "%m/plugins"
+
+ In which "%m" refers to the base URL path where the CKEditor module is stored,
+ and defaults to "sites/all/modules/ckeditor" or "sites/all/modules/contrib/ckeditor".
+
+
+B. DRUPAL INSTALLATION OPTION 2
+
+ With the advent of Libraries API (https://drupal.org/project/libraries),
+ Drupal offers more flexibility in the handling of external/third-party libraries,
+ which means a clean mechanism that provides a separation of control between
+ the CKEditor module and CKEditor library, and implies that we could
+ safely upgrade the library and module independent to each other.
+ Having a Libraries folder (sites/all/libraries) is also a very common setup in Drupal.
+
+ This setup assumes that you've already installed and enabled the Libraries API module
+ and configured the CKEditor library (sites/all/libraries/ckeditor).
+ Make sure also that the "Path to CKEditor" settings indicated in
+ the CKEditor's Global Profile (admin/config/content/ckeditor/editg) is
+ indicated as "%l/ckeditor", in which "%l" refers to the "sites/all/libraries".
+
+ 1.) Download and unzip the plugin here:
+ "sites/all/libraries/ckeditor/plugins"
+
+ After that, you should have this folder structure:
+ "ckeditor/plugins/leaflet"
+
+ 2.) We should now activate the new plugin and add them to the toolbar.
+ This is done by implementing first the hook_ckeditor_plugin() in a custom module:
+
+ function MYMODULE_ckeditor_plugin() {
+ return array(
+ 'leaflet_maps' => array(
+ 'name' => 'leaflet',
+ 'desc' => t('Plugin for inserting Leaflet Maps.'),
+ 'path' => libraries_get_path('ckeditor') . '/plugins/leaflet/',
+ 'buttons' => array(
+ 'leaflet' => array(
+ 'label' => 'Leaflet Maps',
+ 'icon' => 'icons/leaflet.png',
+ ),
+ ),
+ ),
+ );
+ }
+
+ For convenience, I've created a Drupal utility module specifically for this purpose,
+ check-out the module and instructions here:
+ https://github.com/ranelpadon/drupal-leaflet-maps/tree/master
+
+ Now, we configure the CKEditor Profile Settings,
+ in which by default is located in:
+ "admin/config/content/ckeditor/edit/Advanced"
+
+ A. Activate the Plugin
+ In EDITOR APPEARANCE >>> Plugins section:
+ Enable the corresponding checkbox for the Leaflet Maps plugin.
+ This is the description displayed adjacent to its checkbox:
+ "Plugin for inserting Leaflet Maps."
+
+ B. Add them to the Toolbar
+ We should then make the activated plugin visible in the toolbar,
+ skipping this step will make the Leaflet Maps plugin inaccessible in the toolbar.
+
+ In EDITOR APPEARANCE >>> Toolbar section:
+ Drag the Leaflet Maps icon (black-colored) from the 'All Buttons' section
+ to the 'Used Buttons' section.
+
+ C. Specify the Google API key (used mainly for autocomplete/geocoding functionalities):
+ As indicated in the OVERVIEW section above, Google API key is now required.
+ In ADVANCED OPTIONS >>> Custom JavaScript Configuration:
+ Set your personal Google API key (I've provided my personal key as sample):
+ config.leaflet_maps_google_api_key = 'GOOGLE_API_KEY_REMOVED';
+
+ 3.) Then, click the Save button. Clear the Drupal's overall cache AND
+ clear the browser's cache. Clearing the browser's cache is also
+ very important since the CKEditor's JS and CSS assets/components
+ are cached also in the browser.
+
+Note that if you configure the Leaflet Maps, Line Utilities, and Widget plugins
+using the handy CKEditor auto-builder (http://ckeditor.com/builder) and
+bundled it with the core "ckeditor.js" file, it will not work in Drupal,
+since as far as I know, the Drupal's CKEditor module
+(or specifically the hook_ckeditor_plugin()) has no support for auto-build versions.
+
+But, outside of Drupal, the Leaflet Maps will work even when
+pre-configured/auto-bundled using the CKEditor builder.
+
+
+IV. CAVEATS AND SURPRISES: STYLING AND MARKUP FILTERING ISSUES
+
+For some systems like Drupal, IFRAME tag is blacklisted mainly for security purposes
+when filtering contents. Currently, CKEditor Leaflet Maps uses IFRAME for rendering maps,
+hence you must allow IFRAME tag in order for it to work as intended. In Drupal,
+you should add the IFRAME tag as one of the whitelisted tags in the
+'Allowed HTML tags' section in 'Limit allowed HTML tags' filter/tab in
+"admin/config/content/formats/filtered_html" page.
+
+Furthermore, this widget utilizes CSS classes to have a more maintainable styling
+instead of bombarding the widget with inline styles resulting to a cluttered markup.
+In Drupal, when you save the page after editing it with CKEditor, inline styles will be
+discarded by Drupal by default, again for security purposes. Thus, for cases like this,
+you need to load the contents of the wdiget's CSS file 'leaflet/css/contents.css'
+to pages that will render the Leaflet Maps. This is very important if you want to make
+the position/alignment or responsive behavior work as intended. You could add the style file
+to your site's theme or global/core CSS file. In Drupal, you could easily add the styles
+by using the CSS Injector module (https://www.drupal.org/project/css_injector)
+or by using the usual drupal_add_css() construct in your custom module.
diff --git a/plugins/leaflet/LICENSE.txt b/plugins/leaflet/LICENSE.txt
new file mode 100755
index 0000000..4362b49
--- /dev/null
+++ b/plugins/leaflet/LICENSE.txt
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/plugins/leaflet/README.md b/plugins/leaflet/README.md
new file mode 100755
index 0000000..10c068f
--- /dev/null
+++ b/plugins/leaflet/README.md
@@ -0,0 +1,96 @@
+ckeditor-leaflet
+================
+<strong>OVERVIEW</strong>:<br>
+This CKEditor <a href="http://ckeditor.com/addon/leaflet">Leaflet Maps</a> plugin has three workhorse files:
+<ul>
+ <li><a href="https://github.com/ranelpadon/ckeditor-leaflet/blob/master/plugin.js">Plugin Core</a>: Defines the plugin and attaches the plugin to the CKEditor toolbar.</li>
+ <li><a href="https://github.com/ranelpadon/ckeditor-leaflet/blob/master/dialogs/leaflet.js">Dialog Script</a>: Displays the map options when creating and editing existing maps.</li>
+ <li><a href="https://github.com/ranelpadon/ckeditor-leaflet/blob/master/scripts/mapParser.html">Map Renderer</a>: Parses the map options via URL and renders the map accordingly.</li>
+</ul>
+
+This plugin utilizes the following technologies/libraries: <br>
+<ul>
+ <li><a href="http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget">CKEditor's Widget API</a></li>
+ <li><a href="https://developers.google.com/maps/documentation/javascript/places-autocomplete">Google's Places Library/Type-Ahead Search</a></li>
+ <li><a href="https://developers.google.com/maps/documentation/geocoding/">Google's Geocoding API</a></li>
+ <li><a href="http://leafletjs.com/">Leaflet JS</a></li>
+ <li><a href="https://github.com/leaflet-extras/leaflet-providers">Leaflet - Tile Providers</a></li>
+ <li><a href="https://github.com/Norkart/Leaflet-MiniMap">Leaflet - MiniMap</a></li>
+</ul>
+
+Main features/highlights: <br>
+<ul>
+ <li>Auto-searching of map coordinates using Google Search with Geocoding.</li>
+ <li>10 available map tiles, featuring OpenStreetMap.</li>
+ <li>Map could include a minimap/overview map for better map context.</li>
+ <li>Map could be responsive (100% width).</li>
+ <li>Map could be customized with the specified width and height dimensions.</li>
+ <li>Map could be aligned to the left or right, or be placed at the center of the page.</li>
+ <li>Map zoom level could be changed using the mouse wheel, zoom buttons, or zoom dialog options.</li>
+ <li>Map zoom level could be customized per map and saved.</li>
+ <li>Marker's popup text could be customized.</li>
+ <li>Marker could be dragged and its last position will be saved.</li>
+ <li>Map re-centers the view on-the-fly as the user drags the marker, for better UX.</li>
+ <li>Supports both http and https protocols.</li>
+ <li>Supports English, Russian, and Basque languages/translations</li>
+ <li>Bundles a stand-alone demo page that fetches the CDN-hosted CKEditor files (including the dependencies and languages). It also includes a handy language switcher for demonstrating the various translations of the plugin.</li>
+</ul>
+
+<strong>LIVE DEMO PAGE</strong>:
+<br>Demo page could be found [here](http://www.ranelpadon.com/sites/all/libraries/ckeditor/plugins/leaflet/demo/index.html). It is comprehensive and showcases the various translations and map options, including the draggable marker, customizable pop-up text, and responsive behavior (see the bottom map example in the demo).
+
+<strong>PROJECTS INTEGRATING THIS PLUGIN</strong>: <br>
+<ul>
+ <li><a href="https://www.drupal.org/project/lightning">Lightning Drupal Distribution</a> installs this plugin by <a href="https://github.com/acquia/lightning/tree/7.x-1.x">default</a>. This topnotch distro is curated by <a href="https://www.acquia.com/">Acquia</a>.</li>
+ <li><a href="http://www.getmura.com/">Mura CMS</a> bundles this plugin by <a href="http://www.getmura.com/blog/announcing-release-of-mura-cms-6-2/">default</a>. Mura CMS is an open-source, semi-commercial, and ColdFusion-based CMS. Check out their <a href="http://docs.getmura.com/v6/content-managers/contact-us/embed-a-map/">Leaflet Maps user guide<a>.</li>
+ <li><a href="http://zikula.org/">Zikula PHP Framework</a> could install this <a href="https://github.com/zikula-modules/Scribite/tree/master/plugins/CKEditor/vendor/ckeditor/plugins/leaflet">plugin</a> through the <a href="https://github.com/zikula-modules/Scribite">Scribite module</a> with its <a href="https://github.com/zikula-modules/Scribite/tree/master/plugins/CKEditor/vendor/ckeditor">CKEditor integration</a>.
+</li>
+ <li><a href="http://smartcore.ru/">SmartCore</a>'s home-grown, Russian CMS integrates this <a href="http://adminpanel.smartcore.ru/help/credits">plugin</a>.</li>
+ </ul>
+
+<p><strong>INSTALLATION</strong>:
+<br>Kindly refer to <a href="https://github.com/ranelpadon/ckeditor-leaflet/blob/master/Installation%20Guide.txt">Installation Guide</a>.</p>
+
+<p><strong>HOW TO USE</strong>:
+<br>Kindly refer to <a href="https://github.com/ranelpadon/ckeditor-leaflet/blob/master/Creating%20and%20Editing%20Leaflet%20Maps.txt">How to Create and Edit Leaflet Maps</a>.</p>
+
+<p><strong>CHANGELOG</strong>:
+<br>Kindly refer to the <a href="https://github.com/ranelpadon/ckeditor-leaflet/blob/master/CHANGELOG.md">Release Notes</a>.</p>
+
+<strong>ROAD MAP</strong> (Planned stuff to do):<br><ul>
+<li>IFRAME-less implementation for faster rendering in pages with lots of maps.</li>
+<li>Render widget only on demand or as the page scrolls for optimal page performance.</li>
+<li>Integration with Inline/In-Place Editing.</li>
+<li>Option to show the cursor's map coordinates and scale bar.</li>
+<li>State of the panned map's view must be saved.</li>
+<li>Ability to add map caption/annotation
+<li>Display the map preview in the Dialog window.</li>
+<li>Handle multiple markers.</li>
+<li>Add and delete markers.</li>
+<li>Has option to add Panoromio (panoramio.com) layer.</li>
+<li>Add other tile providers.</li>
+<li>R&D other Leaflet plugins that might be useful.</li>
+</ul>
+
+<strong>LICENSE and CREDITS</strong>:<br>
+
+License: <a href="https://www.gnu.org/licenses/lgpl-2.1.txt">LGPLv2.1</a> or later should apply. Note that LGPLv2.1+ is also compatible with <a href="https://www.drupal.org/node/1475972#gplv2-compatible-licenses">GPLv2</a>.<br>
+Copyright 2016 by Engr. Ranel O. Padon<br>
+ranel.padon@gmail.com<br>
+
+Plugin's icon is a property of <a href="http://simpleicon.com/">simpleicon</a>.
+As indicated in their website, use of their icon is allowed as long as it includes proper credit and backlink.
+
+Thanks to CKEditor, Leaflet, and other great open-source softwares and their unsung developers.<br>
+
+Special thanks also to the insights, guidance, and collaborative support of our <a href="http://travel.cnn.com">CNN Travel</a> team:<br>
+Senior Web Development Manager:<br>
+Brent A. Deverman<br>
+
+Senior Software Engineer:<br>
+Adrian Christopher B. Cruz<br>
+
+Senior QA Analyst:<br>
+Jonathan A. Jacinto<br>
+
+=======================================================
diff --git a/plugins/leaflet/css/contents.css b/plugins/leaflet/css/contents.css
new file mode 100755
index 0000000..49f0ee7
--- /dev/null
+++ b/plugins/leaflet/css/contents.css
@@ -0,0 +1,43 @@
+.leaflet_div {
+ background: #eee;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ box-shadow: 0 1px 1px #fff inset, 0 -1px 0px #ccc inset;
+ line-height: 0;
+ margin-right: 1em;
+ margin-bottom: 1em;
+}
+
+.leaflet_div.align-left {
+ float: left;
+}
+
+.leaflet_div.align-right {
+ float: right;
+}
+
+.leaflet_div.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.cke_widget_wrapper:hover>.cke_widget_element {
+ outline: 3px solid yellow !important;
+}
+
+.responsive-map {
+ height: 0;
+ padding-bottom: 56.25%;
+ padding-top: 25px;
+ position: relative;
+ width: 100%;
+}
+
+.responsive-map-iframe {
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+} \ No newline at end of file
diff --git a/plugins/leaflet/demo/index.html b/plugins/leaflet/demo/index.html
new file mode 100755
index 0000000..63c0640
--- /dev/null
+++ b/plugins/leaflet/demo/index.html
@@ -0,0 +1,256 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <title>Test Page of CKEditor Leaflet Maps</title>
+ <script src="http://localhost/ckeditor/ckeditor.js"></script>
+ <style>
+ #cke_my_editor {
+ max-width: 1000px;
+ }
+
+ h4,
+ h5 {
+ font-family: sans-serif;
+ }
+
+ h4 {
+ color: rgb(117, 117, 117);
+ }
+
+ h5 {
+ color: rgb(212, 78, 211);
+ margin-bottom: 0px;
+ margin-top: -10px;
+ }
+
+ #languages {
+ margin-bottom: 20px;
+ margin-top: 3px;
+ }
+
+ #github-banner {
+ height: 149px;
+ width: 149px;
+ overflow: hidden;
+ padding: 0;
+ margin: 0;
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 99999;
+ }
+
+ #github-banner a {
+ display: block;
+ width: 190px;
+ font-size: 14px;
+ font-family: Frutiger, "Frutiger Linotype", Univers, Calibri, "Gill Sans", "Gill Sans MT",
+ "Myriad Pro", Myriad, "DejaVu Sans Condensed", "Liberation Sans", "Nimbus Sans L", Tahoma,
+ Geneva, "Helvetica Neue", Helvetica, Arial, sans serif;
+ background-color: #333;
+ color: #FFF;
+ word-spacing: 2px;
+ text-decoration: none;
+ padding: 5px 15px 5px 25px;
+
+ position: relative;
+ left: 20px;
+ top: -37px;
+ text-align: center;
+
+ -moz-transform-origin: 0 0;
+ -moz-transform: rotate(45deg);
+ -moz-box-shadow: 1px 1px 5px 1px #666;
+
+ -webkit-transform-origin: 0 0;
+ -webkit-transform: rotate(45deg);
+ -webkit-box-shadow: 1px 1px 5px 1px #666;
+
+ -ms-transform-origin: 0 0;
+ -ms-transform: rotate(45deg);
+ -ms-box-shadow: 1px 1px 5px 1px #666;
+
+ transform-origin: 0 0;
+ transform: rotate(45deg);
+ box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.2);
+
+ background-image: linear-gradient(bottom, #534E41 3%, #9E9B96 5%, #64625A 7%, #5C5A55 93%, #9E9B96 95%, #534E41 97%);
+ background-image: -o-linear-gradient(bottom, #534E41 3%, #9E9B96 5%, #64625A 7%, #5C5A55 93%, #9E9B96 95%, #534E41 97%);
+ background-image: -moz-linear-gradient(bottom, #534E41 3%, #9E9B96 5%, #64625A 7%, #5C5A55 93%, #9E9B96 95%, #534E41 97%);
+ background-image: -webkit-linear-gradient(bottom, #534E41 3%, #9E9B96 5%, #64625A 7%, #5C5A55 93%, #9E9B96 95%, #534E41 97%);
+ background-image: -ms-linear-gradient(bottom, #534E41 3%, #9E9B96 5%, #64625A 7%, #5C5A55 93%, #9E9B96 95%, #534E41 97%);
+
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.03, #534E41), color-stop(0.05, #9E9B96), color-stop(0.07, #64625A), color-stop(0.93, #5C5A55), color-stop(0.95, #9E9B96), color-stop(0.97, #534E41));
+ }
+ </style>
+ <meta content="text/html; charset=utf-8" http-equiv="content-type" />
+
+</head>
+
+<body>
+ <div id="github-banner"><a href="https://github.com/ranelpadon/ckeditor-leaflet" target="_blank">Fork me on
+ GitHub</a></div>
+ <form>
+ <h4>CKEditor Leaflet Maps Demo (scroll down the page to see the various examples)</h4>
+
+ <h5>Choose the language/translation to be used by the toolbar/plugins:</h5>
+
+ <script>
+ CKEDITOR_LANGS = [
+ {
+ code: 'eu',
+ name: 'Basque'
+ },
+ {
+ code: 'en',
+ name: 'English'
+ },
+ {
+ code: 'de',
+ name: 'German'
+ },
+ {
+ code: 'ru',
+ name: 'Russian'
+ },
+ ];
+
+ document.write('<select disabled="disabled" id="languages" onchange="createEditor(this.value);">');
+
+ // Get the language list from the languages.js file.
+ for (var i = 0; i < CKEDITOR_LANGS.length; i++) {
+ document.write(
+ '<option value="' + CKEDITOR_LANGS[i].code + '">' + CKEDITOR_LANGS[i].name + '</option>'
+ );
+ }
+
+ document.write('</select>');
+ </script>
+
+ <div>
+ <textarea name="my_editor" id="my_editor" rows="5" cols="20">
+ <p>This is the <strong>House of Maps</strong> powered by <strong>CKEditor</strong>.</p>
+ <div id="leaflet_div-1" class="leaflet_div align-left" data-lat="14.6496465" data-lon="121.0474325" data-width="600" data-height="600" data-zoom="15" data-tile="OpenStreetMap.HOT" data-minimap="on" data-alignment="left" data-popup-text="Eye of Quezon Circle" data-responsive="">
+ <iframe scrolling="no" id="leaflet_iframe-1" class="leaflet_iframe" width="600px" height="600px" frameborder="0" allowtransparency="true" src="../scripts/mapParser.html?lat=14.6508560&lon=121.0491228&zoom=15&tile=OpenStreetMap.HOT&minimap=on&text=Eye%20of%20Quezon%20Circle">
+ </iframe>
+ </div>
+
+ <p>If you <strong>hover</strong> the mouse on the map, you will see the map's handle bar (cross hair) in the <strong>upper left corner</strong>
+ and you could double-click that to view or edit the map properties.</p>
+ <div id="leaflet_div-2" class="leaflet_div cke_widget_element align-left" data-lat="16.4023332" data-lon="120.5960071" data-width="300" data-height="300" data-zoom="7" data-tile="Esri.WorldTopoMap" data-minimap="off" data-alignment="left" data-popup-text="" data-responsive="">
+ <iframe scrolling="no" id="leaflet_iframe-2" class="leaflet_iframe" width="300px" height="300px" frameborder="0" allowtransparency="true" src="../scripts/mapParser.html?lat=16.4023332&amp;lon=120.5960071&amp;width=300&amp;height=300&amp;zoom=7&amp;tile=Esri.WorldTopoMap&amp;minimap=off&text="></iframe>
+ </div>
+
+ <p><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />A sample of Aerial Map Tile, aligned to the right.</p>
+ <div id="leaflet_div-3" class="leaflet_div cke_widget_element align-right" data-lat="-25.274398" data-lon="133.775136" data-width="190" data-height="200" data-zoom="2" data-tile="MapQuestOpen.Aerial" data-minimap="off" data-alignment="right" data-popup-text="" data-responsive="">
+ <iframe scrolling="no" id="leaflet_iframe-3" class="leaflet_iframe" width="190px" height="200px" frameborder="0" allowtransparency="true" src="../scripts/mapParser.html?lat=-25.274398&amp;lon=133.775136&amp;width=200&amp;height=200&amp;zoom=2&amp;tile=MapQuestOpen.Aerial&amp;minimap=off&amp;text="></iframe>
+ </div>
+
+ <p>Words in the middle of nowhere.<br /><br /><br /><br /><br /><br /><br /><br /></p>
+
+ <br />
+ <p>A sample of a centered map.</p>
+ <div id="leaflet_div-1399746577201" class="leaflet_div cke_widget_element align-center" data-lat="29.646923" data-lon="91.117212" data-width="800" data-height="400" data-zoom="6" data-tile="Esri.NatGeoWorldMap" data-minimap="off" data-alignment="center" data-popup-text="" data-responsive="">
+ <iframe scrolling="no" id="leaflet_iframe-1399746577201" class="leaflet_iframe" width="800px" height="400px" frameborder="0" allowtransparency="true" src="../scripts/mapParser.html?lat=29.646923&amp;lon=91.117212&amp;width=800&amp;height=400&amp;zoom=6&amp;tile=Esri.NatGeoWorldMap&amp;minimap=off&amp;text=">
+ </iframe>
+ </div>
+
+ <br />
+
+ <p>A sample of a left-justified map. By default, a map will float to the left.</p>
+ <div id="leaflet_div-1399747688186" class="leaflet_div cke_widget_element align-left" data-lat="9.8349493" data-lon="118.7383615" data-width="300" data-height="420" data-zoom="7" data-tile="Stamen.Watercolor" data-minimap="off" data-popup-text="" data-responsive="">
+ <iframe scrolling="no" id="leaflet_iframe-1399747688186" class="leaflet_iframe" width="300px" height="420px" frameborder="0" allowtransparency="true" src="../scripts/mapParser.html?lat=9.8349493&amp;lon=118.7383615&amp;width=300&amp;height=420&amp;zoom=7&amp;tile=Stamen.Watercolor&amp;minimap=off&amp;text=">
+ </iframe>
+ </div>
+
+ <p> <strong>Lateralus</strong> by Tool <br /><br />
+
+ Black then white are all I see in my infancy.
+ red and yellow then came to be, reaching out to me.
+ lets me see there is so much more
+ and beckons me to look through to these infinite possibilities.
+ As below, so above and beyond, I imagine
+ drawn outside the lines of reason.
+ Push the envelope. Watch it bend.<br /><br />
+
+ Over thinking, over analyzing separates the body from the mind.
+ Withering my intuition leaving all these opportunities behind.<br /><br />
+
+ Feed my will to feel this moment urging me to cross the line.
+ Reaching out to embrace the random.
+ Reaching out to embrace whatever may come.<br /><br />
+
+ I embrace my desire to
+ feel the rhythm, to feel connected
+ enough to step aside and weep like a widow
+ to feel inspired, to fathom the power,
+ to witness the beauty, to bathe in the fountain,
+ to swing on the spiral
+ of our divinity and still be a human.<br /><br />
+ </p>
+
+ <br><br><p>&nbsp;</p><p>&nbsp;</p><p>A Responsive Map (try to decrease the browser window width by 50%)</p><div id="leaflet_div-1451082032544" class="leaflet_div responsive-map align-left" data-lat="40.46366700000001" data-lon="-3.74922" data-width="400" data-height="400" data-zoom="16" data-popup-text="In The Heart of Spain" data-tile="Thunderforest.OpenCycleMap" data-minimap="on" data-alignment="left" data-responsive="on"><iframe scrolling="no" id="leaflet_iframe-1451082032544" class="leaflet_iframe responsive-map-iframe" width="400px" height="400px" frameborder="0" allowtransparency="true" src="../scripts/mapParser.html?lat=40.46366700000001&lon=-3.74922&width=400&height=400&zoom=16&text=In%20The%20Heart%20of%20Spain&tile=Thunderforest.OpenCycleMap&minimap=on&responsive=on"></iframe></div>
+ </textarea>
+ </div>
+
+ <script>
+ var leaflet = 'leaflet';
+ var relativePath = location.pathname;
+ var leafletIndex = relativePath.indexOf(leaflet);
+ var leafletPluginFolderRelativePath = relativePath.substring(0, leafletIndex);
+
+ // Load a local plugin in the CDN-hosted CKEditor.js core.
+ CKEDITOR.plugins.addExternal(leaflet, leafletPluginFolderRelativePath + leaflet + '/');
+
+ var config = CKEDITOR.config;
+
+ // Specify the custom key.
+ // Here's using my personal Google API key, it's the default value also.
+ // but not recommended for Production use.
+ // It's advised that you create your own key in your Google account.
+ config.leaflet_maps_google_api_key = 'GOOGLE_API_KEY_REMOVED';
+
+ // Activate the plugins.
+ config.extraPlugins = 'lineutils,widget,leaflet,sourcearea';
+
+ var editor;
+
+ function createEditor(languageCode) {
+ if (editor)
+ editor.destroy();
+
+ // Replace the <textarea id="my_editor"> with an CKEditor
+ // instance, using specified configurations.
+ editor = CKEDITOR.replace('my_editor', {
+ toolbar:
+ [
+ ['Source'],
+ ['Bold', 'Italic'],
+ ['leaflet']
+ ],
+ width: '100%',
+ height: 2350,
+
+ language: languageCode,
+
+ on: {
+ instanceReady: function () {
+ // Wait for the editor to be ready to set
+ // the language drop-down list.
+ var languages = document.getElementById('languages');
+ languages.value = this.langCode;
+ languages.disabled = false;
+ }
+ }
+ });
+ }
+
+ // At page startup, load the default language:
+ createEditor('');
+ </script>
+
+ </form>
+</body>
+
+</html> \ No newline at end of file
diff --git a/plugins/leaflet/dialogs/leaflet.js b/plugins/leaflet/dialogs/leaflet.js
new file mode 100755
index 0000000..8782995
--- /dev/null
+++ b/plugins/leaflet/dialogs/leaflet.js
@@ -0,0 +1,518 @@
+CKEDITOR.dialog.add('leaflet', function(editor) {
+ var mapContainer = '';
+
+ // Access the current translation file.
+ var pluginTranslation = editor.lang.leaflet;
+
+ // Use the core translation file. Used mainly for the `Alignment` values.
+ var commonTranslation = editor.lang.common;
+
+ // Dialog's function callback for the Leaflet Map Widget.
+ return {
+ title: pluginTranslation.dialogTitle,
+ minWidth: 320,
+ minHeight: 125,
+
+ contents: [{
+ // Create a Location tab.
+ id: 'location_tab',
+ label: pluginTranslation.locationTabLabel,
+ elements: [
+ {
+ id: 'map_geocode',
+ className: 'geocode',
+ type: 'text',
+ label: pluginTranslation.googleSearchFieldLabel,
+ style: 'margin-top: -7px;',
+
+ setup: function(widget) {
+ this.setValue('');
+ },
+
+ onShow: function(widget) {
+ // Get the DOM reference for the Search field.
+ var input = jQuery('.geocode input')[0];
+
+ // Set a diffused/default text for better user experience.
+ // This will override the Google's default placeholder text:
+ // 'Enter a location'.
+ jQuery('.geocode input').attr('placeholder', pluginTranslation.googleSearchFieldHint);
+
+ var config = editor.config;
+
+ // Default value, but eventually will reach its quota if many users
+ // will just utilize this key instead of creating their own.
+ var googleApiKey = 'GOOGLE_API_KEY_REMOVED';
+
+ if (typeof config.leaflet_maps_google_api_key != 'undefined' && config.leaflet_maps_google_api_key != '') {
+ googleApiKey = config.leaflet_maps_google_api_key;
+ }
+
+ // Execute only once, and not every dialog pop-up.
+ if (typeof google == 'undefined') {
+ // Load other needed external library.
+ // Wait for the script to finish loading before binding
+ // the autocomplete mechanism to prevent rendering issue.
+ CKEDITOR.scriptLoader.load('//maps.googleapis.com/maps/api/js?libraries=places&callback=dummy&key=' + googleApiKey, function() {
+ // Bind the Search field to the Autocomplete widget.
+ var autocomplete = new google.maps.places.Autocomplete(input);
+ });
+ }
+
+ // Fix for the Google's type-ahead search displaying behind
+ // the widgets dialog window.
+ // Basically, we want to override the z-index of the
+ // Seach Autocomplete list, in which the styling is being set
+ // in real-time by Google.
+ // Make a new DOM element.
+ var stylesheet = jQuery('<style type="text/css" />');
+
+ // Set the inner HTML. Include also the vertical alignment
+ // adjustment for the MiniMap checkbox.
+ stylesheet.html('.pac-container { z-index: 100000 !important;} input.minimap { margin-top: 18px !important; }');
+
+ // Append to the main document's Head section.
+ jQuery('head').append(stylesheet);
+ },
+ },
+
+ { // Dummy element serving as label/text container only.
+ type: 'html',
+ id: 'map_label',
+ className: 'label',
+ style: 'margin-bottom: -10px;',
+ html: '<p>' + pluginTranslation.manualCoordinatesFieldLabel + '</p>'
+ },
+
+ {
+ // Create a new horizontal group.
+ type: 'hbox',
+ // Set the relative widths of Latitude, Longitude and Zoom fields.
+ widths: ['50%', '50%'],
+ children: [
+ {
+ id: 'map_latitude',
+ className: 'latitude',
+ type: 'text',
+ label: pluginTranslation.manualLatitudeFieldLabel,
+
+ setup: function(widget) {
+ // Set the Lat values if widget has previous value.
+ if (widget.element.data('lat') !== '') {
+ // Update the data-lat based on the map lat in iframe.
+ // Make sure that mapContainer is set.
+ // Also avoids setting it again since zoom/longitude
+ // might already computed/set this object.
+ if (mapContainer === '') {
+ mapContainer = widget.element.getChild(0).$.contentDocument.getElementById('map_container');
+ }
+
+ var currentLat = mapContainer.getAttribute('data-lat');
+
+ this.setValue(currentLat);
+ }
+ },
+ },
+
+ {
+ id: 'map_longitude',
+ className: 'longitude',
+ type: 'text',
+ label: pluginTranslation.manualLongitudeFieldLabel,
+
+ setup: function(widget) {
+ // Set the Lon values if widget has previous value.
+ if (widget.element.data('lat') !== '') {
+ // Update the data-lon based on the map lon in iframe.
+ // Make sure that mapContainer is set.
+ // Also avoids setting it again since zoom/latitude
+ // might already computed/set this object.
+ if (mapContainer === '') {
+ mapContainer = widget.element.getChild(0).$.contentDocument.getElementById('map_container');
+ }
+
+ var currentLon = mapContainer.getAttribute('data-lon');
+
+ this.setValue(currentLon);
+ }
+ },
+ },
+ ]
+ },
+
+ {
+ id: 'popup_text',
+ className: 'popup-text',
+ type: 'text',
+ label: pluginTranslation.popupTextFieldLabel,
+ style: 'margin-bottom: 8px;',
+
+ setup: function(widget) {
+ // Set the Lat values if widget has previous value.
+ if (widget.element.data('popup-text') != '') {
+ this.setValue(widget.element.data('popup-text'));
+ }
+
+ else {
+ // Set a diffused/default text for better user experience.
+ jQuery('.popup-text input').attr('placeholder', pluginTranslation.popupTextFieldHint)
+ }
+ },
+ },
+ ]
+ },
+
+ {
+ // Create an Options tab.
+ id: 'options_tab',
+ label: pluginTranslation.optionsTabLabel,
+ elements: [
+ {
+ // Create a new horizontal group.
+ type: 'hbox',
+ style: 'margin-top: -7px;',
+ // Set the relative widths of Latitude, Longitude and Zoom fields.
+ widths: ['38%', '38%', '24%'],
+ children: [
+ {
+ id: 'width',
+ className: 'map_width',
+ type: 'text',
+ label: pluginTranslation.mapWidthFieldLabel,
+
+ setup: function(widget) {
+ // Set a diffused/default text for better user experience.
+ jQuery('.map_width input').attr('placeholder', '400')
+
+ // Set the map width value if widget has a previous value.
+ if (widget.element.data('width') != '') {
+ this.setValue(widget.element.data('width'));
+ }
+ },
+ },
+
+ {
+ id: 'height',
+ className: 'map_height',
+ type: 'text',
+ label: pluginTranslation.mapHeightFieldLabel,
+
+ setup: function(widget) {
+ // Set a diffused/default text for better user experience.
+ jQuery('.map_height input').attr('placeholder', '400');
+
+ // Set the map height value if widget has a previous value.
+ if (widget.element.data('height') != '') {
+ this.setValue(widget.element.data('height'));
+ }
+ },
+ },
+
+ {
+ // Create a select list for Zoom Levels.
+ // 'className' attribute is used for targeting this element in jQuery.
+ id: 'map_zoom',
+ className: 'zoom',
+ type: 'select',
+ label: pluginTranslation.mapZoomLevelFieldLabel,
+ width: '70px',
+ items: [['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9'], ['10'], ['11'], ['12'], ['13'], ['14'], ['15'], ['16'], ['17'], ['18'], ['19'], ['20']],
+
+ // This will execute also every time you edit/double-click the widget.
+ setup: function(widget) {
+ // Set this Zoom Level's select list when
+ // the current location has been initialized and set previously.
+ if (widget.element.data('zoom') != '') {
+ // Update the data-zoom based on the map zoom level in iframe.
+ // Make sure that mapContainer is set.
+ // Also avoids setting it again since latitude/longitude
+ // might already computed/set this object.
+ if (mapContainer === '') {
+ mapContainer = widget.element.getChild(0).$.contentDocument.getElementById('map_container');
+ }
+
+ var currentZoom = mapContainer.getAttribute('data-zoom');
+
+ this.setValue(currentZoom);
+ }
+
+ // Set the Default Zoom Level value.
+ else {
+ this.setValue('10');
+ }
+ },
+ }
+ ]
+ },
+
+ {
+ // Create a new horizontal group.
+ type: 'hbox',
+ // Set the relative widths for the tile and overview map fields.
+ widths: ['50%', '50%'],
+ children: [
+ {
+ // Create a select list for map tiles.
+ // 'className' attribute is used for targeting this element in jQuery.
+ type: 'select',
+ id: 'map_tile',
+ className: 'tile',
+ label: pluginTranslation.baseMapTileLabel,
+ items: [['OpenStreetMap.Mapnik'], ['OpenStreetMap.DE'], ['OpenStreetMap.HOT'], ['Esri.DeLorme'], ['Esri.NatGeoWorldMap'], ['Esri.WorldPhysical'], ['Esri.WorldTopoMap'], ['Thunderforest.OpenCycleMap'], ['Thunderforest.Landscape'], ['Stamen.Watercolor']],
+
+ // This will execute also every time you edit/double-click the widget.
+ setup: function(widget) {
+ var restrictedTiles = ['MapQuestOpen.Aerial', 'MapQuestOpen.OSM'];
+
+ var tile = widget.element.data('tile');
+
+ // Set the Tile data attribute.
+ // Must not be the restricted, MapQuest tiles.
+ if (tile != '' && restrictedTiles.indexOf(tile) == -1) {
+ this.setValue(tile);
+ }
+
+ else {
+ // Set the default value.
+ // Includes the case for existing MapQuest tiles.
+ this.setValue('OpenStreetMap.Mapnik');
+ }
+ },
+
+ // This will execute every time you click the Dialog's OK button.
+ // It will inject a map iframe in the CKEditor page.
+ commit: function(widget) {
+ // Remove the iframe if it has one.
+ widget.element.setHtml('');
+
+ // Retrieve the value in the Search field.
+ var geocode = jQuery('.geocode input').val();
+ var latitude, longitude;
+
+ if (geocode != '') {
+ // No need to call the encodeURIComponent().
+ var geocodingRequest = '//maps.googleapis.com/maps/api/geocode/json?address=' + geocode + '&sensor=false';
+
+ // Disable the asynchoronous behavior temporarily so that
+ // waiting for results will happen before proceeding
+ // to the next statements.
+ jQuery.ajaxSetup({
+ async: false
+ });
+
+ // Geocode the retrieved place name.
+ jQuery.getJSON(geocodingRequest, function(data) {
+ if (data['status'] != 'ZERO_RESULTS') {
+ // Get the Latitude and Longitude object in the
+ // returned JSON object.
+ latitude = data.results[0].geometry.location.lat;
+ longitude = data.results[0].geometry.location.lng;
+ }
+
+ // Handle queries with no results or have some
+ // malformed parameters.
+ else {
+ alert('The Place could not be Geocoded properly. Kindly choose another one.')
+ }
+ });
+ }
+
+ // Get the Lat/Lon values from the corresponding fields.
+ var latInput = jQuery('.latitude input').val();
+ var lonInput = jQuery('.longitude input').val();
+
+ // Get the data-lat and data-lon values.
+ // It is empty for yet to be created widgets.
+ var latSaved = widget.element.data('lat');
+ var lonSaved = widget.element.data('lon');
+
+ // Used the inputted values if it's not empty or
+ // not equal to the previously saved values.
+ // latSaved and lonSaved are initially empty also
+ // for widgets that are yet to be created.
+ // Or if the user edited an existing map, and did not edit
+ // the lat/lon fields, and the Search field is empty.
+ if ((latInput != '' && lonInput != '') && ((latInput != latSaved && lonInput != lonSaved) || geocode == '')) {
+ latitude = latInput;
+ longitude = lonInput;
+ }
+
+ var width = jQuery('.map_width input').val() || '400';
+ var height = jQuery('.map_height input').val() || '400';
+ var zoom = jQuery('select.zoom').val();
+ var popUpText = jQuery('.popup-text input').val();
+ var tile = jQuery('select.tile').val();
+ var alignment = jQuery('select.alignment').val();
+
+ // Returns 'on' or 'undefined'.
+ var minimap = jQuery('.minimap input:checked').val();
+
+ // Use 'off' if the MiniMap checkbox is unchecked.
+ if (minimap == undefined) {
+ minimap = 'off';
+ }
+
+ // Get a unique timestamp:
+ var milliseconds = new Date().getTime();
+
+ // Set/Update the widget's data attributes.
+ widget.element.setAttribute('id', 'leaflet_div-' + milliseconds);
+
+ widget.element.data('lat', latitude);
+ widget.element.data('lon', longitude);
+ widget.element.data('width', width);
+ widget.element.data('height', height);
+ widget.element.data('zoom', zoom);
+ widget.element.data('popup-text', popUpText);
+ widget.element.data('tile', tile);
+ widget.element.data('minimap', minimap);
+ widget.element.data('alignment', alignment);
+
+ // Remove the previously set alignment class.
+ // Only one alignment class is set per map.
+ widget.element.removeClass('align-left');
+ widget.element.removeClass('align-right');
+ widget.element.removeClass('align-center');
+
+ // Set the alignment for this map.
+ widget.element.addClass('align-' + alignment);
+
+ // Returns 'on' or 'undefined'.
+ var responsive = jQuery('.responsive input:checked').val();
+
+ // Use 'off' if the Responsive checkbox is unchecked.
+ if (responsive == undefined) {
+ responsive = 'off';
+
+ // Remove the previously set responsive map class,
+ // if there's any.
+ widget.element.removeClass('responsive-map');
+ }
+
+ else {
+ // Add a class for styling.
+ widget.element.addClass('responsive-map');
+ }
+
+ // Set the 'responsive' data attribute.
+ widget.element.data('responsive', responsive);
+
+ // Build the full path to the map renderer.
+ mapParserPathFull = mapParserPath + '?lat=' + latitude + '&lon=' + longitude + '&width=' + width + '&height=' + height + '&zoom=' + zoom + '&text=' + popUpText + '&tile=' + tile + '&minimap=' + minimap + '&responsive=' + responsive;
+
+ // Create a new CKEditor DOM's iFrame.
+ var iframe = new CKEDITOR.dom.element('iframe');
+
+ // Setup the iframe characteristics.
+ iframe.setAttributes({
+ 'scrolling': 'no',
+ 'id': 'leaflet_iframe-' + milliseconds,
+ 'class': 'leaflet_iframe',
+ 'width': width + 'px',
+ 'height': height + 'px',
+ 'frameborder': 0,
+ 'allowTransparency': true,
+ 'src': mapParserPathFull,
+ 'data-cke-saved-src': mapParserPathFull
+ });
+
+ // If map is responsive.
+ if (responsive == 'on') {
+ // Add a class for styling.
+ iframe.setAttribute('class', 'leaflet_iframe responsive-map-iframe');
+ }
+
+ // Insert the iframe to the widget's DIV element.
+ widget.element.append(iframe);
+
+ // Reset/clear the map iframe/DOM object reference.
+ mapContainer = '';
+ },
+ },
+
+ {
+ type: 'checkbox',
+ id: 'map_mini',
+ className: 'minimap',
+ label: pluginTranslation.minimapCheckboxLabel,
+
+ // This will execute also every time you edit/double-click the widget.
+ setup: function(widget) {
+ // Set the MiniMap check button.
+ if (widget.element.data('minimap') != '' && widget.element.data('minimap') != 'on') {
+ this.setValue('');
+ }
+
+ else {
+ // Set the default value.
+ this.setValue('true');
+ }
+ },
+ }
+ ]
+ },
+
+ {
+ // Create a new horizontal group.
+ type: 'hbox',
+ // Set the relative widths for alignment and responsive options.
+ widths: ['20%', '80%'],
+ children: [
+ {
+ // Create a select list for Map Alignment.
+ // 'className' attribute is used for targeting this element in jQuery.
+ id: 'map_alignment',
+ className: 'alignment',
+ type: 'select',
+ label: commonTranslation.align,
+ items: [[commonTranslation.alignLeft, 'left'], [commonTranslation.alignRight, 'right'], [commonTranslation.alignCenter, 'center']],
+ style: 'margin-bottom: 4px;',
+
+ // This will execute also every time you edit/double-click the widget.
+ setup: function(widget) {
+ // Set this map alignment's select list when
+ // the current map has been initialized and set previously.
+ if (widget.element.data('alignment') != '') {
+ // Set the alignment.
+ this.setValue(widget.element.data('alignment'));
+ }
+
+ // Set the Default alignment value.
+ else {
+ this.setValue('left');
+ }
+ },
+ },
+
+ {
+ type: 'checkbox',
+ id: 'map_responsive',
+ className: 'responsive',
+ label: pluginTranslation.responsiveMapCheckboxLabel,
+ style: 'margin-top: 18px;',
+
+ // This will execute also every time you edit/double-click the widget.
+ setup: function(widget) {
+ // Set the Responsive check button, when editing widget.
+ if (widget.element.data('responsive') != '') {
+ if (widget.element.data('responsive') == 'on') {
+ this.setValue('true');
+ }
+
+ else {
+ this.setValue('');
+ }
+ }
+
+ // Set the default value for new ones.
+ else {
+ this.setValue('');
+ }
+ },
+ }
+ ]
+ }
+ ]
+ }]
+ };
+});
diff --git a/plugins/leaflet/icons/leaflet.png b/plugins/leaflet/icons/leaflet.png
new file mode 100755
index 0000000..803b31a
--- /dev/null
+++ b/plugins/leaflet/icons/leaflet.png
Binary files differ
diff --git a/plugins/leaflet/lang/de.js b/plugins/leaflet/lang/de.js
new file mode 100755
index 0000000..cfd957e
--- /dev/null
+++ b/plugins/leaflet/lang/de.js
@@ -0,0 +1,19 @@
+CKEDITOR.plugins.setLang('leaflet', 'de', {
+ buttonLabel: 'Karte einfügen/bearbeiten',
+ dialogTitle: 'Eigenschaften',
+ locationTabLabel: 'Karte',
+ googleSearchFieldLabel: 'Ort suchen',
+ googleSearchFieldHint: 'Geben Sie einen Standort ein',
+ manualCoordinatesFieldLabel: 'oder Koordinaten',
+ manualLatitudeFieldLabel: 'Breitengrad',
+ manualLongitudeFieldLabel: 'Längengrad',
+ popupTextFieldLabel: 'Marker',
+ popupTextFieldHint: 'Pop-up Text (Optional)',
+ optionsTabLabel: 'Optionen',
+ mapWidthFieldLabel: 'Breite',
+ mapHeightFieldLabel: 'Höhe',
+ mapZoomLevelFieldLabel: 'Zoom',
+ baseMapTileLabel: 'Quelle Kartenmaterial',
+ minimapCheckboxLabel: 'Übersichtskarte',
+ responsiveMapCheckboxLabel: 'Responsive',
+});
diff --git a/plugins/leaflet/lang/en.js b/plugins/leaflet/lang/en.js
new file mode 100755
index 0000000..5a3b5c4
--- /dev/null
+++ b/plugins/leaflet/lang/en.js
@@ -0,0 +1,20 @@
+// Declare the plugin's English translation.
+CKEDITOR.plugins.setLang('leaflet', 'en', {
+ buttonLabel: 'Insert Leaflet Map',
+ dialogTitle: 'Create/Edit Leaflet Map',
+ locationTabLabel: 'Location',
+ googleSearchFieldLabel: 'Auto-Complete Search Using Google',
+ googleSearchFieldHint: 'Enter a place name here',
+ manualCoordinatesFieldLabel: 'Manual Input of Coordinates',
+ manualLatitudeFieldLabel: 'Latitude',
+ manualLongitudeFieldLabel: 'Longitude',
+ popupTextFieldLabel: 'Pop-up Text (Optional)',
+ popupTextFieldHint: "Enter the marker's text",
+ optionsTabLabel: 'Options',
+ mapWidthFieldLabel: 'Map Width',
+ mapHeightFieldLabel: 'Map Height',
+ mapZoomLevelFieldLabel: 'Zoom Level',
+ baseMapTileLabel: 'Base Map Tile',
+ minimapCheckboxLabel: 'Include MiniMap',
+ responsiveMapCheckboxLabel: 'Responsive Map (100% Width)',
+});
diff --git a/plugins/leaflet/lang/eu.js b/plugins/leaflet/lang/eu.js
new file mode 100755
index 0000000..9392f6c
--- /dev/null
+++ b/plugins/leaflet/lang/eu.js
@@ -0,0 +1,19 @@
+CKEDITOR.plugins.setLang('leaflet', 'eu', {
+ buttonLabel: 'Txertatu Leaflet mapa',
+ dialogTitle: 'Sortu/Editatu Leaflet mapa',
+ locationTabLabel: 'Kokalekua',
+ googleSearchFieldLabel: 'Osatu automatikoki Google erabiliz',
+ googleSearchFieldHint: 'Sartu toki-izen bat hemen',
+ manualCoordinatesFieldLabel: 'Koordenatuen eskuzko sarrera',
+ manualLatitudeFieldLabel: 'Latitudea',
+ manualLongitudeFieldLabel: 'Longitudea',
+ popupTextFieldLabel: 'Laster-menuaren testua (hautazkoa)',
+ popupTextFieldHint: "Sartu markatzailearen testua",
+ optionsTabLabel: 'Aukerak',
+ mapWidthFieldLabel: 'Maparen zabalera',
+ mapHeightFieldLabel: 'Maparen altuera',
+ mapZoomLevelFieldLabel: 'Zoom maila',
+ baseMapTileLabel: 'Maparen lauzak',
+ minimapCheckboxLabel: 'Bistaratu mapatxoa',
+ responsiveMapCheckboxLabel: 'Mapa moldakorra (100% zabalera)',
+});
diff --git a/plugins/leaflet/lang/ru.js b/plugins/leaflet/lang/ru.js
new file mode 100755
index 0000000..fb484d0
--- /dev/null
+++ b/plugins/leaflet/lang/ru.js
@@ -0,0 +1,19 @@
+CKEDITOR.plugins.setLang('leaflet', 'ru', {
+ buttonLabel: 'Вставить карту',
+ dialogTitle: 'Карта',
+ locationTabLabel: 'Местоположение',
+ googleSearchFieldLabel: 'Поиск через Google',
+ googleSearchFieldHint: 'Введите название места',
+ manualCoordinatesFieldLabel: 'Ручной ввод координат',
+ manualLatitudeFieldLabel: 'Широта',
+ manualLongitudeFieldLabel: 'Долгота',
+ popupTextFieldLabel: 'Всплывающий текст (Опционально)',
+ popupTextFieldHint: "Введите текст маркера",
+ optionsTabLabel: 'Параметры',
+ mapWidthFieldLabel: 'Ширина карты',
+ mapHeightFieldLabel: 'Высота карты',
+ mapZoomLevelFieldLabel: 'Масштаб',
+ baseMapTileLabel: 'Вид карты',
+ minimapCheckboxLabel: 'Включить миникарту',
+ responsiveMapCheckboxLabel: 'Адаптивная карта (ширина 100%)',
+});
diff --git a/plugins/leaflet/plugin.js b/plugins/leaflet/plugin.js
new file mode 100755
index 0000000..85de5e9
--- /dev/null
+++ b/plugins/leaflet/plugin.js
@@ -0,0 +1,176 @@
+/**
+* @fileOverview Leaflet Map Widget.
+*/
+(function() {
+ /* Flow of Control for CKEditor and Widget components:
+ Loading the page:
+ CKEditor init()
+ Widget upcast()
+
+ Creating new widgets:
+ Widget init()
+ Widget data()
+ Dialog select element's items()
+ Dialog onShow()
+ Dialog setup()
+ Dialog commit()
+
+ When editing existing widgets:
+ Dialog onShow()
+ Dialog setup()
+ Dialog commit()
+ Widget data()
+
+ When saving page or clicking the CKEditor's Source button:
+ Widget downcast()
+ */
+
+ // Add a new CKEditor plugin. Note that widgets are subclass of plugins.
+ CKEDITOR.plugins.add('leaflet', {
+ // Declare dependencies.
+ requires: 'widget',
+
+ // Declare the supported languages.
+ lang: 'de,en,eu,ru',
+
+ init: function(editor) {
+ var config = editor.config;
+
+ // Dummy global method for quick workaround of asynchronous document.write()
+ // issue of Google APIs with respect to CKEditor.
+ // See the Google APIs URL below for the query string usage of this dummy().
+ // Using this hack, the document.write(...) requirement of Google APIs
+ // will be replaced by the more 'gentle' combination of
+ // document.createElement(...) and document.body.appendChild(...).
+ window.dummy = function() {
+ // Do nothing.
+ }
+
+ // Check if jQuery is already loaded to avoid redundancy and overriding
+ // existing 3rd-party jQuery plugins' bindings to jQuery prototype.
+ if (typeof jQuery == 'undefined') {
+ // This is asynchronous loading.
+ // See also CKEDITOR.scriptLoader.queue.
+ CKEDITOR.scriptLoader.load('//code.jquery.com/jquery-1.12.4.min.js');
+ }
+
+ // Access the current translation file.
+ var pluginTranslation = editor.lang.leaflet;
+
+ // Declare a new Dialog for interactive selection of
+ // map parameters. It's still not bound to any widget at this moment.
+ CKEDITOR.dialog.add('leaflet', this.path + 'dialogs/leaflet.js');
+
+ // For reusability, declare a global variable pointing to the map script path
+ // that will build and render the map.
+ // In JavaScript, relative path must include the leading slash.
+ mapParserPath = CKEDITOR.getUrl(this.path + 'scripts/mapParser.html');
+
+ // Declare a new widget.
+ editor.widgets.add('leaflet', {
+ // Bind the widget to the Dialog command.
+ dialog: 'leaflet',
+
+ // Declare the elements to be upcasted back.
+ // Otherwise, the widget's code will be ignored.
+ // Basically, we will allow all divs with 'leaflet_div' class,
+ // including their alignment classes, and all iframes with
+ // 'leaflet_iframe' class, and then include
+ // all their attributes.
+ // Read more about the Advanced Content Filter here:
+ // * http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter
+ // * http://docs.ckeditor.com/#!/guide/plugin_sdk_integration_with_acf
+ allowedContent: 'div(!leaflet_div,align-left,align-right,align-center,responsive-map)[*];'
+ + 'iframe(!leaflet_iframe,responsive-map-iframe)[*];',
+
+ // Declare the widget template/structure, containing the
+ // important elements/attributes. This is a required property of widget.
+ template:
+ '<div id="" class="leaflet_div" data-lat="" data-lon="" data-width="" data-height="" ' +
+ 'data-zoom="" data-popup-text="" data-tile="" data-minimap="" data-alignment="" data-responsive=""></div>',
+
+ // This will be executed when going from the View Mode to Source Mode.
+ // This is usually used as the function to convert the widget to a
+ // dummy, simpler, or equivalent textual representation.
+ downcast: function(element) {
+ // Get the id of the div element.
+ var divId = element.attributes["id"];
+
+ // Get the numeric part of divId: leaflet_div-1399121271748.
+ // We'll use that number for quick fetching of target iframe.
+ var iframeId = "leaflet_iframe-" + divId.substring(12);
+
+ // The current user might have changed the map's zoom level
+ // via mouse events/zoom bar. The marker might have been
+ // dragged also which means its lat/lon had changed.
+ var mapContainer = editor.document.$.getElementById(iframeId).contentDocument.getElementById("map_container");
+
+ // Get the current map states.
+ var currentZoom = mapContainer.getAttribute("data-zoom");
+ var currentLat = mapContainer.getAttribute("data-lat");
+ var currentLon = mapContainer.getAttribute("data-lon");
+
+ // Update the saved corresponding values in data attributes.
+ element.attributes["data-zoom"] = currentZoom;
+ element.attributes["data-lat"] = currentLat;
+ element.attributes["data-lon"] = currentLon;
+
+ // Fetch the other data attributes needed for
+ // updating the full path of the map.
+ var width = element.attributes["data-width"];
+ var height = element.attributes["data-height"];
+ var popUpText = element.attributes["data-popup-text"];
+ var tile = element.attributes["data-tile"];
+ var minimap = element.attributes["data-minimap"];
+ var responsive = element.attributes["data-responsive"];
+
+ // Build the updated full path to the map renderer.
+ var mapParserPathFull = mapParserPath + "?lat=" + currentLat + "&lon=" + currentLon + "&width=" + width + "&height=" + height + "&zoom=" + currentZoom + "&text=" + popUpText + "&tile=" + tile + "&minimap=" + minimap + "&responsive=" + responsive;
+
+ // Update also the iframe's 'src' attributes.
+ // Updating 'data-cke-saved-src' is also required for
+ // internal use of CKEditor.
+ element.children[0].attributes["src"] = mapParserPathFull;
+ element.children[0].attributes["data-cke-saved-src"] = mapParserPathFull;
+
+ // Return the DOM's textual representation.
+ return element;
+ },
+
+ // Required property also for widgets, used when switching
+ // from CKEditor's Source Mode to View Mode.
+ // The reverse of downcast() method.
+ upcast: function(element) {
+ // If we encounter a div with a class of 'leaflet_div',
+ // it means that it's a widget and we need to convert it properly
+ // to its original structure.
+ // Basically, it says to CKEditor which div is a valid widget.
+ if (element.name == 'div' && element.hasClass('leaflet_div')) {
+ return element;
+ }
+ },
+ });
+
+ // Add the widget button in the toolbar and bind the widget command,
+ // which is also bound to the Dialog command.
+ // Apparently, this is required just like their plugin counterpart.
+ editor.ui.addButton('leaflet', {
+ label: pluginTranslation.buttonLabel,
+ command: 'leaflet',
+ icon: this.path + 'icons/leaflet.png',
+ toolbar: 'insert,1'
+ });
+
+ // Append the widget's styles when in the CKEditor edit page,
+ // added for better user experience.
+ // Assign or append the widget's styles depending on the existing setup.
+ if (typeof config.contentsCss == 'object') {
+ config.contentsCss.push(CKEDITOR.getUrl(this.path + 'css/contents.css'));
+ }
+
+ else {
+ config.contentsCss = [config.contentsCss, CKEDITOR.getUrl(this.path + 'css/contents.css')];
+ }
+ },
+ });
+})();
diff --git a/plugins/leaflet/scripts/Leaflet-MiniMap/.DS_Store b/plugins/leaflet/scripts/Leaflet-MiniMap/.DS_Store
new file mode 100755
index 0000000..8b6e25e
--- /dev/null
+++ b/plugins/leaflet/scripts/Leaflet-MiniMap/.DS_Store
Binary files differ
diff --git a/plugins/leaflet/scripts/Leaflet-MiniMap/LICENSE.txt b/plugins/leaflet/scripts/Leaflet-MiniMap/LICENSE.txt
new file mode 100755
index 0000000..e96d4c8
--- /dev/null
+++ b/plugins/leaflet/scripts/Leaflet-MiniMap/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2012, Norkart AS
+All rights reserved.
+
+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.
+
+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.
diff --git a/plugins/leaflet/scripts/Leaflet-MiniMap/package.json b/plugins/leaflet/scripts/Leaflet-MiniMap/package.json
new file mode 100755
index 0000000..485c105
--- /dev/null
+++ b/plugins/leaflet/scripts/Leaflet-MiniMap/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "leaflet-minimap",
+ "version": "1.0.0",
+ "author": "Norkart AS",
+ "description": "A plugin for Leaflet that provides a minimap in the corner of the map view.",
+ "license": "BSD-2-Clause",
+ "readmeFilename": "README.md",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Norkart/Leaflet-MiniMap.git"
+ },
+ "homepage": "https://github.com/Norkart/Leaflet-MiniMap",
+ "bugs": {
+ "url": "https://github.com/Norkart/Leaflet-MiniMap/issues"
+ },
+ "dependencies": {
+ "leaflet": ">=0.5.0"
+ },
+ "keywords": [
+ "maps",
+ "leaflet",
+ "client",
+ "minimap"
+ ]
+} \ No newline at end of file
diff --git a/plugins/leaflet/scripts/Leaflet-MiniMap/readme.md b/plugins/leaflet/scripts/Leaflet-MiniMap/readme.md
new file mode 100755
index 0000000..abcf335
--- /dev/null
+++ b/plugins/leaflet/scripts/Leaflet-MiniMap/readme.md
@@ -0,0 +1,47 @@
+# Leaflet.MiniMap
+
+Leaflet.MiniMap is a simple minimap control that you can drop into your leaflet map, and it will create a small map in the corner which shows the same as the main map with a set zoom offset. (By default it is -5.)
+
+## Using the MiniMap control
+
+The control can be inserted in two lines: First you have to construct a layer for it to use, and then you create and attach the minimap control. Don't reuse the layer you added to the main map, strange behaviour will ensue! Alternatively, you can pass in a LayerGroup with multiple layers (for example with overlays or suitably themed markers). Marker layers can't be reused either. (See issue #52 for a discussion of syncronising marker layers.)
+
+From the [example](http://norkart.github.com/Leaflet-MiniMap/example.html):
+
+ var osm2 = new L.TileLayer(osmUrl, {minZoom: 0, maxZoom: 13, attribution: osmAttrib});
+ var miniMap = new L.Control.MiniMap(osm2).addTo(map);
+
+As the minimap control inherits from leaflet's control, positioning is handled automatically by leaflet. However, you can still style the minimap and set its size by modifying the css file.
+
+**Note:** Leaflet version 0.5 or higher is required.
+
+## Available Options
+ The mini map uses options which can be set in the same way as other leaflet options, and these are the available options:
+
+`position:` The standard Leaflet.Control position parameter, used like all the other controls. Defaults to 'bottomright'.
+
+`width:` The width of the minimap in pixels. Defaults to 150.
+
+`height:` The height of the minimap in pixels. Defaults to 150.
+
+`zoomLevelOffset:` The offset applied to the zoom in the minimap compared to the zoom of the main map. Can be positive or negative, defaults to -5.
+
+`zoomLevelFixed:` Overrides the offset to apply a fixed zoom level to the minimap regardless of the main map zoom. Set it to any valid zoom level, if unset `zoomLevelOffset` is used instead.
+
+`zoomAnimation:` Sets whether the minimap should have an animated zoom. (Will cause it to lag a bit after the movement of the main map.) Defaults to false.
+
+`toggleDisplay:` Sets whether the minimap should have a button to minimise it. Defaults to false.
+
+`autoToggleDisplay:` Sets whether the minimap should hide automatically if the parent map bounds does not fit within the minimap bounds. Especially useful when 'zoomLevelFixed' is set.
+
+`aimingRectOptions:` Sets the style of the aiming rectangle by passing in a [Path.Options object](http://leafletjs.com/reference.html#path-options). (Clickable will always be overridden and set to false.)
+
+`shadowRectOptions:` Sets the style of the aiming shadow rectangle by passing in a [Path.Options object](http://leafletjs.com/reference.html#path-options). (Clickable will always be overridden and set to false.)
+
+###Translation strings
+
+These are not passed as options, but are overridden in a subclass. To do general translation overrides take a look at the german example sourcefile.
+
+`hideText:` Text-String to be displayed as Tooltip when hovering over the toggle button on the MiniMap and it is visible.
+
+`showText:` Text-String to be displayed as Tooltip when hovering over the toggle button on the MiniMap and it is hidden.
diff --git a/plugins/leaflet/scripts/Leaflet-MiniMap/src/.DS_Store b/plugins/leaflet/scripts/Leaflet-MiniMap/src/.DS_Store
new file mode 100755
index 0000000..09d2b2d
--- /dev/null
+++ b/plugins/leaflet/scripts/Leaflet-MiniMap/src/.DS_Store
Binary files differ
diff --git a/plugins/leaflet/scripts/Leaflet-MiniMap/src/Control.MiniMap.css b/plugins/leaflet/scripts/Leaflet-MiniMap/src/Control.MiniMap.css
new file mode 100755
index 0000000..daf59f7
--- /dev/null
+++ b/plugins/leaflet/scripts/Leaflet-MiniMap/src/Control.MiniMap.css
@@ -0,0 +1,43 @@
+.leaflet-control-minimap {
+ border: solid rgba(255, 255, 255, 1.0) 4px;
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65);
+ border-radius: 3px;
+ background: #f8f8f9;
+ transition: all .2s;
+}
+
+.leaflet-control-minimap a {
+ background-color: rgba(255, 255, 255, 1.0);
+ background-repeat: no-repeat;
+ z-index: 99999;
+ transition: all .2s;
+ border-radius: 3px 0px 0px 0px;
+}
+
+.leaflet-control-minimap a.minimized {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+ border-radius: 0px;
+}
+
+.leaflet-control-minimap-toggle-display {
+ background-image: url("images/toggle.png");
+ height: 19px;
+ width: 19px;
+ position: absolute;
+ bottom: 0;
+ right: 0;
+}
+
+/* Old IE */
+.leaflet-oldie .leaflet-control-minimap {
+ border: 1px solid #999;
+}
+
+.leaflet-oldie .leaflet-control-minimap a {
+ background-color: #fff;
+}
+
+.leaflet-oldie .leaflet-control-minimap a.minimized {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+} \ No newline at end of file
diff --git a/plugins/leaflet/scripts/Leaflet-MiniMap/src/Control.MiniMap.js b/plugins/leaflet/scripts/Leaflet-MiniMap/src/Control.MiniMap.js
new file mode 100755
index 0000000..e8a99d6
--- /dev/null
+++ b/plugins/leaflet/scripts/Leaflet-MiniMap/src/Control.MiniMap.js
@@ -0,0 +1,270 @@
+L.Control.MiniMap = L.Control.extend({
+ options: {
+ position: 'bottomright',
+ toggleDisplay: false,
+ zoomLevelOffset: -5,
+ zoomLevelFixed: false,
+ zoomAnimation: false,
+ autoToggleDisplay: false,
+ width: 150,
+ height: 150,
+ aimingRectOptions: { color: "#ff7800", weight: 1, clickable: false },
+ shadowRectOptions: { color: "#000000", weight: 1, clickable: false, opacity: 0, fillOpacity: 0 }
+ },
+
+ hideText: 'Hide MiniMap',
+
+ showText: 'Show MiniMap',
+
+ //layer is the map layer to be shown in the minimap
+ initialize: function(layer, options) {
+ L.Util.setOptions(this, options);
+ //Make sure the aiming rects are non-clickable even if the user tries to set them clickable (most likely by forgetting to specify them false)
+ this.options.aimingRectOptions.clickable = false;
+ this.options.shadowRectOptions.clickable = false;
+ this._layer = layer;
+ },
+
+ onAdd: function(map) {
+
+ this._mainMap = map;
+
+ //Creating the container and stopping events from spilling through to the main map.
+ this._container = L.DomUtil.create('div', 'leaflet-control-minimap');
+ this._container.style.width = this.options.width + 'px';
+ this._container.style.height = this.options.height + 'px';
+ L.DomEvent.disableClickPropagation(this._container);
+ L.DomEvent.on(this._container, 'mousewheel', L.DomEvent.stopPropagation);
+
+
+ this._miniMap = new L.Map(this._container,
+ {
+ attributionControl: false,
+ zoomControl: false,
+ zoomAnimation: this.options.zoomAnimation,
+ autoToggleDisplay: this.options.autoToggleDisplay,
+ touchZoom: !this.options.zoomLevelFixed,
+ scrollWheelZoom: !this.options.zoomLevelFixed,
+ doubleClickZoom: !this.options.zoomLevelFixed,
+ boxZoom: !this.options.zoomLevelFixed,
+ crs: map.options.crs
+ });
+
+ this._miniMap.addLayer(this._layer);
+
+ //These bools are used to prevent infinite loops of the two maps notifying each other that they've moved.
+ this._mainMapMoving = false;
+ this._miniMapMoving = false;
+
+ //Keep a record of this to prevent auto toggling when the user explicitly doesn't want it.
+ this._userToggledDisplay = false;
+ this._minimized = false;
+
+ if (this.options.toggleDisplay) {
+ this._addToggleButton();
+ }
+
+ this._miniMap.whenReady(L.Util.bind(function() {
+ this._aimingRect = L.rectangle(this._mainMap.getBounds(), this.options.aimingRectOptions).addTo(this._miniMap);
+ this._shadowRect = L.rectangle(this._mainMap.getBounds(), this.options.shadowRectOptions).addTo(this._miniMap);
+ this._mainMap.on('moveend', this._onMainMapMoved, this);
+ this._mainMap.on('move', this._onMainMapMoving, this);
+ this._miniMap.on('movestart', this._onMiniMapMoveStarted, this);
+ this._miniMap.on('move', this._onMiniMapMoving, this);
+ this._miniMap.on('moveend', this._onMiniMapMoved, this);
+ }, this));
+
+ return this._container;
+ },
+
+ addTo: function(map) {
+ L.Control.prototype.addTo.call(this, map);
+ this._miniMap.setView(this._mainMap.getCenter(), this._decideZoom(true));
+ this._setDisplay(this._decideMinimized());
+ return this;
+ },
+
+ onRemove: function(map) {
+ this._mainMap.off('moveend', this._onMainMapMoved, this);
+ this._mainMap.off('move', this._onMainMapMoving, this);
+ this._miniMap.off('moveend', this._onMiniMapMoved, this);
+
+ this._miniMap.removeLayer(this._layer);
+ },
+
+ _addToggleButton: function() {
+ this._toggleDisplayButton = this.options.toggleDisplay ? this._createButton(
+ '', this.hideText, 'leaflet-control-minimap-toggle-display', this._container, this._toggleDisplayButtonClicked, this) : undefined;
+ },
+
+ _createButton: function(html, title, className, container, fn, context) {
+ var link = L.DomUtil.create('a', className, container);
+ link.innerHTML = html;
+ link.href = '#';
+ link.title = title;
+
+ var stop = L.DomEvent.stopPropagation;
+
+ L.DomEvent
+ .on(link, 'click', stop)
+ .on(link, 'mousedown', stop)
+ .on(link, 'dblclick', stop)
+ .on(link, 'click', L.DomEvent.preventDefault)
+ .on(link, 'click', fn, context);
+
+ return link;
+ },
+
+ _toggleDisplayButtonClicked: function() {
+ this._userToggledDisplay = true;
+ if (!this._minimized) {
+ this._minimize();
+ this._toggleDisplayButton.title = this.showText;
+ }
+ else {
+ this._restore();
+ this._toggleDisplayButton.title = this.hideText;
+ }
+ },
+
+ _setDisplay: function(minimize) {
+ if (minimize != this._minimized) {
+ if (!this._minimized) {
+ this._minimize();
+ }
+ else {
+ this._restore();
+ }
+ }
+ },
+
+ _minimize: function() {
+ // hide the minimap
+ if (this.options.toggleDisplay) {
+ this._container.style.width = '19px';
+ this._container.style.height = '19px';
+ this._toggleDisplayButton.className += ' minimized';
+ }
+ else {
+ this._container.style.display = 'none';
+ }
+ this._minimized = true;
+ },
+
+ _restore: function() {
+ if (this.options.toggleDisplay) {
+ this._container.style.width = this.options.width + 'px';
+ this._container.style.height = this.options.height + 'px';
+ this._toggleDisplayButton.className = this._toggleDisplayButton.className
+ .replace(/(?:^|\s)minimized(?!\S)/g, '');
+ }
+ else {
+ this._container.style.display = 'block';
+ }
+ this._minimized = false;
+ },
+
+ _onMainMapMoved: function(e) {
+ if (!this._miniMapMoving) {
+ this._mainMapMoving = true;
+ this._miniMap.setView(this._mainMap.getCenter(), this._decideZoom(true));
+ this._setDisplay(this._decideMinimized());
+ } else {
+ this._miniMapMoving = false;
+ }
+ this._aimingRect.setBounds(this._mainMap.getBounds());
+ },
+
+ _onMainMapMoving: function(e) {
+ this._aimingRect.setBounds(this._mainMap.getBounds());
+ },
+
+ _onMiniMapMoveStarted: function(e) {
+ var lastAimingRect = this._aimingRect.getBounds();
+ var sw = this._miniMap.latLngToContainerPoint(lastAimingRect.getSouthWest());
+ var ne = this._miniMap.latLngToContainerPoint(lastAimingRect.getNorthEast());
+ this._lastAimingRectPosition = { sw: sw, ne: ne };
+ },
+
+ _onMiniMapMoving: function(e) {
+ if (!this._mainMapMoving && this._lastAimingRectPosition) {
+ this._shadowRect.setBounds(new L.LatLngBounds(this._miniMap.containerPointToLatLng(this._lastAimingRectPosition.sw), this._miniMap.containerPointToLatLng(this._lastAimingRectPosition.ne)));
+ this._shadowRect.setStyle({ opacity: 1, fillOpacity: 0.3 });
+ }
+ },
+
+ _onMiniMapMoved: function(e) {
+ if (!this._mainMapMoving) {
+ this._miniMapMoving = true;
+ this._mainMap.setView(this._miniMap.getCenter(), this._decideZoom(false));
+ this._shadowRect.setStyle({ opacity: 0, fillOpacity: 0 });
+ } else {
+ this._mainMapMoving = false;
+ }
+ },
+
+ _decideZoom: function(fromMaintoMini) {
+ if (!this.options.zoomLevelFixed) {
+ if (fromMaintoMini)
+ return this._mainMap.getZoom() + this.options.zoomLevelOffset;
+ else {
+ var currentDiff = this._miniMap.getZoom() - this._mainMap.getZoom();
+ var proposedZoom = this._miniMap.getZoom() - this.options.zoomLevelOffset;
+ var toRet;
+
+ if (currentDiff > this.options.zoomLevelOffset && this._mainMap.getZoom() < this._miniMap.getMinZoom() - this.options.zoomLevelOffset) {
+ //This means the miniMap is zoomed out to the minimum zoom level and can't zoom any more.
+ if (this._miniMap.getZoom() > this._lastMiniMapZoom) {
+ //This means the user is trying to zoom in by using the minimap, zoom the main map.
+ toRet = this._mainMap.getZoom() + 1;
+ //Also we cheat and zoom the minimap out again to keep it visually consistent.
+ this._miniMap.setZoom(this._miniMap.getZoom() - 1);
+ } else {
+ //Either the user is trying to zoom out past the mini map's min zoom or has just panned using it, we can't tell the difference.
+ //Therefore, we ignore it!
+ toRet = this._mainMap.getZoom();
+ }
+ } else {
+ //This is what happens in the majority of cases, and always if you configure the min levels + offset in a sane fashion.
+ toRet = proposedZoom;
+ }
+ this._lastMiniMapZoom = this._miniMap.getZoom();
+ return toRet;
+ }
+ } else {
+ if (fromMaintoMini)
+ return this.options.zoomLevelFixed;
+ else
+ return this._mainMap.getZoom();
+ }
+ },
+
+ _decideMinimized: function() {
+ if (this._userToggledDisplay) {
+ return this._minimized;
+ }
+
+ if (this.options.autoToggleDisplay) {
+ if (this._mainMap.getBounds().contains(this._miniMap.getBounds())) {
+ return true;
+ }
+ return false;
+ }
+
+ return this._minimized;
+ }
+});
+
+L.Map.mergeOptions({
+ miniMapControl: false
+});
+
+L.Map.addInitHook(function() {
+ if (this.options.miniMapControl) {
+ this.miniMapControl = (new L.Control.MiniMap()).addTo(this);
+ }
+});
+
+L.control.minimap = function(options) {
+ return new L.Control.MiniMap(options);
+};
diff --git a/plugins/leaflet/scripts/Leaflet-MiniMap/src/images/toggle.png b/plugins/leaflet/scripts/Leaflet-MiniMap/src/images/toggle.png
new file mode 100755
index 0000000..205e38b
--- /dev/null
+++ b/plugins/leaflet/scripts/Leaflet-MiniMap/src/images/toggle.png
Binary files differ
diff --git a/plugins/leaflet/scripts/leaflet-providers/.DS_Store b/plugins/leaflet/scripts/leaflet-providers/.DS_Store
new file mode 100755
index 0000000..5008ddf
--- /dev/null
+++ b/plugins/leaflet/scripts/leaflet-providers/.DS_Store
Binary files differ
diff --git a/plugins/leaflet/scripts/leaflet-providers/README.md b/plugins/leaflet/scripts/leaflet-providers/README.md
new file mode 100755
index 0000000..d648aad
--- /dev/null
+++ b/plugins/leaflet/scripts/leaflet-providers/README.md
@@ -0,0 +1,75 @@
+Leaflet-providers
+=================
+An extension to [Leaflet](http://leafletjs.com/) that contains configurations for various free tile providers.
+
+# Usage
+Leaflet-providers [providers](#providers) are refered to with a `provider[.<variant>]`-string. Let's say you want to add the nice [Watercolor](http://maps.stamen.com/#watercolor/) style from Stamen to your map, you pass `Stamen.Watercolor` to the `L.tileLayer.provider`-constructor, which will return a [L.TileLayer](http://leafletjs.com/reference.html#tilelayer) instance for Stamens Watercolor tile layer.
+
+```Javascript
+// add Stamen Watercolor to map.
+L.tileLayer.provider('Stamen.Watercolor').addTo(map);
+```
+
+# Providers
+
+Leaflet-providers provides tile layers from different providers, including *OpenStreetMap*, *MapQuestOpen*, *Stamen*, *Esri* and *OpenWeatherMap*. The full listing of free to use layers can be [previewed](http://leaflet-extras.github.io/leaflet-providers/preview/index.html). The page will show you the name to use with `leaflet-providers.js` and the code to use it without dependencies.
+
+## Providers requiring registration
+
+In addition to the providers you are free to use, we support some layers which require registration.
+
+### Nokia.
+
+In order to use Nokia basemaps, you must [register](https://developer.here.com/web/guest/myapps). With your `devID` and `appID` specified in the options, the available layers are:
+
+* Nokia.normalDay
+* Nokia.normalGreyDay
+* Nokia.satelliteNoLabelsDay
+* Nokia.satelliteYesLabelsDay
+* Nokia.terrainDay
+
+For example:
+```Javascript
+L.tileLayer.provider('Nokia.terrainDay', {
+ devID: 'insert ID here',
+ appId: 'insert ID here'
+}).addTo(map);
+```
+
+### Mapbox
+
+In order to use Mapbox maps, you must [register](https://tiles.mapbox.com/signup). If your user name is `YourName` and your map is called `MyMap` you can add it with
+```JavaScript
+L.tileLayer.provider('MapBox.YourName.MyMap');
+```
+
+### Esri/ArcGIS
+
+In order to use ArcGIS maps, you must [register](https://developers.arcgis.com/en/sign-up/) and abide by the [terms of service](https://developers.arcgis.com/en/terms/). Available layers are...
+
+* Esri.WorldStreetMap
+* Esri.DeLorme
+* Esri.WorldTopoMap
+* Esri.WorldImagery
+* Esri.WorldTerrain
+* Esri.WorldShadedRelief
+* Esri.WorldPhysical
+* Esri.OceanBasemap
+* Esri.NatGeoWorldMap
+* Esri.WorldGrayCanvas
+
+# Goodies
+
+An other little goodie this library provides is a prefilled layer control, so you can just provide an array of strings:
+
+```JavaScript
+var baseLayers = ['Stamen.Watercolor', 'OpenStreetMap.Mapnik'],
+ overlays = ['OpenWeatherMap.Clouds'];
+
+var layerControl = L.control.layers.provided(baseLayers, overlays).addTo(map);
+
+// you can still add your own afterwards with
+layerControl.addBaseLayer(layer, name);
+```
+
+This work was inspired from <https://gist.github.com/1804938>, and originally created by [Stefan Seelmann](https://github.com/seelmann).
diff --git a/plugins/leaflet/scripts/leaflet-providers/index.html b/plugins/leaflet/scripts/leaflet-providers/index.html
new file mode 100755
index 0000000..9acaf84
--- /dev/null
+++ b/plugins/leaflet/scripts/leaflet-providers/index.html
@@ -0,0 +1,166 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+ <title>Leaflet Provider Demo</title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <!-- Leaflet style. REQUIRED! -->
+ <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7/leaflet.css" />
+ <style>
+ html {
+ height: 100%
+ }
+
+ body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ }
+
+ .map {
+ height: 100%
+ }
+ </style>
+ <!--Fork Me on Github ribbon, we're using the awsome version from simonwhitaker available at https://github.com/simonwhitaker/github-fork-ribbon-css -->
+ <link rel="stylesheet" href="css/gh-fork-ribbon.css" />
+ <!--[if IE]>
+ <link rel="stylesheet" href="css/gh-fork-ribbon.ie.css" />
+ <![endif]-->
+</head>
+
+<body>
+ <div class="github-fork-ribbon-wrapper left">
+ <div class="github-fork-ribbon">
+ <a href="https://github.com/leaflet-extras/leaflet-providers">Fork me on GitHub</a>
+ </div>
+ </div>
+ <div id="map" class="map"></div>
+
+ <script src="http://cdn.leafletjs.com/leaflet-0.7/leaflet-src.js"></script>
+ <script src="leaflet-providers.js"></script>
+ <script>
+ var map = L.map('map', {
+ center: [48, -3],
+ zoom: 5,
+ zoomControl: false
+ });
+
+ var defaultLayer = L.tileLayer.provider('OpenStreetMap.Mapnik').addTo(map);
+
+ var baseLayers = {
+ 'OpenStreetMap Default': defaultLayer,
+ 'OpenStreetMap German Style': L.tileLayer.provider('OpenStreetMap.DE'),
+ 'OpenStreetMap Black and White': L.tileLayer.provider('OpenStreetMap.BlackAndWhite'),
+ 'OpenStreetMap H.O.T.': L.tileLayer.provider('OpenStreetMap.HOT'),
+ 'Thunderforest OpenCycleMap': L.tileLayer.provider('Thunderforest.OpenCycleMap'),
+ 'Thunderforest Transport': L.tileLayer.provider('Thunderforest.Transport'),
+ 'Thunderforest Landscape': L.tileLayer.provider('Thunderforest.Landscape'),
+ 'MapQuest OSM': L.tileLayer.provider('MapQuestOpen.OSM'),
+ 'MapQuest Aerial': L.tileLayer.provider('MapQuestOpen.Aerial'),
+ 'MapBox Example': L.tileLayer.provider('MapBox.examples.map-zr0njcqy'),
+ 'Stamen Toner': L.tileLayer.provider('Stamen.Toner'),
+ 'Stamen Terrain': L.tileLayer.provider('Stamen.Terrain'),
+ 'Stamen Watercolor': L.tileLayer.provider('Stamen.Watercolor'),
+ 'Esri WorldStreetMap': L.tileLayer.provider('Esri.WorldStreetMap'),
+ 'Esri DeLorme': L.tileLayer.provider('Esri.DeLorme'),
+ 'Esri WorldTopoMap': L.tileLayer.provider('Esri.WorldTopoMap'),
+ 'Esri WorldImagery': L.tileLayer.provider('Esri.WorldImagery'),
+ 'Esri WorldTerrain': L.tileLayer.provider('Esri.WorldTerrain'),
+ 'Esri WorldShadedRelief': L.tileLayer.provider('Esri.WorldShadedRelief'),
+ 'Esri WorldPhysical': L.tileLayer.provider('Esri.WorldPhysical'),
+ 'Esri OceanBasemap': L.tileLayer.provider('Esri.OceanBasemap'),
+ 'Esri NatGeoWorldMap': L.tileLayer.provider('Esri.NatGeoWorldMap'),
+ 'Esri WorldGrayCanvas': L.tileLayer.provider('Esri.WorldGrayCanvas'),
+ 'Nokia Normal Day': L.tileLayer.provider('Nokia.normalDay'),
+ 'Nokia Normal Day Grey': L.tileLayer.provider('Nokia.normalGreyDay'),
+ 'Nokia Satellite': L.tileLayer.provider('Nokia.satelliteNoLabelsDay'),
+ 'Nokia Satellite (Labeled)': L.tileLayer.provider('Nokia.satelliteYesLabelsDay'),
+ 'Nokia Terrain': L.tileLayer.provider('Nokia.terrainDay'),
+ 'Acetate': L.tileLayer.provider('Acetate')
+ };
+
+ var overlayLayers = {
+ 'OpenSeaMap': L.tileLayer.provider('OpenSeaMap'),
+ 'OpenWeatherMap Clouds': L.tileLayer.provider('OpenWeatherMap.Clouds'),
+ 'OpenWeatherMap CloudsClassic': L.tileLayer.provider('OpenWeatherMap.CloudsClassic'),
+ 'OpenWeatherMap Precipitation': L.tileLayer.provider('OpenWeatherMap.Precipitation'),
+ 'OpenWeatherMap PrecipitationClassic': L.tileLayer.provider('OpenWeatherMap.PrecipitationClassic'),
+ 'OpenWeatherMap Rain': L.tileLayer.provider('OpenWeatherMap.Rain'),
+ 'OpenWeatherMap RainClassic': L.tileLayer.provider('OpenWeatherMap.RainClassic'),
+ 'OpenWeatherMap Pressure': L.tileLayer.provider('OpenWeatherMap.Pressure'),
+ 'OpenWeatherMap PressureContour': L.tileLayer.provider('OpenWeatherMap.PressureContour'),
+ 'OpenWeatherMap Wind': L.tileLayer.provider('OpenWeatherMap.Wind'),
+ 'OpenWeatherMap Temperature': L.tileLayer.provider('OpenWeatherMap.Temperature'),
+ 'OpenWeatherMap Snow': L.tileLayer.provider('OpenWeatherMap.Snow')
+ };
+
+ var layerControl = L.control.layers(baseLayers, overlayLayers, {collapsed: false}).addTo(map);
+
+ /* you could also use the following code instead
+ var map = new L.Map('map').setView([48, -3],5);
+
+ var defaultLayer = L.tileLayer.provider('OpenStreetMap.Mapnik').addTo(map);
+
+ var baseLayers = [
+ 'OpenStreetMap.Mapnik',
+ 'OpenStreetMap.DE',
+ 'OpenStreetMap.BlackAndWhite',
+ 'Thunderforest.OpenCycleMap',
+ 'Thunderforest.Transport',
+ 'Thunderforest.Landscape',
+ 'MapQuestOpen.OSM',
+ 'MapQuestOpen.Aerial',
+ 'MapBox.examples.map-zr0njcqy',
+ 'Stamen.Toner',
+ 'Stamen.Terrain',
+ 'Stamen.Watercolor',
+ 'Esri.WorldStreetMap',
+ 'Esri.DeLorme',
+ 'Esri.WorldTopoMap',
+ 'Esri.WorldImagery',
+ 'Esri.WorldTerrain',
+ 'Esri.WorldShadedRelief',
+ 'Esri.WorldPhysical',
+ 'Esri.OceanBasemap',
+ 'Esri.NatGeoWorldMap',
+ 'Esri.WorldGrayCanvas',
+ 'Nokia.normalDay',
+ 'Nokia.normalGreyDay',
+ 'Nokia.satelliteNoLabelsDay',
+ 'Nokia.satelliteYesLabelsDay,
+ 'Nokia.terrainDay'
+ ];
+
+ var overlayLayers = [
+ 'OpenWeatherMap.Clouds',
+ 'OpenWeatherMap.CloudsClassic',
+ 'OpenWeatherMap.Precipitation',
+ 'OpenWeatherMap.PrecipitationClassic',
+ 'OpenWeatherMap.Rain',
+ 'OpenWeatherMap.RainClassic',
+ 'OpenWeatherMap.Pressure',
+ 'OpenWeatherMap.PressureContour',
+ 'OpenWeatherMap.Wind',
+ 'OpenWeatherMap.Temperature',
+ 'OpenWeatherMap.Snow'
+ ];
+
+ L.control.layers.provided(baseLayers, overlayLayers, {collapsed: false}).addTo(map);
+ */
+
+ // resize layers control to fit into view.
+ function resizeLayerControl() {
+ var layerControlHeight = document.body.clientHeight - (10 + 50);
+ var layerControl = document.getElementsByClassName('leaflet-control-layers-expanded')[0];
+
+ layerControl.style.overflowY = 'auto';
+ layerControl.style.maxHeight = layerControlHeight + 'px';
+ }
+ map.on('resize', resizeLayerControl);
+ resizeLayerControl();
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/plugins/leaflet/scripts/leaflet-providers/leaflet-providers.js b/plugins/leaflet/scripts/leaflet-providers/leaflet-providers.js
new file mode 100755
index 0000000..506edd7
--- /dev/null
+++ b/plugins/leaflet/scripts/leaflet-providers/leaflet-providers.js
@@ -0,0 +1,458 @@
+(function() {
+ 'use strict';
+
+ L.TileLayer.Provider = L.TileLayer.extend({
+ initialize: function(arg, options) {
+ var providers = L.TileLayer.Provider.providers;
+
+ var parts = arg.split('.');
+
+ var providerName = parts[0];
+ var variantName = parts[1];
+
+ if (!providers[providerName]) {
+ throw 'No such provider (' + providerName + ')';
+ }
+
+ var provider = {
+ url: providers[providerName].url,
+ options: providers[providerName].options
+ };
+
+ // overwrite values in provider from variant.
+ if (variantName && 'variants' in providers[providerName]) {
+ if (!(variantName in providers[providerName].variants)) {
+ throw 'No such name in provider (' + variantName + ')';
+ }
+ var variant = providers[providerName].variants[variantName];
+ provider = {
+ url: variant.url || provider.url,
+ options: L.Util.extend({}, provider.options, variant.options)
+ };
+ } else if (typeof provider.url === 'function') {
+ provider.url = provider.url(parts.splice(1, parts.length - 1).join('.'));
+ }
+
+ // replace attribution placeholders with their values from toplevel provider attribution,
+ // recursively
+ var attributionReplacer = function(attr) {
+ if (attr.indexOf('{attribution.') === -1) {
+ return attr;
+ }
+ return attr.replace(/\{attribution.(\w*)\}/,
+ function(match, attributionName) {
+ return attributionReplacer(providers[attributionName].options.attribution);
+ }
+ );
+ };
+ provider.options.attribution = attributionReplacer(provider.options.attribution);
+
+ // Compute final options combining provider options with any user overrides
+ var layerOpts = L.Util.extend({}, provider.options, options);
+ L.TileLayer.prototype.initialize.call(this, provider.url, layerOpts);
+ }
+ });
+
+ /**
+ * Definition of providers.
+ * see http://leafletjs.com/reference.html#tilelayer for options in the options map.
+ */
+
+ //jshint maxlen:220
+ L.TileLayer.Provider.providers = {
+ OpenStreetMap: {
+ url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
+ options: {
+ attribution:
+ '&copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
+ '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'
+ },
+ variants: {
+ Mapnik: {},
+ BlackAndWhite: {
+ url: 'http://{s}.www.toolserver.org/tiles/bw-mapnik/{z}/{x}/{y}.png'
+ },
+ DE: {
+ url: 'http://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png'
+ },
+ HOT: {
+ url: 'http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',
+ options: {
+ attribution: '{attribution.OpenStreetMap}, Tiles courtesy of <a href="http://hot.openstreetmap.org/" target="_blank">Humanitarian OpenStreetMap Team</a>'
+ }
+ }
+ }
+ },
+ OpenCycleMap: {
+ url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png',
+ options: {
+ attribution:
+ '&copy; <a href="http://www.opencyclemap.org">OpenCycleMap</a>, {attribution.OpenStreetMap}'
+ }
+ },
+ OpenSeaMap: {
+ url: 'http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png',
+ options: {
+ attribution: 'Map data: &copy; <a href="http://www.openseamap.org">OpenSeaMap</a> contributors'
+ }
+ },
+ Thunderforest: {
+ url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png',
+ options: {
+ attribution: '{attribution.OpenCycleMap}'
+ },
+ variants: {
+ OpenCycleMap: {},
+ Transport: {
+ url: 'http://{s}.tile2.opencyclemap.org/transport/{z}/{x}/{y}.png'
+ },
+ Landscape: {
+ url: 'http://{s}.tile3.opencyclemap.org/landscape/{z}/{x}/{y}.png'
+ },
+ Outdoors: {
+ url: 'http://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png'
+ }
+ }
+ },
+ OpenMapSurfer: {
+ url: 'http://openmapsurfer.uni-hd.de/tiles/roads/x={x}&y={y}&z={z}',
+ options: {
+ attribution: 'Imagery from <a href="http://giscience.uni-hd.de/">GIScience Research Group @ University of Heidelberg</a> &mdash; Map data {attribution.OpenStreetMap}'
+ },
+ variants: {
+ Roads: {},
+ AdminBounds: {
+ url: 'http://openmapsurfer.uni-hd.de/tiles/adminb/x={x}&y={y}&z={z}'
+ },
+ Grayscale: {
+ url: 'http://openmapsurfer.uni-hd.de/tiles/roadsg/x={x}&y={y}&z={z}'
+ }
+ }
+ },
+ MapQuestOpen: {
+ url: 'http://otile{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpeg',
+ options: {
+ attribution:
+ 'Tiles Courtesy of <a href="http://www.mapquest.com/">MapQuest</a> &mdash; ' +
+ 'Map data {attribution.OpenStreetMap}',
+ subdomains: '1234'
+ },
+ variants: {
+ OSM: {},
+ Aerial: {
+ url: 'http://oatile{s}.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.jpg',
+ options: {
+ attribution:
+ 'Tiles Courtesy of <a href="http://www.mapquest.com/">MapQuest</a> &mdash; ' +
+ 'Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency'
+ }
+ }
+ }
+ },
+ MapBox: {
+ url: function(id) {
+ return 'http://{s}.tiles.mapbox.com/v3/' + id + '/{z}/{x}/{y}.png';
+ },
+ options: {
+ attribution:
+ 'Imagery from <a href="http://mapbox.com/about/maps/">MapBox</a> &mdash; ' +
+ 'Map data {attribution.OpenStreetMap}',
+ subdomains: 'abcd'
+ }
+ },
+ Stamen: {
+ url: 'http://{s}.tile.stamen.com/toner/{z}/{x}/{y}.png',
+ options: {
+ attribution:
+ 'Map tiles by <a href="http://stamen.com">Stamen Design</a>, ' +
+ '<a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; ' +
+ 'Map data {attribution.OpenStreetMap}',
+ subdomains: 'abcd',
+ minZoom: 0,
+ maxZoom: 20
+ },
+ variants: {
+ Toner: {},
+ TonerBackground: {
+ url: 'http://{s}.tile.stamen.com/toner-background/{z}/{x}/{y}.png'
+ },
+ TonerHybrid: {
+ url: 'http://{s}.tile.stamen.com/toner-hybrid/{z}/{x}/{y}.png'
+ },
+ TonerLines: {
+ url: 'http://{s}.tile.stamen.com/toner-lines/{z}/{x}/{y}.png'
+ },
+ TonerLabels: {
+ url: 'http://{s}.tile.stamen.com/toner-labels/{z}/{x}/{y}.png'
+ },
+ TonerLite: {
+ url: 'http://{s}.tile.stamen.com/toner-lite/{z}/{x}/{y}.png'
+ },
+ Terrain: {
+ url: 'http://{s}.tile.stamen.com/terrain/{z}/{x}/{y}.jpg',
+ options: {
+ minZoom: 4,
+ maxZoom: 18
+ }
+ },
+ TerrainBackground: {
+ url: 'http://{s}.tile.stamen.com/terrain-background/{z}/{x}/{y}.jpg',
+ options: {
+ minZoom: 4,
+ maxZoom: 18
+ }
+ },
+ Watercolor: {
+ url: 'http://{s}.tile.stamen.com/watercolor/{z}/{x}/{y}.jpg',
+ options: {
+ minZoom: 3,
+ maxZoom: 16
+ }
+ }
+ }
+ },
+ Esri: {
+ url: 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ attribution: 'Tiles &copy; Esri'
+ },
+ variants: {
+ WorldStreetMap: {
+ options: {
+ attribution:
+ '{attribution.Esri} &mdash; ' +
+ 'Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012'
+ }
+ },
+ DeLorme: {
+ url: 'http://server.arcgisonline.com/ArcGIS/rest/services/Specialty/DeLorme_World_Base_Map/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ minZoom: 1,
+ maxZoom: 11,
+ attribution: '{attribution.Esri} &mdash; Copyright: &copy;2012 DeLorme'
+ }
+ },
+ WorldTopoMap: {
+ url: 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ attribution:
+ '{attribution.Esri} &mdash; ' +
+ 'Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community'
+ }
+ },
+ WorldImagery: {
+ url: 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ attribution:
+ '{attribution.Esri} &mdash; ' +
+ 'Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
+ }
+ },
+ WorldTerrain: {
+ url: 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ maxZoom: 13,
+ attribution:
+ '{attribution.Esri} &mdash; ' +
+ 'Source: USGS, Esri, TANA, DeLorme, and NPS'
+ }
+ },
+ WorldShadedRelief: {
+ url: 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ maxZoom: 13,
+ attribution: '{attribution.Esri} &mdash; Source: Esri'
+ }
+ },
+ WorldPhysical: {
+ url: 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ maxZoom: 8,
+ attribution: '{attribution.Esri} &mdash; Source: US National Park Service'
+ }
+ },
+ OceanBasemap: {
+ url: 'http://services.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ maxZoom: 13,
+ attribution: '{attribution.Esri} &mdash; Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri'
+ }
+ },
+ NatGeoWorldMap: {
+ url: 'http://services.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ maxZoom: 16,
+ attribution: '{attribution.Esri} &mdash; National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC'
+ }
+ },
+ WorldGrayCanvas: {
+ url: 'http://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',
+ options: {
+ maxZoom: 16,
+ attribution: '{attribution.Esri} &mdash; Esri, DeLorme, NAVTEQ'
+ }
+ }
+ }
+ },
+ OpenWeatherMap: {
+ options: {
+ attribution: 'Map data &copy; <a href="http://openweathermap.org">OpenWeatherMap</a>',
+ opacity: 0.5
+ },
+ variants: {
+ Clouds: {
+ url: 'http://{s}.tile.openweathermap.org/map/clouds/{z}/{x}/{y}.png'
+ },
+ CloudsClassic: {
+ url: 'http://{s}.tile.openweathermap.org/map/clouds_cls/{z}/{x}/{y}.png'
+ },
+ Precipitation: {
+ url: 'http://{s}.tile.openweathermap.org/map/precipitation/{z}/{x}/{y}.png'
+ },
+ PrecipitationClassic: {
+ url: 'http://{s}.tile.openweathermap.org/map/precipitation_cls/{z}/{x}/{y}.png'
+ },
+ Rain: {
+ url: 'http://{s}.tile.openweathermap.org/map/rain/{z}/{x}/{y}.png'
+ },
+ RainClassic: {
+ url: 'http://{s}.tile.openweathermap.org/map/rain_cls/{z}/{x}/{y}.png'
+ },
+ Pressure: {
+ url: 'http://{s}.tile.openweathermap.org/map/pressure/{z}/{x}/{y}.png'
+ },
+ PressureContour: {
+ url: 'http://{s}.tile.openweathermap.org/map/pressure_cntr/{z}/{x}/{y}.png'
+ },
+ Wind: {
+ url: 'http://{s}.tile.openweathermap.org/map/wind/{z}/{x}/{y}.png'
+ },
+ Temperature: {
+ url: 'http://{s}.tile.openweathermap.org/map/temp/{z}/{x}/{y}.png'
+ },
+ Snow: {
+ url: 'http://{s}.tile.openweathermap.org/map/snow/{z}/{x}/{y}.png'
+ }
+ }
+ },
+ Nokia: {
+ options: {
+ attribution:
+ 'Map &copy; <a href="http://developer.here.com">Nokia</a>, Data &copy; NAVTEQ 2012',
+ subdomains: '1234',
+ devID: 'xyz', //These basemaps are free and you can sign up here: http://developer.here.com/plans
+ appID: 'abc'
+ },
+ variants: {
+ normalDay: {
+ url: 'http://{s}.maptile.lbs.ovi.com/maptiler/v2/maptile/newest/normal.day/{z}/{x}/{y}/256/png8?token={devID}&app_id={appID}'
+ },
+ normalGreyDay: {
+ url: 'http://{s}.maptile.lbs.ovi.com/maptiler/v2/maptile/newest/normal.day.grey/{z}/{x}/{y}/256/png8?token={devID}&app_id={appID}'
+ },
+ satelliteNoLabelsDay: {
+ url: 'http://{s}.maptile.lbs.ovi.com/maptiler/v2/maptile/newest/satellite.day/{z}/{x}/{y}/256/png8?token={devID}&app_id={appID}'
+ },
+ satelliteYesLabelsDay: {
+ url: 'http://{s}.maptile.lbs.ovi.com/maptiler/v2/maptile/newest/hybrid.day/{z}/{x}/{y}/256/png8?token={devID}&app_id={appID}'
+ },
+ terrainDay: {
+ url: 'http://{s}.maptile.lbs.ovi.com/maptiler/v2/maptile/newest/terrain.day/{z}/{x}/{y}/256/png8?token={devID}&app_id={appID}'
+ }
+ }
+ },
+ Acetate: {
+ url: 'http://a{s}.acetate.geoiq.com/tiles/acetate-hillshading/{z}/{x}/{y}.png',
+ options: {
+ attribution:
+ '&copy;2012 Esri & Stamen, Data from OSM and Natural Earth',
+ subdomains: '0123',
+ minZoom: 2,
+ maxZoom: 18
+ },
+ variants: {
+ all: {},
+ basemap: {
+ url: 'http://a{s}.acetate.geoiq.com/tiles/acetate-base/{z}/{x}/{y}.png'
+ },
+ terrain: {
+ url: 'http://a{s}.acetate.geoiq.com/tiles/terrain/{z}/{x}/{y}.png'
+ },
+ foreground: {
+ url: 'http://a{s}.acetate.geoiq.com/tiles/acetate-fg/{z}/{x}/{y}.png'
+ },
+ roads: {
+ url: 'http://a{s}.acetate.geoiq.com/tiles/acetate-roads/{z}/{x}/{y}.png'
+ },
+ labels: {
+ url: 'http://a{s}.acetate.geoiq.com/tiles/acetate-labels/{z}/{x}/{y}.png'
+ },
+ hillshading: {
+ url: 'http://a{s}.acetate.geoiq.com/tiles/hillshading/{z}/{x}/{y}.png'
+ }
+ }
+ }
+ };
+
+ L.tileLayer.provider = function(provider, options) {
+ return new L.TileLayer.Provider(provider, options);
+ };
+
+ L.Control.Layers.Provided = L.Control.Layers.extend({
+ initialize: function(base, overlay, options) {
+ var first;
+
+ var labelFormatter = function(label) {
+ return label.replace(/\./g, ': ').replace(/([a-z])([A-Z])/g, '$1 $2');
+ };
+
+ if (base.length) {
+ (function() {
+ var out = {},
+ len = base.length,
+ i = 0;
+
+ while (i < len) {
+ if (typeof base[i] === 'string') {
+ if (i === 0) {
+ first = L.tileLayer.provider(base[0]);
+ out[labelFormatter(base[i])] = first;
+ } else {
+ out[labelFormatter(base[i])] = L.tileLayer.provider(base[i]);
+ }
+ }
+ i++;
+ }
+ base = out;
+ }());
+ this._first = first;
+ }
+
+ if (overlay && overlay.length) {
+ (function() {
+ var out = {},
+ len = overlay.length,
+ i = 0;
+
+ while (i < len) {
+ if (typeof overlay[i] === 'string') {
+ out[labelFormatter(overlay[i])] = L.tileLayer.provider(overlay[i]);
+ }
+ i++;
+ }
+ overlay = out;
+ }());
+ }
+ L.Control.Layers.prototype.initialize.call(this, base, overlay, options);
+ },
+ onAdd: function(map) {
+ this._first.addTo(map);
+ return L.Control.Layers.prototype.onAdd.call(this, map);
+ }
+ });
+
+ L.control.layers.provided = function(baseLayers, overlays, options) {
+ return new L.Control.Layers.Provided(baseLayers, overlays, options);
+ };
+}());
+
diff --git a/plugins/leaflet/scripts/leaflet-providers/license.md b/plugins/leaflet/scripts/leaflet-providers/license.md
new file mode 100755
index 0000000..4c48832
--- /dev/null
+++ b/plugins/leaflet/scripts/leaflet-providers/license.md
@@ -0,0 +1,9 @@
+Copyright (c) 2013 Leaflet Providers contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+* 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.
+
+_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._ \ No newline at end of file
diff --git a/plugins/leaflet/scripts/leaflet-providers/package.json b/plugins/leaflet/scripts/leaflet-providers/package.json
new file mode 100755
index 0000000..1149609
--- /dev/null
+++ b/plugins/leaflet/scripts/leaflet-providers/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "leaflet-providers",
+ "version": "1.0.3",
+ "description": "An extension to Leaflet that contains configurations for various free tile providers.",
+ "main": "leaflet-providers.js",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/leaflet-extras/leaflet-providers.git"
+ },
+ "scripts": {
+ "pretest": "jshint leaflet-providers.js"
+ },
+ "license": "BSD-2-Clause",
+ "bugs": {
+ "url": "https://github.com/leaflet-extras/leaflet-providers/issues"
+ },
+ "devDependencies": {
+ "jshint": "~2.1.11"
+ }
+} \ No newline at end of file
diff --git a/plugins/leaflet/scripts/mapParser.html b/plugins/leaflet/scripts/mapParser.html
new file mode 100755
index 0000000..f129503
--- /dev/null
+++ b/plugins/leaflet/scripts/mapParser.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/leaflet.js"></script>
+ <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/leaflet.css" />
+
+ <script src="leaflet-providers/leaflet-providers.js"></script>
+
+ <script src="Leaflet-MiniMap/src/Control.MiniMap.js"></script>
+ <link rel="stylesheet" href="Leaflet-MiniMap/src/Control.MiniMap.css" />
+
+ <script charset="utf-8">
+ // Function to parse the URL search query parameters.
+ // It will give A, B, C given http://www.somelink.com?lat=A&lon=B&zoom=C
+ // See "http://javascriptproductivity.blogspot.com/" +
+ // "2013/02/get-url-variables-with-javascript.html".
+ function getParams() {
+ // Make an object variable to hold
+ // the parsed URL parameters' keys and vlaues.
+ var params = {};
+
+ // Remove the '?' character after the base url.
+ // x.substring(i) will return the substring of x starting at index i
+ // up to the end of the string.
+ // Drupal CMS might have a path like this (two '?' characters):
+ // mapParser.html?t=E3OD?lat=14.6760413&lon=121.0437003&...
+ // We need to handle this case also.
+ var lastIndex = window.location.search.lastIndexOf("?")
+
+ // Get the substring not including any '?' character.
+ var query_string = window.location.search.substring(lastIndex + 1);
+
+ // Explode the string using the '&' character.
+ var query_string_parts = query_string.split('&');
+
+ // Traverse the exploded tokens.
+ for (i in query_string_parts) {
+ // Explode the string using '=' to isolate keys and values.
+ key_value = query_string_parts[i].split('=');
+
+ // Insert a new key and set it to the current parsed value.
+ params[key_value[0]] = key_value[1];
+ }
+
+ // Return the parameter object contianing the keys and values.
+ return params;
+ }
+ </script>
+ <style>
+ .leaflet-popup-content {
+ text-align: center;
+ }
+
+ body {
+ padding: 0;
+ margin: 0;
+ }
+
+ html,
+ body,
+ #map_container {
+ height: 100%;
+ width: 100%;
+ }
+ </style>
+</head>
+
+<body>
+ <div id='map_container' data-lat="" data-lon="" data-zoom=""></div>
+ <script>
+ // Get the DOM node to which we will append the map.
+ // In our setup the map container is a DIV element.
+ var mapDiv = document.getElementById("map_container");
+
+ // Parse the query parameters in the URL to obtain the
+ // LAT, LON, and ZOOM values.
+ var queryString = getParams();
+
+ // Fetch the most important attributes.
+ var latitude = queryString["lat"];
+ var longitude = queryString["lon"];
+ var zoom = queryString["zoom"];
+
+ // Initialize the mapDiv data attributes.
+ mapDiv.setAttribute("data-lat", latitude);
+ mapDiv.setAttribute("data-lon", longitude);
+ mapDiv.setAttribute("data-zoom", zoom);
+
+ // Convert the parameters to their numeric equivalent.
+ // Otherwise, initializing the Leaflet map object will not work.
+ latitude = Number(latitude);
+ longitude = Number(longitude);
+ zoom = Number(zoom);
+
+ var responsive = queryString["responsive"];
+
+ // If responsive map option is enabled, set the map height to 100%.
+ if (responsive == "on") {
+ mapDiv.style.height = "100%";
+ }
+
+ else {
+ // Retrieve the map's height.
+ var mapHeight = Number(queryString["height"]);
+ mapDiv.style.height = String(mapHeight) + "px";
+ }
+
+ // Retrive the popup text that will be used by the marker.
+ var popUpText = queryString["text"];
+
+ // Retrieve the Base Map's Tile to be used.
+ var tile = queryString["tile"];
+
+ // Retrieve the information about the inclusion of Overview map.
+ var minimap = queryString["minimap"];
+
+ // Create a map in the the target DOM container.
+ // Set the view to a given place and zoom value.
+ var map = L.map('map_container').setView([latitude, longitude], zoom);
+
+ // Choose the Map Tile provider e.g. "Esri.WorldTopoMap"
+ var mapTileProvider = tile;
+
+ var restrictedTiles = ['MapQuestOpen.Aerial', 'MapQuestOpen.OSM'];
+
+ // Redirect MapQuest tiles to OpenStreetMap tiles.
+ if (restrictedTiles.indexOf(mapTileProvider) != -1) {
+ mapTileProvider = 'OpenStreetMap.Mapnik';
+ }
+
+ // Set the base map.
+ var mapTile = L.tileLayer.provider(mapTileProvider, {attribution: "Map Tile: " + mapTileProvider});
+ mapTile.addTo(map);
+
+ // Add a marker in the given location.
+ // Make it draggble so that user could refine the position visually.
+ var p1 = L.marker([latitude, longitude], {
+ draggable: true,
+ });
+ p1.addTo(map);
+
+ // Add an event listener that will keep track the changes in the
+ // marker location and will update the data attribute accordingly.
+ p1.on('dragend', function (e) {
+ var newLocation = this.getLatLng();
+ var lat = newLocation.lat;
+ var lon = newLocation.lng;
+
+ // Pan the map to its new center which is the last position
+ // of the dragged marker.
+ map.panTo([lat, lon]);
+
+ mapDiv.setAttribute("data-lat", String(lat));
+ mapDiv.setAttribute("data-lon", String(lon));
+ });
+
+ // If the pop-up text is specified.
+ if (popUpText != '') {
+ // Replace the %20 HTML Entity by an empty space.
+ // %20 is the result of texts being piped via URL.
+ popUpText = popUpText.replace(/%20/g, ' ');
+
+ // Bind the text to the current marker.
+ p1.bindPopup(popUpText);
+ }
+
+ // Check if MiniMap needs to be shown also.
+ if (minimap == "on") {
+ // Create a new Tile Layer for the MiniMap.
+ // Per documentation, do not reuse the existing Tile object
+ // to avoid rendering issues.
+ var mapTile2 = L.tileLayer.provider(mapTileProvider);
+ var miniMap = new L.Control.MiniMap(mapTile2).addTo(map);
+ }
+
+ // Add an event listener that will keep track the changes in the
+ // map's zoom levels and it will update the data attribute accordingly.
+ map.on('zoomend', function (e) {
+ mapDiv.setAttribute("data-zoom", map.getZoom());
+ });
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/plugins/link/dialogs/anchor.js b/plugins/link/dialogs/anchor.js
new file mode 100755
index 0000000..8d80730
--- /dev/null
+++ b/plugins/link/dialogs/anchor.js
@@ -0,0 +1,22 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("anchor", function(c) {
+ function e(b, a) { return b.createFakeElement(b.document.createElement("a", { attributes: a }), "cke_anchor", "anchor") } return {
+ title: c.lang.link.anchor.title, minWidth: 300, minHeight: 60, onOk: function() {
+ var b = CKEDITOR.tools.trim(this.getValueOf("info", "txtName")), a = { id: b, name: b, "data-cke-saved-name": b }; this._.selectedElement ? this._.selectedElement.data("cke-realelement") ? (b = e(c, a), b.replace(this._.selectedElement), CKEDITOR.env.ie && c.getSelection().selectElement(b)) : this._.selectedElement.setAttributes(a) :
+ (b = (b = c.getSelection()) && b.getRanges()[0], b.collapsed ? (a = e(c, a), b.insertNode(a)) : (CKEDITOR.env.ie && 9 > CKEDITOR.env.version && (a["class"] = "cke_anchor"), a = new CKEDITOR.style({ element: "a", attributes: a }), a.type = CKEDITOR.STYLE_INLINE, a.applyToRange(b)))
+ }, onHide: function() { delete this._.selectedElement }, onShow: function() {
+ var b = c.getSelection(), a; a = b.getRanges()[0]; var d = b.getSelectedElement(); a.shrink(CKEDITOR.SHRINK_ELEMENT); a = (d = a.getEnclosedNode()) && d.type === CKEDITOR.NODE_ELEMENT && ("anchor" === d.data("cke-real-element-type") ||
+ d.is("a")) ? d : void 0; var f = (d = a && a.data("cke-realelement")) ? CKEDITOR.plugins.link.tryRestoreFakeAnchor(c, a) : CKEDITOR.plugins.link.getSelectedLink(c); if (f) { this._.selectedElement = f; var e = f.data("cke-saved-name"); this.setValueOf("info", "txtName", e || ""); !d && b.selectElement(f); a && (this._.selectedElement = a) } this.getContentElement("info", "txtName").focus()
+ }, contents: [{
+ id: "info", label: c.lang.link.anchor.title, accessKey: "I", elements: [{
+ type: "text", id: "txtName", label: c.lang.link.anchor.name, required: !0, validate: function() {
+ return this.getValue() ?
+ !0 : (alert(c.lang.link.anchor.errorName), !1)
+ }
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/link/dialogs/link.js b/plugins/link/dialogs/link.js
new file mode 100755
index 0000000..7305fd2
--- /dev/null
+++ b/plugins/link/dialogs/link.js
@@ -0,0 +1,30 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+(function(){function u(){var c=this.getDialog(),p=c._.editor,n=p.config.linkPhoneRegExp,q=p.config.linkPhoneMsg,p=CKEDITOR.dialog.validate.notEmpty(p.lang.link.noTel).apply(this);if(!c.getContentElement("info","linkType")||"tel"!=c.getValueOf("info","linkType"))return!0;if(!0!==p)return p;if(n)return CKEDITOR.dialog.validate.regex(n,q).call(this)}CKEDITOR.dialog.add("link",function(c){function p(a,b){var c=a.createRange();c.setStartBefore(b);c.setEndAfter(b);return c}var n=CKEDITOR.plugins.link,q,
+t=function(){var a=this.getDialog(),b=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),r=this.getValue();if(b&&a)switch(b=b.getElement(),b.hide(),a.setValue(""),r){case "frame":a.setLabel(c.lang.link.targetFrameName);a.getElement().show();break;case "popup":b.show();a.setLabel(c.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(r),a.getElement().hide()}},l=function(a){a.target&&this.setValue(a.target[this.id]||"")},e=function(a){a.advanced&&
+this.setValue(a.advanced[this.id]||"")},k=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||""},m=function(a){a.advanced||(a.advanced={});a.advanced[this.id]=this.getValue()||""},g=c.lang.common,b=c.lang.link,d;return{title:b.title,minWidth:"moono-lisa"==(CKEDITOR.skinName||c.config.skin)?450:350,minHeight:240,contents:[{id:"info",label:b.info,title:b.info,elements:[{type:"text",id:"linkDisplayText",label:b.displayText,setup:function(){this.enable();this.setValue(c.getSelection().getSelectedText());
+q=this.getValue()},commit:function(a){a.linkText=this.isEnabled()?this.getValue():""}},{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"],[b.toAnchor,"anchor"],[b.toEmail,"email"],[b.toPhone,"tel"]],onChange:function(){var a=this.getDialog(),b=["urlOptions","anchorOptions","emailOptions","telOptions"],r=this.getValue(),f=a.definition.getContents("upload"),f=f&&f.hidden;"url"==r?(c.config.linkShowTargetTab&&a.showPage("target"),f||a.showPage("upload")):(a.hidePage("target"),
+f||a.hidePage("upload"));for(f=0;f<b.length;f++){var h=a.getContentElement("info",b[f]);h&&(h=h.getElement().getParent().getParent(),b[f]==r+"Options"?h.show():h.hide())}a.layout()},setup:function(a){this.setValue(a.type||"url")},commit:function(a){a.type=this.getValue()}},{type:"vbox",id:"urlOptions",children:[{type:"hbox",widths:["25%","75%"],children:[{id:"protocol",type:"select",label:g.protocol,"default":"http://",items:[["http://‎","http://"],["https://‎","https://"],["ftp://‎","ftp://"],["news://‎",
+"news://"],[b.other,""]],setup:function(a){a.url&&this.setValue(a.url.protocol||"")},commit:function(a){a.url||(a.url={});a.url.protocol=this.getValue()}},{type:"text",id:"url",label:g.url,required:!0,onLoad:function(){this.allowOnChange=!0},onKeyUp:function(){this.allowOnChange=!1;var a=this.getDialog().getContentElement("info","protocol"),b=this.getValue(),c=/^((javascript:)|[#\/\.\?])/i,f=/^(http|https|ftp|news):\/\/(?=.)/i.exec(b);f?(this.setValue(b.substr(f[0].length)),a.setValue(f[0].toLowerCase())):
+c.test(b)&&a.setValue("");this.allowOnChange=!0},onChange:function(){if(this.allowOnChange)this.onKeyUp()},validate:function(){var a=this.getDialog();return a.getContentElement("info","linkType")&&"url"!=a.getValueOf("info","linkType")?!0:!c.config.linkJavaScriptLinksAllowed&&/javascript\:/.test(this.getValue())?(alert(g.invalidValue),!1):this.getDialog().fakeObj?!0:CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)},setup:function(a){this.allowOnChange=!1;a.url&&this.setValue(a.url.url);this.allowOnChange=
+!0},commit:function(a){this.onChange();a.url||(a.url={});a.url.url=this.getValue();this.allowOnChange=!1}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().show()}},{type:"button",id:"browse",hidden:"true",filebrowser:"info:url",label:g.browseServer}]},{type:"vbox",id:"anchorOptions",width:260,align:"center",padding:0,children:[{type:"fieldset",id:"selectAnchorText",label:b.selectAnchor,setup:function(){d=n.getEditorAnchors(c);this.getElement()[d&&d.length?
+"show":"hide"]()},children:[{type:"hbox",id:"selectAnchor",children:[{type:"select",id:"anchorName","default":"",label:b.anchorName,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");if(d)for(var b=0;b<d.length;b++)d[b].name&&this.add(d[b].name);a.anchor&&this.setValue(a.anchor.name);(a=this.getDialog().getContentElement("info","linkType"))&&"email"==a.getValue()&&this.focus()},commit:function(a){a.anchor||(a.anchor={});a.anchor.name=this.getValue()}},{type:"select",id:"anchorId",
+"default":"",label:b.anchorId,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");if(d)for(var b=0;b<d.length;b++)d[b].id&&this.add(d[b].id);a.anchor&&this.setValue(a.anchor.id)},commit:function(a){a.anchor||(a.anchor={});a.anchor.id=this.getValue()}}],setup:function(){this.getElement()[d&&d.length?"show":"hide"]()}}]},{type:"html",id:"noAnchors",style:"text-align: center;",html:'\x3cdiv role\x3d"note" tabIndex\x3d"-1"\x3e'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"\x3c/div\x3e",
+focus:!0,setup:function(){this.getElement()[d&&d.length?"hide":"show"]()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text",id:"emailAddress",label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return a.getContentElement("info","linkType")&&"email"==a.getValueOf("info","linkType")?CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this):!0},setup:function(a){a.email&&
+this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&"email"==a.getValue()&&this.select()},commit:function(a){a.email||(a.email={});a.email.address=this.getValue()}},{type:"text",id:"emailSubject",label:b.emailSubject,setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){a.email||(a.email={});a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},
+commit:function(a){a.email||(a.email={});a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"telOptions",padding:1,children:[{type:"tel",id:"telNumber",label:b.phoneNumber,required:!0,validate:u,setup:function(a){a.tel&&this.setValue(a.tel);(a=this.getDialog().getContentElement("info","linkType"))&&"tel"==a.getValue()&&this.select()},commit:function(a){a.tel=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info",
+"linkType")||this.getElement().hide()}}]},{id:"target",requiredContent:"a[target]",label:b.target,title:b.target,elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:g.target,"default":"notSet",style:"width : 100%;",items:[[g.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[g.targetNew,"_blank"],[g.targetTop,"_top"],[g.targetSelf,"_self"],[g.targetParent,"_parent"]],onChange:t,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");
+t.call(this)},commit:function(a){a.target||(a.target={});a.target.type=this.getValue()}},{type:"text",id:"linkTargetName",label:b.targetFrameName,"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){a.target||(a.target={});a.target.name=this.getValue().replace(/([^\x00-\x7F]|\s)/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",
+label:b.popupResizable,setup:l,commit:k},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:l,commit:k}]},{type:"hbox",children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:l,commit:k},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:l,commit:k}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:l,commit:k},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:l,commit:k}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",
+label:b.popupScrollBars,setup:l,commit:k},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:l,commit:k}]},{type:"hbox",children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:g.width,id:"width",setup:l,commit:k},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:l,commit:k}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:g.height,id:"height",setup:l,commit:k},{type:"text",labelLayout:"horizontal",
+label:b.popupTop,widths:["50%","50%"],id:"top",setup:l,commit:k}]}]}]}]},{id:"upload",label:b.upload,title:b.upload,hidden:!0,filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:g.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:g.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",
+requiredContent:"a[id]",label:b.id,setup:e,commit:m},{type:"select",id:"advLangDir",requiredContent:"a[dir]",label:b.langDir,"default":"",style:"width:110px",items:[[g.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:e,commit:m},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:e,commit:m}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:e,commit:m},{type:"text",
+label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:e,commit:m},{type:"text",label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:e,commit:m}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:e,commit:m},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",
+setup:e,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses,requiredContent:"a(cke-xyz)","default":"",id:"advCSSClasses",setup:e,commit:m},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:e,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:e,commit:m},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",
+validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),setup:e,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"checkbox",id:"download",requiredContent:"a[download]",label:b.download,setup:function(a){void 0!==a.download&&this.setValue("checked","checked")},commit:function(a){this.getValue()&&(a.download=this.getValue())}}]}]}]}],onShow:function(){var a=this.getParentEditor(),b=a.getSelection(),c=this.getContentElement("info","linkDisplayText").getElement().getParent().getParent(),
+f=n.getSelectedLink(a,!0),h=f[0]||null;h&&h.hasAttribute("href")&&(b.getSelectedElement()||b.isInTable()||b.selectElement(h));b=n.parseLinkAttributes(a,h);1>=f.length&&n.showDisplayTextForElement(h,a)?c.show():c.hide();this._.selectedElements=f;this.setupContent(b)},onOk:function(){var a={};this.commitContent(a);if(this._.selectedElements.length){var b=this._.selectedElements,g=n.getLinkAttributes(c,a),f=[],h,d,l,e,k;for(k=0;k<b.length;k++){h=b[k];d=h.data("cke-saved-href");l=h.getHtml();h.setAttributes(g.set);
+h.removeAttributes(g.removed);if(a.linkText&&q!=a.linkText)e=a.linkText;else if(d==l||"email"==a.type&&-1!=l.indexOf("@"))e="email"==a.type?a.email.address:g.set["data-cke-saved-href"];e&&h.setText(e);f.push(p(c,h))}c.getSelection().selectRanges(f);delete this._.selectedElements}else{b=n.getLinkAttributes(c,a);g=c.getSelection().getRanges();f=new CKEDITOR.style({element:"a",attributes:b.set});h=[];f.type=CKEDITOR.STYLE_INLINE;for(l=0;l<g.length;l++){d=g[l];d.collapsed?(e=new CKEDITOR.dom.text(a.linkText||
+("email"==a.type?a.email.address:b.set["data-cke-saved-href"]),c.document),d.insertNode(e),d.selectNodeContents(e)):q!==a.linkText&&(e=new CKEDITOR.dom.text(a.linkText,c.document),d.shrink(CKEDITOR.SHRINK_TEXT),c.editable().extractHtmlFromRange(d),d.insertNode(e));e=d._find("a");for(k=0;k<e.length;k++)e[k].remove(!0);f.applyToRange(d,c);h.push(d)}c.getSelection().selectRanges(h)}},onLoad:function(){c.config.linkShowAdvancedTab||this.hidePage("advanced");c.config.linkShowTargetTab||this.hidePage("target")},
+onFocus:function(){var a=this.getContentElement("info","linkType");a&&"url"==a.getValue()&&(a=this.getContentElement("info","url"),a.select())}}})})(); \ No newline at end of file
diff --git a/plugins/link/images/anchor.png b/plugins/link/images/anchor.png
new file mode 100755
index 0000000..d94adb4
--- /dev/null
+++ b/plugins/link/images/anchor.png
Binary files differ
diff --git a/plugins/link/images/hidpi/anchor.png b/plugins/link/images/hidpi/anchor.png
new file mode 100755
index 0000000..186c3e9
--- /dev/null
+++ b/plugins/link/images/hidpi/anchor.png
Binary files differ
diff --git a/plugins/liststyle/dialogs/liststyle.js b/plugins/liststyle/dialogs/liststyle.js
new file mode 100755
index 0000000..8815095
--- /dev/null
+++ b/plugins/liststyle/dialogs/liststyle.js
@@ -0,0 +1,38 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+(function() {
+ function d(c, d) { var b; try { b = c.getSelection().getRanges()[0] } catch (f) { return null } b.shrink(CKEDITOR.SHRINK_TEXT); return c.elementPath(b.getCommonAncestor()).contains(d, 1) } function e(c, e) {
+ var b = c.lang.liststyle; if ("bulletedListStyle" == e) return {
+ title: b.bulletedTitle, minWidth: 300, minHeight: 50, contents: [{
+ id: "info", accessKey: "I", elements: [{
+ type: "select", label: b.type, id: "type", align: "center", style: "width:150px", items: [[b.notset, ""], [b.circle, "circle"], [b.disc, "disc"], [b.square, "square"]], setup: function(a) {
+ a =
+ a.getStyle("list-style-type") || g[a.getAttribute("type")] || a.getAttribute("type") || ""; this.setValue(a)
+ }, commit: function(a) { var b = this.getValue(); b ? a.setStyle("list-style-type", b) : a.removeStyle("list-style-type") }
+ }]
+ }], onShow: function() { var a = this.getParentEditor(); (a = d(a, "ul")) && this.setupContent(a) }, onOk: function() { var a = this.getParentEditor(); (a = d(a, "ul")) && this.commitContent(a) }
+ }; if ("numberedListStyle" == e) {
+ var h = [[b.notset, ""], [b.lowerRoman, "lower-roman"], [b.upperRoman, "upper-roman"], [b.lowerAlpha,
+ "lower-alpha"], [b.upperAlpha, "upper-alpha"], [b.decimal, "decimal"]]; return {
+ title: b.numberedTitle, minWidth: 300, minHeight: 50, contents: [{
+ id: "info", accessKey: "I", elements: [{
+ type: "hbox", widths: ["25%", "75%"], children: [{
+ label: b.start, type: "text", id: "start", validate: CKEDITOR.dialog.validate.integer(b.validateStartNumber), setup: function(a) { a = a.getFirst(f).getAttribute("value") || a.getAttribute("start") || 1; this.setValue(a) }, commit: function(a) {
+ var b = a.getFirst(f), c = b.getAttribute("value") || a.getAttribute("start") ||
+ 1; a.getFirst(f).removeAttribute("value"); var d = parseInt(this.getValue(), 10); isNaN(d) ? a.removeAttribute("start") : a.setAttribute("start", d); a = b; b = c; for (d = isNaN(d) ? 1 : d; (a = a.getNext(f)) && b++;)a.getAttribute("value") == b && a.setAttribute("value", d + b - c)
+ }
+ }, {
+ type: "select", label: b.type, id: "type", style: "width: 100%;", items: h, setup: function(a) { a = a.getStyle("list-style-type") || g[a.getAttribute("type")] || a.getAttribute("type") || ""; this.setValue(a) }, commit: function(a) {
+ var b = this.getValue(); b ? a.setStyle("list-style-type",
+ b) : a.removeStyle("list-style-type")
+ }
+ }]
+ }]
+ }], onShow: function() { var a = this.getParentEditor(); (a = d(a, "ol")) && this.setupContent(a) }, onOk: function() { var a = this.getParentEditor(); (a = d(a, "ol")) && this.commitContent(a) }
+ }
+ }
+ } var f = function(c) { return c.type == CKEDITOR.NODE_ELEMENT && c.is("li") }, g = { a: "lower-alpha", A: "upper-alpha", i: "lower-roman", I: "upper-roman", 1: "decimal", disc: "disc", circle: "circle", square: "square" }; CKEDITOR.dialog.add("numberedListStyle", function(c) { return e(c, "numberedListStyle") }); CKEDITOR.dialog.add("bulletedListStyle",
+ function(c) { return e(c, "bulletedListStyle") })
+})(); \ No newline at end of file
diff --git a/plugins/magicline/images/hidpi/icon-rtl.png b/plugins/magicline/images/hidpi/icon-rtl.png
new file mode 100755
index 0000000..4a8d2bf
--- /dev/null
+++ b/plugins/magicline/images/hidpi/icon-rtl.png
Binary files differ
diff --git a/plugins/magicline/images/hidpi/icon.png b/plugins/magicline/images/hidpi/icon.png
new file mode 100755
index 0000000..b981bb5
--- /dev/null
+++ b/plugins/magicline/images/hidpi/icon.png
Binary files differ
diff --git a/plugins/magicline/images/icon-rtl.png b/plugins/magicline/images/icon-rtl.png
new file mode 100755
index 0000000..55b5b5f
--- /dev/null
+++ b/plugins/magicline/images/icon-rtl.png
Binary files differ
diff --git a/plugins/magicline/images/icon.png b/plugins/magicline/images/icon.png
new file mode 100755
index 0000000..e063433
--- /dev/null
+++ b/plugins/magicline/images/icon.png
Binary files differ
diff --git a/plugins/pastefromlibreoffice/filter/default.js b/plugins/pastefromlibreoffice/filter/default.js
new file mode 100755
index 0000000..2c22ee6
--- /dev/null
+++ b/plugins/pastefromlibreoffice/filter/default.js
@@ -0,0 +1,363 @@
+/**
+ * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
+ * CKEditor 4 LTS ("Long Term Support") is available under the terms of the Extended Support Model.
+ */
+
+/* globals CKEDITOR */
+
+(function() {
+ 'use strict';
+
+ var pastetools = CKEDITOR.plugins.pastetools,
+ commonFilter = pastetools.filters.common,
+ Style = commonFilter.styles;
+
+ /**
+ * A set of Paste from LibreOffice plugin helpers.
+ *
+ * @since 4.14.0
+ * @private
+ * @member CKEDITOR.plugins.pastetools.filters
+ */
+ CKEDITOR.plugins.pastetools.filters.libreoffice = {
+ /**
+ * Rules for the Paste from LibreOffice filter.
+ *
+ * @since 4.14.0
+ * @private
+ * @member CKEDITOR.plugins.pastetools.filters.libreoffice
+ */
+ rules: function(html, editor, filter) {
+ return {
+ root: function(element) {
+ element.filterChildren(filter);
+ },
+
+ comment: function() {
+ return false;
+ },
+
+ elementNames: [
+ [/^head$/i, ''],
+ [/^meta$/i, ''],
+ [/^strike$/i, 's']
+ ],
+
+ elements: {
+ // Required due to bug (#3664).
+ '!doctype': function(el) {
+ el.replaceWithChildren();
+ },
+
+ 'span': function(element) {
+ if (element.attributes.style) {
+ element.attributes.style = Style.normalizedStyles(element, editor);
+
+ Style.createStyleStack(element, filter, editor);
+ }
+
+ replaceEmptyElementWithChildren(element);
+ },
+
+ 'p': function(element) {
+ var styles = CKEDITOR.tools.parseCssText(element.attributes.style);
+
+ if (editor.plugins.pagebreak &&
+ (styles['page-break-before'] === 'always' || styles['break-before'] === 'page')
+ ) {
+ insertPageBreakBefore(editor, element);
+ }
+
+ element.attributes.style = CKEDITOR.tools.writeCssText(styles);
+
+ element.filterChildren(filter);
+ Style.createStyleStack(element, filter, editor);
+ },
+
+ 'div': function(element) {
+ Style.createStyleStack(element, filter, editor);
+ },
+
+ 'a': function(el) {
+ if (el.attributes.style) {
+ el.attributes.style = removeDefaultLinkStyles(el.attributes.style);
+ }
+ },
+
+ 'h1': function(el) {
+ Style.createStyleStack(el, filter, editor);
+ },
+
+ 'h2': function(el) {
+ Style.createStyleStack(el, filter, editor);
+ },
+
+ 'h3': function(el) {
+ Style.createStyleStack(el, filter, editor);
+ },
+
+ 'h4': function(el) {
+ Style.createStyleStack(el, filter, editor);
+ },
+
+ 'h5': function(el) {
+ Style.createStyleStack(el, filter, editor);
+ },
+
+ 'h6': function(el) {
+ Style.createStyleStack(el, filter, editor);
+ },
+
+ 'pre': function(el) {
+ Style.createStyleStack(el, filter, editor);
+ },
+
+ 'font': function(el) {
+ if (shouldReplaceFontWithChildren(el)) {
+ el.replaceWithChildren();
+ }
+
+ // 1. Case there is no style stack
+ // 2. font-size is child of this node
+ // 3. font-size is parent of this node
+ var styles = CKEDITOR.tools.parseCssText(el.attributes.style);
+ var firstChild = el.getFirst();
+
+ if (el.attributes.size &&
+ firstChild &&
+ firstChild.type === CKEDITOR.NODE_ELEMENT &&
+ /font-size/.test(firstChild.attributes.style)
+ ) {
+ el.replaceWithChildren();
+ }
+
+ if (styles['font-size']) {
+ // We need to remove 'size' and transform font to span with 'font-size'.
+ delete el.attributes.size;
+ el.name = 'span';
+
+ if (firstChild && firstChild.type === CKEDITOR.NODE_ELEMENT && firstChild.attributes.size) {
+ firstChild.replaceWithChildren();
+ }
+ }
+ },
+
+ 'ul': function(el) {
+ if (listMerger(el, filter)) {
+ return false;
+ }
+ },
+
+ 'ol': function(el) {
+ if (listMerger(el, filter)) {
+ return false;
+ }
+ },
+
+ 'img': function(el) {
+ var src = el.attributes.src;
+
+ if (!src) {
+ return false;
+ }
+ },
+
+ // All tables in LO assume collapsed borders, but the style is
+ // not always provided during the paste.
+ 'table': function(element) {
+ element.attributes.style = addBorderCollapse(element.attributes.style);
+ }
+ },
+
+ attributes: {
+ 'style': function(styles, element) {
+ // Returning false deletes the attribute.
+ return Style.normalizedStyles(element, editor) || false;
+ },
+
+ // Many elements can have [align] attribute. Let's make it a wildcard
+ // transformation then!
+ 'align': function(align, element) {
+ // Images have their own handling logic.
+ if (element.name === 'img') {
+ return;
+ }
+
+ var styles = CKEDITOR.tools.parseCssText(element.attributes.style);
+
+ styles['text-align'] = element.attributes.align;
+ element.attributes.style = CKEDITOR.tools.writeCssText(styles);
+
+ return false;
+ },
+
+ 'cellspacing': remove,
+
+ 'cellpadding': remove,
+
+ 'border': remove
+ }
+ };
+ }
+ };
+
+ function replaceEmptyElementWithChildren(element) {
+ if (!CKEDITOR.tools.object.entries(element.attributes).length) {
+ element.replaceWithChildren();
+ }
+ }
+
+ function shouldReplaceFontWithChildren(element) {
+ // Anchor is additionally styled with font.
+ if (element.parent.name === 'a' && element.attributes.color === '#000080') {
+ return true;
+ }
+
+ // Sub or sup is additionally styled with font.
+ if (element.parent.children.length === 1 && (element.parent.name === 'sup' || element.parent.name === 'sub') && element.attributes.size === '2') {
+ return true;
+ }
+
+ return false;
+ }
+
+ // Return true if a list is successfully merged to the previous item..
+ function listMerger(el, filter) {
+ if (!shouldMergeToPreviousList(el)) {
+ return false;
+ }
+
+ var previous = el.previous,
+ lastLi = getLastListItem(previous),
+ liDepthValue = checkDepth(lastLi),
+ innerList = unwrapList(el, liDepthValue);
+
+ if (innerList) {
+ lastLi.add(innerList);
+ innerList.filterChildren(filter);
+ return true;
+ }
+
+ return false;
+ }
+
+ function shouldMergeToPreviousList(element) {
+ // There needs to be a previous list that the element should be merged to.
+ if (!element.previous || !isList(element.previous)) {
+ return false;
+ }
+
+ // There might be cases in PFW where a li element has no children (test Tickets/7131 word2013 chrome).
+ if (!element.getFirst().children.length) {
+ return false;
+ }
+
+ // The current list needs to be a nested list, what points that is sublist.
+ if (element.children.length !== 1 || !isList(element.getFirst().getFirst())) {
+ return false;
+ }
+
+ return true;
+ }
+
+ // Checks the evel of nested list for a given element.
+ // It's exepected that the argument is the `li` element.
+ function checkDepth(element) {
+ var level = 0,
+ currentElement = element,
+ listEvaluator = getListEvaluator();
+
+ while ((currentElement = currentElement.getAscendant(listEvaluator))) {
+ level++;
+ }
+
+ return level;
+ }
+
+ function getLastListItem(el) {
+ var lastChild = el.children[el.children.length - 1];
+
+ if (!isList(lastChild) && lastChild.name !== 'li') {
+ return el;
+ }
+
+ return getLastListItem(lastChild);
+ }
+
+ function getListEvaluator() {
+ var isInBlock = false;
+
+ return function(element) {
+ // There might be situation that the list is somehow nested in another type of element, quotes, div, table, etc.
+ // When such situation happens, we should not search for any above list.
+ if (isInBlock) {
+ return false;
+ }
+
+ if (!isList(element) && element.name !== 'li') {
+ isInBlock = true;
+ return false;
+ }
+
+ return isList(element);
+ };
+ }
+
+ // Get a nested list by first items.
+ function unwrapList(list, count) {
+ if (count) {
+ return unwrapList(list.getFirst().getFirst(), --count);
+ }
+
+ return list;
+ }
+
+ function isList(element) {
+ return element.name === 'ol' || element.name === 'ul';
+ }
+
+ function remove() {
+ return false;
+ }
+
+ function removeDefaultLinkStyles(styles) {
+ var parsedStyles = CKEDITOR.tools.parseCssText(styles);
+
+ if (parsedStyles.color === '#000080') {
+ delete parsedStyles.color;
+ }
+
+ if (parsedStyles['text-decoration'] === 'underline') {
+ delete parsedStyles['text-decoration'];
+ }
+
+ return CKEDITOR.tools.writeCssText(parsedStyles);
+ }
+
+ function insertPageBreakBefore(editor, element) {
+ var pagebreakEl = CKEDITOR.plugins.pagebreak.createElement(editor);
+
+ pagebreakEl = CKEDITOR.htmlParser.fragment.fromHtml(pagebreakEl.getOuterHtml()).children[0];
+
+ pagebreakEl.insertBefore(element);
+ }
+
+ function addBorderCollapse(styles) {
+ var parsedStyles = CKEDITOR.tools.parseCssText(styles);
+
+ if (parsedStyles['border-collapse']) {
+ return styles;
+ }
+
+ parsedStyles['border-collapse'] = 'collapse';
+
+ return CKEDITOR.tools.writeCssText(parsedStyles);
+ }
+
+ CKEDITOR.pasteFilters.libreoffice = pastetools.createFilter({
+ rules: [
+ commonFilter.rules,
+ CKEDITOR.plugins.pastetools.filters.libreoffice.rules
+ ]
+ });
+})();
diff --git a/plugins/pastefromlibreoffice/plugin.js b/plugins/pastefromlibreoffice/plugin.js
new file mode 100755
index 0000000..0cfecce
--- /dev/null
+++ b/plugins/pastefromlibreoffice/plugin.js
@@ -0,0 +1,76 @@
+/**
+ * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
+ * CKEditor 4 LTS ("Long Term Support") is available under the terms of the Extended Support Model.
+ */
+
+/**
+ * @fileOverview This plugin handles pasting content from LibreOffice.
+ */
+
+(function() {
+ 'use strict';
+
+ CKEDITOR.plugins.add('pastefromlibreoffice', {
+ requires: 'pastetools',
+
+ isSupportedEnvironment: function() {
+ var isSafari = CKEDITOR.env.webkit && !CKEDITOR.env.chrome,
+ isIE = CKEDITOR.env.ie && CKEDITOR.env.version <= 11;
+
+ return !isSafari && !isIE;
+ },
+
+ init: function(editor) {
+ if (!this.isSupportedEnvironment()) {
+ return;
+ }
+
+ var pasteToolsPath = CKEDITOR.plugins.getPath('pastetools'),
+ path = this.path;
+
+ editor.pasteTools.register({
+ priority: 100, // after PFW
+ filters: [
+ CKEDITOR.getUrl(pasteToolsPath + 'filter/common.js'),
+ CKEDITOR.getUrl(pasteToolsPath + 'filter/image.js'),
+ CKEDITOR.getUrl(path + 'filter/default.js')
+ ],
+
+ canHandle: function(evt) {
+ var data = evt.data,
+ textHtml = data.dataTransfer.getData('text/html', true) || data.dataValue,
+ generatorName;
+
+ // Do not run the filter if there is no input data.
+ if (!textHtml) {
+ return false;
+ }
+
+ generatorName = CKEDITOR.plugins.pastetools.getContentGeneratorName(textHtml);
+
+ return generatorName === 'libreoffice';
+ },
+
+ handle: function(evt, next) {
+ var data = evt.data,
+ clipboardHtml = data.dataValue || CKEDITOR.plugins.pastetools.getClipboardData(data, 'text/html');
+
+ // Do not apply the paste filter to the data filtered by the LibreOffice filter (https://dev.ckeditor.com/ticket/13093).
+ // TO DO it might be unnecessary!!!
+ data.dontFilter = true;
+
+ clipboardHtml = CKEDITOR.pasteFilters.image(clipboardHtml, editor, CKEDITOR.plugins.pastetools.getClipboardData(data, 'text/rtf'));
+
+ data.dataValue = CKEDITOR.pasteFilters.libreoffice(clipboardHtml, editor);
+
+ if (editor.config.forcePasteAsPlainText === true) {
+ // If `config.forcePasteAsPlainText` is set to `true`, force plain text even on Libre Office content (#1013).
+ data.type = 'text';
+ }
+
+ next();
+ }
+ });
+ }
+ });
+})();
diff --git a/plugins/preview/preview.html b/plugins/preview/preview.html
new file mode 100755
index 0000000..f9de27c
--- /dev/null
+++ b/plugins/preview/preview.html
@@ -0,0 +1,13 @@
+<script>
+
+ // Prevent from DOM clobbering.
+ if (typeof window.opener._cke_htmlToLoad == 'string') {
+ var doc = document;
+ doc.open();
+ doc.write(window.opener._cke_htmlToLoad);
+ doc.close();
+
+ delete window.opener._cke_htmlToLoad;
+ }
+
+</script> \ No newline at end of file
diff --git a/plugins/showblocks/images/block_address.png b/plugins/showblocks/images/block_address.png
new file mode 100755
index 0000000..5abdae1
--- /dev/null
+++ b/plugins/showblocks/images/block_address.png
Binary files differ
diff --git a/plugins/showblocks/images/block_blockquote.png b/plugins/showblocks/images/block_blockquote.png
new file mode 100755
index 0000000..a8f4973
--- /dev/null
+++ b/plugins/showblocks/images/block_blockquote.png
Binary files differ
diff --git a/plugins/showblocks/images/block_div.png b/plugins/showblocks/images/block_div.png
new file mode 100755
index 0000000..87b3c17
--- /dev/null
+++ b/plugins/showblocks/images/block_div.png
Binary files differ
diff --git a/plugins/showblocks/images/block_h1.png b/plugins/showblocks/images/block_h1.png
new file mode 100755
index 0000000..3933325
--- /dev/null
+++ b/plugins/showblocks/images/block_h1.png
Binary files differ
diff --git a/plugins/showblocks/images/block_h2.png b/plugins/showblocks/images/block_h2.png
new file mode 100755
index 0000000..c99894c
--- /dev/null
+++ b/plugins/showblocks/images/block_h2.png
Binary files differ
diff --git a/plugins/showblocks/images/block_h3.png b/plugins/showblocks/images/block_h3.png
new file mode 100755
index 0000000..cb73d67
--- /dev/null
+++ b/plugins/showblocks/images/block_h3.png
Binary files differ
diff --git a/plugins/showblocks/images/block_h4.png b/plugins/showblocks/images/block_h4.png
new file mode 100755
index 0000000..7af6bb4
--- /dev/null
+++ b/plugins/showblocks/images/block_h4.png
Binary files differ
diff --git a/plugins/showblocks/images/block_h5.png b/plugins/showblocks/images/block_h5.png
new file mode 100755
index 0000000..ce5bec1
--- /dev/null
+++ b/plugins/showblocks/images/block_h5.png
Binary files differ
diff --git a/plugins/showblocks/images/block_h6.png b/plugins/showblocks/images/block_h6.png
new file mode 100755
index 0000000..e67b982
--- /dev/null
+++ b/plugins/showblocks/images/block_h6.png
Binary files differ
diff --git a/plugins/showblocks/images/block_p.png b/plugins/showblocks/images/block_p.png
new file mode 100755
index 0000000..63a5820
--- /dev/null
+++ b/plugins/showblocks/images/block_p.png
Binary files differ
diff --git a/plugins/showblocks/images/block_pre.png b/plugins/showblocks/images/block_pre.png
new file mode 100755
index 0000000..955a868
--- /dev/null
+++ b/plugins/showblocks/images/block_pre.png
Binary files differ
diff --git a/plugins/specialchar/dialogs/lang/_translationstatus.txt b/plugins/specialchar/dialogs/lang/_translationstatus.txt
new file mode 100755
index 0000000..1319304
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+
+cs.js Found: 118 Missing: 0
+cy.js Found: 118 Missing: 0
+de.js Found: 118 Missing: 0
+el.js Found: 16 Missing: 102
+eo.js Found: 118 Missing: 0
+et.js Found: 31 Missing: 87
+fa.js Found: 24 Missing: 94
+fi.js Found: 23 Missing: 95
+fr.js Found: 118 Missing: 0
+hr.js Found: 23 Missing: 95
+it.js Found: 118 Missing: 0
+nb.js Found: 118 Missing: 0
+nl.js Found: 118 Missing: 0
+no.js Found: 118 Missing: 0
+tr.js Found: 118 Missing: 0
+ug.js Found: 39 Missing: 79
+zh-cn.js Found: 118 Missing: 0
diff --git a/plugins/specialchar/dialogs/lang/af.js b/plugins/specialchar/dialogs/lang/af.js
new file mode 100755
index 0000000..e55df1b
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/af.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "af", {
+ euro: "Euroteken", lsquo: "Linker enkelkwotasie", rsquo: "Regter enkelkwotasie", ldquo: "Linker dubbelkwotasie", rdquo: "Regter dubbelkwotasie", ndash: "Kortkoppelteken", mdash: "Langkoppelteken", iexcl: "Omgekeerdeuitroepteken", cent: "Centteken", pound: "Pondteken", curren: "Geldeenheidteken", yen: "Yenteken", brvbar: "Gebreekte balk", sect: "Afdeelingsteken", uml: "Deelteken", copy: "Kopieregteken", ordf: "Vroulikekenteken", laquo: "Linkgeoorienteerde aanhaalingsteken", not: "Verbodeteken",
+ reg: "Regestrasieteken", macr: "Lengteteken", deg: "Gradeteken", sup2: "Kwadraatteken", sup3: "Kubiekteken", acute: "Akuutaksentteken", micro: "Mikroteken", para: "Pilcrow sign", middot: "Middle dot", cedil: "Cedilla", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis",
+ aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth",
+ ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Division sign", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis",
+ yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis",
+ trade: "Trade mark sign", 9658: "Black right-pointing pointer", bull: "Bullet", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Almost equal to"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/ar.js b/plugins/specialchar/dialogs/lang/ar.js
new file mode 100755
index 0000000..9e31254
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/ar.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","ar",{euro:"رمز اليورو",lsquo:"علامة تنصيص فردية علي اليسار",rsquo:"علامة تنصيص فردية علي اليمين",ldquo:"علامة تنصيص مزدوجة علي اليسار",rdquo:"علامة تنصيص مزدوجة علي اليمين",ndash:"En dash",mdash:"Em dash",iexcl:"علامة تعجب مقلوبة",cent:"رمز السنت",pound:"رمز الاسترليني",curren:"رمز العملة",yen:"رمز الين",brvbar:"شريط مقطوع",sect:"رمز القسم",uml:"Diaeresis",copy:"علامة حقوق الطبع",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"ليست علامة",reg:"علامة مسجّلة",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"علامة الإستفهام غير صحيحة",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/az.js b/plugins/specialchar/dialogs/lang/az.js
new file mode 100755
index 0000000..61d84dd
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/az.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "az", {
+ euro: "Avropa valyuta işarəsi", lsquo: "Sol tək dırnaq işarəsi", rsquo: "Sağ tək dırnaq işarəsi", ldquo: "Sol cüt dırnaq işarəsi", rdquo: "Sağ cüt dırnaq işarəsi", ndash: "Çıxma işarəsi", mdash: "Tire", iexcl: "Çevrilmiş nida işarəsi", cent: "Sent işarəsi", pound: "Funt sterlinq işarəsi", curren: "Valyuta işarəsi", yen: "İena işarəsi", brvbar: "Sınmış zolaq", sect: "Paraqraf işarəsi", uml: "Umlyaut", copy: "Müəllif hüquqları haqqında işarəsi", ordf: "Qadın sıra indikatoru (a)", laquo: "Sola göstərən cüt bucaqlı dırnaq",
+ not: "QEYRİ işarəsi", reg: "Qeyd olunmuş işarəsi", macr: "Makron", deg: "Dərəcə işarəsi", sup2: "Yuxarı indeks 2", sup3: "Yuxarı indeks 3", acute: "Vurğu işarəsi", micro: "Mikro işarəsi", para: "Abzas işarəsi", middot: "Orta nöqtə", cedil: "Tsedilla işarəsi", sup1: "Yuxarı indeks 1", ordm: "Kişi say indikatoru (o)", raquo: "Sağa göstərən cüt bucaqlı dırnaq", frac14: "Dörddə bir hissə kəsri", frac12: "Bir yarım kəsri", frac34: "Dörddə üç hissə kəsri", iquest: "Çevrilmiş sual işarəsi", Agrave: "Soldan vurğu ilə A", Aacute: "Vurğu ilə A",
+ Acirc: "Dam işarəsi ilə A", Atilde: "Tilda işarəsi ilə A", Auml: "Umlyaut ilə A", Aring: "Dairəli A", AElig: "Æ hərfi", Ccedil: "Tsedilla ilə C", Egrave: "Soldan vurğu ilə E", Eacute: "Vurğu ilə E", Ecirc: "Dam işarəsi ilə E", Euml: "Umlyaut ilə E", Igrave: "Soldan vurğu ilə I", Iacute: "Vurğu ilə I", Icirc: "Dam işarəsi ilə I", Iuml: "Umlyaut ilə I", ETH: "Eth latin hərfi", Ntilde: "Tilda işarəsi ilə N", Ograve: "Soldan vurğu ilə O", Oacute: "Vurğu ilə O", Ocirc: "Dam işarəsi ilə E", Otilde: "Tilda işarəsi ilə O", Ouml: "Umlyaut ilə O",
+ times: "Vurma işarəsi", Oslash: "Üstxəttli O", Ugrave: "Soldan vurğu ilə U", Uacute: "Vurğu ilə U", Ucirc: "Dam işarəsi ilə U", Uuml: "Umlyaut ilə U", Yacute: "Vurğu ilə Y", THORN: "Thorn hərfi", szlig: "İti s kiçik hərfi", agrave: "Soldan vurğu ilə a", aacute: "Vurğu ilə a", acirc: "Dam işarəsi ilə a", atilde: "Tilda işarəsi ilə a", auml: "Umlyaut ilə a", aring: "Dairəli a", aelig: "æ hərfi", ccedil: "ç hərfi", egrave: "Soldan vurğu ilə e", eacute: "Vurğu ilə e", ecirc: "Dam işarəsi ilə e", euml: "Umlyaut ilə e", igrave: "Soldan vurğu ilə i",
+ iacute: "Vurğu ilə i", icirc: "Dam işarəsi ilə i", iuml: "Umlyaut ilə i", eth: "eth kiçik hərfi", ntilde: "Tilda işarəsi ilə n", ograve: "Soldan vurğu ilə o", oacute: "Vurğu ilə o", ocirc: "Dam işarəsi ilə o", otilde: "Tilda işarəsi ilə o", ouml: "Umlyaut ilə o", divide: "Bölünmə işarəsi", oslash: "Üstxəttli o", ugrave: "Soldan vurğu ilə u", uacute: "Vurğu ilə u", ucirc: "Dam işarəsi ilə u", uuml: "Umlyaut ilə u", yacute: "Vurğu ilə y", thorn: "Thorn kiçik hərfi", yuml: "Umlyaut ilə y", OElig: "OE ligaturası", oelig: "oe ligaturası", 372: "Dam işarəsi ilə W",
+ 374: "Dam işarəsi ilə Y", 373: "Dam işarəsi ilə w", 375: "Dam işarəsi ilə y", sbquo: "Aşağı dırnaq", 8219: "Tək yuxarı çevrilmiş dırnaq", bdquo: "Aşağı cütlü dırnaqlar", hellip: "Üfüqi ellips", trade: "Əmtəə nişanı", 9658: "Sağa göstərici", bull: "Marker", rarr: "Sağa istiqamətləndirən ox", rArr: "Sağa istiqamətləndirən cütlü ox", hArr: "Hərtərəfli ox", diams: "Qara kərpic", asymp: "Təxmini barabər"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/bg.js b/plugins/specialchar/dialogs/lang/bg.js
new file mode 100755
index 0000000..8288d8c
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/bg.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","bg",{euro:"Евро знак",lsquo:"Лява маркировка за цитат",rsquo:"Дясна маркировка за цитат",ldquo:"Лява двойна кавичка за цитат",rdquo:"Дясна двойна кавичка за цитат",ndash:"\\\\",mdash:"/",iexcl:"Обърната питанка",cent:"Знак за цент",pound:"Знак за паунд",curren:"Валутен знак",yen:"Знак за йена",brvbar:"Прекъсната линия",sect:"Знак за секция",uml:"Diaeresis",copy:"Знак за Copyright",ordf:"Женски ординарен индикатор",laquo:"Знак с двоен ъгъл за означаване на лява посока",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/ca.js b/plugins/specialchar/dialogs/lang/ca.js
new file mode 100755
index 0000000..400ee89
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/ca.js
@@ -0,0 +1,16 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "ca", {
+ euro: "Símbol d'euro", lsquo: "Signe de cometa simple esquerra", rsquo: "Signe de cometa simple dreta", ldquo: "Signe de cometa doble esquerra", rdquo: "Signe de cometa doble dreta", ndash: "Guió", mdash: "Guió baix", iexcl: "Signe d'exclamació inversa", cent: "Símbol de percentatge", pound: "Símbol de lliura", curren: "Símbol de moneda", yen: "Símbol de Yen", brvbar: "Barra trencada", sect: "Símbol de secció", uml: "Dièresi", copy: "Símbol de Copyright", ordf: "Indicador ordinal femení",
+ laquo: "Signe de cometes angulars esquerra", not: "Símbol de negació", reg: "Símbol registrat", macr: "Macron", deg: "Símbol de grau", sup2: "Superíndex dos", sup3: "Superíndex tres", acute: "Accent agut", micro: "Símbol de micro", para: "Símbol de calderó", middot: "Punt volat", cedil: "Ce trencada", sup1: "Superíndex u", ordm: "Indicador ordinal masculí", raquo: "Signe de cometes angulars dreta", frac14: "Fracció vulgar un quart", frac12: "Fracció vulgar una meitat", frac34: "Fracció vulgar tres quarts", iquest: "Símbol d'interrogació invertit",
+ Agrave: "Lletra majúscula llatina A amb accent greu", Aacute: "Lletra majúscula llatina A amb accent agut", Acirc: "Lletra majúscula llatina A amb circumflex", Atilde: "Lletra majúscula llatina A amb titlla", Auml: "Lletra majúscula llatina A amb dièresi", Aring: "Lletra majúscula llatina A amb anell superior", AElig: "Lletra majúscula llatina Æ", Ccedil: "Lletra majúscula llatina C amb ce trencada", Egrave: "Lletra majúscula llatina E amb accent greu", Eacute: "Lletra majúscula llatina E amb accent agut", Ecirc: "Lletra majúscula llatina E amb circumflex",
+ Euml: "Lletra majúscula llatina E amb dièresi", Igrave: "Lletra majúscula llatina I amb accent greu", Iacute: "Lletra majúscula llatina I amb accent agut", Icirc: "Lletra majúscula llatina I amb circumflex", Iuml: "Lletra majúscula llatina I amb dièresi", ETH: "Lletra majúscula llatina Eth", Ntilde: "Lletra majúscula llatina N amb titlla", Ograve: "Lletra majúscula llatina O amb accent greu", Oacute: "Lletra majúscula llatina O amb accent agut", Ocirc: "Lletra majúscula llatina O amb circumflex", Otilde: "Lletra majúscula llatina O amb titlla",
+ Ouml: "Lletra majúscula llatina O amb dièresi", times: "Símbol de multiplicació", Oslash: "Lletra majúscula llatina O amb barra", Ugrave: "Lletra majúscula llatina U amb accent greu", Uacute: "Lletra majúscula llatina U amb accent agut", Ucirc: "Lletra majúscula llatina U amb circumflex", Uuml: "Lletra majúscula llatina U amb dièresi", Yacute: "Lletra majúscula llatina Y amb accent agut", THORN: "Lletra majúscula llatina Thorn", szlig: "Lletra minúscula llatina sharp s", agrave: "Lletra minúscula llatina a amb accent greu",
+ aacute: "Lletra minúscula llatina a amb accent agut", acirc: "Lletra minúscula llatina a amb circumflex", atilde: "Lletra minúscula llatina a amb titlla", auml: "Lletra minúscula llatina a amb dièresi", aring: "Lletra minúscula llatina a amb anell superior", aelig: "Lletra minúscula llatina æ", ccedil: "Lletra minúscula llatina c amb ce trencada", egrave: "Lletra minúscula llatina e amb accent greu", eacute: "Lletra minúscula llatina e amb accent agut", ecirc: "Lletra minúscula llatina e amb circumflex", euml: "Lletra minúscula llatina e amb dièresi",
+ igrave: "Lletra minúscula llatina i amb accent greu", iacute: "Lletra minúscula llatina i amb accent agut", icirc: "Lletra minúscula llatina i amb circumflex", iuml: "Lletra minúscula llatina i amb dièresi", eth: "Lletra minúscula llatina eth", ntilde: "Lletra minúscula llatina n amb titlla", ograve: "Lletra minúscula llatina o amb accent greu", oacute: "Lletra minúscula llatina o amb accent agut", ocirc: "Lletra minúscula llatina o amb circumflex", otilde: "Lletra minúscula llatina o amb titlla", ouml: "Lletra minúscula llatina o amb dièresi",
+ divide: "Símbol de divisió", oslash: "Lletra minúscula llatina o amb barra", ugrave: "Lletra minúscula llatina u amb accent greu", uacute: "Lletra minúscula llatina u amb accent agut", ucirc: "Lletra minúscula llatina u amb circumflex", uuml: "Lletra minúscula llatina u amb dièresi", yacute: "Lletra minúscula llatina y amb accent agut", thorn: "Lletra minúscula llatina thorn", yuml: "Lletra minúscula llatina y amb dièresi", OElig: "Lligadura majúscula llatina OE", oelig: "Lligadura minúscula llatina oe", 372: "Lletra majúscula llatina W amb circumflex",
+ 374: "Lletra majúscula llatina Y amb circumflex", 373: "Lletra minúscula llatina w amb circumflex", 375: "Lletra minúscula llatina y amb circumflex", sbquo: "Signe de cita simple baixa-9", 8219: "Signe de cita simple alta-invertida-9", bdquo: "Signe de cita doble baixa-9", hellip: "Punts suspensius", trade: "Símbol de marca registrada", 9658: "Punter negre apuntant cap a la dreta", bull: "Vinyeta", rarr: "Fletxa cap a la dreta", rArr: "Doble fletxa cap a la dreta", hArr: "Doble fletxa esquerra dreta", diams: "Vestit negre diamant",
+ asymp: "Gairebé igual a"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/cs.js b/plugins/specialchar/dialogs/lang/cs.js
new file mode 100755
index 0000000..561d9c0
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/cs.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "cs", {
+ euro: "Znak eura", lsquo: "Počáteční uvozovka jednoduchá", rsquo: "Koncová uvozovka jednoduchá", ldquo: "Počáteční uvozovka dvojitá", rdquo: "Koncová uvozovka dvojitá", ndash: "En pomlčka", mdash: "Em pomlčka", iexcl: "Obrácený vykřičník", cent: "Znak centu", pound: "Znak libry", curren: "Znak měny", yen: "Znak jenu", brvbar: "Přerušená svislá čára", sect: "Znak oddílu", uml: "Přehláska", copy: "Znak copyrightu", ordf: "Ženský indikátor rodu", laquo: "Znak dvojitých lomených uvozovek vlevo",
+ not: "Logistický zápor", reg: "Znak registrace", macr: "Pomlčka nad", deg: "Znak stupně", sup2: "Dvojka jako horní index", sup3: "Trojka jako horní index", acute: "Čárka nad vpravo", micro: "Znak mikro", para: "Znak odstavce", middot: "Tečka uprostřed", cedil: "Ocásek vlevo", sup1: "Jednička jako horní index", ordm: "Mužský indikátor rodu", raquo: "Znak dvojitých lomených uvozovek vpravo", frac14: "Obyčejný zlomek jedna čtvrtina", frac12: "Obyčejný zlomek jedna polovina", frac34: "Obyčejný zlomek tři čtvrtiny", iquest: "Znak obráceného otazníku",
+ Agrave: "Velké písmeno latinky A s čárkou nad vlevo", Aacute: "Velké písmeno latinky A s čárkou nad vpravo", Acirc: "Velké písmeno latinky A s vokáněm", Atilde: "Velké písmeno latinky A s tildou", Auml: "Velké písmeno latinky A s dvěma tečkami", Aring: "Velké písmeno latinky A s kroužkem nad", AElig: "Velké písmeno latinky Æ", Ccedil: "Velké písmeno latinky C s ocáskem vlevo", Egrave: "Velké písmeno latinky E s čárkou nad vlevo", Eacute: "Velké písmeno latinky E s čárkou nad vpravo", Ecirc: "Velké písmeno latinky E s vokáněm",
+ Euml: "Velké písmeno latinky E s dvěma tečkami", Igrave: "Velké písmeno latinky I s čárkou nad vlevo", Iacute: "Velké písmeno latinky I s čárkou nad vpravo", Icirc: "Velké písmeno latinky I s vokáněm", Iuml: "Velké písmeno latinky I s dvěma tečkami", ETH: "Velké písmeno latinky Eth", Ntilde: "Velké písmeno latinky N s tildou", Ograve: "Velké písmeno latinky O s čárkou nad vlevo", Oacute: "Velké písmeno latinky O s čárkou nad vpravo", Ocirc: "Velké písmeno latinky O s vokáněm", Otilde: "Velké písmeno latinky O s tildou",
+ Ouml: "Velké písmeno latinky O s dvěma tečkami", times: "Znak násobení", Oslash: "Velké písmeno latinky O přeškrtnuté", Ugrave: "Velké písmeno latinky U s čárkou nad vlevo", Uacute: "Velké písmeno latinky U s čárkou nad vpravo", Ucirc: "Velké písmeno latinky U s vokáněm", Uuml: "Velké písmeno latinky U s dvěma tečkami", Yacute: "Velké písmeno latinky Y s čárkou nad vpravo", THORN: "Velké písmeno latinky Thorn", szlig: "Malé písmeno latinky ostré s", agrave: "Malé písmeno latinky a s čárkou nad vlevo", aacute: "Malé písmeno latinky a s čárkou nad vpravo",
+ acirc: "Malé písmeno latinky a s vokáněm", atilde: "Malé písmeno latinky a s tildou", auml: "Malé písmeno latinky a s dvěma tečkami", aring: "Malé písmeno latinky a s kroužkem nad", aelig: "Malé písmeno latinky ae", ccedil: "Malé písmeno latinky c s ocáskem vlevo", egrave: "Malé písmeno latinky e s čárkou nad vlevo", eacute: "Malé písmeno latinky e s čárkou nad vpravo", ecirc: "Malé písmeno latinky e s vokáněm", euml: "Malé písmeno latinky e s dvěma tečkami", igrave: "Malé písmeno latinky i s čárkou nad vlevo", iacute: "Malé písmeno latinky i s čárkou nad vpravo",
+ icirc: "Malé písmeno latinky i s vokáněm", iuml: "Malé písmeno latinky i s dvěma tečkami", eth: "Malé písmeno latinky eth", ntilde: "Malé písmeno latinky n s tildou", ograve: "Malé písmeno latinky o s čárkou nad vlevo", oacute: "Malé písmeno latinky o s čárkou nad vpravo", ocirc: "Malé písmeno latinky o s vokáněm", otilde: "Malé písmeno latinky o s tildou", ouml: "Malé písmeno latinky o s dvěma tečkami", divide: "Znak dělení", oslash: "Malé písmeno latinky o přeškrtnuté", ugrave: "Malé písmeno latinky u s čárkou nad vlevo",
+ uacute: "Malé písmeno latinky u s čárkou nad vpravo", ucirc: "Malé písmeno latinky u s vokáněm", uuml: "Malé písmeno latinky u s dvěma tečkami", yacute: "Malé písmeno latinky y s čárkou nad vpravo", thorn: "Malé písmeno latinky thorn", yuml: "Malé písmeno latinky y s dvěma tečkami", OElig: "Velká ligatura latinky OE", oelig: "Malá ligatura latinky OE", 372: "Velké písmeno latinky W s vokáněm", 374: "Velké písmeno latinky Y s vokáněm", 373: "Malé písmeno latinky w s vokáněm", 375: "Malé písmeno latinky y s vokáněm", sbquo: "Dolní 9 uvozovka jednoduchá",
+ 8219: "Horní obrácená 9 uvozovka jednoduchá", bdquo: "Dolní 9 uvozovka dvojitá", hellip: "Trojtečkový úvod", trade: "Obchodní značka", 9658: "Černý ukazatel směřující vpravo", bull: "Kolečko", rarr: "Šipka vpravo", rArr: "Dvojitá šipka vpravo", hArr: "Dvojitá šipka vlevo a vpravo", diams: "Černé piky", asymp: "Téměř se rovná"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/cy.js b/plugins/specialchar/dialogs/lang/cy.js
new file mode 100755
index 0000000..ccd3013
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/cy.js
@@ -0,0 +1,16 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "cy", {
+ euro: "Arwydd yr Ewro", lsquo: "Dyfynnod chwith unigol", rsquo: "Dyfynnod dde unigol", ldquo: "Dyfynnod chwith dwbl", rdquo: "Dyfynnod dde dwbl", ndash: "Cysylltnod en", mdash: "Cysylltnod em", iexcl: "Ebychnod gwrthdro", cent: "Arwydd sent", pound: "Arwydd punt", curren: "Arwydd arian cyfred", yen: "Arwydd yen", brvbar: "Bar toriedig", sect: "Arwydd adran", uml: "Didolnod", copy: "Arwydd hawlfraint", ordf: "Dangosydd benywaidd", laquo: "Dyfynnod dwbl ar ongl i'r chwith", not: "Arwydd Nid",
+ reg: "Arwydd cofrestredig", macr: "Macron", deg: "Arwydd gradd", sup2: "Dau uwchsgript", sup3: "Tri uwchsgript", acute: "Acen ddyrchafedig", micro: "Arwydd micro", para: "Arwydd pilcrow", middot: "Dot canol", cedil: "Sedila", sup1: "Un uwchsgript", ordm: "Dangosydd gwrywaidd", raquo: "Dyfynnod dwbl ar ongl i'r dde", frac14: "Ffracsiwn cyffredin un cwarter", frac12: "Ffracsiwn cyffredin un hanner", frac34: "Ffracsiwn cyffredin tri chwarter", iquest: "Marc cwestiwn gwrthdroëdig", Agrave: "Priflythyren A Lladinaidd gydag acen ddisgynedig",
+ Aacute: "Priflythyren A Lladinaidd gydag acen ddyrchafedig", Acirc: "Priflythyren A Lladinaidd gydag acen grom", Atilde: "Priflythyren A Lladinaidd gyda thild", Auml: "Priflythyren A Lladinaidd gyda didolnod", Aring: "Priflythyren A Lladinaidd gyda chylch uwchben", AElig: "Priflythyren Æ Lladinaidd", Ccedil: "Priflythyren C Lladinaidd gyda sedila", Egrave: "Priflythyren E Lladinaidd gydag acen ddisgynedig", Eacute: "Priflythyren E Lladinaidd gydag acen ddyrchafedig", Ecirc: "Priflythyren E Lladinaidd gydag acen grom",
+ Euml: "Priflythyren E Lladinaidd gyda didolnod", Igrave: "Priflythyren I Lladinaidd gydag acen ddisgynedig", Iacute: "Priflythyren I Lladinaidd gydag acen ddyrchafedig", Icirc: "Priflythyren I Lladinaidd gydag acen grom", Iuml: "Priflythyren I Lladinaidd gyda didolnod", ETH: "Priflythyren Eth", Ntilde: "Priflythyren N Lladinaidd gyda thild", Ograve: "Priflythyren O Lladinaidd gydag acen ddisgynedig", Oacute: "Priflythyren O Lladinaidd gydag acen ddyrchafedig", Ocirc: "Priflythyren O Lladinaidd gydag acen grom", Otilde: "Priflythyren O Lladinaidd gyda thild",
+ Ouml: "Priflythyren O Lladinaidd gyda didolnod", times: "Arwydd lluosi", Oslash: "Priflythyren O Lladinaidd gyda strôc", Ugrave: "Priflythyren U Lladinaidd gydag acen ddisgynedig", Uacute: "Priflythyren U Lladinaidd gydag acen ddyrchafedig", Ucirc: "Priflythyren U Lladinaidd gydag acen grom", Uuml: "Priflythyren U Lladinaidd gyda didolnod", Yacute: "Priflythyren Y Lladinaidd gydag acen ddyrchafedig", THORN: "Priflythyren Thorn", szlig: "Llythyren s fach Lladinaidd siarp ", agrave: "Llythyren a fach Lladinaidd gydag acen ddisgynedig",
+ aacute: "Llythyren a fach Lladinaidd gydag acen ddyrchafedig", acirc: "Llythyren a fach Lladinaidd gydag acen grom", atilde: "Llythyren a fach Lladinaidd gyda thild", auml: "Llythyren a fach Lladinaidd gyda didolnod", aring: "Llythyren a fach Lladinaidd gyda chylch uwchben", aelig: "Llythyren æ fach Lladinaidd", ccedil: "Llythyren c fach Lladinaidd gyda sedila", egrave: "Llythyren e fach Lladinaidd gydag acen ddisgynedig", eacute: "Llythyren e fach Lladinaidd gydag acen ddyrchafedig", ecirc: "Llythyren e fach Lladinaidd gydag acen grom",
+ euml: "Llythyren e fach Lladinaidd gyda didolnod", igrave: "Llythyren i fach Lladinaidd gydag acen ddisgynedig", iacute: "Llythyren i fach Lladinaidd gydag acen ddyrchafedig", icirc: "Llythyren i fach Lladinaidd gydag acen grom", iuml: "Llythyren i fach Lladinaidd gyda didolnod", eth: "Llythyren eth fach", ntilde: "Llythyren n fach Lladinaidd gyda thild", ograve: "Llythyren o fach Lladinaidd gydag acen ddisgynedig", oacute: "Llythyren o fach Lladinaidd gydag acen ddyrchafedig", ocirc: "Llythyren o fach Lladinaidd gydag acen grom",
+ otilde: "Llythyren o fach Lladinaidd gyda thild", ouml: "Llythyren o fach Lladinaidd gyda didolnod", divide: "Arwydd rhannu", oslash: "Llythyren o fach Lladinaidd gyda strôc", ugrave: "Llythyren u fach Lladinaidd gydag acen ddisgynedig", uacute: "Llythyren u fach Lladinaidd gydag acen ddyrchafedig", ucirc: "Llythyren u fach Lladinaidd gydag acen grom", uuml: "Llythyren u fach Lladinaidd gyda didolnod", yacute: "Llythyren y fach Lladinaidd gydag acen ddisgynedig", thorn: "Llythyren o fach Lladinaidd gyda strôc", yuml: "Llythyren y fach Lladinaidd gyda didolnod",
+ OElig: "Priflythyren cwlwm OE Lladinaidd ", oelig: "Priflythyren cwlwm oe Lladinaidd ", 372: "Priflythyren W gydag acen grom", 374: "Priflythyren Y gydag acen grom", 373: "Llythyren w fach gydag acen grom", 375: "Llythyren y fach gydag acen grom", sbquo: "Dyfynnod sengl 9-isel", 8219: "Dyfynnod sengl 9-uchel cildro", bdquo: "Dyfynnod dwbl 9-isel", hellip: "Coll geiriau llorweddol", trade: "Arwydd marc masnachol", 9658: "Pwyntydd du i'r dde", bull: "Bwled", rarr: "Saeth i'r dde", rArr: "Saeth ddwbl i'r dde", hArr: "Saeth ddwbl i'r chwith",
+ diams: "Siwt diemwnt du", asymp: "Bron yn hafal iddo"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/da.js b/plugins/specialchar/dialogs/lang/da.js
new file mode 100755
index 0000000..a84ae99
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/da.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "da", {
+ euro: "Euro-tegn", lsquo: "Venstre enkelt anførselstegn", rsquo: "Højre enkelt anførselstegn", ldquo: "Venstre dobbelt anførselstegn", rdquo: "Højre dobbelt anførselstegn", ndash: "Bindestreg", mdash: "Tankestreg", iexcl: "Omvendt udråbstegn", cent: "Cent-tegn", pound: "Pund-tegn", curren: "Kurs-tegn", yen: "Yen-tegn", brvbar: "Brudt streg", sect: "Paragraftegn", uml: "Umlaut", copy: "Copyright-tegn", ordf: "Feminin ordinal indikator", laquo: "Venstre dobbel citations-vinkel", not: "Negation",
+ reg: "Registreret varemærke tegn", macr: "Macron", deg: "Grad-tegn", sup2: "Superscript to", sup3: "Superscript tre", acute: "Prim-tegn", micro: "Mikro-tegn", para: "Pilcrow-tegn", middot: "Punkt-tegn", cedil: "Cedille", sup1: "Superscript et", ordm: "Maskulin ordinal indikator", raquo: "Højre dobbel citations-vinkel", frac14: "En fjerdedel", frac12: "En halv", frac34: "En tredjedel", iquest: "Omvendt udråbstegn", Agrave: "Stort A med accent grave", Aacute: "Stort A med accent aigu", Acirc: "Stort A med cirkumfleks", Atilde: "Stort A med tilde",
+ Auml: "Stort A med umlaut", Aring: "Stort Å", AElig: "Latin capital letter Æ", Ccedil: "Stort C med cedille", Egrave: "Stort E med accent grave", Eacute: "Stort E med accent aigu", Ecirc: "Stort E med cirkumfleks", Euml: "Stort E med umlaut", Igrave: "Stort I med accent grave", Iacute: "Stort I med accent aigu", Icirc: "Stort I med cirkumfleks", Iuml: "Stort I med umlaut", ETH: "Stort Ð (edd)", Ntilde: "Stort N med tilde", Ograve: "Stort O med accent grave", Oacute: "Stort O med accent aigu", Ocirc: "Stort O med cirkumfleks", Otilde: "Stort O med tilde",
+ Ouml: "Stort O med umlaut", times: "Gange-tegn", Oslash: "Stort Ø", Ugrave: "Stort U med accent grave", Uacute: "Stort U med accent aigu", Ucirc: "Stort U med cirkumfleks", Uuml: "Stort U med umlaut", Yacute: "Stort Y med accent aigu", THORN: "Stort Thorn", szlig: "Lille eszett", agrave: "Lille a med accent grave", aacute: "Lille a med accent aigu", acirc: "Lille a med cirkumfleks", atilde: "Lille a med tilde", auml: "Lille a med umlaut", aring: "Lilla å", aelig: "Lille æ", ccedil: "Lille c med cedille", egrave: "Lille e med accent grave",
+ eacute: "Lille e med accent aigu", ecirc: "Lille e med cirkumfleks", euml: "Lille e med umlaut", igrave: "Lille i med accent grave", iacute: "Lille i med accent aigu", icirc: "Lille i med cirkumfleks", iuml: "Lille i med umlaut", eth: "Lille ð (edd)", ntilde: "Lille n med tilde", ograve: "Lille o med accent grave", oacute: "Lille o med accent aigu", ocirc: "Lille o med cirkumfleks", otilde: "Lille o med tilde", ouml: "Lille o med umlaut", divide: "Divisions-tegn", oslash: "Lille ø", ugrave: "Lille u med accent grave", uacute: "Lille u med accent aigu",
+ ucirc: "Lille u med cirkumfleks", uuml: "Lille u med umlaut", yacute: "Lille y med accent aigu", thorn: "Lille thorn", yuml: "Lille y med umlaut", OElig: "Stort Æ", oelig: "Lille æ", 372: "Stort W med cirkumfleks", 374: "Stort Y med cirkumfleks", 373: "Lille w med cirkumfleks", 375: "Lille y med cirkumfleks", sbquo: "Lavt enkelt 9-komma citationstegn", 8219: "Højt enkelt 9-komma citationstegn", bdquo: "Dobbelt 9-komma citationstegn", hellip: "Tre horizontale prikker", trade: "Varemærke-tegn", 9658: "Sort højre pil", bull: "Punkt",
+ rarr: "Højre pil", rArr: "Højre dobbelt pil", hArr: "Venstre højre dobbelt pil", diams: "Sort diamant", asymp: "Næsten lig med"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/de-ch.js b/plugins/specialchar/dialogs/lang/de-ch.js
new file mode 100755
index 0000000..94d96f6
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/de-ch.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "de-ch", {
+ euro: "Euro Zeichen", lsquo: "Hochkomma links", rsquo: "Hochkomma rechts", ldquo: "Anführungszeichen links", rdquo: "Anführungszeichen rechts", ndash: "Kleiner Strich", mdash: "Mittlerer Strich", iexcl: "Invertiertes Ausrufezeichen", cent: "Cent-Zeichen", pound: "Pfund-Zeichen", curren: "Währungszeichen", yen: "Yen", brvbar: "Gestrichelte Linie", sect: "Paragrafenzeichen", uml: "Diäresis", copy: "Copyright-Zeichen", ordf: "Feminine ordinal Anzeige", laquo: "Nach links zeigenden Doppel-Winkel Anführungszeichen",
+ not: "Not-Zeichen", reg: "Registriert-Zeichen", macr: "Längezeichen", deg: "Grad-Zeichen", sup2: "Hoch 2", sup3: "Hoch 3", acute: "Akzentzeichen ", micro: "Mikro-Zeichen", para: "Pilcrow-Zeichen", middot: "Mittelpunkt", cedil: "Cedilla", sup1: "Hoch 1", ordm: "Männliche Ordnungszahl Anzeige", raquo: "Nach rechts zeigenden Doppel-Winkel Anführungszeichen", frac14: "ein Viertel", frac12: "Hälfte", frac34: "Dreiviertel", iquest: "Umgekehrtes Fragezeichen", Agrave: "Lateinischer Buchstabe A mit AkzentGrave", Aacute: "Lateinischer Buchstabe A mit Akutakzent",
+ Acirc: "Lateinischer Buchstabe A mit Zirkumflex", Atilde: "Lateinischer Buchstabe A mit Tilde", Auml: "Lateinischer Buchstabe A mit Trema", Aring: "Lateinischer Buchstabe A mit Ring oben", AElig: "Lateinischer Buchstabe Æ", Ccedil: "Lateinischer Buchstabe C mit Cedille", Egrave: "Lateinischer Buchstabe E mit AkzentGrave", Eacute: "Lateinischer Buchstabe E mit Akutakzent", Ecirc: "Lateinischer Buchstabe E mit Zirkumflex", Euml: "Lateinischer Buchstabe E Trema", Igrave: "Lateinischer Buchstabe I mit AkzentGrave", Iacute: "Lateinischer Buchstabe I mit Akutakzent",
+ Icirc: "Lateinischer Buchstabe I mit Zirkumflex", Iuml: "Lateinischer Buchstabe I mit Trema", ETH: "Lateinischer Buchstabe Eth", Ntilde: "Lateinischer Buchstabe N mit Tilde", Ograve: "Lateinischer Buchstabe O mit AkzentGrave", Oacute: "Lateinischer Buchstabe O mit Akutakzent", Ocirc: "Lateinischer Buchstabe O mit Zirkumflex", Otilde: "Lateinischer Buchstabe O mit Tilde", Ouml: "Lateinischer Buchstabe O mit Trema", times: "Multiplikation", Oslash: "Lateinischer Buchstabe O durchgestrichen", Ugrave: "Lateinischer Buchstabe U mit Akzentgrave",
+ Uacute: "Lateinischer Buchstabe U mit Akutakzent", Ucirc: "Lateinischer Buchstabe U mit Zirkumflex", Uuml: "Lateinischer Buchstabe a mit Trema", Yacute: "Lateinischer Buchstabe a mit Akzent", THORN: "Lateinischer Buchstabe mit Dorn", szlig: "Kleiner lateinischer Buchstabe scharfe s", agrave: "Kleiner lateinischer Buchstabe a mit Accent grave", aacute: "Kleiner lateinischer Buchstabe a mit Akut", acirc: "Lateinischer Buchstabe a mit Zirkumflex", atilde: "Lateinischer Buchstabe a mit Tilde", auml: "Kleiner lateinischer Buchstabe a mit Trema",
+ aring: "Kleiner lateinischer Buchstabe a mit Ring oben", aelig: "Lateinischer Buchstabe æ", ccedil: "Kleiner lateinischer Buchstabe c mit Cedille", egrave: "Kleiner lateinischer Buchstabe e mit Accent grave", eacute: "Kleiner lateinischer Buchstabe e mit Akut", ecirc: "Kleiner lateinischer Buchstabe e mit Zirkumflex", euml: "Kleiner lateinischer Buchstabe e mit Trema", igrave: "Kleiner lateinischer Buchstabe i mit AkzentGrave", iacute: "Kleiner lateinischer Buchstabe i mit Akzent", icirc: "Kleiner lateinischer Buchstabe i mit Zirkumflex",
+ iuml: "Kleiner lateinischer Buchstabe i mit Trema", eth: "Kleiner lateinischer Buchstabe eth", ntilde: "Kleiner lateinischer Buchstabe n mit Tilde", ograve: "Kleiner lateinischer Buchstabe o mit Accent grave", oacute: "Kleiner lateinischer Buchstabe o mit Akzent", ocirc: "Kleiner lateinischer Buchstabe o mit Zirkumflex", otilde: "Lateinischer Buchstabe i mit Tilde", ouml: "Kleiner lateinischer Buchstabe o mit Trema", divide: "Divisionszeichen", oslash: "Kleiner lateinischer Buchstabe o durchgestrichen", ugrave: "Kleiner lateinischer Buchstabe u mit Accent grave",
+ uacute: "Kleiner lateinischer Buchstabe u mit Akut", ucirc: "Kleiner lateinischer Buchstabe u mit Zirkumflex", uuml: "Kleiner lateinischer Buchstabe u mit Trema", yacute: "Kleiner lateinischer Buchstabe y mit Akut", thorn: "Kleiner lateinischer Buchstabe Dorn", yuml: "Kleiner lateinischer Buchstabe y mit Trema", OElig: "Lateinischer Buchstabe Ligatur OE", oelig: "Kleiner lateinischer Buchstabe Ligatur OE", 372: "Lateinischer Buchstabe W mit Zirkumflex", 374: "Lateinischer Buchstabe Y mit Zirkumflex", 373: "Kleiner lateinischer Buchstabe w mit Zirkumflex",
+ 375: "Kleiner lateinischer Buchstabe y mit Zirkumflex", sbquo: "Tiefergestelltes Komma", 8219: "Rumgedrehtes Komma", bdquo: "Doppeltes Anführungszeichen unten", hellip: "horizontale Auslassungspunkte", trade: "Handelszeichen", 9658: "Dreickspfeil rechts", bull: "Bullet", rarr: "Pfeil rechts", rArr: "Doppelpfeil rechts", hArr: "Doppelpfeil links", diams: "Karo", asymp: "Ungefähr"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/de.js b/plugins/specialchar/dialogs/lang/de.js
new file mode 100755
index 0000000..4e2b030
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/de.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "de", {
+ euro: "Euro Zeichen", lsquo: "Hochkomma links", rsquo: "Hochkomma rechts", ldquo: "Anführungszeichen links", rdquo: "Anführungszeichen rechts", ndash: "Kleiner Strich", mdash: "Mittlerer Strich", iexcl: "Invertiertes Ausrufezeichen", cent: "Cent-Zeichen", pound: "Pfund-Zeichen", curren: "Währungszeichen", yen: "Yen", brvbar: "Gestrichelte Linie", sect: "Paragrafenzeichen", uml: "Diäresis", copy: "Copyright-Zeichen", ordf: "Feminine ordinal Anzeige", laquo: "Nach links zeigenden Doppel-Winkel Anführungszeichen",
+ not: "Not-Zeichen", reg: "Registriert-Zeichen", macr: "Längezeichen", deg: "Grad-Zeichen", sup2: "Hoch 2", sup3: "Hoch 3", acute: "Akzentzeichen ", micro: "Mikro-Zeichen", para: "Pilcrow-Zeichen", middot: "Mittelpunkt", cedil: "Cedilla", sup1: "Hoch 1", ordm: "Männliche Ordnungszahl Anzeige", raquo: "Nach rechts zeigenden Doppel-Winkel Anführungszeichen", frac14: "ein Viertel", frac12: "Hälfte", frac34: "Dreiviertel", iquest: "Umgekehrtes Fragezeichen", Agrave: "Lateinischer Buchstabe A mit AkzentGrave", Aacute: "Lateinischer Buchstabe A mit Akutakzent",
+ Acirc: "Lateinischer Buchstabe A mit Zirkumflex", Atilde: "Lateinischer Buchstabe A mit Tilde", Auml: "Lateinischer Buchstabe A mit Trema", Aring: "Lateinischer Buchstabe A mit Ring oben", AElig: "Lateinischer Buchstabe Æ", Ccedil: "Lateinischer Buchstabe C mit Cedille", Egrave: "Lateinischer Buchstabe E mit AkzentGrave", Eacute: "Lateinischer Buchstabe E mit Akutakzent", Ecirc: "Lateinischer Buchstabe E mit Zirkumflex", Euml: "Lateinischer Buchstabe E Trema", Igrave: "Lateinischer Buchstabe I mit AkzentGrave", Iacute: "Lateinischer Buchstabe I mit Akutakzent",
+ Icirc: "Lateinischer Buchstabe I mit Zirkumflex", Iuml: "Lateinischer Buchstabe I mit Trema", ETH: "Lateinischer Buchstabe Eth", Ntilde: "Lateinischer Buchstabe N mit Tilde", Ograve: "Lateinischer Buchstabe O mit AkzentGrave", Oacute: "Lateinischer Buchstabe O mit Akutakzent", Ocirc: "Lateinischer Buchstabe O mit Zirkumflex", Otilde: "Lateinischer Buchstabe O mit Tilde", Ouml: "Lateinischer Buchstabe O mit Trema", times: "Multiplikation", Oslash: "Lateinischer Buchstabe O durchgestrichen", Ugrave: "Lateinischer Buchstabe U mit Akzentgrave",
+ Uacute: "Lateinischer Buchstabe U mit Akutakzent", Ucirc: "Lateinischer Buchstabe U mit Zirkumflex", Uuml: "Lateinischer Buchstabe a mit Trema", Yacute: "Lateinischer Buchstabe a mit Akzent", THORN: "Lateinischer Buchstabe mit Dorn", szlig: "Kleiner lateinischer Buchstabe scharfe s", agrave: "Kleiner lateinischer Buchstabe a mit Accent grave", aacute: "Kleiner lateinischer Buchstabe a mit Akut", acirc: "Lateinischer Buchstabe a mit Zirkumflex", atilde: "Lateinischer Buchstabe a mit Tilde", auml: "Kleiner lateinischer Buchstabe a mit Trema",
+ aring: "Kleiner lateinischer Buchstabe a mit Ring oben", aelig: "Lateinischer Buchstabe æ", ccedil: "Kleiner lateinischer Buchstabe c mit Cedille", egrave: "Kleiner lateinischer Buchstabe e mit Accent grave", eacute: "Kleiner lateinischer Buchstabe e mit Akut", ecirc: "Kleiner lateinischer Buchstabe e mit Zirkumflex", euml: "Kleiner lateinischer Buchstabe e mit Trema", igrave: "Kleiner lateinischer Buchstabe i mit AkzentGrave", iacute: "Kleiner lateinischer Buchstabe i mit Akzent", icirc: "Kleiner lateinischer Buchstabe i mit Zirkumflex",
+ iuml: "Kleiner lateinischer Buchstabe i mit Trema", eth: "Kleiner lateinischer Buchstabe eth", ntilde: "Kleiner lateinischer Buchstabe n mit Tilde", ograve: "Kleiner lateinischer Buchstabe o mit Accent grave", oacute: "Kleiner lateinischer Buchstabe o mit Akzent", ocirc: "Kleiner lateinischer Buchstabe o mit Zirkumflex", otilde: "Lateinischer Buchstabe i mit Tilde", ouml: "Kleiner lateinischer Buchstabe o mit Trema", divide: "Divisionszeichen", oslash: "Kleiner lateinischer Buchstabe o durchgestrichen", ugrave: "Kleiner lateinischer Buchstabe u mit Accent grave",
+ uacute: "Kleiner lateinischer Buchstabe u mit Akut", ucirc: "Kleiner lateinischer Buchstabe u mit Zirkumflex", uuml: "Kleiner lateinischer Buchstabe u mit Trema", yacute: "Kleiner lateinischer Buchstabe y mit Akut", thorn: "Kleiner lateinischer Buchstabe Dorn", yuml: "Kleiner lateinischer Buchstabe y mit Trema", OElig: "Lateinischer Buchstabe Ligatur OE", oelig: "Kleiner lateinischer Buchstabe Ligatur OE", 372: "Lateinischer Buchstabe W mit Zirkumflex", 374: "Lateinischer Buchstabe Y mit Zirkumflex", 373: "Kleiner lateinischer Buchstabe w mit Zirkumflex",
+ 375: "Kleiner lateinischer Buchstabe y mit Zirkumflex", sbquo: "Tiefergestelltes Komma", 8219: "Rumgedrehtes Komma", bdquo: "Doppeltes Anführungszeichen unten", hellip: "horizontale Auslassungspunkte", trade: "Handelszeichen", 9658: "Dreickspfeil rechts", bull: "Bullet", rarr: "Pfeil rechts", rArr: "Doppelpfeil rechts", hArr: "Doppelpfeil links", diams: "Karo", asymp: "Ungefähr"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/el.js b/plugins/specialchar/dialogs/lang/el.js
new file mode 100755
index 0000000..c7a0c46
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/el.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "el", {
+ euro: "Σύμβολο Ευρώ", lsquo: "Αριστερός χαρακτήρας μονού εισαγωγικού", rsquo: "Δεξιός χαρακτήρας μονού εισαγωγικού", ldquo: "Αριστερός χαρακτήρας ευθύγραμμων εισαγωγικών", rdquo: "Δεξιός χαρακτήρας ευθύγραμμων εισαγωγικών", ndash: "Παύλα en", mdash: "Παύλα em", iexcl: "Ανάποδο θαυμαστικό", cent: "Σύμβολο σεντ", pound: "Σύμβολο λίρας", curren: "Σύμβολο συναλλαγματικής μονάδας", yen: "Σύμβολο Γιεν", brvbar: "Σπασμένη μπάρα", sect: "Σύμβολο τμήματος", uml: "Διαίρεση", copy: "Σύμβολο πνευματικών δικαιωμάτων",
+ ordf: "Θηλυκός τακτικός δείκτης", laquo: "Γωνιώδη εισαγωγικά αριστερής κατάδειξης", not: "Σύμβολο άρνησης", reg: "Σύμβολο σημάτων κατατεθέν", macr: "Μακρόν", deg: "Σύμβολο βαθμού", sup2: "Εκτεθειμένο δύο", sup3: "Εκτεθειμένο τρία", acute: "Οξεία", micro: "Σύμβολο μικρού", para: "Σύμβολο παραγράφου", middot: "Μέση τελεία", cedil: "Υπογεγραμμένη", sup1: "Εκτεθειμένο ένα", ordm: "Αρσενικός τακτικός δείκτης", raquo: "Γωνιώδη εισαγωγικά δεξιάς κατάδειξης", frac14: "Γνήσιο κλάσμα ενός τετάρτου", frac12: "Γνήσιο κλάσμα ενός δεύτερου", frac34: "Γνήσιο κλάσμα τριών τετάρτων",
+ iquest: "Ανάποδο θαυμαστικό", Agrave: "Λατινικό κεφαλαίο γράμμα A με βαρεία", Aacute: "Λατινικό κεφαλαίο γράμμα A με οξεία", Acirc: "Λατινικό κεφαλαίο γράμμα A με περισπωμένη", Atilde: "Λατινικό κεφαλαίο γράμμα A με περισπωμένη", Auml: "Λατινικό κεφαλαίο γράμμα A με διαλυτικά", Aring: "Λατινικό κεφαλαίο γράμμα A με δακτύλιο επάνω", AElig: "Λατινικό κεφαλαίο γράμμα Æ", Ccedil: "Λατινικό κεφαλαίο γράμμα C με υπογεγραμμένη", Egrave: "Λατινικό κεφαλαίο γράμμα E με βαρεία", Eacute: "Λατινικό κεφαλαίο γράμμα E με οξεία", Ecirc: "Λατινικό κεφαλαίο γράμμα Ε με περισπωμένη ",
+ Euml: "Λατινικό κεφαλαίο γράμμα Ε με διαλυτικά", Igrave: "Λατινικό κεφαλαίο γράμμα I με βαρεία", Iacute: "Λατινικό κεφαλαίο γράμμα I με οξεία", Icirc: "Λατινικό κεφαλαίο γράμμα I με περισπωμένη", Iuml: "Λατινικό κεφαλαίο γράμμα I με διαλυτικά ", ETH: "Λατινικό κεφαλαίο γράμμα Eth", Ntilde: "Λατινικό κεφαλαίο γράμμα N με περισπωμένη", Ograve: "Λατινικό κεφαλαίο γράμμα O με βαρεία", Oacute: "Λατινικό κεφαλαίο γράμμα O με οξεία", Ocirc: "Λατινικό κεφαλαίο γράμμα O με περισπωμένη ", Otilde: "Λατινικό κεφαλαίο γράμμα O με περισπωμένη",
+ Ouml: "Λατινικό κεφαλαίο γράμμα O με διαλυτικά", times: "Σύμβολο πολλαπλασιασμού", Oslash: "Λατινικό κεφαλαίο γράμμα O με μολυβιά", Ugrave: "Λατινικό κεφαλαίο γράμμα U με βαρεία", Uacute: "Λατινικό κεφαλαίο γράμμα U με οξεία", Ucirc: "Λατινικό κεφαλαίο γράμμα U με περισπωμένη", Uuml: "Λατινικό κεφαλαίο γράμμα U με διαλυτικά", Yacute: "Λατινικό κεφαλαίο γράμμα Y με οξεία", THORN: "Λατινικό κεφαλαίο γράμμα Thorn", szlig: "Λατινικό μικρό γράμμα απότομο s", agrave: "Λατινικό μικρό γράμμα a με βαρεία", aacute: "Λατινικό μικρό γράμμα a με οξεία",
+ acirc: "Λατινικό μικρό γράμμα a με περισπωμένη", atilde: "Λατινικό μικρό γράμμα a με περισπωμένη", auml: "Λατινικό μικρό γράμμα a με διαλυτικά", aring: "Λατινικό μικρό γράμμα a με δακτύλιο πάνω", aelig: "Λατινικό μικρό γράμμα æ", ccedil: "Λατινικό μικρό γράμμα c με υπογεγραμμένη", egrave: "Λατινικό μικρό γράμμα ε με βαρεία", eacute: "Λατινικό μικρό γράμμα e με οξεία", ecirc: "Λατινικό μικρό γράμμα e με περισπωμένη", euml: "Λατινικό μικρό γράμμα e με διαλυτικά", igrave: "Λατινικό μικρό γράμμα i με βαρεία", iacute: "Λατινικό μικρό γράμμα i με οξεία",
+ icirc: "Λατινικό μικρό γράμμα i με περισπωμένη", iuml: "Λατινικό μικρό γράμμα i με διαλυτικά", eth: "Λατινικό μικρό γράμμα eth", ntilde: "Λατινικό μικρό γράμμα n με περισπωμένη", ograve: "Λατινικό μικρό γράμμα o με βαρεία", oacute: "Λατινικό μικρό γράμμα o με οξεία ", ocirc: "Λατινικό πεζό γράμμα o με περισπωμένη", otilde: "Λατινικό μικρό γράμμα o με περισπωμένη ", ouml: "Λατινικό μικρό γράμμα o με διαλυτικά", divide: "Σύμβολο διαίρεσης", oslash: "Λατινικό μικρό γράμμα o με περισπωμένη", ugrave: "Λατινικό μικρό γράμμα u με βαρεία",
+ uacute: "Λατινικό μικρό γράμμα u με οξεία", ucirc: "Λατινικό μικρό γράμμα u με περισπωμένη", uuml: "Λατινικό μικρό γράμμα u με διαλυτικά", yacute: "Λατινικό μικρό γράμμα y με οξεία", thorn: "Λατινικό μικρό γράμμα thorn", yuml: "Λατινικό μικρό γράμμα y με διαλυτικά", OElig: "Λατινικό κεφαλαίο σύμπλεγμα ΟΕ", oelig: "Λατινικό μικρό σύμπλεγμα oe", 372: "Λατινικό κεφαλαίο γράμμα W με περισπωμένη", 374: "Λατινικό κεφαλαίο γράμμα Y με περισπωμένη", 373: "Λατινικό μικρό γράμμα w με περισπωμένη", 375: "Λατινικό μικρό γράμμα y με περισπωμένη",
+ sbquo: "Ενιαίο χαμηλο -9 εισαγωγικό ", 8219: "Ενιαίο υψηλο ανεστραμμένο-9 εισαγωγικό ", bdquo: "Διπλό χαμηλό-9 εισαγωγικό ", hellip: "Οριζόντια αποσιωπητικά", trade: "Σύμβολο εμπορικού κατατεθέν", 9658: "Μαύρος δείκτης που δείχνει προς τα δεξιά", bull: "Κουκκίδα", rarr: "Δεξί βελάκι", rArr: "Διπλό δεξί βελάκι", hArr: "Διπλό βελάκι αριστερά-δεξιά", diams: "Μαύρο διαμάντι", asymp: "Σχεδόν ίσο με"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/en-au.js b/plugins/specialchar/dialogs/lang/en-au.js
new file mode 100755
index 0000000..3bba46b
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/en-au.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","en-au",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/en-ca.js b/plugins/specialchar/dialogs/lang/en-ca.js
new file mode 100755
index 0000000..82e69ea
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/en-ca.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "en-ca", {
+ euro: "Euro sign", lsquo: "Left single quotation mark", rsquo: "Right single quotation mark", ldquo: "Left double quotation mark", rdquo: "Right double quotation mark", ndash: "En dash", mdash: "Em dash", iexcl: "Inverted exclamation mark", cent: "Cent sign", pound: "Pound sign", curren: "Currency sign", yen: "Yen sign", brvbar: "Broken bar", sect: "Section sign", uml: "Diaeresis", copy: "Copyright sign", ordf: "Feminine ordinal indicator", laquo: "Left-pointing double angle quotation mark",
+ not: "Not sign", reg: "Registered sign", macr: "Macron", deg: "Degree sign", sup2: "Superscript two", sup3: "Superscript three", acute: "Acute accent", micro: "Micro sign", para: "Pilcrow sign", middot: "Middle dot", cedil: "Cedilla", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis",
+ aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth",
+ ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Division sign", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis",
+ yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis",
+ trade: "Trade mark sign", 9658: "Black right-pointing pointer", bull: "Bullet", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Almost equal to"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/en-gb.js b/plugins/specialchar/dialogs/lang/en-gb.js
new file mode 100755
index 0000000..4853b56
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/en-gb.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","en-gb",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/en.js b/plugins/specialchar/dialogs/lang/en.js
new file mode 100755
index 0000000..966ea63
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/en.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "en", {
+ euro: "Euro sign", lsquo: "Left single quotation mark", rsquo: "Right single quotation mark", ldquo: "Left double quotation mark", rdquo: "Right double quotation mark", ndash: "En dash", mdash: "Em dash", iexcl: "Inverted exclamation mark", cent: "Cent sign", pound: "Pound sign", curren: "Currency sign", yen: "Yen sign", brvbar: "Broken bar", sect: "Section sign", uml: "Diaeresis", copy: "Copyright sign", ordf: "Feminine ordinal indicator", laquo: "Left-pointing double angle quotation mark",
+ not: "Not sign", reg: "Registered sign", macr: "Macron", deg: "Degree sign", sup2: "Superscript two", sup3: "Superscript three", acute: "Acute accent", micro: "Micro sign", para: "Pilcrow sign", middot: "Middle dot", cedil: "Cedilla", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis",
+ aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth",
+ ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Division sign", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis",
+ yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis",
+ trade: "Trade mark sign", 9658: "Black right-pointing pointer", bull: "Bullet", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Almost equal to"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/eo.js b/plugins/specialchar/dialogs/lang/eo.js
new file mode 100755
index 0000000..f64714b
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/eo.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","eo",{euro:"Eŭrosigno",lsquo:"Supra 6-citilo",rsquo:"Supra 9-citilo",ldquo:"Supra 66-citilo",rdquo:"Supra 99-citilo",ndash:"Streketo",mdash:"Substreko",iexcl:"Renversita krisigno",cent:"Cendosigno",pound:"Pundosigno",curren:"Monersigno",yen:"Enosigno",brvbar:"Rompita vertikala streko",sect:"Kurba paragrafo",uml:"Tremao",copy:"Kopirajtosigno",ordf:"Adjektiva numerfinaĵo",laquo:"Duobla malplio-citilo",not:"Negohoko",reg:"Registrita marko",macr:"Superstreko",deg:"Gradosigno",
+sup2:"Supra indico 2",sup3:"Supra indico 3",acute:"Dekstra korno",micro:"Mikrosigno",para:"Rekta paragrafo",middot:"Meza punkto",cedil:"Zoeto",sup1:"Supra indico 1",ordm:"Substantiva numerfinaĵo",raquo:"Duobla plio-citilo",frac14:"Kvaronosigno",frac12:"Duonosigno",frac34:"Trikvaronosigno",iquest:"renversita demandosigno",Agrave:"Latina ĉeflitero A kun liva korno",Aacute:"Latina ĉeflitero A kun dekstra korno",Acirc:"Latina ĉeflitero A kun ĉapelo",Atilde:"Latina ĉeflitero A kun tildo",Auml:"Latina ĉeflitero A kun tremao",
+Aring:"Latina ĉeflitero A kun superringo",AElig:"Latina ĉeflitera ligaturo Æ",Ccedil:"Latina ĉeflitero C kun zoeto",Egrave:"Latina ĉeflitero E kun liva korno",Eacute:"Latina ĉeflitero E kun dekstra korno",Ecirc:"Latina ĉeflitero E kun ĉapelo",Euml:"Latina ĉeflitero E kun tremao",Igrave:"Latina ĉeflitero I kun liva korno",Iacute:"Latina ĉeflitero I kun dekstra korno",Icirc:"Latina ĉeflitero I kun ĉapelo",Iuml:"Latina ĉeflitero I kun tremao",ETH:"Latina ĉeflitero islanda edo",Ntilde:"Latina ĉeflitero N kun tildo",
+Ograve:"Latina ĉeflitero O kun liva korno",Oacute:"Latina ĉeflitero O kun dekstra korno",Ocirc:"Latina ĉeflitero O kun ĉapelo",Otilde:"Latina ĉeflitero O kun tildo",Ouml:"Latina ĉeflitero O kun tremao",times:"Multipliko",Oslash:"Latina ĉeflitero O trastrekita",Ugrave:"Latina ĉeflitero U kun liva korno",Uacute:"Latina ĉeflitero U kun dekstra korno",Ucirc:"Latina ĉeflitero U kun ĉapelo",Uuml:"Latina ĉeflitero U kun tremao",Yacute:"Latina ĉeflitero Y kun dekstra korno",THORN:"Latina ĉeflitero islanda dorno",
+szlig:"Latina etlitero germana sozo (akra s)",agrave:"Latina etlitero a kun liva korno",aacute:"Latina etlitero a kun dekstra korno",acirc:"Latina etlitero a kun ĉapelo",atilde:"Latina etlitero a kun tildo",auml:"Latina etlitero a kun tremao",aring:"Latina etlitero a kun superringo",aelig:"Latina etlitera ligaturo æ",ccedil:"Latina etlitero c kun zoeto",egrave:"Latina etlitero e kun liva korno",eacute:"Latina etlitero e kun dekstra korno",ecirc:"Latina etlitero e kun ĉapelo",euml:"Latina etlitero e kun tremao",
+igrave:"Latina etlitero i kun liva korno",iacute:"Latina etlitero i kun dekstra korno",icirc:"Latina etlitero i kun ĉapelo",iuml:"Latina etlitero i kun tremao",eth:"Latina etlitero islanda edo",ntilde:"Latina etlitero n kun tildo",ograve:"Latina etlitero o kun liva korno",oacute:"Latina etlitero o kun dekstra korno",ocirc:"Latina etlitero o kun ĉapelo",otilde:"Latina etlitero o kun tildo",ouml:"Latina etlitero o kun tremao",divide:"Dividosigno",oslash:"Latina etlitero o trastrekita",ugrave:"Latina etlitero u kun liva korno",
+uacute:"Latina etlitero u kun dekstra korno",ucirc:"Latina etlitero u kun ĉapelo",uuml:"Latina etlitero u kun tremao",yacute:"Latina etlitero y kun dekstra korno",thorn:"Latina etlitero islanda dorno",yuml:"Latina etlitero y kun tremao",OElig:"Latina ĉeflitera ligaturo Œ",oelig:"Latina etlitera ligaturo œ",372:"Latina ĉeflitero W kun ĉapelo",374:"Latina ĉeflitero Y kun ĉapelo",373:"Latina etlitero w kun ĉapelo",375:"Latina etlitero y kun ĉapelo",sbquo:"Suba 9-citilo",8219:"Supra renversita 9-citilo",
+bdquo:"Suba 99-citilo",hellip:"Tripunkto",trade:"Varmarka signo",9658:"Nigra sago dekstren",bull:"Bulmarko",rarr:"Sago dekstren",rArr:"Duobla sago dekstren",hArr:"Duobla sago maldekstren",diams:"Nigra kvadrato",asymp:"Preskaŭ egala"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/es-mx.js b/plugins/specialchar/dialogs/lang/es-mx.js
new file mode 100755
index 0000000..d84c2da
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/es-mx.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "es-mx", {
+ euro: "Signo de Euro", lsquo: "Comillas simple izquierda", rsquo: "Comillas simple derecha", ldquo: "Comillas dobles izquierda", rdquo: "Comillas dobles derecha", ndash: "Guión corto", mdash: "Guión largo", iexcl: "Signo de exclamación invertido", cent: "Signo de centavo", pound: "Signo de Libra", curren: "Signo de moneda", yen: "Signo de Yen", brvbar: "Barra rota", sect: "Signo de la sección", uml: "Diéresis", copy: "Signo de Derechos reservados", ordf: "Indicador ordinal femenino",
+ laquo: "Señal de doble ángulo hacia la izquierda", not: "Sin signo", reg: "Signo registrado", macr: "Macron", deg: "signo de grados", sup2: "Superíndice dos", sup3: "Superíndice tres", acute: "Acento agudo", micro: "Signo micro", para: "Signo pilcrow", middot: "Punto medio", cedil: "Cedilla", sup1: "Superíndice uno", ordm: "Indicador ordinal masculino", raquo: "Señal de doble ángulo hacia la derecha", frac14: "Fracción un cuarto", frac12: "Fracción medio", frac34: "Fracción tres cuartos", iquest: "Signo de interrogación invertido", Agrave: "Letra mayúscula latina A con acento grave",
+ Aacute: "Letra mayúscula latina A con acento agudo", Acirc: "Letra mayúscula latina A con circunflexo", Atilde: "Letra mayúscula latina A con tilde", Auml: "Letra mayúscula latina A con diéresis", Aring: "Letra mayúscula latina A con anillo arriba", AElig: "Letra mayúscula latina Æ", Ccedil: "Letra mayúscula latina C con cedilla", Egrave: "Letra mayúscula latina E con acento grave", Eacute: "Letra mayúscula latina E con acento agudo", Ecirc: "Letra mayúscula latina E con circumflex", Euml: "Letra mayúscula latina E con diéresis",
+ Igrave: "Letra mayúscula latina I con acento grave", Iacute: "Letra mayúscula latina I con acento agudo", Icirc: "Letra mayúscula latina I con circumflex", Iuml: "Letra mayúscula latina E con diéresis", ETH: "Letra mayúscula latina Eth", Ntilde: "Letra mayúscula latina N con tilde", Ograve: "Letra mayúscula latina O con acento grave", Oacute: "Letra mayúscula latina O con acento agudo", Ocirc: "Letra mayúscula latina O con circumflex", Otilde: "Letra mayúscula latina O con tilde", Ouml: "Letra mayúscula latina O con diéresis",
+ times: "Signo de multiplicación", Oslash: "Letra mayúscula latina O con trazo", Ugrave: "Letra mayúscula latina U con acento grave", Uacute: "Letra mayúscula latina U con acento agudo", Ucirc: "Letra mayúscula latina U con circumflex", Uuml: "Letra mayúscula latina U con diéresis", Yacute: "Letra mayúscula latina Y con acento agudo", THORN: "Letra mayúscula latina Thorn", szlig: "Letra pequeña latina s", agrave: "Letra pequeña latina a con acento grave", aacute: "Letra pequeña latina a con acento agudo", acirc: "Letra pequeña latina a con circumflex",
+ atilde: "Letra pequeña latina a con tilde", auml: "Letra pequeña latina a con diéresis", aring: "Letra pequeña latina a con anillo arriba", aelig: "Letra pequeña latina æ", ccedil: "Letra pequeña latina c con cedilla", egrave: "Letra pequeña latina e con acento grave", eacute: "Letra pequeña latina e con acento agudo", ecirc: "Letra pequeña latina e con circumflex", euml: "Letra pequeña latina e con diéresis", igrave: "Letra pequeña latina i con acento grave", iacute: "Letra pequeña latina i con acento agudo", icirc: "Letra pequeña latina i con circumflex",
+ iuml: "Letra pequeña latina i con diéresis", eth: "Letra pequeña latina eth", ntilde: "Letra pequeña latina n con tilde", ograve: "Letra pequeña latina o con acento grave", oacute: "Letra pequeña latina o con acento agudo", ocirc: "Letra pequeña latina o con circumflex", otilde: "Letra pequeña latina o con tilde", ouml: "Letra pequeña latina o con diéresis", divide: "Signo de división", oslash: "Letra pequeña latina o con trazo", ugrave: "Letra pequeña latina u con acento grave", uacute: "Letra pequeña latina u con acento agudo",
+ ucirc: "Letra pequeña latina u con circumflex", uuml: "Letra pequeña latina u con diéresis", yacute: "Letra pequeña latina y con acento agudo", thorn: "Espina de letra pequeña latina", yuml: "Letra pequeña latina y con diéresis", OElig: "Ligadura de capital latino OE", oelig: "Ligadura de pequeña latino OE", 372: "Letra latina mayúscula W con circunflexo", 374: "Letra latina mayúscula Y con circunflexo", 373: "Letra latina minúscula w con circunflexo", 375: "Letra latina minúscula y con circunflexo", sbquo: "Signo de comillas simple abajo",
+ 8219: "Signo de comillas simple arriba", bdquo: "Signo de doble comillas abajo", hellip: "Elipsis horizontal", trade: "Signo merccantl", 9658: "Puntero derecho negro", bull: "Bala", rarr: "Flecha hacia la derecha", rArr: "Doble flecha hacia la derecha", hArr: "Flecha doble izquierda derecha", diams: "Palo de diamante negro", asymp: "Casi igual a"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/es.js b/plugins/specialchar/dialogs/lang/es.js
new file mode 100755
index 0000000..f4ee09b
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/es.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "es", {
+ euro: "Símbolo de euro", lsquo: "Comilla simple izquierda", rsquo: "Comilla simple derecha", ldquo: "Comilla doble izquierda", rdquo: "Comilla doble derecha", ndash: "Guión corto", mdash: "Guión medio largo", iexcl: "Signo de admiración invertido", cent: "Símbolo centavo", pound: "Símbolo libra", curren: "Símbolo moneda", yen: "Símbolo yen", brvbar: "Barra vertical rota", sect: "Símbolo sección", uml: "Diéresis", copy: "Signo de derechos de autor", ordf: "Indicador ordinal femenino", laquo: "Abre comillas angulares",
+ not: "Signo negación", reg: "Signo de marca registrada", macr: "Guión alto", deg: "Signo de grado", sup2: "Superíndice dos", sup3: "Superíndice tres", acute: "Acento agudo", micro: "Signo micro", para: "Signo de pi", middot: "Punto medio", cedil: "Cedilla", sup1: "Superíndice uno", ordm: "Indicador orginal masculino", raquo: "Cierra comillas angulares", frac14: "Fracción ordinaria de un quarto", frac12: "Fracción ordinaria de una mitad", frac34: "Fracción ordinaria de tres cuartos", iquest: "Signo de interrogación invertido", Agrave: "Letra A latina mayúscula con acento grave",
+ Aacute: "Letra A latina mayúscula con acento agudo", Acirc: "Letra A latina mayúscula con acento circunflejo", Atilde: "Letra A latina mayúscula con tilde", Auml: "Letra A latina mayúscula con diéresis", Aring: "Letra A latina mayúscula con aro arriba", AElig: "Letra Æ latina mayúscula", Ccedil: "Letra C latina mayúscula con cedilla", Egrave: "Letra E latina mayúscula con acento grave", Eacute: "Letra E latina mayúscula con acento agudo", Ecirc: "Letra E latina mayúscula con acento circunflejo", Euml: "Letra E latina mayúscula con diéresis",
+ Igrave: "Letra I latina mayúscula con acento grave", Iacute: "Letra I latina mayúscula con acento agudo", Icirc: "Letra I latina mayúscula con acento circunflejo", Iuml: "Letra I latina mayúscula con diéresis", ETH: "Letra Eth latina mayúscula", Ntilde: "Letra N latina mayúscula con tilde", Ograve: "Letra O latina mayúscula con acento grave", Oacute: "Letra O latina mayúscula con acento agudo", Ocirc: "Letra O latina mayúscula con acento circunflejo", Otilde: "Letra O latina mayúscula con tilde", Ouml: "Letra O latina mayúscula con diéresis",
+ times: "Signo de multiplicación", Oslash: "Letra O latina mayúscula con barra inclinada", Ugrave: "Letra U latina mayúscula con acento grave", Uacute: "Letra U latina mayúscula con acento agudo", Ucirc: "Letra U latina mayúscula con acento circunflejo", Uuml: "Letra U latina mayúscula con diéresis", Yacute: "Letra Y latina mayúscula con acento agudo", THORN: "Letra Thorn latina mayúscula", szlig: "Letra s latina fuerte pequeña", agrave: "Letra a latina pequeña con acento grave", aacute: "Letra a latina pequeña con acento agudo",
+ acirc: "Letra a latina pequeña con acento circunflejo", atilde: "Letra a latina pequeña con tilde", auml: "Letra a latina pequeña con diéresis", aring: "Letra a latina pequeña con aro arriba", aelig: "Letra æ latina pequeña", ccedil: "Letra c latina pequeña con cedilla", egrave: "Letra e latina pequeña con acento grave", eacute: "Letra e latina pequeña con acento agudo", ecirc: "Letra e latina pequeña con acento circunflejo", euml: "Letra e latina pequeña con diéresis", igrave: "Letra i latina pequeña con acento grave",
+ iacute: "Letra i latina pequeña con acento agudo", icirc: "Letra i latina pequeña con acento circunflejo", iuml: "Letra i latina pequeña con diéresis", eth: "Letra eth latina pequeña", ntilde: "Letra n latina pequeña con tilde", ograve: "Letra o latina pequeña con acento grave", oacute: "Letra o latina pequeña con acento agudo", ocirc: "Letra o latina pequeña con acento circunflejo", otilde: "Letra o latina pequeña con tilde", ouml: "Letra o latina pequeña con diéresis", divide: "Signo de división", oslash: "Letra o latina minúscula con barra inclinada",
+ ugrave: "Letra u latina pequeña con acento grave", uacute: "Letra u latina pequeña con acento agudo", ucirc: "Letra u latina pequeña con acento circunflejo", uuml: "Letra u latina pequeña con diéresis", yacute: "Letra u latina pequeña con acento agudo", thorn: "Letra thorn latina minúscula", yuml: "Letra y latina pequeña con diéresis", OElig: "Diptongo OE latino en mayúscula", oelig: "Diptongo oe latino en minúscula", 372: "Letra W latina mayúscula con acento circunflejo", 374: "Letra Y latina mayúscula con acento circunflejo",
+ 373: "Letra w latina pequeña con acento circunflejo", 375: "Letra y latina pequeña con acento circunflejo", sbquo: "Comilla simple baja-9", 8219: "Comilla simple alta invertida-9", bdquo: "Comillas dobles bajas-9", hellip: "Puntos suspensivos horizontales", trade: "Signo de marca registrada", 9658: "Apuntador negro apuntando a la derecha", bull: "Viñeta", rarr: "Flecha a la derecha", rArr: "Flecha doble a la derecha", hArr: "Flecha izquierda derecha doble", diams: "Diamante negro", asymp: "Casi igual a"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/et.js b/plugins/specialchar/dialogs/lang/et.js
new file mode 100755
index 0000000..0efa8cf
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/et.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "et", {
+ euro: "Euromärk", lsquo: "Alustav ühekordne jutumärk", rsquo: "Lõpetav ühekordne jutumärk", ldquo: "Alustav kahekordne jutumärk", rdquo: "Lõpetav kahekordne jutumärk", ndash: "Enn-kriips", mdash: "Emm-kriips", iexcl: "Pööratud hüüumärk", cent: "Sendimärk", pound: "Naela märk", curren: "Valuutamärk", yen: "Jeeni märk", brvbar: "Katkestatud kriips", sect: "Lõigu märk", uml: "Täpid", copy: "Autoriõiguse märk", ordf: "Feminine ordinal indicator", laquo: "Left-pointing double angle quotation mark",
+ not: "Ei-märk", reg: "Registered sign", macr: "Macron", deg: "Kraadimärk", sup2: "Ülaindeks kaks", sup3: "Ülaindeks kolm", acute: "Acute accent", micro: "Mikro-märk", para: "Pilcrow sign", middot: "Keskpunkt", cedil: "Cedilla", sup1: "Ülaindeks üks", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Ladina suur A tildega", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Täppidega ladina suur O", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Kandilise katusega suur ladina U", Uuml: "Täppidega ladina suur U", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Ladina väike terav s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Kandilise katusega ladina väike a", atilde: "Tildega ladina väike a", auml: "Täppidega ladina väike a", aring: "Latin small letter a with ring above",
+ aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth", ntilde: "Latin small letter n with tilde",
+ ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Jagamismärk", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis", yacute: "Latin small letter y with acute accent",
+ thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis", trade: "Kaubamärgi märk", 9658: "Black right-pointing pointer",
+ bull: "Kuul", rarr: "Nool paremale", rArr: "Topeltnool paremale", hArr: "Topeltnool vasakule", diams: "Black diamond suit", asymp: "Ligikaudu võrdne"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/eu.js b/plugins/specialchar/dialogs/lang/eu.js
new file mode 100755
index 0000000..315b98c
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/eu.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "eu", {
+ euro: "Euro zeinua", lsquo: "Left single quotation mark", rsquo: "Right single quotation mark", ldquo: "Left double quotation mark", rdquo: "Right double quotation mark", ndash: "En dash", mdash: "Em dash", iexcl: "Inverted exclamation mark", cent: "Cent sign", pound: "Libera zeinua", curren: "Currency sign", yen: "Yen zeinua", brvbar: "Broken bar", sect: "Section sign", uml: "Dieresia", copy: "Copyright zeinua", ordf: "Feminine ordinal indicator", laquo: "Left-pointing double angle quotation mark",
+ not: "Ez zeinua", reg: "Registered sign", macr: "Macron", deg: "Degree sign", sup2: "Superscript two", sup3: "Superscript three", acute: "Acute accent", micro: "Micro sign", para: "Pilcrow sign", middot: "Middle dot", cedil: "Cedilla", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Bider zeinua", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis",
+ aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth",
+ ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Division sign", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis",
+ yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis",
+ trade: "Trade mark sign", 9658: "Black right-pointing pointer", bull: "Buleta", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Almost equal to"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/fa.js b/plugins/specialchar/dialogs/lang/fa.js
new file mode 100755
index 0000000..481be7a
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/fa.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "fa", {
+ euro: "نشان یورو", lsquo: "علامت نقل قول تکی چپ", rsquo: "علامت نقل قول تکی راست", ldquo: "علامت نقل قول دوتایی چپ", rdquo: "علامت نقل قول دوتایی راست", ndash: "خط تیره En", mdash: "خط تیره Em", iexcl: "علامت تعجب وارونه", cent: "نشان سنت", pound: "نشان پوند", curren: "نشان ارز", yen: "نشان ین", brvbar: "نوار شکسته", sect: "نشان بخش", uml: "نشان سواگیری", copy: "نشان کپی رایت", ordf: "شاخص ترتیبی مونث", laquo: "اشاره چپ مکرر برای زاویه علامت نقل قول", not: "نشان ثبت نشده", reg: "نشان ثبت شده",
+ macr: "نشان خط بالای حرف", deg: "نشان درجه", sup2: "بالانویس دو", sup3: "بالانویس سه", acute: "لهجه غلیظ", micro: "نشان مایکرو", para: "نشان محل بند", middot: "نقطه میانی", cedil: "سدیل", sup1: "بالانویس 1", ordm: "شاخص ترتیبی مذکر", raquo: "نشان زاویه‌دار دوتایی نقل قول راست چین", frac14: "واحد عامیانه 1/4", frac12: "واحد عامینه نصف", frac34: "واحد عامیانه 3/4", iquest: "علامت سوال معکوس", Agrave: "حرف A بزرگ لاتین با تلفظ غلیظ", Aacute: "حرف A بزرگ لاتین با تلفظ شدید", Acirc: "حرف A بزرگ لاتین با دور", Atilde: "حرف A بزرگ لاتین با صدای کامی",
+ Auml: "حرف A بزرگ لاتین با نشان سواگیری", Aring: "حرف A بزرگ لاتین با حلقه بالا", AElig: "حرف Æ بزرگ لاتین", Ccedil: "حرف C بزرگ لاتین با نشان سواگیری", Egrave: "حرف E بزرگ لاتین با تلفظ درشت", Eacute: "حرف E بزرگ لاتین با تلفظ زیر", Ecirc: "حرف E بزرگ لاتین با خمان", Euml: "حرف E بزرگ لاتین با نشان سواگیری", Igrave: "حرف I بزرگ لاتین با تلفظ درشت", Iacute: "حرف I بزرگ لاتین با تلفظ ریز", Icirc: "حرف I بزرگ لاتین با خمان", Iuml: "حرف I بزرگ لاتین با نشان سواگیری", ETH: "حرف لاتین بزرگ واکه ترتیبی", Ntilde: "حرف N بزرگ لاتین با مد",
+ Ograve: "حرف O بزرگ لاتین با تلفظ درشت", Oacute: "حرف O بزرگ لاتین با تلفظ ریز", Ocirc: "حرف O بزرگ لاتین با خمان", Otilde: "حرف O بزرگ لاتین با مد", Ouml: "حرف O بزرگ لاتین با نشان سواگیری", times: "نشان ضربدر", Oslash: "حرف O بزرگ لاتین با میان خط", Ugrave: "حرف U بزرگ لاتین با تلفظ درشت", Uacute: "حرف U بزرگ لاتین با تلفظ ریز", Ucirc: "حرف U بزرگ لاتین با خمان", Uuml: "حرف U بزرگ لاتین با نشان سواگیری", Yacute: "حرف Y بزرگ لاتین با تلفظ ریز", THORN: "حرف بزرگ لاتین خاردار", szlig: "حرف کوچک لاتین شارپ s", agrave: "حرف a کوچک لاتین با تلفظ درشت",
+ aacute: "حرف a کوچک لاتین با تلفظ ریز", acirc: "حرف a کوچک لاتین با خمان", atilde: "حرف a کوچک لاتین با صدای کامی", auml: "حرف a کوچک لاتین با نشان سواگیری", aring: "حرف a کوچک لاتین گوشواره دار", aelig: "حرف کوچک لاتین æ", ccedil: "حرف c کوچک لاتین با نشان سدیل", egrave: "حرف e کوچک لاتین با تلفظ درشت", eacute: "حرف e کوچک لاتین با تلفظ ریز", ecirc: "حرف e کوچک لاتین با خمان", euml: "حرف e کوچک لاتین با نشان سواگیری", igrave: "حرف i کوچک لاتین با تلفظ درشت", iacute: "حرف i کوچک لاتین با تلفظ ریز", icirc: "حرف i کوچک لاتین با خمان",
+ iuml: "حرف i کوچک لاتین با نشان سواگیری", eth: "حرف کوچک لاتین eth", ntilde: "حرف n کوچک لاتین با صدای کامی", ograve: "حرف o کوچک لاتین با تلفظ درشت", oacute: "حرف o کوچک لاتین با تلفظ زیر", ocirc: "حرف o کوچک لاتین با خمان", otilde: "حرف o کوچک لاتین با صدای کامی", ouml: "حرف o کوچک لاتین با نشان سواگیری", divide: "نشان بخش", oslash: "حرف o کوچک لاتین با میان خط", ugrave: "حرف u کوچک لاتین با تلفظ درشت", uacute: "حرف u کوچک لاتین با تلفظ ریز", ucirc: "حرف u کوچک لاتین با خمان", uuml: "حرف u کوچک لاتین با نشان سواگیری", yacute: "حرف y کوچک لاتین با تلفظ ریز",
+ thorn: "حرف کوچک لاتین خاردار", yuml: "حرف y کوچک لاتین با نشان سواگیری", OElig: "بند بزرگ لاتین OE", oelig: "بند کوچک لاتین oe", 372: "حرف W بزرگ لاتین با خمان", 374: "حرف Y بزرگ لاتین با خمان", 373: "حرف w کوچک لاتین با خمان", 375: "حرف y کوچک لاتین با خمان", sbquo: "نشان نقل قول تکی زیر-9", 8219: "نشان نقل قول تکی high-reversed-9", bdquo: "نقل قول دوتایی پایین-9", hellip: "حذف افقی", trade: "نشان تجاری", 9658: "نشانگر سیاه جهت راست", bull: "گلوله", rarr: "فلش راست", rArr: "فلش دوتایی راست", hArr: "فلش دوتایی چپ راست", diams: "نشان الماس سیاه",
+ asymp: "تقریبا برابر با"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/fi.js b/plugins/specialchar/dialogs/lang/fi.js
new file mode 100755
index 0000000..dacb780
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/fi.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "fi", {
+ euro: "Euron merkki", lsquo: "Vasen yksittäinen lainausmerkki", rsquo: "Oikea yksittäinen lainausmerkki", ldquo: "Vasen kaksoislainausmerkki", rdquo: "Oikea kaksoislainausmerkki", ndash: "En dash", mdash: "Em dash", iexcl: "Inverted exclamation mark", cent: "Sentin merkki", pound: "Punnan merkki", curren: "Valuuttamerkki", yen: "Yenin merkki", brvbar: "Broken bar", sect: "Section sign", uml: "Diaeresis", copy: "Copyright sign", ordf: "Feminine ordinal indicator", laquo: "Left-pointing double angle quotation mark",
+ not: "Not sign", reg: "Rekisteröity merkki", macr: "Macron", deg: "Asteen merkki", sup2: "Yläindeksi kaksi", sup3: "Yläindeksi kolme", acute: "Acute accent", micro: "Mikron merkki", para: "Pilcrow sign", middot: "Middle dot", cedil: "Cedilla", sup1: "Yläindeksi yksi", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Ylösalaisin oleva kysymysmerkki", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Kertomerkki", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis",
+ aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth",
+ ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Jakomerkki", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis",
+ yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis",
+ trade: "Tavaramerkki merkki", 9658: "Black right-pointing pointer", bull: "Bullet", rarr: "Nuoli oikealle", rArr: "Kaksoisnuoli oikealle", hArr: "Kaksoisnuoli oikealle ja vasemmalle", diams: "Black diamond suit", asymp: "Noin"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/fr-ca.js b/plugins/specialchar/dialogs/lang/fr-ca.js
new file mode 100755
index 0000000..07ed4ea
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/fr-ca.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","fr-ca",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret",iexcl:"Point d'exclamation inversé",cent:"Symbole de cent",pound:"Symbole de Livre Sterling",curren:"Symbole monétaire",yen:"Symbole du Yen",brvbar:"Barre scindée",sect:"Symbole de section",uml:"Tréma",copy:"Symbole de copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant",
+not:"Indicateur de négation",reg:"Symbole de marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"Exposant 3",acute:"Accent aigüe",micro:"Symbole micro",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"Exposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Une demi",frac34:"Trois quart",iquest:"Point d'interrogation inversé",Agrave:"A accent grave",Aacute:"A accent aigüe",Acirc:"A circonflexe",Atilde:"A tilde",Auml:"A tréma",
+Aring:"A avec un rond au dessus",AElig:"Æ majuscule",Ccedil:"C cédille",Egrave:"E accent grave",Eacute:"E accent aigüe",Ecirc:"E accent circonflexe",Euml:"E tréma",Igrave:"I accent grave",Iacute:"I accent aigüe",Icirc:"I accent circonflexe",Iuml:"I tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N tilde",Ograve:"O accent grave",Oacute:"O accent aigüe",Ocirc:"O accent circonflexe",Otilde:"O tilde",Ouml:"O tréma",times:"Symbole de multiplication",Oslash:"O barré",Ugrave:"U accent grave",Uacute:"U accent aigüe",
+Ucirc:"U accent circonflexe",Uuml:"U tréma",Yacute:"Y accent aigüe",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a accent grave",aacute:"a accent aigüe",acirc:"a accent circonflexe",atilde:"a tilde",auml:"a tréma",aring:"a avec un cercle au dessus",aelig:"æ",ccedil:"c cédille",egrave:"e accent grave",eacute:"e accent aigüe",ecirc:"e accent circonflexe",euml:"e tréma",igrave:"i accent grave",iacute:"i accent aigüe",icirc:"i accent circonflexe",iuml:"i tréma",
+eth:"Lettre minuscule islandaise ED",ntilde:"n tilde",ograve:"o accent grave",oacute:"o accent aigüe",ocirc:"O accent circonflexe",otilde:"O tilde",ouml:"O tréma",divide:"Symbole de division",oslash:"o barré",ugrave:"u accent grave",uacute:"u accent aigüe",ucirc:"u accent circonflexe",uuml:"u tréma",yacute:"y accent aigüe",thorn:"Lettre islandaise thorn minuscule",yuml:"y tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W accent circonflexe",374:"Y accent circonflexe",
+373:"w accent circonflexe",375:"y accent circonflexe",sbquo:"Guillemet simple fermant",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Symbole de marque déposée",9658:"Flèche noire pointant vers la droite",bull:"Puce",rarr:"Flèche vers la droite",rArr:"Flèche double vers la droite",hArr:"Flèche double vers la gauche",diams:"Carreau",asymp:"Presque égal"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/fr.js b/plugins/specialchar/dialogs/lang/fr.js
new file mode 100755
index 0000000..9362970
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/fr.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "fr", {
+ euro: "Symbole euro", lsquo: "Guillemet simple ouvrant", rsquo: "Guillemet simple fermant", ldquo: "Guillemet double ouvrant", rdquo: "Guillemet double fermant", ndash: "Tiret demi-cadratin", mdash: "Tiret cadratin", iexcl: "Point d'exclamation inversé", cent: "Symbole cent", pound: "Symbole Livre sterling", curren: "Symbole monétaire", yen: "Symbole yen", brvbar: "Barre verticale scindée", sect: "Signe de section", uml: "Tréma", copy: "Symbole Copyright", ordf: "Indicateur ordinal féminin",
+ laquo: "Guillemet français ouvrant", not: "Crochet de négation", reg: "Symbole de marque déposée", macr: "Macron", deg: "Symbole degré", sup2: "Exposant 2", sup3: "Exposant 3", acute: "Accent aigu", micro: "Symbole micro", para: "Symbole pied-de-mouche", middot: "Point médian", cedil: "Cédille", sup1: "Exposant 1", ordm: "Indicateur ordinal masculin", raquo: "Guillemet français fermant", frac14: "Fraction un quart", frac12: "Fraction un demi", frac34: "Fraction trois quarts", iquest: "Point d'interrogation inversé", Agrave: "A accent grave majuscule",
+ Aacute: "A accent aigu majuscule", Acirc: "A accent circonflexe majuscule", Atilde: "A caron majuscule", Auml: "A tréma majuscule", Aring: "A rond majuscule", AElig: "Ligature Æ majuscule", Ccedil: "C cédille majuscule", Egrave: "E accent grave majuscule", Eacute: "E accent aigu majuscule", Ecirc: "E accent circonflexe majuscule", Euml: "E tréma majuscule", Igrave: "I accent grave majuscule", Iacute: "I accent aigu majuscule", Icirc: "I accent circonflexe majuscule", Iuml: "I tréma majuscule", ETH: "Lettre majuscule islandaise ED",
+ Ntilde: "N caron majuscule", Ograve: "O accent grave majuscule", Oacute: "O accent aigu majuscule", Ocirc: "O accent circonflexe majuscule", Otilde: "O caron majuscule", Ouml: "O tréma majuscule", times: "Symbole de multiplication", Oslash: "O barré majuscule", Ugrave: "U accent grave majuscule", Uacute: "U accent aigu majuscule", Ucirc: "U accent circonflexe majuscule", Uuml: "U tréma majuscule", Yacute: "Y accent aigu majuscule", THORN: "Lettre islandaise thorn majuscule", szlig: "Lettre minuscule allemande S dur", agrave: "A accent grave minuscule",
+ aacute: "A accent aigu minuscule", acirc: "A accent circonflexe minuscule", atilde: "A tilde minuscule", auml: "A tréma minuscule", aring: "A rond minuscule", aelig: "Ligature Æ minuscule", ccedil: "C cédille minuscule", egrave: "E accent grave minuscule", eacute: "E accent aigu minuscule", ecirc: "E accent circonflexe minuscule", euml: "E tréma minuscule", igrave: "I accent grave minuscule", iacute: "I accent aigu minuscule", icirc: "I accent circonflexe minuscule", iuml: "i minuscule tréma", eth: "Lettre minuscule islandaise ED",
+ ntilde: "N caron minuscule", ograve: "O minuscule accent grave", oacute: "O accent aigu minuscule", ocirc: "O accent circonflexe minuscule", otilde: "O tilde minuscule", ouml: "O tréma minuscule", divide: "Symbole de division", oslash: "O barré minuscule", ugrave: "U accent grave minuscule", uacute: "U accent aigu minuscule", ucirc: "U accent circonflexe minuscule", uuml: "U tréma minuscule", yacute: "Y accent aigu minuscule", thorn: "Lettre islandaise thorn minuscule", yuml: "Y tréma minuscule", OElig: "Ligature Œ majuscule",
+ oelig: "Ligature Œ minuscule", 372: "W accent circonflexe majuscule", 374: "Y accent circonflexe majuscule", 373: "W accent circonflexe minuscule", 375: "Y accent circonflexe minuscule", sbquo: "Guillemet simple fermant inférieur", 8219: "Guillemet-virgule supérieur culbuté", bdquo: "Guillemet-virgule double inférieur", hellip: "Points de suspension", trade: "Symbole de marque commerciale", 9658: "Flèche noire pointant vers la droite", bull: "Gros point médian", rarr: "Flèche vers la droite", rArr: "Double flèche vers la droite",
+ hArr: "Double flèche vers la gauche", diams: "Losange noir", asymp: "Environ égal"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/gl.js b/plugins/specialchar/dialogs/lang/gl.js
new file mode 100755
index 0000000..5f6bf05
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/gl.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "gl", {
+ euro: "Símbolo do euro", lsquo: "Comiña simple esquerda", rsquo: "Comiña simple dereita", ldquo: "Comiñas dobres esquerda", rdquo: "Comiñas dobres dereita", ndash: "Guión", mdash: "Raia", iexcl: "Signo de admiración invertido", cent: "Símbolo do centavo", pound: "Símbolo da libra", curren: "Símbolo de moeda", yen: "Símbolo do yen", brvbar: "Barra vertical rota", sect: "Símbolo de sección", uml: "Diérese", copy: "Símbolo de dereitos de autoría", ordf: "Indicador ordinal feminino", laquo: "Comiñas latinas, apertura",
+ not: "Signo negación", reg: "Símbolo de marca rexistrada", macr: "Guión alto", deg: "Signo de grao", sup2: "Superíndice dous", sup3: "Superíndice tres", acute: "Acento agudo", micro: "Signo de micro", para: "Signo de pi", middot: "Punto medio", cedil: "Cedilla", sup1: "Superíndice un", ordm: "Indicador ordinal masculino", raquo: "Comiñas latinas, peche", frac14: "Fracción ordinaria de un cuarto", frac12: "Fracción ordinaria de un medio", frac34: "Fracción ordinaria de tres cuartos", iquest: "Signo de interrogación invertido", Agrave: "Letra A latina maiúscula con acento grave",
+ Aacute: "Letra A latina maiúscula con acento agudo", Acirc: "Letra A latina maiúscula con acento circunflexo", Atilde: "Letra A latina maiúscula con til", Auml: "Letra A latina maiúscula con diérese", Aring: "Letra A latina maiúscula con aro enriba", AElig: "Letra Æ latina maiúscula", Ccedil: "Letra C latina maiúscula con cedilla", Egrave: "Letra E latina maiúscula con acento grave", Eacute: "Letra E latina maiúscula con acento agudo", Ecirc: "Letra E latina maiúscula con acento circunflexo", Euml: "Letra E latina maiúscula con diérese",
+ Igrave: "Letra I latina maiúscula con acento grave", Iacute: "Letra I latina maiúscula con acento agudo", Icirc: "Letra I latina maiúscula con acento circunflexo", Iuml: "Letra I latina maiúscula con diérese", ETH: "Letra Ed latina maiúscula", Ntilde: "Letra N latina maiúscula con til", Ograve: "Letra O latina maiúscula con acento grave", Oacute: "Letra O latina maiúscula con acento agudo", Ocirc: "Letra O latina maiúscula con acento circunflexo", Otilde: "Letra O latina maiúscula con til", Ouml: "Letra O latina maiúscula con diérese",
+ times: "Signo de multiplicación", Oslash: "Letra O latina maiúscula con barra transversal", Ugrave: "Letra U latina maiúscula con acento grave", Uacute: "Letra U latina maiúscula con acento agudo", Ucirc: "Letra U latina maiúscula con acento circunflexo", Uuml: "Letra U latina maiúscula con diérese", Yacute: "Letra Y latina maiúscula con acento agudo", THORN: "Letra Thorn latina maiúscula", szlig: "Letra s latina forte minúscula", agrave: "Letra a latina minúscula con acento grave", aacute: "Letra a latina minúscula con acento agudo",
+ acirc: "Letra a latina minúscula con acento circunflexo", atilde: "Letra a latina minúscula con til", auml: "Letra a latina minúscula con diérese", aring: "Letra a latina minúscula con aro enriba", aelig: "Letra æ latina minúscula", ccedil: "Letra c latina minúscula con cedilla", egrave: "Letra e latina minúscula con acento grave", eacute: "Letra e latina minúscula con acento agudo", ecirc: "Letra e latina minúscula con acento circunflexo", euml: "Letra e latina minúscula con diérese", igrave: "Letra i latina minúscula con acento grave",
+ iacute: "Letra i latina minúscula con acento agudo", icirc: "Letra i latina minúscula con acento circunflexo", iuml: "Letra i latina minúscula con diérese", eth: "Letra ed latina minúscula", ntilde: "Letra n latina minúscula con til", ograve: "Letra o latina minúscula con acento grave", oacute: "Letra o latina minúscula con acento agudo", ocirc: "Letra o latina minúscula con acento circunflexo", otilde: "Letra o latina minúscula con til", ouml: "Letra o latina minúscula con diérese", divide: "Signo de división", oslash: "Letra o latina minúscula con barra transversal",
+ ugrave: "Letra u latina minúscula con acento grave", uacute: "Letra u latina minúscula con acento agudo", ucirc: "Letra u latina minúscula con acento circunflexo", uuml: "Letra u latina minúscula con diérese", yacute: "Letra y latina minúscula con acento agudo", thorn: "Letra Thorn latina minúscula", yuml: "Letra y latina minúscula con diérese", OElig: "Ligadura OE latina maiúscula", oelig: "Ligadura oe latina minúscula", 372: "Letra W latina maiúscula con acento circunflexo", 374: "Letra Y latina maiúscula con acento circunflexo",
+ 373: "Letra w latina minúscula con acento circunflexo", 375: "Letra y latina minúscula con acento circunflexo", sbquo: "Comiña simple baixa, de apertura", 8219: "Comiña simple alta, de peche", bdquo: "Comiñas dobres baixas, de apertura", hellip: "Elipse, puntos suspensivos", trade: "Signo de marca rexistrada", 9658: "Apuntador negro apuntando á dereita", bull: "Viñeta", rarr: "Frecha á dereita", rArr: "Frecha dobre á dereita", hArr: "Frecha dobre da esquerda á dereita", diams: "Diamante negro", asymp: "Case igual a"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/he.js b/plugins/specialchar/dialogs/lang/he.js
new file mode 100755
index 0000000..55bdeef
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/he.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "he", {
+ euro: "יורו", lsquo: "סימן ציטוט יחיד שמאלי", rsquo: "סימן ציטוט יחיד ימני", ldquo: "סימן ציטוט כפול שמאלי", rdquo: "סימן ציטוט כפול ימני", ndash: "קו מפריד קצר", mdash: "קו מפריד ארוך", iexcl: "סימן קריאה הפוך", cent: "סנט", pound: "פאונד", curren: "מטבע", yen: "ין", brvbar: "קו שבור", sect: "סימן מקטע", uml: "שתי נקודות אופקיות (Diaeresis)", copy: "סימן זכויות יוצרים (Copyright)", ordf: "סימן אורדינאלי נקבי", laquo: "סימן ציטוט זווית כפולה לשמאל", not: "סימן שלילה מתמטי", reg: "סימן רשום",
+ macr: "מקרון (הגיה ארוכה)", deg: "מעלות", sup2: "2 בכתיב עילי", sup3: "3 בכתיב עילי", acute: "סימן דגוש (Acute)", micro: "מיקרו", para: "סימון פסקה", middot: "נקודה אמצעית", cedil: "סדיליה", sup1: "1 בכתיב עילי", ordm: "סימן אורדינאלי זכרי", raquo: "סימן ציטוט זווית כפולה לימין", frac14: "רבע בשבר פשוט", frac12: "חצי בשבר פשוט", frac34: "שלושה רבעים בשבר פשוט", iquest: "סימן שאלה הפוך", Agrave: "אות לטינית A עם גרש (Grave)", Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde",
+ Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "אות לטינית Æ גדולה", Ccedil: "Latin capital letter C with cedilla", Egrave: "אות לטינית E עם גרש (Grave)", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "אות לטינית I עם גרש (Grave)", Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis",
+ ETH: "אות לטינית Eth גדולה", Ntilde: "Latin capital letter N with tilde", Ograve: "אות לטינית O עם גרש (Grave)", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "סימן כפל", Oslash: "Latin capital letter O with stroke", Ugrave: "אות לטינית U עם גרש (Grave)", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis",
+ Yacute: "Latin capital letter Y with acute accent", THORN: "אות לטינית Thorn גדולה", szlig: "אות לטינית s חדה קטנה", agrave: "אות לטינית a עם גרש (Grave)", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis", aring: "Latin small letter a with ring above", aelig: "אות לטינית æ קטנה", ccedil: "Latin small letter c with cedilla", egrave: "אות לטינית e עם גרש (Grave)", eacute: "Latin small letter e with acute accent",
+ ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "אות לטינית i עם גרש (Grave)", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "אות לטינית eth קטנה", ntilde: "Latin small letter n with tilde", ograve: "אות לטינית o עם גרש (Grave)", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis",
+ divide: "סימן חלוקה", oslash: "Latin small letter o with stroke", ugrave: "אות לטינית u עם גרש (Grave)", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis", yacute: "Latin small letter y with acute accent", thorn: "אות לטינית thorn קטנה", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex",
+ 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "סימן ציטוט נמוך יחיד", 8219: "סימן ציטוט", bdquo: "סימן ציטוט נמוך כפול", hellip: "שלוש נקודות", trade: "סימן טריידמארק", 9658: "סמן שחור לצד ימין", bull: "תבליט (רשימה)", rarr: "חץ לימין", rArr: "חץ כפול לימין", hArr: "חץ כפול לימין ושמאל", diams: "יהלום מלא", asymp: "כמעט שווה"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/hr.js b/plugins/specialchar/dialogs/lang/hr.js
new file mode 100755
index 0000000..78b8b14
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/hr.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "hr", {
+ euro: "Euro znak", lsquo: "Lijevi jednostruki navodnik", rsquo: "Desni jednostruki navodnik", ldquo: "Lijevi dvostruki navodnik", rdquo: "Desni dvostruki navodnik", ndash: "En crtica", mdash: "Em crtica", iexcl: "Naopaki uskličnik", cent: "Cent znak", pound: "Funta znak", curren: "Znak valute", yen: "Yen znak", brvbar: "Potrgana prečka", sect: "Znak odjeljka", uml: "Prijeglasi", copy: "Copyright znak", ordf: "Ženska redna oznaka", laquo: "Lijevi dvostruki uglati navodnik", not: "Not znak",
+ reg: "Registered znak", macr: "Crta iznad", deg: "Stupanj znak", sup2: "Eksponent 2", sup3: "Eksponent tri", acute: "Akcent", micro: "Mikro znak", para: "Znak paragrafa", middot: "Srednja točka", cedil: "Cedilla", sup1: "Eksponent 1", ordm: "Muška redna oznaka", raquo: "Desni dvostruku uglati navodnik", frac14: "Četvrtina", frac12: "Polovina", frac34: "Tri četvrtine", iquest: "Naopaki upitnik", Agrave: "Veliko latinsko slovo A s akcentom", Aacute: "Latinično veliko slovo A sa oštrim naglaskom", Acirc: "Latinično veliko slovo A sa circumflex",
+ Atilde: "Latinično veliko slovo A sa tildom", Auml: "Latinično veliko slovo A sa diaeresis", Aring: "Latinično veliko slovo A sa gornjim prstenom", AElig: "Latinično veliko slovo Æ", Ccedil: "Veliko latinično slovo C sa cedilla", Egrave: "Veliko latinično slovo E sa akcentom", Eacute: "Veliko latinično slovo E sa akcentom", Ecirc: "Veliko latinično slovo E sa circumflex", Euml: "Veliko latinično slovo E sa diaresis", Igrave: "Veliko latinično slovo I sa akcentom", Iacute: "Veliko latinično slovo I sa akcentom", Icirc: "Veliko latinično slovo I sa circumflex",
+ Iuml: "Veliko latinično slovo I sa diaresis", ETH: "Veliko latinično slovo Eth", Ntilde: "Veliko latinično slovo N sa tildom", Ograve: "Veliko latinično slovo O sa akcentom", Oacute: "Veliko latinično slovo O sa akcentom", Ocirc: "Veliko latinično slovo O sa circumflex", Otilde: "Veliko latinično slovo O sa tildom", Ouml: "Veliko latinično slovo O sa diaresis", times: "Znak množenja", Oslash: "Veliko latinično slovo O sa crtom", Ugrave: "Veliko latinično slovo U sa akcentom", Uacute: "Veliko latinično slovo U sa akcentom",
+ Ucirc: "Veliko latinično slovo U sa circumflex", Uuml: "Veliko latinično slovo U sa diaresis", Yacute: "Veliko latinično slovo Y sa akcentom", THORN: "Veliko latinično slovo Trn", szlig: "Malo latinično slovo oštro s", agrave: "Malo latinično slovo a sa akcentom", aacute: "Malo latinično slovo sa akcentom", acirc: "Malo latinično slovo a sa circumflex", atilde: "Malo latinično slovo a sa tildom", auml: "Malo latinično slovo a sa diaresis", aring: "Malo latinično slovo a sa gornjim prstenom", aelig: "Malo latinično slovo æ",
+ ccedil: "Malo latinično slovo e sa cedilla", egrave: "Malo latinično slovo e sa akcentom", eacute: "Malo latinično slovo e sa akcentom", ecirc: "Malo latinično slovo e sa circumflex", euml: "Malo latinično slovo e sa diaresis", igrave: "Malo latinično slovo i sa akcentom", iacute: "Malo latinično slovo i sa akcentom", icirc: "Malo latinično slovo i sa circumflex", iuml: "Malo latinično slovo i sa diaresis", eth: "Malo latinično slovo eth", ntilde: "Malo latinično slovo n sa tildom", ograve: "Malo latinično slovo o sa akcentom",
+ oacute: "Malo latinično slovo o sa akcentom", ocirc: "Malo latinično slovo o sa circumflex", otilde: "Malo latinično slovo o sa tildom", ouml: "Malo latinično slovo o sa diaresis", divide: "Znak dijeljenja", oslash: "Malo latinično slovo o sa crtom", ugrave: "Malo latinično slovo s akcentom", uacute: "Malo latinično slovo u sa akcentom", ucirc: "Malo latinično slovo sa circumflex", uuml: "Malo latinično slovo u sa diaresis", yacute: "Malo latinično slovo y s akcentom", thorn: "Malo latinično slovo Trn", yuml: "Malo latinično slovo y sa diaresis",
+ OElig: "Veliko latinično slovo OE", oelig: "Malo latinično slovoe OE", 372: "Veliko latinično slovo W sa circumflex", 374: "Veliko latinično slovo Y sa circumflex", 373: "Malo latinično slovo w sa circumflex", 375: "Malo latinično slovo y sa circumflex", sbquo: "Jednostruki donji navodnik", 8219: "Jednostruki gornji navodnik", bdquo: "Dvostruki donji navodnik", hellip: "Tri točkice", trade: "TM znak", 9658: "Crni desni pokazivač", bull: "Bullet", rarr: "Desna strelica", rArr: "Desna dvostruka strelica", hArr: "Dvostruka strelica",
+ diams: "Crni dijamant", asymp: "Približno"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/hu.js b/plugins/specialchar/dialogs/lang/hu.js
new file mode 100755
index 0000000..b5e8c2c
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/hu.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","hu",{euro:"Euró jel",lsquo:"Bal szimpla idézőjel",rsquo:"Jobb szimpla idézőjel",ldquo:"Bal dupla idézőjel",rdquo:"Jobb dupla idézőjel",ndash:"Rövid gondolatjel",mdash:"Hosszú gondolatjel",iexcl:"Fordított felkiáltójel",cent:"Cent jel",pound:"Font jel",curren:"Valuta jel",yen:"Yen jel",brvbar:"Hosszú kettőspont",sect:"Paragrafus jel",uml:"Kettős hangzó jel",copy:"Szerzői jog jel",ordf:"Női sorrend mutatója",laquo:"Balra mutató duplanyíl",not:"Feltételes kötőjel",
+reg:"Bejegyzett védjegy jele",macr:"Hosszúsági jel",deg:"Fok jel",sup2:"Négyzeten jel",sup3:"Köbön jel",acute:"Éles ékezet",micro:"Mikro-jel",para:"Bekezdés jel",middot:"Közép pont",cedil:"Cédille",sup1:"Elsőn jel",ordm:"Férfi sorrend mutatója",raquo:"Jobbra mutató duplanyíl",frac14:"Egy negyed jel",frac12:"Egy ketted jel",frac34:"Három negyed jel",iquest:"Fordított kérdőjel",Agrave:"Latin nagy A fordított ékezettel",Aacute:"Latin nagy A normál ékezettel",Acirc:"Latin nagy A hajtott ékezettel",Atilde:"Latin nagy A hullámjellel",
+Auml:"Latin nagy A kettőspont ékezettel",Aring:"Latin nagy A gyűrű ékezettel",AElig:"Latin nagy Æ betű",Ccedil:"Latin nagy C cedillával",Egrave:"Latin nagy E fordított ékezettel",Eacute:"Latin nagy E normál ékezettel",Ecirc:"Latin nagy E hajtott ékezettel",Euml:"Latin nagy E dupla kettőspont ékezettel",Igrave:"Latin nagy I fordított ékezettel",Iacute:"Latin nagy I normál ékezettel",Icirc:"Latin nagy I hajtott ékezettel",Iuml:"Latin nagy I kettőspont ékezettel",ETH:"Latin nagy Eth betű",Ntilde:"Latin nagy N hullámjellel",
+Ograve:"Latin nagy O fordított ékezettel",Oacute:"Latin nagy O normál ékezettel",Ocirc:"Latin nagy O hajtott ékezettel",Otilde:"Latin nagy O hullámjellel",Ouml:"Latin nagy O kettőspont ékezettel",times:"Szorzás jel",Oslash:"Latin O betű áthúzással",Ugrave:"Latin nagy U fordított ékezettel",Uacute:"Latin nagy U normál ékezettel",Ucirc:"Latin nagy U hajtott ékezettel",Uuml:"Latin nagy U kettőspont ékezettel",Yacute:"Latin nagy Y normál ékezettel",THORN:"Latin nagy Thorn betű",szlig:"Latin kis s betű",
+agrave:"Latin kis a fordított ékezettel",aacute:"Latin kis a normál ékezettel",acirc:"Latin kis a hajtott ékezettel",atilde:"Latin kis a hullámjellel",auml:"Latin kis a kettőspont ékezettel",aring:"Latin kis a gyűrű ékezettel",aelig:"Latin kis æ betű",ccedil:"Latin kis c cedillával",egrave:"Latin kis e fordított ékezettel",eacute:"Latin kis e normál ékezettel",ecirc:"Latin kis e hajtott ékezettel",euml:"Latin kis e dupla kettőspont ékezettel",igrave:"Latin kis i fordított ékezettel",iacute:"Latin kis i normál ékezettel",
+icirc:"Latin kis i hajtott ékezettel",iuml:"Latin kis i kettőspont ékezettel",eth:"Latin kis eth betű",ntilde:"Latin kis n hullámjellel",ograve:"Latin kis o fordított ékezettel",oacute:"Latin kis o normál ékezettel",ocirc:"Latin kis o hajtott ékezettel",otilde:"Latin kis o hullámjellel",ouml:"Latin kis o kettőspont ékezettel",divide:"Osztásjel",oslash:"Latin kis o betű áthúzással",ugrave:"Latin kis u fordított ékezettel",uacute:"Latin kis u normál ékezettel",ucirc:"Latin kis u hajtott ékezettel",
+uuml:"Latin kis u kettőspont ékezettel",yacute:"Latin kis y normál ékezettel",thorn:"Latin kis thorn jel",yuml:"Latin kis y kettőspont ékezettel",OElig:"Latin nagy OE-jel",oelig:"Latin kis oe-jel",372:"Latin nagy W hajtott ékezettel",374:"Latin nagy Y hajtott ékezettel",373:"Latin kis w hajtott ékezettel",375:"Latin kis y hajtott ékezettel",sbquo:"Nyitó nyomdai szimpla idézőjel",8219:"Záró nyomdai záró idézőjel",bdquo:"Nyitó nyomdai dupla idézőjel",hellip:"Három pont",trade:"Kereskedelmi védjegy jele",
+9658:"Jobbra mutató fekete mutató",bull:"Golyó",rarr:"Jobbra mutató nyíl",rArr:"Jobbra mutató duplanyíl",hArr:"Bal-jobb duplanyíl",diams:"Fekete gyémánt jel",asymp:"Majdnem egyenlő jel"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/id.js b/plugins/specialchar/dialogs/lang/id.js
new file mode 100755
index 0000000..5406138
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/id.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "id", {
+ euro: "Tanda Euro", lsquo: "Left single quotation mark", rsquo: "Right single quotation mark", ldquo: "Left double quotation mark", rdquo: "Right double quotation mark", ndash: "En dash", mdash: "Em dash", iexcl: "Inverted exclamation mark", cent: "Cent sign", pound: "Pound sign", curren: "Currency sign", yen: "Tanda Yen", brvbar: "Broken bar", sect: "Section sign", uml: "Diaeresis", copy: "Tanda Hak Cipta", ordf: "Feminine ordinal indicator", laquo: "Left-pointing double angle quotation mark",
+ not: "Not sign", reg: "Tanda Telah Terdaftar", macr: "Macron", deg: "Degree sign", sup2: "Superscript two", sup3: "Superscript three", acute: "Acute accent", micro: "Micro sign", para: "Pilcrow sign", middot: "Middle dot", cedil: "Cedilla", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis",
+ aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth",
+ ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Division sign", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis",
+ yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis",
+ trade: "Trade mark sign", 9658: "Black right-pointing pointer", bull: "Bullet", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Almost equal to"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/it.js b/plugins/specialchar/dialogs/lang/it.js
new file mode 100755
index 0000000..a593296
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/it.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","it",{euro:"Simbolo Euro",lsquo:"Virgoletta singola sinistra",rsquo:"Virgoletta singola destra",ldquo:"Virgolette aperte",rdquo:"Virgolette chiuse",ndash:"Trattino",mdash:"Trattino lungo",iexcl:"Punto esclavamativo invertito",cent:"Simbolo Cent",pound:"Simbolo Sterlina",curren:"Simbolo Moneta",yen:"Simbolo Yen",brvbar:"Barra interrotta",sect:"Simbolo di sezione",uml:"Dieresi",copy:"Simbolo Copyright",ordf:"Indicatore ordinale femminile",laquo:"Virgolette basse aperte",
+not:"Nessun segno",reg:"Simbolo Registrato",macr:"Macron",deg:"Simbolo Grado",sup2:"Apice Due",sup3:"Apice Tre",acute:"Accento acuto",micro:"Simbolo Micro",para:"Simbolo Paragrafo",middot:"Punto centrale",cedil:"Cediglia",sup1:"Apice Uno",ordm:"Indicatore ordinale maschile",raquo:"Virgolette basse chiuse",frac14:"Frazione volgare un quarto",frac12:"Frazione volgare un mezzo",frac34:"Frazione volgare tre quarti",iquest:"Punto interrogativo invertito",Agrave:"Lettera maiuscola latina A con accento grave",
+Aacute:"Lettera maiuscola latina A con accento acuto",Acirc:"Lettera maiuscola latina A con accento circonflesso",Atilde:"Lettera maiuscola latina A con tilde",Auml:"Lettera maiuscola latina A con dieresi",Aring:"Lettera maiuscola latina A con anello sopra",AElig:"Lettera maiuscola latina Æ",Ccedil:"Lettera maiuscola latina C con cediglia",Egrave:"Lettera maiuscola latina E con accento grave",Eacute:"Lettera maiuscola latina E con accento acuto",Ecirc:"Lettera maiuscola latina E con accento circonflesso",
+Euml:"Lettera maiuscola latina E con dieresi",Igrave:"Lettera maiuscola latina I con accento grave",Iacute:"Lettera maiuscola latina I con accento acuto",Icirc:"Lettera maiuscola latina I con accento circonflesso",Iuml:"Lettera maiuscola latina I con dieresi",ETH:"Lettera maiuscola latina Eth",Ntilde:"Lettera maiuscola latina N con tilde",Ograve:"Lettera maiuscola latina O con accento grave",Oacute:"Lettera maiuscola latina O con accento acuto",Ocirc:"Lettera maiuscola latina O con accento circonflesso",
+Otilde:"Lettera maiuscola latina O con tilde",Ouml:"Lettera maiuscola latina O con dieresi",times:"Simbolo di moltiplicazione",Oslash:"Lettera maiuscola latina O barrata",Ugrave:"Lettera maiuscola latina U con accento grave",Uacute:"Lettera maiuscola latina U con accento acuto",Ucirc:"Lettera maiuscola latina U con accento circonflesso",Uuml:"Lettera maiuscola latina U con accento circonflesso",Yacute:"Lettera maiuscola latina Y con accento acuto",THORN:"Lettera maiuscola latina Thorn",szlig:"Lettera latina minuscola doppia S",
+agrave:"Lettera minuscola latina a con accento grave",aacute:"Lettera minuscola latina a con accento acuto",acirc:"Lettera minuscola latina a con accento circonflesso",atilde:"Lettera minuscola latina a con tilde",auml:"Lettera minuscola latina a con dieresi",aring:"Lettera minuscola latina a con anello superiore",aelig:"Lettera minuscola latina ae",ccedil:"Lettera minuscola latina c con cediglia",egrave:"Lettera minuscola latina e con accento grave",eacute:"Lettera minuscola latina e con accento acuto",
+ecirc:"Lettera minuscola latina e con accento circonflesso",euml:"Lettera minuscola latina e con dieresi",igrave:"Lettera minuscola latina i con accento grave",iacute:"Lettera minuscola latina i con accento acuto",icirc:"Lettera minuscola latina i con accento circonflesso",iuml:"Lettera minuscola latina i con dieresi",eth:"Lettera minuscola latina eth",ntilde:"Lettera minuscola latina n con tilde",ograve:"Lettera minuscola latina o con accento grave",oacute:"Lettera minuscola latina o con accento acuto",
+ocirc:"Lettera minuscola latina o con accento circonflesso",otilde:"Lettera minuscola latina o con tilde",ouml:"Lettera minuscola latina o con dieresi",divide:"Simbolo di divisione",oslash:"Lettera minuscola latina o barrata",ugrave:"Lettera minuscola latina u con accento grave",uacute:"Lettera minuscola latina u con accento acuto",ucirc:"Lettera minuscola latina u con accento circonflesso",uuml:"Lettera minuscola latina u con dieresi",yacute:"Lettera minuscola latina y con accento acuto",thorn:"Lettera minuscola latina thorn",
+yuml:"Lettera minuscola latina y con dieresi",OElig:"Legatura maiuscola latina OE",oelig:"Legatura minuscola latina oe",372:"Lettera maiuscola latina W con accento circonflesso",374:"Lettera maiuscola latina Y con accento circonflesso",373:"Lettera minuscola latina w con accento circonflesso",375:"Lettera minuscola latina y con accento circonflesso",sbquo:"Singola virgoletta bassa low-9",8219:"Singola virgoletta bassa low-9 inversa",bdquo:"Doppia virgoletta bassa low-9",hellip:"Ellissi orizzontale",
+trade:"Simbolo TM",9658:"Puntatore nero rivolto verso destra",bull:"Punto",rarr:"Freccia verso destra",rArr:"Doppia freccia verso destra",hArr:"Doppia freccia sinistra destra",diams:"Simbolo nero diamante",asymp:"Quasi uguale a"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/ja.js b/plugins/specialchar/dialogs/lang/ja.js
new file mode 100755
index 0000000..c55dba7
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/ja.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "ja", {
+ euro: "ユーロ記号", lsquo: "左シングル引用符", rsquo: "右シングル引用符", ldquo: "左ダブル引用符", rdquo: "右ダブル引用符", ndash: "半角ダッシュ", mdash: "全角ダッシュ", iexcl: "逆さ感嘆符", cent: "セント記号", pound: "ポンド記号", curren: "通貨記号", yen: "円記号", brvbar: "上下に分かれた縦棒", sect: "節記号", uml: "分音記号(ウムラウト)", copy: "著作権表示記号", ordf: "女性序数標識", laquo: " 始め二重山括弧引用記号", not: "論理否定記号", reg: "登録商標記号", macr: "長音符", deg: "度記号", sup2: "上つき2, 2乗", sup3: "上つき3, 3乗", acute: "揚音符", micro: "ミクロン記号", para: "段落記号", middot: "中黒", cedil: "セディラ", sup1: "上つき1", ordm: "男性序数標識", raquo: "終わり二重山括弧引用記号",
+ frac14: "四分の一", frac12: "二分の一", frac34: "四分の三", iquest: "逆疑問符", Agrave: "抑音符つき大文字A", Aacute: "揚音符つき大文字A", Acirc: "曲折アクセントつき大文字A", Atilde: "チルダつき大文字A", Auml: "分音記号つき大文字A", Aring: "リングつき大文字A", AElig: "AとEの合字", Ccedil: "セディラつき大文字C", Egrave: "抑音符つき大文字E", Eacute: "揚音符つき大文字E", Ecirc: "曲折アクセントつき大文字E", Euml: "分音記号つき大文字E", Igrave: "抑音符つき大文字I", Iacute: "揚音符つき大文字I", Icirc: "曲折アクセントつき大文字I", Iuml: "分音記号つき大文字I", ETH: "[アイスランド語]大文字ETH", Ntilde: "チルダつき大文字N", Ograve: "抑音符つき大文字O", Oacute: "揚音符つき大文字O", Ocirc: "曲折アクセントつき大文字O", Otilde: "チルダつき大文字O", Ouml: " 分音記号つき大文字O",
+ times: "乗算記号", Oslash: "打ち消し線つき大文字O", Ugrave: "抑音符つき大文字U", Uacute: "揚音符つき大文字U", Ucirc: "曲折アクセントつき大文字U", Uuml: "分音記号つき大文字U", Yacute: "揚音符つき大文字Y", THORN: "[アイスランド語]大文字THORN", szlig: "ドイツ語エスツェット", agrave: "抑音符つき小文字a", aacute: "揚音符つき小文字a", acirc: "曲折アクセントつき小文字a", atilde: "チルダつき小文字a", auml: "分音記号つき小文字a", aring: "リングつき小文字a", aelig: "aとeの合字", ccedil: "セディラつき小文字c", egrave: "抑音符つき小文字e", eacute: "揚音符つき小文字e", ecirc: "曲折アクセントつき小文字e", euml: "分音記号つき小文字e", igrave: "抑音符つき小文字i", iacute: "揚音符つき小文字i", icirc: "曲折アクセントつき小文字i", iuml: "分音記号つき小文字i", eth: "アイスランド語小文字eth",
+ ntilde: "チルダつき小文字n", ograve: "抑音符つき小文字o", oacute: "揚音符つき小文字o", ocirc: "曲折アクセントつき小文字o", otilde: "チルダつき小文字o", ouml: "分音記号つき小文字o", divide: "除算記号", oslash: "打ち消し線つき小文字o", ugrave: "抑音符つき小文字u", uacute: "揚音符つき小文字u", ucirc: "曲折アクセントつき小文字u", uuml: "分音記号つき小文字u", yacute: "揚音符つき小文字y", thorn: "アイスランド語小文字thorn", yuml: "分音記号つき小文字y", OElig: "OとEの合字", oelig: "oとeの合字", 372: "曲折アクセントつき大文字W", 374: "曲折アクセントつき大文字Y", 373: "曲折アクセントつき小文字w", 375: "曲折アクセントつき小文字y", sbquo: "シングル下引用符", 8219: "左右逆の左引用符", bdquo: "ダブル下引用符", hellip: "三点リーダ", trade: "商標記号", 9658: "右黒三角ポインタ", bull: "黒丸",
+ rarr: "右矢印", rArr: "右二重矢印", hArr: "左右二重矢印", diams: "ダイヤ", asymp: "漸近"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/km.js b/plugins/specialchar/dialogs/lang/km.js
new file mode 100755
index 0000000..ebdbf06
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/km.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "km", {
+ euro: "សញ្ញា​អឺរ៉ូ", lsquo: "Left single quotation mark", rsquo: "Right single quotation mark", ldquo: "Left double quotation mark", rdquo: "Right double quotation mark", ndash: "En dash", mdash: "Em dash", iexcl: "Inverted exclamation mark", cent: "សញ្ញា​សេន", pound: "សញ្ញា​ផោន", curren: "សញ្ញា​រូបិយបណ្ណ", yen: "សញ្ញា​យ៉េន", brvbar: "Broken bar", sect: "Section sign", uml: "Diaeresis", copy: "សញ្ញា​រក្សា​សិទ្ធិ", ordf: "Feminine ordinal indicator", laquo: "Left-pointing double angle quotation mark",
+ not: "Not sign", reg: "Registered sign", macr: "Macron", deg: "សញ្ញា​ដឺក្រេ", sup2: "Superscript two", sup3: "Superscript three", acute: "Acute accent", micro: "សញ្ញា​មីក្រូ", para: "Pilcrow sign", middot: "Middle dot", cedil: "Cedilla", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis",
+ aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth",
+ ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Division sign", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis",
+ yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis",
+ trade: "Trade mark sign", 9658: "Black right-pointing pointer", bull: "Bullet", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Almost equal to"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/ko.js b/plugins/specialchar/dialogs/lang/ko.js
new file mode 100755
index 0000000..2c3e15f
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/ko.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "ko", {
+ euro: "유로화 기호", lsquo: "왼쪽 외 따옴표", rsquo: "오른쪽 외 따옴표", ldquo: "왼쪽 쌍 따옴표", rdquo: "오른쪽 쌍 따옴표", ndash: "반각 대시", mdash: "전각 대시", iexcl: "반전된 느낌표", cent: "센트 기호", pound: "파운드화 기호", curren: "커런시 기호", yen: "위안화 기호", brvbar: "파선", sect: "섹션 기호", uml: "분음 부호", copy: "저작권 기호", ordf: "Feminine ordinal indicator", laquo: "왼쪽 쌍꺽쇠 인용 부호", not: "금지 기호", reg: "등록 기호", macr: "장음 기호", deg: "도 기호", sup2: "위첨자 2", sup3: "위첨자 3", acute: "양음 악센트 부호", micro: "마이크로 기호", para: "단락 기호", middot: "가운데 점", cedil: "세디유", sup1: "위첨자 1", ordm: "Masculine ordinal indicator",
+ raquo: "오른쪽 쌍꺽쇠 인용 부호", frac14: "분수 사분의 일", frac12: "분수 이분의 일", frac34: "분수 사분의 삼", iquest: "뒤집힌 물음표", Agrave: "억음 부호가 있는 라틴 대문자 A", Aacute: "양음 악센트 부호가 있는 라틴 대문자 A", Acirc: "곡절 악센트 부호가 있는 라틴 대문자 A", Atilde: "틸데가 있는 라틴 대문자 A", Auml: "분음 기호가 있는 라틴 대문자 A", Aring: "윗고리가 있는 라틴 대문자 A", AElig: "라틴 대문자 Æ", Ccedil: "세디유가 있는 라틴 대문자 C", Egrave: "억음 부호가 있는 라틴 대문자 E", Eacute: "양음 악센트 부호가 있는 라틴 대문자 E", Ecirc: "곡절 악센트 부호가 있는 라틴 대문자 E", Euml: "분음 기호가 있는 라틴 대문자 E", Igrave: "억음 부호가 있는 라틴 대문자 I", Iacute: "양음 악센트 부호가 있는 라틴 대문자 I", Icirc: "곡절 악센트 부호가 있는 라틴 대문자 I",
+ Iuml: "분음 기호가 있는 라틴 대문자 I", ETH: "라틴 대문자 Eth", Ntilde: "틸데가 있는 라틴 대문자 N", Ograve: "억음 부호가 있는 라틴 대문자 O", Oacute: "양음 부호가 있는 라틴 대문자 O", Ocirc: "곡절 악센트 부호가 있는 라틴 대문자 O", Otilde: "틸데가 있는 라틴 대문자 O", Ouml: "분음 기호가 있는 라틴 대문자 O", times: "곱하기 기호", Oslash: "사선이 있는 라틴 대문자 O", Ugrave: "억음 부호가 있는 라틴 대문자 U", Uacute: "양음 부호가 있는 라틴 대문자 U", Ucirc: "곡절 악센트 부호가 있는 라틴 대문자 U", Uuml: "분음 기호가 있는 라틴 대문자 U", Yacute: "양음 부호가 있는 라틴 대문자 Y", THORN: "라틴 대문자 Thorn", szlig: "라틴 소문자 sharp s", agrave: "억음 부호가 있는 라틴 소문자 a", aacute: "양음 부호가 있는 라틴 소문자 a", acirc: "곡절 악센트 부호가 있는 라틴 소문자 a",
+ atilde: "틸데가 있는 라틴 소문자 a", auml: "분음 기호가 있는 라틴 소문자 a", aring: "윗고리가 있는 라틴 소문자 a", aelig: "라틴 소문자 æ", ccedil: "세디유가 있는 라틴 소문자 c", egrave: "억음 부호가 있는 라틴 소문자 e", eacute: "양음 부호가 있는 라틴 소문자 e", ecirc: "곡절 악센트 부호가 있는 라틴 소문자 e", euml: "분음 기호가 있는 라틴 소문자 e", igrave: "억음 부호가 있는 라틴 소문자 i", iacute: "양음 부호가 있는 라틴 소문자 i", icirc: "곡절 악센트 부호가 있는 라틴 소문자 i", iuml: "분음 기호가 있는 라틴 소문자 i", eth: "라틴 소문자 eth", ntilde: "틸데가 있는 라틴 소문자 n", ograve: "억음 부호가 있는 라틴 소문자 o", oacute: "양음 부호가 있는 라틴 소문자 o", ocirc: "곡절 악센트 부호가 있는 라틴 소문자 o", otilde: "틸데가 있는 라틴 소문자 o", ouml: "분음 기호가 있는 라틴 소문자 o",
+ divide: "나누기 기호", oslash: "사선이 있는 라틴 소문자 o", ugrave: "억음 부호가 있는 라틴 소문자 u", uacute: "양음 부호가 있는 라틴 소문자 u", ucirc: "곡절 악센트 부호가 있는 라틴 소문자 u", uuml: "분음 기호가 있는 라틴 소문자 u", yacute: "양음 부호가 있는 라틴 소문자 y", thorn: "라틴 소문자 thorn", yuml: "분음 기호가 있는 라틴 소문자 y", OElig: "라틴 대문합자 OE", oelig: "라틴 소문합자 oe", 372: "곡절 악센트 부호가 있는 라틴 대문자 W", 374: "곡절 악센트 부호가 있는 라틴 대문자 Y", 373: "곡절 악센트 부호가 있는 라틴 소문자 w", 375: "곡절 악센트 부호가 있는 라틴 소문자 y", sbquo: "외 아래-9 인용 부호", 8219: "외 위쪽-뒤집힌-9 인용 부호", bdquo: "쌍 아래-9 인용 부호", hellip: "수평 생략 부호", trade: "상표 기호", 9658: "검정 오른쪽 포인터", bull: "큰 점",
+ rarr: "오른쪽 화살표", rArr: "오른쪽 두 줄 화살표", hArr: "양쪽 두 줄 화살표", diams: "검정 다이아몬드", asymp: "근사"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/ku.js b/plugins/specialchar/dialogs/lang/ku.js
new file mode 100755
index 0000000..685c669
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/ku.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","ku",{euro:"نیشانەی یۆرۆ",lsquo:"نیشانەی فاریزەی سەرووژێری تاکی چەپ",rsquo:"نیشانەی فاریزەی سەرووژێری تاکی ڕاست",ldquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی چه‌پ",rdquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی ڕاست",ndash:"تەقەڵی کورت",mdash:"تەقەڵی درێژ",iexcl:"نیشانەی هەڵەوگێڕی سەرسوڕهێنەر",cent:"نیشانەی سەنت",pound:"نیشانەی پاوەند",curren:"نیشانەی دراو",yen:"نیشانەی یەنی ژاپۆنی",brvbar:"شریتی ئەستوونی پچڕاو",sect:"نیشانەی دوو s لەسەریەک",uml:"خاڵ",copy:"نیشانەی مافی چاپ",
+ordf:"هێڵ لەسەر پیتی a",laquo:"دوو تیری بەدووایەکی چەپ",not:"نیشانەی نەخێر",reg:"نیشانەی R لەناو بازنەدا",macr:"ماکڕۆن",deg:"نیشانەی پلە",sup2:"سەرنووسی دوو",sup3:"سەرنووسی سێ",acute:"لاری تیژ",micro:"نیشانەی u لق درێژی چەپی خواروو",para:"نیشانەی پەڕەگراف",middot:"ناوەڕاستی خاڵ",cedil:"نیشانەی c ژێر چووکرە",sup1:"سەرنووسی یەک",ordm:"هێڵ لەژێر پیتی o",raquo:"دوو تیری بەدووایەکی ڕاست",frac14:"یەک لەسەر چووار",frac12:"یەک لەسەر دوو",frac34:"سێ لەسەر چووار",iquest:"هێمای هەڵەوگێری پرسیار",Agrave:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری لار",
+Aacute:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری تیژ",Acirc:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Atilde:"پیتی لاتینی A-ی گەورە لەگەڵ زەڕە",Auml:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Aring:"پیتی لاتینی گەورەی Å",AElig:"پیتی لاتینی گەورەی Æ",Ccedil:"پیتی لاتینی C-ی گەورە لەگەڵ ژێر چووکرە",Egrave:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری لار",Eacute:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ecirc:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری",Euml:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری",
+Igrave:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری لار",Iacute:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری تیژ",Icirc:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",Iuml:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",ETH:"پیتی لاتینی E-ی گەورەی",Ntilde:"پیتی لاتینی N-ی گەورە لەگەڵ زەڕە",Ograve:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری لار",Oacute:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ocirc:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری",Otilde:"پیتی لاتینی O-ی گەورە لەگەڵ زەڕە",Ouml:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری",
+times:"نیشانەی لێکدان",Oslash:"پیتی لاتینی گەورەی Ø لەگەڵ هێمای دڵ وەستان",Ugrave:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری لار",Uacute:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ucirc:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Uuml:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Yacute:"پیتی لاتینی Y-ی گەورە لەگەڵ ڕوومەتداری تیژ",THORN:"پیتی لاتینی دڕکی گەورە",szlig:"پیتی لاتنی نووک تیژی s",agrave:"پیتی لاتینی a-ی بچووک لەگەڵ ڕوومەتداری لار",aacute:"پیتی لاتینی a-ی بچووك لەگەڵ ڕوومەتداری تیژ",acirc:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری",
+atilde:"پیتی لاتینی a-ی بچووك لەگەڵ زەڕە",auml:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری",aring:"پیتی لاتینی å-ی بچووك",aelig:"پیتی لاتینی æ-ی بچووك",ccedil:"پیتی لاتینی c-ی بچووك لەگەڵ ژێر چووکرە",egrave:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری لار",eacute:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری تیژ",ecirc:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",euml:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",igrave:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری لار",iacute:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری تیژ",
+icirc:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",iuml:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",eth:"پیتی لاتینی e-ی بچووك",ntilde:"پیتی لاتینی n-ی بچووك لەگەڵ زەڕە",ograve:"پیتی لاتینی o-ی بچووك لەگەڵ ڕوومەتداری لار",oacute:"پیتی لاتینی o-ی بچووك له‌گەڵ ڕوومەتداری تیژ",ocirc:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",otilde:"پیتی لاتینی o-ی بچووك لەگەڵ زەڕە",ouml:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",divide:"نیشانەی دابەش",oslash:"پیتی لاتینی گەورەی ø لەگەڵ هێمای دڵ وەستان",ugrave:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری لار",
+uacute:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری تیژ",ucirc:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",uuml:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",yacute:"پیتی لاتینی y-ی بچووك لەگەڵ ڕوومەتداری تیژ",thorn:"پیتی لاتینی دڕکی بچووك",yuml:"پیتی لاتینی y-ی بچووك لەگەڵ نیشانە لەسەری",OElig:"پیتی لاتینی گەورەی پێکەوەنووسراوی OE",oelig:"پیتی لاتینی بچووکی پێکەوەنووسراوی oe",372:"پیتی لاتینی W-ی گەورە لەگەڵ نیشانە لەسەری",374:"پیتی لاتینی Y-ی گەورە لەگەڵ نیشانە لەسەری",373:"پیتی لاتینی w-ی بچووکی لەگەڵ نیشانە لەسەری",
+375:"پیتی لاتینی y-ی بچووکی لەگەڵ نیشانە لەسەری",sbquo:"نیشانەی فاریزەی نزم",8219:"نیشانەی فاریزەی بەرزی پێچەوانە",bdquo:"دوو فاریزەی تەنیش یەك",hellip:"ئاسۆیی بازنە",trade:"نیشانەی بازرگانی",9658:"ئاراستەی ڕەشی دەستی ڕاست",bull:"فیشەك",rarr:"تیری دەستی ڕاست",rArr:"دووتیری دەستی ڕاست",hArr:"دوو تیری ڕاست و چەپ",diams:"ڕەشی پاقڵاوەیی",asymp:"نیشانەی یەکسانە"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/lt.js b/plugins/specialchar/dialogs/lang/lt.js
new file mode 100755
index 0000000..7dcd93c
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/lt.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "lt", {
+ euro: "Euro ženklas", lsquo: "Left single quotation mark", rsquo: "Right single quotation mark", ldquo: "Left double quotation mark", rdquo: "Right double quotation mark", ndash: "En dash", mdash: "Em dash", iexcl: "Inverted exclamation mark", cent: "Cento ženklas", pound: "Svaro ženklas", curren: "Valiutos ženklas", yen: "Jenos ženklas", brvbar: "Broken bar", sect: "Section sign", uml: "Diaeresis", copy: "Copyright sign", ordf: "Feminine ordinal indicator", laquo: "Left-pointing double angle quotation mark",
+ not: "Ne ženklas", reg: "Registered sign", macr: "Makronas", deg: "Laipsnio ženklas", sup2: "Superscript two", sup3: "Superscript three", acute: "Acute accent", micro: "Mikro ženklas", para: "Pilcrow sign", middot: "Vidurinis taškas", cedil: "Cedilla", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent",
+ Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent",
+ Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke",
+ Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis",
+ aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth",
+ ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Division sign", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis",
+ yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis",
+ trade: "Trade mark sign", 9658: "Black right-pointing pointer", bull: "Bullet", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Almost equal to"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/lv.js b/plugins/specialchar/dialogs/lang/lv.js
new file mode 100755
index 0000000..80d3dc2
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/lv.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "lv", {
+ euro: "Euro zīme", lsquo: "Kreisā vienkārtīga pēdiņa", rsquo: "Labā vienkārtīga pēdiņa", ldquo: "Kreisā dubult pēdiņa", rdquo: "Labā dubult pēdiņa", ndash: "En svītra", mdash: "Em svītra", iexcl: "Apgriezta izsaukuma zīme", cent: "Centu naudas zīme", pound: "Sterliņu mārciņu naudas zīme", curren: "Valūtas zīme", yen: "Jenu naudas zīme", brvbar: "Vertikāla pārrauta līnija", sect: "Paragrāfa zīme", uml: "Diakritiska zīme", copy: "Autortiesību zīme", ordf: "Sievišķas kārtas rādītājs",
+ laquo: "Kreisā dubult stūra pēdiņu zīme", not: "Neparakstīts", reg: "Reģistrēta zīme", macr: "Garumzīme", deg: "Grādu zīme", sup2: "Augšraksts divi", sup3: "Augšraksts trīs", acute: "Akūta uzsvara zīme", micro: "Mikro zīme", para: "Rindkopas zīme ", middot: "Vidējs punkts", cedil: "Āķītis zem burta", sup1: "Augšraksts viens", ordm: "Vīrišķīgas kārtas rādītājs", raquo: "Labā dubult stūra pēdiņu zīme", frac14: "Vulgāra frakcija 1/4", frac12: "Vulgāra frakcija 1/2", frac34: "Vulgāra frakcija 3/4", iquest: "Apgriezta jautājuma zīme", Agrave: "Lielais latīņu burts A ar uzsvara zīmi",
+ Aacute: "Lielais latīņu burts A ar akūtu uzsvara zīmi", Acirc: "Lielais latīņu burts A ar diakritisku zīmi", Atilde: "Lielais latīņu burts A ar tildi ", Auml: "Lielais latīņu burts A ar diakritisko zīmi", Aring: "Lielais latīņu burts A ar aplīti augšā", AElig: "Lielais latīņu burts Æ", Ccedil: "Lielais latīņu burts C ar āķīti zem burta", Egrave: "Lielais latīņu burts E ar apostrofu", Eacute: "Lielais latīņu burts E ar akūtu uzsvara zīmi", Ecirc: "Lielais latīņu burts E ar diakritisko zīmi", Euml: "Lielais latīņu burts E ar diakritisko zīmi",
+ Igrave: "Lielais latīņu burts I ar uzsvaras zīmi", Iacute: "Lielais latīņu burts I ar akūtu uzsvara zīmi", Icirc: "Lielais latīņu burts I ar diakritisko zīmi", Iuml: "Lielais latīņu burts I ar diakritisko zīmi", ETH: "Lielais latīņu burts Eth", Ntilde: "Lielais latīņu burts N ar tildi", Ograve: "Lielais latīņu burts O ar uzsvara zīmi", Oacute: "Lielais latīņu burts O ar akūto uzsvara zīmi", Ocirc: "Lielais latīņu burts O ar diakritisko zīmi", Otilde: "Lielais latīņu burts O ar tildi", Ouml: "Lielais latīņu burts O ar diakritisko zīmi",
+ times: "Reizināšanas zīme ", Oslash: "Lielais latīņu burts O ar iesvītrojumu", Ugrave: "Lielais latīņu burts U ar uzsvaras zīmi", Uacute: "Lielais latīņu burts U ar akūto uzsvars zīmi", Ucirc: "Lielais latīņu burts U ar diakritisko zīmi", Uuml: "Lielais latīņu burts U ar diakritisko zīmi", Yacute: "Lielais latīņu burts Y ar akūto uzsvaras zīmi", THORN: "Lielais latīņu burts torn", szlig: "Mazs latīņu burts ar ligatūru", agrave: "Mazs latīņu burts a ar uzsvara zīmi", aacute: "Mazs latīņu burts a ar akūto uzsvara zīmi",
+ acirc: "Mazs latīņu burts a ar diakritisko zīmi", atilde: "Mazs latīņu burts a ar tildi", auml: "Mazs latīņu burts a ar diakritisko zīmi", aring: "Mazs latīņu burts a ar aplīti augšā", aelig: "Mazs latīņu burts æ", ccedil: "Mazs latīņu burts c ar āķīti zem burta", egrave: "Mazs latīņu burts e ar uzsvara zīmi ", eacute: "Mazs latīņu burts e ar akūtu uzsvara zīmi", ecirc: "Mazs latīņu burts e ar diakritisko zīmi", euml: "Mazs latīņu burts e ar diakritisko zīmi", igrave: "Mazs latīņu burts i ar uzsvara zīmi ", iacute: "Mazs latīņu burts i ar akūtu uzsvara zīmi",
+ icirc: "Mazs latīņu burts i ar diakritisko zīmi", iuml: "Mazs latīņu burts i ar diakritisko zīmi", eth: "Mazs latīņu burts eth", ntilde: "Mazs latīņu burts n ar tildi", ograve: "Mazs latīņu burts o ar uzsvara zīmi ", oacute: "Mazs latīņu burts o ar akūtu uzsvara zīmi", ocirc: "Mazs latīņu burts o ar diakritisko zīmi", otilde: "Mazs latīņu burts o ar tildi", ouml: "Mazs latīņu burts o ar diakritisko zīmi", divide: "Dalīšanas zīme", oslash: "Mazs latīņu burts o ar iesvītrojumu", ugrave: "Mazs latīņu burts u ar uzsvara zīmi ",
+ uacute: "Mazs latīņu burts u ar akūtu uzsvara zīmi", ucirc: "Mazs latīņu burts u ar diakritisko zīmi", uuml: "Mazs latīņu burts u ar diakritisko zīmi", yacute: "Mazs latīņu burts y ar akūtu uzsvaras zīmi", thorn: "Mazs latīņu burts torns", yuml: "Mazs latīņu burts y ar diakritisko zīmi", OElig: "Liela latīņu ligatūra OE", oelig: "Maza latīņu ligatūra oe", 372: "Liels latīņu burts W ar diakritisko zīmi ", 374: "Liels latīņu burts Y ar diakritisko zīmi ", 373: "Mazs latīņu burts w ar diakritisko zīmi ", 375: "Mazs latīņu burts y ar diakritisko zīmi ",
+ sbquo: "Mazas-9 vienkārtīgas pēdiņas", 8219: "Lielas-9 vienkārtīgas apgrieztas pēdiņas", bdquo: "Mazas-9 dubultas pēdiņas", hellip: "Horizontāli daudzpunkti", trade: "Preču zīmes zīme", 9658: "Melns pa labi pagriezts radītājs", bull: "Lode", rarr: "Bulta pa labi", rArr: "Dubulta Bulta pa labi", hArr: "Bulta pa kreisi", diams: "Dubulta Bulta pa kreisi", asymp: "Gandrīz vienāds ar"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/nb.js b/plugins/specialchar/dialogs/lang/nb.js
new file mode 100755
index 0000000..b7906f8
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/nb.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "nb", {
+ euro: "Eurosymbol", lsquo: "Venstre enkelt anførselstegn", rsquo: "Høyre enkelt anførselstegn", ldquo: "Venstre dobbelt anførselstegn", rdquo: "Høyre anførsesltegn", ndash: "Kort tankestrek", mdash: "Lang tankestrek", iexcl: "Omvendt utropstegn", cent: "Centsymbol", pound: "Pundsymbol", curren: "Valutategn", yen: "Yensymbol", brvbar: "Brutt loddrett strek", sect: "Paragraftegn", uml: "Tøddel", copy: "Copyrighttegn", ordf: "Feminin ordensindikator", laquo: "Venstre anførselstegn", not: "Negasjonstegn",
+ reg: "Registrert varemerke-tegn", macr: "Makron", deg: "Gradsymbol", sup2: "Hevet totall", sup3: "Hevet tretall", acute: "Akutt aksent", micro: "Mikrosymbol", para: "Avsnittstegn", middot: "Midtstilt prikk", cedil: "Cedille", sup1: "Hevet ettall", ordm: "Maskulin ordensindikator", raquo: "Høyre anførselstegn", frac14: "Fjerdedelsbrøk", frac12: "Halvbrøk", frac34: "Tre fjerdedelers brøk", iquest: "Omvendt spørsmålstegn", Agrave: "Stor A med grav aksent", Aacute: "Stor A med akutt aksent", Acirc: "Stor A med cirkumfleks", Atilde: "Stor A med tilde",
+ Auml: "Stor A med tøddel", Aring: "Stor Å", AElig: "Stor Æ", Ccedil: "Stor C med cedille", Egrave: "Stor E med grav aksent", Eacute: "Stor E med akutt aksent", Ecirc: "Stor E med cirkumfleks", Euml: "Stor E med tøddel", Igrave: "Stor I med grav aksent", Iacute: "Stor I med akutt aksent", Icirc: "Stor I med cirkumfleks", Iuml: "Stor I med tøddel", ETH: "Stor Edd/stungen D", Ntilde: "Stor N med tilde", Ograve: "Stor O med grav aksent", Oacute: "Stor O med akutt aksent", Ocirc: "Stor O med cirkumfleks", Otilde: "Stor O med tilde", Ouml: "Stor O med tøddel",
+ times: "Multiplikasjonstegn", Oslash: "Stor Ø", Ugrave: "Stor U med grav aksent", Uacute: "Stor U med akutt aksent", Ucirc: "Stor U med cirkumfleks", Uuml: "Stor U med tøddel", Yacute: "Stor Y med akutt aksent", THORN: "Stor Thorn", szlig: "Liten dobbelt-s/Eszett", agrave: "Liten a med grav aksent", aacute: "Liten a med akutt aksent", acirc: "Liten a med cirkumfleks", atilde: "Liten a med tilde", auml: "Liten a med tøddel", aring: "Liten å", aelig: "Liten æ", ccedil: "Liten c med cedille", egrave: "Liten e med grav aksent", eacute: "Liten e med akutt aksent",
+ ecirc: "Liten e med cirkumfleks", euml: "Liten e med tøddel", igrave: "Liten i med grav aksent", iacute: "Liten i med akutt aksent", icirc: "Liten i med cirkumfleks", iuml: "Liten i med tøddel", eth: "Liten edd/stungen d", ntilde: "Liten n med tilde", ograve: "Liten o med grav aksent", oacute: "Liten o med akutt aksent", ocirc: "Liten o med cirkumfleks", otilde: "Liten o med tilde", ouml: "Liten o med tøddel", divide: "Divisjonstegn", oslash: "Liten ø", ugrave: "Liten u med grav aksent", uacute: "Liten u med akutt aksent", ucirc: "Liten u med cirkumfleks",
+ uuml: "Liten u med tøddel", yacute: "Liten y med akutt aksent", thorn: "Liten thorn", yuml: "Liten y med tøddel", OElig: "Stor ligatur av O og E", oelig: "Liten ligatur av o og e", 372: "Stor W med cirkumfleks", 374: "Stor Y med cirkumfleks", 373: "Liten w med cirkumfleks", 375: "Liten y med cirkumfleks", sbquo: "Enkelt lavt 9-anførselstegn", 8219: "Enkelt høyt reversert 9-anførselstegn", bdquo: "Dobbelt lavt 9-anførselstegn", hellip: "Ellipse", trade: "Varemerkesymbol", 9658: "Svart høyrevendt peker", bull: "Tykk interpunkt", rarr: "Høyrevendt pil",
+ rArr: "Dobbel høyrevendt pil", hArr: "Dobbel venstrevendt pil", diams: "Svart ruter", asymp: "Omtrent likhetstegn"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/nl.js b/plugins/specialchar/dialogs/lang/nl.js
new file mode 100755
index 0000000..ffdb567
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/nl.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "nl", {
+ euro: "Euro-teken", lsquo: "Linker enkel aanhalingsteken", rsquo: "Rechter enkel aanhalingsteken", ldquo: "Linker dubbel aanhalingsteken", rdquo: "Rechter dubbel aanhalingsteken", ndash: "En dash", mdash: "Em dash", iexcl: "Omgekeerd uitroepteken", cent: "Cent-teken", pound: "Pond-teken", curren: "Valuta-teken", yen: "Yen-teken", brvbar: "Gebroken streep", sect: "Paragraaf-teken", uml: "Trema", copy: "Copyright-teken", ordf: "Vrouwelijk ordinaal", laquo: "Linker guillemet", not: "Ongelijk-teken",
+ reg: "Geregistreerd handelsmerk-teken", macr: "Macron", deg: "Graden-teken", sup2: "Superscript twee", sup3: "Superscript drie", acute: "Accent aigu", micro: "Micro-teken", para: "Alinea-teken", middot: "Halfhoge punt", cedil: "Cedille", sup1: "Superscript een", ordm: "Mannelijk ordinaal", raquo: "Rechter guillemet", frac14: "Breuk kwart", frac12: "Breuk half", frac34: "Breuk driekwart", iquest: "Omgekeerd vraagteken", Agrave: "Latijnse hoofdletter A met een accent grave", Aacute: "Latijnse hoofdletter A met een accent aigu", Acirc: "Latijnse hoofdletter A met een circonflexe",
+ Atilde: "Latijnse hoofdletter A met een tilde", Auml: "Latijnse hoofdletter A met een trema", Aring: "Latijnse hoofdletter A met een corona", AElig: "Latijnse hoofdletter Æ", Ccedil: "Latijnse hoofdletter C met een cedille", Egrave: "Latijnse hoofdletter E met een accent grave", Eacute: "Latijnse hoofdletter E met een accent aigu", Ecirc: "Latijnse hoofdletter E met een circonflexe", Euml: "Latijnse hoofdletter E met een trema", Igrave: "Latijnse hoofdletter I met een accent grave", Iacute: "Latijnse hoofdletter I met een accent aigu",
+ Icirc: "Latijnse hoofdletter I met een circonflexe", Iuml: "Latijnse hoofdletter I met een trema", ETH: "Latijnse hoofdletter Eth", Ntilde: "Latijnse hoofdletter N met een tilde", Ograve: "Latijnse hoofdletter O met een accent grave", Oacute: "Latijnse hoofdletter O met een accent aigu", Ocirc: "Latijnse hoofdletter O met een circonflexe", Otilde: "Latijnse hoofdletter O met een tilde", Ouml: "Latijnse hoofdletter O met een trema", times: "Maal-teken", Oslash: "Latijnse hoofdletter O met een schuine streep", Ugrave: "Latijnse hoofdletter U met een accent grave",
+ Uacute: "Latijnse hoofdletter U met een accent aigu", Ucirc: "Latijnse hoofdletter U met een circonflexe", Uuml: "Latijnse hoofdletter U met een trema", Yacute: "Latijnse hoofdletter Y met een accent aigu", THORN: "Latijnse hoofdletter Thorn", szlig: "Latijnse kleine ringel-s", agrave: "Latijnse kleine letter a met een accent grave", aacute: "Latijnse kleine letter a met een accent aigu", acirc: "Latijnse kleine letter a met een circonflexe", atilde: "Latijnse kleine letter a met een tilde", auml: "Latijnse kleine letter a met een trema",
+ aring: "Latijnse kleine letter a met een corona", aelig: "Latijnse kleine letter æ", ccedil: "Latijnse kleine letter c met een cedille", egrave: "Latijnse kleine letter e met een accent grave", eacute: "Latijnse kleine letter e met een accent aigu", ecirc: "Latijnse kleine letter e met een circonflexe", euml: "Latijnse kleine letter e met een trema", igrave: "Latijnse kleine letter i met een accent grave", iacute: "Latijnse kleine letter i met een accent aigu", icirc: "Latijnse kleine letter i met een circonflexe",
+ iuml: "Latijnse kleine letter i met een trema", eth: "Latijnse kleine letter eth", ntilde: "Latijnse kleine letter n met een tilde", ograve: "Latijnse kleine letter o met een accent grave", oacute: "Latijnse kleine letter o met een accent aigu", ocirc: "Latijnse kleine letter o met een circonflexe", otilde: "Latijnse kleine letter o met een tilde", ouml: "Latijnse kleine letter o met een trema", divide: "Deel-teken", oslash: "Latijnse kleine letter o met een schuine streep", ugrave: "Latijnse kleine letter u met een accent grave",
+ uacute: "Latijnse kleine letter u met een accent aigu", ucirc: "Latijnse kleine letter u met een circonflexe", uuml: "Latijnse kleine letter u met een trema", yacute: "Latijnse kleine letter y met een accent aigu", thorn: "Latijnse kleine letter thorn", yuml: "Latijnse kleine letter y met een trema", OElig: "Latijnse hoofdletter Œ", oelig: "Latijnse kleine letter œ", 372: "Latijnse hoofdletter W met een circonflexe", 374: "Latijnse hoofdletter Y met een circonflexe", 373: "Latijnse kleine letter w met een circonflexe",
+ 375: "Latijnse kleine letter y met een circonflexe", sbquo: "Lage enkele aanhalingsteken", 8219: "Hoge omgekeerde enkele aanhalingsteken", bdquo: "Lage dubbele aanhalingsteken", hellip: "Beletselteken", trade: "Trademark-teken", 9658: "Zwarte driehoek naar rechts", bull: "Bullet", rarr: "Pijl naar rechts", rArr: "Dubbele pijl naar rechts", hArr: "Dubbele pijl naar links", diams: "Zwart ruitje", asymp: "Benaderingsteken"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/no.js b/plugins/specialchar/dialogs/lang/no.js
new file mode 100755
index 0000000..8332385
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/no.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "no", {
+ euro: "Eurosymbol", lsquo: "Venstre enkelt anførselstegn", rsquo: "Høyre enkelt anførselstegn", ldquo: "Venstre dobbelt anførselstegn", rdquo: "Høyre anførsesltegn", ndash: "Kort tankestrek", mdash: "Lang tankestrek", iexcl: "Omvendt utropstegn", cent: "Centsymbol", pound: "Pundsymbol", curren: "Valutategn", yen: "Yensymbol", brvbar: "Brutt loddrett strek", sect: "Paragraftegn", uml: "Tøddel", copy: "Copyrighttegn", ordf: "Feminin ordensindikator", laquo: "Venstre anførselstegn", not: "Negasjonstegn",
+ reg: "Registrert varemerke-tegn", macr: "Makron", deg: "Gradsymbol", sup2: "Hevet totall", sup3: "Hevet tretall", acute: "Akutt aksent", micro: "Mikrosymbol", para: "Avsnittstegn", middot: "Midtstilt prikk", cedil: "Cedille", sup1: "Hevet ettall", ordm: "Maskulin ordensindikator", raquo: "Høyre anførselstegn", frac14: "Fjerdedelsbrøk", frac12: "Halvbrøk", frac34: "Tre fjerdedelers brøk", iquest: "Omvendt spørsmålstegn", Agrave: "Stor A med grav aksent", Aacute: "Stor A med akutt aksent", Acirc: "Stor A med cirkumfleks", Atilde: "Stor A med tilde",
+ Auml: "Stor A med tøddel", Aring: "Stor Å", AElig: "Stor Æ", Ccedil: "Stor C med cedille", Egrave: "Stor E med grav aksent", Eacute: "Stor E med akutt aksent", Ecirc: "Stor E med cirkumfleks", Euml: "Stor E med tøddel", Igrave: "Stor I med grav aksent", Iacute: "Stor I med akutt aksent", Icirc: "Stor I med cirkumfleks", Iuml: "Stor I med tøddel", ETH: "Stor Edd/stungen D", Ntilde: "Stor N med tilde", Ograve: "Stor O med grav aksent", Oacute: "Stor O med akutt aksent", Ocirc: "Stor O med cirkumfleks", Otilde: "Stor O med tilde", Ouml: "Stor O med tøddel",
+ times: "Multiplikasjonstegn", Oslash: "Stor Ø", Ugrave: "Stor U med grav aksent", Uacute: "Stor U med akutt aksent", Ucirc: "Stor U med cirkumfleks", Uuml: "Stor U med tøddel", Yacute: "Stor Y med akutt aksent", THORN: "Stor Thorn", szlig: "Liten dobbelt-s/Eszett", agrave: "Liten a med grav aksent", aacute: "Liten a med akutt aksent", acirc: "Liten a med cirkumfleks", atilde: "Liten a med tilde", auml: "Liten a med tøddel", aring: "Liten å", aelig: "Liten æ", ccedil: "Liten c med cedille", egrave: "Liten e med grav aksent", eacute: "Liten e med akutt aksent",
+ ecirc: "Liten e med cirkumfleks", euml: "Liten e med tøddel", igrave: "Liten i med grav aksent", iacute: "Liten i med akutt aksent", icirc: "Liten i med cirkumfleks", iuml: "Liten i med tøddel", eth: "Liten edd/stungen d", ntilde: "Liten n med tilde", ograve: "Liten o med grav aksent", oacute: "Liten o med akutt aksent", ocirc: "Liten o med cirkumfleks", otilde: "Liten o med tilde", ouml: "Liten o med tøddel", divide: "Divisjonstegn", oslash: "Liten ø", ugrave: "Liten u med grav aksent", uacute: "Liten u med akutt aksent", ucirc: "Liten u med cirkumfleks",
+ uuml: "Liten u med tøddel", yacute: "Liten y med akutt aksent", thorn: "Liten thorn", yuml: "Liten y med tøddel", OElig: "Stor ligatur av O og E", oelig: "Liten ligatur av o og e", 372: "Stor W med cirkumfleks", 374: "Stor Y med cirkumfleks", 373: "Liten w med cirkumfleks", 375: "Liten y med cirkumfleks", sbquo: "Enkelt lavt 9-anførselstegn", 8219: "Enkelt høyt reversert 9-anførselstegn", bdquo: "Dobbelt lavt 9-anførselstegn", hellip: "Ellipse", trade: "Varemerkesymbol", 9658: "Svart høyrevendt peker", bull: "Tykk interpunkt", rarr: "Høyrevendt pil",
+ rArr: "Dobbel høyrevendt pil", hArr: "Dobbel venstrevendt pil", diams: "Svart ruter", asymp: "Omtrent likhetstegn"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/oc.js b/plugins/specialchar/dialogs/lang/oc.js
new file mode 100755
index 0000000..920586a
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/oc.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "oc", {
+ euro: "Simbòl èuro", lsquo: "Vergueta simpla dobrenta", rsquo: "Vergueta simpla tampanta", ldquo: "Vergueta dobla dobrenta", rdquo: "Vergueta dobla tampanta", ndash: "Jonhent semi-quadratin", mdash: "Jonhent quadratin", iexcl: "Punt d'exclamacion inversat", cent: "Simbòl cent", pound: "Simbòl Liura sterling", curren: "Simbòl monetari", yen: "Simbòl ièn", brvbar: "Barra verticala separada", sect: "Signe de seccion", uml: "Trèma", copy: "Simbòl Copyright", ordf: "Indicador ordinal femenin",
+ laquo: "Vergueta francesa dobrenta", not: "Croquet de negacion", reg: "Simbòl de marca depausada", macr: "Macron", deg: "Simbòl gra", sup2: "Exponent 2", sup3: "Exponent 3", acute: "Accent agut", micro: "Simbòl micro", para: "Simbòl pè de mòsca", middot: "Punt median", cedil: "Cedilha", sup1: "Exponent 1", ordm: "Indicador ordenal masculin", raquo: "Vergueta francesa tampanta", frac14: "Fraccion un quart", frac12: "Fraccion un mièg", frac34: "Fraccion tres quarts", iquest: "Punt d'interrogacion inversat", Agrave: "A accent grèu majuscula",
+ Aacute: "A accent agut majuscula", Acirc: "A accent circonflèxe majuscula", Atilde: "A caron majuscula", Auml: "A trèma majuscula", Aring: "A redond majuscula", AElig: "Ligatura Æ majuscula", Ccedil: "C cédille majuscula", Egrave: "E accent grèu majuscula", Eacute: "E accent agut majuscula", Ecirc: "E accent circonflèxe majuscula", Euml: "E trèma majuscula", Igrave: "I accent grèu majuscula", Iacute: "I accent agut majuscula", Icirc: "I accent circonflèxe majuscula", Iuml: "I trèma majuscula", ETH: "Letra majuscula islandaise ED",
+ Ntilde: "N caron majuscula", Ograve: "O accent grèu majuscula", Oacute: "O accent agut majuscula", Ocirc: "O accent circonflèxe majuscula", Otilde: "O caron majuscula", Ouml: "O trèma majuscula", times: "Simbòl de multiplicacion", Oslash: "O raiat majuscula", Ugrave: "U accent grèu majuscula", Uacute: "U accent agut majuscula", Ucirc: "U accent circonflèxe majuscula", Uuml: "U trèma majuscula", Yacute: "Y accent agut majuscula", THORN: "Letra islandesa thorn majuscula", szlig: "Letra minuscula alemanda S dur", agrave: "A accent grèu minuscula",
+ aacute: "A accent agut minuscula", acirc: "A accent circonflèxe minuscula", atilde: "A tilda minuscula", auml: "A trèma minuscula", aring: "A redond minuscula", aelig: "Ligatura Æ minuscula", ccedil: "C cédille minuscula", egrave: "E accent grèu minuscula", eacute: "E accent agut minuscula", ecirc: "E accent circonflèxe minuscula", euml: "E trèma minuscula", igrave: "I accent grèu minuscula", iacute: "I accent agut minuscula", icirc: "I accent circonflèxe minuscula", iuml: "i minuscula trèma", eth: "Letra minuscula islandaise ED",
+ ntilde: "N caron minuscula", ograve: "O minuscula accent grèu", oacute: "O accent agut minuscula", ocirc: "O accent circonflèxe minuscula", otilde: "O tilda minuscula", ouml: "O trèma minuscula", divide: "Simbòl de division", oslash: "O raiat minuscula", ugrave: "U accent grèu minuscula", uacute: "U accent agut minuscula", ucirc: "U accent circonflèxe minuscula", uuml: "U trèma minuscula", yacute: "Y accent agut minuscula", thorn: "Letra islandaise thorn minuscula", yuml: "Y trèma minuscula", OElig: "Ligatura Œ majuscula", oelig: "Ligatura Œ minuscula",
+ 372: "W accent circonflèxe majuscula", 374: "Y accent circonflèxe majuscula", 373: "W accent circonflèxe minuscula", 375: "Y accent circonflèxe minuscula", sbquo: "Vergueta simpla tampanta inferior", 8219: "Vergueta-virgula superior culbuté", bdquo: "Vergueta-virgula double inferior", hellip: "Punts de suspension", trade: "Simbòl de marca comerciala", 9658: "Sageta negra puntant cap a dreita", bull: "Gròs punt median", rarr: "Sageta cap a dreita", rArr: "Sageta dobla cap a dreita", hArr: "Sageta dobla cap a esquèrra", diams: "Lausange negre",
+ asymp: "Environ egal"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/pl.js b/plugins/specialchar/dialogs/lang/pl.js
new file mode 100755
index 0000000..98d73bd
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/pl.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","pl",{euro:"Znak euro",lsquo:"Cudzysłów pojedynczy otwierający",rsquo:"Cudzysłów pojedynczy zamykający",ldquo:"Cudzysłów apostrofowy otwierający",rdquo:"Cudzysłów apostrofowy zamykający",ndash:"Półpauza",mdash:"Pauza",iexcl:"Odwrócony wykrzyknik",cent:"Znak centa",pound:"Znak funta",curren:"Znak waluty",yen:"Znak jena",brvbar:"Przerwana pionowa kreska",sect:"Paragraf",uml:"Diereza",copy:"Znak praw autorskich",ordf:"Wskaźnik rodzaju żeńskiego liczebnika porządkowego",
+laquo:"Lewy cudzysłów ostrokątny",not:"Znak negacji",reg:"Zastrzeżony znak towarowy",macr:"Makron",deg:"Znak stopnia",sup2:"Druga potęga",sup3:"Trzecia potęga",acute:"Akcent ostry",micro:"Znak mikro",para:"Znak akapitu",middot:"Kropka środkowa",cedil:"Cedylla",sup1:"Pierwsza potęga",ordm:"Wskaźnik rodzaju męskiego liczebnika porządkowego",raquo:"Prawy cudzysłów ostrokątny",frac14:"Ułamek zwykły jedna czwarta",frac12:"Ułamek zwykły jedna druga",frac34:"Ułamek zwykły trzy czwarte",iquest:"Odwrócony znak zapytania",
+Agrave:"Wielka litera A z akcentem ciężkim",Aacute:"Wielka litera A z akcentem ostrym",Acirc:"Wielka litera A z akcentem przeciągłym",Atilde:"Wielka litera A z tyldą",Auml:"Wielka litera A z dierezą",Aring:"Wielka litera A z kółkiem",AElig:"Wielka ligatura Æ",Ccedil:"Wielka litera C z cedyllą",Egrave:"Wielka litera E z akcentem ciężkim",Eacute:"Wielka litera E z akcentem ostrym",Ecirc:"Wielka litera E z akcentem przeciągłym",Euml:"Wielka litera E z dierezą",Igrave:"Wielka litera I z akcentem ciężkim",
+Iacute:"Wielka litera I z akcentem ostrym",Icirc:"Wielka litera I z akcentem przeciągłym",Iuml:"Wielka litera I z dierezą",ETH:"Wielka litera Eth",Ntilde:"Wielka litera N z tyldą",Ograve:"Wielka litera O z akcentem ciężkim",Oacute:"Wielka litera O z akcentem ostrym",Ocirc:"Wielka litera O z akcentem przeciągłym",Otilde:"Wielka litera O z tyldą",Ouml:"Wielka litera O z dierezą",times:"Znak mnożenia wektorowego",Oslash:"Wielka litera O z przekreśleniem",Ugrave:"Wielka litera U z akcentem ciężkim",Uacute:"Wielka litera U z akcentem ostrym",
+Ucirc:"Wielka litera U z akcentem przeciągłym",Uuml:"Wielka litera U z dierezą",Yacute:"Wielka litera Y z akcentem ostrym",THORN:"Wielka litera Thorn",szlig:"Mała litera ostre s (eszet)",agrave:"Mała litera a z akcentem ciężkim",aacute:"Mała litera a z akcentem ostrym",acirc:"Mała litera a z akcentem przeciągłym",atilde:"Mała litera a z tyldą",auml:"Mała litera a z dierezą",aring:"Mała litera a z kółkiem",aelig:"Mała ligatura æ",ccedil:"Mała litera c z cedyllą",egrave:"Mała litera e z akcentem ciężkim",
+eacute:"Mała litera e z akcentem ostrym",ecirc:"Mała litera e z akcentem przeciągłym",euml:"Mała litera e z dierezą",igrave:"Mała litera i z akcentem ciężkim",iacute:"Mała litera i z akcentem ostrym",icirc:"Mała litera i z akcentem przeciągłym",iuml:"Mała litera i z dierezą",eth:"Mała litera eth",ntilde:"Mała litera n z tyldą",ograve:"Mała litera o z akcentem ciężkim",oacute:"Mała litera o z akcentem ostrym",ocirc:"Mała litera o z akcentem przeciągłym",otilde:"Mała litera o z tyldą",ouml:"Mała litera o z dierezą",
+divide:"Anglosaski znak dzielenia",oslash:"Mała litera o z przekreśleniem",ugrave:"Mała litera u z akcentem ciężkim",uacute:"Mała litera u z akcentem ostrym",ucirc:"Mała litera u z akcentem przeciągłym",uuml:"Mała litera u z dierezą",yacute:"Mała litera y z akcentem ostrym",thorn:"Mała litera thorn",yuml:"Mała litera y z dierezą",OElig:"Wielka ligatura OE",oelig:"Mała ligatura oe",372:"Wielka litera W z akcentem przeciągłym",374:"Wielka litera Y z akcentem przeciągłym",373:"Mała litera w z akcentem przeciągłym",
+375:"Mała litera y z akcentem przeciągłym",sbquo:"Pojedynczy apostrof dolny",8219:"Pojedynczy apostrof górny",bdquo:"Podwójny apostrof dolny",hellip:"Wielokropek",trade:"Znak towarowy",9658:"Czarny wskaźnik wskazujący w prawo",bull:"Punktor",rarr:"Strzałka w prawo",rArr:"Podwójna strzałka w prawo",hArr:"Podwójna strzałka obustronna",diams:"Czarny znak karo",asymp:"Znak prawie równe"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/pt-br.js b/plugins/specialchar/dialogs/lang/pt-br.js
new file mode 100755
index 0000000..cd4c8ce
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/pt-br.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "pt-br", {
+ euro: "Euro", lsquo: "Aspas simples esquerda", rsquo: "Aspas simples direita", ldquo: "Aspas duplas esquerda", rdquo: "Aspas duplas direita", ndash: "Traço", mdash: "Travessão", iexcl: "Ponto de exclamação invertido", cent: "Cent", pound: "Cerquilha", curren: "Dinheiro", yen: "Yen", brvbar: "Bara interrompida", sect: "Símbolo de Parágrafo", uml: "Trema", copy: "Direito de Cópia", ordf: "Indicador ordinal feminino", laquo: "Aspas duplas angulares esquerda", not: "Negação", reg: "Marca Registrada",
+ macr: "Mácron", deg: "Grau", sup2: "2 Superscrito", sup3: "3 Superscrito", acute: "Acento agudo", micro: "Micro", para: "Pé de mosca", middot: "Ponto mediano", cedil: "Cedilha", sup1: "1 Superscrito", ordm: "Indicador ordinal masculino", raquo: "Aspas duplas angulares direita", frac14: "Um quarto", frac12: "Um meio", frac34: "Três quartos", iquest: "Interrogação invertida", Agrave: "A maiúsculo com acento grave", Aacute: "A maiúsculo com acento agudo", Acirc: "A maiúsculo com acento circunflexo", Atilde: "A maiúsculo com til", Auml: "A maiúsculo com trema",
+ Aring: "A maiúsculo com anel acima", AElig: "Æ maiúsculo", Ccedil: "Ç maiúlculo", Egrave: "E maiúsculo com acento grave", Eacute: "E maiúsculo com acento agudo", Ecirc: "E maiúsculo com acento circumflexo", Euml: "E maiúsculo com trema", Igrave: "I maiúsculo com acento grave", Iacute: "I maiúsculo com acento agudo", Icirc: "I maiúsculo com acento circunflexo", Iuml: "I maiúsculo com crase", ETH: "Eth maiúsculo", Ntilde: "N maiúsculo com til", Ograve: "O maiúsculo com acento grave", Oacute: "O maiúsculo com acento agudo", Ocirc: "O maiúsculo com acento circunflexo",
+ Otilde: "O maiúsculo com til", Ouml: "O maiúsculo com trema", times: "Multiplicação", Oslash: "Diâmetro", Ugrave: "U maiúsculo com acento grave", Uacute: "U maiúsculo com acento agudo", Ucirc: "U maiúsculo com acento circunflexo", Uuml: "U maiúsculo com trema", Yacute: "Y maiúsculo com acento agudo", THORN: "Thorn maiúsculo", szlig: "Eszett minúsculo", agrave: "a minúsculo com acento grave", aacute: "a minúsculo com acento agudo", acirc: "a minúsculo com acento circunflexo", atilde: "a minúsculo com til", auml: "a minúsculo com trema",
+ aring: "a minúsculo com anel acima", aelig: "æ minúsculo", ccedil: "ç minúsculo", egrave: "e minúsculo com acento grave", eacute: "e minúsculo com acento agudo", ecirc: "e minúsculo com acento circunflexo", euml: "e minúsculo com trema", igrave: "i minúsculo com acento grave", iacute: "i minúsculo com acento agudo", icirc: "i minúsculo com acento circunflexo", iuml: "i minúsculo com trema", eth: "eth minúsculo", ntilde: "n minúsculo com til", ograve: "o minúsculo com acento grave", oacute: "o minúsculo com acento agudo", ocirc: "o minúsculo com acento circunflexo",
+ otilde: "o minúsculo com til", ouml: "o minúsculo com trema", divide: "Divisão", oslash: "o minúsculo com cortado ou diâmetro", ugrave: "u minúsculo com acento grave", uacute: "u minúsculo com acento agudo", ucirc: "u minúsculo com acento circunflexo", uuml: "u minúsculo com trema", yacute: "y minúsculo com acento agudo", thorn: "thorn minúsculo", yuml: "y minúsculo com trema", OElig: "Ligação tipográfica OE maiúscula", oelig: "Ligação tipográfica oe minúscula", 372: "W maiúsculo com acento circunflexo", 374: "Y maiúsculo com acento circunflexo",
+ 373: "w minúsculo com acento circunflexo", 375: "y minúsculo com acento circunflexo", sbquo: "Aspas simples inferior direita", 8219: "Aspas simples superior esquerda", bdquo: "Aspas duplas inferior direita", hellip: "Reticências", trade: "Trade mark", 9658: "Ponta de seta preta para direita", bull: "Ponto lista", rarr: "Seta para direita", rArr: "Seta dupla para direita", hArr: "Seta dupla direita e esquerda", diams: "Ouros", asymp: "Aproximadamente"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/pt.js b/plugins/specialchar/dialogs/lang/pt.js
new file mode 100755
index 0000000..125f29b
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/pt.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","pt",{euro:"Símbolo de Euro",lsquo:"Aspa esquerda simples",rsquo:"Aspa direita simples",ldquo:"Aspa esquerda dupla",rdquo:"Aspa direita dupla",ndash:"Travessão simples",mdash:"Travessão longo",iexcl:"Ponto de exclamação invertido",cent:"Símbolo de cêntimo",pound:"Símbolo de Libra",curren:"Símbolo de Moeda",yen:"Símbolo de Iene",brvbar:"Barra quebrada",sect:"Símbolo de secção",uml:"Trema",copy:"Símbolo de direitos de autor",ordf:"Indicador ordinal feminino",laquo:"Aspa esquerda ângulo duplo",
+not:"Não símbolo",reg:"Símbolo de registado",macr:"Mácron",deg:"Símbolo de graus",sup2:"Expoente 2",sup3:"Expoente 3",acute:"Acento agudo",micro:"Símbolo de micro",para:"Símbolo de parágrafo",middot:"Ponto do meio",cedil:"Cedilha",sup1:"Expoente 1",ordm:"Indicador ordinal masculino",raquo:"Aspas ângulo duplo para a direita",frac14:"Fração vulgar 1/4",frac12:"Fração vulgar 1/2",frac34:"Fração vulgar 3/4",iquest:"Ponto de interrogação invertido",Agrave:"Letra maiúscula latina A com acento grave",Aacute:"Letra maiúscula latina A com acento agudo",
+Acirc:"Letra maiúscula latina A com circunflexo",Atilde:"Letra maiúscula latina A com til",Auml:"Letra maiúscula latina A com trema",Aring:"Letra maiúscula latina A com sinal diacrítico",AElig:"Letra maiúscula latina Æ",Ccedil:"Letra maiúscula latina C com cedilha",Egrave:"Letra maiúscula latina E com acento grave",Eacute:"Letra maiúscula latina E com acento agudo",Ecirc:"Letra maiúscula latina E com circunflexo",Euml:"Letra maiúscula latina E com trema",Igrave:"Letra maiúscula latina I com acento grave",
+Iacute:"Letra maiúscula latina I com acento agudo",Icirc:"Letra maiúscula latina I com cincunflexo",Iuml:"Letra maiúscula latina I com trema",ETH:"Letra maiúscula latina Eth (Ðð)",Ntilde:"Letra maiúscula latina N com til",Ograve:"Letra maiúscula latina O com acento grave",Oacute:"Letra maiúscula latina O com acento agudo",Ocirc:"Letra maiúscula latina I com circunflexo",Otilde:"Letra maiúscula latina O com til",Ouml:"Letra maiúscula latina O com trema",times:"Símbolo de multiplicação",Oslash:"Letra maiúscula O com barra",
+Ugrave:"Letra maiúscula latina U com acento grave",Uacute:"Letra maiúscula latina U com acento agudo",Ucirc:"Letra maiúscula latina U com circunflexo",Uuml:"Letra maiúscula latina E com trema",Yacute:"Letra maiúscula latina Y com acento agudo",THORN:"Letra maiúscula latina Rúnico",szlig:"Letra minúscula latina s forte",agrave:"Letra minúscula latina a com acento grave",aacute:"Letra minúscula latina a com acento agudo",acirc:"Letra minúscula latina a com circunflexo",atilde:"Letra minúscula latina a com til",
+auml:"Letra minúscula latina a com trema",aring:"Letra minúscula latina a com sinal diacrítico",aelig:"Letra minúscula latina æ",ccedil:"Letra minúscula latina c com cedilha",egrave:"Letra minúscula latina e com acento grave",eacute:"Letra minúscula latina e com acento agudo",ecirc:"Letra minúscula latina e com circunflexo",euml:"Letra minúscula latina e com trema",igrave:"Letra minúscula latina i com acento grave",iacute:"Letra minúscula latina i com acento agudo",icirc:"Letra minúscula latina i com circunflexo",
+iuml:"Letra pequena latina i com trema",eth:"Letra minúscula latina eth",ntilde:"Letra minúscula latina n com til",ograve:"Letra minúscula latina o com acento grave",oacute:"Letra minúscula latina o com acento agudo",ocirc:"Letra minúscula latina o com circunflexo",otilde:"Letra minúscula latina o com til",ouml:"Letra minúscula latina o com trema",divide:"Símbolo de divisão",oslash:"Letra minúscula latina o com barra",ugrave:"Letra minúscula latina u com acento grave",uacute:"Letra minúscula latina u com acento agudo",
+ucirc:"Letra minúscula latina u com circunflexo",uuml:"Letra minúscula latina u com trema",yacute:"Letra minúscula latina y com acento agudo",thorn:"Letra minúscula latina Rúnico",yuml:"Letra minúscula latina y com trema",OElig:"Ligadura maiúscula latina OE",oelig:"Ligadura minúscula latina oe",372:"Letra maiúscula latina W com circunflexo",374:"Letra maiúscula latina Y com circunflexo",373:"Letra minúscula latina w com circunflexo",375:"Letra minúscula latina y com circunflexo",sbquo:"Aspa Simples inferior-9",
+8219:"Aspa simples superior invertida-9",bdquo:"Aspa duplas inferior-9",hellip:"Elipse horizontal ",trade:"Símbolo de marca registada",9658:"Ponteiro preto direito",bull:"Marca",rarr:"Seta para a direita",rArr:"Seta dupla para a direita",hArr:"Seta dupla direita esquerda",diams:"Naipe diamante preto",asymp:"Quase igual a "}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/ro.js b/plugins/specialchar/dialogs/lang/ro.js
new file mode 100755
index 0000000..0bc7637
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/ro.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "ro", {
+ euro: "Simbol EURO €", lsquo: "Ghilimea simplă stânga", rsquo: "Ghilimea simplă dreapta", ldquo: "Ghilimea dublă stânga", rdquo: "Ghilimea dublă dreapta", ndash: "liniuță despărțire cu spații", mdash: "liniuță despărțire cuvinte fără spații", iexcl: "semnul exclamației inversat", cent: "simbol cent", pound: "simbol lira sterlină", curren: "simbol monedă", yen: "simbol yen", brvbar: "bara verticală întreruptă", sect: "simbol paragraf", uml: "tréma", copy: "simbol drept de autor", ordf: "Indicatorul ordinal feminin a superscript",
+ laquo: "Left-pointing double angle quotation mark", not: "Not sign", reg: "Registered sign", macr: "Macron", deg: "Degree sign", sup2: "Superscript two", sup3: "Superscript three", acute: "Acute accent", micro: "Micro sign", para: "Pilcrow sign", middot: "Middle dot", cedil: "Sedila", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Semnul întrebării inversat",
+ Agrave: "Latin capital letter A with grave accent", Aacute: "Latin capital letter A with acute accent", Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex",
+ Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent", Iacute: "Latin capital letter I with acute accent", Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde",
+ Ouml: "Latin capital letter O with diaeresis", times: "Simbol înmulțire", Oslash: "Latin capital letter O with stroke", Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent",
+ acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis", aring: "Latin small letter a with ring above", aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent",
+ icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth", ntilde: "Latin small letter n with tilde", ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Simbol împărțire", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent",
+ ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis", yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark",
+ bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis", trade: "Trade mark sign", 9658: "Black right-pointing pointer", bull: "Bullet", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Aproximativ egal cu"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/ru.js b/plugins/specialchar/dialogs/lang/ru.js
new file mode 100755
index 0000000..8ac95a0
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/ru.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "ru", {
+ euro: "Знак евро", lsquo: "Левая одинарная кавычка", rsquo: "Правая одинарная кавычка", ldquo: "Левая двойная кавычка", rdquo: "Левая двойная кавычка", ndash: "Среднее тире", mdash: "Длинное тире", iexcl: "перевёрнутый восклицательный знак", cent: "Цент", pound: "Фунт", curren: "Знак валюты", yen: "Йена", brvbar: "Вертикальная черта с разрывом", sect: "Знак параграфа", uml: "Умлаут", copy: "Знак охраны авторского права", ordf: "Указатель окончания женского рода ...ая", laquo: "Левая кавычка-«ёлочка»",
+ not: "Отрицание", reg: "Знак охраны смежных прав\\t", macr: "Макрон", deg: "Градус", sup2: "Надстрочное два", sup3: "Надстрочное три", acute: "Акут", micro: "Микро", para: "Абзац", middot: "Интерпункт", cedil: "Седиль", sup1: "Надстрочная единица", ordm: "Порядковое числительное", raquo: "Правая кавычка-«ёлочка»", frac14: "Одна четвертая", frac12: "Одна вторая", frac34: "Три четвёртых", iquest: "Перевёрнутый вопросительный знак", Agrave: "Латинская заглавная буква А с апострофом", Aacute: "Латинская заглавная буква A с ударением", Acirc: "Латинская заглавная буква А с циркумфлексом",
+ Atilde: "Латинская заглавная буква А с тильдой", Auml: "Латинская заглавная буква А с тремой", Aring: "Латинская заглавная буква А с кольцом над ней", AElig: "Латинская большая буква Æ", Ccedil: "Латинская заглавная буква C с седилью", Egrave: "Латинская заглавная буква Е с апострофом", Eacute: "Латинская заглавная буква Е с ударением", Ecirc: "Латинская заглавная буква Е с циркумфлексом", Euml: "Латинская заглавная буква Е с тремой", Igrave: "Латинская заглавная буква I с апострофом", Iacute: "Латинская заглавная буква I с ударением",
+ Icirc: "Латинская заглавная буква I с циркумфлексом", Iuml: "Латинская заглавная буква I с тремой", ETH: "Латинская большая буква Eth", Ntilde: "Латинская заглавная буква N с тильдой", Ograve: "Латинская заглавная буква O с апострофом", Oacute: "Латинская заглавная буква O с ударением", Ocirc: "Латинская заглавная буква O с циркумфлексом", Otilde: "Латинская заглавная буква O с тильдой", Ouml: "Латинская заглавная буква O с тремой", times: "Знак умножения", Oslash: "Латинская большая перечеркнутая O", Ugrave: "Латинская заглавная буква U с апострофом",
+ Uacute: "Латинская заглавная буква U с ударением", Ucirc: "Латинская заглавная буква U с циркумфлексом", Uuml: "Латинская заглавная буква U с тремой", Yacute: "Латинская заглавная буква Y с ударением", THORN: "Латинская заглавная буква Thorn", szlig: "Знак диеза", agrave: "Латинская маленькая буква a с апострофом", aacute: "Латинская маленькая буква a с ударением", acirc: "Латинская маленькая буква a с циркумфлексом", atilde: "Латинская маленькая буква a с тильдой", auml: "Латинская маленькая буква a с тремой", aring: "Латинская маленькая буква a с кольцом",
+ aelig: "Латинская маленькая буква æ", ccedil: "Латинская маленькая буква с с седилью", egrave: "Латинская маленькая буква е с апострофом", eacute: "Латинская маленькая буква е с ударением", ecirc: "Латинская маленькая буква е с циркумфлексом", euml: "Латинская маленькая буква е с тремой", igrave: "Латинская маленькая буква i с апострофом", iacute: "Латинская маленькая буква i с ударением", icirc: "Латинская маленькая буква i с циркумфлексом", iuml: "Латинская маленькая буква i с тремой", eth: "Латинская маленькая буква eth",
+ ntilde: "Латинская маленькая буква n с тильдой", ograve: "Латинская маленькая буква o с апострофом", oacute: "Латинская маленькая буква o с ударением", ocirc: "Латинская маленькая буква o с циркумфлексом", otilde: "Латинская маленькая буква o с тильдой", ouml: "Латинская маленькая буква o с тремой", divide: "Знак деления", oslash: "Латинская строчная перечеркнутая o", ugrave: "Латинская маленькая буква u с апострофом", uacute: "Латинская маленькая буква u с ударением", ucirc: "Латинская маленькая буква u с циркумфлексом",
+ uuml: "Латинская маленькая буква u с тремой", yacute: "Латинская маленькая буква y с ударением", thorn: "Латинская маленькая буква thorn", yuml: "Латинская маленькая буква y с тремой", OElig: "Латинская прописная лигатура OE", oelig: "Латинская строчная лигатура oe", 372: "Латинская заглавная буква W с циркумфлексом", 374: "Латинская заглавная буква Y с циркумфлексом", 373: "Латинская маленькая буква w с циркумфлексом", 375: "Латинская маленькая буква y с циркумфлексом", sbquo: "Нижняя одинарная кавычка", 8219: "Правая одинарная кавычка",
+ bdquo: "Левая двойная кавычка", hellip: "Горизонтальное многоточие", trade: "Товарный знак", 9658: "Черный указатель вправо", bull: "Маркер списка", rarr: "Стрелка вправо", rArr: "Двойная стрелка вправо", hArr: "Двойная стрелка влево-вправо", diams: "Черный ромб", asymp: "Примерно равно"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/si.js b/plugins/specialchar/dialogs/lang/si.js
new file mode 100755
index 0000000..4acf1f3
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/si.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "si", {
+ euro: "යුරෝ සලකුණ", lsquo: "වමේ තනි උපුටා දක්වීම ", rsquo: "දකුණේ තනි උපුටා දක්වීම ", ldquo: "වමේ දිත්ව උපුටා දක්වීම ", rdquo: "දකුණේ දිත්ව උපුටා දක්වීම ", ndash: "En dash", mdash: "Em dash", iexcl: "යටිකුරු හර්ෂදී ", cent: "Cent sign", pound: "Pound sign", curren: "මුල්‍යමය ", yen: "යෙන් ", brvbar: "Broken bar", sect: "තෙරේම් ", uml: "Diaeresis", copy: "පිටපත් අයිතිය ", ordf: "දර්ශකය", laquo: "Left-pointing double angle quotation mark", not: "සලකුණක් නොවේ", reg: "සලකුණක් ලියාපදිංචි කිරීම",
+ macr: "මුද්‍රිත ", deg: "සලකුණේ ", sup2: "උඩු ලකුණු දෙක", sup3: "Superscript three", acute: "Acute accent", micro: "Micro sign", para: "Pilcrow sign", middot: "Middle dot", cedil: "Cedilla", sup1: "Superscript one", ordm: "Masculine ordinal indicator", raquo: "Right-pointing double angle quotation mark", frac14: "Vulgar fraction one quarter", frac12: "Vulgar fraction one half", frac34: "Vulgar fraction three quarters", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent", Aacute: "Latin capital letter A with acute accent",
+ Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent", Iacute: "Latin capital letter I with acute accent",
+ Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "Latin capital letter O with grave accent", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke", Ugrave: "Latin capital letter U with grave accent",
+ Uacute: "Latin capital letter U with acute accent", Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis", aring: "Latin small letter a with ring above",
+ aelig: "Latin small letter æ", ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth", ntilde: "Latin small letter n with tilde",
+ ograve: "Latin small letter o with grave accent", oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "Division sign", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis", yacute: "Latin small letter y with acute accent",
+ thorn: "Latin small letter thorn", yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis", trade: "Trade mark sign", 9658: "Black right-pointing pointer",
+ bull: "Bullet", rarr: "Rightwards arrow", rArr: "Rightwards double arrow", hArr: "Left right double arrow", diams: "Black diamond suit", asymp: "Almost equal to"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/sk.js b/plugins/specialchar/dialogs/lang/sk.js
new file mode 100755
index 0000000..4ee2155
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/sk.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "sk", {
+ euro: "Znak eura", lsquo: "Ľavá jednoduchá úvodzovka", rsquo: "Pravá jednoduchá úvodzovka", ldquo: "Pravá dvojitá úvodzovka", rdquo: "Pravá dvojitá úvodzovka", ndash: "En pomlčka", mdash: "Em pomlčka", iexcl: "Obrátený výkričník", cent: "Znak centu", pound: "Znak libry", curren: "Znak meny", yen: "Znak jenu", brvbar: "Prerušená zvislá čiara", sect: "Znak odseku", uml: "Prehláska", copy: "Znak copyrightu", ordf: "Ženský indikátor rodu", laquo: "Znak dvojitých lomených úvodzoviek vľavo", not: "Logistický zápor",
+ reg: "Znak registrácie", macr: "Pomlčka nad", deg: "Znak stupňa", sup2: "Dvojka ako horný index", sup3: "Trojka ako horný index", acute: "Dĺžeň", micro: "Znak mikro", para: "Znak odstavca", middot: "Bodka uprostred", cedil: "Chvost vľavo", sup1: "Jednotka ako horný index", ordm: "Mužský indikátor rodu", raquo: "Znak dvojitých lomených úvodzoviek vpravo", frac14: "Obyčajný zlomok jedna štvrtina", frac12: "Obyčajný zlomok jedna polovica", frac34: "Obyčajný zlomok tri štvrtiny", iquest: "Otočený otáznik", Agrave: "Veľké písmeno latinky A s accentom",
+ Aacute: "Veľké písmeno latinky A s dĺžňom", Acirc: "Veľké písmeno latinky A s mäkčeňom", Atilde: "Veľké písmeno latinky A s tildou", Auml: "Veľké písmeno latinky A s dvoma bodkami", Aring: "Veľké písmeno latinky A s krúžkom nad", AElig: "Veľké písmeno latinky Æ", Ccedil: "Veľké písmeno latinky C s chvostom vľavo", Egrave: "Veľké písmeno latinky E s accentom", Eacute: "Veľké písmeno latinky E s dĺžňom", Ecirc: "Veľké písmeno latinky E s mäkčeňom", Euml: "Veľké písmeno latinky E s dvoma bodkami", Igrave: "Veľké písmeno latinky I s accentom",
+ Iacute: "Veľké písmeno latinky I s dĺžňom", Icirc: "Veľké písmeno latinky I s mäkčeňom", Iuml: "Veľké písmeno latinky I s dvoma bodkami", ETH: "Veľké písmeno latinky Eth", Ntilde: "Veľké písmeno latinky N s tildou", Ograve: "Veľké písmeno latinky O s accentom", Oacute: "Veľké písmeno latinky O s dĺžňom", Ocirc: "Veľké písmeno latinky O s mäkčeňom", Otilde: "Veľké písmeno latinky O s tildou", Ouml: "Veľké písmeno latinky O s dvoma bodkami", times: "Znak násobenia", Oslash: "Veľké písmeno latinky O preškrtnuté", Ugrave: "Veľké písmeno latinky U s accentom",
+ Uacute: "Veľké písmeno latinky U s dĺžňom", Ucirc: "Veľké písmeno latinky U s mäkčeňom", Uuml: "Veľké písmeno latinky U s dvoma bodkami", Yacute: "Veľké písmeno latinky Y s dĺžňom", THORN: "Veľké písmeno latinky Thorn", szlig: "Malé písmeno latinky ostré s", agrave: "Malé písmeno latinky a s accentom", aacute: "Malé písmeno latinky a s dĺžňom", acirc: "Malé písmeno latinky a s mäkčeňom", atilde: "Malé písmeno latinky a s tildou", auml: "Malé písmeno latinky a s dvoma bodkami", aring: "Malé písmeno latinky a s krúžkom nad",
+ aelig: "Malé písmeno latinky æ", ccedil: "Malé písmeno latinky c s chvostom vľavo", egrave: "Malé písmeno latinky e s accentom", eacute: "Malé písmeno latinky e s dĺžňom", ecirc: "Malé písmeno latinky e s mäkčeňom", euml: "Malé písmeno latinky e s dvoma bodkami", igrave: "Malé písmeno latinky i s accentom", iacute: "Malé písmeno latinky i s dĺžňom", icirc: "Malé písmeno latinky i s mäkčeňom", iuml: "Malé písmeno latinky i s dvoma bodkami", eth: "Malé písmeno latinky eth", ntilde: "Malé písmeno latinky n s tildou", ograve: "Malé písmeno latinky o s accentom",
+ oacute: "Malé písmeno latinky o s dĺžňom", ocirc: "Malé písmeno latinky o s mäkčeňom", otilde: "Malé písmeno latinky o s tildou", ouml: "Malé písmeno latinky o s dvoma bodkami", divide: "Znak delenia", oslash: "Malé písmeno latinky o preškrtnuté", ugrave: "Malé písmeno latinky u s accentom", uacute: "Malé písmeno latinky u s dĺžňom", ucirc: "Malé písmeno latinky u s mäkčeňom", uuml: "Malé písmeno latinky u s dvoma bodkami", yacute: "Malé písmeno latinky y s dĺžňom", thorn: "Malé písmeno latinky thorn", yuml: "Malé písmeno latinky y s dvoma bodkami",
+ OElig: "Veľká ligatúra latinky OE", oelig: "Malá ligatúra latinky OE", 372: "Veľké písmeno latinky W s mäkčeňom", 374: "Veľké písmeno latinky Y s mäkčeňom", 373: "Malé písmeno latinky w s mäkčeňom", 375: "Malé písmeno latinky y s mäkčeňom", sbquo: "Dolná jednoduchá 9-úvodzovka", 8219: "Horná jednoduchá otočená 9-úvodzovka", bdquo: "Dolná dvojitá 9-úvodzovka", hellip: "Trojbodkový úvod", trade: "Znak ibchodnej značky", 9658: "Čierny ukazovateľ smerujúci vpravo", bull: "Kruh", rarr: "Šípka vpravo", rArr: "Dvojitá šipka vpravo",
+ hArr: "Dvojitá šipka vľavo a vpravo", diams: "Čierne piky", asymp: "Skoro sa rovná"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/sl.js b/plugins/specialchar/dialogs/lang/sl.js
new file mode 100755
index 0000000..c02889a
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/sl.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "sl", {
+ euro: "Znak za evro", lsquo: "Levi enojni narekovaj", rsquo: "Desni enojni narekovaj", ldquo: "Levi dvojni narekovaj", rdquo: "Desni dvojni narekovaj", ndash: "Pomišljaj", mdash: "Dolgi pomišljaj", iexcl: "Obrnjen klicaj", cent: "Znak za cent", pound: "Znak za funt", curren: "Znak valute", yen: "Znak za jen", brvbar: "Zlomljena črta", sect: "Znak za člen", uml: "Diereza", copy: "Znak avtorskih pravic", ordf: "Ženski zaporedni kazalnik", laquo: "Levi dvojni lomljeni narekovaj", not: "Znak za ne",
+ reg: "Registrirani znak", macr: "Nadčrtano", deg: "Znak za stopinje", sup2: "Nadpisano dva", sup3: "Nadpisano tri", acute: "Ostrivec", micro: "Znak za mikro", para: "Znak za odstavek", middot: "Usredinjena pika", cedil: "Cedilla", sup1: "Nadpisano ena", ordm: "Moški zaporedni kazalnik", raquo: "Desno obrnjen dvojni kotni narekovaj", frac14: "Ena četrtina", frac12: "Ena polovica", frac34: "Tri četrtine", iquest: "Obrnjen vprašaj", Agrave: "Velika latinska črka A s krativcem", Aacute: "Velika latinska črka A z ostrivcem", Acirc: "Velika latinska črka A s strešico",
+ Atilde: "Velika latinska črka A z tildo", Auml: "Velika latinska črka A z diaeresis-om", Aring: "Velika latinska črka A z obročem", AElig: "Velika latinska črka Æ", Ccedil: "Velika latinska črka C s cedillo", Egrave: "Velika latinska črka E s krativcem", Eacute: "Velika latinska črka E z ostrivcem", Ecirc: "Velika latinska črka E s strešico", Euml: "Velika latinska črka E z diaeresis-om", Igrave: "Velika latinska črka I s krativcem", Iacute: "Velika latinska črka I z ostrivcem", Icirc: "Velika latinska črka I s strešico",
+ Iuml: "Velika latinska črka I z diaeresis-om", ETH: "Velika latinska črka Eth", Ntilde: "Velika latinska črka N s tildo", Ograve: "Velika latinska črka O s krativcem", Oacute: "Velika latinska črka O z ostrivcem", Ocirc: "Velika latinska črka O s strešico", Otilde: "Velika latinska črka O s tildo", Ouml: "Velika latinska črka O z diaeresis-om", times: "Znak za množenje", Oslash: "Velika prečrtana latinska črka O", Ugrave: "Velika latinska črka U s krativcem", Uacute: "Velika latinska črka U z ostrivcem", Ucirc: "Velika latinska črka U s strešico",
+ Uuml: "Velika latinska črka U z diaeresis-om", Yacute: "Velika latinska črka Y z ostrivcem", THORN: "Velika latinska črka Thorn", szlig: "Mala ostra latinska črka s", agrave: "Mala latinska črka a s krativcem", aacute: "Mala latinska črka a z ostrivcem", acirc: "Mala latinska črka a s strešico", atilde: "Mala latinska črka a s tildo", auml: "Mala latinska črka a z diaeresis-om", aring: "Mala latinska črka a z obročem", aelig: "Mala latinska črka æ", ccedil: "Mala latinska črka c s cedillo", egrave: "Mala latinska črka e s krativcem",
+ eacute: "Mala latinska črka e z ostrivcem", ecirc: "Mala latinska črka e s strešico", euml: "Mala latinska črka e z diaeresis-om", igrave: "Mala latinska črka i s krativcem", iacute: "Mala latinska črka i z ostrivcem", icirc: "Mala latinska črka i s strešico", iuml: "Mala latinska črka i z diaeresis-om", eth: "Mala latinska črka eth", ntilde: "Mala latinska črka n s tildo", ograve: "Mala latinska črka o s krativcem", oacute: "Mala latinska črka o z ostrivcem", ocirc: "Mala latinska črka o s strešico", otilde: "Mala latinska črka o s tildo",
+ ouml: "Mala latinska črka o z diaeresis-om", divide: "Znak za deljenje", oslash: "Mala prečrtana latinska črka o", ugrave: "Mala latinska črka u s krativcem", uacute: "Mala latinska črka u z ostrivcem", ucirc: "Mala latinska črka u s strešico", uuml: "Mala latinska črka u z diaeresis-om", yacute: "Mala latinska črka y z ostrivcem", thorn: "Mala latinska črka thorn", yuml: "Mala latinska črka y z diaeresis-om", OElig: "Velika latinska ligatura OE", oelig: "Mala latinska ligatura oe", 372: "Velika latinska črka W s strešico",
+ 374: "Velika latinska črka Y s strešico", 373: "Mala latinska črka w s strešico", 375: "Mala latinska črka y s strešico", sbquo: "Enojni nizki-9 narekovaj", 8219: "Enojni visoki-obrnjen-9 narekovaj", bdquo: "Dvojni nizki-9 narekovaj", hellip: "Horizontalni izpust", trade: "Znak blagovne znamke", 9658: "Črni desno-usmerjen kazalec", bull: "Krogla", rarr: "Desno-usmerjena puščica", rArr: "Desno-usmerjena dvojna puščica", hArr: "Leva in desna dvojna puščica", diams: "Črna kara", asymp: "Skoraj enako"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/sq.js b/plugins/specialchar/dialogs/lang/sq.js
new file mode 100755
index 0000000..14a1a33
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/sq.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","sq",{euro:"Shenja e Euros",lsquo:"Thonjëza majtas me një vi",rsquo:"Thonjëza djathtas me një vi",ldquo:"Thonjëza majtas",rdquo:"Thonjëza djathtas",ndash:"En viza lidhëse",mdash:"Em viza lidhëse",iexcl:"Pikëçuditëse e përmbysur",cent:"Shenja e Centit",pound:"Shejna e Funtit",curren:"Shenja e valutës",yen:"Shenja e Jenit",brvbar:"Viza e këputur",sect:"Shenja e pjesës",uml:"Diaeresis",copy:"Shenja e të drejtave të kopjimit",ordf:"Tregues rendor femror",laquo:"Thonjëz me dy kënde e kthyer majtas",
+not:"Nuk ka shenjë",reg:"Shenja e të regjistruarit",macr:"Macron",deg:"Shenja e shkallës",sup2:"Super-skripta dy",sup3:"Super-skripta tre",acute:"Theks i mprehtë",micro:"Shjenja e Mikros",para:"Shenja Pilkrou",middot:"Pika e Mesme",cedil:"Hark nën shkronja",sup1:"Super-skripta një",ordm:"Tregues rendor mashkullor",raquo:"Thonjëz me dy kënde e kthyer djathtas",frac14:"Thyesa një të katrat",frac12:"Thyesa një të dytat",frac34:"Thyesa tre të katrat",iquest:"Pikëpyetje e përmbysur",Agrave:"Shkronja e madhe latine A me theks të rëndë",
+Aacute:"Shkronja e madhe latine A me theks akute",Acirc:"Shkronja e madhe latine A me theks lakor",Atilde:"Shkronja e madhe latine A me tildë",Auml:"Shkronja e madhe latine A me dy pika",Aring:"Shkronja e madhe latine A me unazë mbi",AElig:"Shkronja e madhe latine Æ",Ccedil:"Shkronja e madhe latine C me hark poshtë",Egrave:"Shkronja e madhe latine E me theks të rëndë",Eacute:"Shkronja e madhe latine E me theks akute",Ecirc:"Shkronja e madhe latine E me theks lakor",Euml:"Shkronja e madhe latine E me dy pika",
+Igrave:"Shkronja e madhe latine I me theks të rëndë",Iacute:"Shkronja e madhe latine I me theks akute",Icirc:"Shkronja e madhe latine I me theks lakor",Iuml:"Shkronja e madhe latine I me dy pika",ETH:"Shkronja e madhe latine Eth",Ntilde:"Shkronja e madhe latine N me tildë",Ograve:"Shkronja e madhe latine O me theks të rëndë",Oacute:"Shkronja e madhe latine O me theks akute",Ocirc:"Shkronja e madhe latine O me theks lakor",Otilde:"Shkronja e madhe latine O me tildë",Ouml:"Shkronja e madhe latine O me dy pika",
+times:"Shenja e shumëzimit",Oslash:"Shkronja e madhe latine O me vizë në mes",Ugrave:"Shkronja e madhe latine U me theks të rëndë",Uacute:"Shkronja e madhe latine U me theks akute",Ucirc:"Shkronja e madhe latine U me theks lakor",Uuml:"Shkronja e madhe latine U me dy pika",Yacute:"Shkronja e madhe latine Y me theks akute",THORN:"Shkronja e madhe latine Thorn",szlig:"Shkronja e vogë latine s e mprehtë",agrave:"Shkronja e vogë latine a me theks të rëndë",aacute:"Shkronja e vogë latine a me theks të mprehtë",
+acirc:"Shkronja e vogël latine a me theks lakor",atilde:"Shkronja e vogël latine a me tildë",auml:"Shkronja e vogël latine a me dy pika",aring:"Shkronja e vogë latine a me unazë mbi",aelig:"Shkronja e vogë latine æ",ccedil:"Shkronja e vogël latine c me hark poshtë",egrave:"Shkronja e vogë latine e me theks të rëndë",eacute:"Shkronja e vogë latine e me theks të mprehtë",ecirc:"Shkronja e vogël latine e me theks lakor",euml:"Shkronja e vogël latine e me dy pika",igrave:"Shkronja e vogë latine i me theks të rëndë",
+iacute:"Shkronja e vogë latine i me theks të mprehtë",icirc:"Shkronja e vogël latine i me theks lakor",iuml:"Shkronja e vogël latine i me dy pika",eth:"Shkronja e vogë latine eth",ntilde:"Shkronja e vogël latine n me tildë",ograve:"Shkronja e vogë latine o me theks të rëndë",oacute:"Shkronja e vogë latine o me theks të mprehtë",ocirc:"Shkronja e vogël latine o me theks lakor",otilde:"Shkronja e vogël latine o me tildë",ouml:"Shkronja e vogël latine o me dy pika",divide:"Shenja ndarëse",oslash:"Shkronja e vogël latine o me vizë në mes",
+ugrave:"Shkronja e vogë latine u me theks të rëndë",uacute:"Shkronja e vogë latine u me theks të mprehtë",ucirc:"Shkronja e vogël latine u me theks lakor",uuml:"Shkronja e vogël latine u me dy pika",yacute:"Shkronja e vogë latine y me theks të mprehtë",thorn:"Shkronja e vogël latine thorn",yuml:"Shkronja e vogël latine y me dy pika",OElig:"Shkronja e madhe e bashkuar latine OE",oelig:"Shkronja e vogël e bashkuar latine oe",372:"Shkronja e madhe latine W me theks lakor",374:"Shkronja e madhe latine Y me theks lakor",
+373:"Shkronja e vogël latine w me theks lakor",375:"Shkronja e vogël latine y me theks lakor",sbquo:"Thonjëz-9 e vetme poshtë",8219:"Thonjëz-9 lartë e vetme e kthyer në të kundërtën",bdquo:"Thonjëza-9 poshtë",hellip:"Tri pika horizontale",trade:"Shenja e Simbolit Tregtarë",9658:"Shenjë tregues kthyer djathtas-prapa",bull:"Pulla",rarr:"Shigjeta djathtas",rArr:"Shenja të dyfishta djathtas",hArr:"Shigjeta e dyfishë majtas-djathtas",diams:"Karo me ngjyrë të zezë",asymp:"Gati e barabar me"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/sv.js b/plugins/specialchar/dialogs/lang/sv.js
new file mode 100755
index 0000000..ee28d4d
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/sv.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "sv", {
+ euro: "Eurotecken", lsquo: "Enkelt vänster citattecken", rsquo: "Enkelt höger citattecken", ldquo: "Dubbelt vänster citattecken", rdquo: "Dubbelt höger citattecken", ndash: "Snedstreck", mdash: "Långt tankstreck", iexcl: "Inverterad utropstecken", cent: "Centtecken", pound: "Pundtecken", curren: "Valutatecken", yen: "Yentecken", brvbar: "Brutet lodrätt streck", sect: "Paragraftecken", uml: "Diaeresis", copy: "Upphovsrättstecken", ordf: "Feminit ordningstalsindikator", laquo: "Vänsterställt dubbelt vinkelcitationstecken",
+ not: "Icke-tecken", reg: "Registrerad", macr: "Macron", deg: "Grader", sup2: "Upphöjt två", sup3: "Upphöjt tre", acute: "Akut accent", micro: "Mikrotecken", para: "Alinea", middot: "Centrerad prick", cedil: "Cedilj", sup1: "Upphöjt en", ordm: "Maskulina ordningsändelsen", raquo: "Högerställt dubbelt vinkelcitationstecken", frac14: "Bråktal - en kvart", frac12: "Bråktal - en halv", frac34: "Bråktal - tre fjärdedelar", iquest: "Inverterat frågetecken", Agrave: "Stort A med grav accent", Aacute: "Stort A med akutaccent", Acirc: "Stort A med circumflex",
+ Atilde: "Stort A med tilde", Auml: "Stort A med diaresis", Aring: "Stort A med ring ovan", AElig: "Stort Æ", Ccedil: "Stort C med cedilj", Egrave: "Stort E med grav accent", Eacute: "Stort E med aktuaccent", Ecirc: "Stort E med circumflex", Euml: "Stort E med diaeresis", Igrave: "Stort I med grav accent", Iacute: "Stort I med akutaccent", Icirc: "Stort I med circumflex", Iuml: "Stort I med diaeresis", ETH: "Stort Eth", Ntilde: "Stort N med tilde", Ograve: "Stort O med grav accent", Oacute: "Stort O med aktuaccent", Ocirc: "Stort O med circumflex",
+ Otilde: "Stort O med tilde", Ouml: "Stort O med diaeresis", times: "Multiplicera", Oslash: "Stor Ø", Ugrave: "Stort U med grav accent", Uacute: "Stort U med akutaccent", Ucirc: "Stort U med circumflex", Uuml: "Stort U med diaeresis", Yacute: "Stort Y med akutaccent", THORN: "Stort Thorn", szlig: "Litet dubbel-s/Eszett", agrave: "Litet a med grav accent", aacute: "Litet a med akutaccent", acirc: "Litet a med circumflex", atilde: "Litet a med tilde", auml: "Litet a med diaeresis", aring: "Litet a med ring ovan", aelig: "Bokstaven æ",
+ ccedil: "Litet c med cedilj", egrave: "Litet e med grav accent", eacute: "Litet e med akutaccent", ecirc: "Litet e med circumflex", euml: "Litet e med diaeresis", igrave: "Litet i med grav accent", iacute: "Litet i med akutaccent", icirc: "LItet i med circumflex", iuml: "Litet i med didaeresis", eth: "Litet eth", ntilde: "Litet n med tilde", ograve: "LItet o med grav accent", oacute: "LItet o med akutaccent", ocirc: "Litet o med circumflex", otilde: "LItet o med tilde", ouml: "Litet o med diaeresis", divide: "Division", oslash: "ø",
+ ugrave: "Litet u med grav accent", uacute: "Litet u med akutaccent", ucirc: "LItet u med circumflex", uuml: "Litet u med diaeresis", yacute: "Litet y med akutaccent", thorn: "Litet thorn", yuml: "Litet y med diaeresis", OElig: "Stor ligatur av OE", oelig: "Liten ligatur av oe", 372: "Stort W med circumflex", 374: "Stort Y med circumflex", 373: "Litet w med circumflex", 375: "Litet y med circumflex", sbquo: "Enkelt lågt 9-citationstecken", 8219: "Enkelt högt bakvänt 9-citationstecken", bdquo: "Dubbelt lågt 9-citationstecken", hellip: "Horisontellt uteslutningstecken",
+ trade: "Varumärke", 9658: "Svart högervänd pekare", bull: "Listpunkt", rarr: "Högerpil", rArr: "Dubbel högerpil", hArr: "Dubbel vänsterpil", diams: "Svart ruter", asymp: "Ungefär lika med"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/th.js b/plugins/specialchar/dialogs/lang/th.js
new file mode 100755
index 0000000..5edb8d1
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/th.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","th",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"สัญลักษณ์สกุลเงิน",yen:"สัญลักษณ์เงินเยน",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"สัญลักษณ์หัวข้อย่อย",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/tr.js b/plugins/specialchar/dialogs/lang/tr.js
new file mode 100755
index 0000000..35f3efa
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/tr.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "tr", {
+ euro: "Euro işareti", lsquo: "Sol tek tırnak işareti", rsquo: "Sağ tek tırnak işareti", ldquo: "Sol çift tırnak işareti", rdquo: "Sağ çift tırnak işareti", ndash: "En tire", mdash: "Em tire", iexcl: "Ters ünlem işareti", cent: "Cent işareti", pound: "Pound işareti", curren: "Para birimi işareti", yen: "Yen işareti", brvbar: "Kırık bar", sect: "Bölüm işareti", uml: "İki sesli harfin ayrılması", copy: "Telif hakkı işareti", ordf: "Dişil sıralı gösterge", laquo: "Sol-işaret çift açı tırnak işareti",
+ not: "Not işareti", reg: "Kayıtlı işareti", macr: "Makron", deg: "Derece işareti", sup2: "İkili üstsimge", sup3: "Üçlü üstsimge", acute: "Aksan işareti", micro: "Mikro işareti", para: "Pilcrow işareti", middot: "Orta nokta", cedil: "Kedilla", sup1: "Üstsimge", ordm: "Eril sıralı gösterge", raquo: "Sağ işaret çift açı tırnak işareti", frac14: "Bayağı kesrin dörtte biri", frac12: "Bayağı kesrin bir yarım", frac34: "Bayağı kesrin dörtte üç", iquest: "Ters soru işareti", Agrave: "Aksanlı latin harfi", Aacute: "Aşırı aksanıyla Latin harfi",
+ Acirc: "Çarpık Latin harfi", Atilde: "Tilde latin harfi", Auml: "Sesli harf ayrılımlıı latin harfi", Aring: "Halkalı latin büyük A harfi", AElig: "Latin büyük Æ harfi", Ccedil: "Latin büyük C harfi ile kedilla", Egrave: "Aksanlı latin büyük E harfi", Eacute: "Aşırı vurgulu latin büyük E harfi", Ecirc: "Çarpık latin büyük E harfi", Euml: "Sesli harf ayrılımlıı latin büyük E harfi", Igrave: "Aksanlı latin büyük I harfi", Iacute: "Aşırı aksanlı latin büyük I harfi", Icirc: "Çarpık latin büyük I harfi", Iuml: "Sesli harf ayrılımlıı latin büyük I harfi",
+ ETH: "Latin büyük Eth harfi", Ntilde: "Tildeli latin büyük N harfi", Ograve: "Aksanlı latin büyük O harfi", Oacute: "Aşırı aksanlı latin büyük O harfi", Ocirc: "Çarpık latin büyük O harfi", Otilde: "Tildeli latin büyük O harfi", Ouml: "Sesli harf ayrılımlı latin büyük O harfi", times: "Çarpma işareti", Oslash: "Vurgulu latin büyük O harfi", Ugrave: "Aksanlı latin büyük U harfi", Uacute: "Aşırı aksanlı latin büyük U harfi", Ucirc: "Çarpık latin büyük U harfi", Uuml: "Sesli harf ayrılımlı latin büyük U harfi", Yacute: "Aşırı aksanlı latin büyük Y harfi",
+ THORN: "Latin büyük Thorn harfi", szlig: "Latin küçük keskin s harfi", agrave: "Aksanlı latin küçük a harfi", aacute: "Aşırı aksanlı latin küçük a harfi", acirc: "Çarpık latin küçük a harfi", atilde: "Tildeli latin küçük a harfi", auml: "Sesli harf ayrılımlı latin küçük a harfi", aring: "Halkalı latin küçük a harfi", aelig: "Latin büyük æ harfi", ccedil: "Kedillalı latin küçük c harfi", egrave: "Aksanlı latin küçük e harfi", eacute: "Aşırı aksanlı latin küçük e harfi", ecirc: "Çarpık latin küçük e harfi", euml: "Sesli harf ayrılımlı latin küçük e harfi",
+ igrave: "Aksanlı latin küçük i harfi", iacute: "Aşırı aksanlı latin küçük i harfi", icirc: "Çarpık latin küçük i harfi", iuml: "Sesli harf ayrılımlı latin küçük i harfi", eth: "Latin küçük eth harfi", ntilde: "Tildeli latin küçük n harfi", ograve: "Aksanlı latin küçük o harfi", oacute: "Aşırı aksanlı latin küçük o harfi", ocirc: "Çarpık latin küçük o harfi", otilde: "Tildeli latin küçük o harfi", ouml: "Sesli harf ayrılımlı latin küçük o harfi", divide: "Bölme işareti", oslash: "Vurgulu latin küçük o harfi", ugrave: "Aksanlı latin küçük u harfi",
+ uacute: "Aşırı aksanlı latin küçük u harfi", ucirc: "Çarpık latin küçük u harfi", uuml: "Sesli harf ayrılımlı latin küçük u harfi", yacute: "Aşırı aksanlı latin küçük y harfi", thorn: "Latin küçük thorn harfi", yuml: "Sesli harf ayrılımlı latin küçük y harfi", OElig: "Latin büyük bağlı OE harfi", oelig: "Latin küçük bağlı oe harfi", 372: "Çarpık latin büyük W harfi", 374: "Çarpık latin büyük Y harfi", 373: "Çarpık latin küçük w harfi", 375: "Çarpık latin küçük y harfi", sbquo: "Tek düşük-9 tırnak işareti", 8219: "Tek yüksek-ters-9 tırnak işareti",
+ bdquo: "Çift düşük-9 tırnak işareti", hellip: "Yatay elips", trade: "Marka tescili işareti", 9658: "Siyah sağ işaret işaretçisi", bull: "Koyu nokta", rarr: "Sağa doğru ok", rArr: "Sağa doğru çift ok", hArr: "Sol, sağ çift ok", diams: "Siyah elmas takımı", asymp: "Hemen hemen eşit"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/tt.js b/plugins/specialchar/dialogs/lang/tt.js
new file mode 100755
index 0000000..aac9172
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/tt.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "tt", {
+ euro: "Евро тамгасы", lsquo: "Сул бер иңле куштырнаклар", rsquo: "Уң бер иңле куштырнаклар", ldquo: "Сул ике иңле куштырнаклар", rdquo: "Уң ике иңле куштырнаклар", ndash: "Кыска сызык", mdash: "Озын сызык", iexcl: "Әйләндерелгән өндәү билгесе", cent: "Цент тамгасы", pound: "Фунт тамгасы", curren: "Акча берәмлеге тамгасы", yen: "Иена тамгасы", brvbar: "Broken bar", sect: "Параграф билгесе", uml: "Диерезис", copy: "Хокук иясе булу билгесе", ordf: "Feminine ordinal indicator", laquo: "Ачылучы чыршысыман җәя",
+ not: "Юклык ишарəсе", reg: "Теркәләнгән булу билгесе", macr: "Макрон", deg: "Градус билгесе", sup2: "Икенче өске индекс", sup3: "Өченче өске индекс", acute: "Басым билгесе", micro: "Микро билгесе", para: "Параграф билгесе", middot: "Уртадагы нокта", cedil: "Седиль", sup1: "Беренче өске индекс", ordm: "Masculine ordinal indicator", raquo: "Ябылучы чыршысыман җәя", frac14: "Гади дүрттән бер билгесе", frac12: "Гади икедән бер билгесе", frac34: "Гади дүрттән өч билгесе", iquest: "Әйләндерелгән өндәү билгесе", Agrave: "Гравис белән латин A баш хәрефе",
+ Aacute: "Басым билгесе белән латин A баш хәрефе", Acirc: "Циркумфлекс белән латин A баш хәрефе", Atilde: "Тильда белән латин A баш хәрефе", Auml: "Диерезис белән латин A баш хәрефе", Aring: "Өстендә боҗра булган латин A баш хәрефе", AElig: "Латин Æ баш хәрефе", Ccedil: "Седиль белән латин C баш хәрефе", Egrave: "Гравис белән латин E баш хәрефе", Eacute: "Басым билгесе белән латин E баш хәрефе", Ecirc: "Циркумфлекс белән латин E баш хәрефе", Euml: "Диерезис белән латин E баш хәрефе", Igrave: "Гравис белән латин I баш хәрефе",
+ Iacute: "Басым билгесе белән латин I баш хәрефе", Icirc: "Циркумфлекс белән латин I баш хәрефе", Iuml: "Диерезис белән латин I баш хәрефе", ETH: "Латин Eth баш хәрефе", Ntilde: "Тильда белән латин N баш хәрефе", Ograve: "Гравис белән латин O баш хәрефе", Oacute: "Басым билгесе белән латин O баш хәрефе", Ocirc: "Циркумфлекс белән латин O баш хәрефе", Otilde: "Тильда белән латин O баш хәрефе", Ouml: "Диерезис белән латин O баш хәрефе", times: "Тапкырлау билгесе", Oslash: "Сызык белән латин O баш хәрефе", Ugrave: "Гравис белән латин U баш хәрефе",
+ Uacute: "Басым билгесе белән латин U баш хәрефе", Ucirc: "Циркумфлекс белән латин U баш хәрефе", Uuml: "Диерезис белән латин U баш хәрефе", Yacute: "Басым билгесе белән латин Y баш хәрефе", THORN: "Латин Thorn баш хәрефе", szlig: "Латин beta юл хәрефе", agrave: "Гравис белән латин a юл хәрефе", aacute: "Басым билгесе белән латин a юл хәрефе", acirc: "Циркумфлекс белән латин a юл хәрефе", atilde: "Тильда белән латин a юл хәрефе", auml: "Диерезис белән латин a юл хәрефе", aring: "Өстендә боҗра булган латин a юл хәрефе", aelig: "Латин æ юл хәрефе",
+ ccedil: "Седиль белән латин c юл хәрефе", egrave: "Гравис белән латин e юл хәрефе", eacute: "Басым билгесе белән латин e юл хәрефе", ecirc: "Циркумфлекс белән латин e юл хәрефе", euml: "Диерезис белән латин e юл хәрефе", igrave: "Гравис белән латин i юл хәрефе", iacute: "Басым билгесе белән латин i юл хәрефе", icirc: "Циркумфлекс белән латин i юл хәрефе", iuml: "Диерезис белән латин i юл хәрефе", eth: "Латин eth юл хәрефе", ntilde: "Тильда белән латин n юл хәрефе", ograve: "Гравис белән латин o юл хәрефе", oacute: "Басым билгесе белән латин o юл хәрефе",
+ ocirc: "Циркумфлекс белән латин o юл хәрефе", otilde: "Тильда белән латин o юл хәрефе", ouml: "Диерезис белән латин o юл хәрефе", divide: "Бүлү билгесе", oslash: "Сызык белән латин o юл хәрефе", ugrave: "Гравис белән латин u юл хәрефе", uacute: "Басым билгесе белән латин u юл хәрефе", ucirc: "Циркумфлекс белән латин u юл хәрефе", uuml: "Диерезис белән латин u юл хәрефе", yacute: "Басым билгесе белән латин y юл хәрефе", thorn: "Латин thorn юл хәрефе", yuml: "Диерезис белән латин y юл хәрефе", OElig: "Латин лигатура OE баш хәрефе",
+ oelig: "Латин лигатура oe юл хәрефе", 372: "Циркумфлекс белән латин W баш хәрефе", 374: "Циркумфлекс белән латин Y баш хәрефе", 373: "Циркумфлекс белән латин w юл хәрефе", 375: "Циркумфлекс белән латин y юл хәрефе", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Ятма эллипс", trade: "Сәүдә маркасы билгесе", 9658: "Black right-pointing pointer", bull: "Маркер", rarr: "Уң якка ук", rArr: "Уң якка икеләтә ук", hArr: "Ике якка икеләтә ук", diams: "Black diamond suit",
+ asymp: "якынча"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/ug.js b/plugins/specialchar/dialogs/lang/ug.js
new file mode 100755
index 0000000..d0ae966
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/ug.js
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "ug", {
+ euro: "ياۋرو بەلگىسى", lsquo: "يالاڭ پەش سول", rsquo: "يالاڭ پەش ئوڭ", ldquo: "قوش پەش سول", rdquo: "قوش پەش ئوڭ", ndash: "سىزىقچە", mdash: "سىزىق", iexcl: "ئۈندەش", cent: "تىيىن بەلگىسى", pound: "فوند ستېرلىڭ", curren: "پۇل بەلگىسى", yen: "ياپونىيە يىنى", brvbar: "ئۈزۈك بالداق", sect: "پاراگراف بەلگىسى", uml: "تاۋۇش ئايرىش بەلگىسى", copy: "نەشر ھوقۇقى بەلگىسى", ordf: "Feminine ordinal indicator", laquo: "قوش تىرناق سول", not: "غەيرى بەلگە", reg: "خەتلەتكەن تاۋار ماركىسى", macr: "سوزۇش بەلگىسى",
+ deg: "گىرادۇس بەلگىسى", sup2: "يۇقىرى ئىندېكىس 2", sup3: "يۇقىرى ئىندېكىس 3", acute: "ئۇرغۇ بەلگىسى", micro: "Micro sign", para: "ئابزاس بەلگىسى", middot: "ئوتتۇرا چېكىت", cedil: "ئاستىغا قوشۇلىدىغان بەلگە", sup1: "يۇقىرى ئىندېكىس 1", ordm: "Masculine ordinal indicator", raquo: "قوش تىرناق ئوڭ", frac14: "ئاددىي كەسىر تۆتتىن بىر", frac12: "ئاددىي كەسىر ئىككىدىن بىر", frac34: "ئاددىي كەسىر ئۈچتىن تۆرت", iquest: "Inverted question mark", Agrave: "Latin capital letter A with grave accent", Aacute: "Latin capital letter A with acute accent",
+ Acirc: "Latin capital letter A with circumflex", Atilde: "Latin capital letter A with tilde", Auml: "Latin capital letter A with diaeresis", Aring: "Latin capital letter A with ring above", AElig: "Latin capital letter Æ", Ccedil: "Latin capital letter C with cedilla", Egrave: "Latin capital letter E with grave accent", Eacute: "Latin capital letter E with acute accent", Ecirc: "Latin capital letter E with circumflex", Euml: "Latin capital letter E with diaeresis", Igrave: "Latin capital letter I with grave accent", Iacute: "Latin capital letter I with acute accent",
+ Icirc: "Latin capital letter I with circumflex", Iuml: "Latin capital letter I with diaeresis", ETH: "Latin capital letter Eth", Ntilde: "Latin capital letter N with tilde", Ograve: "قوش پەش ئوڭ", Oacute: "Latin capital letter O with acute accent", Ocirc: "Latin capital letter O with circumflex", Otilde: "Latin capital letter O with tilde", Ouml: "Latin capital letter O with diaeresis", times: "Multiplication sign", Oslash: "Latin capital letter O with stroke", Ugrave: "Latin capital letter U with grave accent", Uacute: "Latin capital letter U with acute accent",
+ Ucirc: "Latin capital letter U with circumflex", Uuml: "Latin capital letter U with diaeresis", Yacute: "Latin capital letter Y with acute accent", THORN: "Latin capital letter Thorn", szlig: "Latin small letter sharp s", agrave: "Latin small letter a with grave accent", aacute: "Latin small letter a with acute accent", acirc: "Latin small letter a with circumflex", atilde: "Latin small letter a with tilde", auml: "Latin small letter a with diaeresis", aring: "Latin small letter a with ring above", aelig: "Latin small letter æ",
+ ccedil: "Latin small letter c with cedilla", egrave: "Latin small letter e with grave accent", eacute: "Latin small letter e with acute accent", ecirc: "Latin small letter e with circumflex", euml: "Latin small letter e with diaeresis", igrave: "Latin small letter i with grave accent", iacute: "Latin small letter i with acute accent", icirc: "Latin small letter i with circumflex", iuml: "Latin small letter i with diaeresis", eth: "Latin small letter eth", ntilde: "تىك موللاق سوئال بەلگىسى", ograve: "Latin small letter o with grave accent",
+ oacute: "Latin small letter o with acute accent", ocirc: "Latin small letter o with circumflex", otilde: "Latin small letter o with tilde", ouml: "Latin small letter o with diaeresis", divide: "بۆلۈش بەلگىسى", oslash: "Latin small letter o with stroke", ugrave: "Latin small letter u with grave accent", uacute: "Latin small letter u with acute accent", ucirc: "Latin small letter u with circumflex", uuml: "Latin small letter u with diaeresis", yacute: "Latin small letter y with acute accent", thorn: "Latin small letter thorn",
+ yuml: "Latin small letter y with diaeresis", OElig: "Latin capital ligature OE", oelig: "Latin small ligature oe", 372: "Latin capital letter W with circumflex", 374: "Latin capital letter Y with circumflex", 373: "Latin small letter w with circumflex", 375: "Latin small letter y with circumflex", sbquo: "Single low-9 quotation mark", 8219: "Single high-reversed-9 quotation mark", bdquo: "Double low-9 quotation mark", hellip: "Horizontal ellipsis", trade: "خەتلەتكەن تاۋار ماركىسى بەلگىسى", 9658: "Black right-pointing pointer",
+ bull: "Bullet", rarr: "ئوڭ يا ئوق", rArr: "ئوڭ قوش سىزىق يا ئوق", hArr: "ئوڭ سول قوش سىزىق يا ئوق", diams: "ئۇيۇل غىچ", asymp: "تەخمىنەن تەڭ"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/uk.js b/plugins/specialchar/dialogs/lang/uk.js
new file mode 100755
index 0000000..de7ccdf
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/uk.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "uk", {
+ euro: "Знак євро", lsquo: "Ліві одинарні лапки", rsquo: "Праві одинарні лапки", ldquo: "Ліві подвійні лапки", rdquo: "Праві подвійні лапки", ndash: "Середнє тире", mdash: "Довге тире", iexcl: "Перевернутий знак оклику", cent: "Знак цента", pound: "Знак фунта", curren: "Знак валюти", yen: "Знак єни", brvbar: "Переривчаста вертикальна лінія", sect: "Знак параграфу", uml: "Умлаут", copy: "Знак авторських прав", ordf: "Жіночий порядковий вказівник", laquo: "ліві вказівні подвійні кутові дужки",
+ not: "Заперечення", reg: "Знак охорони суміжних прав", macr: "Макрон", deg: "Знак градуса", sup2: "два у верхньому індексі", sup3: "три у верхньому індексі", acute: "Знак акута", micro: "Знак мікро", para: "Знак абзацу", middot: "Інтерпункт", cedil: "Седиль", sup1: "Один у верхньому індексі", ordm: "Чоловічий порядковий вказівник", raquo: "праві вказівні подвійні кутові дужки", frac14: "Одна четвертина", frac12: "Одна друга", frac34: "три четвертих", iquest: "Перевернутий знак питання", Agrave: "Велика латинська A з гравісом", Aacute: "Велика латинська А з акутом",
+ Acirc: "Велика латинська А з циркумфлексом", Atilde: "Велика латинська А з тильдою", Auml: "Велике латинське А з умлаутом", Aring: "Велика латинська A з кільцем згори", AElig: "Велика латинська Æ", Ccedil: "Велика латинська C з седиллю", Egrave: "Велика латинська E з гравісом", Eacute: "Велика латинська E з акутом", Ecirc: "Велика латинська E з циркумфлексом", Euml: "Велика латинська А з умлаутом", Igrave: "Велика латинська I з гравісом", Iacute: "Велика латинська I з акутом", Icirc: "Велика латинська I з циркумфлексом",
+ Iuml: "Велика латинська І з умлаутом", ETH: "Велика латинська Eth", Ntilde: "Велика латинська N з тильдою", Ograve: "Велика латинська O з гравісом", Oacute: "Велика латинська O з акутом", Ocirc: "Велика латинська O з циркумфлексом", Otilde: "Велика латинська O з тильдою", Ouml: "Велика латинська О з умлаутом", times: "Знак множення", Oslash: "Велика латинська перекреслена O ", Ugrave: "Велика латинська U з гравісом", Uacute: "Велика латинська U з акутом", Ucirc: "Велика латинська U з циркумфлексом", Uuml: "Велика латинська U з умлаутом",
+ Yacute: "Велика латинська Y з акутом", THORN: "Велика латинська Торн", szlig: "Мала латинська есцет", agrave: "Мала латинська a з гравісом", aacute: "Мала латинська a з акутом", acirc: "Мала латинська a з циркумфлексом", atilde: "Мала латинська a з тильдою", auml: "Мала латинська a з умлаутом", aring: "Мала латинська a з кільцем згори", aelig: "Мала латинська æ", ccedil: "Мала латинська C з седиллю", egrave: "Мала латинська e з гравісом", eacute: "Мала латинська e з акутом", ecirc: "Мала латинська e з циркумфлексом", euml: "Мала латинська e з умлаутом",
+ igrave: "Мала латинська i з гравісом", iacute: "Мала латинська i з акутом", icirc: "Мала латинська i з циркумфлексом", iuml: "Мала латинська i з умлаутом", eth: "Мала латинська Eth", ntilde: "Мала латинська n з тильдою", ograve: "Мала латинська o з гравісом", oacute: "Мала латинська o з акутом", ocirc: "Мала латинська o з циркумфлексом", otilde: "Мала латинська o з тильдою", ouml: "Мала латинська o з умлаутом", divide: "Знак ділення", oslash: "Мала латинська перекреслена o", ugrave: "Мала латинська u з гравісом", uacute: "Мала латинська u з акутом",
+ ucirc: "Мала латинська u з циркумфлексом", uuml: "Мала латинська u з умлаутом", yacute: "Мала латинська y з акутом", thorn: "Мала латинська торн", yuml: "Мала латинська y з умлаутом", OElig: "Велика латинська лігатура OE", oelig: "Мала латинська лігатура oe", 372: "Велика латинська W з циркумфлексом", 374: "Велика латинська Y з циркумфлексом", 373: "Мала латинська w з циркумфлексом", 375: "Мала латинська y з циркумфлексом", sbquo: "Одиничні нижні лабки", 8219: "Верхні одиничні обернені лабки", bdquo: "Подвійні нижні лабки",
+ hellip: "Три крапки", trade: "Знак торгової марки", 9658: "Чорний правий вказівник", bull: "Маркер списку", rarr: "Стрілка вправо", rArr: "Подвійна стрілка вправо", hArr: "Подвійна стрілка вліво-вправо", diams: "Чорний діамонт", asymp: "Наближено дорівнює"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/vi.js b/plugins/specialchar/dialogs/lang/vi.js
new file mode 100755
index 0000000..75c2eb5
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/vi.js
@@ -0,0 +1,16 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "vi", {
+ euro: "Ký hiệu Euro", lsquo: "Dấu ngoặc đơn trái", rsquo: "Dấu ngoặc đơn phải", ldquo: "Dấu ngoặc đôi trái", rdquo: "Dấu ngoặc đôi phải", ndash: "Gạch ngang tiếng anh", mdash: "Gạch ngang Em", iexcl: "Chuyển đổi dấu chấm than", cent: "Ký tự tiền Mỹ", pound: "Ký tự tiền Anh", curren: "Ký tự tiền tệ", yen: "Ký tự tiền Yên Nhật", brvbar: "Thanh hỏng", sect: "Ký tự khu vực", uml: "Dấu tách đôi", copy: "Ký tự bản quyền", ordf: "Phần chỉ thị giống cái", laquo: "Chọn dấu ngoặc đôi trái", not: "Không có ký tự",
+ reg: "Ký tự đăng ký", macr: "Dấu nguyên âm dài", deg: "Ký tự độ", sup2: "Chữ trồi lên trên dạng 2", sup3: "Chữ trồi lên trên dạng 3", acute: "Dấu trọng âm", micro: "Ký tự micro", para: "Ký tự đoạn văn", middot: "Dấu chấm tròn", cedil: "Dấu móc lưới", sup1: "Ký tự trồi lên cấp 1", ordm: "Ký tự biểu hiện giống đực", raquo: "Chọn dấu ngoặc đôi phải", frac14: "Tỉ lệ một phần tư", frac12: "Tỉ lệ một nửa", frac34: "Tỉ lệ ba phần tư", iquest: "Chuyển đổi dấu chấm hỏi", Agrave: "Ký tự la-tinh viết hoa A với dấu huyền", Aacute: "Ký tự la-tinh viết hoa A với dấu sắc",
+ Acirc: "Ký tự la-tinh viết hoa A với dấu mũ", Atilde: "Ký tự la-tinh viết hoa A với dấu ngã", Auml: "Ký tự la-tinh viết hoa A với dấu hai chấm trên đầu", Aring: "Ký tự la-tinh viết hoa A với biểu tượng vòng tròn trên đầu", AElig: "Ký tự la-tinh viết hoa của Æ", Ccedil: "Ký tự la-tinh viết hoa C với dấu móc bên dưới", Egrave: "Ký tự la-tinh viết hoa E với dấu huyền", Eacute: "Ký tự la-tinh viết hoa E với dấu sắc", Ecirc: "Ký tự la-tinh viết hoa E với dấu mũ", Euml: "Ký tự la-tinh viết hoa E với dấu hai chấm trên đầu",
+ Igrave: "Ký tự la-tinh viết hoa I với dấu huyền", Iacute: "Ký tự la-tinh viết hoa I với dấu sắc", Icirc: "Ký tự la-tinh viết hoa I với dấu mũ", Iuml: "Ký tự la-tinh viết hoa I với dấu hai chấm trên đầu", ETH: "Viết hoa của ký tự Eth", Ntilde: "Ký tự la-tinh viết hoa N với dấu ngã", Ograve: "Ký tự la-tinh viết hoa O với dấu huyền", Oacute: "Ký tự la-tinh viết hoa O với dấu sắc", Ocirc: "Ký tự la-tinh viết hoa O với dấu mũ", Otilde: "Ký tự la-tinh viết hoa O với dấu ngã", Ouml: "Ký tự la-tinh viết hoa O với dấu hai chấm trên đầu",
+ times: "Ký tự phép toán nhân", Oslash: "Ký tự la-tinh viết hoa A với dấu ngã xuống", Ugrave: "Ký tự la-tinh viết hoa U với dấu huyền", Uacute: "Ký tự la-tinh viết hoa U với dấu sắc", Ucirc: "Ký tự la-tinh viết hoa U với dấu mũ", Uuml: "Ký tự la-tinh viết hoa U với dấu hai chấm trên đầu", Yacute: "Ký tự la-tinh viết hoa Y với dấu sắc", THORN: "Phần viết hoa của ký tự Thorn", szlig: "Ký tự viết nhỏ la-tinh của chữ s", agrave: "Ký tự la-tinh thường với dấu huyền", aacute: "Ký tự la-tinh thường với dấu sắc", acirc: "Ký tự la-tinh thường với dấu mũ",
+ atilde: "Ký tự la-tinh thường với dấu ngã", auml: "Ký tự la-tinh thường với dấu hai chấm trên đầu", aring: "Ký tự la-tinh viết thường với biểu tượng vòng tròn trên đầu", aelig: "Ký tự la-tinh viết thường của æ", ccedil: "Ký tự la-tinh viết thường của c với dấu móc bên dưới", egrave: "Ký tự la-tinh viết thường e với dấu huyền", eacute: "Ký tự la-tinh viết thường e với dấu sắc", ecirc: "Ký tự la-tinh viết thường e với dấu mũ", euml: "Ký tự la-tinh viết thường e với dấu hai chấm trên đầu", igrave: "Ký tự la-tinh viết thường i với dấu huyền",
+ iacute: "Ký tự la-tinh viết thường i với dấu sắc", icirc: "Ký tự la-tinh viết thường i với dấu mũ", iuml: "Ký tự la-tinh viết thường i với dấu hai chấm trên đầu", eth: "Ký tự la-tinh viết thường của eth", ntilde: "Ký tự la-tinh viết thường n với dấu ngã", ograve: "Ký tự la-tinh viết thường o với dấu huyền", oacute: "Ký tự la-tinh viết thường o với dấu sắc", ocirc: "Ký tự la-tinh viết thường o với dấu mũ", otilde: "Ký tự la-tinh viết thường o với dấu ngã", ouml: "Ký tự la-tinh viết thường o với dấu hai chấm trên đầu",
+ divide: "Ký hiệu phép tính chia", oslash: "Ký tự la-tinh viết thường o với dấu ngã", ugrave: "Ký tự la-tinh viết thường u với dấu huyền", uacute: "Ký tự la-tinh viết thường u với dấu sắc", ucirc: "Ký tự la-tinh viết thường u với dấu mũ", uuml: "Ký tự la-tinh viết thường u với dấu hai chấm trên đầu", yacute: "Ký tự la-tinh viết thường y với dấu sắc", thorn: "Ký tự la-tinh viết thường của chữ thorn", yuml: "Ký tự la-tinh viết thường y với dấu hai chấm trên đầu", OElig: "Ký tự la-tinh viết hoa gạch nối OE", oelig: "Ký tự la-tinh viết thường gạch nối OE",
+ 372: "Ký tự la-tinh viết hoa W với dấu mũ", 374: "Ký tự la-tinh viết hoa Y với dấu mũ", 373: "Ký tự la-tinh viết thường w với dấu mũ", 375: "Ký tự la-tinh viết thường y với dấu mũ", sbquo: "Dấu ngoặc đơn thấp số-9", 8219: "Dấu ngoặc đơn đảo ngược số-9", bdquo: "Gấp đôi dấu ngoặc đơn số-9", hellip: "Tĩnh dược chiều ngang", trade: "Ký tự thương hiệu", 9658: "Ký tự trỏ về hướng bên phải màu đen", bull: "Ký hiệu", rarr: "Mũi tên hướng bên phải", rArr: "Mũi tên hướng bên phải dạng đôi", hArr: "Mũi tên hướng bên trái dạng đôi", diams: "Ký hiệu hình thoi",
+ asymp: "Gần bằng với"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/zh-cn.js b/plugins/specialchar/dialogs/lang/zh-cn.js
new file mode 100755
index 0000000..2e56d12
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/zh-cn.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar", "zh-cn", {
+ euro: "欧元符号", lsquo: "左单引号", rsquo: "右单引号", ldquo: "左双引号", rdquo: "右双引号", ndash: "短划线", mdash: "长划线", iexcl: "竖翻叹号", cent: "分币符号", pound: "英镑符号", curren: "货币符号", yen: "日元符号", brvbar: "间断条", sect: "节标记", uml: "分音符", copy: "版权所有标记", ordf: "阴性顺序指示符", laquo: "左指双尖引号", not: "非标记", reg: "注册标记", macr: "长音符", deg: "度标记", sup2: "上标二", sup3: "上标三", acute: "锐音符", micro: "微符", para: "段落标记", middot: "中间点", cedil: "下加符", sup1: "上标一", ordm: "阳性顺序指示符", raquo: "右指双尖引号", frac14: "普通分数四分之一", frac12: "普通分数二分之一", frac34: "普通分数四分之三", iquest: "竖翻问号",
+ Agrave: "带抑音符的拉丁文大写字母 A", Aacute: "带锐音符的拉丁文大写字母 A", Acirc: "带扬抑符的拉丁文大写字母 A", Atilde: "带颚化符的拉丁文大写字母 A", Auml: "带分音符的拉丁文大写字母 A", Aring: "带上圆圈的拉丁文大写字母 A", AElig: "拉丁文大写字母 Æ", Ccedil: "带下加符的拉丁文大写字母 C", Egrave: "带抑音符的拉丁文大写字母 E", Eacute: "带锐音符的拉丁文大写字母 E", Ecirc: "带扬抑符的拉丁文大写字母 E", Euml: "带分音符的拉丁文大写字母 E", Igrave: "带抑音符的拉丁文大写字母 I", Iacute: "带锐音符的拉丁文大写字母 I", Icirc: "带扬抑符的拉丁文大写字母 I", Iuml: "带分音符的拉丁文大写字母 I", ETH: "拉丁文大写字母 Eth", Ntilde: "带颚化符的拉丁文大写字母 N", Ograve: "带抑音符的拉丁文大写字母 O", Oacute: "带锐音符的拉丁文大写字母 O", Ocirc: "带扬抑符的拉丁文大写字母 O", Otilde: "带颚化符的拉丁文大写字母 O",
+ Ouml: "带分音符的拉丁文大写字母 O", times: "乘号", Oslash: "带粗线的拉丁文大写字母 O", Ugrave: "带抑音符的拉丁文大写字母 U", Uacute: "带锐音符的拉丁文大写字母 U", Ucirc: "带扬抑符的拉丁文大写字母 U", Uuml: "带分音符的拉丁文大写字母 U", Yacute: "带抑音符的拉丁文大写字母 Y", THORN: "拉丁文大写字母 Thorn", szlig: "拉丁文小写字母清音 S", agrave: "带抑音符的拉丁文小写字母 A", aacute: "带锐音符的拉丁文小写字母 A", acirc: "带扬抑符的拉丁文小写字母 A", atilde: "带颚化符的拉丁文小写字母 A", auml: "带分音符的拉丁文小写字母 A", aring: "带上圆圈的拉丁文小写字母 A", aelig: "拉丁文小写字母 Ae", ccedil: "带下加符的拉丁文小写字母 C", egrave: "带抑音符的拉丁文小写字母 E", eacute: "带锐音符的拉丁文小写字母 E", ecirc: "带扬抑符的拉丁文小写字母 E", euml: "带分音符的拉丁文小写字母 E", igrave: "带抑音符的拉丁文小写字母 I",
+ iacute: "带锐音符的拉丁文小写字母 I", icirc: "带扬抑符的拉丁文小写字母 I", iuml: "带分音符的拉丁文小写字母 I", eth: "拉丁文小写字母 Eth", ntilde: "带颚化符的拉丁文小写字母 N", ograve: "带抑音符的拉丁文小写字母 O", oacute: "带锐音符的拉丁文小写字母 O", ocirc: "带扬抑符的拉丁文小写字母 O", otilde: "带颚化符的拉丁文小写字母 O", ouml: "带分音符的拉丁文小写字母 O", divide: "除号", oslash: "带粗线的拉丁文小写字母 O", ugrave: "带抑音符的拉丁文小写字母 U", uacute: "带锐音符的拉丁文小写字母 U", ucirc: "带扬抑符的拉丁文小写字母 U", uuml: "带分音符的拉丁文小写字母 U", yacute: "带抑音符的拉丁文小写字母 Y", thorn: "拉丁文小写字母 Thorn", yuml: "带分音符的拉丁文小写字母 Y", OElig: "拉丁文大写连字 Oe", oelig: "拉丁文小写连字 Oe", 372: "带扬抑符的拉丁文大写字母 W", 374: "带扬抑符的拉丁文大写字母 Y",
+ 373: "带扬抑符的拉丁文小写字母 W", 375: "带扬抑符的拉丁文小写字母 Y", sbquo: "单下 9 形引号", 8219: "单高横翻 9 形引号", bdquo: "双下 9 形引号", hellip: "水平省略号", trade: "商标标志", 9658: "实心右指指针", bull: "加重号", rarr: "向右箭头", rArr: "向右双线箭头", hArr: "左右双线箭头", diams: "实心方块纸牌", asymp: "约等于"
+}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/lang/zh.js b/plugins/specialchar/dialogs/lang/zh.js
new file mode 100755
index 0000000..cfadf20
--- /dev/null
+++ b/plugins/specialchar/dialogs/lang/zh.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.plugins.setLang("specialchar","zh",{euro:"歐元符號",lsquo:"左單引號",rsquo:"右單引號",ldquo:"左雙引號",rdquo:"右雙引號",ndash:"短破折號",mdash:"長破折號",iexcl:"倒置的驚嘆號",cent:"美分符號",pound:"英鎊符號",curren:"貨幣符號",yen:"日圓符號",brvbar:"破折號",sect:"章節符號",uml:"分音符號",copy:"版權符號",ordf:"雌性符號",laquo:"左雙角括號",not:"Not 符號",reg:"註冊商標符號",macr:"長音符號",deg:"度數符號",sup2:"上標字 2",sup3:"上標字 3",acute:"尖音符號",micro:"微",para:"段落符號",middot:"中間點",cedil:"字母 C 下面的尾型符號 ",sup1:"上標",ordm:"雄性符號",raquo:"右雙角括號",frac14:"四分之一符號",frac12:"二分之一符號",frac34:"四分之三符號",
+iquest:"倒置的問號",Agrave:"拉丁大寫字母 A 帶抑音符號",Aacute:"拉丁大寫字母 A 帶尖音符號",Acirc:"拉丁大寫字母 A 帶揚抑符",Atilde:"拉丁大寫字母 A 帶波浪號",Auml:"拉丁大寫字母 A 帶分音符號",Aring:"拉丁大寫字母 A 帶上圓圈",AElig:"拉丁大寫字母 Æ",Ccedil:"拉丁大寫字母 C 帶下尾符號",Egrave:"拉丁大寫字母 E 帶抑音符號",Eacute:"拉丁大寫字母 E 帶尖音符號",Ecirc:"拉丁大寫字母 E 帶揚抑符",Euml:"拉丁大寫字母 E 帶分音符號",Igrave:"拉丁大寫字母 I 帶抑音符號",Iacute:"拉丁大寫字母 I 帶尖音符號",Icirc:"拉丁大寫字母 I 帶揚抑符",Iuml:"拉丁大寫字母 I 帶分音符號",ETH:"拉丁大寫字母 Eth",Ntilde:"拉丁大寫字母 N 帶波浪號",Ograve:"拉丁大寫字母 O 帶抑音符號",Oacute:"拉丁大寫字母 O 帶尖音符號",Ocirc:"拉丁大寫字母 O 帶揚抑符",Otilde:"拉丁大寫字母 O 帶波浪號",
+Ouml:"拉丁大寫字母 O 帶分音符號",times:"乘號",Oslash:"拉丁大寫字母 O 帶粗線符號",Ugrave:"拉丁大寫字母 U 帶抑音符號",Uacute:"拉丁大寫字母 U 帶尖音符號",Ucirc:"拉丁大寫字母 U 帶揚抑符",Uuml:"拉丁大寫字母 U 帶分音符號",Yacute:"拉丁大寫字母 Y 帶尖音符號",THORN:"拉丁大寫字母 Thorn",szlig:"拉丁小寫字母 s",agrave:"拉丁小寫字母 a 帶抑音符號",aacute:"拉丁小寫字母 a 帶尖音符號",acirc:"拉丁小寫字母 a 帶揚抑符",atilde:"拉丁小寫字母 a 帶波浪號",auml:"拉丁小寫字母 a 帶分音符號",aring:"拉丁小寫字母 a 帶上圓圈",aelig:"拉丁小寫字母 æ",ccedil:"拉丁小寫字母 c 帶下尾符號",egrave:"拉丁小寫字母 e 帶抑音符號",eacute:"拉丁小寫字母 e 帶尖音符號",ecirc:"拉丁小寫字母 e 帶揚抑符",euml:"拉丁小寫字母 e 帶分音符號",igrave:"拉丁小寫字母 i 帶抑音符號",
+iacute:"拉丁小寫字母 i 帶尖音符號",icirc:"拉丁小寫字母 i 帶揚抑符",iuml:"拉丁小寫字母 i 帶分音符號",eth:"拉丁小寫字母 eth",ntilde:"拉丁小寫字母 n 帶波浪號",ograve:"拉丁小寫字母 o 帶抑音符號",oacute:"拉丁小寫字母 o 帶尖音符號",ocirc:"拉丁小寫字母 o 帶揚抑符",otilde:"拉丁小寫字母 o 帶波浪號",ouml:"拉丁小寫字母 o 帶分音符號",divide:"除號",oslash:"拉丁小寫字母 o 帶粗線符號",ugrave:"拉丁小寫字母 u 帶抑音符號",uacute:"拉丁小寫字母 u 帶尖音符號",ucirc:"拉丁小寫字母 u 帶揚抑符",uuml:"拉丁小寫字母 u 帶分音符號",yacute:"拉丁小寫字母 y 帶尖音符號",thorn:"拉丁小寫字母 thorn",yuml:"拉丁小寫字母 y 帶分音符號",OElig:"拉丁大寫字母 OE",oelig:"拉丁小寫字母 oe",372:"拉丁大寫字母 W 帶揚抑符",374:"拉丁大寫字母 Y 帶揚抑符",373:"拉丁小寫字母 w 帶揚抑符",
+375:"拉丁小寫字母 y 帶揚抑符",sbquo:"低 9 單引號",8219:"高 9 反轉單引號",bdquo:"低 9 雙引號",hellip:"水平刪節號",trade:"商標符號",9658:"黑色向右指箭號",bull:"項目符號",rarr:"向右箭號",rArr:"向右雙箭號",hArr:"左右雙箭號",diams:"黑鑽套裝",asymp:"約等於"}); \ No newline at end of file
diff --git a/plugins/specialchar/dialogs/specialchar.js b/plugins/specialchar/dialogs/specialchar.js
new file mode 100755
index 0000000..9bc07fc
--- /dev/null
+++ b/plugins/specialchar/dialogs/specialchar.js
@@ -0,0 +1,50 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("specialchar", function(k) {
+ var e, n = k.lang.specialchar, m = function(c) { var b; c = c.data ? c.data.getTarget() : new CKEDITOR.dom.element(c); "a" == c.getName() && (b = c.getChild(0).getHtml()) && (c.removeClass("cke_light_background"), e.hide(), c = k.document.createElement("span"), c.setHtml(b), k.insertText(c.getText())) }, p = CKEDITOR.tools.addFunction(m), l, g = function(c, b) {
+ var a; b = b || c.data.getTarget(); "span" == b.getName() && (b = b.getParent()); if ("a" == b.getName() && (a = b.getChild(0).getHtml())) {
+ l && d(null, l);
+ var f = e.getContentElement("info", "htmlPreview").getElement(); e.getContentElement("info", "charPreview").getElement().setHtml(a); f.setHtml(CKEDITOR.tools.htmlEncode(a)); b.getParent().addClass("cke_light_background"); l = b
+ }
+ }, d = function(c, b) {
+ b = b || c.data.getTarget(); "span" == b.getName() && (b = b.getParent()); "a" == b.getName() && (e.getContentElement("info", "charPreview").getElement().setHtml("\x26nbsp;"), e.getContentElement("info", "htmlPreview").getElement().setHtml("\x26nbsp;"), b.getParent().removeClass("cke_light_background"),
+ l = void 0)
+ }, q = CKEDITOR.tools.addFunction(function(c) {
+ c = new CKEDITOR.dom.event(c); var b = c.getTarget(), a; a = c.getKeystroke(); var f = "rtl" == k.lang.dir; switch (a) {
+ case 38: if (a = b.getParent().getParent().getPrevious()) a = a.getChild([b.getParent().getIndex(), 0]), a.focus(), d(null, b), g(null, a); c.preventDefault(); break; case 40: (a = b.getParent().getParent().getNext()) && (a = a.getChild([b.getParent().getIndex(), 0])) && 1 == a.type && (a.focus(), d(null, b), g(null, a)); c.preventDefault(); break; case 32: m({ data: c }); c.preventDefault();
+ break; case f ? 37 : 39: if (a = b.getParent().getNext()) a = a.getChild(0), 1 == a.type ? (a.focus(), d(null, b), g(null, a), c.preventDefault(!0)) : d(null, b); else if (a = b.getParent().getParent().getNext()) (a = a.getChild([0, 0])) && 1 == a.type ? (a.focus(), d(null, b), g(null, a), c.preventDefault(!0)) : d(null, b); break; case f ? 39 : 37: (a = b.getParent().getPrevious()) ? (a = a.getChild(0), a.focus(), d(null, b), g(null, a), c.preventDefault(!0)) : (a = b.getParent().getParent().getPrevious()) ? (a = a.getLast().getChild(0), a.focus(), d(null, b), g(null, a), c.preventDefault(!0)) :
+ d(null, b)
+ }
+ }); return {
+ title: n.title, minWidth: 430, minHeight: 280, buttons: [CKEDITOR.dialog.cancelButton], charColumns: 17, onLoad: function() {
+ for (var c = this.definition.charColumns, b = k.config.specialChars, a = CKEDITOR.tools.getNextId() + "_specialchar_table_label", f = ['\x3ctable role\x3d"listbox" aria-labelledby\x3d"' + a + '" style\x3d"width: 320px; height: 100%; border-collapse: separate;" align\x3d"center" cellspacing\x3d"2" cellpadding\x3d"2" border\x3d"0"\x3e'], d = 0, g = b.length, h, e; d < g;) {
+ f.push('\x3ctr role\x3d"presentation"\x3e');
+ for (var l = 0; l < c; l++, d++) {
+ if (h = b[d]) {
+ h instanceof Array ? (e = h[1], h = h[0]) : (e = h.replace("\x26", "").replace(";", "").replace("#", ""), e = n[e] || h); var m = "cke_specialchar_label_" + d + "_" + CKEDITOR.tools.getNextNumber(); f.push('\x3ctd class\x3d"cke_dark_background" style\x3d"cursor: default" role\x3d"presentation"\x3e\x3ca href\x3d"javascript: void(0);" role\x3d"option" aria-posinset\x3d"' + (d + 1) + '"', ' aria-setsize\x3d"' + g + '"', ' aria-labelledby\x3d"' + m + '"', ' class\x3d"cke_specialchar" title\x3d"', CKEDITOR.tools.htmlEncode(e),
+ '" onkeydown\x3d"CKEDITOR.tools.callFunction( ' + q + ', event, this )" onclick\x3d"CKEDITOR.tools.callFunction(' + p + ', this); return false;" tabindex\x3d"-1"\x3e\x3cspan style\x3d"margin: 0 auto;cursor: inherit"\x3e' + h + '\x3c/span\x3e\x3cspan class\x3d"cke_voice_label" id\x3d"' + m + '"\x3e' + e + "\x3c/span\x3e\x3c/a\x3e")
+ } else f.push('\x3ctd class\x3d"cke_dark_background"\x3e\x26nbsp;'); f.push("\x3c/td\x3e")
+ } f.push("\x3c/tr\x3e")
+ } f.push("\x3c/tbody\x3e\x3c/table\x3e", '\x3cspan id\x3d"' + a + '" class\x3d"cke_voice_label"\x3e' +
+ n.options + "\x3c/span\x3e"); this.getContentElement("info", "charContainer").getElement().setHtml(f.join(""))
+ }, contents: [{
+ id: "info", label: k.lang.common.generalTab, title: k.lang.common.generalTab, padding: 0, align: "top", elements: [{
+ type: "hbox", align: "top", widths: ["320px", "90px"], children: [{
+ type: "html", id: "charContainer", html: "", onMouseover: g, onMouseout: d, focus: function() { var c = this.getElement().getElementsByTag("a").getItem(0); setTimeout(function() { c.focus(); g(null, c) }, 0) }, onShow: function() {
+ var c = this.getElement().getChild([0,
+ 0, 0, 0, 0]); setTimeout(function() { c.focus(); g(null, c) }, 0)
+ }, onLoad: function(c) { e = c.sender }
+ }, {
+ type: "hbox", align: "top", widths: ["100%"], children: [{
+ type: "vbox", align: "top", children: [{ type: "html", html: "\x3cdiv\x3e\x3c/div\x3e" }, { type: "html", id: "charPreview", className: "cke_dark_background", style: "border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;", html: "\x3cdiv\x3e\x26nbsp;\x3c/div\x3e" }, {
+ type: "html",
+ id: "htmlPreview", className: "cke_dark_background", style: "border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;", html: "\x3cdiv\x3e\x26nbsp;\x3c/div\x3e"
+ }]
+ }]
+ }]
+ }]
+ }]
+ }
+}); \ No newline at end of file
diff --git a/plugins/table/dialogs/table.js b/plugins/table/dialogs/table.js
new file mode 100755
index 0000000..ebef85e
--- /dev/null
+++ b/plugins/table/dialogs/table.js
@@ -0,0 +1,77 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+(function() {
+ function v(a) { for (var f = 0, n = 0, l = 0, p, e = a.$.rows.length; l < e; l++) { p = a.$.rows[l]; for (var d = f = 0, b, c = p.cells.length; d < c; d++)b = p.cells[d], f += b.colSpan; f > n && (n = f) } return n } function r(a) { return function() { var f = this.getValue(), f = !!(CKEDITOR.dialog.validate.integer().call(this, f) && 0 < f); f || (alert(a), this.select()); return f } } function q(a, f) {
+ var n = function(e) { return new CKEDITOR.dom.element(e, a.document) }, q = a.editable(), p = a.plugins.dialogadvtab; return {
+ title: a.lang.table.title, minWidth: 310, minHeight: CKEDITOR.env.ie ?
+ 310 : 280, onLoad: function() { var e = this, a = e.getContentElement("advanced", "advStyles"); if (a) a.on("change", function() { var a = this.getStyle("width", ""), c = e.getContentElement("info", "txtWidth"); c && c.setValue(a, !0); a = this.getStyle("height", ""); (c = e.getContentElement("info", "txtHeight")) && c.setValue(a, !0) }) }, onShow: function() {
+ var e = a.getSelection(), d = e.getRanges(), b, c = this.getContentElement("info", "txtRows"), g = this.getContentElement("info", "txtCols"), t = this.getContentElement("info", "txtWidth"), m = this.getContentElement("info",
+ "txtHeight"); "tableProperties" == f && ((e = e.getSelectedElement()) && e.is("table") ? b = e : 0 < d.length && (CKEDITOR.env.webkit && d[0].shrink(CKEDITOR.NODE_ELEMENT), b = a.elementPath(d[0].getCommonAncestor(!0)).contains("table", 1)), this._.selectedElement = b); b ? (this.setupContent(b), c && c.disable(), g && g.disable()) : (c && c.enable(), g && g.enable()); t && t.onChange(); m && m.onChange()
+ }, onOk: function() {
+ var e = a.getSelection(), d = this._.selectedElement && e.createBookmarks(), b = this._.selectedElement || n("table"), c = {}; this.commitContent(c,
+ b); if (c.info) {
+ c = c.info; if (!this._.selectedElement) for (var g = b.append(n("tbody")), f = parseInt(c.txtRows, 10) || 0, m = parseInt(c.txtCols, 10) || 0, k = 0; k < f; k++)for (var h = g.append(n("tr")), l = 0; l < m; l++)h.append(n("td")).appendBogus(); f = c.selHeaders; if (!b.$.tHead && ("row" == f || "both" == f)) {
+ h = b.getElementsByTag("thead").getItem(0); g = b.getElementsByTag("tbody").getItem(0); m = g.getElementsByTag("tr").getItem(0); h || (h = new CKEDITOR.dom.element("thead"), h.insertBefore(g)); for (k = 0; k < m.getChildCount(); k++)g = m.getChild(k),
+ g.type != CKEDITOR.NODE_ELEMENT || g.data("cke-bookmark") || (g.renameNode("th"), g.setAttribute("scope", "col")); h.append(m.remove())
+ } if (null !== b.$.tHead && "row" != f && "both" != f) { h = new CKEDITOR.dom.element(b.$.tHead); g = b.getElementsByTag("tbody").getItem(0); for (l = g.getFirst(); 0 < h.getChildCount();) { m = h.getFirst(); for (k = 0; k < m.getChildCount(); k++)g = m.getChild(k), g.type == CKEDITOR.NODE_ELEMENT && (g.renameNode("td"), g.removeAttribute("scope")); m.insertBefore(l) } h.remove() } if (!this.hasColumnHeaders && ("col" == f || "both" ==
+ f)) for (h = 0; h < b.$.rows.length; h++)g = new CKEDITOR.dom.element(b.$.rows[h].cells[0]), g.renameNode("th"), g.setAttribute("scope", "row"); if (this.hasColumnHeaders && "col" != f && "both" != f) for (k = 0; k < b.$.rows.length; k++)h = new CKEDITOR.dom.element(b.$.rows[k]), "tbody" == h.getParent().getName() && (g = new CKEDITOR.dom.element(h.$.cells[0]), g.renameNode("td"), g.removeAttribute("scope")); c.txtHeight ? b.setStyle("height", c.txtHeight) : b.removeStyle("height"); c.txtWidth ? b.setStyle("width", c.txtWidth) : b.removeStyle("width");
+ b.getAttribute("style") || b.removeAttribute("style")
+ } if (this._.selectedElement) try { e.selectBookmarks(d) } catch (p) { } else a.insertElement(b), setTimeout(function() { var e = new CKEDITOR.dom.element(b.$.rows[0].cells[0]), c = a.createRange(); c.moveToPosition(e, CKEDITOR.POSITION_AFTER_START); c.select() }, 0)
+ }, contents: [{
+ id: "info", label: a.lang.table.title, elements: [{
+ type: "hbox", widths: [null, null], styles: ["vertical-align:top"], children: [{
+ type: "vbox", padding: 0, children: [{
+ type: "text", id: "txtRows", "default": 3, label: a.lang.table.rows,
+ required: !0, controlStyle: "width:5em", validate: r(a.lang.table.invalidRows), setup: function(e) { this.setValue(e.$.rows.length) }, commit: l
+ }, { type: "text", id: "txtCols", "default": 2, label: a.lang.table.columns, required: !0, controlStyle: "width:5em", validate: r(a.lang.table.invalidCols), setup: function(e) { this.setValue(v(e)) }, commit: l }, { type: "html", html: "\x26nbsp;" }, {
+ type: "select", id: "selHeaders", requiredContent: "th", "default": "", label: a.lang.table.headers, items: [[a.lang.table.headersNone, ""], [a.lang.table.headersRow,
+ "row"], [a.lang.table.headersColumn, "col"], [a.lang.table.headersBoth, "both"]], setup: function(e) { var a = this.getDialog(); a.hasColumnHeaders = !0; for (var b = 0; b < e.$.rows.length; b++) { var c = e.$.rows[b].cells[0]; if (c && "th" != c.nodeName.toLowerCase()) { a.hasColumnHeaders = !1; break } } null !== e.$.tHead ? this.setValue(a.hasColumnHeaders ? "both" : "row") : this.setValue(a.hasColumnHeaders ? "col" : "") }, commit: l
+ }, {
+ type: "text", id: "txtBorder", requiredContent: "table[border]", "default": a.filter.check("table[border]") ? 1 : 0, label: a.lang.table.border,
+ controlStyle: "width:3em", validate: CKEDITOR.dialog.validate.number(a.lang.table.invalidBorder), setup: function(a) { this.setValue(a.getAttribute("border") || "") }, commit: function(a, d) { this.getValue() ? d.setAttribute("border", this.getValue()) : d.removeAttribute("border") }
+ }, {
+ id: "cmbAlign", type: "select", requiredContent: "table[align]", "default": "", label: a.lang.common.align, items: [[a.lang.common.notSet, ""], [a.lang.common.left, "left"], [a.lang.common.center, "center"], [a.lang.common.right, "right"]], setup: function(a) {
+ this.setValue(a.getAttribute("align") ||
+ "")
+ }, commit: function(a, d) { this.getValue() ? d.setAttribute("align", this.getValue()) : d.removeAttribute("align") }
+ }]
+ }, {
+ type: "vbox", padding: 0, children: [{
+ type: "hbox", widths: ["5em"], children: [{
+ type: "text", id: "txtWidth", requiredContent: "table{width}", controlStyle: "width:5em", label: a.lang.common.width, title: a.lang.common.cssLengthTooltip, "default": a.filter.check("table{width}") ? 500 > q.getSize("width") ? "100%" : 500 : 0, getValue: u, validate: CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",
+ a.lang.common.width)), onChange: function() { var a = this.getDialog().getContentElement("advanced", "advStyles"); a && a.updateStyle("width", this.getValue()) }, setup: function(a) { a = a.getStyle("width"); this.setValue(a) }, commit: l
+ }]
+ }, {
+ type: "hbox", widths: ["5em"], children: [{
+ type: "text", id: "txtHeight", requiredContent: "table{height}", controlStyle: "width:5em", label: a.lang.common.height, title: a.lang.common.cssLengthTooltip, "default": "", getValue: u, validate: CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",
+ a.lang.common.height)), onChange: function() { var a = this.getDialog().getContentElement("advanced", "advStyles"); a && a.updateStyle("height", this.getValue()) }, setup: function(a) { (a = a.getStyle("height")) && this.setValue(a) }, commit: l
+ }]
+ }, { type: "html", html: "\x26nbsp;" }, {
+ type: "text", id: "txtCellSpace", requiredContent: "table[cellspacing]", controlStyle: "width:3em", label: a.lang.table.cellSpace, "default": a.filter.check("table[cellspacing]") ? 1 : 0, validate: CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),
+ setup: function(a) { this.setValue(a.getAttribute("cellSpacing") || "") }, commit: function(a, d) { this.getValue() ? d.setAttribute("cellSpacing", this.getValue()) : d.removeAttribute("cellSpacing") }
+ }, {
+ type: "text", id: "txtCellPad", requiredContent: "table[cellpadding]", controlStyle: "width:3em", label: a.lang.table.cellPad, "default": a.filter.check("table[cellpadding]") ? 1 : 0, validate: CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding), setup: function(a) { this.setValue(a.getAttribute("cellPadding") || "") }, commit: function(a,
+ d) { this.getValue() ? d.setAttribute("cellPadding", this.getValue()) : d.removeAttribute("cellPadding") }
+ }]
+ }]
+ }, { type: "html", align: "right", html: "" }, {
+ type: "vbox", padding: 0, children: [{
+ type: "text", id: "txtCaption", requiredContent: "caption", label: a.lang.table.caption, setup: function(a) {
+ this.enable(); a = a.getElementsByTag("caption"); if (0 < a.count()) {
+ a = a.getItem(0); var d = a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT)); d && !d.equals(a.getBogus()) ? (this.disable(), this.setValue(a.getText())) : (a = CKEDITOR.tools.trim(a.getText()),
+ this.setValue(a))
+ }
+ }, commit: function(e, d) { if (this.isEnabled()) { var b = this.getValue(), c = d.getElementsByTag("caption"); if (b) 0 < c.count() ? (c = c.getItem(0), c.setHtml("")) : (c = new CKEDITOR.dom.element("caption", a.document), d.append(c, !0)), c.append(new CKEDITOR.dom.text(b, a.document)); else if (0 < c.count()) for (b = c.count() - 1; 0 <= b; b--)c.getItem(b).remove() } }
+ }, {
+ type: "text", id: "txtSummary", bidi: !0, requiredContent: "table[summary]", label: a.lang.table.summary, setup: function(a) {
+ this.setValue(a.getAttribute("summary") ||
+ "")
+ }, commit: function(a, d) { this.getValue() ? d.setAttribute("summary", this.getValue()) : d.removeAttribute("summary") }
+ }]
+ }]
+ }, p && p.createAdvancedTab(a, null, "table")]
+ }
+ } var u = CKEDITOR.tools.cssLength, l = function(a) { var f = this.id; a.info || (a.info = {}); a.info[f] = this.getValue() }; CKEDITOR.dialog.add("table", function(a) { return q(a, "table") }); CKEDITOR.dialog.add("tableProperties", function(a) { return q(a, "tableProperties") })
+})(); \ No newline at end of file
diff --git a/plugins/tableselection/styles/tableselection.css b/plugins/tableselection/styles/tableselection.css
new file mode 100755
index 0000000..ae479ae
--- /dev/null
+++ b/plugins/tableselection/styles/tableselection.css
@@ -0,0 +1,44 @@
+.cke_table-faked-selection-editor *::selection,
+table[data-cke-table-faked-selection-table] *::selection {
+ background: transparent;
+}
+
+.cke_table-faked-selection {
+ background: darkgray !important;
+ color: black;
+}
+
+.cke_table-faked-selection a {
+ color: black;
+}
+
+.cke_editable:focus .cke_table-faked-selection {
+ /* We have to use !important here, as td might specify it's own background, thus table selection
+ would not be visible. */
+ background: #0076cb !important;
+ color: white;
+}
+
+.cke_editable:focus .cke_table-faked-selection a {
+ color: white;
+}
+
+.cke_table-faked-selection::-moz-selection,
+.cke_table-faked-selection ::-moz-selection {
+ background: transparent;
+}
+
+.cke_table-faked-selection::selection,
+.cke_table-faked-selection ::selection {
+ background: transparent;
+}
+
+/* Change the cursor when selecting cells (#706).
+ *
+ * This solution does not work in IE, Edge and Safari due to upstream isues:
+ * https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3419602/
+ * https://bugs.webkit.org/show_bug.cgi?id=53341
+ */
+table[data-cke-table-faked-selection-table] {
+ cursor: cell;
+} \ No newline at end of file
diff --git a/plugins/tabletools/dialogs/tableCell.js b/plugins/tabletools/dialogs/tableCell.js
new file mode 100755
index 0000000..8e7ec1d
--- /dev/null
+++ b/plugins/tabletools/dialogs/tableCell.js
@@ -0,0 +1,77 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.dialog.add("cellProperties", function(f) {
+ function h(a) { return { isSpacer: !0, type: "html", html: "\x26nbsp;", requiredContent: a ? a : void 0 } } function q() { return { type: "vbox", padding: 0, children: [] } } function e(a) { return function(b) { for (var k = a(b[0]), c = 1; c < b.length; c++)if (a(b[c]) !== k) { k = null; break } "undefined" != typeof k && (this.setValue(k), CKEDITOR.env.gecko && "select" == this.type && !k && (this.getInputElement().$.selectedIndex = -1)) } } function r(a) { if (a = u.exec(a.getStyle("width") || a.getAttribute("width"))) return a[2] }
+ var l = f.lang.table, c = l.cell, d = f.lang.common, m = CKEDITOR.dialog.validate, u = /^(\d+(?:\.\d+)?)(px|%)$/, v = "rtl" == f.lang.dir, n = f.plugins.colordialog, d = [{
+ requiredContent: "td{width}", type: "hbox", widths: ["70%", "30%"], children: [{
+ type: "text", id: "width", width: "100px", label: d.width, validate: m.number(c.invalidWidth), onLoad: function() { var a = this.getDialog().getContentElement("info", "widthType").getElement(), b = this.getInputElement(), c = b.getAttribute("aria-labelledby"); b.setAttribute("aria-labelledby", [c, a.$.id].join(" ")) },
+ setup: e(function(a) { var b = parseInt(a.getAttribute("width"), 10); a = parseInt(a.getStyle("width"), 10); return isNaN(a) ? isNaN(b) ? "" : b : a }), commit: function(a) { var b = parseInt(this.getValue(), 10), c = this.getDialog().getValueOf("info", "widthType") || r(a); isNaN(b) ? a.removeStyle("width") : a.setStyle("width", b + c); a.removeAttribute("width") }, "default": ""
+ }, { type: "select", id: "widthType", label: f.lang.table.widthUnit, labelStyle: "visibility:hidden", "default": "px", items: [[l.widthPx, "px"], [l.widthPc, "%"]], setup: e(r) }]
+ }, {
+ requiredContent: "td{height}",
+ type: "hbox", widths: ["70%", "30%"], children: [{
+ type: "text", id: "height", label: d.height, width: "100px", "default": "", validate: m.number(c.invalidHeight), onLoad: function() { var a = this.getDialog().getContentElement("info", "htmlHeightType").getElement(), b = this.getInputElement(), c = b.getAttribute("aria-labelledby"); this.getDialog().getContentElement("info", "height").isVisible() && (a.setHtml("\x3cbr /\x3e" + l.widthPx), a.setStyle("display", "block")); b.setAttribute("aria-labelledby", [c, a.$.id].join(" ")) }, setup: e(function(a) {
+ var b =
+ parseInt(a.getAttribute("height"), 10); a = parseInt(a.getStyle("height"), 10); return isNaN(a) ? isNaN(b) ? "" : b : a
+ }), commit: function(a) { var b = parseInt(this.getValue(), 10); isNaN(b) ? a.removeStyle("height") : a.setStyle("height", CKEDITOR.tools.cssLength(b)); a.removeAttribute("height") }
+ }, { id: "htmlHeightType", type: "html", html: "", style: "display: none" }]
+ }, h(["td{width}", "td{height}"]), {
+ type: "select", id: "wordWrap", requiredContent: "td{white-space}", label: c.wordWrap, "default": "yes", items: [[c.yes, "yes"], [c.no, "no"]], setup: e(function(a) {
+ var b =
+ a.getAttribute("noWrap"); if ("nowrap" == a.getStyle("white-space") || b) return "no"
+ }), commit: function(a) { "no" == this.getValue() ? a.setStyle("white-space", "nowrap") : a.removeStyle("white-space"); a.removeAttribute("noWrap") }
+ }, h("td{white-space}"), {
+ type: "select", id: "hAlign", requiredContent: "td{text-align}", label: c.hAlign, "default": "", items: [[d.notSet, ""], [d.left, "left"], [d.center, "center"], [d.right, "right"], [d.justify, "justify"]], setup: e(function(a) {
+ var b = a.getAttribute("align"); return a.getStyle("text-align") ||
+ b || ""
+ }), commit: function(a) { var b = this.getValue(); b ? a.setStyle("text-align", b) : a.removeStyle("text-align"); a.removeAttribute("align") }
+ }, {
+ type: "select", id: "vAlign", requiredContent: "td{vertical-align}", label: c.vAlign, "default": "", items: [[d.notSet, ""], [d.alignTop, "top"], [d.alignMiddle, "middle"], [d.alignBottom, "bottom"], [c.alignBaseline, "baseline"]], setup: e(function(a) {
+ var b = a.getAttribute("vAlign"); a = a.getStyle("vertical-align"); switch (a) {
+ case "top": case "middle": case "bottom": case "baseline": break; default: a =
+ ""
+ }return a || b || ""
+ }), commit: function(a) { var b = this.getValue(); b ? a.setStyle("vertical-align", b) : a.removeStyle("vertical-align"); a.removeAttribute("vAlign") }
+ }, h(["td{text-align}", "td{vertical-align}"]), { type: "select", id: "cellType", requiredContent: "th", label: c.cellType, "default": "td", items: [[c.data, "td"], [c.header, "th"]], setup: e(function(a) { return a.getName() }), commit: function(a) { a.renameNode(this.getValue()) } }, h("th"), {
+ type: "text", id: "rowSpan", requiredContent: "td[rowspan]", label: c.rowSpan, "default": "",
+ validate: m.integer(c.invalidRowSpan), setup: e(function(a) { if ((a = parseInt(a.getAttribute("rowSpan"), 10)) && 1 != a) return a }), commit: function(a) { var b = parseInt(this.getValue(), 10); b && 1 != b ? a.setAttribute("rowSpan", this.getValue()) : a.removeAttribute("rowSpan") }
+ }, {
+ type: "text", id: "colSpan", requiredContent: "td[colspan]", label: c.colSpan, "default": "", validate: m.integer(c.invalidColSpan), setup: e(function(a) { if ((a = parseInt(a.getAttribute("colSpan"), 10)) && 1 != a) return a }), commit: function(a) {
+ var b = parseInt(this.getValue(),
+ 10); b && 1 != b ? a.setAttribute("colSpan", this.getValue()) : a.removeAttribute("colSpan")
+ }
+ }, h(["td[colspan]", "td[rowspan]"]), {
+ type: "hbox", padding: 0, widths: n ? ["60%", "40%"] : ["100%"], requiredContent: "td{background-color}", children: function() {
+ var a = [{
+ type: "text", id: "bgColor", label: c.bgColor, "default": "", setup: e(function(a) { var c = a.getAttribute("bgColor"); return a.getStyle("background-color") || c }), commit: function(a) {
+ this.getValue() ? a.setStyle("background-color", this.getValue()) : a.removeStyle("background-color");
+ a.removeAttribute("bgColor")
+ }
+ }]; n && a.push({ type: "button", id: "bgColorChoose", "class": "colorChooser", label: c.chooseColor, onLoad: function() { this.getElement().getParent().setStyle("vertical-align", "bottom") }, onClick: function() { f.getColorFromDialog(function(a) { a && this.getDialog().getContentElement("info", "bgColor").setValue(a); this.focus() }, this) } }); return a
+ }()
+ }, {
+ type: "hbox", padding: 0, widths: n ? ["60%", "40%"] : ["100%"], requiredContent: "td{border-color}", children: function() {
+ var a = [{
+ type: "text", id: "borderColor",
+ label: c.borderColor, "default": "", setup: e(function(a) { var c = a.getAttribute("borderColor"); return a.getStyle("border-color") || c }), commit: function(a) { this.getValue() ? a.setStyle("border-color", this.getValue()) : a.removeStyle("border-color"); a.removeAttribute("borderColor") }
+ }]; n && a.push({
+ type: "button", id: "borderColorChoose", "class": "colorChooser", label: c.chooseColor, style: (v ? "margin-right" : "margin-left") + ": 10px", onLoad: function() { this.getElement().getParent().setStyle("vertical-align", "bottom") }, onClick: function() {
+ f.getColorFromDialog(function(a) {
+ a &&
+ this.getDialog().getContentElement("info", "borderColor").setValue(a); this.focus()
+ }, this)
+ }
+ }); return a
+ }()
+ }], p = 0, t = -1, g = [q()], d = CKEDITOR.tools.array.filter(d, function(a) { var b = a.requiredContent; delete a.requiredContent; (b = f.filter.check(b)) && !a.isSpacer && p++; return b }); 5 < p && (g = g.concat([h(), q()])); CKEDITOR.tools.array.forEach(d, function(a) { a.isSpacer || t++; 5 < p && t >= p / 2 ? g[2].children.push(a) : g[0].children.push(a) }); CKEDITOR.tools.array.forEach(g, function(a) {
+ a.isSpacer || (a = a.children, a[a.length - 1].isSpacer &&
+ a.pop())
+ }); return {
+ title: c.title, minWidth: 1 === g.length ? 205 : 410, minHeight: 50, contents: [{ id: "info", label: c.title, accessKey: "I", elements: [{ type: "hbox", widths: 1 === g.length ? ["100%"] : ["40%", "5%", "40%"], children: g }] }], onShow: function() { this.cells = CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection()); this.setupContent(this.cells) }, onOk: function() {
+ for (var a = this._.editor.getSelection(), b = a.createBookmarks(), c = this.cells, d = 0; d < c.length; d++)this.commitContent(c[d]); this._.editor.forceNextSelectionCheck();
+ a.selectBookmarks(b); this._.editor.selectionChange()
+ }, onLoad: function() { var a = {}; this.foreach(function(b) { b.setup && b.commit && (b.setup = CKEDITOR.tools.override(b.setup, function(c) { return function() { c.apply(this, arguments); a[b.id] = b.getValue() } }), b.commit = CKEDITOR.tools.override(b.commit, function(c) { return function() { a[b.id] !== b.getValue() && c.apply(this, arguments) } })) }) }
+ }
+}); \ No newline at end of file
diff --git a/plugins/templates/dialogs/templates.css b/plugins/templates/dialogs/templates.css
new file mode 100755
index 0000000..b7fe551
--- /dev/null
+++ b/plugins/templates/dialogs/templates.css
@@ -0,0 +1,76 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+
+.cke_tpl_list {
+ border: #dcdcdc 2px solid;
+ background-color: #ffffff;
+ overflow-y: auto;
+ overflow-x: hidden;
+ width: 100%;
+ height: 220px;
+}
+
+.cke_tpl_item {
+ margin: 5px;
+ padding: 7px;
+ border: #eeeeee 1px solid;
+ *width: 88%;
+}
+
+.cke_tpl_preview {
+ border-collapse: separate;
+ text-indent: 0;
+ width: 100%;
+}
+
+.cke_tpl_preview td {
+ padding: 2px;
+ vertical-align: middle;
+}
+
+.cke_tpl_preview .cke_tpl_preview_img {
+ width: 100px;
+}
+
+.cke_tpl_preview span {
+ white-space: normal;
+}
+
+.cke_tpl_title {
+ font-weight: bold;
+}
+
+.cke_tpl_list a:hover .cke_tpl_item,
+.cke_tpl_list a:focus .cke_tpl_item,
+.cke_tpl_list a:active .cke_tpl_item {
+ border: #ff9933 1px solid;
+ background-color: #fffacd;
+}
+
+.cke_tpl_list a:hover *,
+.cke_tpl_list a:focus *,
+.cke_tpl_list a:active * {
+ cursor: pointer;
+}
+
+/* IE Quirks contextual selectors children will not get :hover transition until
+ the hover style of the link itself contains certain CSS declarations. */
+.cke_browser_quirks .cke_tpl_list a:active,
+.cke_browser_quirks .cke_tpl_list a:hover,
+.cke_browser_quirks .cke_tpl_list a:focus {
+ background-position: 0 0;
+}
+
+.cke_hc .cke_tpl_list a:hover .cke_tpl_item,
+.cke_hc .cke_tpl_list a:focus .cke_tpl_item,
+.cke_hc .cke_tpl_list a:active .cke_tpl_item {
+ border-width: 3px;
+}
+
+.cke_tpl_empty,
+.cke_tpl_loading {
+ text-align: center;
+ padding: 5px;
+} \ No newline at end of file
diff --git a/plugins/templates/dialogs/templates.js b/plugins/templates/dialogs/templates.js
new file mode 100755
index 0000000..5a4a1b7
--- /dev/null
+++ b/plugins/templates/dialogs/templates.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+(function(){CKEDITOR.dialog.add("templates",function(c){function r(a,b){var m=CKEDITOR.dom.element.createFromHtml('\x3ca href\x3d"javascript:void(0)" tabIndex\x3d"-1" role\x3d"option" \x3e\x3cdiv class\x3d"cke_tpl_item"\x3e\x3c/div\x3e\x3c/a\x3e'),d='\x3ctable style\x3d"width:350px;" class\x3d"cke_tpl_preview" role\x3d"presentation"\x3e\x3ctr\x3e';a.image&&b&&(d+='\x3ctd class\x3d"cke_tpl_preview_img"\x3e\x3cimg src\x3d"'+CKEDITOR.getUrl(b+a.image)+'"'+(CKEDITOR.env.ie6Compat?' onload\x3d"this.width\x3dthis.width"':
+"")+' alt\x3d"" title\x3d""\x3e\x3c/td\x3e');d+='\x3ctd style\x3d"white-space:normal;"\x3e\x3cspan class\x3d"cke_tpl_title"\x3e'+a.title+"\x3c/span\x3e\x3cbr/\x3e";a.description&&(d+="\x3cspan\x3e"+a.description+"\x3c/span\x3e");d+="\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e";m.getFirst().setHtml(d);m.on("click",function(){t(a.html)});return m}function t(a){var b=CKEDITOR.dialog.getCurrent();b.getValueOf("selectTpl","chkInsertOpt")?(c.fire("saveSnapshot"),c.setData(a,function(){b.hide();var a=c.createRange();
+a.moveToElementEditStart(c.editable());a.select();setTimeout(function(){c.fire("saveSnapshot")},0)})):(c.insertHtml(a),b.hide())}function k(a){var b=a.data.getTarget(),c=g.equals(b);if(c||g.contains(b)){var d=a.data.getKeystroke(),f=g.getElementsByTag("a"),e;if(f){if(c)e=f.getItem(0);else switch(d){case 40:e=b.getNext();break;case 38:e=b.getPrevious();break;case 13:case 32:b.fire("click")}e&&(e.focus(),a.data.preventDefault())}}}var h=CKEDITOR.plugins.get("templates");CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl(h.path+
+"dialogs/templates.css"));var g,h="cke_tpl_list_label_"+CKEDITOR.tools.getNextNumber(),f=c.lang.templates,n=c.config;return{title:c.lang.templates.title,minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:"selectTpl",label:f.title,elements:[{type:"vbox",padding:5,children:[{id:"selectTplText",type:"html",html:"\x3cspan\x3e"+f.selectPromptMsg+"\x3c/span\x3e"},{id:"templatesList",type:"html",focus:!0,html:'\x3cdiv class\x3d"cke_tpl_list" tabIndex\x3d"-1" role\x3d"listbox" aria-labelledby\x3d"'+
+h+'"\x3e\x3cdiv class\x3d"cke_tpl_loading"\x3e\x3cspan\x3e\x3c/span\x3e\x3c/div\x3e\x3c/div\x3e\x3cspan class\x3d"cke_voice_label" id\x3d"'+h+'"\x3e'+f.options+"\x3c/span\x3e"},{id:"chkInsertOpt",type:"checkbox",label:f.insertOption,"default":n.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var a=this.getContentElement("selectTpl","templatesList");g=a.getElement();CKEDITOR.loadTemplates(n.templates_files,function(){var b=(n.templates||"default").split(",");
+if(b.length){var c=g;c.setHtml("");for(var d=0,h=b.length;d<h;d++)for(var e=CKEDITOR.getTemplates(b[d]),k=e.imagesPath,e=e.templates,q=e.length,l=0;l<q;l++){var p=r(e[l],k);p.setAttribute("aria-posinset",l+1);p.setAttribute("aria-setsize",q);c.append(p)}a.focus()}else g.setHtml('\x3cdiv class\x3d"cke_tpl_empty"\x3e\x3cspan\x3e'+f.emptyListMsg+"\x3c/span\x3e\x3c/div\x3e")});this._.element.on("keydown",k)},onHide:function(){this._.element.removeListener("keydown",k)}}})})(); \ No newline at end of file
diff --git a/plugins/templates/templates/default.js b/plugins/templates/templates/default.js
new file mode 100755
index 0000000..4257e35
--- /dev/null
+++ b/plugins/templates/templates/default.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+CKEDITOR.addTemplates("default", {
+ imagesPath: CKEDITOR.getUrl(CKEDITOR.plugins.getPath("templates") + "templates/images/"), templates: [{ title: "Image and Title", image: "template1.gif", description: "One main image with a title and text that surround the image.", html: '\x3ch3\x3e\x3cimg src\x3d" " alt\x3d"" style\x3d"margin-right: 10px" height\x3d"100" width\x3d"100" align\x3d"left" /\x3eType the title here\x3c/h3\x3e\x3cp\x3eType the text here\x3c/p\x3e' }, {
+ title: "Strange Template", image: "template2.gif", description: "A template that defines two columns, each one with a title, and some text.",
+ html: '\x3ctable cellspacing\x3d"0" cellpadding\x3d"0" style\x3d"width:100%" border\x3d"0"\x3e\x3ctr\x3e\x3ctd style\x3d"width:50%"\x3e\x3ch3\x3eTitle 1\x3c/h3\x3e\x3c/td\x3e\x3ctd\x3e\x3c/td\x3e\x3ctd style\x3d"width:50%"\x3e\x3ch3\x3eTitle 2\x3c/h3\x3e\x3c/td\x3e\x3c/tr\x3e\x3ctr\x3e\x3ctd\x3eText 1\x3c/td\x3e\x3ctd\x3e\x3c/td\x3e\x3ctd\x3eText 2\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3cp\x3eMore text goes here.\x3c/p\x3e'
+ }, {
+ title: "Text and Table", image: "template3.gif", description: "A title with some text and a table.",
+ html: '\x3cdiv style\x3d"width: 80%"\x3e\x3ch3\x3eTitle goes here\x3c/h3\x3e\x3ctable style\x3d"width:150px;float: right" cellspacing\x3d"0" cellpadding\x3d"0" border\x3d"1"\x3e\x3ccaption style\x3d"border:solid 1px black"\x3e\x3cstrong\x3eTable title\x3c/strong\x3e\x3c/caption\x3e\x3ctr\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3c/tr\x3e\x3ctr\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3c/tr\x3e\x3ctr\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3ctd\x3e\x26nbsp;\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3cp\x3eType the text here\x3c/p\x3e\x3c/div\x3e'
+ }]
+}); \ No newline at end of file
diff --git a/plugins/templates/templates/images/template1.gif b/plugins/templates/templates/images/template1.gif
new file mode 100755
index 0000000..428c5a6
--- /dev/null
+++ b/plugins/templates/templates/images/template1.gif
Binary files differ
diff --git a/plugins/templates/templates/images/template2.gif b/plugins/templates/templates/images/template2.gif
new file mode 100755
index 0000000..c494efe
--- /dev/null
+++ b/plugins/templates/templates/images/template2.gif
Binary files differ
diff --git a/plugins/templates/templates/images/template3.gif b/plugins/templates/templates/images/template3.gif
new file mode 100755
index 0000000..d5a40ce
--- /dev/null
+++ b/plugins/templates/templates/images/template3.gif
Binary files differ
diff --git a/plugins/widget/images/handle.png b/plugins/widget/images/handle.png
new file mode 100755
index 0000000..ba8cda5
--- /dev/null
+++ b/plugins/widget/images/handle.png
Binary files differ
diff --git a/samples/css/samples.css b/samples/css/samples.css
new file mode 100755
index 0000000..6c25215
--- /dev/null
+++ b/samples/css/samples.css
@@ -0,0 +1,1914 @@
+/**
+ * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+@media (max-width: 900px) {
+ .global-is-mobile-hidden {
+ display: none !important;
+ }
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section {
+ display: block;
+}
+
+body,
+html {
+ margin: 0;
+ padding: 0;
+ font: 16px / 1.8 Arial, 'Helvetica Neue', Helvetica, sans-serif;
+ font-weight: 300;
+ color: #575757;
+}
+
+.grid-width-10 {
+ width: 10%;
+}
+
+.grid-width-20 {
+ width: 20%;
+}
+
+.grid-width-30 {
+ width: 30%;
+}
+
+.grid-width-40 {
+ width: 40%;
+}
+
+.grid-width-50 {
+ width: 50%;
+}
+
+.grid-width-60 {
+ width: 60%;
+}
+
+.grid-width-70 {
+ width: 70%;
+}
+
+.grid-width-80 {
+ width: 80%;
+}
+
+.grid-width-90 {
+ width: 90%;
+}
+
+.grid-width-100 {
+ width: 100%;
+}
+
+@media (max-width: 900px) {
+
+ .grid-width-10,
+ .grid-width-20,
+ .grid-width-30,
+ .grid-width-40,
+ .grid-width-50,
+ .grid-width-60,
+ .grid-width-70,
+ .grid-width-80,
+ .grid-width-90,
+ .grid-width-100 {
+ width: 100%;
+ }
+}
+
+*[class*="grid-width"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ padding-left: 4%;
+ padding-right: 4%;
+ float: left;
+}
+
+*[class*="grid-width"]:after,
+.grid-container:after,
+*[class*="grid-width"]:before,
+.grid-container:before {
+ content: '';
+ display: block;
+ overflow: hidden;
+ visibility: hidden;
+ font-size: 0;
+ line-height: 0;
+ width: 0;
+ height: 0;
+}
+
+*[class*="grid-width"]:after,
+.grid-container:after {
+ clear: both;
+}
+
+.grid-container {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.grid-container-nested *[class*="grid-width"]:first-child {
+ padding-left: 0;
+}
+
+.grid-container-nested *[class*="grid-width"]:last-child {
+ padding-right: 0;
+}
+
+@media (max-width: 900px) {
+ .grid-container-nested *[class*="grid-width"]:first-child {
+ padding-left: 4%;
+ }
+
+ .grid-container-nested *[class*="grid-width"]:last-child {
+ padding-right: 4%;
+ }
+}
+
+.header-a {
+ min-height: 140px;
+ overflow: hidden;
+}
+
+.header-a .header-a-logo {
+ margin: 40px 0 0;
+}
+
+@media (max-width: 900px) {
+ .header-a .header-a-logo {
+ text-align: center;
+ }
+}
+
+.header-a .header-a-logo img {
+ border: transparent;
+}
+
+.navigation-a {
+ height: 30px;
+ background: #3D3D3D;
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ padding: 0;
+ overflow: hidden;
+}
+
+@media (max-width: 900px) {
+ .navigation-a {
+ text-align: center;
+ }
+}
+
+.navigation-a ul {
+ list-style: none;
+ margin: 0;
+ overflow: hidden;
+}
+
+.navigation-a ul li,
+.navigation-a ul li a {
+ display: inline-block;
+}
+
+@media (max-width: 900px) {
+ .navigation-a ul {
+ width: auto;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: inline-block;
+ float: none;
+ }
+
+ .navigation-a ul:before,
+ .navigation-a ul:after {
+ display: none;
+ }
+}
+
+.navigation-a ul.navigation-a-left {
+ text-align: left;
+}
+
+@media (max-width: 900px) {
+ .navigation-a ul.navigation-a-left {
+ padding-right: 0;
+ }
+}
+
+.navigation-a ul.navigation-a-right {
+ text-align: right;
+}
+
+@media (max-width: 900px) {
+ .navigation-a ul.navigation-a-right {
+ padding-left: 23px;
+ }
+}
+
+.navigation-a ul li+li {
+ margin-left: 23px;
+}
+
+.navigation-a ul li a {
+ font-size: 10px;
+ font-size: 0.625rem;
+ line-height: 18px;
+ line-height: 1.13rem;
+ line-height: 30px;
+ float: left;
+ color: #ddd;
+ font-weight: bold;
+ text-decoration: none;
+ text-transform: uppercase;
+}
+
+.navigation-a ul li a:hover {
+ cursor: pointer;
+ color: #fff;
+}
+
+.icon-navigation-a-github:before,
+.icon-navigation-a-github:after {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAAXNSR0IArs4c6QAAAa9JREFUOBGNlM8rRGEUht0pDGosjKYZpUSIkuwsiCaxUEqK2VOUBcrWv2BjxUJho6wsLLDzY2fhD5iR5NeOcJvIjOfM3O927m3mmlPPnPec835nZprvjlVVJvL5fCOjMWiDCLzCLVxZlpUj/x8saYV9+IZS8UJzFWoCt2GYgk+oJG4wJUouZDANv5VsUZ47dNSzkEYHfIDEHixDWgoiB/rTHlPPwBNInPmXHRb7hdeUDFG10AN1Th1Fd5mD6BMwMVnoUyVA3t3EkjkQlDFfmwPkc7NsQTXf0bGgJWaGb16dk18+EmLYawzkC+6Q3KdK4kiZqtGdskx/kmdlCJS86RuGrDLFZJmtGi1KB0q+VhOGsDLZsiyjGsOY4qoOkrO+YUauwCDoOKWo9xk9JfM+MPdSzqZdA8UlyDO3AvKLPsIG9LsmBHUKduEHdCy6PrpJZyKXdwKMOemaissOHJ9O9xTeh57GluMYIsehWy8STW/d8ZhkI0b9PjFasA1fsAOb0KCN1PLXYyKLGNdzj2YYArnZDyDRrA3Ua4UuDzd5QM/KaoxhmAO5Om5Qt8OI2/CJP6MVa1dvltQ5AAAAAElFTkSuQmCC");
+}
+
+.navigation-b {
+ text-align: right;
+ margin: 52px 0 0;
+ overflow: visible;
+}
+
+@media (max-width: 900px) {
+ .navigation-b {
+ text-align: center;
+ margin-top: 20px;
+ padding: 0;
+ }
+}
+
+.navigation-b ul {
+ padding: 0;
+ list-style: none;
+ margin: 0;
+ overflow: visible;
+}
+
+.navigation-b ul li,
+.navigation-b ul li a {
+ display: inline-block;
+}
+
+@media (max-width: 900px) {
+ .navigation-b ul {
+ display: table;
+ width: 100%;
+ padding-bottom: 1.5em;
+ }
+}
+
+@media (max-width: 900px) {
+ .navigation-b ul li {
+ display: table-row;
+ }
+}
+
+.navigation-b ul li+li {
+ margin-left: 20px;
+}
+
+@media (max-width: 900px) {
+ .navigation-b ul li+li {
+ margin-left: 0;
+ }
+}
+
+.navigation-b ul li a {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ text-transform: uppercase;
+ text-decoration: none;
+ outline: none;
+}
+
+@media (max-width: 900px) {
+ .navigation-b ul li a {
+ width: 100%;
+ -webkit-border-radius: 0;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 0;
+ -moz-background-clip: padding;
+ border-radius: 0;
+ background-clip: padding-box;
+ }
+}
+
+.footer-a {
+ font-size: 13px;
+ font-size: 0.8125rem;
+ line-height: 23.4px;
+ line-height: 1.46rem;
+ padding-top: 2.25em;
+ padding-bottom: 2.25em;
+ overflow: hidden;
+ color: #8a8a8a;
+}
+
+.footer-a a {
+ color: #0287D0;
+ text-decoration: none;
+ border-bottom: 1px dotted #0287D0;
+}
+
+.footer-a a:hover {
+ color: #0277b7;
+}
+
+.footer-a p {
+ margin: 0;
+ display: inline-block;
+ text-align: center;
+}
+
+.content {
+ font-size: 14px;
+ font-size: 0.875rem;
+ line-height: 25.2px;
+ line-height: 1.57rem;
+ overflow: hidden;
+ padding-top: 1.5em;
+ padding-bottom: 1.5em;
+}
+
+.content p {
+ margin: 0.75em 0;
+}
+
+.content ul,
+.content ol,
+.content pre,
+.content blockquote,
+.content textarea:not([class^="cke"]),
+.content .cke {
+ margin: 1.875em 0;
+}
+
+.content code,
+.content kbd {
+ -webkit-border-radius: 3px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 3px;
+ -moz-background-clip: padding;
+ border-radius: 3px;
+ background-clip: padding-box;
+ padding: 3px 4px;
+}
+
+.content pre,
+.content code,
+.content kbd,
+.content blockquote {
+ background: #f5f5f5;
+}
+
+.content blockquote,
+.content pre {
+ background: none;
+ border-left: 4px solid #0287D0;
+ padding: 1.5em 2.25em;
+}
+
+.content p a,
+.content ul a,
+.content ol a,
+.content blockquote a,
+.content h1 a,
+.content h2 a,
+.content h3 a,
+.content h4 a,
+.content h5 a {
+ color: #0287D0;
+ text-decoration: none;
+ border-bottom: 1px dotted #0287D0;
+}
+
+.content p a:hover,
+.content ul a:hover,
+.content ol a:hover,
+.content blockquote a:hover,
+.content h1 a:hover,
+.content h2 a:hover,
+.content h3 a:hover,
+.content h4 a:hover,
+.content h5 a:hover {
+ color: #0277b7;
+}
+
+.content h1,
+.content h2,
+.content h3,
+.content h4,
+.content h5 {
+ color: #000;
+ font-weight: 100;
+}
+
+.content h1 code,
+.content h2 code,
+.content h3 code,
+.content h4 code,
+.content h5 code,
+.content h1 kbd,
+.content h2 kbd,
+.content h3 kbd,
+.content h4 kbd,
+.content h5 kbd {
+ font-size: inherit;
+}
+
+.content h1 a.content-heading-anchor,
+.content h2 a.content-heading-anchor,
+.content h3 a.content-heading-anchor,
+.content h4 a.content-heading-anchor,
+.content h5 a.content-heading-anchor {
+ font-weight: 100;
+ vertical-align: middle;
+ opacity: 0;
+ border: 0;
+}
+
+.content h1:hover a.content-heading-anchor,
+.content h2:hover a.content-heading-anchor,
+.content h3:hover a.content-heading-anchor,
+.content h4:hover a.content-heading-anchor,
+.content h5:hover a.content-heading-anchor {
+ opacity: 1;
+}
+
+.content h1:target a,
+.content h2:target a,
+.content h3:target a,
+.content h4:target a,
+.content h5:target a {
+ -webkit-animation: targetLinkOpacity 0.5s linear alternate;
+ -moz-animation: targetLinkOpacity 0.5s linear alternate;
+ -o-animation: targetLinkOpacity 0.5s linear alternate;
+ animation: targetLinkOpacity 0.5s linear alternate;
+ opacity: 1;
+}
+
+.content input,
+.content select,
+.content textarea:not([class^="cke"]) {
+ -webkit-border-radius: 3px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 3px;
+ -moz-background-clip: padding;
+ border-radius: 3px;
+ background-clip: padding-box;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08);
+ font: inherit;
+ color: inherit;
+ border: 1px solid #D9D9D9;
+ padding: .2em .5em;
+}
+
+.content input:focus,
+.content select:focus,
+.content textarea:not([class^="cke"]):focus {
+ border-color: #66afe9;
+ outline: 0;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08), 0 0 8px #93c6ef;
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08), 0 0 8px #93c6ef;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08), 0 0 8px #93c6ef;
+}
+
+.content abbr {
+ border-bottom: 1px dotted #666;
+ cursor: pointer;
+}
+
+.content blockquote {
+ font-style: italic;
+ font-family: Georgia, Times, "Times New Roman", serif;
+ font-size: 16px;
+ font-size: 1rem;
+ line-height: 28.8px;
+ line-height: 1.8rem;
+}
+
+.content em {
+ font-style: italic;
+}
+
+.content h1 {
+ font-size: 36px;
+ font-size: 2.25rem;
+ line-height: 64.8px;
+ line-height: 4.05rem;
+ margin: 1.125em 0 0;
+}
+
+.content h2 {
+ font-size: 27.2px;
+ font-size: 1.7rem;
+ line-height: 48.96px;
+ line-height: 3.06rem;
+ margin: 0.9em 0 0;
+}
+
+.content h3 {
+ font-size: 24px;
+ font-size: 1.5rem;
+ line-height: 43.2px;
+ line-height: 2.7rem;
+ font-weight: 500;
+ margin: 0.75em 0 0;
+}
+
+.content h4 {
+ font-size: 19.2px;
+ font-size: 1.2rem;
+ line-height: 34.56px;
+ line-height: 2.16rem;
+ font-weight: 500;
+ margin: 0.75em 0 0;
+}
+
+.content h5 {
+ font-size: 17.6px;
+ font-size: 1.1rem;
+ line-height: 31.68px;
+ line-height: 1.98rem;
+ font-weight: 500;
+ margin: 0.75em 0 0;
+}
+
+.content hr {
+ border: 0;
+ border-top: 4px solid #D9D9D9;
+ margin: 1.5em 0;
+}
+
+.content input[type="text"] {
+ height: 1.8em;
+ line-height: 1.8em;
+}
+
+.content input[type="button"] {
+ -webkit-appearance: button;
+ -moz-appearance: button;
+ appearance: button;
+}
+
+.content kbd {
+ font-size: 12px;
+ font-size: 0.75rem;
+ line-height: 21.6px;
+ line-height: 1.35rem;
+ font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
+ padding: 2px 6px;
+ -webkit-box-shadow: 0 0 4px #fff inset, 0 2px 0 #D9D9D9;
+ -moz-box-shadow: 0 0 4px #fff inset, 0 2px 0 #D9D9D9;
+ box-shadow: 0 0 4px #fff inset, 0 2px 0 #D9D9D9;
+}
+
+.content p img {
+ vertical-align: middle;
+}
+
+.content p pre {
+ padding: 1.5em;
+}
+
+.content pre {
+ padding: 0;
+ border: 0;
+ tab-size: 4;
+ -o-tab-size: 4;
+ -moz-tab-size: 4;
+}
+
+.content pre,
+.content code {
+ font-size: 11.89px;
+ font-size: 0.743rem;
+ line-height: 21.4px;
+ line-height: 1.34rem;
+ font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
+}
+
+.content pre a,
+.content code a {
+ border: 0;
+}
+
+.content pre code {
+ padding: 0.75em;
+ display: block;
+}
+
+.content strong {
+ color: #000;
+}
+
+.content ul ul,
+.content ol ul,
+.content ul ol,
+.content ol ol {
+ margin: 0.75em 0;
+}
+
+.content ul li,
+.content ol li {
+ font-size: 14px;
+ font-size: 0.875rem;
+ line-height: 30.24px;
+ line-height: 1.89rem;
+}
+
+.content textarea:not([class^="cke"]) {
+ width: 100%;
+}
+
+.content div.todo {
+ border: 2px dotted #444;
+ padding: 10px;
+ margin: 60px 0 10px 0;
+ /* Remove me some day */
+}
+
+.content div.todo:before {
+ content: "TODO";
+ font-weight: bold;
+}
+
+body a.button-a,
+body button.button-a,
+body input.button-a {
+ -webkit-border-radius: 3px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 3px;
+ -moz-background-clip: padding;
+ border-radius: 3px;
+ background-clip: padding-box;
+ font-size: 14px;
+ font-size: 0.875rem;
+ line-height: 25.2px;
+ line-height: 1.57rem;
+ height: 36px;
+ line-height: 36px;
+ padding: 0 1.1em;
+ font-weight: 700;
+ color: #3e3e3e;
+ white-space: nowrap;
+ text-decoration: none;
+ display: inline-block;
+ cursor: pointer;
+ border: 0;
+ vertical-align: middle;
+ margin: 1px 0;
+ background: transparent;
+}
+
+body a.button-a.icon-pos-left,
+body button.button-a.icon-pos-left,
+body input.button-a.icon-pos-left {
+ padding-left: .8em;
+}
+
+body a.button-a.icon-pos-right,
+body button.button-a.icon-pos-right,
+body input.button-a.icon-pos-right {
+ padding-right: .8em;
+}
+
+body a.button-a.button-a-no-text,
+body button.button-a.button-a-no-text,
+body input.button-a.button-a-no-text {
+ -webkit-border-radius: 100px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 100px;
+ -moz-background-clip: padding;
+ border-radius: 100px;
+ background-clip: padding-box;
+ width: 36px;
+ padding: 0;
+ text-indent: -999px;
+ overflow: hidden;
+ position: relative;
+ text-align: center;
+}
+
+body a.button-a.button-a-no-text:before,
+body button.button-a.button-a-no-text:before,
+body input.button-a.button-a-no-text:before {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin: -9px 0 0 -9px;
+}
+
+@media (max-width: 900px) {
+
+ body a.button-a.button-a-mobile-collapsed,
+ body button.button-a.button-a-mobile-collapsed,
+ body input.button-a.button-a-mobile-collapsed {
+ -webkit-border-radius: 100px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 100px;
+ -moz-background-clip: padding;
+ border-radius: 100px;
+ background-clip: padding-box;
+ width: 36px;
+ padding: 0;
+ text-indent: -999px;
+ overflow: hidden;
+ position: relative;
+ text-align: center;
+ }
+
+ body a.button-a.button-a-mobile-collapsed:before,
+ body button.button-a.button-a-mobile-collapsed:before,
+ body input.button-a.button-a-mobile-collapsed:before {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin: -9px 0 0 -9px;
+ }
+
+ body a.button-a.button-a-mobile-collapsed:before,
+ body button.button-a.button-a-mobile-collapsed:before,
+ body input.button-a.button-a-mobile-collapsed:before {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin: -9px 0 0 -9px;
+ }
+}
+
+body a.button-a:active,
+body button.button-a:active,
+body input.button-a:active,
+body a.button-a:hover,
+body button.button-a:hover,
+body input.button-a:hover {
+ color: #fff;
+ background: #0277b7;
+}
+
+body a.button-a:focus,
+body button.button-a:focus,
+body input.button-a:focus {
+ border-color: #66afe9;
+ outline: 0;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #93c6ef;
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #93c6ef;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #93c6ef;
+}
+
+body a.button-a-soft,
+body button.button-a-soft,
+body input.button-a-soft {
+ background: #e7e7e7;
+}
+
+body a.button-a-soft:active,
+body button.button-a-soft:active,
+body input.button-a-soft:active,
+body a.button-a-soft:hover,
+body button.button-a-soft:hover,
+body input.button-a-soft:hover {
+ color: #3e3e3e;
+ background: #cecece;
+}
+
+body a.button-a-background,
+body button.button-a-background,
+body input.button-a-background,
+body a.navigation-b ul li a:hover,
+body button.navigation-b ul li a:hover,
+body input.navigation-b ul li a:hover {
+ color: #fff;
+ background: #0287D0;
+}
+
+body a.button-a-background:active,
+body button.button-a-background:active,
+body input.button-a-background:active,
+body a.button-a-background:hover,
+body button.button-a-background:hover,
+body input.button-a-background:hover,
+body a.navigation-b ul li a:hover:active,
+body button.navigation-b ul li a:hover:active,
+body input.navigation-b ul li a:hover:active,
+body a.navigation-b ul li a:hover:hover,
+body button.navigation-b ul li a:hover:hover,
+body input.navigation-b ul li a:hover:hover {
+ color: #fff;
+ background: #0277b7;
+}
+
+.balloon-a {
+ font-size: 12px;
+ font-size: 0.75rem;
+ line-height: 21.6px;
+ line-height: 1.35rem;
+ -webkit-border-radius: 3px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 3px;
+ -moz-background-clip: padding;
+ border-radius: 3px;
+ background-clip: padding-box;
+ border-bottom: 3px solid #d4d4d4;
+ background: #ebebeb;
+ display: inline-block;
+ white-space: nowrap;
+ padding: .4em 1.2em .2em;
+ font-weight: 700;
+ position: relative;
+ z-index: 1000;
+ text-transform: none;
+ color: #575757;
+}
+
+.balloon-a:hover {
+ color: #575757;
+}
+
+.balloon-a:before {
+ content: '';
+ width: 0;
+ height: 0;
+ border-style: solid;
+ position: absolute;
+}
+
+.balloon-a-ne:before,
+.balloon-a-nw:before {
+ top: -13px;
+ border-width: 0 9px 15.6px 9px;
+ border-color: transparent transparent #ebebeb transparent;
+}
+
+.balloon-a-se:before,
+.balloon-a-sw:before {
+ bottom: -13px;
+ border-width: 15.6px 9px 0 9px;
+ border-color: #ebebeb transparent transparent transparent;
+}
+
+.balloon-a-nw:before,
+.balloon-a-sw:before {
+ left: 20px;
+}
+
+.balloon-a-ne:before,
+.balloon-a-se:before {
+ right: 20px;
+}
+
+.icon-pos-left:before,
+.icon-pos-right:after {
+ content: '';
+ display: inline-block;
+ width: 18px;
+ height: 18px;
+ vertical-align: middle;
+ background-repeat: no-repeat;
+}
+
+.icon-pos-left:before {
+ margin-right: 10px;
+}
+
+.icon-pos-right:after {
+ margin-left: 10px;
+}
+
+.icon-download:before,
+.icon-download:after {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAQFJREFUOBGtVDESgjAQBGfobHwE/AIa/AN/8EEWfMWGZ+gDaG2ws8BdyY13SRgGcGducre3WQ5NSJIIxnGsES3ijhhcMCdXR7ZYCqIc0SGWQE1ud7sKjRLxXHJQfWpLYwaCk6wxET/u+U2GIngd8yRViINau28bBH/YAGqvSQPhRNQHqBqj3FY0NKq27TW7qhSTDaCOhkaRAj7Hmm8S4V+c6C+gUa+crsizuWmoc70MKbWCnqPy2GvcUJxE4a/sIajRaGkU+/sf4IuISQGePR/T/QMbHEhwPLVnMWPuOCwGnWg41dwVeaN3ccHch70idIRi/6WV0WC2/zMiZm661R+2DxyEdjTuST3mAAAAAElFTkSuQmCC");
+}
+
+.icon-question-mark:before,
+.icon-question-mark:after {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAUhJREFUOBGllLFOAkEQhjk0WthT2JFA7Czsqc7OxFLewEeAZ/AVbO0tTLTSBKhstTBUNkYLEoVAbD2//zILe5e9uwCT/JnZmX/+m83ebq0WsCRJYnANxmBhUKxcHGjJpiC1wQBUmTjtbLetKHTAT5WCVxe3kxEjoUmKRL6pvYEZyJt6VpOxCG3nmfyx+yJxBM7BFPg2SDlkTv2sxZqi4YnUvfgswI9FuHAkzz9EUTTRmqYeTifXsvoj/s9i57oi6ljz9kviFdyBCbgHe+rCn4C8jVXQ18rshuKOiTSIXwLkRZWQTurARJrE7wERpea7kD7BkcgB+yB3CFGlPmgqCNiXhEagSGif2qU1Ln8FW/tupK3pXhXZrWNDuCoikY/rHPMT5KFr2MAPTSM90rIrUjJIeq1WV0RTwN7+0rrtILb9M+LEbLq1H7Z/Ea3+RvBddl0AAAAASUVORK5CYII=");
+}
+
+.icon-close:before,
+.icon-close:after {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAUlJREFUOBGllDFuwzAMRe3Cd+jYKUCzd/XkDtm9dsoVOuUqBnqBoodwgBwiW8ZsXTIWqPu+Iia0LMAoTOBbJEV+UZTkosjIMAwN6MARXCKky9dkUsYuglagB3OimNU4O1pM1OB7jsHNK7YekeFQJZ5kj/0LcnLA+RMnlHOvDMNv5wO7BFuQkn3hq0ALjKwPVeF4BSaqpLRy0T1ZIHFz75bE2BR8dBImqmBrwRplg09QmR/9GZyBSadAHauXCZkRROKURLlHEemepJIlIyhHotzLg1/N6erTxtmmvqA8muHGIbc1rTBqrEuwnqWnGbbmmz0hwaHtvM2QhWbrXZnosvnTWWPrdCY9w7cDJtf3h9VHjy5Zq9UZ08beyJh7Aicg6W/VYvgnIjJdNn9PMIOITJWcgnV9VvcnEitY/mitNFZZ/hsxsljdv39sfybRQ4R/kU0MAAAAAElFTkSuQmCC");
+}
+
+.ie8 .switch>* {
+ vertical-align: middle;
+}
+
+.ie8 .switch input[type="radio"] {
+ margin: 0 0.25em;
+ display: inline-block;
+}
+
+.ie8 .switch label {
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+}
+
+.ie8 .switch label[data-for="1"] {
+ float: left;
+}
+
+.ie8 .switch label[data-for="2"] {
+ float: right;
+}
+
+.ie8 .switch .switch-inner {
+ display: none;
+}
+
+.switch {
+ font-size: 14px;
+ font-size: 0.875rem;
+ line-height: 25.2px;
+ line-height: 1.57rem;
+ font-weight: bold;
+ background-color: #0287D0;
+ overflow: hidden;
+ display: inline-block;
+ padding: 0.75em 0.25em;
+ color: #fff;
+ -webkit-border-radius: 3px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 3px;
+ -moz-background-clip: padding;
+ border-radius: 3px;
+ background-clip: padding-box;
+ position: relative;
+}
+
+.switch input[type="radio"] {
+ display: none;
+}
+
+.switch label {
+ position: relative;
+ z-index: 2;
+ float: left;
+ cursor: pointer;
+ padding: 0 0.75em;
+}
+
+.switch label:hover {
+ text-decoration: underline;
+}
+
+.switch .switch-inner {
+ float: left;
+ background-color: #FFF;
+ height: 1.5em;
+ width: 4.125em;
+ padding: 2px;
+ margin: 0 0.25em;
+ -webkit-border-radius: 5.5px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 5.5px;
+ -moz-background-clip: padding;
+ border-radius: 5.5px;
+ background-clip: padding-box;
+}
+
+.switch .switch-inner .handler {
+ overflow: hidden;
+ position: relative;
+ display: block;
+ height: 1.5em;
+ width: 1.5em;
+ background: #027dc1;
+ -webkit-border-radius: 4.5px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 4.5px;
+ -moz-background-clip: padding;
+ border-radius: 4.5px;
+ background-clip: padding-box;
+}
+
+.switch .switch-inner .handler:before {
+ content: '';
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 3px;
+ left: 0;
+ background-color: #0291df;
+ -webkit-border-bottom-left-radius: 4.5px;
+ -moz-border-radius-bottomleft: 4.5px;
+ border-bottom-left-radius: 4.5px;
+ -webkit-border-bottom-right-radius: 4.5px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius-bottomright: 4.5px;
+ -moz-background-clip: padding;
+ border-bottom-right-radius: 4.5px;
+ background-clip: padding-box;
+}
+
+.switch:hover .switch-inner .handler:before {
+ background: #029ef3;
+}
+
+.switch input[data-num="2"]:checked~.switch-inner>.handler {
+ margin-left: auto;
+}
+
+.switch input[data-num="2"]:checked~label[data-for="1"] {
+ padding-right: 5.125em;
+ margin-right: -4.375em;
+}
+
+.switch input[data-num="1"]:checked~label[data-for="2"] {
+ padding-left: 5.125em;
+ margin-left: -4.375em;
+}
+
+.toggler {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.toggler label {
+ cursor: pointer;
+}
+
+.toggler [data-collapse] {
+ display: inherit;
+}
+
+.toggler [data-expand] {
+ display: none;
+}
+
+.toggler.collapsed [data-collapse] {
+ display: none;
+}
+
+.toggler.collapsed [data-expand] {
+ display: inherit;
+}
+
+.toggler-container {
+ overflow: hidden;
+}
+
+.toggler-container.collapsed {
+ height: 0;
+}
+
+.icon-toggler-expanded:before,
+.icon-toggler-collapsed:before,
+.icon-toggler-expanded:after,
+.icon-toggler-collapsed:after {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAByCAYAAABeOoENAAAAAXNSR0IArs4c6QAAAbxJREFUaAXtmT1KBEEQhRdFQdBEMfQEBoaGopl3MfECXsFERLyBh/AUIuwJDEUQM//eB11Dz1A1uzotGFTBY2rr58306+kNpmazP7Z98V8Kj8JrAT4xcgttXRVXwofwFYAcNdS6RuJegOBTuBUOhc0CfGLkqKHWJeMuFDwJJ0Jk5Kihlp6esW4embuNkVgTNdTS09MMEbkDj76sUUsPvZ2xIwTRATsQuBuxGsTIYdSSo7cztpggwprdyKlJ8ImZUUuM3s48ol1lXwQjwydm5hINl2bF53KMCL82d2mR2GvqnBfg1+aKPbb9p+oGtYXbT1GTFxKiZkfEyHgy7x0y0clR454zSGpDMzaA3fzV30hNln4qkAqkAqlAKpAKpAKpQCqQCqQCqUAqkAqkAqlAKpAKpAKpQCrw3xWY/GGcz++TP9U3Gx40GWdEAxabXA33NBywRCOfdzFcCztDJv12Rz7REMpmIc9qPBNWK0J3COWNxegxIrs+KHZcyHpjsZUSXPaypcLtseJFS3tT84WwUZG4S4vEZkl3wl5FYK4rdrT9R9Y1uIbbT12TFxKiZkfEyCYfWojMJv+NGNGPr99GI9DP7P9TCgAAAABJRU5ErkJggg==");
+}
+
+.icon-toggler-expanded.icon-light:before,
+.icon-toggler-collapsed.icon-light:before,
+.icon-toggler-expanded.icon-light:after,
+.icon-toggler-collapsed.icon-light:after {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAByCAYAAABeOoENAAAAAXNSR0IArs4c6QAAAcVJREFUaAXtmT9KA1EQxhMlASE2SkpPkCJlStHOu3gGwRPYBAm5gYfwFBKwtrARRAh26vr7ljfx7TrLChtBcAa+zOSbPy/7vcTC6fV+04qimIArsALrBMXiJq1nUzQEc/AOmkw51QzdgUqAWyD7AEswA6MExeKUk6n2+zBInSJ7BKfuaZDKpRpcMa/UQUgTfWSd1jjEmlSTatXzpRlvJKJsacVtXrVlB72bWgjdiGwmEj8FOq1u4qapRprJVvkgXbFsZCTxomSqL4ssr0uQrY3TJ/AGjeFfVJlM8diaiCuDdlLiIfmNcP1+/wnu0hoVJ84oq7XeUhNXbE4dgPuEgU2Qh3PFbrx+Gs6E2hD/+tMJ3b+QadB2fiLZsG4/2poG3f6M5MMiDgVCgVAgFAgFQoFQIBQIBUKBUCAUCAVCgVAgFAgFQoFQIBQIBf66AiwLuv1jnAH/Zb/Go5abq/qdwvsLFhJNK583ctfg0Bnmrnwq+zVrYoDZM8E52M1yP9uvqcGmZP6O+CTl3LWYHdTm9yk4aCzilLZHe6XmAuzZEGL30ZrEpr64AUc2wDycK7a7X6P42BpzD+9fv4pIxn4tWznnwm0r/gQpiG1tFshTowAAAABJRU5ErkJggg==");
+}
+
+.icon-toggler-expanded:before,
+.icon-toggler-expanded:after {
+ background-position: top left;
+}
+
+.icon-toggler-collapsed:before,
+.icon-toggler-collapsed:after {
+ background-position: bottom left;
+}
+
+.modal {
+ padding: 20px;
+ border-radius: 3px;
+ background-color: white;
+ max-width: 700px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 80% !important;
+ top: 50% !important;
+ -webkit-transform: translate(-50%, -50%) !important;
+ -moz-transform: translate(-50%, -50%) !important;
+ -ms-transform: translate(-50%, -50%) !important;
+ -o-transform: translate(-50%, -50%) !important;
+ transform: translate(-50%, -50%) !important;
+}
+
+.modal-close {
+ -webkit-border-radius: 100px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 100px;
+ -moz-background-clip: padding;
+ border-radius: 100px;
+ background-clip: padding-box;
+ cursor: pointer;
+ height: 18px;
+ width: 18px;
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ font-size: 17px;
+ text-align: center;
+ line-height: 19px;
+ background: #cccccc;
+}
+
+main .grid-container,
+header .grid-container,
+.navigation-a>div,
+footer>div {
+ max-width: 968px;
+}
+
+.header-a {
+ margin-top: 30px;
+}
+
+.footer-a {
+ border-top: 1px solid #D9D9D9;
+}
+
+.adjoined-top {
+ background-color: #0287D0;
+ color: #fff;
+}
+
+.adjoined-top .content h1,
+.adjoined-top .content h2,
+.adjoined-top .content h3,
+.adjoined-top .content h4,
+.adjoined-top .content h5 {
+ color: #fff;
+}
+
+.adjoined-top .content p {
+ font-size: 18px;
+ font-size: 1.125rem;
+ line-height: 32.4px;
+ line-height: 2.02rem;
+ font-weight: 100;
+}
+
+.adjoined-top .content p a {
+ text-decoration: none;
+ border-bottom: 1px dotted #fff;
+ color: inherit;
+}
+
+.adjoined-top .content p a:hover {
+ color: #e6e6e6;
+}
+
+.adjoined-top .content button {
+ color: #fff;
+}
+
+.adjoined-top .content strong {
+ color: #fff;
+}
+
+.adjoined-top .content code {
+ font-size: inherit;
+ color: #0287D0;
+}
+
+.adjoined-bottom {
+ position: relative;
+}
+
+.adjoined-bottom:before {
+ z-index: -1;
+ content: '';
+ background: #0287D0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 50%;
+}
+
+main .grid-container,
+header .grid-container,
+.navigation-a>div,
+footer>div {
+ max-width: 1052px;
+}
+
+main .grid-container.freed-width {
+ max-width: none;
+}
+
+.switch {
+ background: #027dc1;
+ float: right;
+ overflow: visible;
+}
+
+.switch .balloon-a {
+ position: absolute;
+ top: -40px;
+ right: 50%;
+ margin-right: -15px;
+ background: #FFEFC1;
+ border-bottom-color: #DCDCA4;
+}
+
+.switch .balloon-a:before {
+ border-color: #FFEFC1 transparent transparent transparent;
+}
+
+#toolbar .editors-container {
+ overflow: hidden;
+ height: 0;
+ transition: height 200ms;
+}
+
+#toolbar .editors-container.active {
+ height: auto;
+}
+
+#main #editor {
+ background: #FFF;
+ padding: 2% 4%;
+ border: dashed 5px #0287D0;
+}
+
+#main .adjoined-top:before {
+ height: 335px;
+}
+
+#toolbar .adjoined-top:before {
+ height: 219px;
+}
+
+#toolbar .adjoined-top .grid-container-nested {
+ height: 147px;
+}
+
+.content .grid-switch-magic {
+ margin: 3.5em 0 0;
+}
+
+#info-box {
+ padding-bottom: 0;
+}
+
+#info-box>div {
+ width: 100%;
+ text-align: right;
+}
+
+#info-box>div .toggler {
+ padding-right: 0;
+}
+
+#info-box>div .toggler:hover {
+ background: transparent;
+ color: #000;
+}
+
+#info-box>div .toggler:hover>label {
+ text-decoration: underline;
+}
+
+#info-box>div h2 {
+ float: left;
+ margin-top: 0;
+}
+
+#info-box>div#instructions-container {
+ text-align: left;
+}
+
+#toolbarModifierWrapper {
+ overflow: hidden;
+ height: 0;
+ opacity: 0;
+ transition: height 200ms;
+}
+
+#toolbarModifierWrapper.active {
+ height: auto;
+ opacity: 1;
+}
+
+header {
+ overflow: visible;
+}
+
+header div.grid-container {
+ overflow: visible;
+}
+
+header .navigation-b {
+ overflow: visible;
+}
+
+header .navigation-b ul {
+ overflow: visible;
+}
+
+header .navigation-b a {
+ position: relative;
+}
+
+header .balloon-a {
+ position: absolute;
+ top: 48px;
+ left: 50%;
+ margin-left: -35px;
+}
+
+@media (max-width: 1140px) {
+ header .balloon-a {
+ left: auto;
+ margin-left: auto;
+ right: 50%;
+ margin-right: -35px;
+ }
+
+ header .balloon-a:before {
+ left: auto;
+ right: 22px;
+ }
+}
+
+@media (max-width: 900px) {
+ header .balloon-a {
+ display: none;
+ }
+}
+
+header .header-a-logo img {
+ width: 160px;
+ height: 60px;
+}
+
+#toolbar .cke_toolbar {
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: default;
+}
+
+.some-toolbar-active .cke_toolbar {
+ zoom: 1;
+ filter: alpha(opacity=50);
+ -webkit-opacity: 0.5;
+ -moz-opacity: 0.5;
+ opacity: 0.5;
+}
+
+.cke_toolbar.active {
+ position: relative;
+ zoom: 1;
+ filter: alpha(opacity=100);
+ -webkit-opacity: 1;
+ -moz-opacity: 1;
+ opacity: 1;
+}
+
+.cke_toolbar.active:after {
+ content: '';
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 6px;
+ bottom: 5px;
+ left: 0;
+ -webkit-border-radius: 5px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 5px;
+ -moz-background-clip: padding;
+ border-radius: 5px;
+ background-clip: padding-box;
+ -webkit-box-shadow: 0px 0px 15px 3px #fff4b0;
+ -moz-box-shadow: 0px 0px 15px 3px #fff4b0;
+ box-shadow: 0px 0px 15px 3px #fff4b0;
+}
+
+.cke_toolbar.active .cke_toolgroup {
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ border-color: #e3c300;
+}
+
+.cke_toolbar.active .cke_combo,
+.cke_toolbar.active .cke_toolgroup {
+ position: relative;
+ z-index: 2;
+}
+
+.cke_toolbar.active .cke_combo_button {
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+
+.unselectable {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.toolbar {
+ padding: 5px 0;
+ margin-bottom: 2.4em;
+ overflow: hidden;
+ background: #fff;
+}
+
+.toolbar button.button-a.cke_button {
+ cursor: pointer;
+ display: inline-block;
+ padding: 4px 6px;
+ outline: 0;
+ border: 1px solid #a6a6a6;
+}
+
+.toolbar button.button-a.hidden {
+ display: none;
+}
+
+.toolbar button.button-a.left {
+ float: left;
+ margin-right: 8px;
+}
+
+.toolbar button.button-a.right {
+ float: right;
+ margin-left: 8px;
+}
+
+.toolbar button.button-a .highlight {
+ color: #ffefc1;
+}
+
+.configContainer.hidden,
+.toolbarModifier.hidden,
+.toolbarModifier-hints.hidden {
+ display: none;
+}
+
+.toolbarModifier :focus,
+.toolbar button:focus,
+.configContainer textarea.configCode:focus {
+ outline: none;
+}
+
+div.toolbarModifier {
+ padding: 0;
+ overflow: hidden;
+ width: 100%;
+ position: relative;
+ display: table;
+ border-collapse: collapse;
+}
+
+div.toolbarModifier ::-moz-focus-inner {
+ border: 0;
+}
+
+div.toolbarModifier .empty {
+ display: none;
+}
+
+div.toolbarModifier.empty-visible .empty {
+ display: table-row;
+ zoom: 1;
+ filter: alpha(opacity=60);
+ -webkit-opacity: 0.6;
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+}
+
+div.toolbarModifier .empty>p {
+ line-height: 31px;
+}
+
+div.toolbarModifier>ul {
+ padding: 0;
+ margin: 0;
+ border-top: 1px solid #ccc;
+ width: 100%;
+}
+
+div.toolbarModifier>ul[data-type="table-header"] {
+ display: table-header-group;
+}
+
+div.toolbarModifier>ul[data-type="table-body"] {
+ display: table-row-group;
+}
+
+div.toolbarModifier>ul p {
+ padding: 0;
+ margin: 0;
+}
+
+div.toolbarModifier>ul>li {
+ display: table-row;
+}
+
+div.toolbarModifier>ul>li[data-type="header"] {
+ font-weight: bold;
+ user-select: none;
+ cursor: default;
+}
+
+div.toolbarModifier>ul>li[data-type="group"],
+div.toolbarModifier>ul>li[data-type="separator"] {
+ border-bottom: 1px solid #ccc;
+}
+
+div.toolbarModifier>ul>li[data-type="subgroup"] {
+ border-top: 1px solid #eee;
+}
+
+div.toolbarModifier>ul>li[data-type="subgroup"]:first-child {
+ border-top: none;
+}
+
+div.toolbarModifier>ul>li[data-type="group"].active,
+div.toolbarModifier>ul>li[data-type="group"]:hover,
+div.toolbarModifier>ul>li[data-type="separator"].active,
+div.toolbarModifier>ul>li[data-type="separator"]:hover {
+ overflow: hidden;
+ z-index: 2;
+}
+
+div.toolbarModifier>ul>li[data-type="group"].active,
+div.toolbarModifier>ul>li[data-type="separator"].active,
+div.toolbarModifier>ul>li[data-type="group"].active:hover,
+div.toolbarModifier>ul>li[data-type="separator"].active:hover {
+ background: #f0fafb;
+}
+
+div.toolbarModifier>ul>li[data-type="group"]:hover,
+div.toolbarModifier>ul>li[data-type="separator"]:hover {
+ background: #fffbe3;
+}
+
+div.toolbarModifier>ul>li[data-type="separator"] {
+ background: #f5f5f5;
+}
+
+div.toolbarModifier>ul>li[data-type="separator"]:after {
+ content: '';
+ width: 100%;
+}
+
+div.toolbarModifier>ul>li[data-type="separator"]>p {
+ padding: 2px 5px;
+}
+
+div.toolbarModifier>ul>li>p,
+div.toolbarModifier>ul>li>ul {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+div.toolbarModifier>ul>li p {
+ padding-left: 5px;
+ min-width: 200px;
+}
+
+div.toolbarModifier>ul>li p span {
+ white-space: nowrap;
+ cursor: default;
+}
+
+div.toolbarModifier>ul>li p span button {
+ font-size: 12.666px;
+ margin-right: 5px;
+ cursor: pointer;
+ background: #fff;
+ -webkit-border-radius: 5px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 5px;
+ -moz-background-clip: padding;
+ border-radius: 5px;
+ background-clip: padding-box;
+ border: 1px solid #bbb;
+ padding: 0 7px;
+ line-height: 12px;
+ height: 20px;
+}
+
+div.toolbarModifier>ul>li p span button:not(.disabled):hover,
+div.toolbarModifier>ul>li p span button:not(.disabled):focus {
+ color: #fff;
+ background-color: #454545;
+ border-color: transparent;
+}
+
+div.toolbarModifier>ul>li p span button.move.disabled {
+ cursor: default;
+ zoom: 1;
+ filter: alpha(opacity=20);
+ -webkit-opacity: 0.2;
+ -moz-opacity: 0.2;
+ opacity: 0.2;
+}
+
+div.toolbarModifier>ul>li ul {
+ border-collapse: collapse;
+ padding: 0;
+ width: 100%;
+}
+
+div.toolbarModifier>ul>li ul li {
+ display: table-row;
+ list-style-type: none;
+ line-height: 1;
+}
+
+div.toolbarModifier>ul>li ul li[data-type="subgroup"] {
+ border-top: 1px solid #ddd;
+}
+
+div.toolbarModifier>ul>li ul li[data-type="subgroup"]:first-child {
+ border-top: 0;
+}
+
+div.toolbarModifier>ul>li ul li[data-type="subgroup"] [data-type="button"] {
+ -webkit-border-radius: 3px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 3px;
+ -moz-background-clip: padding;
+ border-radius: 3px;
+ background-clip: padding-box;
+ padding: 0 2px;
+}
+
+div.toolbarModifier>ul>li ul li[data-type="subgroup"] [data-type="button"]:focus {
+ background: rgba(0, 0, 0, 0.04);
+}
+
+div.toolbarModifier>ul>li ul li[data-type="subgroup"] [data-type="button"] input {
+ vertical-align: middle;
+}
+
+div.toolbarModifier>ul>li ul li>p,
+div.toolbarModifier>ul>li ul li>ul {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+div.toolbarModifier>ul>li ul li ul {
+ padding: 0;
+}
+
+div.toolbarModifier>ul>li ul li ul li {
+ padding: 0;
+ display: inline-block;
+ cursor: pointer;
+ margin: 2px 5px 2px 0;
+}
+
+div.toolbarModifier>ul>li ul li ul li .cke_combo_text {
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+div.toolbarModifier>ul>li ul li ul li .cke_toolgroup,
+div.toolbarModifier>ul>li ul li ul li .cke_combo_button {
+ cursor: pointer;
+ margin: 0;
+ vertical-align: middle;
+ border: 1px solid #ddd;
+ font-size: 11.41px;
+ font-size: 0.713rem;
+ line-height: 20.54px;
+ line-height: 1.28rem;
+}
+
+div.toolbarModifier>.codemirror-wrapper {
+ overflow-y: auto;
+}
+
+div.toolbarModifier-hints {
+ float: right;
+ width: 350px;
+ min-width: 150px;
+ overflow-y: auto;
+ margin-left: 1.5em;
+}
+
+div.toolbarModifier-hints h3 {
+ font-size: 18.08px;
+ font-size: 1.13rem;
+ line-height: 32.54px;
+ line-height: 2.03rem;
+ padding: 0.36em 1.5em;
+ background: #f5f5f5;
+ border-bottom: 1px solid #ddd;
+ margin-top: 0;
+ margin-bottom: 1.2em;
+}
+
+div.toolbarModifier-hints dl {
+ margin-bottom: 1.2em;
+ overflow: hidden;
+}
+
+div.toolbarModifier-hints dl .list-header {
+ font-weight: bold;
+ border: 0;
+ padding-bottom: 0.6em;
+}
+
+div.toolbarModifier-hints dl>p {
+ text-align: center;
+}
+
+div.toolbarModifier-hints dl dt {
+ float: left;
+ width: 9em;
+ clear: both;
+ text-align: right;
+ border-top: 1px solid #ddd;
+ padding-left: 1.5em;
+ padding-right: .1em;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+div.toolbarModifier-hints dl dt code {
+ background: none;
+ border: none;
+ vertical-align: middle;
+}
+
+div.toolbarModifier-hints dl dd {
+ margin-left: 10em;
+ clear: right;
+ padding-right: 1.5em;
+}
+
+div.toolbarModifier-hints dl dd code {
+ line-height: 2.2em;
+}
+
+div.toolbarModifier-hints dl dd:after {
+ content: '\00a0';
+ display: block;
+ clear: left;
+ float: right;
+ height: 0;
+ width: 0;
+}
+
+.toolbarModifier-hints,
+.configContainer textarea.configCode,
+.CodeMirror {
+ -webkit-border-radius: 3px;
+ -webkit-background-clip: padding-box;
+ -moz-border-radius: 3px;
+ -moz-background-clip: padding;
+ border-radius: 3px;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ font-size: 13.01px;
+ font-size: 0.813rem;
+ line-height: 23.42px;
+ line-height: 1.46rem;
+}
+
+.configContainer textarea.configCode,
+.CodeMirror pre,
+.CodeMirror-linenumber {
+ font-size: 13.01px;
+ font-size: 0.813rem;
+ line-height: 23.42px;
+ line-height: 1.46rem;
+ font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
+}
+
+.CodeMirror pre {
+ border: none;
+ padding: 0;
+ margin: 0;
+}
+
+.configContainer textarea.configCode {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #575757;
+ padding: 10px;
+ width: 100%;
+ min-height: 500px;
+ margin: 0;
+ resize: none;
+ outline: none;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ white-space: pre;
+ word-wrap: normal;
+ overflow: auto;
+}
+
+.CodeMirror-hints.toolbar-modifier {
+ padding: 0;
+ color: #575757;
+ font-size: 14px;
+ font-size: 0.875rem;
+ line-height: 25.2px;
+ line-height: 1.57rem;
+ font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
+}
+
+.CodeMirror-hints.toolbar-modifier .CodeMirror-hint-active {
+ color: #575757;
+ background: #f0fafb;
+}
+
+.CodeMirror-hints.toolbar-modifier>li:hover {
+ background: #fffbe3;
+}
+
+/* Text modifier */
+#toolbarModifierWrapper {
+ margin-bottom: 1.2em;
+}
+
+#toolbarModifierWrapper .invalid .CodeMirror {
+ background: #fff8f8;
+ border-color: red;
+}
+
+#toolbarModifierWrapper .CodeMirror {
+ height: auto;
+ padding: 0 0.6em;
+}
+
+.staticContainer {
+ position: fixed;
+ top: 0;
+ width: 100%;
+ z-index: 10;
+}
+
+.staticContainer>.grid-container {
+ max-width: 1052px;
+}
+
+.staticContainer>.grid-container .inner {
+ background: #fff;
+}
+
+.staticContainer>.grid-container .inner .toolbar {
+ margin-bottom: 0;
+}
+
+#help {
+ position: relative;
+ top: -15px;
+ left: -5px;
+}
+
+#help-content {
+ display: none;
+}
+
+/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2dsb2JhbC9nbG9iYWwubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2NvcmUvY29yZS5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvZ3JpZC9ncmlkLmxlc3MiLCIuLi8uLi9ub2RlX21vZHVsZXMvbGVzc2hhdC9sZXNzaGF0Lmxlc3MiLCIuLi8uLi9ub2RlX21vZHVsZXMvY2tzb3VyY2Utc2FtcGxlcy1mcmFtZXdvcmsvY29tcG9uZW50cy9oZWFkZXItYS9oZWFkZXItYS5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvbmF2aWdhdGlvbi1hL25hdmlnYXRpb24tYS5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvbmF2aWdhdGlvbi1iL25hdmlnYXRpb24tYi5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvZm9vdGVyLWEvZm9vdGVyLWEubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2NvbnRlbnQvY29udGVudC5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvYnV0dG9uLWEvYnV0dG9uLWEubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2JhbGxvb24tYS9iYWxsb29uLWEubGVzcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9ja3NvdXJjZS1zYW1wbGVzLWZyYW1ld29yay9jb21wb25lbnRzL2ljb24vaWNvbi5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvc3dpdGNoL3N3aXRjaC5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvdG9nZ2xlci90b2dnbGVyLmxlc3MiLCIuLi8uLi9ub2RlX21vZHVsZXMvY2tzb3VyY2Utc2FtcGxlcy1mcmFtZXdvcmsvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvYmFzaWNzYW1wbGUvY29yZS5sZXNzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nrc291cmNlLXNhbXBsZXMtZnJhbWV3b3JrL2NvbXBvbmVudHMvYmFzaWNzYW1wbGUvYWRqb2luZWQubGVzcyIsIi4uLy4uL3NhbXBsZXMvbGVzcy9jdXN0b20ubGVzcyIsIi4uLy4uL3NhbXBsZXMvdG9vbGJhcmNvbmZpZ3VyYXRvci9sZXNzL3Rvb2xiYXJtb2RpZmllci5sZXNzIiwiLi4vLi4vc2FtcGxlcy90b29sYmFyY29uZmlndXJhdG9yL2xlc3MvYmFzZS5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFtREMsUUFBZ0M7RUF5Q2hDO0lBQ0Msd0JBQUE7OztBQzFGRjtBQUFTO0FBQU87QUFBUztBQUFZO0FBQVE7QUFBUTtBQUFRO0FBQVE7QUFBTTtBQUFNO0FBQUs7RUFDckYsY0FBQTs7QUFHRDtBQUFNO0VBQ0wsU0FBQTtFQUNBLFVBQUE7RUFDQSx3QkROK0IsdUNDTS9CO0VBQ0EsZ0JBQUE7RUFDQSxjQUFBOztBQ0hBLFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxVQUFBOztBQURELFlBQVk7RUFDWCxXQUFBOztBRnlDRCxRQUFnQztFRWpDaEM7RUFLQyxZQUFZO0VBQVosWUFBWTtFQUFaLFlBQVk7RUFBWixZQUFZO0VBQVosWUFBWTtFQUFaLFlBQVk7RUFBWixZQUFZO0VBQVosWUFBWTtFQUFaLFlBQVk7SUFKWixXQUFBOzs7QUFhRixDQUFDO0VDK1FDLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSxzQkFBQTtFRC9RRCxnQkFBQTtFQUNBLGlCQUFBO0VBQ0EsV0FBQTs7QUFJQSxDQURBLHFCQUNDO0FBQUQsZUFBQztBQUFRLENBRFQscUJBQ1U7QUFBRCxlQUFDO0VBQ1QsU0FBUyxFQUFUO0VBQ0EsY0FBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxZQUFBO0VBQ0EsY0FBQTtFQUNBLFFBQUE7RUFDQSxTQUFBOztBQUtELENBREEscUJBQ0M7QUFBRCxlQUFDO0VBQ0EsV0FBQTs7QUFJRjtFQ3FQRSw4QkFBQTtFQUNBLDJCQUFBO0VBQ0Esc0JBQUE7RURyUEQsaUJBQUE7RUFDQSxrQkFBQTs7QUFLQyxzQkFERCxFQUFDLHFCQUNDO0VBQ0EsZUFBQTs7QUFHRCxzQkFMRCxFQUFDLHFCQUtDO0VBQ0EsZ0JBQUE7O0FGcEJGLFFBQWdDO0VFMEI5QixzQkFERCxFQUFDLHFCQUNDO0lBQ0EsZ0JBQUE7O0VBR0Qsc0JBTEQsRUFBQyxxQkFLQztJQUNBLGlCQUFBOzs7QUU3RUo7RUFDQyxpQkFBQTtFQUdBLGdCQUFBOztBQUpELFNBTUM7RUFDQyxnQkFBQTs7QUp1Q0QsUUFBZ0M7RUE2Q2pDLFNJckZDO0lBSUUsa0JBQUE7OztBQVZILFNBTUMsZUFPQztFQUNDLG1CQUFBOztBQ1ZIO0VBQ0MsWUFBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLE1BQUE7RUFDQSxVQUFBO0VBQ0EsZ0JBQUE7O0FMa0NBLFFBQWdDO0VBNkNqQztJSzVFRSxrQkFBQTs7O0FBWEYsYUFjQztFQUNDLGdCQUFBO0VBQ0EsU0FBQTtFQUNBLGdCQUFBOztBQWpCRixhQWNDLEdBS0M7QUFuQkYsYUFjQyxHQUtLLEdBQUc7RUFDTixxQkFBQTs7QUxzQkYsUUFBZ0M7RUE2Q2pDLGFLekVDO0lBVUUsV0FBQTtJQUNBLHVCQUFBO0lBQ0EsbUJBQUE7SUFDQSxxQkFBQTtJQUNBLFdBQUE7O0VBRUEsYUFoQkYsR0FnQkc7RUFBUyxhQWhCWixHQWdCYTtJQUNWLGFBQUE7OztBQUtELGFBdEJGLEdBcUJFLGFBQ0M7RUFDQSxnQkFBQTs7QUxLSCxRQUFnQztFQTZDakMsYUt6RUMsR0FxQkUsYUFDQztJQUlDLGdCQUFBOzs7QUFJRixhQTlCRixHQXFCRSxhQVNDO0VBQ0EsaUJBQUE7O0FMSEgsUUFBZ0M7RUE2Q2pDLGFLekVDLEdBcUJFLGFBU0M7SUFJQyxrQkFBQTs7O0FBTUYsYUF4Q0YsR0F1Q0MsR0FDRztFQUNELGlCQUFBOztBQXZESixhQWNDLEdBdUNDLEdBS0M7RUx4Q0YsZUFBQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxvQkFBQTtFS3VDRyxpQkFBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EsaUJBQUE7RUFDQSxxQkFBQTtFQUNBLHlCQUFBOztBQUVBLGFBckRILEdBdUNDLEdBS0MsRUFTRTtFQUNBLGVBQUE7RUFDQSxXQUFBOztBQVFKLHlCQUFDO0FBQVMseUJBQUM7RUFDVixzQkFBa0IscXJCQUFsQjs7QUNwRkY7RUFDQyxpQkFBQTtFQUNBLGdCQUFBO0VBQ0EsaUJBQUE7O0FONkNBLFFBQWdDO0VBNkNqQztJTXZGRSxrQkFBQTtJQUNBLGdCQUFBO0lBR0EsVUFBQTs7O0FBVkYsYUFhQztFQUNDLFVBQUE7RUFDQSxnQkFBQTtFQUNBLFNBQUE7RUFDQSxpQkFBQTs7QUFqQkYsYUFhQyxHQU1DO0FBbkJGLGFBYUMsR0FNSyxHQUFHO0VBQ04scUJBQUE7O0FONEJGLFFBQWdDO0VBNkNqQyxhTWhGQztJQVdFLGNBQUE7SUFDQSxXQUFBO0lBQ0EscUJBQUE7OztBTnNCRixRQUFnQztFQTZDakMsYU1oRkMsR0FnQkM7SUFFRSxrQkFBQTs7O0FBR0QsYUFyQkYsR0FnQkMsR0FLRztFQUNELGlCQUFBOztBTmFILFFBQWdDO0VBNkNqQyxhTWhGQyxHQWdCQyxHQUtHO0lBSUEsY0FBQTs7O0FBdENMLGFBYUMsR0FnQkMsR0FhQztFSGtRRCw4QkFBQTtFQUNBLDJCQUFBO0VBQ0Esc0JBQUE7RUdsUUUseUJBQUE7RUFDQSxxQkFBQTtFQUNBLGFBQUE7O0FORUgsUUFBZ0M7RUE2Q2pDLGFNaEZDLEdBZ0JDLEdBYUM7SUFPRSxXQUFBO0lIK05ILHdCQUFBO0lBQWlDLG9DQUFBO0lBQ2pDLHFCQUFBO0lBQThCLDZCQUFBO0lBQzlCLGdCQUFBO0lBQXlCLDRCQUFBOzs7QUlsUjNCO0VQd0JDLGVBQUE7RUFDQSxvQkFBQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RU94QkEsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLGdCQUFBO0VBQ0EsY0FBQTs7QUFORCxTUDRFQztFQUNDLGNBQUE7RUFDQSxxQkFBQTtFQUVBLGlDQUFBOztBQUVBLFNBTkQsRUFNRTtFQUNBLGNBQUE7O0FPbkZILFNBUUM7RUFDQyxTQUFBO0VBQ0EscUJBQUE7RUFDQSxrQkFBQTs7QUNYRjtFUndCQyxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VRekJBLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxxQkFBQTs7QUFKRCxRQVNDO0VBQ0MsZ0JBQUE7O0FBVkYsUUFhQztBQWJELFFBYUs7QUFiTCxRQWFTO0FBYlQsUUFhYztBQWJkLFFBYTBCLFNBQVEsSUFBSTtBQWJ0QyxRQWF3RDtFQUN0RCxpQkFBQTs7QUFkRixRQWlCQztBQWpCRCxRQWlCTztFTCtQTCwwQkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx1QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixrQkFBQTtFQUF5Qiw0QkFBQTtFSy9QekIsZ0JBQUE7O0FBbkJGLFFBc0JDO0FBdEJELFFBc0JNO0FBdEJOLFFBc0JZO0FBdEJaLFFBc0JpQjtFQUNmLG1CQUFBOztBQXZCRixRQTBCQztBQTFCRCxRQTBCYTtFQUNYLGdCQUFBO0VBQ0EsOEJBQUE7RUFDQSxxQkFBQTs7QUE3QkYsUUFvQ0MsRVJ3Q0E7QVE1RUQsUUFvQ0ksR1J3Q0g7QVE1RUQsUUFvQ1EsR1J3Q1A7QVE1RUQsUUFvQ1ksV1J3Q1g7QVE1RUQsUUFvQ3dCLEdSd0N2QjtBUTVFRCxRQW9DNEIsR1J3QzNCO0FRNUVELFFBb0NnQyxHUndDL0I7QVE1RUQsUUFvQ29DLEdSd0NuQztBUTVFRCxRQW9Dd0MsR1J3Q3ZDO0VBQ0MsY0FBQTtFQUNBLHFCQUFBO0VBRUEsaUNBQUE7O0FBRUEsUVE5Q0QsRVJ3Q0EsRUFNRTtBQUFELFFROUNFLEdSd0NILEVBTUU7QUFBRCxRUTlDTSxHUndDUCxFQU1FO0FBQUQsUVE5Q1UsV1J3Q1gsRUFNRTtBQUFELFFROUNzQixHUndDdkIsRUFNRTtBQUFELFFROUMwQixHUndDM0IsRUFNRTtBQUFELFFROUM4QixHUndDL0IsRUFNRTtBQUFELFFROUNrQyxHUndDbkMsRUFNRTtBQUFELFFROUNzQyxHUndDdkMsRUFNRTtFQUNBLGNBQUE7O0FRbkZILFFBd0NDO0FBeENELFFBd0NLO0FBeENMLFFBd0NTO0FBeENULFFBd0NhO0FBeENiLFFBd0NpQjtFQUNmLFdBQUE7RUFDQSxnQkFBQTs7QUExQ0YsUUF3Q0MsR0FLQztBQTdDRixRQXdDSyxHQUtIO0FBN0NGLFFBd0NTLEdBS1A7QUE3Q0YsUUF3Q2EsR0FLWDtBQTdDRixRQXdDaUIsR0FLZjtBQTdDRixRQXdDQyxHQUtPO0FBN0NSLFFBd0NLLEdBS0c7QUE3Q1IsUUF3Q1MsR0FLRDtBQTdDUixRQXdDYSxHQUtMO0FBN0NSLFFBd0NpQixHQUtUO0VBQ0wsa0JBQUE7O0FBOUNILFFBd0NDLEdBVUMsRUFBQztBQWxESCxRQXdDSyxHQVVILEVBQUM7QUFsREgsUUF3Q1MsR0FVUCxFQUFDO0FBbERILFFBd0NhLEdBVVgsRUFBQztBQWxESCxRQXdDaUIsR0FVZixFQUFDO0VBQ0EsZ0JBQUE7RUFDQSxzQkFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBOztBQUdELFFBakJELEdBaUJFLE1BQ0EsRUFBQztBQURGLFFBakJHLEdBaUJGLE1BQ0EsRUFBQztBQURGLFFBakJPLEdBaUJOLE1BQ0EsRUFBQztBQURGLFFBakJXLEdBaUJWLE1BQ0EsRUFBQztBQURGLFFBakJlLEdBaUJkLE1BQ0EsRUFBQztFQUNBLFVBQUE7O0FBSUYsUUF2QkQsR0F1QkUsT0FDQTtBQURELFFBdkJHLEdBdUJGLE9BQ0E7QUFERCxRQXZCTyxHQXVCTixPQUNBO0FBREQsUUF2QlcsR0F1QlYsT0FDQTtBQURELFFBdkJlLEdBdUJkLE9BQ0E7RUx3REQsMERBQUE7RUFDQSx1REFBQTtFQUNBLHFEQUFBO0VBQ0Esa0RBQUE7RUt6REUsVUFBQTs7QUFsRUosUUF1RUM7QUF2RUQsUUF1RVE7QUF2RVIsUUF1RWdCLFNBQVEsSUFBSTtFTHlNMUIsMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RUFtQnpCLHVEQUFBO0VBQ0Esb0RBQUE7RUFDQSwrQ0FBQTtFSzVOQSxhQUFBO0VBQ0EsY0FBQTtFQUVBLHlCQUFBO0VBQ0Esa0JBQUE7O0FBRUEsUUFWRCxNQVVFO0FBQUQsUUFWTSxPQVVMO0FBQUQsUUFWYyxTQUFRLElBQUksZ0JBVXpCO0VBQ0EscUJBQUE7RUFDQSxVQUFBO0VMa05ELHdFQUFBO0VBQ0EscUVBQUE7RUFDQSxnRUFBQTs7QUt2U0YsUUE4RkM7RUFDQyw4QkFBQTtFQUNBLGVBQUE7O0FBaEdGLFFBbUdDO0VBQ0Msa0JBQUE7RUFDQSw2QlJuRzJDLHdCUW1HM0M7RVI3RUQsZUFBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBOztBUTNCRCxRQXlHQztFQUNDLGtCQUFBOztBQTFHRixRQTZHQztFUnJGQSxlQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VRb0ZDLG1CQUFBOztBQS9HRixRQWtIQztFUjFGQSxpQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSxvQkFBQTtFUXlGQyxpQkFBQTs7QUFwSEYsUUF1SEM7RVIvRkEsZUFBQTtFQUNBLGlCQUFBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFUThGQyxnQkFBQTtFQUNBLGtCQUFBOztBQTFIRixRQTZIQztFUnJHQSxpQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSxvQkFBQTtFUW9HQyxnQkFBQTtFQUNBLGtCQUFBOztBQWhJRixRQW1JQztFUjNHQSxpQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSxvQkFBQTtFUTBHQyxnQkFBQTtFQUNBLGtCQUFBOztBQXRJRixRQXlJQztFQUNDLFNBQUE7RUFDQSw2QkFBQTtFQUNBLGVBQUE7O0FBSUEsUUFERCxNQUNFO0VBQ0EsYUFBQTtFQUNBLGtCQUFBOztBQUdELFFBTkQsTUFNRTtFTDJDRCwwQkFBQTtFQUNBLHVCQUFBO0VBQ0Esa0JBQUE7O0FLbE1GLFFBNEpDO0VScElBLGVBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RVFtSUMsb0JSN0o4Qix1Q1E2SjlCO0VBQ0EsZ0JBQUE7RUxzSUEsdURBQUE7RUFDQSxvREFBQTtFQUNBLCtDQUFBOztBS3ZTRixRQXVLQyxFQUNDO0VBQ0Msc0JBQUE7O0FBektILFFBdUtDLEVBS0M7RUFDQyxjQUFBOztBQTdLSCxRQWlMQztFQUNDLFVBQUE7RUFDQSxTQUFBO0VBRUEsV0FBQTtFQUNBLGNBQUE7RUFDQSxnQkFBQTs7QUF2TEYsUUEwTEM7QUExTEQsUUEwTE07RVJsS0wsa0JBQUE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RVFrS0MsZ0pBQUE7O0FBN0xGLFFBMExDLElBS0M7QUEvTEYsUUEwTE0sS0FLSjtFQUNDLFNBQUE7O0FBaE1ILFFBcU1DLElBQUk7RUFDSCxlQUFBO0VBQ0EsY0FBQTs7QUF2TUYsUUEwTUM7RUFDQyxXQUFBOztBQTNNRixRQThNQyxHQUVDO0FBaE5GLFFBOE1LLEdBRUg7QUFoTkYsUUE4TUMsR0FFSztBQWhOTixRQThNSyxHQUVDO0VBQ0gsZ0JBQUE7O0FBak5ILFFBOE1DLEdBTUM7QUFwTkYsUUE4TUssR0FNSDtFUjVMRCxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLG9CQUFBOztBUTNCRCxRQTBOQyxTQUFRLElBQUk7RUFDWCxXQUFBOztBQTNORixRQThOQyxJQUFHO0VBQ0YsdUJBQUE7RUFDQSxhQUFBO0VBQ0EscUJBQUE7OztBQUdBLFFBTkQsSUFBRyxLQU1EO0VBQ0EsU0FBUyxNQUFUO0VBQ0EsaUJBQUE7O0FDak9ELElBREQsRUFDRTtBQUFELElBREUsT0FDRDtBQUFELElBRFUsTUFDVDtFTjJRRCwwQkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx1QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixrQkFBQTtFQUF5Qiw0QkFBQTtFSDFQMUIsZUFBQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFU25CRSxZQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EscUJBQUE7RUFDQSxxQkFBQTtFQUNBLGVBQUE7RUFDQSxTQUFBO0VBQ0Esc0JBQUE7RUFJQSxhQUFBO0VBR0EsdUJBQUE7O0FBRUEsSUF2QkYsRUFDRSxTQXNCQztBQUFELElBdkJDLE9BQ0QsU0FzQkM7QUFBRCxJQXZCUyxNQUNULFNBc0JDO0VBQ0Esa0JBQUE7O0FBR0QsSUEzQkYsRUFDRSxTQTBCQztBQUFELElBM0JDLE9BQ0QsU0EwQkM7QUFBRCxJQTNCUyxNQUNULFNBMEJDO0VBQ0EsbUJBQUE7O0FBb0JELElBaERGLEVBQ0UsU0ErQ0M7QUFBRCxJQWhEQyxPQUNELFNBK0NDO0FBQUQsSUFoRFMsTUFDVCxTQStDQztFTjRORiw0QkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx5QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixvQkFBQTtFQUF5Qiw0QkFBQTtFTTdPdkIsV0FBQTtFQUNBLFVBQUE7RUFDQSxtQkFBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTs7QUFFQSxJQXhDSCxFQUNFLFNBK0NDLGlCQVJDO0FBQUQsSUF4Q0EsT0FDRCxTQStDQyxpQkFSQztBQUFELElBeENRLE1BQ1QsU0ErQ0MsaUJBUkM7RUFDQSxrQkFBQTtFQUNBLFNBQUE7RUFDQSxRQUFBO0VBQ0EscUJBQUE7O0FUQUosUUFBZ0M7RUE2Q2pDLElTekZDLEVBQ0UsU0FtREM7RVRxQ0osSVN6RkksT0FDRCxTQW1EQztFVHFDSixJU3pGWSxNQUNULFNBbURDO0lOd05GLDRCQUFBO0lBQWlDLG9DQUFBO0lBQ2pDLHlCQUFBO0lBQThCLDZCQUFBO0lBQzlCLG9CQUFBO0lBQXlCLDRCQUFBO0lNN092QixXQUFBO0lBQ0EsVUFBQTtJQUNBLG1CQUFBO0lBQ0EsZ0JBQUE7SUFDQSxrQkFBQTtJQUNBLGtCQUFBOztFQUVBLElBeENILEVBQ0UsU0FtREMsMEJBWkM7RUFBRCxJQXhDQSxPQUNELFNBbURDLDBCQVpDO0VBQUQsSUF4Q1EsTUFDVCxTQW1EQywwQkFaQztJQUNBLGtCQUFBO0lBQ0EsU0FBQTtJQUNBLFFBQUE7SUFDQSxxQkFBQTs7RUFKRCxJQXhDSCxFQUNFLFNBbURDLDBCQVpDO0VBQUQsSUF4Q0EsT0FDRCxTQW1EQywwQkFaQztFQUFELElBeENRLE1BQ1QsU0FtREMsMEJBWkM7SUFDQSxrQkFBQTtJQUNBLFNBQUE7SUFDQSxRQUFBO0lBQ0EscUJBQUE7OztBQWNGLElBMURGLEVBQ0UsU0F5REM7QUFBRCxJQTFEQyxPQUNELFNBeURDO0FBQUQsSUExRFMsTUFDVCxTQXlEQztBQUNELElBM0RGLEVBQ0UsU0EwREM7QUFBRCxJQTNEQyxPQUNELFNBMERDO0FBQUQsSUEzRFMsTUFDVCxTQTBEQztFQUNBLFdBQUE7RUFDQSxtQkFBQTs7QUFHRCxJQWhFRixFQUNFLFNBK0RDO0FBQUQsSUFoRUMsT0FDRCxTQStEQztBQUFELElBaEVTLE1BQ1QsU0ErREM7RUFDQSxxQkFBQTtFQUNBLFVBQUE7RU4rTkYseUVBQUE7RUFDQSxzRUFBQTtFQUNBLGlFQUFBOztBTXROQSxJQTdFRCxFQTZFRTtBQUFELElBN0VFLE9BNkVEO0FBQUQsSUE3RVUsTUE2RVQ7RUFDQSxtQkFBQTs7QUFFQSxJQWhGRixFQTZFRSxjQUdDO0FBQUQsSUFoRkMsT0E2RUQsY0FHQztBQUFELElBaEZTLE1BNkVULGNBR0M7QUFDRCxJQWpGRixFQTZFRSxjQUlDO0FBQUQsSUFqRkMsT0E2RUQsY0FJQztBQUFELElBakZTLE1BNkVULGNBSUM7RUFDQSxjQUFBO0VBQ0EsbUJBQUE7O0FBSUYsSUF2RkQsRUF1RkU7QUFBRCxJQXZGRSxPQXVGRDtBQUFELElBdkZVLE1BdUZUO0FBQUQsSUF2RkQsRUhpREcsYUF4Q0gsR0FnQkMsR0FhQyxFQVdFO0FHc0NILElBdkZFLE9IaURBLGFBeENILEdBZ0JDLEdBYUMsRUFXRTtBR3NDSCxJQXZGVSxNSGlEUixhQXhDSCxHQWdCQyxHQWFDLEVBV0U7RUd1Q0YsV0FBQTtFQUNBLG1CQUFBOztBQUVBLElBM0ZGLEVBdUZFLG9CQUlDO0FBQUQsSUEzRkMsT0F1RkQsb0JBSUM7QUFBRCxJQTNGUyxNQXVGVCxvQkFJQztBQUNELElBNUZGLEVBdUZFLG9CQUtDO0FBQUQsSUE1RkMsT0F1RkQsb0JBS0M7QUFBRCxJQTVGUyxNQXVGVCxvQkFLQztBQURELElBM0ZGLEVIaURHLGFBeENILEdBZ0JDLEdBYUMsRUFXRSxNRzBDRDtBQUFELElBM0ZDLE9IaURBLGFBeENILEdBZ0JDLEdBYUMsRUFXRSxNRzBDRDtBQUFELElBM0ZTLE1IaURSLGFBeENILEdBZ0JDLEdBYUMsRUFXRSxNRzBDRDtBQUNELElBNUZGLEVIaURHLGFBeENILEdBZ0JDLEdBYUMsRUFXRSxNRzJDRDtBQUFELElBNUZDLE9IaURBLGFBeENILEdBZ0JDLEdBYUMsRUFXRSxNRzJDRDtBQUFELElBNUZTLE1IaURSLGFBeENILEdBZ0JDLEdBYUMsRUFXRSxNRzJDRDtFQUNBLFdBQUE7RUFDQSxtQkFBQTs7QUNoR0o7RVZzQkMsZUFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFR3FQQywwQkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx1QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixrQkFBQTtFQUF5Qiw0QkFBQTtFTzdRMUIsZ0NBQUE7RUFFQSxtQkFBQTtFQUNBLHFCQUFBO0VBQ0EsbUJBQUE7RUFDQSx3QkFBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VBQ0Esb0JBQUE7RUFDQSxjQUFBOztBQUVBLFVBQUM7RUFDQSxjQUFBOztBQUdELFVBQUM7RUFDQSxTQUFTLEVBQVQ7RUFDQSxRQUFBO0VBQ0EsU0FBQTtFQUNBLG1CQUFBO0VBQ0Esa0JBQUE7O0FBTUQsYUFBQztBQUFELGFBQUM7RUFDQSxVQUFBO0VBQ0EsOEJBQUE7RUFDQSx5REFBQTs7QUFNRCxhQUFDO0FBQUQsYUFBQztFQUNBLGFBQUE7RUFDQSw4QkFBQTtFQUNBLHlEQUFBOztBQU1ELGFBQUM7QUFBRCxhQUFDO0VBQ0EsVUFBQTs7QUFNRCxhQUFDO0FBQUQsYUFBQztFQUNBLFdBQUE7O0FDdkRGLGNBQWM7QUFDZCxlQUFlO0VBQ2QsU0FBUyxFQUFUO0VBQ0EscUJBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLHNCQUFBO0VBQ0EsNEJBQUE7O0FBR0QsY0FBYztFQUNiLGtCQUFBOztBQUdELGVBQWU7RUFDZCxpQkFBQTs7QUFJQSxjQUFDO0FBQVMsY0FBQztFQUNWLHNCQUFrQiw2Y0FBbEI7O0FBS0QsbUJBQUM7QUFBUyxtQkFBQztFQUNWLHNCQUFrQiw2aUJBQWxCOztBQUtELFdBQUM7QUFBUyxXQUFDO0VBQ1Ysc0JBQWtCLDZpQkFBbEI7O0FDNUJGLElBQUssUUFFSjtFQUNDLHNCQUFBOztBQUhGLElBQUssUUFNSixNQUFLO0VBQ0osZ0JBQUE7RUFDQSxxQkFBQTs7QUFSRixJQUFLLFFBV0o7RUFDQyx5QkFBQTtFQUNBLDBCQUFBOztBQUVBLElBZkcsUUFXSixNQUlFO0VBQ0EsV0FBQTs7QUFHRCxJQW5CRyxRQVdKLE1BUUU7RUFDQSxZQUFBOztBQXBCSCxJQUFLLFFBd0JKO0VBQ0MsYUFBQTs7QUFJRjtFWlpDLGVBQUE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RVlXQSxpQkFBQTtFQUNBLHlCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxxQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFVHFPQywwQkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx1QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixrQkFBQTtFQUF5Qiw0QkFBQTtFU3JPMUIsa0JBQUE7O0FBVEQsT0FXQyxNQUFLO0VBQ0osYUFBQTs7QUFaRixPQWVDO0VBQ0Msa0JBQUE7RUFDQSxVQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTs7QUFFQSxPQVBELE1BT0U7RUFDQSwwQkFBQTs7QUF2QkgsT0EyQkM7RUFDQyxXQUFBO0VBQ0Esc0JBQUE7RUFDQSxhQUFBO0VBQ0EsY0FBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTtFVDJNQSw0QkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx5QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixvQkFBQTtFQUF5Qiw0QkFBQTs7QVM5TzNCLE9BMkJDLGNBU0M7RUFDQyxnQkFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsbUJBQUE7RVRrTUQsNEJBQUE7RUFBaUMsb0NBQUE7RUFDakMseUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsb0JBQUE7RUFBeUIsNEJBQUE7O0FTak14QixPQWxCRixjQVNDLFNBU0U7RUFDQSxTQUFTLEVBQVQ7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSxNQUFBO0VBQ0EsUUFBQTtFQUNBLFdBQUE7RUFDQSxPQUFBO0VBRUEseUJBQUE7RVRnS0Ysd0NBQUE7RUFDQSxvQ0FBQTtFQUNBLGdDQUFBO0VBS0EseUNBQUE7RUFBOEMsb0NBQUE7RUFDOUMscUNBQUE7RUFBMEMsNkJBQUE7RUFDMUMsaUNBQUE7RUFBc0MsNEJBQUE7O0FTakt2QyxPQUFDLE1BQ0EsY0FBYyxTQUFRO0VBQ3JCLG1CQUFBOztBQWhFSCxPQW9FQyxNQUFLLGNBQWdCLFFBRXBCLGdCQUFnQjtFQUNmLGlCQUFBOztBQXZFSCxPQW9FQyxNQUFLLGNBQWdCLFFBU3BCLFFBQU87RUFDTixzQkFBQTtFQUNBLHNCQUFBOztBQS9FSCxPQW1GQyxNQUFLLGNBQWdCLFFBQVMsUUFBTztFQUNwQyxxQkFBQTtFQUNBLHFCQUFBOztBQ3pIRjtFVjQyQkUseUJBQUE7RUFDQSxzQkFBQTtFQUNBLHFCQUFBO0VBQ0EsaUJBQUE7O0FVLzJCRixRQUdDO0VBQ0MsZUFBQTs7QUFKRixRQU1DO0VBQ0MsZ0JBQUE7O0FBUEYsUUFVQztFQUNDLGFBQUE7O0FBR0QsUUFBQyxVQUNBO0VBQ0MsYUFBQTs7QUFGRixRQUFDLFVBS0E7RUFDQyxnQkFBQTs7QUFLSDtFQUNDLGdCQUFBOztBQUVBLGtCQUFDO0VBQ0EsU0FBQTs7QUFNRCxzQkFBQztBQUFELHVCQUFDO0FBQVMsc0JBQUM7QUFBRCx1QkFBQztFQUNWLHNCQUFrQix5c0JBQWxCOztBQUlBLHNCQURBLFdBQ0M7QUFBRCx1QkFEQSxXQUNDO0FBQVMsc0JBRFYsV0FDVztBQUFELHVCQURWLFdBQ1c7RUFDVixzQkFBa0IscXRCQUFsQjs7QUFNRixzQkFBQztBQUNELHNCQUFDO0VBQ0EsNkJBQUE7O0FBS0QsdUJBQUM7QUFDRCx1QkFBQztFQUNBLGdDQUFBOztBQ3RERjtFQUNDLGFBQUE7RUFDQSxrQkFBQTtFQUNBLHVCQUFBO0VBQ0EsZ0JBQUE7RVhzU0MsOEJBQUE7RUFDQSwyQkFBQTtFQUNBLHNCQUFBO0VXblNELHFCQUFBO0VBQ0EsbUJBQUE7RVgwdUJDLHdDQUFBO0VBQ0EscUNBQUE7RUFDQSxvQ0FBQTtFQUNBLG1DQUFBO0VBQ0EsZ0NBQUE7O0FXM3VCRCxNQUFDO0VYaVFBLDRCQUFBO0VBQWlDLG9DQUFBO0VBQ2pDLHlCQUFBO0VBQThCLDZCQUFBO0VBQzlCLG9CQUFBO0VBQXlCLDRCQUFBO0VXalF6QixlQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7RUFDQSxrQkFBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLGtCQUFBO0VBQ0EsaUJBQUE7RUFDQSxtQkFBQTs7QUN6QkYsSUFBSztBQUNMLE1BQU87QUFDUCxhQUFjO0FBQ2QsTUFBTztFQUNOLGdCQUFBOztBQUlEO0VBQ0MsZ0JBQUE7O0FBR0Q7RUFDQyw2QkFBQTs7QUNYQSxTQUFDO0VBQ0EseUJBQUE7RUFDQSxXQUFBOztBQUZELFNBQUMsSUFJQSxTQUNDO0FBTEYsU0FBQyxJQUlBLFNBQ0s7QUFMTixTQUFDLElBSUEsU0FDUztBQUxWLFNBQUMsSUFJQSxTQUNhO0FBTGQsU0FBQyxJQUlBLFNBQ2lCO0VBQ2YsV0FBQTs7QUFOSCxTQUFDLElBSUEsU0FLQztFaEJZRixlQUFBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VnQmJHLGdCQUFBOztBQVhILFNBQUMsSUFJQSxTQUtDLEVBSUM7RUFDQyxxQkFBQTtFQUNBLDhCQUFBO0VBQ0EsY0FBQTs7QUFFQSxTQWxCSCxJQUlBLFNBS0MsRUFJQyxFQUtFO0VBQ0EsY0FBQTs7QUFuQkwsU0FBQyxJQUlBLFNBb0JDO0VBQ0MsV0FBQTs7QUF6QkgsU0FBQyxJQUlBLFNBd0JDO0VBQ0MsV0FBQTs7QUE3QkgsU0FBQyxJQUlBLFNBNEJDO0VBQ0Msa0JBQUE7RUFDQSxjQUFBOztBQUtILFNBQUM7RUFDQSxrQkFBQTs7QUFFQSxTQUhBLE9BR0M7RUFDQSxXQUFBO0VBQ0EsU0FBUyxFQUFUO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLE1BQUE7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFdBQUE7O0FDdERILElBQUs7QUFDTCxNQUFPO0FBQ1AsYUFBYztBQUNkLE1BQU87RUFDTixpQkFBQTs7QUFHRCxJQUFLLGdCQUFlO0VBQ25CLGVBQUE7O0FBR0Q7RUFDQyxtQkFBQTtFQUNBLFlBQUE7RUFDQSxpQkFBQTs7QUFIRCxPQU1DO0VBRUMsa0JBQUE7RUFDQSxVQUFBO0VBQ0EsVUFBQTtFQUNBLG1CQUFBO0VBR0EsbUJBQUE7RUFDQSw0QkFBQTs7QUFFQSxPQVhELFdBV0U7RUFDQSx5REFBQTs7QUFLSCxRQUFTO0VBQ1IsZ0JBQUE7RUFDQSxTQUFBO0VBQ0Esd0JBQUE7O0FBRUEsUUFMUSxtQkFLUDtFQUNBLFlBQUE7O0FBS0YsS0FBTTtFQUNMLGdCQUFBO0VBQ0EsY0FBQTtFQUNBLDBCQUFBOztBQUdELEtBQU0sY0FBYTtFQUNsQixhQUFBOztBQUlBLFFBRFEsY0FDUDtFQUNBLGFBQUE7O0FBRkYsUUFBUyxjQUtSO0VBQ0MsYUFBQTs7QUFJRixRQUNDO0VBQ0MsaUJBQUE7O0FBSUY7RUFDQyxpQkFBQTs7QUFERCxTQUdDO0VBQ0MsV0FBQTtFQUNBLGlCQUFBOztBQUxGLFNBR0MsTUFJQztFQUNDLGdCQUFBOztBQUVBLFNBUEYsTUFJQyxTQUdFO0VBQ0EsdUJBQUE7RUFDQSxXQUFBOztBQUZELFNBUEYsTUFJQyxTQUdFLE1BSUE7RUFDQywwQkFBQTs7QUFmTCxTQUdDLE1BaUJDO0VBQ0MsV0FBQTtFQUNBLGFBQUE7O0FBR0QsU0F0QkQsTUFzQkU7RUFDQSxnQkFBQTs7QUFLSDtFQUNDLGdCQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7RUFDQSx3QkFBQTs7QUFFQSx1QkFBQztFQUNBLFlBQUE7RUFDQSxVQUFBOztBQUtGO0VBQ0MsaUJBQUE7O0FBREQsTUFHQyxJQUFHO0VBQ0YsaUJBQUE7O0FBSkYsTUFPQztFQUNDLGlCQUFBOztBQVJGLE1BT0MsY0FHQztFQUNDLGlCQUFBOztBQVhILE1BT0MsY0FPQztFQUVDLGtCQUFBOztBQWhCSCxNQW9CQztFQUNDLGtCQUFBO0VBQ0EsU0FBQTtFQUVBLFNBQUE7RUFDQSxrQkFBQTs7QWpCM0ZELFFBQWdDO0VBNkNqQyxNaUJ5Q0M7SUFVRSxVQUFBO0lBQ0EsaUJBQUE7SUFFQSxVQUFBO0lBQ0EsbUJBQUE7O0VBRUEsTUFoQkYsV0FnQkc7SUFDQSxVQUFBO0lBQ0EsV0FBQTs7O0FqQnhHSCxRQUFnQztFQTZDakMsTWlCeUNDO0lBd0JFLGFBQUE7OztBQTVDSCxNQWdEQyxlQUNDO0VBQ0MsWUFBQTtFQUNBLFlBQUE7Ozs7Ozs7Ozs7QUNySkgsUUFBUztFQUNSLG9CQUFBO0VmMjFCQyx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EscUJBQUE7RUFDQSxpQkFBQTtFZTUxQkQsZUFBQTs7QUFJRCxvQkFBcUI7RWZxZWxCLE9BQUE7RUFBUyx5QkFBQTtFQUNWLG9CQUFBO0VBQ0EsaUJBQUE7RUFDQSxZQUFBOztBZXBlRixZQUFZO0VBQ1gsa0JBQUE7RWZnZUUsT0FBQTtFQUFTLDBCQUFBO0VBQ1Ysa0JBQUE7RUFDQSxlQUFBO0VBQ0EsVUFBQTs7QWU5ZEQsWUFOVyxPQU1WO0VBQ0EsU0FBUyxFQUFUO0VBQ0EsY0FBQTtFQUNBLGtCQUFBO0VBQ0EsTUFBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0EsT0FBQTtFZndPQSwwQkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx1QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixrQkFBQTtFQUF5Qiw0QkFBQTtFQW1CekIsNENBQUE7RUFDQSx5Q0FBQTtFQUNBLG9DQUFBOztBZTVRRixZQUFZLE9Ba0JYO0Vmd1BDLHdCQUFBO0VBQ0EscUJBQUE7RUFDQSxnQkFBQTtFZXhQQSxxQkFBQTs7QUFwQkYsWUFBWSxPQXVCWDtBQXZCRCxZQUFZLE9Bd0JYO0VBQ0Msa0JBQUE7RUFDQSxVQUFBOztBQTFCRixZQUFZLE9BNkJYO0VmNk9DLHdCQUFBO0VBQ0EscUJBQUE7RUFDQSxnQkFBQTs7QWUxT0Y7RWYreUJFLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxxQkFBQTtFQUNBLGlCQUFBOztBZS95QkY7RUFDQyxjQUFBO0VBQ0Esb0JBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBOztBQUdDLFFBREQsT0FBTSxTQUNKO0VBQ0EsZUFBQTtFQUVBLHFCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxVQUFBO0VBQ0EseUJBQUE7O0FBR0QsUUFWRCxPQUFNLFNBVUo7RUFDQSxhQUFBOztBQUdELFFBZEQsT0FBTSxTQWNKO0VBQ0EsV0FBQTtFQUNBLGlCQUFBOztBQUdELFFBbkJELE9BQU0sU0FtQko7RUFDQSxZQUFBO0VBQ0EsZ0JBQUE7O0FBM0JILFFBTUMsT0FBTSxTQXdCTDtFQUNDLGNBQUE7O0FBTUgsZ0JBQWdCO0FBQ2hCLGdCQUFnQjtBQUNoQixzQkFBc0I7RUFDckIsYUFBQTs7QUFHRCxnQkFBaUI7QUFDakIsUUFBUyxPQUFNO0FBQ2YsZ0JBQWlCLFNBQVEsV0FBVztFQUNuQyxhQUFBOztBQUdELEdBQUc7RUFDRixVQUFBO0VBQ0EsZ0JBQUE7RUFDQSxXQUFBO0VBQ0Esa0JBQUE7RUFDQSxjQUFBO0VBQ0EseUJBQUE7O0FBTkQsR0FBRyxnQkFRRjtFQUNDLFNBQUE7O0FBVEYsR0FBRyxnQkFZRjtFQUNDLGFBQUE7O0FBR0QsR0FoQkUsZ0JBZ0JELGNBQWU7RUFDZixrQkFBQTtFZjBYQyxPQUFBO0VBQVMseUJBQUE7RUFDVixvQkFBQTtFQUNBLGlCQUFBO0VBQ0EsWUFBQTs7QWU5WUYsR0FBRyxnQkF1QkYsT0FBTztFQUNOLGlCQUFBOztBQUlELEdBNUJFLGdCQTRCQTtFQUNELFVBQUE7RUFDQSxTQUFBO0VBQ0EsMEJBQUE7RUFDQSxXQUFBOztBQUVBLEdBbENDLGdCQTRCQSxLQU1BO0VBQ0EsMkJBQUE7O0FBR0QsR0F0Q0MsZ0JBNEJBLEtBVUE7RUFDQSx3QkFBQTs7QUFYRixHQTVCRSxnQkE0QkEsS0FlRDtFQUNDLFVBQUE7RUFDQSxTQUFBOztBQUlELEdBakRDLGdCQTRCQSxLQXFCQztFQUNELGtCQUFBOztBQUVBLEdBcERBLGdCQTRCQSxLQXFCQyxLQUdBO0VBQ0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7O0FBR0QsR0ExREEsZ0JBNEJBLEtBcUJDLEtBU0E7QUFDRCxHQTNEQSxnQkE0QkEsS0FxQkMsS0FVQTtFQUNBLDZCQUFBOztBQUdELEdBL0RBLGdCQTRCQSxLQXFCQyxLQWNBO0VBQ0EsMEJBQUE7O0FBRUEsR0FsRUQsZ0JBNEJBLEtBcUJDLEtBY0Esc0JBR0M7RUFDQSxnQkFBQTs7QUFJRixHQXZFQSxnQkE0QkEsS0FxQkMsS0FzQkEsbUJBQW1CO0FBQ3BCLEdBeEVBLGdCQTRCQSxLQXFCQyxLQXVCQSxtQkFBbUI7QUFDcEIsR0F6RUEsZ0JBNEJBLEtBcUJDLEtBd0JBLHVCQUF1QjtBQUN4QixHQTFFQSxnQkE0QkEsS0FxQkMsS0F5QkEsdUJBQXVCO0VBQ3ZCLGdCQUFBO0VBQ0EsVUFBQTs7QUFHRCxHQS9FQSxnQkE0QkEsS0FxQkMsS0E4QkEsbUJBQW1CO0FBQ3BCLEdBaEZBLGdCQTRCQSxLQXFCQyxLQStCQSx1QkFBdUI7QUFDeEIsR0FqRkEsZ0JBNEJBLEtBcUJDLEtBZ0NBLG1CQUFtQixPQUFPO0FBQzNCLEdBbEZBLGdCQTRCQSxLQXFCQyxLQWlDQSx1QkFBdUIsT0FBTztFQUM5QixtQkFBQTs7QUFHRCxHQXRGQSxnQkE0QkEsS0FxQkMsS0FxQ0EsbUJBQW1CO0FBQ3BCLEdBdkZBLGdCQTRCQSxLQXFCQyxLQXNDQSx1QkFBdUI7RUFDdkIsbUJBQUE7O0FBR0QsR0EzRkEsZ0JBNEJBLEtBcUJDLEtBMENBO0VBTUEsbUJBQUE7O0FBTEEsR0E1RkQsZ0JBNEJBLEtBcUJDLEtBMENBLHVCQUNDO0VBQ0EsU0FBUyxFQUFUO0VBQ0EsV0FBQTs7QUFLRCxHQW5HRCxnQkE0QkEsS0FxQkMsS0EwQ0EsdUJBUUU7RUFDRCxnQkFBQTs7QUFJRixHQXhHQSxnQkE0QkEsS0FxQkMsS0F1REM7QUFBSyxHQXhHUCxnQkE0QkEsS0FxQkMsS0F1RFE7RUFDUixtQkFBQTtFQUNBLHNCQUFBOztBQXpERixHQWpEQyxnQkE0QkEsS0FxQkMsS0E2REQ7RUFDQyxpQkFBQTtFQUNBLGdCQUFBOztBQS9ERixHQWpEQyxnQkE0QkEsS0FxQkMsS0E2REQsRUFJQztFQUNDLG1CQUFBO0VBQ0EsZUFBQTs7QUFuRUgsR0FqREMsZ0JBNEJBLEtBcUJDLEtBNkRELEVBSUMsS0FJQztFQUNDLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7RWZxQ0osMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RWVyQ3JCLHNCQUFBO0VBQ0EsY0FBQTtFQUNBLGlCQUFBO0VBQ0EsWUFBQTs7QUFHQyxHQWxJSixnQkE0QkEsS0FxQkMsS0E2REQsRUFJQyxLQUlDLE9BV0UsSUFBSSxXQUNIO0FBQ0QsR0FuSUosZ0JBNEJBLEtBcUJDLEtBNkRELEVBSUMsS0FJQyxPQVdFLElBQUksV0FFSDtFQUNBLFdBQUE7RUFDQSx5QkFBQTtFQUNBLHlCQUFBOztBQUlGLEdBMUlILGdCQTRCQSxLQXFCQyxLQTZERCxFQUlDLEtBSUMsT0FvQkUsS0FBSztFQUNMLGVBQUE7RWZnUUosT0FBQTtFQUFTLHlCQUFBO0VBQ1Ysb0JBQUE7RUFDQSxpQkFBQTtFQUNBLFlBQUE7O0FlN1ZBLEdBakRDLGdCQTRCQSxLQXFCQyxLQWtHRDtFQUNDLHlCQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7O0FBckdGLEdBakRDLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DO0VBQ0Msa0JBQUE7RUFDQSxxQkFBQTtFQUdBLGNBQUE7O0FBRUEsR0FoS0YsZ0JBNEJBLEtBcUJDLEtBa0dELEdBTUMsR0FPRTtFQUNBLDBCQUFBOztBQUVBLEdBbktILGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBT0Usc0JBR0M7RUFDQSxhQUFBOztBQUpGLEdBaEtGLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBT0Usc0JBT0E7RWZSSiwwQkFBQTtFQUFpQyxvQ0FBQTtFQUNqQyx1QkFBQTtFQUE4Qiw2QkFBQTtFQUM5QixrQkFBQTtFQUF5Qiw0QkFBQTtFZVFwQixjQUFBOztBQUVBLEdBM0tKLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBT0Usc0JBT0EscUJBSUU7RUFDQSwrQkFBQTs7QUFaSCxHQWhLRixnQkE0QkEsS0FxQkMsS0FrR0QsR0FNQyxHQU9FLHNCQU9BLHFCQVFDO0VBQ0Msc0JBQUE7O0FBS0gsR0FyTEYsZ0JBNEJBLEtBcUJDLEtBa0dELEdBTUMsR0E0Qkc7QUFBSyxHQXJMVCxnQkE0QkEsS0FxQkMsS0FrR0QsR0FNQyxHQTRCVTtFQUNSLG1CQUFBO0VBQ0Esc0JBQUE7O0FBdElKLEdBakRDLGdCQTRCQSxLQXFCQyxLQWtHRCxHQU1DLEdBa0NDO0VBQ0MsVUFBQTs7QUEzSUosR0FqREMsZ0JBNEJBLEtBcUJDLEtBa0dELEdBTUMsR0FrQ0MsR0FJQztFQUNDLFVBQUE7RUFDQSxxQkFBQTtFQUNBLGVBQUE7RUFDQSxxQkFBQTs7QUFsSkwsR0FqREMsZ0JBNEJBLEtBcUJDLEtBa0dELEdBTUMsR0FrQ0MsR0FJQyxHQU9DO0VBQ0MsZUFBQTtFQUNBLG1CQUFBOztBQXZKTixHQWpEQyxnQkE0QkEsS0FxQkMsS0FrR0QsR0FNQyxHQWtDQyxHQUlDLEdBWUM7QUExSkwsR0FqREMsZ0JBNEJBLEtBcUJDLEtBa0dELEdBTUMsR0FrQ0MsR0FJQyxHQWFDO0VBQ0MsZUFBQTtFQUNBLFNBQUE7RUFDQSxzQkFBQTtFQUNBLHNCQUFBO0VDbFNQLGtCQUFBO0VBQ0EsbUJBQUE7RUFFQSxvQkFBQTtFQUNBLG9CQUFBOztBRHdTQSxHQTFORSxnQkEwTkE7RUFDRCxnQkFBQTs7QUFJRCxHQS9ORSxnQkErTkQ7RUFDQSxZQUFBO0VBQ0EsWUFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxrQkFBQTs7QUFMRCxHQS9ORSxnQkErTkQsTUFPQTtFQ3hURCxrQkFBQTtFQUNBLGtCQUFBO0VBRUEsb0JBQUE7RUFDQSxvQkFBQTtFRHNURSxxQkFBQTtFQUNBLG1CQUFBO0VBQ0EsNkJBQUE7RUFDQSxhQUFBO0VBQ0Esb0JBQUE7O0FBYkYsR0EvTkUsZ0JBK05ELE1BZ0JBO0VBRUMsb0JBQUE7RUFDQSxnQkFBQTs7QUFuQkYsR0EvTkUsZ0JBK05ELE1BZ0JBLEdBS0M7RUFDQyxpQkFBQTtFQUNBLFNBQUE7RUFDQSxxQkFBQTs7QUFHRCxHQTFQQSxnQkErTkQsTUFnQkEsR0FXRztFQUNELGtCQUFBOztBQTVCSCxHQS9ORSxnQkErTkQsTUFnQkEsR0FlQztFQUNDLFdBQUE7RUFDQSxVQUFBO0VBQ0EsV0FBQTtFQUNBLGlCQUFBO0VBQ0EsMEJBQUE7RUFDQSxtQkFBQTtFQUNBLG1CQUFBO0VmMUVGLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSxzQkFBQTs7QWVrQ0QsR0EvTkUsZ0JBK05ELE1BZ0JBLEdBZUMsR0FVQztFQUNDLGdCQUFBO0VBQ0EsWUFBQTtFQUNBLHNCQUFBOztBQTVDSixHQS9ORSxnQkErTkQsTUFnQkEsR0FnQ0M7RUFDQyxpQkFBQTtFQUNBLFlBQUE7RUFDQSxvQkFBQTs7QUFuREgsR0EvTkUsZ0JBK05ELE1BZ0JBLEdBZ0NDLEdBS0M7RUFDQyxrQkFBQTs7QUFHRCxHQXhSRCxnQkErTkQsTUFnQkEsR0FnQ0MsR0FTRTtFQUNBLFNBQVMsT0FBVDtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFNBQUE7RUFDQSxRQUFBOztBQU9MO0FBQ0EsZ0JBQWlCLFNBQVE7QUFDekI7RWZ4SUUsMEJBQUE7RUFBaUMsb0NBQUE7RUFDakMsdUJBQUE7RUFBOEIsNkJBQUE7RUFDOUIsa0JBQUE7RUFBeUIsNEJBQUE7RWV3STFCLHNCQUFBO0VDM1hBLGtCQUFBO0VBQ0EsbUJBQUE7RUFFQSxvQkFBQTtFQUNBLG9CQUFBOztBRDJYRCxnQkFBaUIsU0FBUTtBQUN6QixXQUFZO0FBQ1o7RUNqWUMsa0JBQUE7RUFDQSxtQkFBQTtFQUVBLG9CQUFBO0VBQ0Esb0JBQUE7RUQrWEEsZ0pBQUE7O0FBR0QsV0FBWTtFQUNYLFlBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTs7QUFHRCxnQkFBaUIsU0FBUTtFZi9IdkIsOEJBQUE7RUFDQSwyQkFBQTtFQUNBLHNCQUFBO0VlK0hELGNBQUE7RUFDQSxhQUFBO0VBQ0EsV0FBQTtFQUNBLGlCQUFBO0VBQ0EsU0FBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsZ0JBQUE7RUFDQSxXQUFBO0VBQ0EsZ0JBQUE7RUFDQSxpQkFBQTtFQUNBLGNBQUE7O0FBR0QsaUJBQWlCO0VBQ2hCLFVBQUE7RUFDQSxjQUFBO0VDOVpBLGVBQUE7RUFDQSxtQkFBQTtFQUVBLG1CQUFBO0VBQ0Esb0JBQUE7RURrYUEsZ0pBQUE7O0FBVkQsaUJBQWlCLGlCQUloQjtFQUNDLGNBQUE7RUFDQSxtQkFBQTs7QUFNRCxpQkFaZ0IsaUJBWWQsS0FBSTtFQUNMLG1CQUFBOzs7QUFLRjtFQUNDLG9CQUFBOztBQURELHVCQUdDLFNBQVM7RUFDUixtQkFBQTtFQUNBLGlCQUFBOztBQUxGLHVCQVFDO0VBRUMsWUFBQTtFQUdBLGdCQUFBOztBQUlGO0VBQ0MsZUFBQTtFQUNBLE1BQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTs7QUFKRCxnQkFNQztFQUNDLGlCQUFBOztBQVBGLGdCQU1DLGtCQUdDO0VBQ0MsZ0JBQUE7O0FBVkgsZ0JBTUMsa0JBR0MsT0FHQztFQUNDLGdCQUFBOztBQU9KO0VBQ0Msa0JBQUE7RUFDQSxVQUFBO0VBQ0EsVUFBQTs7QUFFQSxLQUFDO0VBQ0EsYUFBQSJ9 */ \ No newline at end of file
diff --git a/samples/img/github-top.png b/samples/img/github-top.png
new file mode 100755
index 0000000..7b9cbb1
--- /dev/null
+++ b/samples/img/github-top.png
Binary files differ
diff --git a/samples/img/header-bg.png b/samples/img/header-bg.png
new file mode 100755
index 0000000..a14166a
--- /dev/null
+++ b/samples/img/header-bg.png
Binary files differ
diff --git a/samples/img/header-separator.png b/samples/img/header-separator.png
new file mode 100755
index 0000000..8c4fb9b
--- /dev/null
+++ b/samples/img/header-separator.png
Binary files differ
diff --git a/samples/img/logo.png b/samples/img/logo.png
new file mode 100755
index 0000000..f3d4391
--- /dev/null
+++ b/samples/img/logo.png
Binary files differ
diff --git a/samples/img/logo.svg b/samples/img/logo.svg
new file mode 100755
index 0000000..f2ddabf
--- /dev/null
+++ b/samples/img/logo.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="443px" height="129px" viewBox="0 0 443 129" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
+ <title>Group</title>
+ <desc>Created with Sketch.</desc>
+ <defs></defs>
+ <g id="products-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Group">
+ <path d="M192.234,50.622 C191.867998,48.9546583 191.268171,47.4601733 190.4345,46.1385 C189.600829,44.8168267 188.584173,43.7086711 187.3845,42.814 C186.184827,41.9193289 184.863174,41.238169 183.4195,40.7705 C181.975826,40.302831 180.461008,40.069 178.875,40.069 C175.987652,40.069 173.50701,40.6179945 171.433,41.716 C169.35899,42.8140055 167.661173,44.2678243 166.3395,46.0775 C165.017827,47.8871757 164.041836,49.9306553 163.4115,52.208 C162.781164,54.4853447 162.466,56.8236547 162.466,59.223 C162.466,61.5816785 162.781164,63.9098218 163.4115,66.2075 C164.041836,68.5051782 165.017827,70.5588243 166.3395,72.3685 C167.661173,74.1781757 169.35899,75.6319945 171.433,76.73 C173.50701,77.8280055 175.987652,78.377 178.875,78.377 C180.908344,78.377 182.738325,78.0110037 184.365,77.279 C185.991675,76.5469963 187.394661,75.550673 188.574,74.29 C189.753339,73.029327 190.708996,71.5551751 191.441,69.8675 C192.173004,68.1798249 192.640666,66.3600098 192.844,64.408 L196.992,64.408 C196.707332,67.0920134 196.077005,69.5116559 195.101,71.667 C194.124995,73.8223441 192.864341,75.6523258 191.319,77.157 C189.773659,78.6616742 187.953844,79.8206626 185.8595,80.634 C183.765156,81.4473374 181.437013,81.854 178.875,81.854 C175.458983,81.854 172.459846,81.2338395 169.8775,79.9935 C167.295154,78.7531605 165.150009,77.0960104 163.442,75.022 C161.733991,72.9479896 160.453004,70.5486803 159.599,67.824 C158.744996,65.0993197 158.318,62.2323484 158.318,59.223 C158.318,56.2136516 158.744996,53.3466803 159.599,50.622 C160.453004,47.8973197 161.733991,45.4878438 163.442,43.3935 C165.150009,41.2991562 167.295154,39.6318395 169.8775,38.3915 C172.459846,37.1511605 175.458983,36.531 178.875,36.531 C180.94901,36.531 182.972157,36.8359969 184.9445,37.446 C186.916843,38.0560031 188.706159,38.9608273 190.3125,40.1605 C191.918841,41.3601727 193.260828,42.8343246 194.3385,44.583 C195.416172,46.3316754 196.097332,48.3446553 196.382,50.622 L192.234,50.622 Z M203.516,37.446 L207.664,37.446 L207.664,60.87 L232.979,37.446 L238.591,37.446 L219.132,55.441 L239.506,81 L234.138,81 L216.021,58.308 L207.664,66.055 L207.664,81 L203.516,81 L203.516,37.446 Z M243.224,37.446 L273.297,37.446 L273.297,40.984 L247.372,40.984 L247.372,56.722 L271.65,56.722 L271.65,60.26 L247.372,60.26 L247.372,77.462 L273.602,77.462 L273.602,81 L243.224,81 L243.224,37.446 Z M306.539,81 L303.001,81 L303.001,75.022 L302.879,75.022 C302.472331,76.0386717 301.872504,76.9739957 301.0795,77.828 C300.286496,78.6820043 299.381672,79.4038304 298.365,79.9935 C297.348328,80.5831696 296.260506,81.040665 295.1015,81.366 C293.942494,81.691335 292.793672,81.854 291.655,81.854 C289.255655,81.854 287.171509,81.4168377 285.4025,80.5425 C283.633491,79.6681623 282.159339,78.4685076 280.98,76.9435 C279.800661,75.4184924 278.926336,73.6495101 278.357,71.6365 C277.787664,69.6234899 277.503,67.4986779 277.503,65.262 C277.503,63.0253221 277.787664,60.9005101 278.357,58.8875 C278.926336,56.8744899 279.800661,55.1055076 280.98,53.5805 C282.159339,52.0554924 283.633491,50.8456711 285.4025,49.951 C287.171509,49.0563289 289.255655,48.609 291.655,48.609 C292.834339,48.609 293.983161,48.7513319 295.1015,49.036 C296.219839,49.3206681 297.266995,49.7578304 298.243,50.3475 C299.219005,50.9371696 300.083163,51.6589957 300.8355,52.513 C301.587837,53.3670043 302.167331,54.3633276 302.574,55.502 L302.696,55.502 L302.696,37.446 L306.539,37.446 L306.539,81 Z M281.346,65.262 C281.346,66.8886748 281.539165,68.5051586 281.9255,70.1115 C282.311835,71.7178414 282.921829,73.151327 283.7555,74.412 C284.589171,75.672673 285.65666,76.699496 286.958,77.4925 C288.25934,78.285504 289.824991,78.682 291.655,78.682 C293.688344,78.682 295.406493,78.285504 296.8095,77.4925 C298.212507,76.699496 299.351162,75.672673 300.2255,74.412 C301.099838,73.151327 301.730165,71.7178414 302.1165,70.1115 C302.502835,68.5051586 302.696,66.8886748 302.696,65.262 C302.696,63.6353252 302.502835,62.0188414 302.1165,60.4125 C301.730165,58.8061586 301.099838,57.372673 300.2255,56.112 C299.351162,54.851327 298.212507,53.824504 296.8095,53.0315 C295.406493,52.238496 293.688344,51.842 291.655,51.842 C289.824991,51.842 288.25934,52.238496 286.958,53.0315 C285.65666,53.824504 284.589171,54.851327 283.7555,56.112 C282.921829,57.372673 282.311835,58.8061586 281.9255,60.4125 C281.539165,62.0188414 281.346,63.6353252 281.346,65.262 Z M314.1,37.446 L317.943,37.446 L317.943,43.607 L314.1,43.607 L314.1,37.446 Z M314.1,49.524 L317.943,49.524 L317.943,81 L314.1,81 L314.1,49.524 Z M331.604,49.524 L338.009,49.524 L338.009,52.757 L331.604,52.757 L331.604,73.985 C331.604,75.245673 331.776832,76.2318298 332.1225,76.9435 C332.468168,77.6551702 333.332326,78.0516663 334.715,78.133 C335.813006,78.133 336.910995,78.0720006 338.009,77.95 L338.009,81.183 C337.439664,81.183 336.870336,81.2033331 336.301,81.244 C335.731664,81.2846669 335.162336,81.305 334.593,81.305 C332.030987,81.305 330.241672,80.8068383 329.225,79.8105 C328.208328,78.8141617 327.720333,76.9740134 327.761,74.29 L327.761,52.757 L322.271,52.757 L322.271,49.524 L327.761,49.524 L327.761,40.069 L331.604,40.069 L331.604,49.524 Z M357.038,51.842 C355.207991,51.842 353.601674,52.2283295 352.219,53.001 C350.836326,53.7736705 349.687505,54.790327 348.7725,56.051 C347.857495,57.311673 347.166169,58.7451586 346.6985,60.3515 C346.230831,61.9578414 345.997,63.5946583 345.997,65.262 C345.997,66.9293417 346.230831,68.5661586 346.6985,70.1725 C347.166169,71.7788414 347.857495,73.212327 348.7725,74.473 C349.687505,75.733673 350.836326,76.7503295 352.219,77.523 C353.601674,78.2956705 355.207991,78.682 357.038,78.682 C358.868009,78.682 360.474326,78.2956705 361.857,77.523 C363.239674,76.7503295 364.388495,75.733673 365.3035,74.473 C366.218505,73.212327 366.909831,71.7788414 367.3775,70.1725 C367.845169,68.5661586 368.079,66.9293417 368.079,65.262 C368.079,63.5946583 367.845169,61.9578414 367.3775,60.3515 C366.909831,58.7451586 366.218505,57.311673 365.3035,56.051 C364.388495,54.790327 363.239674,53.7736705 361.857,53.001 C360.474326,52.2283295 358.868009,51.842 357.038,51.842 Z M357.038,48.609 C359.437345,48.609 361.562157,49.0563289 363.4125,49.951 C365.262843,50.8456711 366.818327,52.0453258 368.079,53.55 C369.339673,55.0546742 370.29533,56.8134899 370.946,58.8265 C371.59667,60.8395101 371.922,62.9846553 371.922,65.262 C371.922,67.5393447 371.59667,69.6844899 370.946,71.6975 C370.29533,73.7105101 369.339673,75.4693258 368.079,76.974 C366.818327,78.4786742 365.262843,79.6681623 363.4125,80.5425 C361.562157,81.4168377 359.437345,81.854 357.038,81.854 C354.638655,81.854 352.513843,81.4168377 350.6635,80.5425 C348.813157,79.6681623 347.257673,78.4786742 345.997,76.974 C344.736327,75.4693258 343.78067,73.7105101 343.13,71.6975 C342.47933,69.6844899 342.154,67.5393447 342.154,65.262 C342.154,62.9846553 342.47933,60.8395101 343.13,58.8265 C343.78067,56.8134899 344.736327,55.0546742 345.997,53.55 C347.257673,52.0453258 348.813157,50.8456711 350.6635,49.951 C352.513843,49.0563289 354.638655,48.609 357.038,48.609 Z M377.836,49.524 L381.374,49.524 L381.374,56.905 L381.496,56.905 C382.472005,54.3429872 383.986823,52.3706736 386.0405,50.988 C388.094177,49.6053264 390.544319,48.9749994 393.391,49.097 L393.391,52.94 C391.642325,52.8586663 390.056341,53.0924973 388.633,53.6415 C387.20966,54.1905027 385.979505,54.9733283 384.9425,55.99 C383.905495,57.0066718 383.102336,58.216493 382.533,59.6195 C381.963664,61.022507 381.679,62.5576583 381.679,64.225 L381.679,81 L377.836,81 L377.836,49.524 Z M432.242,67.153 L432.242,43.912 L432.12,43.912 L416.016,67.153 L432.242,67.153 Z M412.539,66.665 L432.303,38.3 L435.78,38.3 L435.78,67.153 L442.185,67.153 L442.185,70.386 L435.78,70.386 L435.78,81 L432.242,81 L432.242,70.386 L412.539,70.386 L412.539,66.665 Z" id="ckeditor-4-txt" fill="#32373C"></path>
+ <path d="M91.3990305,18.4275908 C89.708134,21.8370406 88.7575758,25.6787251 88.7575758,29.7424242 C88.7575758,43.8256854 100.174315,55.2424242 114.257576,55.2424242 C114.439555,55.2424242 114.62109,55.240518 114.80216,55.2367244 L114.80216,90.9505846 C114.80216,95.2377717 112.514973,99.199296 108.80216,101.342889 L63.6969697,127.384383 C59.9841568,129.527977 55.4097826,129.527977 51.6969697,127.384383 L6.59177944,101.342889 C2.87896651,99.199296 0.591779435,95.2377717 0.591779435,90.9505846 L0.591779435,38.8675972 C0.591779435,34.5804101 2.87896651,30.6188859 6.59177944,28.4752923 L51.6969697,2.43379858 C55.4097826,0.290205045 59.9841568,0.290205045 63.6969697,2.43379858 L91.3990305,18.4275908 Z M32.8787879,42.2424242 C31.2219336,42.2424242 29.8787879,43.58557 29.8787879,45.2424242 L29.8787879,46.6741182 C29.8787879,48.3309725 31.2219336,49.6741182 32.8787879,49.6741182 L83.5454545,49.6741182 C85.2023088,49.6741182 86.5454545,48.3309725 86.5454545,46.6741182 L86.5454545,45.2424242 C86.5454545,43.58557 85.2023088,42.2424242 83.5454545,42.2424242 L32.8787879,42.2424242 Z M32.8787879,60.7203179 C31.2219336,60.7203179 29.8787879,62.0634637 29.8787879,63.7203179 L29.8787879,65.1520119 C29.8787879,66.8088662 31.2219336,68.1520119 32.8787879,68.1520119 L69.6110283,68.1520119 C71.2678826,68.1520119 72.6110283,66.8088662 72.6110283,65.1520119 L72.6110283,63.7203179 C72.6110283,62.0634637 71.2678826,60.7203179 69.6110283,60.7203179 L32.8787879,60.7203179 Z M32.8787879,79.1982116 C31.2219336,79.1982116 29.8787879,80.5413574 29.8787879,82.1982116 L29.8787879,83.6299056 C29.8787879,85.2867599 31.2219336,86.6299056 32.8787879,86.6299056 L83.5454545,86.6299056 C85.2023088,86.6299056 86.5454545,85.2867599 86.5454545,83.6299056 L86.5454545,82.1982116 C86.5454545,80.5413574 85.2023088,79.1982116 83.5454545,79.1982116 L32.8787879,79.1982116 Z M114.757576,50.2424242 C103.159596,50.2424242 93.7575758,40.840404 93.7575758,29.2424242 C93.7575758,17.6444445 103.159596,8.24242424 114.757576,8.24242424 C126.355556,8.24242424 135.757576,17.6444445 135.757576,29.2424242 C135.757576,40.840404 126.355556,50.2424242 114.757576,50.2424242 Z M118.332146,34.5716487 L120.545455,34.5716487 L120.545455,31.2467386 L118.309328,31.2467386 L118.309328,20.6363636 L113.722988,20.6363636 L107.151515,31.1244992 L107.151515,34.5716487 L114.749781,34.5716487 L114.749781,37.9454545 L118.332146,37.9454545 L118.332146,34.5716487 Z M114.772598,24.841397 L114.772598,31.2467386 L110.870786,31.2467386 L114.704145,24.841397 L114.772598,24.841397 Z" id="ckeditor-4" fill="#0287D0"></path>
+ </g>
+ </g>
+</svg>
diff --git a/samples/img/navigation-tip.png b/samples/img/navigation-tip.png
new file mode 100755
index 0000000..2286114
--- /dev/null
+++ b/samples/img/navigation-tip.png
Binary files differ
diff --git a/samples/index.html b/samples/index.html
new file mode 100755
index 0000000..2e47362
--- /dev/null
+++ b/samples/index.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>CKEditor Sample</title>
+ <script src="../ckeditor.js"></script>
+ <script src="js/sample.js"></script>
+ <link rel="stylesheet" href="css/samples.css">
+ <link rel="stylesheet" href="toolbarconfigurator/lib/codemirror/neo.css">
+</head>
+
+<body id="main">
+
+ <nav class="navigation-a">
+ <div class="grid-container">
+ <ul class="navigation-a-left grid-width-70">
+ <li><a href="https://ckeditor.com/ckeditor-4/">Project Homepage</a></li>
+ <li><a href="https://github.com/ckeditor/ckeditor-dev/issues">I found a bug</a></li>
+ <li><a href="https://github.com/ckeditor/ckeditor-dev"
+ class="icon-pos-right icon-navigation-a-github">Fork CKEditor on GitHub</a></li>
+ </ul>
+ <ul class="navigation-a-right grid-width-30">
+ <li><a href="https://ckeditor.com/blog/">CKEditor Blog</a></li>
+ </ul>
+ </div>
+ </nav>
+
+ <header class="header-a">
+ <div class="grid-container">
+ <h1 class="header-a-logo grid-width-30">
+ <a href="index.html"><img src="img/logo.svg" onerror="this.src='img/logo.png'; this.onerror=null;"
+ alt="CKEditor Sample"></a>
+ </h1>
+
+ <nav class="navigation-b grid-width-70">
+ <ul>
+ <li><a href="index.html" class="button-a button-a-background">Start</a></li>
+ <li><a href="toolbarconfigurator/index.html" class="button-a">Toolbar configurator <span
+ class="balloon-a balloon-a-nw">Edit your toolbar now!</span></a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <main>
+ <div class="adjoined-top">
+ <div class="grid-container">
+ <div class="content grid-width-100">
+ <h1>Congratulations!</h1>
+ <p>
+ If you can see CKEditor below, it means that the installation succeeded.
+ You can now try out your new editor version, see its features, and when you are ready to move
+ on, check some of the <a href="#sample-customize">most useful resources</a> recommended below.
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="adjoined-bottom">
+ <div class="grid-container">
+ <div class="grid-width-100">
+ <div id="editor">
+ <h1>Hello world!</h1>
+ <p>I'm an instance of <a href="https://ckeditor.com">CKEditor</a>.</p>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="grid-container">
+ <div class="content grid-width-100">
+ <section id="sample-customize">
+ <h2>Customize Your Editor</h2>
+ <p>Modular build and <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_configuration.html">numerous
+ configuration options</a> give you nearly endless possibilities to customize CKEditor.
+ Replace the content of your <code><a href="../config.js">config.js</a></code> file with the
+ following code and refresh this page (<strong>remember to clear the browser
+ cache</strong>.html)!</p>
+ <pre class="cm-s-neo CodeMirror"><code><span style="padding-right: 0.1px;"><span class="cm-variable">CKEDITOR</span>.<span class="cm-property">editorConfig</span> <span class="cm-operator">=</span> <span class="cm-keyword">function</span>( <span class="cm-def">config</span> ) {</span>
+<span style="padding-right: 0.1px;"><span class="cm-tab"> </span><span class="cm-variable-2">config</span>.<span class="cm-property">language</span> <span class="cm-operator">=</span> <span class="cm-string">'es'</span>;</span>
+<span style="padding-right: 0.1px;"><span class="cm-tab"> </span><span class="cm-variable-2">config</span>.<span class="cm-property">uiColor</span> <span class="cm-operator">=</span> <span class="cm-string">'#F7B42C'</span>;</span>
+<span style="padding-right: 0.1px;"><span class="cm-tab"> </span><span class="cm-variable-2">config</span>.<span class="cm-property">height</span> <span class="cm-operator">=</span> <span class="cm-number">300</span>;</span>
+<span style="padding-right: 0.1px;"><span class="cm-tab"> </span><span class="cm-variable-2">config</span>.<span class="cm-property">toolbarCanCollapse</span> <span class="cm-operator">=</span> <span class="cm-atom">true</span>;</span>
+<span style="padding-right: 0.1px;">};</span></code></pre>
+ </section>
+
+ <section>
+ <h2>Toolbar Configuration</h2>
+ <p>If you want to reorder toolbar buttons or remove some of them, check <a
+ href="toolbarconfigurator/index.html">this handy tool</a>!</p>
+ </section>
+
+ <section>
+ <h2>More Samples!</h2>
+ <p>Visit the <a href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">CKEditor
+ Examples</a> for a huge collection of samples showcasing editor features, with source code
+ readily available to copy and use in your own implementation.</p>
+ </section>
+
+ <section>
+ <h2>Developer's Guide</h2>
+ <p>The most important resource for all developers working with CKEditor, integrating it with their
+ websites and applications, and customizing to their needs. You can start from here:</p>
+ <ul>
+ <li><a href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_installation.html">Getting
+ Started</a> &ndash; Explains most crucial editor concepts and practices as well as the
+ installation process and integration with your website.</li>
+ <li><a href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_advanced_installation.html">Advanced
+ Installation Concepts</a> &ndash; Describes how to upgrade, install additional
+ components (plugins, skins.html), or create a custom build.</li>
+ </ul>
+ <p>When you have the basics sorted out, feel free to browse some more advanced sections like:</p>
+ <ul>
+ <li><a href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_features.html">Functionality
+ Overview</a> &ndash; Descriptions and samples of various editor features.</li>
+ <li><a href="https://ckeditor.com/docs/ckeditor4/latest/guide/plugin_sdk_intro.html">Plugin
+ SDK</a>, <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/guide/widget_sdk_intro.html">Widget
+ SDK</a>, and <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/guide/skin_sdk_intro.html">Skin SDK</a>
+ &ndash; Useful when you want to create your own editor components.</li>
+ </ul>
+ </section>
+
+ <section>
+ <h2>CKEditor JavaScript API</h2>
+ <p>CKEditor boasts a rich <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/index.html">JavaScript API</a> that you
+ can use to adjust the editor to your needs and integrate it with your website or application.
+ </p>
+ </section>
+ </div>
+ </div>
+ </main>
+
+ <footer class="footer-a grid-container">
+ <div class="grid-container">
+ <p class="grid-width-100">
+ CKEditor &ndash; The text editor for the Internet &ndash; <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p class="grid-width-100" id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> &ndash;
+ Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+ </footer>
+ <script>
+ initSample();
+ </script>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/js/sample.js b/samples/js/sample.js
new file mode 100755
index 0000000..be269fc
--- /dev/null
+++ b/samples/js/sample.js
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+/* exported initSample */
+
+if (CKEDITOR.env.ie && CKEDITOR.env.version < 9)
+ CKEDITOR.tools.enableHtml5Elements(document);
+
+// The trick to keep the editor in the sample quite small
+// unless user specified own height.
+CKEDITOR.config.height = 150;
+CKEDITOR.config.width = 'auto';
+
+var initSample = (function() {
+ var wysiwygareaAvailable = isWysiwygareaAvailable(),
+ isBBCodeBuiltIn = !!CKEDITOR.plugins.get('bbcode');
+
+ return function() {
+ var editorElement = CKEDITOR.document.getById('editor');
+
+ // :(((
+ if (isBBCodeBuiltIn) {
+ editorElement.setHtml(
+ 'Hello world!\n\n' +
+ 'I\'m an instance of [url=https://ckeditor.com]CKEditor[/url].'
+ );
+ }
+
+ // Depending on the wysiwygarea plugin availability initialize classic or inline editor.
+ if (wysiwygareaAvailable) {
+ CKEDITOR.replace('editor');
+ } else {
+ editorElement.setAttribute('contenteditable', 'true');
+ CKEDITOR.inline('editor');
+
+ // TODO we can consider displaying some info box that
+ // without wysiwygarea the classic editor may not work.
+ }
+ };
+
+ function isWysiwygareaAvailable() {
+ // If in development mode, then the wysiwygarea must be available.
+ // Split REV into two strings so builder does not replace it :D.
+ if (CKEDITOR.revision == ('%RE' + 'V%')) {
+ return true;
+ }
+
+ return !!CKEDITOR.plugins.get('wysiwygarea');
+ }
+})();
+
diff --git a/samples/js/sf.js b/samples/js/sf.js
new file mode 100755
index 0000000..1566efb
--- /dev/null
+++ b/samples/js/sf.js
@@ -0,0 +1,45 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+var SF = function() {
+ function d(a) { return (a = a.attributes ? a.attributes.getNamedItem("class") : null) ? a.value.split(" ") : [] } function c(a) { var e = document.createAttribute("class"); e.value = a.join(" "); return e } var b = { attachListener: function(a, e, b) { if (a.addEventListener) a.addEventListener(e, b, !1); else if (a.attachEvent) a.attachEvent("on" + e, function() { b.apply(a, arguments) }); else throw Error("Could not attach event."); } }; b.indexOf = function() {
+ var a = Array.prototype.indexOf; return "function" === a ? function(e, b) {
+ return a.call(e,
+ b)
+ } : function(a, b) { for (var c = a.length, d = 0; d < c; d++)if (a[d] === b) return d; return -1 }
+ }(); b.accept = function(a, e) { var c; a.children ? (c = a.children, e(a)) : "number" === typeof a.length && (c = a); for (var d = c ? c.length || 0 : 0; d--;)b.accept(c[d], e) }; b.getByClass = function() {
+ var a = document.getElementsByClassName; return "function" === typeof a ? function(e, b) { "string" === typeof e && (b = e, e = document); return a.call(e, b) } : function(a, c) {
+ "string" === typeof a && (c = a, a = document.getElementsByTagName("html")[0]); var d = []; b.accept(a, function(a) {
+ b.classList.contains(a,
+ c) && d.push(a)
+ }); return d
+ }
+ }(); b.classList = {}; b.classList.add = function(a, b) { var f = d(a); f.push(b); a.attributes.setNamedItem(c(f)) }; b.classList.remove = function(a, e) { var f = d(a, e), n = b.indexOf(f, e); -1 !== n && (f.splice(n, 1), a.attributes.setNamedItem(c(f))) }; b.classList.contains = function(a, c) { return -1 !== b.indexOf(d(a), c) }; b.classList.toggle = function(a, b) { this.contains(a, b) ? this.remove(a, b) : this.add(a, b) }; return b
+}(); "use strict";
+(function() { function d(c) { for (var b in c) delete c[b] } SF.modal = function(c) { function b(a) { 27 == a.keyCode && f.close() } c.modalClass = "modal content"; c.closeClass = "modal-close"; c.modalStyles = d; c.closeStyles = d; var a = c.afterCreate, e = c.afterClose; c.afterCreate = function(c) { a && a(c); window.addEventListener("keydown", b) }; c.afterClose = function(a) { e && e(a); window.removeEventListener("keydown", b) }; var f = (new picoModal(c)).afterCreate(c.afterCreate).afterClose(c.afterClose); return f } })(); "use strict";
+(function() {
+ for (var d = SF.getByClass("toggler"), c = d.length; c--;)SF.attachListener(d[c], "click", function() {
+ var b = SF.classList.contains(this, "icon-toggler-expanded") || SF.classList.contains(this, "icon-toggler-collapsed"), a = document.getElementById(this.getAttribute("data-for")); SF.classList.toggle(this, "collapsed"); SF.classList.contains(this, "collapsed") ? (SF.classList.add(a, "collapsed"), b && (SF.classList.remove(this, "icon-toggler-expanded"), SF.classList.add(this, "icon-toggler-collapsed"))) : (SF.classList.remove(a,
+ "collapsed"), b && (SF.classList.remove(this, "icon-toggler-collapsed"), SF.classList.add(this, "icon-toggler-expanded")))
+ })
+})(); "use strict"; (function() { for (var d = SF.getByClass("tree-a"), c = d.length; c--;)SF.attachListener(d[c], "click", function(b) { b = b.target || b.srcElement; "H2" !== b.nodeName || SF.classList.contains(b, "tree-a-no-sub") || SF.classList.toggle(b, "tree-a-active") }) })();
+(function(d, c) {
+ function b(a) { return "object" === typeof Node ? a instanceof Node : a && "object" === typeof a && "number" === typeof a.nodeType } function a() { var a = []; return { watch: a.push.bind(a), trigger: function(b) { for (var c = !0, d = { preventDefault: function() { c = !1 } }, e = 0; e < a.length; e++)a[e](b, d); return c } } } function e(a) { this.elem = a } function f(a, b) {
+ return e.div().clazz("pico-overlay").clazz(a("overlayClass", "")).stylize({ display: "block", position: "fixed", top: "0px", left: "0px", height: "100%", width: "100%", zIndex: 1E4 }).stylize(a("overlayStyles",
+ { opacity: .5, background: "#000" })).onClick(function() { a("overlayClose", !0) && b() })
+ } function n(a, b) {
+ var c = a("width", "auto"); "number" === typeof c && (c = "" + c + "px"); return e.div().clazz("pico-content").clazz(a("modalClass", "")).stylize({ display: "block", position: "fixed", zIndex: 10001, left: "50%", top: "50px", width: c, "-ms-transform": "translateX(-50%)", "-moz-transform": "translateX(-50%)", "-webkit-transform": "translateX(-50%)", "-o-transform": "translateX(-50%)", transform: "translateX(-50%)" }).stylize(a("modalStyles",
+ { backgroundColor: "white", padding: "20px", borderRadius: "5px" })).html(a("content")).attr("role", "dialog").onClick(function(a) { (new e(a.target)).anyAncestor(function(a) { return /\bpico-close\b/.test(a.elem.className) }) && b() })
+ } function p(a) { return function() { return a().elem } } function k(c) {
+ function e(a, b) { var d = c[a]; "function" === typeof d && (d = d(b)); return void 0 === d ? b : d } function k() { l().hide(); m().hide(); v.trigger(h) } function q() { w.trigger(h) && k() } function g(a) { return function() { a.apply(this, arguments); return h } }
+ function r(a) { if (!t) { var c = n(e, q), b = f(e, q), d; d = e("closeButton", !0) ? c.child().html(e("closeHtml", "\x26#xD7;")).clazz("pico-close").clazz(e("closeClass")).stylize(e("closeStyles", { borderRadius: "2px", cursor: "pointer", height: "15px", width: "15px", position: "absolute", top: "5px", right: "5px", fontSize: "16px", textAlign: "center", lineHeight: "15px", background: "#CCC" })) : void 0; t = { modal: c, overlay: b, close: d }; x.trigger(h) } return t[a] } if ("string" === typeof c || b(c)) c = { content: c }; var x = a(), y = a(), z = a(), w = a(), v = a(), t, m = r.bind(d,
+ "modal"), l = r.bind(d, "overlay"), u = r.bind(d, "close"), h = { modalElem: p(m), closeElem: p(u), overlayElem: p(l), show: function() { y.trigger(h) && (l().show(), u(), m().show(), z.trigger(h)); return this }, close: g(q), forceClose: g(k), destroy: function() { m = m().destroy(); l = l().destroy(); u = void 0 }, options: function(a) { c = a }, afterCreate: g(x.watch), beforeShow: g(y.watch), afterShow: g(z.watch), beforeClose: g(w.watch), afterClose: g(v.watch) }; return h
+ } e.div = function(a) { var b = c.createElement("div"); (a || c.body).appendChild(b); return new e(b) };
+ e.prototype = {
+ child: function() { return e.div(this.elem) }, stylize: function(a) { a = a || {}; "undefined" !== typeof a.opacity && (a.filter = "alpha(opacity\x3d" + 100 * a.opacity + ")"); for (var b in a) a.hasOwnProperty(b) && (this.elem.style[b] = a[b]); return this }, clazz: function(a) { this.elem.className += " " + a; return this }, html: function(a) { b(a) ? this.elem.appendChild(a) : this.elem.innerHTML = a; return this }, onClick: function(a) { this.elem.addEventListener("click", a); return this }, destroy: function() { c.body.removeChild(this.elem) }, hide: function() {
+ this.elem.style.display =
+ "none"
+ }, show: function() { this.elem.style.display = "block" }, attr: function(a, b) { this.elem.setAttribute(a, b); return this }, anyAncestor: function(a) { for (var b = this.elem; b;) { if (a(new e(b))) return !0; b = b.parentNode } return !1 }
+ }; "function" === typeof d.define && d.define.amd ? d.define(function() { return k }) : d.picoModal = k
+})(window, document); \ No newline at end of file
diff --git a/samples/old/ajax.html b/samples/old/ajax.html
new file mode 100755
index 0000000..4aa8474
--- /dev/null
+++ b/samples/old/ajax.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Ajax &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+ <script>
+
+ var editor, html = '';
+
+ function createEditor() {
+ if (editor)
+ return;
+
+ // Create a new editor inside the <div id="editor">, setting its value to html
+ var config = {};
+ editor = CKEDITOR.appendTo('editor', config, html);
+ }
+
+ function removeEditor() {
+ if (!editor)
+ return;
+
+ // Retrieve the editor contents. In an Ajax application, this data would be
+ // sent to the server or used in any other way.
+ document.getElementById('editorcontents').innerHTML = html = editor.getData();
+ document.getElementById('contents').style.display = '';
+
+ // Destroy the editor.
+ editor.destroy();
+ editor = null;
+ }
+
+ </script>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Create and Destroy Editor Instances for Ajax Applications
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/saveajax.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the
+ content created inside the editing
+ area will be displayed in a <code>&lt;div&gt;</code> element.
+ </p>
+ <p>
+ For details of how to create this setup check the source code of this sample page
+ for JavaScript code responsible for the creation and destruction of a CKEditor instance.
+ </p>
+ </div>
+ <p>Click the buttons to create and remove a CKEditor instance.</p>
+ <p>
+ <input onclick="createEditor();" type="button" value="Create Editor">
+ <input onclick="removeEditor();" type="button" value="Remove Editor">
+ </p>
+ <!-- This div will hold the editor. -->
+ <div id="editor">
+ </div>
+ <div id="contents" style="display: none">
+ <p>
+ Edited Contents:
+ </p>
+ <!-- This div will be used to display the editor contents. -->
+ <div id="editorcontents">
+ </div>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/api.html b/samples/old/api.html
new file mode 100755
index 0000000..5189ba5
--- /dev/null
+++ b/samples/old/api.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>API Usage &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <script>
+
+ // The instanceReady event is fired, when an instance of CKEditor has finished
+ // its initialization.
+ CKEDITOR.on('instanceReady', function (ev) {
+ // Show the editor name and description in the browser status bar.
+ document.getElementById('eMessage').innerHTML = 'Instance <code>' + ev.editor.name + '<\/code> loaded.';
+
+ // Show this sample buttons.
+ document.getElementById('eButtons').style.display = 'block';
+ });
+
+ function InsertHTML() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ var value = document.getElementById('htmlArea').value;
+
+ // Check the active editing mode.
+ if (editor.mode == 'wysiwyg') {
+ // Insert HTML code.
+ // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertHtml
+ editor.insertHtml(value);
+ }
+ else
+ alert('You must be in WYSIWYG mode!');
+ }
+
+ function InsertText() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ var value = document.getElementById('txtArea').value;
+
+ // Check the active editing mode.
+ if (editor.mode == 'wysiwyg') {
+ // Insert as plain text.
+ // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertText
+ editor.insertText(value);
+ }
+ else
+ alert('You must be in WYSIWYG mode!');
+ }
+
+ function SetContents() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ var value = document.getElementById('htmlArea').value;
+
+ // Set editor contents (replace current contents).
+ // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-setData
+ editor.setData(value);
+ }
+
+ function GetContents() {
+ // Get the editor instance that you want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+
+ // Get editor contents
+ // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getData
+ alert(editor.getData());
+ }
+
+ function ExecuteCommand(commandName) {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+
+ // Check the active editing mode.
+ if (editor.mode == 'wysiwyg') {
+ // Execute the command.
+ // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-execCommand
+ editor.execCommand(commandName);
+ }
+ else
+ alert('You must be in WYSIWYG mode!');
+ }
+
+ function CheckDirty() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ // Checks whether the current editor contents present changes when compared
+ // to the contents loaded into the editor at startup
+ // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-checkDirty
+ alert(editor.checkDirty());
+ }
+
+ function ResetDirty() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ // Resets the "dirty state" of the editor (see CheckDirty())
+ // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-resetDirty
+ editor.resetDirty();
+ alert('The "IsDirty" status has been reset');
+ }
+
+ function Focus() {
+ CKEDITOR.instances.editor1.focus();
+ }
+
+ function onFocus() {
+ document.getElementById('eMessage').innerHTML = '<b>' + this.name + ' is focused </b>';
+ }
+
+ function onBlur() {
+ document.getElementById('eMessage').innerHTML = this.name + ' lost focus';
+ }
+
+ </script>
+
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Using CKEditor JavaScript API
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/api.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to use the
+ <a class="samples" href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html">CKEditor
+ JavaScript API</a>
+ to interact with the editor at runtime.
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+
+ <!-- This <div> holds alert messages to be display in the sample page. -->
+ <div id="alerts">
+ <noscript>
+ <p>
+ <strong>CKEditor requires JavaScript to run</strong>. In a browser with no JavaScript
+ support, like yours, you should still see the contents (HTML data) and you should
+ be able to edit it normally, without a rich editor interface.
+ </p>
+ </noscript>
+ </div>
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <textarea cols="100" id="editor1" name="editor1"
+ rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+
+ <script>
+ // Replace the <textarea id="editor1"> with an CKEditor instance.
+ CKEDITOR.replace('editor1', {
+ on: {
+ focus: onFocus,
+ blur: onBlur,
+
+ // Check for availability of corresponding plugins.
+ pluginsLoaded: function (evt) {
+ var doc = CKEDITOR.document, ed = evt.editor;
+ if (!ed.getCommand('bold'))
+ doc.getById('exec-bold').hide();
+ if (!ed.getCommand('link'))
+ doc.getById('exec-link').hide();
+ }
+ }
+ });
+ </script>
+
+ <p id="eMessage">
+ </p>
+
+ <div id="eButtons" style="display: none">
+ <input id="exec-bold" onclick="ExecuteCommand('bold');" type="button"
+ value="Execute &quot;bold&quot; Command">
+ <input id="exec-link" onclick="ExecuteCommand('link');" type="button"
+ value="Execute &quot;link&quot; Command">
+ <input onclick="Focus();" type="button" value="Focus">
+ <br><br>
+ <input onclick="InsertHTML();" type="button" value="Insert HTML">
+ <input onclick="SetContents();" type="button" value="Set Editor Contents">
+ <input onclick="GetContents();" type="button" value="Get Editor Contents (HTML)">
+ <br>
+ <textarea cols="100" id="htmlArea"
+ rows="3">&lt;h2&gt;Test&lt;/h2&gt;&lt;p&gt;This is some &lt;a href="/Test1.html"&gt;sample&lt;/a&gt; HTML code.&lt;/p&gt;</textarea>
+ <br>
+ <br>
+ <input onclick="InsertText();" type="button" value="Insert Text">
+ <br>
+ <textarea cols="100" id="txtArea" rows="3"> First line with some leading whitespaces.
+
+Second line of text preceded by two line breaks.</textarea>
+ <br>
+ <br>
+ <input onclick="CheckDirty();" type="button" value="checkDirty()">
+ <input onclick="ResetDirty();" type="button" value="resetDirty()">
+ </div>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/appendto.html b/samples/old/appendto.html
new file mode 100755
index 0000000..f1fb094
--- /dev/null
+++ b/samples/old/appendto.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Append To Page Element Using JavaScript Code &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Append To Page Element Using JavaScript Code
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">brand new samples in CKEditor
+ Examples</a>.
+ </div>
+ <div id="section1">
+ <div class="description">
+ <p>
+ The
+ <code><a class="samples" href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTo">CKEDITOR.appendTo()</a></code>
+ method serves to to place editors inside existing DOM elements. Unlike
+ <code><a class="samples" href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-replace">CKEDITOR.replace()</a></code>,
+ a target container to be replaced is no longer necessary. A new editor
+ instance is inserted directly wherever it is desired.
+ </p>
+ <pre class="samples">CKEDITOR.appendTo( '<em>container_id</em>',
+ { /* Configuration options to be used. */ }
+ 'Editor content to be used.'
+);</pre>
+ </div>
+ <script>
+
+ // This call can be placed at any point after the
+ // DOM element to append CKEditor to or inside the <head><script>
+ // in a window.onload event handler.
+
+ // Append a CKEditor instance using the default configuration and the
+ // provided content to the <div> element of ID "section1".
+ CKEDITOR.appendTo('section1',
+ null,
+ '<p>This is some <strong>sample text</strong>. You are using <a href="https://ckeditor.com/">CKEditor</a>.</p>'
+ );
+
+ </script>
+ </div>
+ <br>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/assets/inlineall/logo.png b/samples/old/assets/inlineall/logo.png
new file mode 100755
index 0000000..b4d5979
--- /dev/null
+++ b/samples/old/assets/inlineall/logo.png
Binary files differ
diff --git a/samples/old/assets/outputxhtml/outputxhtml.css b/samples/old/assets/outputxhtml/outputxhtml.css
new file mode 100755
index 0000000..17595fb
--- /dev/null
+++ b/samples/old/assets/outputxhtml/outputxhtml.css
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ *
+ * Styles used by the XHTML 1.1 sample page (xhtml.html).
+ */
+
+/**
+ * Basic definitions for the editing area.
+ */
+body {
+ font-family: Arial, Verdana, sans-serif;
+ font-size: 80%;
+ color: #000000;
+ background-color: #ffffff;
+ padding: 5px;
+ margin: 0px;
+}
+
+/**
+ * Core styles.
+ */
+
+.Bold {
+ font-weight: bold;
+}
+
+.Italic {
+ font-style: italic;
+}
+
+.Underline {
+ text-decoration: underline;
+}
+
+.StrikeThrough {
+ text-decoration: line-through;
+}
+
+.Subscript {
+ vertical-align: sub;
+ font-size: smaller;
+}
+
+.Superscript {
+ vertical-align: super;
+ font-size: smaller;
+}
+
+/**
+ * Font faces.
+ */
+
+.FontComic {
+ font-family: 'Comic Sans MS';
+}
+
+.FontCourier {
+ font-family: 'Courier New';
+}
+
+.FontTimes {
+ font-family: 'Times New Roman';
+}
+
+/**
+ * Font sizes.
+ */
+
+.FontSmaller {
+ font-size: smaller;
+}
+
+.FontLarger {
+ font-size: larger;
+}
+
+.FontSmall {
+ font-size: 8pt;
+}
+
+.FontBig {
+ font-size: 14pt;
+}
+
+.FontDouble {
+ font-size: 200%;
+}
+
+/**
+ * Font colors.
+ */
+.FontColor1 {
+ color: #ff9900;
+}
+
+.FontColor2 {
+ color: #0066cc;
+}
+
+.FontColor3 {
+ color: #ff0000;
+}
+
+.FontColor1BG {
+ background-color: #ff9900;
+}
+
+.FontColor2BG {
+ background-color: #0066cc;
+}
+
+.FontColor3BG {
+ background-color: #ff0000;
+}
+
+/**
+ * Indentation.
+ */
+
+.Indent1 {
+ margin-left: 40px;
+}
+
+.Indent2 {
+ margin-left: 80px;
+}
+
+.Indent3 {
+ margin-left: 120px;
+}
+
+/**
+ * Alignment.
+ */
+
+.JustifyLeft {
+ text-align: left;
+}
+
+.JustifyRight {
+ text-align: right;
+}
+
+.JustifyCenter {
+ text-align: center;
+}
+
+.JustifyFull {
+ text-align: justify;
+}
+
+/**
+ * Other.
+ */
+
+code {
+ font-family: courier, monospace;
+ background-color: #eeeeee;
+ padding-left: 1px;
+ padding-right: 1px;
+ border: #c0c0c0 1px solid;
+}
+
+kbd {
+ padding: 0px 1px 0px 1px;
+ border-width: 1px 2px 2px 1px;
+ border-style: solid;
+}
+
+blockquote {
+ color: #808080;
+} \ No newline at end of file
diff --git a/samples/old/assets/posteddata.php b/samples/old/assets/posteddata.php
new file mode 100755
index 0000000..37e9bb6
--- /dev/null
+++ b/samples/old/assets/posteddata.php
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<?php
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+?>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Sample &mdash; CKEditor</title>
+ <link rel="stylesheet" href="sample.css">
+</head>
+<body>
+ <h1 class="samples">
+ CKEditor &mdash; Posted Data
+ </h1>
+ <table border="1" cellspacing="0" id="outputSample">
+ <colgroup><col width="120"></colgroup>
+ <thead>
+ <tr>
+ <th>Field&nbsp;Name</th>
+ <th>Value</th>
+ </tr>
+ </thead>
+<?php
+
+if (!empty($_POST))
+{
+ foreach ( $_POST as $key => $value )
+ {
+ if ( ( !is_string($value) && !is_numeric($value) ) || !is_string($key) )
+ continue;
+
+ if ( get_magic_quotes_gpc() )
+ $value = htmlspecialchars( stripslashes((string)$value) );
+ else
+ $value = htmlspecialchars( (string)$value );
+?>
+ <tr>
+ <th style="vertical-align: top"><?php echo htmlspecialchars( (string)$key ); ?></th>
+ <td><pre class="samples"><?php echo $value; ?></pre></td>
+ </tr>
+ <?php
+ }
+}
+?>
+ </table>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/samples/old/assets/sample.jpg b/samples/old/assets/sample.jpg
new file mode 100755
index 0000000..9498271
--- /dev/null
+++ b/samples/old/assets/sample.jpg
Binary files differ
diff --git a/samples/old/assets/uilanguages/languages.js b/samples/old/assets/uilanguages/languages.js
new file mode 100755
index 0000000..6c147b3
--- /dev/null
+++ b/samples/old/assets/uilanguages/languages.js
@@ -0,0 +1,7 @@
+/*
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",az:"Azerbaijani",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German","de-ch":"German (Switzerland)",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish","es-mx":"Spanish (Mexico)",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fo:"Faroese",fr:"French","fr-ca":"French (Canada)",gl:"Galician",
+gu:"Gujarati",he:"Hebrew",hi:"Hindi",hr:"Croatian",hu:"Hungarian",id:"Indonesian",is:"Icelandic",it:"Italian",ja:"Japanese",ka:"Georgian",km:"Khmer",ko:"Korean",ku:"Kurdish",lt:"Lithuanian",lv:"Latvian",mk:"Macedonian",mn:"Mongolian",ms:"Malay",nb:"Norwegian Bokmal",nl:"Dutch",no:"Norwegian",oc:"Occitan",pl:"Polish",pt:"Portuguese (Portugal)","pt-br":"Portuguese (Brazil)",ro:"Romanian",ru:"Russian",si:"Sinhala",sk:"Slovak",sq:"Albanian",sl:"Slovenian",sr:"Serbian (Cyrillic)","sr-latn":"Serbian (Latin)",
+sv:"Swedish",th:"Thai",tr:"Turkish",tt:"Tatar",ug:"Uighur",uk:"Ukrainian",vi:"Vietnamese",zh:"Chinese Traditional","zh-cn":"Chinese Simplified"},b=[],a;for(a in CKEDITOR.lang.languages)b.push({code:a,name:c[a]||a});b.sort(function(a,b){return a.name<b.name?-1:1});return b}(); \ No newline at end of file
diff --git a/samples/old/datafiltering.html b/samples/old/datafiltering.html
new file mode 100755
index 0000000..2ea51b9
--- /dev/null
+++ b/samples/old/datafiltering.html
@@ -0,0 +1,522 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Data Filtering &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+ <script>
+ // Remove advanced tabs for all editors.
+ CKEDITOR.config.removeDialogTabs = 'image:advanced;link:advanced;flash:advanced;creatediv:advanced;editdiv:advanced';
+ </script>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Data Filtering and Features Activation
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/acf.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample page demonstrates the idea of Advanced Content Filter
+ (<abbr title="Advanced Content Filter">ACF</abbr>), a sophisticated
+ tool that takes control over what kind of data is accepted by the editor and what
+ kind of output is produced.
+ </p>
+ <h2>When and what is being filtered?</h2>
+ <p>
+ <abbr title="Advanced Content Filter">ACF</abbr> controls
+ <strong>every single source of data</strong> that comes to the editor.
+ It process both HTML that is inserted manually (i.e. pasted by the user)
+ and programmatically like:
+ </p>
+ <pre class="samples">
+editor.setData( '&lt;p&gt;Hello world!&lt;/p&gt;' );
+</pre>
+ <p>
+ <abbr title="Advanced Content Filter">ACF</abbr> discards invalid,
+ useless HTML tags and attributes so the editor remains "clean" during
+ runtime. <abbr title="Advanced Content Filter">ACF</abbr> behaviour
+ can be configured and adjusted for a particular case to prevent the
+ output HTML (i.e. in CMS systems) from being polluted.
+
+ This kind of filtering is a first, client-side line of defense
+ against "<a href="http://en.wikipedia.org/wiki/Tag_soup">tag soups</a>",
+ the tool that precisely restricts which tags, attributes and styles
+ are allowed (desired). When properly configured, <abbr title="Advanced Content Filter">ACF</abbr>
+ is an easy and fast way to produce a high-quality, intentionally filtered HTML.
+ </p>
+
+ <h3>How to configure or disable ACF?</h3>
+ <p>
+ Advanced Content Filter is enabled by default, working in "automatic mode", yet
+ it provides a set of easy rules that allow adjusting filtering rules
+ and disabling the entire feature when necessary. The config property
+ responsible for this feature is
+ <code><a class="samples"
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent">config.allowedContent</a></code>.
+ </p>
+ <p>
+ By "automatic mode" is meant that loaded plugins decide which kind
+ of content is enabled and which is not. For example, if the link
+ plugin is loaded it implies that <code>&lt;a&gt;</code> tag is
+ automatically allowed. Each plugin is given a set
+ of predefined <abbr title="Advanced Content Filter">ACF</abbr> rules
+ that control the editor until <code><a class="samples"
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent">
+ config.allowedContent</a></code>
+ is defined manually.
+ </p>
+ <p>
+ Let's assume our intention is to restrict the editor to accept (produce) <strong>paragraphs
+ only: no attributes, no styles, no other tags</strong>.
+ With <abbr title="Advanced Content Filter">ACF</abbr>
+ this is very simple. Basically set <code><a class="samples"
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent">
+ config.allowedContent</a></code> to <code>'p'</code>:
+ </p>
+ <pre class="samples">
+var editor = CKEDITOR.replace( <em>textarea_id</em>, {
+ <strong>allowedContent: 'p'</strong>
+} );
+</pre>
+ <p>
+ Now try to play with allowed content:
+ </p>
+ <pre class="samples">
+// Trying to insert disallowed tag and attribute.
+editor.setData( '&lt;p <strong>style="color: red"</strong>&gt;Hello <strong>&lt;em&gt;world&lt;/em&gt;</strong>!&lt;/p&gt;' );
+alert( editor.getData() );
+
+// Filtered data is returned.
+"&lt;p&gt;Hello world!&lt;/p&gt;"
+</pre>
+ <p>
+ What happened? Since <code>config.allowedContent: 'p'</code> is set the editor assumes
+ that only plain <code>&lt;p&gt;</code> are accepted. Nothing more. This is why
+ <code>style</code> attribute and <code>&lt;em&gt;</code> tag are gone. The same
+ filtering would happen if we pasted disallowed HTML into this editor.
+ </p>
+ <p>
+ This is just a small sample of what <abbr title="Advanced Content Filter">ACF</abbr>
+ can do. To know more, please refer to the sample section below and
+ <a href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_advanced_content_filter.html">the official
+ Advanced Content Filter guide</a>.
+ </p>
+ <p>
+ You may, of course, want CKEditor to avoid filtering of any kind.
+ To get rid of <abbr title="Advanced Content Filter">ACF</abbr>,
+ basically set <code><a class="samples"
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent">
+ config.allowedContent</a></code> to <code>true</code> like this:
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( <em>textarea_id</em>, {
+ <strong>allowedContent: true</strong>
+} );
+</pre>
+
+ <h2>Beyond data flow: Features activation</h2>
+ <p>
+ <abbr title="Advanced Content Filter">ACF</abbr> is far more than
+ <abbr title="Input/Output">I/O</abbr> control: the entire
+ <abbr title="User Interface">UI</abbr> of the editor is adjusted to what
+ filters restrict. For example: if <code>&lt;a&gt;</code> tag is
+ <strong>disallowed</strong>
+ by <abbr title="Advanced Content Filter">ACF</abbr>,
+ then accordingly <code>link</code> command, toolbar button and link dialog
+ are also disabled. Editor is smart: it knows which features must be
+ removed from the interface to match filtering rules.
+ </p>
+ <p>
+ CKEditor can be far more specific. If <code>&lt;a&gt;</code> tag is
+ <strong>allowed</strong> by filtering rules to be used but it is restricted
+ to have only one attribute (<code>href</code>)
+ <code>config.allowedContent = 'a[!href]'</code>, then
+ "Target" tab of the link dialog is automatically disabled as <code>target</code>
+ attribute isn't included in <abbr title="Advanced Content Filter">ACF</abbr> rules
+ for <code>&lt;a&gt;</code>. This behaviour applies to dialog fields, context
+ menus and toolbar buttons.
+ </p>
+
+ <h2>Sample configurations</h2>
+ <p>
+ There are several editor instances below that present different
+ <abbr title="Advanced Content Filter">ACF</abbr> setups. <strong>All of them,
+ except the inline instance, share the same HTML content</strong> to visualize
+ how different filtering rules affect the same input data.
+ </p>
+ </div>
+
+ <div>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <div class="description">
+ <p>
+ This editor is using default configuration ("automatic mode"). It means that
+ <code><a class="samples"
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent">
+ config.allowedContent</a></code> is defined by loaded plugins.
+ Each plugin extends filtering rules to make it's own associated content
+ available for the user.
+ </p>
+ </div>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+
+ <script>
+
+ CKEDITOR.replace('editor1');
+
+ </script>
+ </div>
+
+ <br>
+
+ <div>
+ <label for="editor2">
+ Editor 2:
+ </label>
+ <div class="description">
+ <p>
+ This editor is using a custom configuration for
+ <abbr title="Advanced Content Filter">ACF</abbr>:
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( 'editor2', {
+ allowedContent:
+ 'h1 h2 h3 p blockquote strong em;' +
+ 'a[!href];' +
+ 'img(left,right)[!src,alt,width,height];' +
+ 'table tr th td caption;' +
+ 'span{!font-family};' +'
+ 'span{!color};' +
+ 'span(!marker);' +
+ 'del ins'
+} );
+</pre>
+ <p>
+ The following rules may require additional explanation:
+ </p>
+ <ul>
+ <li>
+ <code>h1 h2 h3 p blockquote strong em</code> - These tags
+ are accepted by the editor. Any tag attributes will be discarded.
+ </li>
+ <li>
+ <code>a[!href]</code> - <code>href</code> attribute is obligatory
+ for <code>&lt;a&gt;</code> tag. Tags without this attribute
+ are disarded. No other attribute will be accepted.
+ </li>
+ <li>
+ <code>img(left,right)[!src,alt,width,height]</code> - <code>src</code>
+ attribute is obligatory for <code>&lt;img&gt;</code> tag.
+ <code>alt</code>, <code>width</code>, <code>height</code>
+ and <code>class</code> attributes are accepted but
+ <code>class</code> must be either <code>class="left"</code>
+ or <code>class="right"</code>
+ </li>
+ <li>
+ <code>table tr th td caption</code> - These tags
+ are accepted by the editor. Any tag attributes will be discarded.
+ </li>
+ <li>
+ <code>span{!font-family}</code>, <code>span{!color}</code>,
+ <code>span(!marker)</code> - <code>&lt;span&gt;</code> tags
+ will be accepted if either <code>font-family</code> or
+ <code>color</code> style is set or <code>class="marker"</code>
+ is present.
+ </li>
+ <li>
+ <code>del ins</code> - These tags
+ are accepted by the editor. Any tag attributes will be discarded.
+ </li>
+ </ul>
+ <p>
+ Please note that <strong><abbr title="User Interface">UI</abbr> of the
+ editor is different</strong>. It's a response to what happened to the filters.
+ Since <code>text-align</code> isn't allowed, the align toolbar is gone.
+ The same thing happened to subscript/superscript, strike, underline
+ (<code>&lt;u&gt;</code>, <code>&lt;sub&gt;</code>, <code>&lt;sup&gt;</code>
+ are disallowed by <code><a class="samples"
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent">
+ config.allowedContent</a></code>) and many other buttons.
+ </p>
+ </div>
+ <textarea cols="80" id="editor2" name="editor2" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ CKEDITOR.replace('editor2', {
+ allowedContent:
+ 'h1 h2 h3 p blockquote strong em;' +
+ 'a[!href];' +
+ 'img(left,right)[!src,alt,width,height];' +
+ 'table tr th td caption;' +
+ 'span{!font-family};' +
+ 'span{!color};' +
+ 'span(!marker);' +
+ 'del ins'
+ });
+
+ </script>
+ </div>
+
+ <br>
+
+ <div>
+ <label for="editor3">
+ Editor 3:
+ </label>
+ <div class="description">
+ <p>
+ This editor is using a custom configuration for
+ <abbr title="Advanced Content Filter">ACF</abbr>.
+ Note that filters can be configured as an object literal
+ as an alternative to a string-based definition.
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( 'editor3', {
+ allowedContent: {
+ 'b i ul ol big small': true,
+ 'h1 h2 h3 p blockquote li': {
+ styles: 'text-align'
+ },
+ a: { attributes: '!href,target' },
+ img: {
+ attributes: '!src,alt',
+ styles: 'width,height',
+ classes: 'left,right'
+ }
+ }
+} );
+</pre>
+ </div>
+ <textarea cols="80" id="editor3" name="editor3" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ CKEDITOR.replace('editor3', {
+ allowedContent: {
+ 'b i ul ol big small': true,
+ 'h1 h2 h3 p blockquote li': {
+ styles: 'text-align'
+ },
+ a: {attributes: '!href,target'},
+ img: {
+ attributes: '!src,alt',
+ styles: 'width,height',
+ classes: 'left,right'
+ }
+ }
+ });
+
+ </script>
+ </div>
+
+ <br>
+
+ <div>
+ <label for="editor4">
+ Editor 4:
+ </label>
+ <div class="description">
+ <p>
+ This editor is using a custom set of plugins and buttons.
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( 'editor4', {
+ removePlugins: 'bidi,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',
+ removeButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',
+ format_tags: 'p;h1;h2;h3;pre;address'
+} );
+</pre>
+ <p>
+ As you can see, removing plugins and buttons implies filtering.
+ Several tags are not allowed in the editor because there's no
+ plugin/button that is responsible for creating and editing this
+ kind of content (for example: the image is missing because
+ of <code>removeButtons: 'Image'</code>). The conclusion is that
+ <abbr title="Advanced Content Filter">ACF</abbr> works "backwards"
+ as well: <strong>modifying <abbr title="User Interface">UI</abbr>
+ elements is changing allowed content rules</strong>.
+ </p>
+ </div>
+ <textarea cols="80" id="editor4" name="editor4" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ CKEDITOR.replace('editor4', {
+ removePlugins: 'bidi,div,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',
+ removeButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',
+ format_tags: 'p;h1;h2;h3;pre;address'
+ });
+
+ </script>
+ </div>
+
+ <br>
+
+ <div>
+ <label for="editor5">
+ Editor 5:
+ </label>
+ <div class="description">
+ <p>
+ This editor is built on editable <code>&lt;h1&gt;</code> element.
+ <abbr title="Advanced Content Filter">ACF</abbr> takes care of
+ what can be included in <code>&lt;h1&gt;</code>. Note that there
+ are no block styles in Styles combo. Also why lists, indentation,
+ blockquote, div, form and other buttons are missing.
+ </p>
+ <p>
+ <abbr title="Advanced Content Filter">ACF</abbr> makes sure that
+ no disallowed tags will come to <code>&lt;h1&gt;</code> so the final
+ markup is valid. If the user tried to paste some invalid HTML
+ into this editor (let's say a list), it would be automatically
+ converted into plain text.
+ </p>
+ </div>
+ <h1 id="editor5" contenteditable="true">
+ <em>Apollo 11</em> was the spaceflight that landed the first humans, Americans <a
+ href="http://en.wikipedia.org/wiki/Neil_Armstrong" title="Neil Armstrong">Neil Armstrong</a> and <a
+ href="http://en.wikipedia.org/wiki/Buzz_Aldrin" title="Buzz Aldrin">Buzz Aldrin</a>, on the Moon on July
+ 20, 1969, at 20:18 UTC.
+ </h1>
+ </div>
+
+ <br>
+
+ <div>
+ <label for="editor3">
+ Editor 6:
+ </label>
+ <div class="description">
+ <p>
+ This editor is using a custom configuration for <abbr title="Advanced Content Filter">ACF</abbr>.
+ It's using the <a href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_disallowed_content.html"
+ rel="noopener noreferrer" target="_blank">
+ Disallowed Content</a> property of the filter to eliminate all <code>title</code> attributes.
+ </p>
+
+ <pre class="samples">
+CKEDITOR.replace( 'editor6', {
+ allowedContent: {
+ 'b i ul ol big small': true,
+ 'h1 h2 h3 p blockquote li': {
+ styles: 'text-align'
+ },
+ a: {attributes: '!href,target'},
+ img: {
+ attributes: '!src,alt',
+ styles: 'width,height',
+ classes: 'left,right'
+ }
+ },
+ disallowedContent: '*{title*}'
+} );
+</pre>
+ </div>
+ <textarea cols="80" id="editor6" name="editor6" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ CKEDITOR.replace('editor6', {
+ allowedContent: {
+ 'b i ul ol big small': true,
+ 'h1 h2 h3 p blockquote li': {
+ styles: 'text-align'
+ },
+ a: {attributes: '!href,target'},
+ img: {
+ attributes: '!src,alt',
+ styles: 'width,height',
+ classes: 'left,right'
+ }
+ },
+ disallowedContent: '*{title*}'
+ });
+
+ </script>
+ </div>
+
+ <br>
+
+ <div>
+ <label for="editor7">
+ Editor 7:
+ </label>
+ <div class="description">
+ <p>
+ This editor is using a custom configuration for <abbr title="Advanced Content Filter">ACF</abbr>.
+ It's using the <a href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_disallowed_content.html"
+ rel="noopener noreferrer" target="_blank">
+ Disallowed Content</a> property of the filter to eliminate all <code>a</code> and <code>img</code>
+ tags,
+ while allowing all other tags.
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( 'editor7', {
+ allowedContent: {
+ // Allow all content.
+ $1: {
+ elements: CKEDITOR.dtd,
+ attributes: true,
+ styles: true,
+ classes: true
+ }
+ },
+ disallowedContent: 'img a'
+} );
+</pre>
+ </div>
+ <textarea cols="80" id="editor7" name="editor7" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ CKEDITOR.replace('editor7', {
+ allowedContent: {
+ // allow all content
+ $1: {
+ elements: CKEDITOR.dtd,
+ attributes: true,
+ styles: true,
+ classes: true
+ }
+ },
+ disallowedContent: 'img a'
+ });
+
+ </script>
+ </div>
+
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/dialog/assets/my_dialog.js b/samples/old/dialog/assets/my_dialog.js
new file mode 100755
index 0000000..2a3bd8d
--- /dev/null
+++ b/samples/old/dialog/assets/my_dialog.js
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+CKEDITOR.dialog.add('myDialog', function() {
+ return {
+ title: 'My Dialog',
+ minWidth: 400,
+ minHeight: 200,
+ contents: [
+ {
+ id: 'tab1',
+ label: 'First Tab',
+ title: 'First Tab',
+ elements: [
+ {
+ id: 'input1',
+ type: 'text',
+ label: 'Text Field'
+ },
+ {
+ id: 'select1',
+ type: 'select',
+ label: 'Select Field',
+ items: [
+ ['option1', 'value1'],
+ ['option2', 'value2']
+ ]
+ }
+ ]
+ },
+ {
+ id: 'tab2',
+ label: 'Second Tab',
+ title: 'Second Tab',
+ elements: [
+ {
+ id: 'button1',
+ type: 'button',
+ label: 'Button Field'
+ }
+ ]
+ }
+ ]
+ };
+});
+
diff --git a/samples/old/dialog/dialog.html b/samples/old/dialog/dialog.html
new file mode 100755
index 0000000..b6d2309
--- /dev/null
+++ b/samples/old/dialog/dialog.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Using API to Customize Dialog Windows &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <link rel="stylesheet" href="../../../samples/old/sample.css">
+ <meta name="ckeditor-sample-name" content="Using the JavaScript API to customize dialog windows">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description"
+ content="Using the dialog windows API to customize dialog windows without changing the original editor code.">
+ <style>
+ .cke_button__mybutton_icon {
+ display: none !important;
+ }
+
+ .cke_button__mybutton_label {
+ display: inline !important;
+ }
+ </style>
+ <script>
+
+ CKEDITOR.on('instanceCreated', function (ev) {
+ var editor = ev.editor;
+
+ // Listen for the "pluginsLoaded" event, so we are sure that the
+ // "dialog" plugin has been loaded and we are able to do our
+ // customizations.
+ editor.on('pluginsLoaded', function () {
+
+ // If our custom dialog has not been registered, do that now.
+ if (!CKEDITOR.dialog.exists('myDialog')) {
+ // We need to do the following trick to find out the dialog
+ // definition file URL path. In the real world, you would simply
+ // point to an absolute path directly, like "/mydir/mydialog.js".
+ var href = document.location.href.split('/');
+ href.pop();
+ href.push('assets/my_dialog.js');
+ href = href.join('/');
+
+ // Finally, register the dialog.
+ CKEDITOR.dialog.add('myDialog', href);
+ }
+
+ // Register the command used to open the dialog.
+ editor.addCommand('myDialogCmd', new CKEDITOR.dialogCommand('myDialog'));
+
+ // Add the a custom toolbar buttons, which fires the above
+ // command..
+ editor.ui.add('MyButton', CKEDITOR.UI_BUTTON, {
+ label: 'My Dialog',
+ command: 'myDialogCmd'
+ });
+ });
+ });
+
+ // When opening a dialog, its "definition" is created for it, for
+ // each editor instance. The "dialogDefinition" event is then
+ // fired. We should use this event to make customizations to the
+ // definition of existing dialogs.
+ CKEDITOR.on('dialogDefinition', function (ev) {
+ // Take the dialog name and its definition from the event data.
+ var dialogName = ev.data.name;
+ var dialogDefinition = ev.data.definition;
+
+ // Check if the definition is from the dialog we're
+ // interested on (the "Link" dialog).
+ if (dialogName == 'myDialog' && ev.editor.name == 'editor2') {
+ // Get a reference to the "Link Info" tab.
+ var infoTab = dialogDefinition.getContents('tab1');
+
+ // Add a new text field to the "tab1" tab page.
+ infoTab.add({
+ type: 'text',
+ label: 'My Custom Field',
+ id: 'customField',
+ 'default': 'Sample!',
+ validate: function () {
+ if ((/\d/).test(this.getValue()))
+ return 'My Custom Field must not contain digits';
+ }
+ });
+
+ // Remove the "select1" field from the "tab1" tab.
+ infoTab.remove('select1');
+
+ // Set the default value for "input1" field.
+ var input1 = infoTab.get('input1');
+ input1['default'] = 'www.example.com';
+
+ // Remove the "tab2" tab page.
+ dialogDefinition.removeContents('tab2');
+
+ // Add a new tab to the "Link" dialog.
+ dialogDefinition.addContents({
+ id: 'customTab',
+ label: 'My Tab',
+ accessKey: 'M',
+ elements: [
+ {
+ id: 'myField1',
+ type: 'text',
+ label: 'My Text Field'
+ },
+ {
+ id: 'myField2',
+ type: 'text',
+ label: 'Another Text Field'
+ }
+ ]
+ });
+
+ // Provide the focus handler to start initial focus in "customField" field.
+ dialogDefinition.onFocus = function () {
+ var urlField = this.getContentElement('tab1', 'customField');
+ urlField.select();
+ };
+ }
+ });
+
+ var config = {
+ extraPlugins: 'dialog',
+ toolbar: [['MyButton']]
+ };
+
+ </script>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Using CKEditor Dialog API
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">brand new samples in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to use the
+ <a class="samples" href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog.html">CKEditor
+ Dialog API</a>
+ to customize CKEditor dialog windows without changing the original editor code.
+ The following customizations are being done in the example below:
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+ <p>A custom dialog is added to the editors using the <code>pluginsLoaded</code> event, from an external <a
+ target="_blank" href="assets/my_dialog.js">dialog definition file</a>:</p>
+ <ol>
+ <li><strong>Creating a custom dialog window</strong> &ndash; "My Dialog" dialog window opened with the "My
+ Dialog" toolbar button.</li>
+ <li><strong>Creating a custom button</strong> &ndash; Add button to open the dialog with "My Dialog" toolbar
+ button.</li>
+ </ol>
+ <textarea cols="80" id="editor1" name="editor1"
+ rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+ // Replace the <textarea id="editor1"> with an CKEditor instance.
+ CKEDITOR.replace('editor1', config);
+ </script>
+ <p>The below editor modify the dialog definition of the above added dialog using the <code>dialogDefinition</code>
+ event:</p>
+ <ol>
+ <li><strong>Adding dialog tab</strong> &ndash; Add new tab "My Tab" to dialog window.</li>
+ <li><strong>Removing a dialog window tab</strong> &ndash; Remove "Second Tab" page from the dialog window.</li>
+ <li><strong>Adding dialog window fields</strong> &ndash; Add "My Custom Field" to the dialog window.</li>
+ <li><strong>Removing dialog window field</strong> &ndash; Remove "Select Field" selection field from the dialog
+ window.</li>
+ <li><strong>Setting default values for dialog window fields</strong> &ndash; Set default value of "Text Field"
+ text field. </li>
+ <li><strong>Setup initial focus for dialog window</strong> &ndash; Put initial focus on "My Custom Field" text
+ field. </li>
+ </ol>
+ <textarea cols="80" id="editor2" name="editor2"
+ rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ // Replace the <textarea id="editor1"> with an CKEditor instance.
+ CKEDITOR.replace('editor2', config);
+
+ </script>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/divreplace.html b/samples/old/divreplace.html
new file mode 100755
index 0000000..183e42c
--- /dev/null
+++ b/samples/old/divreplace.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Replace DIV &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+ div.editable {
+ border: solid 2px transparent;
+ padding-left: 15px;
+ padding-right: 15px;
+ }
+
+ div.editable:hover {
+ border-color: black;
+ }
+ </style>
+ <script>
+
+ // Uncomment the following code to test the "Timeout Loading Method".
+ // CKEDITOR.loadFullCoreTimeout = 5;
+
+ window.onload = function () {
+ // Listen to the double click event.
+ if (window.addEventListener)
+ document.body.addEventListener('dblclick', onDoubleClick, false);
+ else if (window.attachEvent)
+ document.body.attachEvent('ondblclick', onDoubleClick);
+
+ };
+
+ function onDoubleClick(ev) {
+ // Get the element which fired the event. This is not necessarily the
+ // element to which the event has been attached.
+ var element = ev.target || ev.srcElement;
+
+ // Find out the div that holds this element.
+ var name;
+
+ do {
+ element = element.parentNode;
+ }
+ while (element && (name = element.nodeName.toLowerCase()) &&
+ (name != 'div' || element.className.indexOf('editable') == -1) && name != 'body');
+
+ if (name == 'div' && element.className.indexOf('editable') != -1)
+ replaceDiv(element);
+ }
+
+ var editor;
+
+ function replaceDiv(div) {
+ if (editor)
+ editor.destroy();
+
+ editor = CKEDITOR.replace(div);
+ }
+
+ </script>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Replace DIV with CKEditor on the Fly
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">brand new samples in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to automatically replace <code>&lt;div&gt;</code> elements
+ with a CKEditor instance on the fly, following user's doubleclick. The content
+ that was previously placed inside the <code>&lt;div&gt;</code> element will now
+ be moved into CKEditor editing area.
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+ <p>
+ Double-click any of the following <code>&lt;div&gt;</code> elements to transform them into
+ editor instances.
+ </p>
+ <div class="editable">
+ <h3>
+ Part 1
+ </h3>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+ semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+ rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+ nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+ eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+ </p>
+ </div>
+ <div class="editable">
+ <h3>
+ Part 2
+ </h3>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+ semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+ rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+ nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+ eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+ </p>
+ <p>
+ Donec velit. Mauris massa. Vestibulum non nulla. Nam suscipit arcu nec elit. Phasellus
+ sollicitudin iaculis ante. Ut non mauris et sapien tincidunt adipiscing. Vestibulum
+ vitae leo. Suspendisse nec mi tristique nulla laoreet vulputate.
+ </p>
+ </div>
+ <div class="editable">
+ <h3>
+ Part 3
+ </h3>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+ semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+ rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+ nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+ eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+ </p>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/enterkey/enterkey.html b/samples/old/enterkey/enterkey.html
new file mode 100755
index 0000000..e8b184c
--- /dev/null
+++ b/samples/old/enterkey/enterkey.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>ENTER Key Configuration &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <link href="../../../samples/old/sample.css" rel="stylesheet">
+ <meta name="ckeditor-sample-name" content="Using the &quot;Enter&quot; key in CKEditor">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description"
+ content="Configuring the behavior of &lt;em&gt;Enter&lt;/em&gt; and &lt;em&gt;Shift+Enter&lt;/em&gt; keys.">
+ <script>
+
+ var editor;
+
+ function changeEnter() {
+ // If we already have an editor, let's destroy it first.
+ if (editor)
+ editor.destroy(true);
+
+ // Create the editor again, with the appropriate settings.
+ editor = CKEDITOR.replace('editor1', {
+ extraPlugins: 'enterkey',
+ enterMode: Number(document.getElementById('xEnter').value),
+ shiftEnterMode: Number(document.getElementById('xShiftEnter').value)
+ });
+ }
+
+ window.onload = changeEnter;
+
+ </script>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; ENTER Key Configuration
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/enterkey.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to configure the <em>Enter</em> and <em>Shift+Enter</em> keys
+ to perform actions specified in the
+ <a class="samples"
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enterMode"><code>enterMode</code></a>
+ and <a class="samples"
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-shiftEnterMode"><code>shiftEnterMode</code></a>
+ parameters, respectively.
+ You can choose from the following options:
+ </p>
+ <ul class="samples">
+ <li><strong><code>ENTER_P</code></strong> &ndash; new <code>&lt;p&gt;</code> paragraphs are created;</li>
+ <li><strong><code>ENTER_BR</code></strong> &ndash; lines are broken with <code>&lt;br&gt;</code> elements;
+ </li>
+ <li><strong><code>ENTER_DIV</code></strong> &ndash; new <code>&lt;div&gt;</code> blocks are created.</li>
+ </ul>
+ <p>
+ The sample code below shows how to configure CKEditor to create a <code>&lt;div&gt;</code> block when
+ <em>Enter</em> key is pressed.
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ <strong>enterMode: CKEDITOR.ENTER_DIV</strong>
+});</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced.
+ </p>
+ </div>
+ <div style="float: left; margin-right: 20px">
+ When <em>Enter</em> is pressed:<br>
+ <select id="xEnter" onchange="changeEnter();">
+ <option selected="selected" value="1">Create a new &lt;P&gt; (recommended)</option>
+ <option value="3">Create a new &lt;DIV&gt;</option>
+ <option value="2">Break the line with a &lt;BR&gt;</option>
+ </select>
+ </div>
+ <div style="float: left">
+ When <em>Shift+Enter</em> is pressed:<br>
+ <select id="xShiftEnter" onchange="changeEnter();">
+ <option value="1">Create a new &lt;P&gt;</option>
+ <option value="3">Create a new &lt;DIV&gt;</option>
+ <option selected="selected" value="2">Break the line with a &lt;BR&gt; (recommended)</option>
+ </select>
+ </div>
+ <br style="clear: both">
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <p>
+ <br>
+ <textarea cols="80" id="editor1" name="editor1"
+ rows="10">This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.</textarea>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/htmlwriter/assets/outputforflash/outputforflash.fla b/samples/old/htmlwriter/assets/outputforflash/outputforflash.fla
new file mode 100755
index 0000000..27e68cc
--- /dev/null
+++ b/samples/old/htmlwriter/assets/outputforflash/outputforflash.fla
Binary files differ
diff --git a/samples/old/htmlwriter/assets/outputforflash/outputforflash.swf b/samples/old/htmlwriter/assets/outputforflash/outputforflash.swf
new file mode 100755
index 0000000..dbe17b6
--- /dev/null
+++ b/samples/old/htmlwriter/assets/outputforflash/outputforflash.swf
Binary files differ
diff --git a/samples/old/htmlwriter/assets/outputforflash/swfobject.js b/samples/old/htmlwriter/assets/outputforflash/swfobject.js
new file mode 100755
index 0000000..4f0ea7d
--- /dev/null
+++ b/samples/old/htmlwriter/assets/outputforflash/swfobject.js
@@ -0,0 +1,75 @@
+var swfobject = function() {
+ function w() { if (!u) { try { var a = d.getElementsByTagName("body")[0].appendChild(d.createElement("span")); a.parentNode.removeChild(a) } catch (b) { return } u = !0; for (var a = z.length, c = 0; c < a; c++)z[c]() } } function M(a) { u ? a() : z[z.length] = a } function N(a) {
+ if ("undefined" != typeof n.addEventListener) n.addEventListener("load", a, !1); else if ("undefined" != typeof d.addEventListener) d.addEventListener("load", a, !1); else if ("undefined" != typeof n.attachEvent) U(n, "onload", a); else if ("function" == typeof n.onload) {
+ var b =
+ n.onload; n.onload = function() { b(); a() }
+ } else n.onload = a
+ } function V() { var a = d.getElementsByTagName("body")[0], b = d.createElement("object"); b.setAttribute("type", "application/x-shockwave-flash"); var c = a.appendChild(b); if (c) { var f = 0; (function() { if ("undefined" != typeof c.GetVariable) { var g = c.GetVariable("$version"); g && (g = g.split(" ")[1].split(","), e.pv = [parseInt(g[0], 10), parseInt(g[1], 10), parseInt(g[2], 10)]) } else if (10 > f) { f++; setTimeout(arguments.callee, 10); return } a.removeChild(b); c = null; E() })() } else E() }
+ function E() {
+ var a = r.length; if (0 < a) for (var b = 0; b < a; b++) {
+ var c = r[b].id, f = r[b].callbackFn, g = { success: !1, id: c }; if (0 < e.pv[0]) {
+ var d = p(c); if (d) if (!A(r[b].swfVersion) || e.wk && 312 > e.wk) if (r[b].expressInstall && F()) {
+ g = {}; g.data = r[b].expressInstall; g.width = d.getAttribute("width") || "0"; g.height = d.getAttribute("height") || "0"; d.getAttribute("class") && (g.styleclass = d.getAttribute("class")); d.getAttribute("align") && (g.align = d.getAttribute("align")); for (var h = {}, d = d.getElementsByTagName("param"), k = d.length, l = 0; l <
+ k; l++)"movie" != d[l].getAttribute("name").toLowerCase() && (h[d[l].getAttribute("name")] = d[l].getAttribute("value")); G(g, h, c, f)
+ } else W(d), f && f(g); else v(c, !0), f && (g.success = !0, g.ref = H(c), f(g))
+ } else v(c, !0), f && ((c = H(c)) && "undefined" != typeof c.SetVariable && (g.success = !0, g.ref = c), f(g))
+ }
+ } function H(a) { var b = null; (a = p(a)) && "OBJECT" == a.nodeName && ("undefined" != typeof a.SetVariable ? b = a : (a = a.getElementsByTagName("object")[0]) && (b = a)); return b } function F() { return !B && A("6.0.65") && (e.win || e.mac) && !(e.wk && 312 > e.wk) }
+ function G(a, b, c, f) {
+ B = !0; I = f || null; O = { success: !1, id: c }; var g = p(c); if (g) {
+ "OBJECT" == g.nodeName ? (y = J(g), C = null) : (y = g, C = c); a.id = "SWFObjectExprInst"; if ("undefined" == typeof a.width || !/%$/.test(a.width) && 310 > parseInt(a.width, 10)) a.width = "310"; if ("undefined" == typeof a.height || !/%$/.test(a.height) && 137 > parseInt(a.height, 10)) a.height = "137"; d.title = d.title.slice(0, 47) + " - Flash Player Installation"; f = e.ie && e.win ? "ActiveX" : "PlugIn"; f = "MMredirectURL\x3d" + n.location.toString().replace(/&/g, "%26") + "\x26MMplayerType\x3d" +
+ f + "\x26MMdoctitle\x3d" + d.title; b.flashvars = "undefined" != typeof b.flashvars ? b.flashvars + ("\x26" + f) : f; e.ie && e.win && 4 != g.readyState && (f = d.createElement("div"), c += "SWFObjectNew", f.setAttribute("id", c), g.parentNode.insertBefore(f, g), g.style.display = "none", function() { 4 == g.readyState ? g.parentNode.removeChild(g) : setTimeout(arguments.callee, 10) }()); K(a, b, c)
+ }
+ } function W(a) {
+ if (e.ie && e.win && 4 != a.readyState) {
+ var b = d.createElement("div"); a.parentNode.insertBefore(b, a); b.parentNode.replaceChild(J(a), b); a.style.display =
+ "none"; (function() { 4 == a.readyState ? a.parentNode.removeChild(a) : setTimeout(arguments.callee, 10) })()
+ } else a.parentNode.replaceChild(J(a), a)
+ } function J(a) { var b = d.createElement("div"); if (e.win && e.ie) b.innerHTML = a.innerHTML; else if (a = a.getElementsByTagName("object")[0]) if (a = a.childNodes) for (var c = a.length, f = 0; f < c; f++)1 == a[f].nodeType && "PARAM" == a[f].nodeName || 8 == a[f].nodeType || b.appendChild(a[f].cloneNode(!0)); return b } function K(a, b, c) {
+ var f, g = p(c); if (e.wk && 312 > e.wk) return f; if (g) if ("undefined" == typeof a.id &&
+ (a.id = c), e.ie && e.win) { var q = "", h; for (h in a) a[h] != Object.prototype[h] && ("data" == h.toLowerCase() ? b.movie = a[h] : "styleclass" == h.toLowerCase() ? q += ' class\x3d"' + a[h] + '"' : "classid" != h.toLowerCase() && (q += " " + h + '\x3d"' + a[h] + '"')); h = ""; for (var k in b) b[k] != Object.prototype[k] && (h += '\x3cparam name\x3d"' + k + '" value\x3d"' + b[k] + '" /\x3e'); g.outerHTML = '\x3cobject classid\x3d"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + q + "\x3e" + h + "\x3c/object\x3e"; D[D.length] = a.id; f = p(a.id) } else {
+ k = d.createElement("object"); k.setAttribute("type",
+ "application/x-shockwave-flash"); for (var l in a) a[l] != Object.prototype[l] && ("styleclass" == l.toLowerCase() ? k.setAttribute("class", a[l]) : "classid" != l.toLowerCase() && k.setAttribute(l, a[l])); for (q in b) b[q] != Object.prototype[q] && "movie" != q.toLowerCase() && (a = k, h = q, l = b[q], c = d.createElement("param"), c.setAttribute("name", h), c.setAttribute("value", l), a.appendChild(c)); g.parentNode.replaceChild(k, g); f = k
+ } return f
+ } function P(a) {
+ var b = p(a); b && "OBJECT" == b.nodeName && (e.ie && e.win ? (b.style.display = "none", function() {
+ if (4 ==
+ b.readyState) { var c = p(a); if (c) { for (var f in c) "function" == typeof c[f] && (c[f] = null); c.parentNode.removeChild(c) } } else setTimeout(arguments.callee, 10)
+ }()) : b.parentNode.removeChild(b))
+ } function p(a) { var b = null; try { b = d.getElementById(a) } catch (c) { } return b } function U(a, b, c) { a.attachEvent(b, c); x[x.length] = [a, b, c] } function A(a) {
+ var b = e.pv; a = a.split("."); a[0] = parseInt(a[0], 10); a[1] = parseInt(a[1], 10) || 0; a[2] = parseInt(a[2], 10) || 0; return b[0] > a[0] || b[0] == a[0] && b[1] > a[1] || b[0] == a[0] && b[1] == a[1] && b[2] >= a[2] ? !0 :
+ !1
+ } function Q(a, b, c, f) {
+ if (!e.ie || !e.mac) {
+ var g = d.getElementsByTagName("head")[0]; g && (c = c && "string" == typeof c ? c : "screen", f && (L = m = null), m && L == c || (f = d.createElement("style"), f.setAttribute("type", "text/css"), f.setAttribute("media", c), m = g.appendChild(f), e.ie && e.win && "undefined" != typeof d.styleSheets && 0 < d.styleSheets.length && (m = d.styleSheets[d.styleSheets.length - 1]), L = c), e.ie && e.win ? m && "object" == typeof m.addRule && m.addRule(a, b) : m && "undefined" != typeof d.createTextNode && m.appendChild(d.createTextNode(a +
+ " {" + b + "}")))
+ }
+ } function v(a, b) { if (R) { var c = b ? "visible" : "hidden"; u && p(a) ? p(a).style.visibility = c : Q("#" + a, "visibility:" + c) } } function S(a) { return null != /[\\\"<>\.;]/.exec(a) && "undefined" != typeof encodeURIComponent ? encodeURIComponent(a) : a } var n = window, d = document, t = navigator, T = !1, z = [function() { T ? V() : E() }], r = [], D = [], x = [], y, C, I, O, u = !1, B = !1, m, L, R = !0, e = function() {
+ var a = "undefined" != typeof d.getElementById && "undefined" != typeof d.getElementsByTagName && "undefined" != typeof d.createElement, b = t.userAgent.toLowerCase(),
+ c = t.platform.toLowerCase(), f = c ? /win/.test(c) : /win/.test(b), c = c ? /mac/.test(c) : /mac/.test(b), b = /webkit/.test(b) ? parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : !1, g = !+"\v1", e = [0, 0, 0], h = null; if ("undefined" != typeof t.plugins && "object" == typeof t.plugins["Shockwave Flash"]) !(h = t.plugins["Shockwave Flash"].description) || "undefined" != typeof t.mimeTypes && t.mimeTypes["application/x-shockwave-flash"] && !t.mimeTypes["application/x-shockwave-flash"].enabledPlugin || (T = !0, g = !1, h = h.replace(/^.*\s+(\S+\s+\S+$)/,
+ "$1"), e[0] = parseInt(h.replace(/^(.*)\..*$/, "$1"), 10), e[1] = parseInt(h.replace(/^.*\.(.*)\s.*$/, "$1"), 10), e[2] = /[a-zA-Z]/.test(h) ? parseInt(h.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0); else if ("undefined" != typeof n.ActiveXObject) try { var k = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); k && (h = k.GetVariable("$version")) && (g = !0, h = h.split(" ")[1].split(","), e = [parseInt(h[0], 10), parseInt(h[1], 10), parseInt(h[2], 10)]) } catch (l) { } return { w3: a, pv: e, wk: b, ie: g, win: f, mac: c }
+ }(); (function() {
+ e.w3 && (("undefined" != typeof d.readyState &&
+ "complete" == d.readyState || "undefined" == typeof d.readyState && (d.getElementsByTagName("body")[0] || d.body)) && w(), u || ("undefined" != typeof d.addEventListener && d.addEventListener("DOMContentLoaded", w, !1), e.ie && e.win && (d.attachEvent("onreadystatechange", function() { "complete" == d.readyState && (d.detachEvent("onreadystatechange", arguments.callee), w()) }), n == top && function() { if (!u) { try { d.documentElement.doScroll("left") } catch (a) { setTimeout(arguments.callee, 0); return } w() } }()), e.wk && function() {
+ u || (/loaded|complete/.test(d.readyState) ?
+ w() : setTimeout(arguments.callee, 0))
+ }(), N(w)))
+ })(); (function() { e.ie && e.win && window.attachEvent("onunload", function() { for (var a = x.length, b = 0; b < a; b++)x[b][0].detachEvent(x[b][1], x[b][2]); a = D.length; for (b = 0; b < a; b++)P(D[b]); for (var c in e) e[c] = null; e = null; for (var f in swfobject) swfobject[f] = null; swfobject = null }) })(); return {
+ registerObject: function(a, b, c, f) { if (e.w3 && a && b) { var d = {}; d.id = a; d.swfVersion = b; d.expressInstall = c; d.callbackFn = f; r[r.length] = d; v(a, !1) } else f && f({ success: !1, id: a }) }, getObjectById: function(a) { if (e.w3) return H(a) },
+ embedSWF: function(a, b, c, d, g, q, h, k, l, n) {
+ var p = { success: !1, id: b }; e.w3 && !(e.wk && 312 > e.wk) && a && b && c && d && g ? (v(b, !1), M(function() {
+ c += ""; d += ""; var e = {}; if (l && "object" === typeof l) for (var m in l) e[m] = l[m]; e.data = a; e.width = c; e.height = d; m = {}; if (k && "object" === typeof k) for (var r in k) m[r] = k[r]; if (h && "object" === typeof h) for (var t in h) m.flashvars = "undefined" != typeof m.flashvars ? m.flashvars + ("\x26" + t + "\x3d" + h[t]) : t + "\x3d" + h[t]; if (A(g)) r = K(e, m, b), e.id == b && v(b, !0), p.success = !0, p.ref = r; else {
+ if (q && F()) {
+ e.data = q; G(e,
+ m, b, n); return
+ } v(b, !0)
+ } n && n(p)
+ })) : n && n(p)
+ }, switchOffAutoHideShow: function() { R = !1 }, ua: e, getFlashPlayerVersion: function() { return { major: e.pv[0], minor: e.pv[1], release: e.pv[2] } }, hasFlashPlayerVersion: A, createSWF: function(a, b, c) { if (e.w3) return K(a, b, c) }, showExpressInstall: function(a, b, c, d) { e.w3 && F() && G(a, b, c, d) }, removeSWF: function(a) { e.w3 && P(a) }, createCSS: function(a, b, c, d) { e.w3 && Q(a, b, c, d) }, addDomLoadEvent: M, addLoadEvent: N, getQueryParamValue: function(a) {
+ var b = d.location.search || d.location.hash; if (b) {
+ /\?/.test(b) &&
+ (b = b.split("?")[1]); if (null == a) return S(b); for (var b = b.split("\x26"), c = 0; c < b.length; c++)if (b[c].substring(0, b[c].indexOf("\x3d")) == a) return S(b[c].substring(b[c].indexOf("\x3d") + 1))
+ } return ""
+ }, expressInstallCallback: function() { if (B) { var a = p("SWFObjectExprInst"); a && y && (a.parentNode.replaceChild(y, a), C && (v(C, !0), e.ie && e.win && (y.style.display = "block")), I && I(O)); B = !1 } }
+ }
+}(); \ No newline at end of file
diff --git a/samples/old/htmlwriter/outputforflash.html b/samples/old/htmlwriter/outputforflash.html
new file mode 100755
index 0000000..cb6b0c3
--- /dev/null
+++ b/samples/old/htmlwriter/outputforflash.html
@@ -0,0 +1,289 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Output for Flash &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/old/sample.js"></script>
+ <script src="assets/outputforflash/swfobject.js"></script>
+ <link href="../../../samples/old/sample.css" rel="stylesheet">
+ <meta name="ckeditor-sample-required-plugins" content="sourcearea">
+ <meta name="ckeditor-sample-name" content="Output for Flash">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description"
+ content="Configuring CKEditor to produce HTML code that can be used with Adobe Flash.">
+ <style>
+ .alert {
+ background: #ffa84c;
+ padding: 10px 15px;
+ font-weight: bold;
+ display: block;
+ margin-bottom: 20px;
+ }
+ </style>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Producing Flash Compliant HTML Output
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">brand new samples in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor to output
+ HTML code that can be used with
+ <a class="samples"
+ href="http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00000922.html">
+ Adobe Flash</a>.
+ The code will contain a subset of standard HTML elements like <code>&lt;b&gt;</code>,
+ <code>&lt;i&gt;</code>, and <code>&lt;p&gt;</code> as well as HTML attributes.
+ </p>
+ <p>
+ To add a CKEditor instance outputting Flash compliant HTML code, load the editor using a standard
+ JavaScript call, and define CKEditor features to use HTML elements and attributes.
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+ <p>
+ To see how it works, create some content in the editing area of CKEditor on the left
+ and send it to the Flash object on the right side of the page by using the
+ <strong>Send to Flash</strong> button.
+ </p>
+ <table style="width: 100%; border-spacing: 0; border-collapse:collapse;">
+ <tr>
+ <td style="width: 100%">
+ <textarea cols="80" id="editor1" name="editor1"
+ rows="10">&lt;p&gt;&lt;b&gt;&lt;font size=&quot;18&quot; style=&quot;font-size:18px;&quot;&gt;Flash and HTML&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;It is possible to have &lt;a href=&quot;https://ckeditor.com&quot;&gt;CKEditor&lt;/a&gt; creating content that will be later loaded inside &lt;b&gt;Flash&lt;/b&gt; objects and animations.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Flash has a few limitations when dealing with HTML:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It has limited support on tags.&lt;/li&gt;&lt;li&gt;There is no margin between block elements, like paragraphs.&lt;/li&gt;&lt;/ul&gt;</textarea>
+ <script>
+
+ if (document.location.protocol == 'file:')
+ alert('Warning: This samples does not work when loaded from local filesystem' +
+ 'due to security restrictions implemented in Flash.' +
+ '\n\nPlease load the sample from a web server instead.');
+
+ var editor = CKEDITOR.replace('editor1', {
+ /*
+ * Ensure that htmlwriter plugin, which is required for this sample, is loaded.
+ */
+ extraPlugins: 'htmlwriter',
+
+ height: 290,
+ width: '100%',
+ toolbar: [
+ ['Source', '-', 'Bold', 'Italic', 'Underline', '-', 'BulletedList', '-', 'Link', 'Unlink'],
+ ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
+ '/',
+ ['Font', 'FontSize'],
+ ['TextColor', '-', 'About']
+ ],
+
+ /*
+ * Style sheet for the contents
+ */
+ contentsCss: 'body {color:#000; background-color#FFF; font-family: Arial; font-size:80%;} p, ol, ul {margin-top: 0px; margin-bottom: 0px;}',
+
+ /*
+ * Quirks doctype
+ */
+ docType: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',
+
+ /*
+ * Core styles.
+ */
+ coreStyles_bold: {element: 'b'},
+ coreStyles_italic: {element: 'i'},
+ coreStyles_underline: {element: 'u'},
+
+ /*
+ * Font face.
+ */
+
+ // Define the way font elements will be applied to the document. The "font"
+ // element will be used.
+ font_style: {
+ element: 'font',
+ attributes: {'face': '#(family)'}
+ },
+
+ /*
+ * Font sizes.
+ */
+
+ // The CSS part of the font sizes isn't used by Flash, it is there to get the
+ // font rendered correctly in CKEditor.
+ fontSize_sizes: '8px/8;9px/9;10px/10;11px/11;12px/12;14px/14;16px/16;18px/18;20px/20;22px/22;24px/24;26px/26;28px/28;36px/36;48px/48;72px/72',
+ fontSize_style: {
+ element: 'font',
+ attributes: {'size': '#(size)'},
+ styles: {'font-size': '#(size)px'}
+ },
+
+ /*
+ * Font colors.
+ */
+ colorButton_enableMore: true,
+
+ colorButton_foreStyle: {
+ element: 'font',
+ attributes: {'color': '#(color)'}
+ },
+
+ colorButton_backStyle: {
+ element: 'font',
+ styles: {'background-color': '#(color)'}
+ },
+
+ on: {'instanceReady': configureFlashOutput}
+ });
+
+ /*
+ * Adjust the behavior of the dataProcessor to match the
+ * requirements of Flash
+ */
+ function configureFlashOutput(ev) {
+ var editor = ev.editor,
+ dataProcessor = editor.dataProcessor,
+ htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+
+ // Out self closing tags the HTML4 way, like <br>.
+ dataProcessor.writer.selfClosingEnd = '>';
+
+ // Make output formatting match Flash expectations
+ var dtd = CKEDITOR.dtd;
+ for (var e in CKEDITOR.tools.extend({}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent)) {
+ dataProcessor.writer.setRules(e, {
+ indent: false,
+ breakBeforeOpen: false,
+ breakAfterOpen: false,
+ breakBeforeClose: false,
+ breakAfterClose: false
+ });
+ }
+ dataProcessor.writer.setRules('br', {
+ indent: false,
+ breakBeforeOpen: false,
+ breakAfterOpen: false,
+ breakBeforeClose: false,
+ breakAfterClose: false
+ });
+
+ // Output properties as attributes, not styles.
+ htmlFilter.addRules({
+ elements: {
+ $: function (element) {
+ var style, match, width, height, align;
+
+ // Output dimensions of images as width and height
+ if (element.name == 'img') {
+ style = element.attributes.style;
+
+ if (style) {
+ // Get the width from the style.
+ match = (/(?:^|\s)width\s*:\s*(\d+)px/i).exec(style);
+ width = match && match[1];
+
+ // Get the height from the style.
+ match = (/(?:^|\s)height\s*:\s*(\d+)px/i).exec(style);
+ height = match && match[1];
+
+ if (width) {
+ element.attributes.style = element.attributes.style.replace(/(?:^|\s)width\s*:\s*(\d+)px;?/i, '');
+ element.attributes.width = width;
+ }
+
+ if (height) {
+ element.attributes.style = element.attributes.style.replace(/(?:^|\s)height\s*:\s*(\d+)px;?/i, '');
+ element.attributes.height = height;
+ }
+ }
+ }
+
+ // Output alignment of paragraphs using align
+ if (element.name == 'p') {
+ style = element.attributes.style;
+
+ if (style) {
+ // Get the align from the style.
+ match = (/(?:^|\s)text-align\s*:\s*(\w*);?/i).exec(style);
+ align = match && match[1];
+
+ if (align) {
+ element.attributes.style = element.attributes.style.replace(/(?:^|\s)text-align\s*:\s*(\w*);?/i, '');
+ element.attributes.align = align;
+ }
+ }
+ }
+
+ if (element.attributes.style === '')
+ delete element.attributes.style;
+
+ return element;
+ }
+ }
+ });
+ }
+
+ function sendToFlash() {
+ var html = CKEDITOR.instances.editor1.getData();
+
+ // Quick fix for link color.
+ html = html.replace(/<a /g, '<font color="#0000FF"><u><a ')
+ html = html.replace(/<\/a>/g, '</a></u></font>')
+
+ var flash = document.getElementById('ckFlashContainer');
+ flash.setData(html);
+ }
+
+ CKEDITOR.domReady(function () {
+ if (!swfobject.hasFlashPlayerVersion('8')) {
+ CKEDITOR.dom.element.createFromHtml('<span class="alert">' +
+ 'At least Adobe Flash Player 8 is required to run this sample. ' +
+ 'You can download it from <a href="http://get.adobe.com/flashplayer">Adobe\'s website</a>.' +
+ '</span>').insertBefore(editor.element);
+ }
+
+ swfobject.embedSWF(
+ 'assets/outputforflash/outputforflash.swf',
+ 'ckFlashContainer',
+ '550',
+ '400',
+ '8',
+ {wmode: 'transparent'}
+ );
+ });
+
+ </script>
+ <p>
+ <input type="button" value="Send to Flash" onclick="sendToFlash();">
+ </p>
+ </td>
+ <td style="vertical-align: top; padding-left: 20px">
+ <div id="ckFlashContainer"></div>
+ </td>
+ </tr>
+ </table>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/htmlwriter/outputhtml.html b/samples/old/htmlwriter/outputhtml.html
new file mode 100755
index 0000000..7e78164
--- /dev/null
+++ b/samples/old/htmlwriter/outputhtml.html
@@ -0,0 +1,231 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>HTML Compliant Output &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/old/sample.js"></script>
+ <link href="../../../samples/old/sample.css" rel="stylesheet">
+ <meta name="ckeditor-sample-required-plugins" content="sourcearea">
+ <meta name="ckeditor-sample-name" content="Output HTML">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description" content="Configuring CKEditor to produce legacy HTML 4 code.">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Producing HTML Compliant Output
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">brand new samples in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor to output valid
+ <a class="samples" href="http://www.w3.org/TR/html401/">HTML 4.01</a> code.
+ Traditional HTML elements like <code>&lt;b&gt;</code>,
+ <code>&lt;i&gt;</code>, and <code>&lt;font&gt;</code> are used in place of
+ <code>&lt;strong&gt;</code>, <code>&lt;em&gt;</code>, and CSS styles.
+ </p>
+ <p>
+ To add a CKEditor instance outputting legacy HTML 4.01 code, load the editor using a standard
+ JavaScript call, and define CKEditor features to use the HTML compliant elements and attributes.
+ </p>
+ <p>
+ A snippet of the configuration code can be seen below; check the source of this page for
+ full definition:
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ coreStyles_bold: { element: 'b' },
+ coreStyles_italic: { element: 'i' },
+
+ fontSize_style: {
+ element: 'font',
+ attributes: { 'size': '#(size)' }
+ }
+
+ ...
+});</pre>
+ </div>
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <p>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <textarea cols="80" id="editor1" name="editor1"
+ rows="10">&lt;p&gt;This is some &lt;b&gt;sample text&lt;/b&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ CKEDITOR.replace('editor1', {
+ /*
+ * Ensure that htmlwriter plugin, which is required for this sample, is loaded.
+ */
+ extraPlugins: 'htmlwriter',
+
+ /*
+ * Style sheet for the contents
+ */
+ contentsCss: 'body {color:#000; background-color#:FFF;}',
+
+ /*
+ * Simple HTML5 doctype
+ */
+ docType: '<!DOCTYPE HTML>',
+
+ /*
+ * Allowed content rules which beside limiting allowed HTML
+ * will also take care of transforming styles to attributes
+ * (currently only for img - see transformation rules defined below).
+ *
+ * Read more: https://ckeditor.com/docs/ckeditor4/latest/guide/dev_advanced_content_filter.html
+ */
+ allowedContent:
+ 'h1 h2 h3 p pre[align]; ' +
+ 'blockquote code kbd samp var del ins cite q b i u strike ul ol li hr table tbody tr td th caption; ' +
+ 'img[!src,alt,align,width,height]; font[!face]; font[!family]; font[!color]; font[!size]; font{!background-color}; a[!href]; a[!name]',
+
+ /*
+ * Core styles.
+ */
+ coreStyles_bold: {element: 'b'},
+ coreStyles_italic: {element: 'i'},
+ coreStyles_underline: {element: 'u'},
+ coreStyles_strike: {element: 'strike'},
+
+ /*
+ * Font face.
+ */
+
+ // Define the way font elements will be applied to the document.
+ // The "font" element will be used.
+ font_style: {
+ element: 'font',
+ attributes: {'face': '#(family)'}
+ },
+
+ /*
+ * Font sizes.
+ */
+ fontSize_sizes: 'xx-small/1;x-small/2;small/3;medium/4;large/5;x-large/6;xx-large/7',
+ fontSize_style: {
+ element: 'font',
+ attributes: {'size': '#(size)'}
+ },
+
+ /*
+ * Font colors.
+ */
+
+ colorButton_foreStyle: {
+ element: 'font',
+ attributes: {'color': '#(color)'}
+ },
+
+ colorButton_backStyle: {
+ element: 'font',
+ styles: {'background-color': '#(color)'}
+ },
+
+ /*
+ * Styles combo.
+ */
+ stylesSet: [
+ {name: 'Computer Code', element: 'code'},
+ {name: 'Keyboard Phrase', element: 'kbd'},
+ {name: 'Sample Text', element: 'samp'},
+ {name: 'Variable', element: 'var'},
+ {name: 'Deleted Text', element: 'del'},
+ {name: 'Inserted Text', element: 'ins'},
+ {name: 'Cited Work', element: 'cite'},
+ {name: 'Inline Quotation', element: 'q'}
+ ],
+
+ on: {
+ pluginsLoaded: configureTransformations,
+ loaded: configureHtmlWriter
+ }
+ });
+
+ /*
+ * Add missing content transformations.
+ */
+ function configureTransformations(evt) {
+ var editor = evt.editor;
+
+ editor.dataProcessor.htmlFilter.addRules({
+ attributes: {
+ style: function (value, element) {
+ // Return #RGB for background and border colors
+ return CKEDITOR.tools.convertRgbToHex(value);
+ }
+ }
+ });
+
+ // Default automatic content transformations do not yet take care of
+ // align attributes on blocks, so we need to add our own transformation rules.
+ function alignToAttribute(element) {
+ if (element.styles['text-align']) {
+ element.attributes.align = element.styles['text-align'];
+ delete element.styles['text-align'];
+ }
+ }
+ editor.filter.addTransformations([
+ [{element: 'p', right: alignToAttribute}],
+ [{element: 'h1', right: alignToAttribute}],
+ [{element: 'h2', right: alignToAttribute}],
+ [{element: 'h3', right: alignToAttribute}],
+ [{element: 'pre', right: alignToAttribute}]
+ ]);
+ }
+
+ /*
+ * Adjust the behavior of htmlWriter to make it output HTML like FCKeditor.
+ */
+ function configureHtmlWriter(evt) {
+ var editor = evt.editor,
+ dataProcessor = editor.dataProcessor;
+
+ // Out self closing tags the HTML4 way, like <br>.
+ dataProcessor.writer.selfClosingEnd = '>';
+
+ // Make output formatting behave similar to FCKeditor.
+ var dtd = CKEDITOR.dtd;
+ for (var e in CKEDITOR.tools.extend({}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent)) {
+ dataProcessor.writer.setRules(e, {
+ indent: true,
+ breakBeforeOpen: true,
+ breakAfterOpen: false,
+ breakBeforeClose: !dtd[e]['#'],
+ breakAfterClose: true
+ });
+ }
+ }
+
+ </script>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/index.html b/samples/old/index.html
new file mode 100755
index 0000000..b7f6fbb
--- /dev/null
+++ b/samples/old/index.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>CKEditor Samples</title>
+ <link rel="stylesheet" href="sample.css">
+</head>
+
+<body>
+ <h1 class="samples">
+ CKEditor Samples
+ </h1>
+ <div class="warning deprecated">
+ These samples are not maintained anymore. Check out the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">brand new samples in CKEditor
+ Examples</a>.
+ </div>
+ <div class="twoColumns">
+ <div class="twoColumnsLeft">
+ <h2 class="samples">
+ Basic Samples
+ </h2>
+ <dl class="samples">
+ <dt><a class="samples" href="replacebyclass.html">Replace textarea elements by class name</a></dt>
+ <dd>Automatic replacement of all textarea elements of a given class with a CKEditor instance.</dd>
+
+ <dt><a class="samples" href="replacebycode.html">Replace textarea elements by code</a></dt>
+ <dd>Replacement of textarea elements with CKEditor instances by using a JavaScript call.</dd>
+
+ <dt><a class="samples" href="jquery.html">Create editors with jQuery</a></dt>
+ <dd>Creating standard and inline CKEditor instances with jQuery adapter.</dd>
+ </dl>
+
+ <h2 class="samples">
+ Basic Customization
+ </h2>
+ <dl class="samples">
+ <dt><a class="samples" href="uicolor.html">User Interface color</a></dt>
+ <dd>Changing CKEditor User Interface color and adding a toolbar button that lets the user set the UI
+ color.</dd>
+
+ <dt><a class="samples" href="uilanguages.html">User Interface languages</a></dt>
+ <dd>Changing CKEditor User Interface language and adding a drop-down list that lets the user choose the
+ UI language.</dd>
+ </dl>
+
+
+ <h2 class="samples">Plugins</h2>
+ <dl class="samples">
+ <dt><a class="samples" href="magicline/magicline.html">Magicline plugin</a></dt>
+ <dd>Using the Magicline plugin to access difficult focus spaces.</dd>
+
+ <dt><a class="samples" href="wysiwygarea/fullpage.html">Full page support</a></dt>
+ <dd>CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to
+ &lt;/html&gt;.</dd>
+ </dl>
+ </div>
+ <div class="twoColumnsRight">
+ <h2 class="samples">
+ Inline Editing
+ </h2>
+ <dl class="samples">
+ <dt><a class="samples" href="inlineall.html">Massive inline editor creation</a></dt>
+ <dd>Turn all elements with <code>contentEditable = true</code> attribute into inline editors.</dd>
+
+ <dt><a class="samples" href="inlinebycode.html">Convert element into an inline editor by code</a></dt>
+ <dd>Conversion of DOM elements into inline CKEditor instances by using a JavaScript call.</dd>
+
+ <dt><a class="samples" href="inlinetextarea.html">Replace textarea with inline editor</a> <span
+ class="new">New!</span></dt>
+ <dd>A form with a textarea that is replaced by an inline editor at runtime.</dd>
+
+
+ </dl>
+
+ <h2 class="samples">
+ Advanced Samples
+ </h2>
+ <dl class="samples">
+ <dt><a class="samples" href="datafiltering.html">Data filtering and features activation</a> <span
+ class="new">New!</span></dt>
+ <dd>Data filtering and automatic features activation basing on configuration.</dd>
+
+ <dt><a class="samples" href="divreplace.html">Replace DIV elements on the fly</a></dt>
+ <dd>Transforming a <code>div</code> element into an instance of CKEditor with a mouse click.</dd>
+
+ <dt><a class="samples" href="appendto.html">Append editor instances</a></dt>
+ <dd>Appending editor instances to existing DOM elements.</dd>
+
+ <dt><a class="samples" href="ajax.html">Create and destroy editor instances for Ajax applications</a>
+ </dt>
+ <dd>Creating and destroying CKEditor instances on the fly and saving the contents entered into the
+ editor window.</dd>
+
+ <dt><a class="samples" href="api.html">Basic usage of the API</a></dt>
+ <dd>Using the CKEditor JavaScript API to interact with the editor at runtime.</dd>
+
+ <dt><a class="samples" href="xhtmlstyle.html">XHTML-compliant style</a></dt>
+ <dd>Configuring CKEditor to produce XHTML 1.1 compliant attributes and styles.</dd>
+
+ <dt><a class="samples" href="readonly.html">Read-only mode</a></dt>
+ <dd>Using the readOnly API to block introducing changes to the editor contents.</dd>
+
+ <dt><a class="samples" href="tabindex.html">"Tab" key-based navigation</a></dt>
+ <dd>Navigating among editor instances with tab key.</dd>
+
+
+
+ <dt><a class="samples" href="dialog/dialog.html">Using the JavaScript API to customize dialog
+ windows</a></dt>
+ <dd>Using the dialog windows API to customize dialog windows without changing the original editor code.
+ </dd>
+
+ <dt><a class="samples" href="enterkey/enterkey.html">Using the &quot;Enter&quot; key in CKEditor</a>
+ </dt>
+ <dd>Configuring the behavior of <em>Enter</em> and <em>Shift+Enter</em> keys.</dd>
+
+ <dt><a class="samples" href="htmlwriter/outputforflash.html">Output for Flash</a></dt>
+ <dd>Configuring CKEditor to produce HTML code that can be used with Adobe Flash.</dd>
+
+ <dt><a class="samples" href="htmlwriter/outputhtml.html">Output HTML</a></dt>
+ <dd>Configuring CKEditor to produce legacy HTML 4 code.</dd>
+
+ <dt><a class="samples" href="toolbar/toolbar.html">Toolbar Configurations</a></dt>
+ <dd>Configuring CKEditor to display full or custom toolbar layout.</dd>
+
+ </dl>
+ </div>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/inlineall.html b/samples/old/inlineall.html
new file mode 100755
index 0000000..2685b43
--- /dev/null
+++ b/samples/old/inlineall.html
@@ -0,0 +1,325 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Massive inline editing &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <script>
+
+ // This code is generally not necessary, but it is here to demonstrate
+ // how to customize specific editor instances on the fly. This fits well
+ // this demo because we have editable elements (like headers) that
+ // require less features.
+
+ // The "instanceCreated" event is fired for every editor instance created.
+ CKEDITOR.on('instanceCreated', function (event) {
+ var editor = event.editor,
+ element = editor.element;
+
+ // Customize editors for headers and tag list.
+ // These editors don't need features like smileys, templates, iframes etc.
+ if (element.is('h1', 'h2', 'h3') || element.getAttribute('id') == 'taglist') {
+ // Customize the editor configurations on "configLoaded" event,
+ // which is fired after the configuration file loading and
+ // execution. This makes it possible to change the
+ // configurations before the editor initialization takes place.
+ editor.on('configLoaded', function () {
+
+ // Remove unnecessary plugins to make the editor simpler.
+ editor.config.removePlugins = 'colorbutton,find,flash,font,' +
+ 'forms,iframe,image,newpage,removeformat,' +
+ 'smiley,specialchar,stylescombo,templates';
+
+ // Rearrange the layout of the toolbar.
+ editor.config.toolbarGroups = [
+ {name: 'editing', groups: ['basicstyles', 'links']},
+ {name: 'undo'},
+ {name: 'clipboard', groups: ['selection', 'clipboard']},
+ {name: 'about'}
+ ];
+ });
+ }
+ });
+
+ </script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+ /* The following styles are just to make the page look nice. */
+
+ /* Workaround to show Arial Black in Firefox. */
+ @font-face {
+ font-family: 'arial-black';
+ src: local('Arial Black');
+ }
+
+ *[contenteditable="true"] {
+ padding: 10px;
+ }
+
+ #container {
+ width: 960px;
+ margin: 30px auto 0;
+ }
+
+ #header {
+ overflow: hidden;
+ padding: 0 0 30px;
+ border-bottom: 5px solid #05B2D2;
+ position: relative;
+ }
+
+ #headerLeft,
+ #headerRight {
+ width: 49%;
+ overflow: hidden;
+ }
+
+ #headerLeft {
+ float: left;
+ padding: 10px 1px 1px;
+ }
+
+ #headerLeft h2,
+ #headerLeft h3 {
+ text-align: right;
+ margin: 0;
+ overflow: hidden;
+ font-weight: normal;
+ }
+
+ #headerLeft h2 {
+ font-family: "Arial Black", arial-black;
+ font-size: 4.6em;
+ line-height: 1.1;
+ text-transform: uppercase;
+ }
+
+ #headerLeft h3 {
+ font-size: 2.3em;
+ line-height: 1.1;
+ margin: .2em 0 0;
+ color: #666;
+ }
+
+ #headerRight {
+ float: right;
+ padding: 1px;
+ }
+
+ #headerRight p {
+ line-height: 1.8;
+ text-align: justify;
+ margin: 0;
+ }
+
+ #headerRight p+p {
+ margin-top: 20px;
+ }
+
+ #headerRight>div {
+ padding: 20px;
+ margin: 0 0 0 30px;
+ font-size: 1.4em;
+ color: #666;
+ }
+
+ #columns {
+ color: #333;
+ overflow: hidden;
+ padding: 20px 0;
+ }
+
+ #columns>div {
+ float: left;
+ width: 33.3%;
+ }
+
+ #columns #column1>div {
+ margin-left: 1px;
+ }
+
+ #columns #column3>div {
+ margin-right: 1px;
+ }
+
+ #columns>div>div {
+ margin: 0px 10px;
+ padding: 10px 20px;
+ }
+
+ #columns blockquote {
+ margin-left: 15px;
+ }
+
+ #tagLine {
+ border-top: 5px solid #05B2D2;
+ padding-top: 20px;
+ }
+
+ #taglist {
+ display: inline-block;
+ margin-left: 20px;
+ font-weight: bold;
+ margin: 0 0 0 20px;
+ }
+ </style>
+</head>
+
+<body>
+ <div>
+ <h1 class="samples"><a href="index.html">CKEditor Samples</a> &raquo; Massive inline editing</h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/inline.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>This sample page demonstrates the inline editing feature - CKEditor instances will be created
+ automatically from page elements with <strong>contentEditable</strong> attribute set to value
+ <strong>true</strong>:</p>
+ <pre class="samples">&lt;div <strong>contenteditable="true</strong>" &gt; ... &lt;/div&gt;</pre>
+ <p>Click inside of any element below to start editing.</p>
+ </div>
+ </div>
+ <div id="container">
+ <div id="header">
+ <div id="headerLeft">
+ <h2 id="sampleTitle" contenteditable="true">
+ CKEditor<br> Goes Inline!
+ </h2>
+ <h3 contenteditable="true">
+ Lorem ipsum dolor sit amet dolor duis blandit vestibulum faucibus a, tortor.
+ </h3>
+ </div>
+ <div id="headerRight">
+ <div contenteditable="true">
+ <p>
+ Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis.
+ Maecenas malesuada elit lectus felis, malesuada ultricies.
+ </p>
+ <p>
+ Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a,
+ convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla
+ imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac.
+ </p>
+ </div>
+ </div>
+ </div>
+ <div id="columns">
+ <div id="column1">
+ <div contenteditable="true">
+ <h3>
+ Fusce vitae porttitor
+ </h3>
+ <p>
+ <strong>
+ Lorem ipsum dolor sit amet dolor. Duis blandit vestibulum faucibus a, tortor.
+ </strong>
+ </p>
+ <p>
+ Proin nunc justo felis mollis tincidunt, risus risus pede, posuere cubilia Curae, Nullam
+ euismod, enim. Etiam nibh ultricies dolor ac dignissim erat volutpat. Vivamus fermentum <a
+ href="https://ckeditor.com/">nisl nulla sem in</a> metus. Maecenas wisi. Donec nec erat
+ volutpat.
+ </p>
+ <blockquote>
+ <p>
+ Fusce vitae porttitor a, euismod convallis nisl, blandit risus tortor, pretium.
+ Vehicula vitae, imperdiet vel, ornare enim vel sodales rutrum
+ </p>
+ </blockquote>
+ <blockquote>
+ <p>
+ Libero nunc, rhoncus ante ipsum non ipsum. Nunc eleifend pede turpis id sollicitudin
+ fringilla. Phasellus ultrices, velit ac arcu.
+ </p>
+ </blockquote>
+ <p>Pellentesque nunc. Donec suscipit erat. Pellentesque habitant morbi tristique ullamcorper.</p>
+ <p><s>Mauris mattis feugiat lectus nec mauris. Nullam vitae ante.</s></p>
+ </div>
+ </div>
+ <div id="column2">
+ <div contenteditable="true">
+ <h3>
+ Integer condimentum sit amet
+ </h3>
+ <p>
+ <strong>Aenean nonummy a, mattis varius. Cras aliquet.</strong>
+ Praesent <a href="https://ckeditor.com/">magna non mattis ac, rhoncus nunc</a>, rhoncus eget,
+ cursus pulvinar mollis.
+ </p>
+ <p>Proin id nibh. Sed eu libero posuere sed, lectus. Phasellus dui gravida gravida feugiat mattis
+ ac, felis.</p>
+ <p>Integer condimentum sit amet, tempor elit odio, a dolor non ante at sapien. Sed ac lectus. Nulla
+ ligula quis eleifend mi, id leo velit pede cursus arcu id nulla ac lectus. Phasellus vestibulum.
+ Nunc viverra enim quis diam.</p>
+ </div>
+ <div contenteditable="true">
+ <h3>
+ Praesent wisi accumsan sit amet nibh
+ </h3>
+ <p>Donec ullamcorper, risus tortor, pretium porttitor. Morbi quam quis lectus non leo.</p>
+ <p style="margin-left: 40px; ">Integer faucibus scelerisque. Proin faucibus at, aliquet vulputate,
+ odio at eros. Fusce <a href="https://ckeditor.com/">gravida, erat vitae augue</a>. Fusce urna
+ fringilla gravida.</p>
+ <p>In hac habitasse platea dictumst. Praesent wisi accumsan sit amet nibh. Maecenas orci luctus a,
+ lacinia quam sem, posuere commodo, odio condimentum tempor, pede semper risus. Suspendisse pede.
+ In hac habitasse platea dictumst. Nam sed laoreet sit amet erat. Integer.</p>
+ </div>
+ </div>
+ <div id="column3">
+ <div contenteditable="true">
+ <p>
+ <img src="assets/inlineall/logo.png" alt="CKEditor logo" style="float:left">
+ </p>
+ <p>Quisque justo neque, mattis sed, fermentum ultrices <strong>posuere cubilia Curae</strong>,
+ Vestibulum elit metus, quis placerat ut, lectus. Ut sagittis, nunc libero, egestas consequat
+ lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis. Nullam laoreet
+ vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Donec odio nec velit ac nunc sit
+ amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi.</p>
+ <h3>
+ Nullam laoreet vel consectetuer tellus suscipit
+ </h3>
+ <ul>
+ <li>Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis.</li>
+ <li>Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit
+ ultricies, hendrerit wisi.</li>
+ <li>Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.</li>
+ </ul>
+ <p>Quisque justo neque, mattis sed, <a href="https://ckeditor.com/">fermentum ultrices posuere
+ cubilia</a> Curae, Vestibulum elit metus, quis placerat ut, lectus.</p>
+ <p>Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Ut sagittis, nunc
+ libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis
+ turpis.</p>
+ <p>Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis
+ mi. Sed in nonummy faucibus turpis. Mauris eget tellus. Donec non felis. Nam eget dolor.
+ Vestibulum enim. Donec.</p>
+ </div>
+ </div>
+ </div>
+ <div id="tagLine">
+ Tags of this article:
+ <p id="taglist" contenteditable="true">
+ inline, editing, floating, CKEditor
+ </p>
+ </div>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">
+ https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a>
+ - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/inlinebycode.html b/samples/old/inlinebycode.html
new file mode 100755
index 0000000..2d9188f
--- /dev/null
+++ b/samples/old/inlinebycode.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Inline Editing by Code &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+ #editable {
+ padding: 10px;
+ float: left;
+ }
+ </style>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Inline Editing by Code
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/inline.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to create an inline editor instance of CKEditor. It is created
+ with a JavaScript call using the following code:
+ </p>
+ <pre class="samples">
+// This property tells CKEditor to not activate every element with contenteditable=true element.
+CKEDITOR.disableAutoInline = true;
+
+var editor = CKEDITOR.inline( document.getElementById( 'editable' ) );
+</pre>
+ <p>
+ Note that <code>editable</code> in the code above is the <code>id</code>
+ attribute of the <code>&lt;div&gt;</code> element to be converted into an inline instance.
+ </p>
+ </div>
+ <div id="editable" contenteditable="true">
+ <h1><img alt="Saturn V carrying Apollo 11" class="right" src="assets/sample.jpg" /> Apollo 11</h1>
+
+ <p><b>Apollo 11</b> was the spaceflight that landed the first humans, Americans <a
+ href="http://en.wikipedia.org/wiki/Neil_Armstrong" title="Neil Armstrong">Neil Armstrong</a> and <a
+ href="http://en.wikipedia.org/wiki/Buzz_Aldrin" title="Buzz Aldrin">Buzz Aldrin</a>, on the Moon on July
+ 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21
+ at 02:56 UTC.</p>
+
+ <p>Armstrong spent about <s>three and a half</s> two and a half hours outside the spacecraft, Aldrin slightly
+ less; and together they collected 47.5 pounds (21.5&nbsp;kg) of lunar material for return to Earth. A third
+ member of the mission, <a href="http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)"
+ title="Michael Collins (astronaut)">Michael Collins</a>, piloted the <a
+ href="http://en.wikipedia.org/wiki/Apollo_Command/Service_Module"
+ title="Apollo Command/Service Module">command</a> spacecraft alone in lunar orbit until Armstrong and
+ Aldrin returned to it for the trip back to Earth.</p>
+
+ <h2>Broadcasting and <em>quotes</em> <a id="quotes" name="quotes"></a></h2>
+
+ <p>Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the
+ event as:</p>
+
+ <blockquote>
+ <p>One small step for [a] man, one giant leap for mankind.</p>
+ </blockquote>
+
+ <p>Apollo 11 effectively ended the <a href="http://en.wikipedia.org/wiki/Space_Race" title="Space Race">Space
+ Race</a> and fulfilled a national goal proposed in 1961 by the late U.S. President <a
+ href="http://en.wikipedia.org/wiki/John_F._Kennedy" title="John F. Kennedy">John F. Kennedy</a> in a
+ speech before the United States Congress:</p>
+
+ <blockquote>
+ <p>[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.</p>
+ </blockquote>
+
+ <h2>Technical details <a id="tech-details" name="tech-details"></a></h2>
+
+ <table align="right" border="1" bordercolor="#ccc" cellpadding="5" cellspacing="0"
+ style="border-collapse:collapse;margin:10px 0 10px 15px;">
+ <caption><strong>Mission crew</strong></caption>
+ <thead>
+ <tr>
+ <th scope="col">Position</th>
+ <th scope="col">Astronaut</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Commander</td>
+ <td>Neil A. Armstrong</td>
+ </tr>
+ <tr>
+ <td>Command Module Pilot</td>
+ <td>Michael Collins</td>
+ </tr>
+ <tr>
+ <td>Lunar Module Pilot</td>
+ <td>Edwin &quot;Buzz&quot; E. Aldrin, Jr.</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <p>Launched by a <strong>Saturn V</strong> rocket from <a
+ href="http://en.wikipedia.org/wiki/Kennedy_Space_Center" title="Kennedy Space Center">Kennedy Space
+ Center</a> in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of <a
+ href="http://en.wikipedia.org/wiki/NASA" title="NASA">NASA</a>&#39;s Apollo program. The Apollo
+ spacecraft had three parts:</p>
+
+ <ol>
+ <li><strong>Command Module</strong> with a cabin for the three astronauts which was the only part which
+ landed back on Earth</li>
+ <li><strong>Service Module</strong> which supported the Command Module with propulsion, electrical power,
+ oxygen and water</li>
+ <li><strong>Lunar Module</strong> for landing on the Moon.</li>
+ </ol>
+
+ <p>After being sent to the Moon by the Saturn V&#39;s upper stage, the astronauts separated the spacecraft from
+ it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into
+ the Lunar Module and landed in the <a href="http://en.wikipedia.org/wiki/Mare_Tranquillitatis"
+ title="Mare Tranquillitatis">Sea of Tranquility</a>. They stayed a total of about 21 and a half hours on
+ the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the
+ Command Module, they returned to Earth and landed in the <a
+ href="http://en.wikipedia.org/wiki/Pacific_Ocean" title="Pacific Ocean">Pacific Ocean</a> on July 24.
+ </p>
+
+ <hr />
+ <p style="text-align: right;"><small>Source: <a
+ href="http://en.wikipedia.org/wiki/Apollo_11">Wikipedia.org</a></small></p>
+ </div>
+
+ <script>
+ // We need to turn off the automatic editor creation first.
+ CKEDITOR.disableAutoInline = true;
+
+ var editor = CKEDITOR.inline('editable');
+ </script>
+ <div id="footer">
+ <hr>
+ <p contenteditable="true">
+ CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">
+ https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a>
+ - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/inlinetextarea.html b/samples/old/inlinetextarea.html
new file mode 100755
index 0000000..eea0a97
--- /dev/null
+++ b/samples/old/inlinetextarea.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Replace Textarea with Inline Editor &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+ /* Style the CKEditor element to look like a textfield */
+ .cke_textarea_inline {
+ padding: 10px;
+ height: 200px;
+ overflow: auto;
+
+ border: 1px solid gray;
+ -webkit-appearance: textfield;
+ }
+ </style>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Replace Textarea with Inline Editor
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/inline.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ You can also create an inline editor from a <code>textarea</code>
+ element. In this case the <code>textarea</code> will be replaced
+ by a <code>div</code> element with inline editing enabled.
+ </p>
+ <pre class="samples">
+// "article-body" is the name of a textarea element.
+var editor = CKEDITOR.inline( 'article-body' );
+</pre>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <h2>This is a sample form with some fields</h2>
+ <p>
+ Title:<br>
+ <input type="text" name="title" value="Sample Form">
+ </p>
+ <p>
+ Article Body (Textarea converted to CKEditor):<br>
+ <textarea name="article-body" style="height: 200px">
+ &lt;h2&gt;Technical details &lt;a id="tech-details" name="tech-details"&gt;&lt;/a&gt;&lt;/h2&gt;
+
+ &lt;table align="right" border="1" bordercolor="#ccc" cellpadding="5" cellspacing="0" style="border-collapse:collapse;margin:10px 0 10px 15px;"&gt;
+ &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt;
+ &lt;thead&gt;
+ &lt;tr&gt;
+ &lt;th scope="col"&gt;Position&lt;/th&gt;
+ &lt;th scope="col"&gt;Astronaut&lt;/th&gt;
+ &lt;/tr&gt;
+ &lt;/thead&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Commander&lt;/td&gt;
+ &lt;td&gt;Neil A. Armstrong&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Command Module Pilot&lt;/td&gt;
+ &lt;td&gt;Michael Collins&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Lunar Module Pilot&lt;/td&gt;
+ &lt;td&gt;Edwin &quot;Buzz&quot; E. Aldrin, Jr.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+
+ &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href="http://en.wikipedia.org/wiki/Kennedy_Space_Center" title="Kennedy Space Center"&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href="http://en.wikipedia.org/wiki/NASA" title="NASA"&gt;NASA&lt;/a&gt;&#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt;
+
+ &lt;ol&gt;
+ &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt;
+ &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt;
+ &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt;
+ &lt;/ol&gt;
+
+ &lt;p&gt;After being sent to the Moon by the Saturn V&#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href="http://en.wikipedia.org/wiki/Mare_Tranquillitatis" title="Mare Tranquillitatis"&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href="http://en.wikipedia.org/wiki/Pacific_Ocean" title="Pacific Ocean"&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt;
+
+ &lt;hr /&gt;
+ &lt;p style="text-align: right;"&gt;&lt;small&gt;Source: &lt;a href="http://en.wikipedia.org/wiki/Apollo_11"&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+
+ <script>
+ CKEDITOR.inline('article-body');
+ </script>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="https://ckeditor.com/">
+ https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a>
+ - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/jquery.html b/samples/old/jquery.html
new file mode 100755
index 0000000..9b68235
--- /dev/null
+++ b/samples/old/jquery.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>jQuery Adapter &mdash; CKEditor Sample</title>
+ <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
+ <script src="../../ckeditor.js"></script>
+ <script src="../../adapters/jquery.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+ #editable {
+ padding: 10px;
+ float: left;
+ }
+ </style>
+ <script>
+
+ CKEDITOR.disableAutoInline = true;
+
+ $(document).ready(function () {
+ $('#editor1').ckeditor(); // Use CKEDITOR.replace() if element is <textarea>.
+ $('#editable').ckeditor(); // Use CKEDITOR.inline().
+ });
+
+ function setValue() {
+ $('#editor1').val($('input#val').val());
+ }
+
+ </script>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html" id="a-test">CKEditor Samples</a> &raquo; Create Editors with jQuery
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">brand new samples in CKEditor
+ Examples</a>.
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <div class="description">
+ <p>
+ This sample shows how to use the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_jquery.html">jQuery adapter</a>.
+ Note that you have to include both CKEditor and jQuery scripts before including the adapter.
+ </p>
+
+ <pre class="samples">
+&lt;script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"&gt;&lt;/script&gt;
+&lt;script src="/ckedit../../ckeditor.js"&gt;&lt;/script&gt;
+&lt;script src="/ckeditor/adapters/jquery.js"&gt;&lt;/script&gt;
+</pre>
+
+ <p>Then you can replace HTML elements with a CKEditor instance using the <code>ckeditor()</code> method.</p>
+
+ <pre class="samples">
+$( document ).ready( function() {
+ $( 'textarea#editor1' ).ckeditor();
+} );
+</pre>
+ </div>
+
+ <h2 class="samples">Inline Example</h2>
+
+ <div id="editable" contenteditable="true">
+ <p><img alt="Saturn V carrying Apollo 11" class="right" src="assets/sample.jpg" /><b>Apollo 11</b> was the
+ spaceflight that landed the first humans, Americans <a
+ href="http://en.wikipedia.org/wiki/Neil_Armstrong" title="Neil Armstrong">Neil Armstrong</a> and <a
+ href="http://en.wikipedia.org/wiki/Buzz_Aldrin" title="Buzz Aldrin">Buzz Aldrin</a>, on the Moon on
+ July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on
+ July 21 at 02:56 UTC.</p>
+ <p>Armstrong spent about <s>three and a half</s> two and a half hours outside the spacecraft, Aldrin
+ slightly less; and together they collected 47.5 pounds (21.5&nbsp;kg) of lunar material for return to
+ Earth. A third member of the mission, <a href="http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)"
+ title="Michael Collins (astronaut)">Michael Collins</a>, piloted the <a
+ href="http://en.wikipedia.org/wiki/Apollo_Command/Service_Module"
+ title="Apollo Command/Service Module">command</a> spacecraft alone in lunar orbit until Armstrong
+ and Aldrin returned to it for the trip back to Earth.
+ <p>Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the
+ event as:</p>
+ <blockquote>
+ <p>One small step for [a] man, one giant leap for mankind.</p>
+ </blockquote>
+ <p>Apollo 11 effectively ended the <a href="http://en.wikipedia.org/wiki/Space_Race"
+ title="Space Race">Space Race</a> and fulfilled a national goal proposed in 1961 by the late U.S.
+ President <a href="http://en.wikipedia.org/wiki/John_F._Kennedy" title="John F. Kennedy">John F.
+ Kennedy</a> in a speech before the United States Congress:</p>
+ <blockquote>
+ <p>[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.
+ </p>
+ </blockquote>
+ </div>
+
+ <br style="clear: both">
+
+ <h2 class="samples">Classic (iframe-based) Example</h2>
+
+ <textarea cols="80" id="editor1" name="editor1" rows="10">
+ &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+
+ <p style="overflow: hidden">
+ <input style="float: left" type="submit" value="Submit">
+ <span style="float: right">
+ <input type="text" id="val" value="I'm using jQuery val()!" size="30">
+ <input onclick="setValue();" type="button" value="Set value">
+ </span>
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/magicline/magicline.html b/samples/old/magicline/magicline.html
new file mode 100755
index 0000000..70d1dcd
--- /dev/null
+++ b/samples/old/magicline/magicline.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Using Magicline plugin &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <link rel="stylesheet" href="../../../samples/old/sample.css">
+ <meta name="ckeditor-sample-name" content="Magicline plugin">
+ <meta name="ckeditor-sample-group" content="Plugins">
+ <meta name="ckeditor-sample-description" content="Using the Magicline plugin to access difficult focus spaces.">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Using Magicline plugin
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/magicline.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows the advantages of <strong>Magicline</strong> plugin
+ which is to enhance the editing process. Thanks to this plugin,
+ a number of difficult focus spaces which are inaccessible due to
+ browser issues can now be focused.
+ </p>
+ <p>
+ <strong>Magicline</strong> plugin shows a red line with a handler
+ which, when clicked, inserts a paragraph and allows typing. To see this,
+ focus an editor and move your mouse above the focus space you want
+ to access. The plugin is enabled by default so no additional
+ configuration is necessary.
+ </p>
+ </div>
+ <div>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <div class="description">
+ <p>
+ This editor uses a default <strong>Magicline</strong> setup.
+ </p>
+ </div>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">
+ &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;This table&lt;/td&gt;
+ &lt;td&gt;is the&lt;/td&gt;
+ &lt;td&gt;very first&lt;/td&gt;
+ &lt;td&gt;element of the document.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;We are still&lt;/td&gt;
+ &lt;td&gt;able to acces&lt;/td&gt;
+ &lt;td&gt;the space before it.&lt;/td&gt;
+ &lt;td&gt;
+ &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+ &lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+
+ &lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;
+
+ &lt;hr /&gt;
+ &lt;hr /&gt;
+ &lt;ol&gt;
+ &lt;li&gt;This numbered list...&lt;/li&gt;
+ &lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;
+ &lt;li&gt;...and another list.&lt;/li&gt;
+ &lt;/ol&gt;
+
+ &lt;ul&gt;
+ &lt;li&gt;We can type between the lists...&lt;/li&gt;
+ &lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;
+ &lt;/ul&gt;
+
+ &lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;
+
+ &lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;
+
+ &lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;
+
+ &lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;
+ &lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;
+ &lt;/div&gt;
+ </textarea>
+ <script>
+
+ // This call can be placed at any point after the
+ // <textarea>, or inside a <head><script> in a
+ // window.onload event handler.
+
+ CKEDITOR.replace('editor1', {
+ extraPlugins: 'magicline', // Ensure that magicline plugin, which is required for this sample, is loaded.
+ allowedContent: true // Switch off the ACF, so very complex content created to
+ // show magicline's power isn't filtered.
+ });
+
+ </script>
+ </div>
+ <br>
+ <div>
+ <label for="editor2">
+ Editor 2:
+ </label>
+ <div class="description">
+ <p>
+ This editor is using a blue line.
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( 'editor2', {
+ magicline_color: 'blue'
+});</pre>
+ </div>
+ <textarea cols="80" id="editor2" name="editor2" rows="10">
+ &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;This table&lt;/td&gt;
+ &lt;td&gt;is the&lt;/td&gt;
+ &lt;td&gt;very first&lt;/td&gt;
+ &lt;td&gt;element of the document.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;We are still&lt;/td&gt;
+ &lt;td&gt;able to acces&lt;/td&gt;
+ &lt;td&gt;the space before it.&lt;/td&gt;
+ &lt;td&gt;
+ &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+ &lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+
+ &lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;
+
+ &lt;hr /&gt;
+ &lt;hr /&gt;
+ &lt;ol&gt;
+ &lt;li&gt;This numbered list...&lt;/li&gt;
+ &lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;
+ &lt;li&gt;...and another list.&lt;/li&gt;
+ &lt;/ol&gt;
+
+ &lt;ul&gt;
+ &lt;li&gt;We can type between the lists...&lt;/li&gt;
+ &lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;
+ &lt;/ul&gt;
+
+ &lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;
+
+ &lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;
+
+ &lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;
+
+ &lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;
+ &lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;
+ &lt;/div&gt;
+ </textarea>
+ <script>
+
+ // This call can be placed at any point after the
+ // <textarea>, or inside a <head><script> in a
+ // window.onload event handler.
+
+ CKEDITOR.replace('editor2', {
+ extraPlugins: 'magicline', // Ensure that magicline plugin, which is required for this sample, is loaded.
+ magicline_color: 'blue', // Blue line
+ allowedContent: true // Switch off the ACF, so very complex content created to
+ // show magicline's power isn't filtered.
+ });
+
+ </script>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/readonly.html b/samples/old/readonly.html
new file mode 100755
index 0000000..22216a5
--- /dev/null
+++ b/samples/old/readonly.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Using the CKEditor Read-Only API &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+ <script>
+
+ var editor;
+
+ // The instanceReady event is fired, when an instance of CKEditor has finished
+ // its initialization.
+ CKEDITOR.on('instanceReady', function (ev) {
+ editor = ev.editor;
+
+ // Show this "on" button.
+ document.getElementById('readOnlyOn').style.display = '';
+
+ // Event fired when the readOnly property changes.
+ editor.on('readOnly', function () {
+ document.getElementById('readOnlyOn').style.display = this.readOnly ? 'none' : '';
+ document.getElementById('readOnlyOff').style.display = this.readOnly ? '' : 'none';
+ });
+ });
+
+ function toggleReadOnly(isReadOnly) {
+ // Change the read-only state of the editor.
+ // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-setReadOnly
+ editor.setReadOnly(isReadOnly);
+ }
+
+ </script>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Using the CKEditor Read-Only API
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/readonly.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to use the
+ <code><a class="samples" href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-setReadOnly">setReadOnly</a></code>
+ API to put editor into the read-only state that makes it impossible for users to change the editor contents.
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ <textarea class="ckeditor" id="editor1" name="editor1" cols="100"
+ rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ </p>
+ <p>
+ <input id="readOnlyOn" onclick="toggleReadOnly();" type="button" value="Make it read-only"
+ style="display:none">
+ <input id="readOnlyOff" onclick="toggleReadOnly( false );" type="button" value="Make it editable again"
+ style="display:none">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/replacebyclass.html b/samples/old/replacebyclass.html
new file mode 100755
index 0000000..4c27326
--- /dev/null
+++ b/samples/old/replacebyclass.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Replace Textareas by Class Name &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Replace Textarea Elements by Class Name
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out the <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/index.html">brand new samples in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to automatically replace all <code>&lt;textarea&gt;</code> elements
+ of a given class with a CKEditor instance.
+ </p>
+ <p>
+ To replace a <code>&lt;textarea&gt;</code> element, simply assign it the <code>ckeditor</code>
+ class, as in the code below:
+ </p>
+ <pre class="samples">
+&lt;textarea <strong>class="ckeditor</strong>" name="editor1"&gt;&lt;/textarea&gt;
+</pre>
+ <p>
+ Note that other <code>&lt;textarea&gt;</code> attributes (like <code>id</code> or <code>name</code>) need to
+ be adjusted to your document.
+ </p>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <textarea class="ckeditor" cols="80" id="editor1" name="editor1" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/replacebycode.html b/samples/old/replacebycode.html
new file mode 100755
index 0000000..b72a95c
--- /dev/null
+++ b/samples/old/replacebycode.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Replace Textarea by Code &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Replace Textarea Elements Using JavaScript Code
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/classic.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <div class="description">
+ <p>
+ This editor is using an <code>&lt;iframe&gt;</code> element-based editing area, provided by the
+ <strong>Wysiwygarea</strong> plugin.
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>' )
+</pre>
+ </div>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ // This call can be placed at any point after the
+ // <textarea>, or inside a <head><script> in a
+ // window.onload event handler.
+
+ // Replace the <textarea id="editor"> with an CKEditor
+ // instance, using default configurations.
+
+ CKEDITOR.replace('editor1');
+
+ </script>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/sample.css b/samples/old/sample.css
new file mode 100755
index 0000000..12f4d4d
--- /dev/null
+++ b/samples/old/sample.css
@@ -0,0 +1,375 @@
+/*
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+*/
+
+html,
+body,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+div,
+span,
+blockquote,
+p,
+address,
+form,
+fieldset,
+img,
+ul,
+ol,
+dl,
+dt,
+dd,
+li,
+hr,
+table,
+td,
+th,
+strong,
+em,
+sup,
+sub,
+dfn,
+ins,
+del,
+q,
+cite,
+var,
+samp,
+code,
+kbd,
+tt,
+pre {
+ line-height: 1.5;
+}
+
+body {
+ padding: 10px 30px;
+}
+
+input,
+textarea,
+select,
+option,
+optgroup,
+button,
+td,
+th {
+ font-size: 100%;
+}
+
+pre {
+ -moz-tab-size: 4;
+ tab-size: 4;
+}
+
+pre,
+code,
+kbd,
+samp,
+tt {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+body {
+ width: 960px;
+ margin: 0 auto;
+}
+
+code {
+ background: #f3f3f3;
+ border: 1px solid #ddd;
+ padding: 1px 4px;
+ border-radius: 3px;
+}
+
+abbr {
+ border-bottom: 1px dotted #555;
+ cursor: pointer;
+}
+
+.new,
+.beta {
+ text-transform: uppercase;
+ font-size: 10px;
+ font-weight: bold;
+ padding: 1px 4px;
+ margin: 0 0 0 5px;
+ color: #fff;
+ float: right;
+ border-radius: 3px;
+}
+
+.new {
+ background: #FF7E00;
+ border: 1px solid #DA8028;
+ text-shadow: 0 1px 0 #C97626;
+
+ box-shadow: 0 2px 3px 0 #FFA54E inset;
+}
+
+.beta {
+ background: #18C0DF;
+ border: 1px solid #19AAD8;
+ text-shadow: 0 1px 0 #048CAD;
+ font-style: italic;
+
+ box-shadow: 0 2px 3px 0 #50D4FD inset;
+}
+
+h1.samples {
+ color: #0782C1;
+ font-size: 200%;
+ font-weight: normal;
+ margin: 0;
+ padding: 0;
+}
+
+h1.samples a {
+ color: #0782C1;
+ text-decoration: none;
+ border-bottom: 1px dotted #0782C1;
+}
+
+.samples a:hover {
+ border-bottom: 1px dotted #0782C1;
+}
+
+h2.samples {
+ color: #000000;
+ font-size: 130%;
+ margin: 15px 0 0 0;
+ padding: 0;
+}
+
+p,
+blockquote,
+address,
+form,
+pre,
+dl,
+h1.samples,
+h2.samples {
+ margin-bottom: 15px;
+}
+
+ul.samples {
+ margin-bottom: 15px;
+}
+
+.clear {
+ clear: both;
+}
+
+fieldset {
+ margin: 0;
+ padding: 10px;
+}
+
+body,
+input,
+textarea {
+ color: #333333;
+ font-family: Arial, Helvetica, sans-serif;
+}
+
+body {
+ font-size: 75%;
+}
+
+a.samples {
+ color: #189DE1;
+ text-decoration: none;
+}
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+pre.samples {
+ background-color: #F7F7F7;
+ border: 1px solid #D7D7D7;
+ overflow: auto;
+ padding: 0.25em;
+ white-space: pre-wrap;
+ /* CSS 2.1 */
+ word-wrap: break-word;
+ /* IE7 */
+}
+
+#footer {
+ clear: both;
+ padding-top: 10px;
+}
+
+#footer hr {
+ margin: 10px 0 15px 0;
+ height: 1px;
+ border: solid 1px gray;
+ border-bottom: none;
+}
+
+#footer p {
+ margin: 0 10px 10px 10px;
+ float: left;
+}
+
+#footer #copy {
+ float: right;
+}
+
+#outputSample {
+ width: 100%;
+ table-layout: fixed;
+}
+
+#outputSample thead th {
+ color: #dddddd;
+ background-color: #999999;
+ padding: 4px;
+ white-space: nowrap;
+}
+
+#outputSample tbody th {
+ vertical-align: top;
+ text-align: left;
+}
+
+#outputSample pre {
+ margin: 0;
+ padding: 0;
+}
+
+.description {
+ border: 1px dotted #B7B7B7;
+ margin-bottom: 10px;
+ padding: 10px 10px 0;
+ overflow: hidden;
+}
+
+label {
+ display: block;
+ margin-bottom: 6px;
+}
+
+/**
+ * CKEditor editables are automatically set with the "cke_editable" class
+ * plus cke_editable_(inline|themed) depending on the editor type.
+ */
+
+/* Style a bit the inline editables. */
+.cke_editable.cke_editable_inline {
+ cursor: pointer;
+}
+
+/* Once an editable element gets focused, the "cke_focus" class is
+ added to it, so we can style it differently. */
+.cke_editable.cke_editable_inline.cke_focus {
+ box-shadow: inset 0px 0px 20px 3px #ddd, inset 0 0 1px #000;
+ outline: none;
+ background: #eee;
+ cursor: text;
+}
+
+/* Avoid pre-formatted overflows inline editable. */
+.cke_editable_inline pre {
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+/**
+ * Samples index styles.
+ */
+
+.twoColumns,
+.twoColumnsLeft,
+.twoColumnsRight {
+ overflow: hidden;
+}
+
+.twoColumnsLeft,
+.twoColumnsRight {
+ width: 45%;
+}
+
+.twoColumnsLeft {
+ float: left;
+}
+
+.twoColumnsRight {
+ float: right;
+}
+
+dl.samples {
+ padding: 0 0 0 40px;
+}
+
+dl.samples>dt {
+ display: list-item;
+ list-style-type: disc;
+ list-style-position: outside;
+ margin: 0 0 3px;
+}
+
+dl.samples>dd {
+ margin: 0 0 3px;
+}
+
+.warning {
+ color: #ff0000;
+ background-color: #FFCCBA;
+ border: 2px dotted #ff0000;
+ padding: 15px 10px;
+ margin: 10px 0;
+}
+
+.warning.deprecated {
+ font-size: 1.3em;
+}
+
+/* Used on inline samples */
+
+blockquote {
+ font-style: italic;
+ font-family: Georgia, Times, "Times New Roman", serif;
+ padding: 2px 0;
+ border-style: solid;
+ border-color: #ccc;
+ border-width: 0;
+}
+
+.cke_contents_ltr blockquote {
+ padding-left: 20px;
+ padding-right: 8px;
+ border-left-width: 5px;
+}
+
+.cke_contents_rtl blockquote {
+ padding-left: 8px;
+ padding-right: 20px;
+ border-right-width: 5px;
+}
+
+img.right {
+ border: 1px solid #ccc;
+ float: right;
+ margin-left: 15px;
+ padding: 5px;
+}
+
+img.left {
+ border: 1px solid #ccc;
+ float: left;
+ margin-right: 15px;
+ padding: 5px;
+}
+
+.marker {
+ background-color: Yellow;
+} \ No newline at end of file
diff --git a/samples/old/sample.js b/samples/old/sample.js
new file mode 100755
index 0000000..6ea2cf6
--- /dev/null
+++ b/samples/old/sample.js
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+// Tool scripts for the sample pages.
+// This file can be ignored and is not required to make use of CKEditor.
+
+(function() {
+ CKEDITOR.on('instanceReady', function(ev) {
+ // Check for sample compliance.
+ var editor = ev.editor,
+ meta = CKEDITOR.document.$.getElementsByName('ckeditor-sample-required-plugins'),
+ requires = meta.length ? CKEDITOR.dom.element.get(meta[0]).getAttribute('content').split(',') : [],
+ missing = [],
+ i;
+
+ if (requires.length) {
+ for (i = 0; i < requires.length; i++) {
+ if (!editor.plugins[requires[i]])
+ missing.push('<code>' + requires[i] + '</code>');
+ }
+
+ if (missing.length) {
+ var warn = CKEDITOR.dom.element.createFromHtml(
+ '<div class="warning">' +
+ '<span>To fully experience this demo, the ' + missing.join(', ') + ' plugin' + (missing.length > 1 ? 's are' : ' is') + ' required.</span>' +
+ '</div>'
+ );
+ warn.insertBefore(editor.container);
+ }
+ }
+
+ // Set icons.
+ var doc = new CKEDITOR.dom.document(document),
+ icons = doc.find('.button_icon');
+
+ for (i = 0; i < icons.count(); i++) {
+ var icon = icons.getItem(i),
+ name = icon.getAttribute('data-icon'),
+ style = CKEDITOR.skin.getIconStyle(name, (CKEDITOR.lang.dir == 'rtl'));
+
+ icon.addClass('cke_button_icon');
+ icon.addClass('cke_button__' + name + '_icon');
+ icon.setAttribute('style', style);
+ icon.setStyle('float', 'none');
+
+ }
+ });
+})();
diff --git a/samples/old/sample_posteddata.php b/samples/old/sample_posteddata.php
new file mode 100755
index 0000000..0f029af
--- /dev/null
+++ b/samples/old/sample_posteddata.php
@@ -0,0 +1,16 @@
+<?php /* <body><pre>
+
+-------------------------------------------------------------------------------------------
+ CKEditor - Posted Data
+
+ We are sorry, but your Web server does not support the PHP language used in this script.
+
+ Please note that CKEditor can be used with any other server-side language than just PHP.
+ To save the content created with CKEditor you need to read the POST data on the server
+ side and write it to a file or the database.
+
+ Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-------------------------------------------------------------------------------------------
+
+</pre><div style="display:none"></body> */ include "assets/posteddata.php"; ?>
diff --git a/samples/old/tabindex.html b/samples/old/tabindex.html
new file mode 100755
index 0000000..bf82c55
--- /dev/null
+++ b/samples/old/tabindex.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>TAB Key-Based Navigation &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+ .cke_focused,
+ .cke_editable.cke_focused {
+ outline: 3px dotted blue !important;
+ *border: 3px dotted blue !important;
+ /* For IE7 */
+ }
+ </style>
+ <script>
+
+ CKEDITOR.on('instanceReady', function (evt) {
+ var editor = evt.editor;
+ editor.setData('This editor has it\'s tabIndex set to <strong>' + editor.tabIndex + '</strong>');
+
+ // Apply focus class name.
+ editor.on('focus', function () {
+ editor.container.addClass('cke_focused');
+ });
+ editor.on('blur', function () {
+ editor.container.removeClass('cke_focused');
+ });
+
+ // Put startup focus on the first editor in tab order.
+ if (editor.tabIndex == 1)
+ editor.focus();
+ });
+
+ </script>
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; TAB Key-Based Navigation
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/tabindex.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how tab key navigation among editor instances is
+ affected by the <code>tabIndex</code> attribute from
+ the original page element. Use TAB key to move between the editors.
+ </p>
+ </div>
+ <p>
+ <textarea class="ckeditor" cols="80" id="editor4" rows="10" tabindex="1"></textarea>
+ </p>
+ <div class="ckeditor" contenteditable="true" id="editor1" tabindex="4"></div>
+ <p>
+ <textarea class="ckeditor" cols="80" id="editor2" rows="10" tabindex="2"></textarea>
+ </p>
+ <p>
+ <textarea class="ckeditor" cols="80" id="editor3" rows="10" tabindex="3"></textarea>
+ </p>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/toolbar/toolbar.html b/samples/old/toolbar/toolbar.html
new file mode 100755
index 0000000..2fe3f8b
--- /dev/null
+++ b/samples/old/toolbar/toolbar.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Toolbar Configuration &mdash; CKEditor Sample</title>
+ <meta name="ckeditor-sample-name" content="Toolbar Configurations">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description" content="Configuring CKEditor to display full or custom toolbar layout.">
+ <script src="../../../ckeditor.js"></script>
+ <link href="../../../samples/old/sample.css" rel="stylesheet">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Toolbar Configuration
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out the <a
+ href="../../../samples/toolbarconfigurator/index.html#basic">brand new CKEditor Toolbar Configurator</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample page demonstrates editor with loaded <a href="#fullToolbar">full toolbar</a> (all registered
+ buttons) and, if
+ current editor's configuration modifies default settings, also editor with <a
+ href="#currentToolbar">modified toolbar</a>.
+ </p>
+
+ <p>Since CKEditor 4 there are two ways to configure toolbar buttons.</p>
+
+ <h2 class="samples">By <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-toolbar">config.toolbar</a>
+ </h2>
+
+ <p>
+ You can explicitly define which buttons are displayed in which groups and in which order.
+ This is the more precise setting, but less flexible. If newly added plugin adds its
+ own button you'll have to add it manually to your <code>config.toolbar</code> setting as well.
+ </p>
+
+ <p>To add a CKEditor instance with custom toolbar setting, insert the following JavaScript call to your code:
+ </p>
+
+ <pre class="samples">
+CKEDITOR.replace( <em>'textarea_id'</em>, {
+ <strong>toolbar:</strong> [
+ { name: 'document', items: [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ] }, // Defines toolbar group with name (used to create voice label) and items in 3 subgroups.
+ [ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ], // Defines toolbar group without name.
+ '/', // Line break - next group will be placed in new line.
+ { name: 'basicstyles', items: [ 'Bold', 'Italic' ] }
+ ]
+});</pre>
+
+ <h2 class="samples">By <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-toolbarGroups">config.toolbarGroups</a>
+ </h2>
+
+ <p>
+ You can define which groups of buttons (like e.g. <code>basicstyles</code>, <code>clipboard</code>
+ and <code>forms</code>) are displayed and in which order. Registered buttons are associated
+ with toolbar groups by <code>toolbar</code> property in their definition.
+ This setting's advantage is that you don't have to modify toolbar configuration
+ when adding/removing plugins which register their own buttons.
+ </p>
+
+ <p>To add a CKEditor instance with custom toolbar groups setting, insert the following JavaScript call to your
+ code:</p>
+
+ <pre class="samples">
+CKEDITOR.replace( <em>'textarea_id'</em>, {
+ <strong>toolbarGroups:</strong> [
+ { name: 'document', groups: [ 'mode', 'document' ] }, // Displays document group with its two subgroups.
+ { name: 'clipboard', groups: [ 'clipboard', 'undo' ] }, // Group's name will be used to create voice label.
+ '/', // Line break - next group will be placed in new line.
+ { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
+ { name: 'links' }
+ ]
+
+ // NOTE: Remember to leave 'toolbar' property with the default value (null).
+});</pre>
+ </div>
+
+ <div id="currentToolbar" style="display: none">
+ <h2 class="samples">Current toolbar configuration</h2>
+ <p>Below you can see editor with current toolbar definition.</p>
+ <textarea cols="80" id="editorCurrent" name="editorCurrent"
+ rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <pre id="editorCurrentCfg" class="samples"></pre>
+ </div>
+
+ <div id="fullToolbar">
+ <h2 class="samples">Full toolbar configuration</h2>
+ <p>Below you can see editor with full toolbar, generated automatically by the editor.</p>
+ <p>
+ <strong>Note</strong>: To create editor instance with full toolbar you don't have to set anything.
+ Just leave <code>toolbar</code> and <code>toolbarGroups</code> with the default, <code>null</code> values.
+ </p>
+ <textarea cols="80" id="editorFull" name="editorFull"
+ rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <pre id="editorFullCfg" class="samples"></pre>
+ </div>
+
+ <script>
+
+ (function () {
+ 'use strict';
+
+ var buttonsNames;
+
+ CKEDITOR.config.extraPlugins = 'toolbar';
+
+ CKEDITOR.on('instanceReady', function (evt) {
+ var editor = evt.editor,
+ editorCurrent = editor.name == 'editorCurrent',
+ defaultToolbar = !(editor.config.toolbar || editor.config.toolbarGroups || editor.config.removeButtons),
+ pre = CKEDITOR.document.getById(editor.name + 'Cfg'),
+ output = '';
+
+ if (editorCurrent) {
+ // If default toolbar configuration has been modified, show "current toolbar" section.
+ if (!defaultToolbar)
+ CKEDITOR.document.getById('currentToolbar').show();
+ else
+ return;
+ }
+
+ if (!buttonsNames)
+ buttonsNames = createButtonsNamesHash(editor.ui.items);
+
+ // Toolbar isn't set explicitly, so it was created automatically from toolbarGroups.
+ if (!editor.config.toolbar) {
+ output +=
+ '// Toolbar configuration generated automatically by the editor based on config.toolbarGroups.\n' +
+ dumpToolbarConfiguration(editor) +
+ '\n\n' +
+ '// Toolbar groups configuration.\n' +
+ dumpToolbarConfiguration(editor, true)
+ }
+ // Toolbar groups doesn't count in this case - print only toolbar.
+ else {
+ output += '// Toolbar configuration.\n' +
+ dumpToolbarConfiguration(editor);
+ }
+
+ // Recreate to avoid old IE from loosing whitespaces on filling <pre> content.
+ var preOutput = pre.getOuterHtml().replace(/(?=<\/)/, output);
+ CKEDITOR.dom.element.createFromHtml(preOutput).replace(pre);
+ });
+
+ CKEDITOR.replace('editorCurrent', {height: 100});
+ CKEDITOR.replace('editorFull', {
+ // Reset toolbar settings, so full toolbar will be generated automatically.
+ toolbar: null,
+ toolbarGroups: null,
+ removeButtons: null,
+ height: 100
+ });
+
+ function dumpToolbarConfiguration(editor, printGroups) {
+ var output = [],
+ toolbar = editor.toolbar;
+
+ for (var i = 0; i < toolbar.length; ++i) {
+ var group = dumpToolbarGroup(toolbar[i], printGroups);
+ if (group)
+ output.push(group);
+ }
+
+ return 'config.toolbar' + (printGroups ? 'Groups' : '') + ' = [\n\t' + output.join(',\n\t') + '\n];';
+ }
+
+ function dumpToolbarGroup(group, printGroups) {
+ var output = [];
+
+ if (typeof group == 'string')
+ return '\'' + group + '\'';
+ if (CKEDITOR.tools.isArray(group))
+ return dumpToolbarItems(group);
+ // Skip group when printing entire toolbar configuration and there are no items in this group.
+ if (!printGroups && !group.items)
+ return;
+
+ if (group.name)
+ output.push('name: \'' + group.name + '\'');
+
+ if (group.groups)
+ output.push('groups: ' + dumpToolbarItems(group.groups));
+
+ if (!printGroups)
+ output.push('items: ' + dumpToolbarItems(group.items));
+
+ return '{ ' + output.join(', ') + ' }';
+ }
+
+ function dumpToolbarItems(items) {
+ if (typeof items == 'string')
+ return '\'' + items + '\'';
+
+ var names = [],
+ i, item;
+
+ for (var i = 0; i < items.length; ++i) {
+ item = items[i];
+ if (typeof item == 'string')
+ names.push(item);
+ else {
+ if (item.type == CKEDITOR.UI_SEPARATOR)
+ names.push('-');
+ else
+ names.push(buttonsNames[item.name]);
+ }
+ }
+
+ return '[ \'' + names.join('\', \'') + '\' ]';
+ }
+
+ // Creates { 'lowercased': 'LowerCased' } buttons names hash.
+ function createButtonsNamesHash(items) {
+ var hash = {},
+ name;
+
+ for (name in items) {
+ hash[items[name].name] = name;
+ }
+
+ return hash;
+ }
+
+ })();
+ </script>
+
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/uicolor.html b/samples/old/uicolor.html
new file mode 100755
index 0000000..6804fd7
--- /dev/null
+++ b/samples/old/uicolor.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>UI Color Picker &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; UI Color
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/uicolor.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to automatically replace <code>&lt;textarea&gt;</code> elements
+ with a CKEditor instance with an option to change the color of its user interface.<br>
+ <strong>Note:</strong>The UI skin color feature depends on the CKEditor skin
+ compatibility. The Moono and Kama skins are examples of skins that work with it.
+ </p>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ This editor instance has a UI color value defined in configuration to change the skin color,
+ To specify the color of the user interface, set the <code>uiColor</code> property:
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ <strong>uiColor: '#14B8C4'</strong>
+});</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced.
+ </p>
+ <p>
+ <textarea cols="80" id="editor1" name="editor1"
+ rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ // Replace the <textarea id="editor"> with an CKEditor
+ // instance, using default configurations.
+ CKEDITOR.replace('editor1', {
+ uiColor: '#14B8C4',
+ toolbar: [
+ ['Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink'],
+ ['FontSize', 'TextColor', 'BGColor']
+ ]
+ });
+
+ </script>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/uilanguages.html b/samples/old/uilanguages.html
new file mode 100755
index 0000000..38b9235
--- /dev/null
+++ b/samples/old/uilanguages.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>User Interface Globalization &mdash; CKEditor Sample</title>
+ <script src="../../ckeditor.js"></script>
+ <script src="assets/uilanguages/languages.js"></script>
+ <link rel="stylesheet" href="sample.css">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; User Interface Languages
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/uilanguages.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to automatically replace <code>&lt;textarea&gt;</code> elements
+ with a CKEditor instance with an option to change the language of its user interface.
+ </p>
+ <p>
+ It pulls the language list from CKEditor <code>_languages.js</code> file that contains the list of supported
+ languages and creates
+ a drop-down list that lets the user change the UI language.
+ </p>
+ <p>
+ By default, CKEditor automatically localizes the editor to the language of the user.
+ The UI language can be controlled with two configuration options:
+ <code><a class="samples" href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-language">language</a></code>
+ and
+ <code><a class="samples" href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-defaultLanguage">
+ defaultLanguage</a></code>. The <code>defaultLanguage</code> setting specifies the
+ default CKEditor language to be used when a localization suitable for user's settings is not available.
+ </p>
+ <p>
+ To specify the user interface language that will be used no matter what language is
+ specified in user's browser or operating system, set the <code>language</code> property:
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ // Load the German interface.
+ <strong>language: 'de'</strong>
+});</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced.
+ </p>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ Available languages (<span id="count"> </span> languages!):<br>
+ <script>
+
+ document.write('<select disabled="disabled" id="languages" onchange="createEditor( this.value );">');
+
+ // Get the language list from the _languages.js file.
+ for (var i = 0; i < window.CKEDITOR_LANGS.length; i++) {
+ document.write(
+ '<option value="' + window.CKEDITOR_LANGS[i].code + '">' +
+ window.CKEDITOR_LANGS[i].name +
+ '</option>');
+ }
+
+ document.write('</select>');
+
+ </script>
+ <br>
+ <span style="color: #888888">
+ (You may see strange characters if your system does not support the selected language)
+ </span>
+ </p>
+ <p>
+ <textarea cols="80" id="editor1" name="editor1"
+ rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ // Set the number of languages.
+ document.getElementById('count').innerHTML = window.CKEDITOR_LANGS.length;
+
+ var editor;
+
+ function createEditor(languageCode) {
+ if (editor)
+ editor.destroy();
+
+ // Replace the <textarea id="editor"> with an CKEditor
+ // instance, using default configurations.
+ editor = CKEDITOR.replace('editor1', {
+ language: languageCode,
+
+ on: {
+ instanceReady: function () {
+ // Wait for the editor to be ready to set
+ // the language combo.
+ var languages = document.getElementById('languages');
+ languages.value = this.langCode;
+ languages.disabled = false;
+ }
+ }
+ });
+ }
+
+ // At page startup, load the default language:
+ createEditor('');
+
+ </script>
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/wysiwygarea/fullpage.html b/samples/old/wysiwygarea/fullpage.html
new file mode 100755
index 0000000..3c102dc
--- /dev/null
+++ b/samples/old/wysiwygarea/fullpage.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>Full Page Editing &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/old/sample.js"></script>
+ <link rel="stylesheet" href="../../../samples/old/sample.css">
+ <meta name="ckeditor-sample-required-plugins" content="sourcearea">
+ <meta name="ckeditor-sample-name" content="Full page support">
+ <meta name="ckeditor-sample-group" content="Plugins">
+ <meta name="ckeditor-sample-description"
+ content="CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to &lt;/html&gt;.">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/old/index.html">CKEditor Samples</a> &raquo; Full Page Editing
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/fullpage.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor to edit entire HTML pages, from the
+ <code>&lt;html&gt;</code> tag to the <code>&lt;/html&gt;</code> tag.
+ </p>
+ <p>
+ The CKEditor instance below is inserted with a JavaScript call using the following code:
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ <strong>fullPage: true</strong>,
+ <strong>allowedContent: true</strong>
+});
+</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced.
+ </p>
+ <p>
+ The <code><em>allowedContent</em></code> in the code above is set to <code>true</code> to disable content
+ filtering.
+ Setting this option is not obligatory, but in full page mode there is a strong chance that one may want be
+ able to freely enter any HTML content in source mode without any limitations.
+ </p>
+ </div>
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <label for="editor1">
+ CKEditor output the entire page including content outside of
+ <code>&lt;body&gt;</code> element, so content like meta and title can be changed:
+ </label>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">
+ &lt;h1&gt;&lt;img align=&quot;right&quot; alt=&quot;Saturn V carrying Apollo 11&quot; src=&quot;../../../samples/old/assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ CKEDITOR.replace('editor1', {
+ fullPage: true,
+ allowedContent: true,
+ extraPlugins: 'wysiwygarea'
+ });
+
+ </script>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/old/xhtmlstyle.html b/samples/old/xhtmlstyle.html
new file mode 100755
index 0000000..4c5cf44
--- /dev/null
+++ b/samples/old/xhtmlstyle.html
@@ -0,0 +1,241 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title>XHTML Compliant Output &mdash; CKEditor Sample</title>
+ <meta name="ckeditor-sample-required-plugins" content="sourcearea">
+ <script src="../../ckeditor.js"></script>
+ <script src="sample.js"></script>
+ <link href="sample.css" rel="stylesheet">
+</head>
+
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Producing XHTML Compliant Output
+ </h1>
+ <div class="warning deprecated">
+ This sample is not maintained anymore. Check out its <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/examples/basicstyles.html">brand new version in CKEditor
+ Examples</a>.
+ </div>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor to output valid
+ <a class="samples" href="http://www.w3.org/TR/xhtml11/">XHTML 1.1</a> code.
+ Deprecated elements (<code>&lt;font&gt;</code>, <code>&lt;u&gt;</code>) or attributes
+ (<code>size</code>, <code>face</code>) will be replaced with XHTML compliant code.
+ </p>
+ <p>
+ To add a CKEditor instance outputting valid XHTML code, load the editor using a standard
+ JavaScript call and define CKEditor features to use the XHTML compliant elements and styles.
+ </p>
+ <p>
+ A snippet of the configuration code can be seen below; check the source of this page for
+ full definition:
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ contentsCss: 'assets/outputxhtml.css',
+
+ coreStyles_bold: {
+ element: 'span',
+ attributes: { 'class': 'Bold' }
+ },
+ coreStyles_italic: {
+ element: 'span',
+ attributes: { 'class': 'Italic' }
+ },
+
+ ...
+});</pre>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <textarea cols="80" id="editor1" name="editor1"
+ rows="10">&lt;p&gt;This is some &lt;span class="Bold"&gt;sample text&lt;/span&gt;. You are using &lt;a href="https://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ CKEDITOR.replace('editor1', {
+ /*
+ * Style sheet for the contents
+ */
+ contentsCss: 'assets/outputxhtml/outputxhtml.css',
+
+ /*
+ * Special allowed content rules for spans used by
+ * font face, size, and color buttons.
+ *
+ * Note: all rules have been written separately so
+ * it was possible to specify required classes.
+ */
+ extraAllowedContent: 'span(!FontColor1);span(!FontColor2);span(!FontColor3);' +
+ 'span(!FontColor1BG);span(!FontColor2BG);span(!FontColor3BG);' +
+ 'span(!FontComic);span(!FontCourier);span(!FontTimes);' +
+ 'span(!FontSmaller);span(!FontLarger);span(!FontSmall);span(!FontBig);span(!FontDouble)',
+
+ /*
+ * Core styles.
+ */
+ coreStyles_bold: {
+ element: 'span',
+ attributes: {'class': 'Bold'}
+ },
+ coreStyles_italic: {
+ element: 'span',
+ attributes: {'class': 'Italic'}
+ },
+ coreStyles_underline: {
+ element: 'span',
+ attributes: {'class': 'Underline'}
+ },
+ coreStyles_strike: {
+ element: 'span',
+ attributes: {'class': 'StrikeThrough'},
+ overrides: 'strike'
+ },
+ coreStyles_subscript: {
+ element: 'span',
+ attributes: {'class': 'Subscript'},
+ overrides: 'sub'
+ },
+ coreStyles_superscript: {
+ element: 'span',
+ attributes: {'class': 'Superscript'},
+ overrides: 'sup'
+ },
+
+ /*
+ * Font face.
+ */
+
+ // List of fonts available in the toolbar combo. Each font definition is
+ // separated by a semi-colon (;). We are using class names here, so each font
+ // is defined by {Combo Label}/{Class Name}.
+ font_names: 'Comic Sans MS/FontComic;Courier New/FontCourier;Times New Roman/FontTimes',
+
+ // Define the way font elements will be applied to the document. The "span"
+ // element will be used. When a font is selected, the font name defined in the
+ // above list is passed to this definition with the name "Font", being it
+ // injected in the "class" attribute.
+ // We must also instruct the editor to replace span elements that are used to
+ // set the font (Overrides).
+ font_style: {
+ element: 'span',
+ attributes: {'class': '#(family)'},
+ overrides: [
+ {
+ element: 'span',
+ attributes: {
+ 'class': /^Font(?:Comic|Courier|Times)$/
+ }
+ }
+ ]
+ },
+
+ /*
+ * Font sizes.
+ */
+ fontSize_sizes: 'Smaller/FontSmaller;Larger/FontLarger;8pt/FontSmall;14pt/FontBig;Double Size/FontDouble',
+ fontSize_style: {
+ element: 'span',
+ attributes: {'class': '#(size)'},
+ overrides: [
+ {
+ element: 'span',
+ attributes: {
+ 'class': /^Font(?:Smaller|Larger|Small|Big|Double)$/
+ }
+ }
+ ]
+ },
+
+ /*
+ * Font colors.
+ */
+ colorButton_enableMore: false,
+
+ colorButton_colors: 'FontColor1/FF9900,FontColor2/0066CC,FontColor3/F00',
+ colorButton_foreStyle: {
+ element: 'span',
+ attributes: {'class': '#(color)'},
+ overrides: [
+ {
+ element: 'span',
+ attributes: {
+ 'class': /^FontColor(?:1|2|3)$/
+ }
+ }
+ ]
+ },
+
+ colorButton_backStyle: {
+ element: 'span',
+ attributes: {'class': '#(color)BG'},
+ overrides: [
+ {
+ element: 'span',
+ attributes: {
+ 'class': /^FontColor(?:1|2|3)BG$/
+ }
+ }
+ ]
+ },
+
+ /*
+ * Indentation.
+ */
+ indentClasses: ['Indent1', 'Indent2', 'Indent3'],
+
+ /*
+ * Paragraph justification.
+ */
+ justifyClasses: ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyFull'],
+
+ /*
+ * Styles combo.
+ */
+ stylesSet: [
+ {name: 'Strong Emphasis', element: 'strong'},
+ {name: 'Emphasis', element: 'em'},
+
+ {name: 'Computer Code', element: 'code'},
+ {name: 'Keyboard Phrase', element: 'kbd'},
+ {name: 'Sample Text', element: 'samp'},
+ {name: 'Variable', element: 'var'},
+
+ {name: 'Deleted Text', element: 'del'},
+ {name: 'Inserted Text', element: 'ins'},
+
+ {name: 'Cited Work', element: 'cite'},
+ {name: 'Inline Quotation', element: 'q'}
+ ]
+ });
+
+ </script>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/toolbarconfigurator/css/fontello.css b/samples/toolbarconfigurator/css/fontello.css
new file mode 100755
index 0000000..3674d44
--- /dev/null
+++ b/samples/toolbarconfigurator/css/fontello.css
@@ -0,0 +1,69 @@
+@font-face {
+ font-family: 'fontello';
+ src: url('../font/fontello.eot?89024372');
+ src: url('../font/fontello.eot?89024372#iefix') format('embedded-opentype'),
+ url('../font/fontello.woff?89024372') format('woff'),
+ url('../font/fontello.ttf?89024372') format('truetype'),
+ url('../font/fontello.svg?89024372#fontello') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
+/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
+/*
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+ @font-face {
+ font-family: 'fontello';
+ src: url('../font/fontello.svg?89024372#fontello') format('svg');
+ }
+}
+*/
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ font-family: "fontello";
+ font-style: normal;
+ font-weight: normal;
+ speak: none;
+
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1em;
+ margin-right: .2em;
+ text-align: center;
+ /* opacity: .8; */
+
+ /* For safety - reset parent styles, that can break glyph codes*/
+ font-variant: normal;
+ text-transform: none;
+
+ /* fix buttons height, for twitter bootstrap */
+ line-height: 1em;
+
+ /* Animation center compensation - margins should be symmetric */
+ /* remove if not needed */
+ margin-left: .2em;
+
+ /* you can be more comfortable with increased icons size */
+ /* font-size: 120%; */
+
+ /* Uncomment for 3D effect */
+ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+
+.icon-trash:before {
+ content: '\e802';
+}
+
+/* '' */
+.icon-down-big:before {
+ content: '\e800';
+}
+
+/* '' */
+.icon-up-big:before {
+ content: '\e801';
+}
+
+/* '' */ \ No newline at end of file
diff --git a/samples/toolbarconfigurator/font/LICENSE.txt b/samples/toolbarconfigurator/font/LICENSE.txt
new file mode 100755
index 0000000..174b67a
--- /dev/null
+++ b/samples/toolbarconfigurator/font/LICENSE.txt
@@ -0,0 +1,10 @@
+Font license info
+
+
+## Font Awesome
+
+ Copyright (C) 2012 by Dave Gandy
+
+ Author: Dave Gandy
+ License: SIL ()
+ Homepage: http://fortawesome.github.com/Font-Awesome/
diff --git a/samples/toolbarconfigurator/font/config.json b/samples/toolbarconfigurator/font/config.json
new file mode 100755
index 0000000..fb01ad6
--- /dev/null
+++ b/samples/toolbarconfigurator/font/config.json
@@ -0,0 +1,28 @@
+{
+ "name": "",
+ "css_prefix_text": "icon-",
+ "css_use_suffix": false,
+ "hinting": true,
+ "units_per_em": 1000,
+ "ascent": 850,
+ "glyphs": [
+ {
+ "uid": "f48ae54adfb27d8ada53d0fd9e34ee10",
+ "css": "trash-empty",
+ "code": 59392,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "1c4068ed75209e21af36017df8871802",
+ "css": "down-big",
+ "code": 59393,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "95376bf082bfec6ce06ea1cda7bd7ead",
+ "css": "up-big",
+ "code": 59394,
+ "src": "fontawesome"
+ }
+ ]
+} \ No newline at end of file
diff --git a/samples/toolbarconfigurator/font/fontello.eot b/samples/toolbarconfigurator/font/fontello.eot
new file mode 100755
index 0000000..2732fad
--- /dev/null
+++ b/samples/toolbarconfigurator/font/fontello.eot
Binary files differ
diff --git a/samples/toolbarconfigurator/font/fontello.svg b/samples/toolbarconfigurator/font/fontello.svg
new file mode 100755
index 0000000..33d14ac
--- /dev/null
+++ b/samples/toolbarconfigurator/font/fontello.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" standalone="no"?>
+<!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">
+<metadata>Copyright (C) 2014 by original authors @ fontello.com</metadata>
+<defs>
+<font id="fontello" horiz-adv-x="1000" >
+<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
+<missing-glyph horiz-adv-x="1000" />
+<glyph glyph-name="trash" unicode="&#xe802;" d="m286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15t6-5h464q2 0 6 5t8 15t4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q22 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
+<glyph glyph-name="down-big" unicode="&#xe800;" d="m899 386q0-30-21-50l-363-364q-22-21-51-21q-29 0-50 21l-363 364q-21 20-21 50q0 29 21 51l41 41q22 21 51 21q29 0 50-21l164-164v393q0 29 21 50t51 22h71q29 0 50-22t21-50v-393l164 164q21 21 51 21q29 0 50-21l42-42q21-21 21-50z" horiz-adv-x="928.6" />
+<glyph glyph-name="up-big" unicode="&#xe801;" d="m899 308q0-28-21-50l-42-42q-21-21-50-21q-30 0-51 21l-164 164v-393q0-29-20-47t-51-19h-71q-30 0-51 19t-21 47v393l-164-164q-20-21-50-21t-50 21l-42 42q-21 21-21 50q0 30 21 51l363 363q20 21 50 21q30 0 51-21l363-363q21-22 21-51z" horiz-adv-x="928.6" />
+</font>
+</defs>
+</svg> \ No newline at end of file
diff --git a/samples/toolbarconfigurator/font/fontello.ttf b/samples/toolbarconfigurator/font/fontello.ttf
new file mode 100755
index 0000000..fbcbf06
--- /dev/null
+++ b/samples/toolbarconfigurator/font/fontello.ttf
Binary files differ
diff --git a/samples/toolbarconfigurator/font/fontello.woff b/samples/toolbarconfigurator/font/fontello.woff
new file mode 100755
index 0000000..e1d5647
--- /dev/null
+++ b/samples/toolbarconfigurator/font/fontello.woff
Binary files differ
diff --git a/samples/toolbarconfigurator/index.html b/samples/toolbarconfigurator/index.html
new file mode 100755
index 0000000..a2094a2
--- /dev/null
+++ b/samples/toolbarconfigurator/index.html
@@ -0,0 +1,476 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+-->
+<!--[if IE 8]><html class="ie8"><![endif]-->
+<!--[if gt IE 8]><html><![endif]-->
+<!--[if !IE]><!-->
+<html><!--<![endif]-->
+
+<head>
+ <meta charset="utf-8">
+ <title>Toolbar Configurator</title>
+ <script src="../../ckeditor.js"></script>
+ <script>
+ if (CKEDITOR.env.ie && CKEDITOR.env.version < 9)
+ CKEDITOR.tools.enableHtml5Elements(document);
+ </script>
+ <link rel="stylesheet" href="lib/codemirror/codemirror.css">
+ <link rel="stylesheet" href="lib/codemirror/show-hint.css">
+ <link rel="stylesheet" href="lib/codemirror/neo.css">
+ <link rel="stylesheet" href="css/fontello.css">
+ <link rel="stylesheet" href="../css/samples.css">
+</head>
+
+<body id="toolbar">
+
+ <nav class="navigation-a">
+ <div class="grid-container">
+ <ul class="navigation-a-left grid-width-70">
+ <li><a href="https://ckeditor.com/ckeditor-4/">Project Homepage</a></li>
+ <li><a href="https://github.com/ckeditor/ckeditor-dev/issues">I found a bug</a></li>
+ <li><a href="https://github.com/ckeditor/ckeditor-dev"
+ class="icon-pos-right icon-navigation-a-github">Fork CKEditor on GitHub</a></li>
+ </ul>
+ <ul class="navigation-a-right grid-width-30">
+ <li><a href="https://ckeditor.com/blog/">CKEditor Blog</a></li>
+ </ul>
+ </div>
+ </nav>
+
+ <header class="header-a">
+ <div class="grid-container">
+ <h1 class="header-a-logo grid-width-30">
+ <a href="../index.html"><img src="../img/logo.svg"
+ onerror="this.src='../img/logo.png'; this.onerror=null;" alt="CKEditor Logo"></a>
+ </h1>
+ <nav class="navigation-b grid-width-70">
+ <ul>
+ <li><a href="../index.html" class="button-a">Start</a></li>
+ <li><a href="index.html" class="button-a button-a-background">Toolbar configurator</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+
+ <main>
+ <div class="adjoined-top">
+ <div class="grid-container">
+ <div class="content grid-width-100">
+ <div class="grid-container-nested">
+ <h1 class="grid-width-60">
+ Toolbar Configurator
+ <a href="#help-content" type="button" title="Configurator help" id="help"
+ class="button-a button-a-background button-a-no-text icon-pos-left icon-question-mark">Help</a>
+ </h1>
+
+ <div class="grid-width-40 grid-switch-magic">
+ <div class="switch">
+ <span class="balloon-a balloon-a-se">Select configurator type</span>
+ <input type="radio" name="radio" data-num="1" id="radio-basic" />
+ <input type="radio" name="radio" data-num="2" id="radio-advanced" />
+ <label data-for="1" for="radio-basic">Basic</label>
+ <span class="switch-inner">
+ <span class="handler"></span>
+ </span>
+ <label data-for="2" for="radio-advanced">Advanced</label>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="adjoined-bottom">
+ <div class="grid-container">
+ <div class="grid-width-100">
+ <div class="editors-container">
+ <div id="editor-basic"></div>
+ <div id="editor-advanced"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="grid-container configurator">
+ <div class="content grid-width-100">
+ <div class="configurator">
+ <div>
+ <div id="toolbarModifierWrapper"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div id="help-content">
+ <div class="grid-container">
+ <div class="grid-width-100">
+ <h2>What Am I Doing Here?</h2>
+
+ <div class="grid-container grid-container-nested">
+ <div class="basic">
+ <div class="grid-width-50">
+ <p>Arrange <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-toolbarGroups">toolbar
+ groups</a>, toggle <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removeButtons">button
+ visibility</a> according to your needs and get your toolbar configuration.</p>
+ <p>You can replace the content of the <a
+ href="../../config.js"><code>config.js</code></a> file with the generated
+ configuration. If you already set some configuration options you will need to merge
+ both configurations.</p>
+ </div>
+ <div class="grid-width-50">
+ <p>Read more about different ways of <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_configuration.html">setting
+ configuration</a> and do not forget about <strong>clearing browser
+ cache</strong>.</p>
+ <p>Arranging toolbar groups is the recommended way of configuring the toolbar, but if
+ you need more freedom you can use the <a href="#advanced">advanced configurator</a>.
+ </p>
+ </div>
+ </div>
+ <div class="advanced" style="display: none;">
+ <div class="grid-width-50">
+ <p>With this code editor you can edit your <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-toolbar">toolbar
+ configuration</a> live.</p>
+ <p>You can replace the content of the <a
+ href="../../config.js"><code>config.js</code></a> file with the generated
+ configuration. If you already set some configuration options you will need to merge
+ both configurations.</p>
+ </div>
+ <div class="grid-width-50">
+ <p>Read more about different ways of <a
+ href="https://ckeditor.com/docs/ckeditor4/latest/guide/dev_configuration.html">setting
+ configuration</a> and do not forget about <strong>clearing browser
+ cache</strong>.</p>
+ </div>
+ </div>
+ </div>
+
+ <p class="grid-container grid-container-nested">
+ <button type="button" class="help-content-close grid-width-100 button-a button-a-background">Got
+ it. Let's play!</button>
+ </p>
+ </div>
+ </div>
+ </div>
+ </main>
+
+ <footer class="footer-a grid-container">
+ <p class="grid-width-100">
+ CKEditor &ndash; The text editor for the Internet &ndash; <a class="samples"
+ href="https://ckeditor.com/">https://ckeditor.com</a>
+ </p>
+ <p class="grid-width-100" id="copy">
+ Copyright &copy; 2003-2019, <a class="samples" href="https://cksource.com/">CKSource</a> &ndash; Frederico
+ Knabben. All rights reserved.
+ </p>
+ </footer>
+
+ <script src="lib/codemirror/codemirror.js"></script>
+ <script src="lib/codemirror/javascript.js"></script>
+ <script src="lib/codemirror/show-hint.js"></script>
+
+ <script src="js/fulltoolbareditor.js"></script>
+ <script src="js/abstracttoolbarmodifier.js"></script>
+ <script src="js/toolbarmodifier.js"></script>
+ <script src="js/toolbartextmodifier.js"></script>
+ <script src="../js/sf.js"></script>
+
+ <script>
+ (function () {
+ 'use strict';
+
+ var mode = (window.location.hash.substr(1) === 'advanced') ? 'advanced' : 'basic',
+ configuratorSection = CKEDITOR.document.findOne('main > .grid-container.configurator'),
+ basicInstruction = CKEDITOR.document.findOne('#help-content .basic'),
+ advancedInstruction = CKEDITOR.document.findOne('#help-content .advanced'),
+
+ // Configurator mode switcher.
+ modeSwitchBasic = CKEDITOR.document.getById('radio-basic'),
+ modeSwitchAdvanced = CKEDITOR.document.getById('radio-advanced');
+
+ // Initial setup
+ function updateSwitcher() {
+ if (mode === 'advanced') {
+ modeSwitchAdvanced.$.checked = true;
+ } else {
+ modeSwitchBasic.$.checked = true;
+ }
+ }
+
+ updateSwitcher();
+
+ CKEDITOR.document.getWindow().on('hashchange', function (e) {
+ var hash = window.location.hash.substr(1);
+ if (!(hash === 'advanced' || hash === 'basic')) {
+ return;
+ }
+ mode = hash;
+ onToolbarsDone(mode);
+ });
+
+ CKEDITOR.document.getWindow().on('resize', function () {
+ updateToolbar((mode === 'basic' ? toolbarModifier : toolbarTextModifier)['editorInstance']);
+ });
+
+ function onRefresh(modifier) {
+ modifier = modifier || this;
+
+ if (mode === 'basic' && modifier instanceof ToolbarConfigurator.ToolbarTextModifier) {
+ return;
+ }
+
+ // CodeMirror container becomes visible, so we need to refresh and to avoid rendering problems.
+ if (mode === 'advanced' && modifier instanceof ToolbarConfigurator.ToolbarTextModifier) {
+ modifier.codeContainer.refresh();
+ }
+
+ updateToolbar(modifier.editorInstance);
+ }
+
+ function updateToolbar(editor) {
+ var editorContainer = editor.container;
+
+ // Not always editor is loaded.
+ if (!editorContainer) {
+ return;
+ }
+
+ var displayStyle = editorContainer.getStyle('display');
+
+ editorContainer.setStyle('display', 'block');
+
+ var newHeight = editorContainer.getSize('height');
+
+ var newMarginTop = parseInt(editorContainer.getComputedStyle('margin-top'), 10);
+ newMarginTop = (isNaN(newMarginTop) ? 0 : Number(newMarginTop));
+
+ var newMarginBottom = parseInt(editorContainer.getComputedStyle('margin-bottom'), 10);
+ newMarginBottom = (isNaN(newMarginBottom) ? 0 : Number(newMarginBottom));
+
+ var result = newHeight + newMarginTop + newMarginBottom;
+
+ editorContainer.setStyle('display', displayStyle);
+
+ editor.container.getAscendant('div').setStyle('height', result + 'px');
+ }
+
+ var toolbarModifier = new ToolbarConfigurator.ToolbarModifier('editor-basic');
+
+ var done = 0;
+ toolbarModifier.init(onToolbarInit);
+ toolbarModifier.onRefresh = onRefresh;
+
+ CKEDITOR.document.getById('toolbarModifierWrapper').append(toolbarModifier.mainContainer);
+
+ var toolbarTextModifier = new ToolbarConfigurator.ToolbarTextModifier('editor-advanced');
+ toolbarTextModifier.init(onToolbarInit);
+ toolbarTextModifier.onRefresh = onRefresh;
+
+ function onToolbarInit() {
+ if (++done === 2) {
+ onToolbarsDone();
+
+ positionSticky.watch(CKEDITOR.document.findOne('.toolbar'), function () {
+ return mode === 'advanced';
+ });
+ }
+ }
+
+ function onToolbarsDone() {
+ if (mode === 'basic') {
+ toggleModeBasic(false);
+ } else {
+ toggleModeAdvanced(false);
+ }
+
+ updateSwitcher();
+
+ setTimeout(function () {
+ CKEDITOR.document.findOne('.editors-container').addClass('active');
+ CKEDITOR.document.findOne('#toolbarModifierWrapper').addClass('active');
+ }, 200);
+ }
+
+ CKEDITOR.document.getById('toolbarModifierWrapper').append(toolbarTextModifier.mainContainer);
+
+ function toogleModeSwitch(onElement, offElement, onModifier, offModifier) {
+ onElement.addClass('fancy-button-active');
+ offElement.removeClass('fancy-button-active');
+
+ onModifier.showUI();
+ offModifier.hideUI();
+ }
+
+ function toggleModeBasic(callOnRefresh) {
+ callOnRefresh = (callOnRefresh !== false);
+ mode = 'basic';
+ window.location.hash = '#basic';
+ toogleModeSwitch(modeSwitchBasic, modeSwitchAdvanced, toolbarModifier, toolbarTextModifier);
+
+ configuratorSection.removeClass('freed-width');
+ basicInstruction.show();
+ advancedInstruction.hide();
+
+ callOnRefresh && onRefresh(toolbarModifier);
+ }
+
+ function toggleModeAdvanced(callOnRefresh) {
+ callOnRefresh = (callOnRefresh !== false);
+ mode = 'advanced';
+ window.location.hash = '#advanced';
+ toogleModeSwitch(modeSwitchAdvanced, modeSwitchBasic, toolbarTextModifier, toolbarModifier);
+
+ configuratorSection.addClass('freed-width');
+ advancedInstruction.show();
+ basicInstruction.hide();
+
+ callOnRefresh && onRefresh(toolbarTextModifier);
+ }
+
+ modeSwitchBasic.on('click', toggleModeBasic);
+ modeSwitchAdvanced.on('click', toggleModeAdvanced);
+
+ //
+ // Position:sticky for the toolbar.
+ //
+
+ // Will make elements behave like they were styled with position:sticky.
+ var positionSticky = {
+ // Store object: {
+ // element: CKEDITOR.dom.element, // Element which will float.
+ // placeholder: CKEDITOR.dom.element, // Placeholder which is place to prevent page bounce.
+ // isFixed: boolean // Whether element float now.
+ // }
+ watched: [],
+
+ active: [],
+
+ staticContainer: null,
+
+ init: function () {
+ var element = CKEDITOR.dom.element.createFromHtml(
+ '<div class="staticContainer">' +
+ '<div class="grid-container" >' +
+ '<div class="grid-width-100">' +
+ '<div class="inner"></div>' +
+ '</div>' +
+ '</div>' +
+ '</div>');
+
+ this.staticContainer = element.findOne('.inner');
+
+ CKEDITOR.document.getBody().append(element);
+ },
+
+ watch: function (element, preventFunc) {
+ this.watched.push({
+ element: element,
+ placeholder: new CKEDITOR.dom.element('div'),
+ isFixed: false,
+ preventFunc: preventFunc
+ });
+ },
+
+ checkAll: function () {
+ for (var i = 0; i < this.watched.length; i++) {
+ this.check(this.watched[i]);
+ }
+ },
+
+ check: function (element) {
+ var isFixed = element.isFixed;
+ var shouldBeFixed = this.shouldBeFixed(element);
+
+ // Nothing to be done.
+ if (isFixed === shouldBeFixed) {
+ return;
+ }
+
+ var placeholder = element.placeholder;
+
+ if (isFixed) {
+ // Unfixing.
+
+ element.element.insertBefore(placeholder);
+ placeholder.remove();
+
+ element.element.removeStyle('margin');
+
+ this.active.splice(CKEDITOR.tools.indexOf(this.active, element), 1);
+
+ } else {
+ // Fixing.
+ placeholder.setStyle('width', element.element.getSize('width') + 'px');
+ placeholder.setStyle('height', element.element.getSize('height') + 'px');
+ placeholder.setStyle('margin-bottom', element.element.getComputedStyle('margin-bottom'));
+ placeholder.setStyle('display', element.element.getComputedStyle('display'));
+ placeholder.insertAfter(element.element);
+
+ this.staticContainer.append(element.element);
+
+ this.active.push(element);
+ }
+
+ element.isFixed = !element.isFixed;
+ },
+
+ shouldBeFixed: function (element) {
+ if (element.preventFunc && element.preventFunc()) {
+ return false;
+ }
+
+ // If element is already fixed we are checking it's placeholder.
+ var related = (element.isFixed ? element.placeholder : element.element),
+ clientRect = related.$.getBoundingClientRect(),
+ staticHeight = this.staticContainer.getSize('height'),
+ elemHeight = element.element.getSize('height');
+
+ if (element.isFixed) {
+ return (clientRect.top + elemHeight < staticHeight);
+ } else {
+ return (clientRect.top < staticHeight);
+ }
+ }
+ };
+
+ positionSticky.init();
+
+ CKEDITOR.document.getWindow().on('scroll',
+ new CKEDITOR.tools.eventsBuffer(100, positionSticky.checkAll, positionSticky).input
+ );
+
+ // Make the toolbar sticky.
+ positionSticky.watch(CKEDITOR.document.findOne('.editors-container'));
+
+ // Help button and help-content.
+ (function () {
+ var helpButton = CKEDITOR.document.getById('help'),
+ helpContent = CKEDITOR.document.getById('help-content');
+
+ // Don't show help button on IE8 because it's unsupported by Pico Modal.
+ if (CKEDITOR.env.ie && CKEDITOR.env.version == 8) {
+ helpButton.hide();
+ } else {
+ // Display help modal when the button is clicked.
+ helpButton.on('click', function (evt) {
+ SF.modal({
+ // Clone modal content from DOM.
+ content: helpContent.getHtml(),
+
+ afterCreate: function (modal) {
+ // Enable modal content button to close the modal.
+ new CKEDITOR.dom.element(modal.modalElem()).findOne('.help-content-close').once('click', modal.close);
+ }
+ }).show();
+ });
+ }
+ })();
+ })();
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js b/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js
new file mode 100755
index 0000000..3ac3b1a
--- /dev/null
+++ b/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js
@@ -0,0 +1,39 @@
+"function" != typeof Object.create && function() { var a = function() { }; Object.create = function(b) { if (1 < arguments.length) throw Error("Second argument not supported"); if (null === b) throw Error("Cannot set a null [[Prototype]]"); if ("object" != typeof b) throw TypeError("Argument must be an object"); a.prototype = b; return new a } }();
+CKEDITOR.plugins.add("toolbarconfiguratorarea", {
+ afterInit: function(a) {
+ a.addMode("wysiwyg", function(b) { var c = CKEDITOR.dom.element.createFromHtml('\x3cdiv class\x3d"cke_wysiwyg_div cke_reset" hidefocus\x3d"true"\x3e\x3c/div\x3e'); a.ui.space("contents").append(c); c = a.editable(c); c.detach = CKEDITOR.tools.override(c.detach, function(b) { return function() { b.apply(this, arguments); this.remove() } }); a.setData(a.getData(1), b); a.fire("contentDom") }); a.dataProcessor.toHtml = function(b) { return b }; a.dataProcessor.toDataFormat =
+ function(b) { return b }
+ }
+}); Object.keys || (Object.keys = function() { var a = Object.prototype.hasOwnProperty, b = !{ toString: null }.propertyIsEnumerable("toString"), c = "toString toLocaleString valueOf hasOwnProperty isPrototypeOf propertyIsEnumerable constructor".split(" "), e = c.length; return function(d) { if ("object" !== typeof d && ("function" !== typeof d || null === d)) throw new TypeError("Object.keys called on non-object"); var g = [], f; for (f in d) a.call(d, f) && g.push(f); if (b) for (f = 0; f < e; f++)a.call(d, c[f]) && g.push(c[f]); return g } }());
+(function() {
+ function a(b, c) { this.cfg = c || {}; this.hidden = !1; this.editorId = b; this.fullToolbarEditor = new ToolbarConfigurator.FullToolbarEditor; this.actualConfig = this.originalConfig = this.mainContainer = null; this.isEditableVisible = this.waitForReady = !1; this.toolbarContainer = null; this.toolbarButtons = [] } ToolbarConfigurator.AbstractToolbarModifier = a; a.prototype.setConfig = function(b) { this._onInit(void 0, b, !0) }; a.prototype.init = function(b) {
+ var c = this; this.mainContainer = new CKEDITOR.dom.element("div"); if (null !==
+ this.fullToolbarEditor.editorInstance) throw "Only one instance of ToolbarModifier is allowed"; this.editorInstance || this._createEditor(!1); this.editorInstance.once("loaded", function() { c.fullToolbarEditor.init(function() { c._onInit(b); if ("function" == typeof c.onRefresh) c.onRefresh() }, c.editorInstance.config) }); return this.mainContainer
+ }; a.prototype._onInit = function(b, c) {
+ this.originalConfig = this.editorInstance.config; this.actualConfig = c ? JSON.parse(c) : JSON.parse(JSON.stringify(this.originalConfig)); if (!this.actualConfig.toolbarGroups &&
+ !this.actualConfig.toolbar) { for (var a = this.actualConfig, d = this.editorInstance.toolbar, g = [], f = d.length, k = 0; k < f; k++) { var h = d[k]; "string" == typeof h ? g.push(h) : g.push({ name: h.name, groups: h.groups ? h.groups.slice() : [] }) } a.toolbarGroups = g } "function" === typeof b && b(this.mainContainer)
+ }; a.prototype._createModifier = function() {
+ this.mainContainer.addClass("unselectable"); this.modifyContainer && this.modifyContainer.remove(); this.modifyContainer = new CKEDITOR.dom.element("div"); this.modifyContainer.addClass("toolbarModifier");
+ this.mainContainer.append(this.modifyContainer); return this.mainContainer
+ }; a.prototype.getEditableArea = function() { return this.editorInstance.container.findOne("#" + this.editorInstance.id + "_contents") }; a.prototype._hideEditable = function() { var b = this.getEditableArea(); this.isEditableVisible = !1; this.lastEditableAreaHeight = b.getStyle("height"); b.setStyle("height", "0") }; a.prototype._showEditable = function() { this.isEditableVisible = !0; this.getEditableArea().setStyle("height", this.lastEditableAreaHeight || "auto") };
+ a.prototype._toggleEditable = function() { this.isEditableVisible ? this._hideEditable() : this._showEditable() }; a.prototype._refreshEditor = function() { function b() { c.editorInstance.destroy(); c._createEditor(!0, c.getActualConfig()); c.waitForReady = !1 } var c = this, a = this.editorInstance.status; this.waitForReady || ("unloaded" == a || "loaded" == a ? (this.waitForReady = !0, this.editorInstance.once("instanceReady", function() { b() }, this)) : b()) }; a.prototype._createEditor = function(b, c) {
+ function e() { } var d = this; this.editorInstance =
+ CKEDITOR.replace(this.editorId); this.editorInstance.on("configLoaded", function() { var b = d.editorInstance.config; c && CKEDITOR.tools.extend(b, c, !0); a.extendPluginsConfig(b) }); this.editorInstance.on("uiSpace", function(b) { "top" != b.data.space && b.stop() }, null, null, -999); this.editorInstance.once("loaded", function() {
+ var c = d.editorInstance.ui.instances, a; for (a in c) c[a] && (c[a].click = e, c[a].onClick = e); d.isEditableVisible || d._hideEditable(); d.currentActive && d.currentActive.name && d._highlightGroup(d.currentActive.name);
+ d.hidden ? d.hideUI() : d.showUI(); if (b && "function" === typeof d.onRefresh) d.onRefresh()
+ })
+ }; a.prototype.getActualConfig = function() { return JSON.parse(JSON.stringify(this.actualConfig)) }; a.prototype._createToolbar = function() { if (this.toolbarButtons.length) { this.toolbarContainer = new CKEDITOR.dom.element("div"); this.toolbarContainer.addClass("toolbar"); for (var b = this.toolbarButtons.length, c = 0; c < b; c += 1)this._createToolbarBtn(this.toolbarButtons[c]) } }; a.prototype._createToolbarBtn = function(b) {
+ var c = ToolbarConfigurator.FullToolbarEditor.createButton("string" ===
+ typeof b.text ? b.text : b.text.inactive, b.cssClass); this.toolbarContainer.append(c); c.data("group", b.group); c.addClass(b.position); c.on("click", function() { b.clickCallback.call(this, c, b) }, this); return c
+ }; a.prototype._fixGroups = function(b) {
+ b = b.toolbarGroups || []; for (var c = b.length, a = 0; a < c; a += 1) {
+ var d = b[a]; "/" == d ? (d = b[a] = {}, d.type = "separator", d.name = "separator" + CKEDITOR.tools.getNextNumber()) : (d.groups = d.groups || [], -1 == CKEDITOR.tools.indexOf(d.groups, d.name) && (this.editorInstance.ui.addToolbarGroup(d.name,
+ d.groups[d.groups.length - 1], d.name), d.groups.push(d.name)), this._fixSubgroups(d))
+ }
+ }; a.prototype._fixSubgroups = function(b) { b = b.groups; for (var c = b.length, a = 0; a < c; a += 1) { var d = b[a]; b[a] = { name: d, totalBtns: ToolbarConfigurator.ToolbarModifier.getTotalSubGroupButtonsNumber(d, this.fullToolbarEditor) } } }; a.stringifyJSONintoOneLine = function(b, a) {
+ a = a || {}; var e = JSON.stringify(b, null, ""), e = e.replace(/\n/g, ""); a.addSpaces && (e = e.replace(/(\{|:|,|\[|\])/g, function(a) { return a + " " }), e = e.replace(/(\])/g, function(a) {
+ return " " +
+ a
+ })); a.noQuotesOnKey && (e = e.replace(/"(\w*)":/g, function(a, b) { return b + ":" })); a.singleQuotes && (e = e.replace(/\"/g, "'")); return e
+ }; a.prototype.hideUI = function() { this.hidden = !0; this.mainContainer.hide(); this.editorInstance.container && this.editorInstance.container.hide() }; a.prototype.showUI = function() { this.hidden = !1; this.mainContainer.show(); this.editorInstance.container && this.editorInstance.container.show() }; a.extendPluginsConfig = function(a) { var c = a.extraPlugins; a.extraPlugins = (c ? c + "," : "") + "toolbarconfiguratorarea" }
+})(); \ No newline at end of file
diff --git a/samples/toolbarconfigurator/js/fulltoolbareditor.js b/samples/toolbarconfigurator/js/fulltoolbareditor.js
new file mode 100755
index 0000000..dc19bee
--- /dev/null
+++ b/samples/toolbarconfigurator/js/fulltoolbareditor.js
@@ -0,0 +1,9 @@
+window.ToolbarConfigurator={};
+(function(){function e(){this.instanceid="fte"+CKEDITOR.tools.getNextId();this.textarea=new CKEDITOR.dom.element("textarea");this.textarea.setAttributes({id:this.instanceid,name:this.instanceid,contentEditable:!0});this.editorInstance=this.buttons=null}ToolbarConfigurator.FullToolbarEditor=e;e.prototype.init=function(b){var a=this;document.body.appendChild(this.textarea.$);CKEDITOR.replace(this.instanceid);this.editorInstance=CKEDITOR.instances[this.instanceid];this.editorInstance.once("configLoaded",function(d){var c=
+d.editor.config;delete c.removeButtons;delete c.toolbarGroups;delete c.toolbar;ToolbarConfigurator.AbstractToolbarModifier.extendPluginsConfig(c);d.editor.once("loaded",function(){a.buttons=e.toolbarToButtons(a.editorInstance.toolbar);a.buttonsByGroup=e.groupButtons(a.buttons);a.buttonNamesByGroup=a.groupButtonNamesByGroup(a.buttons);d.editor.container.hide();"function"===typeof b&&b(a.buttons)})})};e.prototype.groupButtonNamesByGroup=function(b){var a=this;b=e.groupButtons(b);for(var d in b)b[d]=
+e.map(b[d],function(b){return a.getCamelCasedButtonName(b.name)});return b};e.prototype.getGroupByName=function(b){for(var a=this.editorInstance.config.toolbarGroups||this.getFullToolbarGroupsConfig(),d=a.length,c=0;c<d;c+=1)if(a[c].name===b)return a[c];return null};e.prototype.getCamelCasedButtonName=function(b){var a=this.editorInstance.ui.items,d;for(d in a)if(a[d].name==b)return d;return null};e.prototype.getFullToolbarGroupsConfig=function(b){b=!0===b?!0:!1;for(var a=[],d=this.editorInstance.toolbar,
+c=d.length,f=0;f<c;f+=1){var e=d[f],g={};"string"!=typeof e.name?b&&a.push("/"):(g.name=e.name,e.groups&&(g.groups=Array.prototype.slice.call(e.groups)),a.push(g))}return a};e.filter=function(b,a){for(var d=b&&b.length?b.length:0,c=[],f=0;f<d;f+=1)a(b[f])&&c.push(b[f]);return c};e.map=function(b,a){var d;if(CKEDITOR.tools.isArray(b)){d=[];for(var c=b.length,f=0;f<c;f+=1)d.push(a(b[f]))}else for(c in d={},b)d[c]=a(b[c]);return d};e.groupButtons=function(b){for(var a={},d=b.length,c=0;c<d;c+=1){var f=
+b[c],e=f.toolbar.split(",")[0];a[e]=a[e]||[];a[e].push(f)}return a};e.toolbarToButtons=function(b){for(var a=[],d=b.length,c=0;c<d;c+=1)"object"==typeof b[c]&&(a=a.concat(e.groupToButtons(b[c])));return a};e.createToolbarButton=function(b){var a=new CKEDITOR.dom.element("a"),d=e.createIcon(b.name,b.icon,b.command);a.setStyle("float","none");a.addClass("cke_"+("rtl"==CKEDITOR.lang.dir?"rtl":"ltr"));if(b instanceof CKEDITOR.ui.button)a.addClass("cke_button"),a.addClass("cke_toolgroup"),a.append(d);
+else if(CKEDITOR.ui.richCombo&&b instanceof CKEDITOR.ui.richCombo){var d=new CKEDITOR.dom.element("span"),c=new CKEDITOR.dom.element("span"),f=new CKEDITOR.dom.element("span");a.addClass("cke_combo_button");d.addClass("cke_combo_text");d.addClass("cke_combo_inlinelabel");d.setText(b.label);c.addClass("cke_combo_open");f.addClass("cke_combo_arrow");c.append(f);a.append(d);a.append(c)}return a};e.createIcon=function(b,a,d){var c=CKEDITOR.skin.getIconStyle(b,"rtl"==CKEDITOR.lang.dir),c=(c=c||CKEDITOR.skin.getIconStyle(a,
+"rtl"==CKEDITOR.lang.dir))||CKEDITOR.skin.getIconStyle(d,"rtl"==CKEDITOR.lang.dir);a=new CKEDITOR.dom.element("span");a.addClass("cke_button_icon");a.addClass("cke_button__"+b+"_icon");a.setAttribute("style",c);a.setStyle("float","none");return a};e.createButton=function(b,a){var d=new CKEDITOR.dom.element("button");d.addClass("button-a");d.setAttribute("type","button");if("string"==typeof a){a=a.split(" ");for(var c=a.length;c--;)d.addClass(a[c])}d.setHtml(b);return d};e.groupToButtons=function(b){for(var a=
+[],d=(b=b.items)?b.length:0,c=0;c<d;c+=1){var f=b[c];if(f instanceof CKEDITOR.ui.button||CKEDITOR.ui.richCombo&&f instanceof CKEDITOR.ui.richCombo)f.$=e.createToolbarButton(f),a.push(f)}return a}})(); \ No newline at end of file
diff --git a/samples/toolbarconfigurator/js/toolbarmodifier.js b/samples/toolbarconfigurator/js/toolbarmodifier.js
new file mode 100755
index 0000000..6ccaad9
--- /dev/null
+++ b/samples/toolbarconfigurator/js/toolbarmodifier.js
@@ -0,0 +1,91 @@
+(function() {
+ function d(a, b) {
+ l.call(this, a, b); this.actualConfig = this.originalConfig = this.removedButtons = null; this.emptyVisible = !1; this.state = "edit"; this.toolbarButtons = [{ text: { active: "Hide empty toolbar groups", inactive: "Show empty toolbar groups" }, group: "edit", position: "left", cssClass: "button-a-soft", clickCallback: function(a, b) { a[a.hasClass("button-a-background") ? "removeClass" : "addClass"]("button-a-background"); this._toggleVisibilityEmptyElements(); this.emptyVisible ? a.setText(b.text.active) : a.setText(b.text.inactive) } },
+ { text: "Add row separator", group: "edit", position: "left", cssClass: "button-a-soft", clickCallback: function() { this._addSeparator() } }, { text: "Select config", group: "config", position: "left", cssClass: "button-a-soft", clickCallback: function() { this.configContainer.findOne("textarea").$.select() } }, {
+ text: "Back to configurator", group: "config", position: "right", cssClass: "button-a-background", clickCallback: function() {
+ if ("paste" === this.state) {
+ var a = this.configContainer.findOne("textarea").getValue(); (a = d.evaluateToolbarGroupsConfig(a)) ?
+ this.setConfig(a) : alert("Your pasted config is wrong.")
+ } this.state = "edit"; this._showConfigurationTool(); this.showToolbarBtnsByGroupName(this.state)
+ }
+ }, { text: 'Get toolbar \x3cspan class\x3d"highlight"\x3econfig\x3c/span\x3e', group: "edit", position: "right", cssClass: "button-a-background icon-pos-left icon-download", clickCallback: function() { this.state = "config"; this._showConfig(); this.showToolbarBtnsByGroupName(this.state) } }]; this.cachedActiveElement = null
+ } var l = ToolbarConfigurator.AbstractToolbarModifier;
+ ToolbarConfigurator.ToolbarModifier = d; d.prototype = Object.create(ToolbarConfigurator.AbstractToolbarModifier.prototype); d.prototype.getActualConfig = function() { var a = l.prototype.getActualConfig.call(this); if (a.toolbarGroups) for (var b = a.toolbarGroups.length, c = 0; c < b; c += 1)a.toolbarGroups[c] = d.parseGroupToConfigValue(a.toolbarGroups[c]); return a }; d.prototype._onInit = function(a, b, c) {
+ c = !0 === c; l.prototype._onInit.call(this, void 0, b); this.removedButtons = []; c ? this.removedButtons = this.actualConfig.removeButtons ?
+ this.actualConfig.removeButtons.split(",") : [] : "removeButtons" in this.originalConfig ? this.removedButtons = this.originalConfig.removeButtons ? this.originalConfig.removeButtons.split(",") : [] : (this.originalConfig.removeButtons = "", this.removedButtons = []); this.actualConfig.toolbarGroups || (this.actualConfig.toolbarGroups = this.fullToolbarEditor.getFullToolbarGroupsConfig()); this._fixGroups(this.actualConfig); this._calculateTotalBtns(); this._createModifier(); this._refreshMoveBtnsAvalibility(); this._refreshBtnTabIndexes();
+ "function" === typeof a && a(this.mainContainer)
+ }; d.prototype._showConfigurationTool = function() { this.configContainer.addClass("hidden"); this.modifyContainer.removeClass("hidden") }; d.prototype._showConfig = function() {
+ var a = this.getActualConfig(), b, c; if (a.toolbarGroups) {
+ b = a.toolbarGroups; for (var e = this.cfg.trimEmptyGroups, f = [], g = b.length, m = 0; m < g; m++) {
+ var h = b[m]; if ("/" === h) f.push("'/'"); else {
+ if (e) for (var k = h.groups.length; k--;)0 === d.getTotalSubGroupButtonsNumber(h.groups[k], this.fullToolbarEditor) && h.groups.splice(k,
+ 1); e && 0 === h.groups.length || f.push(l.stringifyJSONintoOneLine(h, { addSpaces: !0, noQuotesOnKey: !0, singleQuotes: !0 }))
+ }
+ } b = "\n\t\t" + f.join(",\n\t\t")
+ } a.removeButtons && (c = a.removeButtons); a = ['\x3ctextarea class\x3d"configCode" readonly\x3eCKEDITOR.editorConfig \x3d function( config ) {\n', b ? "\tconfig.toolbarGroups \x3d [" + b + "\n\t];" : "", c ? "\n\n" : "", c ? "\tconfig.removeButtons \x3d '" + c + "';" : "", "\n};\x3c/textarea\x3e"].join(""); this.modifyContainer.addClass("hidden"); this.configContainer.removeClass("hidden");
+ this.configContainer.setHtml(a)
+ }; d.prototype._toggleVisibilityEmptyElements = function() { this.modifyContainer.hasClass("empty-visible") ? (this.modifyContainer.removeClass("empty-visible"), this.emptyVisible = !1) : (this.modifyContainer.addClass("empty-visible"), this.emptyVisible = !0); this._refreshMoveBtnsAvalibility() }; d.prototype._createModifier = function() {
+ function a() { b._highlightGroup(this.data("name")) } var b = this; l.prototype._createModifier.call(this); this.modifyContainer.setHtml(this._toolbarConfigToListString());
+ var c = this.modifyContainer.find('li[data-type\x3d"group"]'); this.modifyContainer.on("mouseleave", function() { this._dehighlightActiveToolGroup() }, this); for (var e = c.count(), f = 0; f < e; f += 1)c.getItem(f).on("mouseenter", a); CKEDITOR.document.on("keypress", function(a) { a = a.data.$.keyCode; a = 32 === a || 13 === a; var c = new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement); c.getAscendant(function(a) { return a.$ === b.mainContainer.$ }) && a && "button" === c.data("type") && c.findOne("input").$.click() }); this.modifyContainer.on("click",
+ function(a) { var c = a.data.$, e = new CKEDITOR.dom.element(c.target || c.srcElement); if (a = d.getGroupOrSeparatorLiAncestor(e)) { b.cachedActiveElement = document.activeElement; if (e.$ instanceof HTMLInputElement) b._handleCheckboxClicked(e); else if (e.$ instanceof HTMLButtonElement && (c.preventDefault ? c.preventDefault() : c.returnValue = !1, (c = b._handleAnchorClicked(e.$)) && "remove" == c.action)) return; c = a.data("type"); a = a.data("name"); b._setActiveElement(c, a); b.cachedActiveElement && b.cachedActiveElement.focus() } }); this.toolbarContainer ||
+ (this._createToolbar(), this.toolbarContainer.insertBefore(this.mainContainer.getChildren().getItem(0))); this.showToolbarBtnsByGroupName("edit"); this.configContainer || (this.configContainer = new CKEDITOR.dom.element("div"), this.configContainer.addClass("configContainer"), this.configContainer.addClass("hidden"), this.mainContainer.append(this.configContainer)); return this.mainContainer
+ }; d.prototype.showToolbarBtnsByGroupName = function(a) {
+ if (this.toolbarContainer) for (var b = this.toolbarContainer.find("button"),
+ c = b.count(), e = 0; e < c; e += 1) { var d = b.getItem(e); d.data("group") == a ? d.removeClass("hidden") : d.addClass("hidden") }
+ }; d.parseGroupToConfigValue = function(a) { if ("separator" == a.type) return "/"; var b = a.groups, c = b.length; delete a.totalBtns; for (var e = 0; e < c; e += 1)b[e] = b[e].name; return a }; d.getGroupOrSeparatorLiAncestor = function(a) { return a.$ instanceof HTMLLIElement && "group" == a.data("type") ? a : d.getFirstAncestor(a, function(a) { a = a.data("type"); return "group" == a || "separator" == a }) }; d.prototype._setActiveElement = function(a,
+ b) { this.currentActive && this.currentActive.elem.removeClass("active"); if (null === a) this._dehighlightActiveToolGroup(), this.currentActive = null; else { var c = this.mainContainer.findOne('ul[data-type\x3dtable-body] li[data-type\x3d"' + a + '"][data-name\x3d"' + b + '"]'); c.addClass("active"); this.currentActive = { type: a, name: b, elem: c }; "group" == a && this._highlightGroup(b); "separator" == a && this._dehighlightActiveToolGroup() } }; d.prototype.getActiveToolGroup = function() {
+ return this.editorInstance.container ? this.editorInstance.container.findOne(".cke_toolgroup.active, .cke_toolbar.active") :
+ null
+ }; d.prototype._dehighlightActiveToolGroup = function() { var a = this.getActiveToolGroup(); a && a.removeClass("active"); this.editorInstance.container && this.editorInstance.container.removeClass("some-toolbar-active") }; d.prototype._highlightGroup = function(a) {
+ this.editorInstance.container && (a = this.getFirstEnabledButtonInGroup(a), a = this.editorInstance.container.findOne(".cke_button__" + a + ", .cke_combo__" + a), this._dehighlightActiveToolGroup(), this.editorInstance.container && this.editorInstance.container.addClass("some-toolbar-active"),
+ a && (a = d.getFirstAncestor(a, function(a) { return a.hasClass("cke_toolbar") })) && a.addClass("active"))
+ }; d.prototype.getFirstEnabledButtonInGroup = function(a) { var b = this.actualConfig.toolbarGroups; a = this.getGroupIndex(a); b = b[a]; if (-1 === a) return null; a = b.groups ? b.groups.length : 0; for (var c = 0; c < a; c += 1) { var e = this.getFirstEnabledButtonInSubgroup(b.groups[c].name); if (e) return e } return null }; d.prototype.getFirstEnabledButtonInSubgroup = function(a) {
+ for (var b = (a = this.fullToolbarEditor.buttonsByGroup[a]) ? a.length :
+ 0, c = 0; c < b; c += 1) { var e = a[c].name; if (!this.isButtonRemoved(e)) return e } return null
+ }; d.prototype._handleCheckboxClicked = function(a) { var b = a.getAscendant("li").data("name"); a.$.checked ? this._removeButtonFromRemoved(b) : this._addButtonToRemoved(b) }; d.prototype._handleAnchorClicked = function(a) {
+ a = new CKEDITOR.dom.element(a); var b = a.getAscendant("li"), c = b.getAscendant("ul"), e = b.data("type"), d = b.data("name"), g = a.data("direction"), m = "up" === g ? b.getPrevious() : b.getNext(), h; if (a.hasClass("disabled")) return null;
+ if (a.hasClass("remove")) return b.remove(), this._removeSeparator(b.data("name")), this._setActiveElement(null), { action: "remove" }; if (!a.hasClass("move") || !m) return { action: null }; if ("group" === e || "separator" === e) h = this._moveGroup(g, d); "subgroup" === e && (h = b.getAscendant("li").data("name"), h = this._moveSubgroup(g, h, d)); "up" === g && b.insertBefore(c.getChild(h)); "down" === g && b.insertAfter(c.getChild(h)); for (var k; b = "up" === g ? b.getPrevious() : b.getNext();)if (this.emptyVisible || !b.hasClass("empty")) { k = b; break } k || (k =
+ '[data-direction\x3d"' + ("up" === g ? "down" : "up") + '"]', this.cachedActiveElement = a.getParent().findOne(k)); this._refreshMoveBtnsAvalibility(); this._refreshBtnTabIndexes(); return { action: "move" }
+ }; d.prototype._refreshMoveBtnsAvalibility = function() {
+ function a(a) { var c = a.count(); for (d = 0; d < c; d += 1)b._disableElementsInList(a.getItem(d)) } for (var b = this, c = this.mainContainer.find("ul[data-type\x3dtable-body] li \x3e p \x3e span \x3e button.move.disabled"), e = c.count(), d = 0; d < e; d += 1)c.getItem(d).removeClass("disabled");
+ a(this.mainContainer.find("ul[data-type\x3dtable-body]")); a(this.mainContainer.find("ul[data-type\x3dtable-body] \x3e li \x3e ul"))
+ }; d.prototype._refreshBtnTabIndexes = function() { for (var a = this.mainContainer.find('[data-tab\x3d"true"]'), b = a.count(), c = 0; c < b; c++) { var e = a.getItem(c), d = e.hasClass("disabled"); e.setAttribute("tabindex", d ? -1 : c) } }; d.prototype._disableElementsInList = function(a) {
+ function b(a) { return !a.hasClass("empty") } if (a.getChildren().count()) {
+ var c; this.emptyVisible ? (c = a.getFirst(), a = a.getLast()) :
+ (c = a.getFirst(b), a = a.getLast(b)); if (c) var e = c.findOne('p button[data-direction\x3d"up"]'); if (a) var d = a.findOne('p button[data-direction\x3d"down"]'); e && (e.addClass("disabled"), e.setAttribute("tabindex", "-1")); d && (d.addClass("disabled"), d.setAttribute("tabindex", "-1"))
+ }
+ }; d.prototype.getGroupIndex = function(a) { for (var b = this.actualConfig.toolbarGroups, c = b.length, d = 0; d < c; d += 1)if (b[d].name === a) return d; return -1 }; d.prototype._addSeparator = function() {
+ var a = this._determineSeparatorToAddIndex(), b = d.createSeparatorLiteral(),
+ c = CKEDITOR.dom.element.createFromHtml(d.getToolbarSeparatorString(b)); this.actualConfig.toolbarGroups.splice(a, 0, b); c.insertBefore(this.modifyContainer.findOne("ul[data-type\x3dtable-body]").getChild(a)); this._setActiveElement("separator", b.name); this._refreshMoveBtnsAvalibility(); this._refreshBtnTabIndexes(); this._refreshEditor()
+ }; d.prototype._removeSeparator = function(a) {
+ var b = CKEDITOR.tools.indexOf(this.actualConfig.toolbarGroups, function(b) { return "separator" == b.type && b.name == a }); this.actualConfig.toolbarGroups.splice(b,
+ 1); this._refreshMoveBtnsAvalibility(); this._refreshBtnTabIndexes(); this._refreshEditor()
+ }; d.prototype._determineSeparatorToAddIndex = function() { return this.currentActive ? ("group" == this.currentActive.elem.data("type") || "separator" == this.currentActive.elem.data("type") ? this.currentActive.elem : this.currentActive.elem.getAscendant("li")).getIndex() : 0 }; d.prototype._moveElement = function(a, b, c) {
+ function e(a) { return a.totalBtns || "separator" == a.type } c = this.emptyVisible ? "down" == c ? b + 1 : b - 1 : d.getFirstElementIndexWith(a,
+ b, c, e); return d.moveTo(c - b, a, b)
+ }; d.prototype._moveGroup = function(a, b) { var c = this.getGroupIndex(b), c = this._moveElement(this.actualConfig.toolbarGroups, c, a); this._refreshMoveBtnsAvalibility(); this._refreshBtnTabIndexes(); this._refreshEditor(); return c }; d.prototype._moveSubgroup = function(a, b, c) { b = this.getGroupIndex(b); b = this.actualConfig.toolbarGroups[b]; var d = CKEDITOR.tools.indexOf(b.groups, function(a) { return a.name == c }); a = this._moveElement(b.groups, d, a); this._refreshEditor(); return a }; d.prototype._calculateTotalBtns =
+ function() { for (var a = this.actualConfig.toolbarGroups, b = a.length; b--;) { var c = a[b], e = d.getTotalGroupButtonsNumber(c, this.fullToolbarEditor); "separator" != c.type && (c.totalBtns = e) } }; d.prototype._addButtonToRemoved = function(a) { if (-1 != CKEDITOR.tools.indexOf(this.removedButtons, a)) throw "Button already added to removed"; this.removedButtons.push(a); this.actualConfig.removeButtons = this.removedButtons.join(","); this._refreshEditor() }; d.prototype._removeButtonFromRemoved = function(a) {
+ a = CKEDITOR.tools.indexOf(this.removedButtons,
+ a); if (-1 === a) throw "Trying to remove button from removed, but not found"; this.removedButtons.splice(a, 1); this.actualConfig.removeButtons = this.removedButtons.join(","); this._refreshEditor()
+ }; d.parseGroupToConfigValue = function(a) { if ("separator" == a.type) return "/"; var b = a.groups, c = b.length; delete a.totalBtns; for (var d = 0; d < c; d += 1)b[d] = b[d].name; return a }; d.getGroupOrSeparatorLiAncestor = function(a) {
+ return a.$ instanceof HTMLLIElement && "group" == a.data("type") ? a : d.getFirstAncestor(a, function(a) {
+ a = a.data("type");
+ return "group" == a || "separator" == a
+ })
+ }; d.createSeparatorLiteral = function() { return { type: "separator", name: "separator" + CKEDITOR.tools.getNextNumber() } }; d.prototype._toolbarConfigToListString = function() { for (var a = this.actualConfig.toolbarGroups || [], b = '\x3cul data-type\x3d"table-body"\x3e', c = a.length, e = 0; e < c; e += 1)var f = a[e], b = "separator" === f.type ? b + d.getToolbarSeparatorString(f) : b + this._getToolbarGroupString(f); b += "\x3c/ul\x3e"; return d.getToolbarHeaderString() + b }; d.prototype._getToolbarGroupString = function(a) {
+ var b =
+ a.groups, c; c = "" + ['\x3cli data-type\x3d"group" data-name\x3d"', a.name, '" ', a.totalBtns ? "" : 'class\x3d"empty"', "\x3e"].join(""); c += d.getToolbarElementPreString(a) + "\x3cul\x3e"; a = b.length; for (var e = 0; e < a; e += 1) { var f = b[e]; c += this._getToolbarSubgroupString(f, this.fullToolbarEditor.buttonsByGroup[f.name]) } return c + "\x3c/ul\x3e\x3c/li\x3e"
+ }; d.getToolbarSeparatorString = function(a) { return ['\x3cli data-type\x3d"', a.type, '" data-name\x3d"', a.name, '"\x3e', d.getToolbarElementPreString("row separator"), "\x3c/li\x3e"].join("") };
+ d.getToolbarHeaderString = function() { return '\x3cul data-type\x3d"table-header"\x3e\x3cli data-type\x3d"header"\x3e\x3cp\x3eToolbars\x3c/p\x3e\x3cul\x3e\x3cli\x3e\x3cp\x3eToolbar groups\x3c/p\x3e\x3cp\x3eToolbar group items\x3c/p\x3e\x3c/li\x3e\x3c/ul\x3e\x3c/li\x3e\x3c/ul\x3e' }; d.getFirstAncestor = function(a, b) { for (var c = a.getParents(), d = c.length; d--;)if (b(c[d])) return c[d]; return null }; d.getFirstElementIndexWith = function(a, b, c, d) { for (; "up" === c ? b-- : ++b < a.length;)if (d(a[b])) return b; return -1 }; d.moveTo =
+ function(a, b, c) { var d; -1 !== c && (d = b.splice(c, 1)[0]); a = c + a; b.splice(a, 0, d); return a }; d.getTotalSubGroupButtonsNumber = function(a, b) { var c = b.buttonsByGroup["string" == typeof a ? a : a.name]; return c ? c.length : 0 }; d.getTotalGroupButtonsNumber = function(a, b) { for (var c = 0, e = a.groups, f = e ? e.length : 0, g = 0; g < f; g += 1)c += d.getTotalSubGroupButtonsNumber(e[g], b); return c }; d.prototype._getToolbarSubgroupString = function(a, b) {
+ var c; c = "" + ['\x3cli data-type\x3d"subgroup" data-name\x3d"', a.name, '" ', a.totalBtns ? "" : 'class\x3d"empty" ',
+ "\x3e"].join(""); c += d.getToolbarElementPreString(a.name); c += "\x3cul\x3e"; for (var e = b ? b.length : 0, f = 0; f < e; f += 1)c += this.getButtonString(b[f]); return c += "\x3c/ul\x3e\x3c/li\x3e"
+ }; d.prototype._getConfigButtonName = function(a) { var b = this.fullToolbarEditor.editorInstance.ui.items, c; for (c in b) if (b[c].name == a) return c; return null }; d.prototype.isButtonRemoved = function(a) { return -1 != CKEDITOR.tools.indexOf(this.removedButtons, this._getConfigButtonName(a)) }; d.prototype.getButtonString = function(a) {
+ var b = this.isButtonRemoved(a.name) ?
+ "" : 'checked\x3d"checked"'; return ['\x3cli data-tab\x3d"true" data-type\x3d"button" data-name\x3d"', this._getConfigButtonName(a.name), '"\x3e\x3clabel title\x3d"', a.label, '" \x3e\x3cinput tabindex\x3d"-1"type\x3d"checkbox"', b, "/\x3e", a.$.getOuterHtml(), "\x3c/label\x3e\x3c/li\x3e"].join("")
+ }; d.getToolbarElementPreString = function(a) {
+ a = a.name ? a.name : a; return ['\x3cp\x3e\x3cspan\x3e\x3cbutton title\x3d"Move element upward" data-tab\x3d"true" data-direction\x3d"up" class\x3d"move icon-up-big"\x3e\x3c/button\x3e\x3cbutton title\x3d"Move element downward" data-tab\x3d"true" data-direction\x3d"down" class\x3d"move icon-down-big"\x3e\x3c/button\x3e',
+ "row separator" == a ? '\x3cbutton title\x3d"Remove element" data-tab\x3d"true" class\x3d"remove icon-trash"\x3e\x3c/button\x3e' : "", a, "\x3c/span\x3e\x3c/p\x3e"].join("")
+ }; d.evaluateToolbarGroupsConfig = function(a) { return a = function(a) { var c = {}, d; try { d = eval("(" + a + ")") } catch (f) { try { d = eval(a) } catch (g) { return null } } return c.toolbarGroups && "number" === typeof c.toolbarGroups.length ? JSON.stringify(c) : d && "number" === typeof d.length ? JSON.stringify({ toolbarGroups: d }) : d && d.toolbarGroups ? JSON.stringify(d) : null }(a) };
+ return d
+})(); \ No newline at end of file
diff --git a/samples/toolbarconfigurator/js/toolbartextmodifier.js b/samples/toolbarconfigurator/js/toolbartextmodifier.js
new file mode 100755
index 0000000..4140bc8
--- /dev/null
+++ b/samples/toolbarconfigurator/js/toolbartextmodifier.js
@@ -0,0 +1,50 @@
+(function() {
+ function e(a) { l.call(this, a); this.hintContainer = this.codeContainer = null } var l = ToolbarConfigurator.AbstractToolbarModifier, g = ToolbarConfigurator.FullToolbarEditor; ToolbarConfigurator.ToolbarTextModifier = e; e.prototype = Object.create(l.prototype); e.prototype._onInit = function(a, d) { l.prototype._onInit.call(this, void 0, d); this._createModifier(d ? this.actualConfig : void 0); "function" === typeof a && a(this.mainContainer) }; e.prototype._createModifier = function(a) {
+ function d(a) {
+ var b = c(a); if (null !== b.charsBetween) {
+ var d =
+ k.getUnusedButtonsArray(k.actualConfig.toolbar, !0, b.charsBetween), e = a.getCursor(), b = CodeMirror.Pos(e.line, e.ch - b.charsBetween.length), h = a.getTokenAt(e); "{" === a.getTokenAt({ line: e.line, ch: h.start }).string && (d = ["name"]); if (0 !== d.length) return new f(b, e, d)
+ }
+ } function f(a, c, b) { this.from = a; this.to = c; this.list = b; this._handlers = [] } function c(a, c) {
+ var b = {}; b.cur = a.getCursor(); b.tok = a.getTokenAt(b.cur); b["char"] = c || b.tok.string.charAt(b.tok.string.length - 1); var d = a.getRange(CodeMirror.Pos(b.cur.line, 0), b.cur).split("").reverse().join(""),
+ d = d.replace(/(['|"]\w*['|"])/g, ""); b.charsBetween = d.match(/(^\w*)(['|"])/); b.charsBetween && (b.endChar = b.charsBetween[2], b.charsBetween = b.charsBetween[1].split("").reverse().join("")); return b
+ } function b(a) { setTimeout(function() { a.state.completionActive || CodeMirror.showHint(a, d, { hintsClass: "toolbar-modifier", completeSingle: !1 }) }, 100); return CodeMirror.Pass } var k = this; this._createToolbar(); this.toolbarContainer && this.mainContainer.append(this.toolbarContainer); l.prototype._createModifier.call(this);
+ this._setupActualConfig(a); a = this.actualConfig.toolbar; a = CKEDITOR.tools.isArray(a) ? "\tconfig.toolbar \x3d " + ("[\n\t\t" + g.map(a, function(a) { return l.stringifyJSONintoOneLine(a, { addSpaces: !0, noQuotesOnKey: !0, singleQuotes: !0 }) }).join(",\n\t\t") + "\n\t]") + ";" : "config.toolbar \x3d [];"; a = ["CKEDITOR.editorConfig \x3d function( config ) {\n", a, "\n};"].join(""); var e = new CKEDITOR.dom.element("div"); e.addClass("codemirror-wrapper"); this.modifyContainer.append(e); this.codeContainer = CodeMirror(e.$, {
+ mode: {
+ name: "javascript",
+ json: !0
+ }, lineNumbers: !1, lineWrapping: !0, viewportMargin: Infinity, value: a, smartIndent: !1, indentWithTabs: !0, indentUnit: 4, tabSize: 4, theme: "neo", extraKeys: { Left: b, Right: b, "'''": b, "'\"'": b, Backspace: b, Delete: b, "Shift-Tab": "indentLess" }
+ }); this.codeContainer.on("endCompletion", function(a, b) { var d = c(a); void 0 !== b && a.replaceSelection(d.endChar) }); this.codeContainer.on("change", function() {
+ var a = k.codeContainer.getValue(), a = k._evaluateValue(a); null !== a ? (k.actualConfig.toolbar = a.toolbar ? a.toolbar : k.actualConfig.toolbar,
+ k._fillHintByUnusedElements(), k._refreshEditor(), k.mainContainer.removeClass("invalid")) : k.mainContainer.addClass("invalid")
+ }); this.hintContainer = new CKEDITOR.dom.element("div"); this.hintContainer.addClass("toolbarModifier-hints"); this._fillHintByUnusedElements(); this.hintContainer.insertBefore(e)
+ }; e.prototype._fillHintByUnusedElements = function() {
+ var a = this.getUnusedButtonsArray(this.actualConfig.toolbar, !0), a = this.groupButtonNamesByGroup(a), d = g.map(a, function(a) {
+ var b = g.map(a.buttons, function(a) {
+ return "\x3ccode\x3e" +
+ a + "\x3c/code\x3e "
+ }).join(""); return ["\x3cdt\x3e\x3ccode\x3e", a.name, "\x3c/code\x3e\x3c/dt\x3e\x3cdd\x3e", b, "\x3c/dd\x3e"].join("")
+ }).join(" "), f = '\x3cdt class\x3d"list-header"\x3eToolbar group\x3c/dt\x3e\x3cdd class\x3d"list-header"\x3eUnused items\x3c/dd\x3e'; a.length || (f = "\x3cp\x3eAll items are in use.\x3c/p\x3e"); this.codeContainer.refresh(); this.hintContainer.setHtml("\x3ch3\x3eUnused toolbar items\x3c/h3\x3e\x3cdl\x3e" + f + d + "\x3c/dl\x3e")
+ }; e.prototype.getToolbarGroupByButtonName = function(a) {
+ var d =
+ this.fullToolbarEditor.buttonNamesByGroup, f; for (f in d) for (var c = d[f], b = c.length; b--;)if (a === c[b]) return f; return null
+ }; e.prototype.getUnusedButtonsArray = function(a, d, f) { d = !0 === d ? !0 : !1; var c = e.mapToolbarCfgToElementsList(a); a = Object.keys(this.fullToolbarEditor.editorInstance.ui.items); a = g.filter(a, function(a) { var d = "-" === a; a = void 0 === f || 0 === a.toLowerCase().indexOf(f.toLowerCase()); return !d && a }); a = g.filter(a, function(a) { return -1 == CKEDITOR.tools.indexOf(c, a) }); d && a.sort(); return a }; e.prototype.groupButtonNamesByGroup =
+ function(a) { var d = [], f = JSON.parse(JSON.stringify(this.fullToolbarEditor.buttonNamesByGroup)), c; for (c in f) { var b = f[c], b = g.filter(b, function(b) { return -1 !== CKEDITOR.tools.indexOf(a, b) }); b.length && d.push({ name: c, buttons: b }) } return d }; e.mapToolbarCfgToElementsList = function(a) { function d(a) { return "-" !== a } for (var f = [], c = a.length, b = 0; b < c; b += 1)a[b] && "string" !== typeof a[b] && (f = f.concat(g.filter(a[b].items, d))); return f }; e.prototype._setupActualConfig = function(a) {
+ a = a || this.editorInstance.config; CKEDITOR.tools.isArray(a.toolbar) ||
+ (a.toolbarGroups || (a.toolbarGroups = this.fullToolbarEditor.getFullToolbarGroupsConfig(!0)), this._fixGroups(a), a.toolbar = this._mapToolbarGroupsToToolbar(a.toolbarGroups, this.actualConfig.removeButtons), this.actualConfig.toolbar = a.toolbar, this.actualConfig.removeButtons = "")
+ }; e.prototype._mapToolbarGroupsToToolbar = function(a, d) {
+ d = d || this.editorInstance.config.removedBtns; d = "string" == typeof d ? d.split(",") : []; for (var f = a.length; f--;) {
+ var c = this._mapToolbarSubgroup(a[f], d); "separator" === a[f].type ? a[f] = "/" :
+ CKEDITOR.tools.isArray(c) && 0 === c.length ? a.splice(f, 1) : a[f] = "string" == typeof c ? c : { name: a[f].name, items: c }
+ } return a
+ }; e.prototype._mapToolbarSubgroup = function(a, d) { if ("string" == typeof a) return a; for (var f = a.groups ? a.groups.length : 0, c = [], b = 0; b < f; b += 1) { var e = a.groups[b], e = this.fullToolbarEditor.buttonsByGroup["string" === typeof e ? e : e.name] || [], e = this._mapButtonsToButtonsNames(e, d), g = e.length, c = c.concat(e); g && c.push("-") } "-" == c[c.length - 1] && c.pop(); return c }; e.prototype._mapButtonsToButtonsNames = function(a,
+ d) { for (var f = a.length; f--;) { var c = a[f], c = "string" === typeof c ? c : this.fullToolbarEditor.getCamelCasedButtonName(c.name); -1 !== CKEDITOR.tools.indexOf(d, c) ? a.splice(f, 1) : a[f] = c } return a }; e.prototype._evaluateValue = function(a) { var d; try { var f = {}; Function("var CKEDITOR \x3d {}; " + a + "; return CKEDITOR;")().editorConfig(f); d = f; for (var c = d.toolbar.length; c--;)d.toolbar[c] || d.toolbar.splice(c, 1) } catch (b) { d = null } return d }; e.prototype.mapToolbarToToolbarGroups = function(a) {
+ function d(a, b) {
+ a = a.slice(); for (var d =
+ b.length; d--;) { var c = a.indexOf(b[d]); -1 !== c && a.splice(c, 1) } return a
+ } for (var f = {}, c = [], b = [], c = a.length, e = 0; e < c; e++)if ("/" === a[e]) b.push("/"); else { var g = a[e].items, m = {}; m.name = a[e].name; m.groups = []; for (var l = g.length, p = 0; p < l; p++) { var n = g[p]; if ("-" !== n) { var h = this.getToolbarGroupByButtonName(n); -1 === m.groups.indexOf(h) && m.groups.push(h); f[h] = f[h] || {}; h = f[h].buttons = f[h].buttons || {}; h[n] = h[n] || { used: 0, origin: m.name }; h[n].used++ } } b.push(m) } c = function(a, b) {
+ var c = [], e; for (e in a) var f = a[e], g = b[e].slice(),
+ c = c.concat(d(g, Object.keys(f.buttons))); return c
+ }(f, this.fullToolbarEditor.buttonNamesByGroup); return { toolbarGroups: b, removeButtons: c.join(",") }
+ }; return e
+})(); \ No newline at end of file
diff --git a/samples/toolbarconfigurator/lib/codemirror/LICENSE b/samples/toolbarconfigurator/lib/codemirror/LICENSE
new file mode 100755
index 0000000..d21bbea
--- /dev/null
+++ b/samples/toolbarconfigurator/lib/codemirror/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others
+
+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.
diff --git a/samples/toolbarconfigurator/lib/codemirror/codemirror.css b/samples/toolbarconfigurator/lib/codemirror/codemirror.css
new file mode 100755
index 0000000..6fd44c6
--- /dev/null
+++ b/samples/toolbarconfigurator/lib/codemirror/codemirror.css
@@ -0,0 +1,519 @@
+/* BASICS */
+
+.CodeMirror {
+ /* Set height, width, borders, and global font properties here */
+ font-family: monospace;
+ height: 300px;
+ color: black;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+ padding: 4px 0;
+ /* Vertical padding around content */
+}
+
+.CodeMirror pre {
+ padding: 0 4px;
+ /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler,
+.CodeMirror-gutter-filler {
+ background-color: white;
+ /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+ border-right: 1px solid #ddd;
+ background-color: #f7f7f7;
+ white-space: nowrap;
+}
+
+.CodeMirror-linenumbers {}
+
+.CodeMirror-linenumber {
+ padding: 0 3px 0 5px;
+ min-width: 20px;
+ text-align: right;
+ color: #999;
+ white-space: nowrap;
+}
+
+.CodeMirror-guttermarker {
+ color: black;
+}
+
+.CodeMirror-guttermarker-subtle {
+ color: #999;
+}
+
+/* CURSOR */
+
+.CodeMirror div.CodeMirror-cursor {
+ border-left: 1px solid black;
+}
+
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+ border-left: 1px solid silver;
+}
+
+.CodeMirror.cm-fat-cursor div.CodeMirror-cursor {
+ width: auto;
+ border: 0;
+ background: #7e7;
+}
+
+.CodeMirror.cm-fat-cursor div.CodeMirror-cursors {
+ z-index: 1;
+}
+
+.cm-animate-fat-cursor {
+ width: auto;
+ border: 0;
+ -webkit-animation: blink 1.06s steps(1) infinite;
+ -moz-animation: blink 1.06s steps(1) infinite;
+ animation: blink 1.06s steps(1) infinite;
+}
+
+@-moz-keyframes blink {
+ 0% {
+ background: #7e7;
+ }
+
+ 50% {
+ background: none;
+ }
+
+ 100% {
+ background: #7e7;
+ }
+}
+
+@-webkit-keyframes blink {
+ 0% {
+ background: #7e7;
+ }
+
+ 50% {
+ background: none;
+ }
+
+ 100% {
+ background: #7e7;
+ }
+}
+
+@keyframes blink {
+ 0% {
+ background: #7e7;
+ }
+
+ 50% {
+ background: none;
+ }
+
+ 100% {
+ background: #7e7;
+ }
+}
+
+/* Can style cursor different in overwrite (non-insert) mode */
+div.CodeMirror-overwrite div.CodeMirror-cursor {}
+
+.cm-tab {
+ display: inline-block;
+ text-decoration: inherit;
+}
+
+.CodeMirror-ruler {
+ border-left: 1px solid #ccc;
+ position: absolute;
+}
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-keyword {
+ color: #708;
+}
+
+.cm-s-default .cm-atom {
+ color: #219;
+}
+
+.cm-s-default .cm-number {
+ color: #164;
+}
+
+.cm-s-default .cm-def {
+ color: #00f;
+}
+
+.cm-s-default .cm-variable,
+.cm-s-default .cm-punctuation,
+.cm-s-default .cm-property,
+.cm-s-default .cm-operator {}
+
+.cm-s-default .cm-variable-2 {
+ color: #05a;
+}
+
+.cm-s-default .cm-variable-3 {
+ color: #085;
+}
+
+.cm-s-default .cm-comment {
+ color: #a50;
+}
+
+.cm-s-default .cm-string {
+ color: #a11;
+}
+
+.cm-s-default .cm-string-2 {
+ color: #f50;
+}
+
+.cm-s-default .cm-meta {
+ color: #555;
+}
+
+.cm-s-default .cm-qualifier {
+ color: #555;
+}
+
+.cm-s-default .cm-builtin {
+ color: #30a;
+}
+
+.cm-s-default .cm-bracket {
+ color: #997;
+}
+
+.cm-s-default .cm-tag {
+ color: #170;
+}
+
+.cm-s-default .cm-attribute {
+ color: #00c;
+}
+
+.cm-s-default .cm-header {
+ color: blue;
+}
+
+.cm-s-default .cm-quote {
+ color: #090;
+}
+
+.cm-s-default .cm-hr {
+ color: #999;
+}
+
+.cm-s-default .cm-link {
+ color: #00c;
+}
+
+.cm-negative {
+ color: #d44;
+}
+
+.cm-positive {
+ color: #292;
+}
+
+.cm-header,
+.cm-strong {
+ font-weight: bold;
+}
+
+.cm-em {
+ font-style: italic;
+}
+
+.cm-link {
+ text-decoration: underline;
+}
+
+.cm-strikethrough {
+ text-decoration: line-through;
+}
+
+.cm-s-default .cm-error {
+ color: #f00;
+}
+
+.cm-invalidchar {
+ color: #f00;
+}
+
+.CodeMirror-composing {
+ border-bottom: 2px solid;
+}
+
+/* Default styles for common addons */
+
+div.CodeMirror span.CodeMirror-matchingbracket {
+ color: #0f0;
+}
+
+div.CodeMirror span.CodeMirror-nonmatchingbracket {
+ color: #f22;
+}
+
+.CodeMirror-matchingtag {
+ background: rgba(255, 150, 0, .3);
+}
+
+.CodeMirror-activeline-background {
+ background: #e8f2ff;
+}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+ the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+ position: relative;
+ overflow: hidden;
+ background: white;
+}
+
+.CodeMirror-scroll {
+ overflow: scroll !important;
+ /* Things will break if this is overridden */
+ /* 30px is the magic margin used to hide the element's real scrollbars */
+ /* See overflow: hidden in .CodeMirror */
+ margin-bottom: -30px;
+ margin-right: -30px;
+ padding-bottom: 30px;
+ height: 100%;
+ outline: none;
+ /* Prevent dragging from highlighting the element */
+ position: relative;
+}
+
+.CodeMirror-sizer {
+ position: relative;
+ border-right: 30px solid transparent;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+ before actuall scrolling happens, thus preventing shaking and
+ flickering artifacts. */
+.CodeMirror-vscrollbar,
+.CodeMirror-hscrollbar,
+.CodeMirror-scrollbar-filler,
+.CodeMirror-gutter-filler {
+ position: absolute;
+ z-index: 6;
+ display: none;
+}
+
+.CodeMirror-vscrollbar {
+ right: 0;
+ top: 0;
+ overflow-x: hidden;
+ overflow-y: scroll;
+}
+
+.CodeMirror-hscrollbar {
+ bottom: 0;
+ left: 0;
+ overflow-y: hidden;
+ overflow-x: scroll;
+}
+
+.CodeMirror-scrollbar-filler {
+ right: 0;
+ bottom: 0;
+}
+
+.CodeMirror-gutter-filler {
+ left: 0;
+ bottom: 0;
+}
+
+.CodeMirror-gutters {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 3;
+}
+
+.CodeMirror-gutter {
+ white-space: normal;
+ height: 100%;
+ display: inline-block;
+ margin-bottom: -30px;
+ /* Hack to make IE7 behave */
+ *zoom: 1;
+ *display: inline;
+}
+
+.CodeMirror-gutter-wrapper {
+ position: absolute;
+ z-index: 4;
+ height: 100%;
+}
+
+.CodeMirror-gutter-elt {
+ position: absolute;
+ cursor: default;
+ z-index: 4;
+}
+
+.CodeMirror-gutter-wrapper {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+
+.CodeMirror-lines {
+ cursor: text;
+ min-height: 1px;
+ /* prevents collapsing before first draw */
+}
+
+.CodeMirror pre {
+ /* Reset some styles that the rest of the page might have set */
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ border-width: 0;
+ background: transparent;
+ font-family: inherit;
+ font-size: inherit;
+ margin: 0;
+ white-space: pre;
+ word-wrap: normal;
+ line-height: inherit;
+ color: inherit;
+ z-index: 2;
+ position: relative;
+ overflow: visible;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.CodeMirror-wrap pre {
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ word-break: normal;
+}
+
+.CodeMirror-linebackground {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ z-index: 0;
+}
+
+.CodeMirror-linewidget {
+ position: relative;
+ z-index: 2;
+ overflow: auto;
+}
+
+.CodeMirror-widget {}
+
+.CodeMirror-code {
+ outline: none;
+}
+
+/* Force content-box sizing for the elements where we expect it */
+.CodeMirror-scroll,
+.CodeMirror-sizer,
+.CodeMirror-gutter,
+.CodeMirror-gutters,
+.CodeMirror-linenumber {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+.CodeMirror-measure {
+ position: absolute;
+ width: 100%;
+ height: 0;
+ overflow: hidden;
+ visibility: hidden;
+}
+
+.CodeMirror-measure pre {
+ position: static;
+}
+
+.CodeMirror div.CodeMirror-cursor {
+ position: absolute;
+ border-right: none;
+ width: 0;
+}
+
+div.CodeMirror-cursors {
+ visibility: hidden;
+ position: relative;
+ z-index: 3;
+}
+
+.CodeMirror-focused div.CodeMirror-cursors {
+ visibility: visible;
+}
+
+.CodeMirror-selected {
+ background: #d9d9d9;
+}
+
+.CodeMirror-focused .CodeMirror-selected {
+ background: #d7d4f0;
+}
+
+.CodeMirror-crosshair {
+ cursor: crosshair;
+}
+
+.CodeMirror ::selection {
+ background: #d7d4f0;
+}
+
+.CodeMirror ::-moz-selection {
+ background: #d7d4f0;
+}
+
+.cm-searching {
+ background: #ffa;
+ background: rgba(255, 255, 0, .4);
+}
+
+/* IE7 hack to prevent it from returning funny offsetTops on the spans */
+.CodeMirror span {
+ *vertical-align: text-bottom;
+}
+
+/* Used to force a border model for a node */
+.cm-force-border {
+ padding-right: .1px;
+}
+
+@media print {
+
+ /* Hide the cursor when printing */
+ .CodeMirror div.CodeMirror-cursors {
+ visibility: hidden;
+ }
+}
+
+/* See issue #2901 */
+.cm-tab-wrap-hack:after {
+ content: '';
+}
+
+/* Help users use markselection to safely style text background */
+span.CodeMirror-selectedtext {
+ background: none;
+} \ No newline at end of file
diff --git a/samples/toolbarconfigurator/lib/codemirror/codemirror.js b/samples/toolbarconfigurator/lib/codemirror/codemirror.js
new file mode 100755
index 0000000..ea70793
--- /dev/null
+++ b/samples/toolbarconfigurator/lib/codemirror/codemirror.js
@@ -0,0 +1,996 @@
+(function(q) { if ("object" == typeof exports && "object" == typeof module) module.exports = q(); else { if ("function" == typeof define && define.amd) return define([], q); this.CodeMirror = q() } })(function() {
+ function q(a, b) {
+ if (!(this instanceof q)) return new q(a, b); this.options = b = b ? V(b) : {}; V(qf, b, !1); wc(b); var c = b.value; "string" == typeof c && (c = new P(c, b.mode)); this.doc = c; var d = new q.inputStyles[b.inputStyle](this), d = this.display = new rf(a, c, d); d.wrapper.CodeMirror = this; Ad(this); Bd(this); b.lineWrapping && (this.display.wrapper.className +=
+ " CodeMirror-wrap"); b.autofocus && !ab && d.input.focus(); Cd(this); this.state = { keyMaps: [], overlays: [], modeGen: 0, overwrite: !1, delayingBlurEvent: !1, focused: !1, suppressEdits: !1, pasteIncoming: !1, cutIncoming: !1, draggingText: !1, highlight: new bb, keySeq: null, specialChars: null }; var e = this; B && 11 > C && setTimeout(function() { e.display.input.reset(!0) }, 20); sf(this); Dd || (tf(), Dd = !0); Ja(this); this.curOp.forceUpdate = !0; Ed(this, c); b.autofocus && !ab || e.hasFocus() ? setTimeout(cb(xc, this), 20) : db(this); for (var f in Ka) if (Ka.hasOwnProperty(f)) Ka[f](this,
+ b[f], Fd); Gd(this); b.finishInit && b.finishInit(this); for (c = 0; c < yc.length; ++c)yc[c](this); La(this); J && b.lineWrapping && "optimizelegibility" == getComputedStyle(d.lineDiv).textRendering && (d.lineDiv.style.textRendering = "auto")
+ } function rf(a, b, c) {
+ this.input = c; this.scrollbarFiller = t("div", null, "CodeMirror-scrollbar-filler"); this.scrollbarFiller.setAttribute("cm-not-content", "true"); this.gutterFiller = t("div", null, "CodeMirror-gutter-filler"); this.gutterFiller.setAttribute("cm-not-content", "true"); this.lineDiv =
+ t("div", null, "CodeMirror-code"); this.selectionDiv = t("div", null, null, "position: relative; z-index: 1"); this.cursorDiv = t("div", null, "CodeMirror-cursors"); this.measure = t("div", null, "CodeMirror-measure"); this.lineMeasure = t("div", null, "CodeMirror-measure"); this.lineSpace = t("div", [this.measure, this.lineMeasure, this.selectionDiv, this.cursorDiv, this.lineDiv], null, "position: relative; outline: none"); this.mover = t("div", [t("div", [this.lineSpace], "CodeMirror-lines")], null, "position: relative"); this.sizer = t("div",
+ [this.mover], "CodeMirror-sizer"); this.sizerWidth = null; this.heightForcer = t("div", null, null, "position: absolute; height: " + Hd + "px; width: 1px;"); this.gutters = t("div", null, "CodeMirror-gutters"); this.lineGutter = null; this.scroller = t("div", [this.sizer, this.heightForcer, this.gutters], "CodeMirror-scroll"); this.scroller.setAttribute("tabIndex", "-1"); this.wrapper = t("div", [this.scrollbarFiller, this.gutterFiller, this.scroller], "CodeMirror"); B && 8 > C && (this.gutters.style.zIndex = -1, this.scroller.style.paddingRight =
+ 0); J || wa && ab || (this.scroller.draggable = !0); a && (a.appendChild ? a.appendChild(this.wrapper) : a(this.wrapper)); this.reportedViewFrom = this.reportedViewTo = this.viewFrom = this.viewTo = b.first; this.view = []; this.externalMeasured = this.renderedView = null; this.lastWrapHeight = this.lastWrapWidth = this.viewOffset = 0; this.updateLineNumbers = null; this.nativeBarWidth = this.barHeight = this.barWidth = 0; this.scrollbarsClipped = !1; this.lineNumWidth = this.lineNumInnerWidth = this.lineNumChars = null; this.alignWidgets = !1; this.maxLine = this.cachedCharWidth =
+ this.cachedTextHeight = this.cachedPaddingH = null; this.maxLineLength = 0; this.maxLineChanged = !1; this.wheelDX = this.wheelDY = this.wheelStartX = this.wheelStartY = null; this.shift = !1; this.activeTouch = this.selForContextMenu = null; c.init(this)
+ } function zc(a) { a.doc.mode = q.getMode(a.options, a.doc.modeOption); eb(a) } function eb(a) { a.doc.iter(function(a) { a.stateAfter && (a.stateAfter = null); a.styles && (a.styles = null) }); a.doc.frontier = a.doc.first; fb(a, 100); a.state.modeGen++; a.curOp && Q(a) } function Id(a) {
+ var b = xa(a.display),
+ c = a.options.lineWrapping, d = c && Math.max(5, a.display.scroller.clientWidth / gb(a.display) - 3); return function(e) { if (ya(a.doc, e)) return 0; var f = 0; if (e.widgets) for (var g = 0; g < e.widgets.length; g++)e.widgets[g].height && (f += e.widgets[g].height); return c ? f + (Math.ceil(e.text.length / d) || 1) * b : f + b }
+ } function Ac(a) { var b = a.doc, c = Id(a); b.iter(function(a) { var b = c(a); b != a.height && ca(a, b) }) } function Bd(a) {
+ a.display.wrapper.className = a.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + a.options.theme.replace(/(^|\s)\s*/g,
+ " cm-s-"); hb(a)
+ } function ib(a) { Ad(a); Q(a); setTimeout(function() { Bc(a) }, 20) } function Ad(a) { var b = a.display.gutters, c = a.options.gutters; za(b); for (var d = 0; d < c.length; ++d) { var e = c[d], f = b.appendChild(t("div", null, "CodeMirror-gutter " + e)); "CodeMirror-linenumbers" == e && (a.display.lineGutter = f, f.style.width = (a.display.lineNumWidth || 1) + "px") } b.style.display = d ? "" : "none"; Cc(a) } function Cc(a) { a.display.sizer.style.marginLeft = a.display.gutters.offsetWidth + "px" } function Kb(a) {
+ if (0 == a.height) return 0; for (var b = a.text.length,
+ c, d = a; c = Aa(d, !0);)c = c.find(0, !0), d = c.from.line, b += c.from.ch - c.to.ch; for (d = a; c = Aa(d, !1);)c = c.find(0, !0), b -= d.text.length - c.from.ch, d = c.to.line, b += d.text.length - c.to.ch; return b
+ } function Dc(a) { var b = a.display; a = a.doc; b.maxLine = u(a, a.first); b.maxLineLength = Kb(b.maxLine); b.maxLineChanged = !0; a.iter(function(a) { var d = Kb(a); d > b.maxLineLength && (b.maxLineLength = d, b.maxLine = a) }) } function wc(a) {
+ var b = D(a.gutters, "CodeMirror-linenumbers"); -1 == b && a.lineNumbers ? a.gutters = a.gutters.concat(["CodeMirror-linenumbers"]) :
+ -1 < b && !a.lineNumbers && (a.gutters = a.gutters.slice(0), a.gutters.splice(b, 1))
+ } function jb(a) { var b = a.display, c = b.gutters.offsetWidth, d = Math.round(a.doc.height + Ec(a.display)); return { clientHeight: b.scroller.clientHeight, viewHeight: b.wrapper.clientHeight, scrollWidth: b.scroller.scrollWidth, clientWidth: b.scroller.clientWidth, viewWidth: b.wrapper.clientWidth, barLeft: a.options.fixedGutter ? c : 0, docHeight: d, scrollHeight: d + da(a) + b.barHeight, nativeBarWidth: b.nativeBarWidth, gutterWidth: c } } function Fc(a, b, c) {
+ this.cm =
+ c; var d = this.vert = t("div", [t("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"), e = this.horiz = t("div", [t("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); a(d); a(e); v(d, "scroll", function() { d.clientHeight && b(d.scrollTop, "vertical") }); v(e, "scroll", function() { e.clientWidth && b(e.scrollLeft, "horizontal") }); this.checkedOverlay = !1; B && 8 > C && (this.horiz.style.minHeight = this.vert.style.minWidth = "18px")
+ } function Gc() { } function Cd(a) {
+ a.display.scrollbars && (a.display.scrollbars.clear(),
+ a.display.scrollbars.addClass && kb(a.display.wrapper, a.display.scrollbars.addClass)); a.display.scrollbars = new q.scrollbarModel[a.options.scrollbarStyle](function(b) { a.display.wrapper.insertBefore(b, a.display.scrollbarFiller); v(b, "mousedown", function() { a.state.focused && setTimeout(function() { a.display.input.focus() }, 0) }); b.setAttribute("cm-not-content", "true") }, function(b, c) { "horizontal" == c ? Ma(a, b) : lb(a, b) }, a); a.display.scrollbars.addClass && mb(a.display.wrapper, a.display.scrollbars.addClass)
+ } function Na(a,
+ b) { b || (b = jb(a)); var c = a.display.barWidth, d = a.display.barHeight; Jd(a, b); for (var e = 0; 4 > e && c != a.display.barWidth || d != a.display.barHeight; e++)c != a.display.barWidth && a.options.lineWrapping && Lb(a), Jd(a, jb(a)), c = a.display.barWidth, d = a.display.barHeight } function Jd(a, b) {
+ var c = a.display, d = c.scrollbars.update(b); c.sizer.style.paddingRight = (c.barWidth = d.right) + "px"; c.sizer.style.paddingBottom = (c.barHeight = d.bottom) + "px"; d.right && d.bottom ? (c.scrollbarFiller.style.display = "block", c.scrollbarFiller.style.height =
+ d.bottom + "px", c.scrollbarFiller.style.width = d.right + "px") : c.scrollbarFiller.style.display = ""; d.bottom && a.options.coverGutterNextToScrollbar && a.options.fixedGutter ? (c.gutterFiller.style.display = "block", c.gutterFiller.style.height = d.bottom + "px", c.gutterFiller.style.width = b.gutterWidth + "px") : c.gutterFiller.style.display = ""
+ } function Hc(a, b, c) {
+ var d = c && null != c.top ? Math.max(0, c.top) : a.scroller.scrollTop, d = Math.floor(d - a.lineSpace.offsetTop), e = c && null != c.bottom ? c.bottom : d + a.wrapper.clientHeight, d = Ba(b, d),
+ e = Ba(b, e); if (c && c.ensure) { var f = c.ensure.from.line; c = c.ensure.to.line; f < d ? (d = f, e = Ba(b, ea(u(b, f)) + a.wrapper.clientHeight)) : Math.min(c, b.lastLine()) >= e && (d = Ba(b, ea(u(b, c)) - a.wrapper.clientHeight), e = c) } return { from: d, to: Math.max(e, d + 1) }
+ } function Bc(a) {
+ var b = a.display, c = b.view; if (b.alignWidgets || b.gutters.firstChild && a.options.fixedGutter) {
+ for (var d = Ic(b) - b.scroller.scrollLeft + a.doc.scrollLeft, e = b.gutters.offsetWidth, f = d + "px", g = 0; g < c.length; g++)if (!c[g].hidden) {
+ a.options.fixedGutter && c[g].gutter && (c[g].gutter.style.left =
+ f); var h = c[g].alignable; if (h) for (var k = 0; k < h.length; k++)h[k].style.left = f
+ } a.options.fixedGutter && (b.gutters.style.left = d + e + "px")
+ }
+ } function Gd(a) {
+ if (!a.options.lineNumbers) return !1; var b = a.doc, b = Jc(a.options, b.first + b.size - 1), c = a.display; if (b.length != c.lineNumChars) {
+ var d = c.measure.appendChild(t("div", [t("div", b)], "CodeMirror-linenumber CodeMirror-gutter-elt")), e = d.firstChild.offsetWidth, d = d.offsetWidth - e; c.lineGutter.style.width = ""; c.lineNumInnerWidth = Math.max(e, c.lineGutter.offsetWidth - d) + 1; c.lineNumWidth =
+ c.lineNumInnerWidth + d; c.lineNumChars = c.lineNumInnerWidth ? b.length : -1; c.lineGutter.style.width = c.lineNumWidth + "px"; Cc(a); return !0
+ } return !1
+ } function Jc(a, b) { return String(a.lineNumberFormatter(b + a.firstLineNumber)) } function Ic(a) { return a.scroller.getBoundingClientRect().left - a.sizer.getBoundingClientRect().left } function Mb(a, b, c) {
+ var d = a.display; this.viewport = b; this.visible = Hc(d, a.doc, b); this.editorIsHidden = !d.wrapper.offsetWidth; this.wrapperHeight = d.wrapper.clientHeight; this.wrapperWidth = d.wrapper.clientWidth;
+ this.oldDisplayWidth = pa(a); this.force = c; this.dims = Kc(a); this.events = []
+ } function Lc(a, b) {
+ var c = a.display, d = a.doc; if (b.editorIsHidden) return qa(a), !1; if (!b.force && b.visible.from >= c.viewFrom && b.visible.to <= c.viewTo && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo) && c.renderedView == c.view && 0 == Kd(a)) return !1; Gd(a) && (qa(a), b.dims = Kc(a)); var e = d.first + d.size, f = Math.max(b.visible.from - a.options.viewportMargin, d.first), g = Math.min(e, b.visible.to + a.options.viewportMargin); c.viewFrom < f && 20 > f - c.viewFrom &&
+ (f = Math.max(d.first, c.viewFrom)); c.viewTo > g && 20 > c.viewTo - g && (g = Math.min(e, c.viewTo)); ra && (f = Mc(a.doc, f), g = Ld(a.doc, g)); d = f != c.viewFrom || g != c.viewTo || c.lastWrapHeight != b.wrapperHeight || c.lastWrapWidth != b.wrapperWidth; e = a.display; 0 == e.view.length || f >= e.viewTo || g <= e.viewFrom ? (e.view = Nb(a, f, g), e.viewFrom = f) : (e.viewFrom > f ? e.view = Nb(a, f, e.viewFrom).concat(e.view) : e.viewFrom < f && (e.view = e.view.slice(Ca(a, f))), e.viewFrom = f, e.viewTo < g ? e.view = e.view.concat(Nb(a, e.viewTo, g)) : e.viewTo > g && (e.view = e.view.slice(0,
+ Ca(a, g)))); e.viewTo = g; c.viewOffset = ea(u(a.doc, c.viewFrom)); a.display.mover.style.top = c.viewOffset + "px"; g = Kd(a); if (!d && 0 == g && !b.force && c.renderedView == c.view && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo)) return !1; f = fa(); 4 < g && (c.lineDiv.style.display = "none"); uf(a, c.updateLineNumbers, b.dims); 4 < g && (c.lineDiv.style.display = ""); c.renderedView = c.view; f && fa() != f && f.offsetHeight && f.focus(); za(c.cursorDiv); za(c.selectionDiv); c.gutters.style.height = 0; d && (c.lastWrapHeight = b.wrapperHeight, c.lastWrapWidth =
+ b.wrapperWidth, fb(a, 400)); c.updateLineNumbers = null; return !0
+ } function Md(a, b) {
+ for (var c = b.viewport, d = !0; ; d = !1) { if (!d || !a.options.lineWrapping || b.oldDisplayWidth == pa(a)) if (c && null != c.top && (c = { top: Math.min(a.doc.height + Ec(a.display) - Nc(a), c.top) }), b.visible = Hc(a.display, a.doc, c), b.visible.from >= a.display.viewFrom && b.visible.to <= a.display.viewTo) break; if (!Lc(a, b)) break; Lb(a); d = jb(a); nb(a); Oc(a, d); Na(a, d) } b.signal(a, "update", a); if (a.display.viewFrom != a.display.reportedViewFrom || a.display.viewTo != a.display.reportedViewTo) b.signal(a,
+ "viewportChange", a, a.display.viewFrom, a.display.viewTo), a.display.reportedViewFrom = a.display.viewFrom, a.display.reportedViewTo = a.display.viewTo
+ } function Pc(a, b) { var c = new Mb(a, b); if (Lc(a, c)) { Lb(a); Md(a, c); var d = jb(a); nb(a); Oc(a, d); Na(a, d); c.finish() } } function Oc(a, b) { a.display.sizer.style.minHeight = b.docHeight + "px"; var c = b.docHeight + a.display.barHeight; a.display.heightForcer.style.top = c + "px"; a.display.gutters.style.height = Math.max(c + da(a), b.clientHeight) + "px" } function Lb(a) {
+ a = a.display; for (var b =
+ a.lineDiv.offsetTop, c = 0; c < a.view.length; c++) { var d = a.view[c], e; if (!d.hidden) { if (B && 8 > C) { var f = d.node.offsetTop + d.node.offsetHeight; e = f - b; b = f } else e = d.node.getBoundingClientRect(), e = e.bottom - e.top; f = d.line.height - e; 2 > e && (e = xa(a)); if (.001 < f || -.001 > f) if (ca(d.line, e), Nd(d.line), d.rest) for (e = 0; e < d.rest.length; e++)Nd(d.rest[e]) } }
+ } function Nd(a) { if (a.widgets) for (var b = 0; b < a.widgets.length; ++b)a.widgets[b].height = a.widgets[b].node.offsetHeight } function Kc(a) {
+ for (var b = a.display, c = {}, d = {}, e = b.gutters.clientLeft,
+ f = b.gutters.firstChild, g = 0; f; f = f.nextSibling, ++g)c[a.options.gutters[g]] = f.offsetLeft + f.clientLeft + e, d[a.options.gutters[g]] = f.clientWidth; return { fixedPos: Ic(b), gutterTotalWidth: b.gutters.offsetWidth, gutterLeft: c, gutterWidth: d, wrapperWidth: b.wrapper.clientWidth }
+ } function uf(a, b, c) {
+ function d(b) { var c = b.nextSibling; J && W && a.display.currentWheelTarget == b ? b.style.display = "none" : b.parentNode.removeChild(b); return c } for (var e = a.display, f = a.options.lineNumbers, g = e.lineDiv, h = g.firstChild, k = e.view, e = e.viewFrom,
+ l = 0; l < k.length; l++) { var m = k[l]; if (!m.hidden) if (m.node && m.node.parentNode == g) { for (; h != m.node;)h = d(h); h = f && null != b && b <= e && m.lineNumber; m.changes && (-1 < D(m.changes, "gutter") && (h = !1), Od(a, m, e, c)); h && (za(m.lineNumber), m.lineNumber.appendChild(document.createTextNode(Jc(a.options, e)))); h = m.node.nextSibling } else { var p = vf(a, m, e, c); g.insertBefore(p, h) } e += m.size } for (; h;)h = d(h)
+ } function Od(a, b, c, d) {
+ for (var e = 0; e < b.changes.length; e++) {
+ var f = b.changes[e]; if ("text" == f) {
+ var f = b, g = f.text.className, h = Pd(a, f); f.text ==
+ f.node && (f.node = h.pre); f.text.parentNode.replaceChild(h.pre, f.text); f.text = h.pre; h.bgClass != f.bgClass || h.textClass != f.textClass ? (f.bgClass = h.bgClass, f.textClass = h.textClass, Qc(f)) : g && (f.text.className = g)
+ } else if ("gutter" == f) Qd(a, b, c, d); else if ("class" == f) Qc(b); else if ("widget" == f) { f = a; g = b; h = d; g.alignable && (g.alignable = null); for (var k = g.node.firstChild, l = void 0; k; k = l)l = k.nextSibling, "CodeMirror-linewidget" == k.className && g.node.removeChild(k); Rd(f, g, h) }
+ } b.changes = null
+ } function Ob(a) {
+ a.node == a.text &&
+ (a.node = t("div", null, null, "position: relative"), a.text.parentNode && a.text.parentNode.replaceChild(a.node, a.text), a.node.appendChild(a.text), B && 8 > C && (a.node.style.zIndex = 2)); return a.node
+ } function Pd(a, b) { var c = a.display.externalMeasured; return c && c.line == b.line ? (a.display.externalMeasured = null, b.measure = c.measure, c.built) : Sd(a, b) } function Qc(a) {
+ var b = a.bgClass ? a.bgClass + " " + (a.line.bgClass || "") : a.line.bgClass; b && (b += " CodeMirror-linebackground"); if (a.background) b ? a.background.className = b : (a.background.parentNode.removeChild(a.background),
+ a.background = null); else if (b) { var c = Ob(a); a.background = c.insertBefore(t("div", null, b), c.firstChild) } a.line.wrapClass ? Ob(a).className = a.line.wrapClass : a.node != a.text && (a.node.className = ""); a.text.className = (a.textClass ? a.textClass + " " + (a.line.textClass || "") : a.line.textClass) || ""
+ } function Qd(a, b, c, d) {
+ b.gutter && (b.node.removeChild(b.gutter), b.gutter = null); var e = b.line.gutterMarkers; if (a.options.lineNumbers || e) {
+ var f = Ob(b), g = b.gutter = t("div", null, "CodeMirror-gutter-wrapper", "left: " + (a.options.fixedGutter ?
+ d.fixedPos : -d.gutterTotalWidth) + "px; width: " + d.gutterTotalWidth + "px"); a.display.input.setUneditable(g); f.insertBefore(g, b.text); b.line.gutterClass && (g.className += " " + b.line.gutterClass); !a.options.lineNumbers || e && e["CodeMirror-linenumbers"] || (b.lineNumber = g.appendChild(t("div", Jc(a.options, c), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + d.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + a.display.lineNumInnerWidth + "px"))); if (e) for (b = 0; b < a.options.gutters.length; ++b)c = a.options.gutters[b],
+ (f = e.hasOwnProperty(c) && e[c]) && g.appendChild(t("div", [f], "CodeMirror-gutter-elt", "left: " + d.gutterLeft[c] + "px; width: " + d.gutterWidth[c] + "px"))
+ }
+ } function vf(a, b, c, d) { var e = Pd(a, b); b.text = b.node = e.pre; e.bgClass && (b.bgClass = e.bgClass); e.textClass && (b.textClass = e.textClass); Qc(b); Qd(a, b, c, d); Rd(a, b, d); return b.node } function Rd(a, b, c) { Td(a, b.line, b, c, !0); if (b.rest) for (var d = 0; d < b.rest.length; d++)Td(a, b.rest[d], b, c, !1) } function Td(a, b, c, d, e) {
+ if (b.widgets) {
+ var f = Ob(c), g = 0; for (b = b.widgets; g < b.length; ++g) {
+ var h =
+ b[g], k = t("div", [h.node], "CodeMirror-linewidget"); h.handleMouseEvents || k.setAttribute("cm-ignore-events", "true"); var l = h, m = k, p = d; if (l.noHScroll) { (c.alignable || (c.alignable = [])).push(m); var n = p.wrapperWidth; m.style.left = p.fixedPos + "px"; l.coverGutter || (n -= p.gutterTotalWidth, m.style.paddingLeft = p.gutterTotalWidth + "px"); m.style.width = n + "px" } l.coverGutter && (m.style.zIndex = 5, m.style.position = "relative", l.noHScroll || (m.style.marginLeft = -p.gutterTotalWidth + "px")); a.display.input.setUneditable(k); e && h.above ?
+ f.insertBefore(k, c.gutter || c.text) : f.appendChild(k); L(h, "redraw")
+ }
+ }
+ } function Rc(a) { return r(a.line, a.ch) } function Pb(a, b) { return 0 > y(a, b) ? b : a } function Qb(a, b) { return 0 > y(a, b) ? a : b } function Ud(a) { a.state.focused || (a.display.input.focus(), xc(a)) } function Rb(a) { return a.options.readOnly || a.doc.cantEdit } function Sc(a, b, c, d, e) {
+ var f = a.doc; a.display.shift = !1; d || (d = f.sel); var g = sa(b), h = null; a.state.pasteIncoming && 1 < d.ranges.length && (X && X.join("\n") == b ? h = 0 == d.ranges.length % X.length && ob(X, sa) : g.length == d.ranges.length &&
+ (h = ob(g, function(a) { return [a] }))); for (var k = d.ranges.length - 1; 0 <= k; k--) {
+ var l = d.ranges[k], m = l.from(), p = l.to(); l.empty() && (c && 0 < c ? m = r(m.line, m.ch - c) : a.state.overwrite && !a.state.pasteIncoming && (p = r(p.line, Math.min(u(f, p.line).text.length, p.ch + A(g).length)))); var n = a.curOp.updateInput, m = { from: m, to: p, text: h ? h[k % h.length] : g, origin: e || (a.state.pasteIncoming ? "paste" : a.state.cutIncoming ? "cut" : "+input") }; Oa(a.doc, m); L(a, "inputRead", a, m); if (b && !a.state.pasteIncoming && a.options.electricChars && a.options.smartIndent &&
+ 100 > l.head.ch && (!k || d.ranges[k - 1].head.line != l.head.line)) { l = a.getModeAt(l.head); m = ta(m); p = !1; if (l.electricChars) for (var E = 0; E < l.electricChars.length; E++) { if (-1 < b.indexOf(l.electricChars.charAt(E))) { p = pb(a, m.line, "smart"); break } } else l.electricInput && l.electricInput.test(u(f, m.line).text.slice(0, m.ch)) && (p = pb(a, m.line, "smart")); p && L(a, "electricInput", a, m.line) }
+ } Pa(a); a.curOp.updateInput = n; a.curOp.typing = !0; a.state.pasteIncoming = a.state.cutIncoming = !1
+ } function Vd(a) {
+ for (var b = [], c = [], d = 0; d < a.doc.sel.ranges.length; d++) {
+ var e =
+ a.doc.sel.ranges[d].head.line, e = { anchor: r(e, 0), head: r(e + 1, 0) }; c.push(e); b.push(a.getRange(e.anchor, e.head))
+ } return { text: b, ranges: c }
+ } function Wd(a) { a.setAttribute("autocorrect", "off"); a.setAttribute("autocapitalize", "off"); a.setAttribute("spellcheck", "false") } function Tc(a) { this.cm = a; this.prevInput = ""; this.pollingFast = !1; this.polling = new bb; this.hasSelection = this.inaccurateSelection = !1; this.composing = null } function Xd() {
+ var a = t("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"),
+ b = t("div", [a], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); J ? a.style.width = "1000px" : a.setAttribute("wrap", "off"); Qa && (a.style.border = "1px solid black"); Wd(a); return b
+ } function Uc(a) { this.cm = a; this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; this.polling = new bb; this.gracePeriod = !1 } function Yd(a, b) {
+ var c = Vc(a, b.line); if (!c || c.hidden) return null; var d = u(a.doc, b.line), c = Zd(c, d, b.line); (d = Y(d)) && Sb(d, b.ch); d = $d(c.map, b.ch, "left"); d.offset =
+ "right" == d.collapse ? d.end : d.start; return d
+ } function Ra(a, b) { b && (a.bad = !0); return a } function Tb(a, b, c) { var d; if (b == a.display.lineDiv) { d = a.display.lineDiv.childNodes[c]; if (!d) return Ra(a.clipPos(r(a.display.viewTo - 1)), !0); b = null; c = 0 } else for (d = b; ; d = d.parentNode) { if (!d || d == a.display.lineDiv) return null; if (d.parentNode && d.parentNode == a.display.lineDiv) break } for (var e = 0; e < a.display.view.length; e++) { var f = a.display.view[e]; if (f.node == d) return wf(f, b, c) } } function wf(a, b, c) {
+ function d(b, c, d) {
+ for (var e = -1; e <
+ (l ? l.length : 0); e++)for (var f = 0 > e ? k.map : l[e], g = 0; g < f.length; g += 3) { var h = f[g + 2]; if (h == b || h == c) { c = F(0 > e ? a.line : a.rest[e]); e = f[g] + d; if (0 > d || h != b) e = f[g + (d ? 1 : 0)]; return r(c, e) } }
+ } var e = a.text.firstChild, f = !1; if (!b || !Wc(e, b)) return Ra(r(F(a.line), 0), !0); if (b == e && (f = !0, b = e.childNodes[c], c = 0, !b)) return c = a.rest ? A(a.rest) : a.line, Ra(r(F(c), c.text.length), f); var g = 3 == b.nodeType ? b : null, h = b; g || 1 != b.childNodes.length || 3 != b.firstChild.nodeType || (g = b.firstChild, c && (c = g.nodeValue.length)); for (; h.parentNode != e;)h = h.parentNode;
+ var k = a.measure, l = k.maps; if (b = d(g, h, c)) return Ra(b, f); e = h.nextSibling; for (g = g ? g.nodeValue.length - c : 0; e; e = e.nextSibling) { if (b = d(e, e.firstChild, 0)) return Ra(r(b.line, b.ch - g), f); g += e.textContent.length } h = h.previousSibling; for (g = c; h; h = h.previousSibling) { if (b = d(h, h.firstChild, -1)) return Ra(r(b.line, b.ch + g), f); g += e.textContent.length }
+ } function xf(a, b, c, d, e) {
+ function f(a) { return function(b) { return b.id == a } } function g(b) {
+ if (1 == b.nodeType) {
+ var c = b.getAttribute("cm-text"); if (null != c) "" == c && (c = b.textContent.replace(/\u200b/g,
+ "")), h += c; else { var c = b.getAttribute("cm-marker"), p; if (c) b = a.findMarks(r(d, 0), r(e + 1, 0), f(+c)), b.length && (p = b[0].find()) && (h += Da(a.doc, p.from, p.to).join("\n")); else if ("false" != b.getAttribute("contenteditable")) { for (p = 0; p < b.childNodes.length; p++)g(b.childNodes[p]); /^(pre|div|p)$/i.test(b.nodeName) && (k = !0) } }
+ } else 3 == b.nodeType && (b = b.nodeValue) && (k && (h += "\n", k = !1), h += b)
+ } for (var h = "", k = !1; ;) { g(b); if (b == c) break; b = b.nextSibling } return h
+ } function la(a, b) { this.ranges = a; this.primIndex = b } function z(a, b) {
+ this.anchor =
+ a; this.head = b
+ } function Z(a, b) { var c = a[b]; a.sort(function(a, b) { return y(a.from(), b.from()) }); b = D(a, c); for (c = 1; c < a.length; c++) { var d = a[c], e = a[c - 1]; if (0 <= y(e.to(), d.from())) { var f = Qb(e.from(), d.from()), g = Pb(e.to(), d.to()), d = e.empty() ? d.from() == d.head : e.from() == e.head; c <= b && --b; a.splice(--c, 2, new z(d ? g : f, d ? f : g)) } } return new la(a, b) } function ga(a, b) { return new la([new z(a, b || a)], 0) } function w(a, b) {
+ if (b.line < a.first) return r(a.first, 0); var c = a.first + a.size - 1; if (b.line > c) return r(c, u(a, c).text.length); var c =
+ u(a, b.line).text.length, d = b.ch, c = null == d || d > c ? r(b.line, c) : 0 > d ? r(b.line, 0) : b; return c
+ } function qb(a, b) { return b >= a.first && b < a.first + a.size } function rb(a, b, c, d) { return a.cm && a.cm.display.shift || a.extend ? (a = b.anchor, d && (b = 0 > y(c, a), b != 0 > y(d, a) ? (a = c, c = d) : b != 0 > y(c, d) && (c = d)), new z(a, c)) : new z(d || c, c) } function Ub(a, b, c, d) { H(a, new la([rb(a, a.sel.primary(), b, c)], 0), d) } function ae(a, b, c) { for (var d = [], e = 0; e < a.sel.ranges.length; e++)d[e] = rb(a, a.sel.ranges[e], b[e], null); b = Z(d, a.sel.primIndex); H(a, b, c) } function Xc(a,
+ b, c, d) { var e = a.sel.ranges.slice(0); e[b] = c; H(a, Z(e, a.sel.primIndex), d) } function yf(a, b) { var c = { ranges: b.ranges, update: function(b) { this.ranges = []; for (var c = 0; c < b.length; c++)this.ranges[c] = new z(w(a, b[c].anchor), w(a, b[c].head)) } }; K(a, "beforeSelectionChange", a, c); a.cm && K(a.cm, "beforeSelectionChange", a.cm, c); return c.ranges != b.ranges ? Z(c.ranges, c.ranges.length - 1) : b } function be(a, b, c) { var d = a.history.done, e = A(d); e && e.ranges ? (d[d.length - 1] = b, Vb(a, b, c)) : H(a, b, c) } function H(a, b, c) {
+ Vb(a, b, c); b = a.sel; var d =
+ a.cm ? a.cm.curOp.id : NaN, e = a.history, f = c && c.origin, g; if (!(g = d == e.lastSelOp) && (g = f && e.lastSelOrigin == f) && !(g = e.lastModTime == e.lastSelTime && e.lastOrigin == f)) { g = A(e.done); var h = f.charAt(0); g = "*" == h || "+" == h && g.ranges.length == b.ranges.length && g.somethingSelected() == b.somethingSelected() && new Date - a.history.lastSelTime <= (a.cm ? a.cm.options.historyEventDelay : 500) } g ? e.done[e.done.length - 1] = b : Wb(b, e.done); e.lastSelTime = +new Date; e.lastSelOrigin = f; e.lastSelOp = d; c && !1 !== c.clearRedo && ce(e.undone)
+ } function Vb(a,
+ b, c) { if (S(a, "beforeSelectionChange") || a.cm && S(a.cm, "beforeSelectionChange")) b = yf(a, b); var d = c && c.bias || (0 > y(b.primary().head, a.sel.primary().head) ? -1 : 1); de(a, ee(a, b, d, !0)); c && !1 === c.scroll || !a.cm || Pa(a.cm) } function de(a, b) { b.equals(a.sel) || (a.sel = b, a.cm && (a.cm.curOp.updateInput = a.cm.curOp.selectionChanged = !0, fe(a.cm)), L(a, "cursorActivity", a)) } function ge(a) { de(a, ee(a, a.sel, null, !1), ha) } function ee(a, b, c, d) {
+ for (var e, f = 0; f < b.ranges.length; f++) {
+ var g = b.ranges[f], h = Xb(a, g.anchor, c, d), k = Xb(a, g.head, c,
+ d); if (e || h != g.anchor || k != g.head) e || (e = b.ranges.slice(0, f)), e[f] = new z(h, k)
+ } return e ? Z(e, b.primIndex) : b
+ } function Xb(a, b, c, d) {
+ var e = !1, f = b, g = c || 1; a.cantEdit = !1; a: for (; ;) {
+ var h = u(a, f.line); if (h.markedSpans) for (var k = 0; k < h.markedSpans.length; ++k) {
+ var l = h.markedSpans[k], m = l.marker; if ((null == l.from || (m.inclusiveLeft ? l.from <= f.ch : l.from < f.ch)) && (null == l.to || (m.inclusiveRight ? l.to >= f.ch : l.to > f.ch))) {
+ if (d && (K(m, "beforeCursorEnter"), m.explicitlyCleared)) if (h.markedSpans) { --k; continue } else break; if (m.atomic) {
+ k =
+ m.find(0 > g ? -1 : 1); if (0 == y(k, f) && (k.ch += g, 0 > k.ch ? k = k.line > a.first ? w(a, r(k.line - 1)) : null : k.ch > h.text.length && (k = k.line < a.first + a.size - 1 ? r(k.line + 1, 0) : null), !k)) { if (e) { if (!d) return Xb(a, b, c, !0); a.cantEdit = !0; return r(a.first, 0) } e = !0; k = b; g = -g } f = k; continue a
+ }
+ }
+ } return f
+ }
+ } function nb(a) { a.display.input.showSelection(a.display.input.prepareSelection()) } function he(a, b) {
+ for (var c = a.doc, d = {}, e = d.cursors = document.createDocumentFragment(), f = d.selection = document.createDocumentFragment(), g = 0; g < c.sel.ranges.length; g++)if (!1 !==
+ b || g != c.sel.primIndex) {
+ var h = c.sel.ranges[g], k = h.empty(); if (k || a.options.showCursorWhenSelecting) {
+ var l = a, m = e, p = ma(l, h.head, "div", null, null, !l.options.singleCursorHeightPerLine), n = m.appendChild(t("div", " ", "CodeMirror-cursor")); n.style.left = p.left + "px"; n.style.top = p.top + "px"; n.style.height = Math.max(0, p.bottom - p.top) * l.options.cursorHeight + "px"; p.other && (l = m.appendChild(t("div", " ", "CodeMirror-cursor CodeMirror-secondarycursor")), l.style.display = "", l.style.left = p.other.left + "px", l.style.top = p.other.top +
+ "px", l.style.height = .85 * (p.other.bottom - p.other.top) + "px")
+ } k || zf(a, h, f)
+ } return d
+ } function zf(a, b, c) {
+ function d(a, b, c, d) { 0 > b && (b = 0); b = Math.round(b); d = Math.round(d); h.appendChild(t("div", null, "CodeMirror-selected", "position: absolute; left: " + a + "px; top: " + b + "px; width: " + (null == c ? m - a : c) + "px; height: " + (d - b) + "px")) } function e(b, c, e) {
+ var f = u(g, b), h = f.text.length, k, p; Af(Y(f), c || 0, null == e ? h : e, function(g, q, t) {
+ var u = Yb(a, r(b, g), "div", f, "left"), v, w; g == q ? (v = u, t = w = u.left) : (v = Yb(a, r(b, q - 1), "div", f, "right"),
+ "rtl" == t && (t = u, u = v, v = t), t = u.left, w = v.right); null == c && 0 == g && (t = l); 3 < v.top - u.top && (d(t, u.top, null, u.bottom), t = l, u.bottom < v.top && d(t, u.bottom, null, v.top)); null == e && q == h && (w = m); if (!k || u.top < k.top || u.top == k.top && u.left < k.left) k = u; if (!p || v.bottom > p.bottom || v.bottom == p.bottom && v.right > p.right) p = v; t < l + 1 && (t = l); d(t, v.top, w - t, v.bottom)
+ }); return { start: k, end: p }
+ } var f = a.display, g = a.doc, h = document.createDocumentFragment(), k = ie(a.display), l = k.left, m = Math.max(f.sizerWidth, pa(a) - f.sizer.offsetLeft) - k.right, f = b.from();
+ b = b.to(); if (f.line == b.line) e(f.line, f.ch, b.ch); else { var p = u(g, f.line), k = u(g, b.line), k = ia(p) == ia(k), f = e(f.line, f.ch, k ? p.text.length + 1 : null).end; b = e(b.line, k ? 0 : null, b.ch).start; k && (f.top < b.top - 2 ? (d(f.right, f.top, null, f.bottom), d(l, b.top, b.left, b.bottom)) : d(f.right, f.top, b.left - f.right, f.bottom)); f.bottom < b.top && d(l, f.bottom, null, b.top) } c.appendChild(h)
+ } function Yc(a) {
+ if (a.state.focused) {
+ var b = a.display; clearInterval(b.blinker); var c = !0; b.cursorDiv.style.visibility = ""; 0 < a.options.cursorBlinkRate ? b.blinker =
+ setInterval(function() { b.cursorDiv.style.visibility = (c = !c) ? "" : "hidden" }, a.options.cursorBlinkRate) : 0 > a.options.cursorBlinkRate && (b.cursorDiv.style.visibility = "hidden")
+ }
+ } function fb(a, b) { a.doc.mode.startState && a.doc.frontier < a.display.viewTo && a.state.highlight.set(b, cb(Bf, a)) } function Bf(a) {
+ var b = a.doc; b.frontier < b.first && (b.frontier = b.first); if (!(b.frontier >= a.display.viewTo)) {
+ var c = +new Date + a.options.workTime, d = Sa(b.mode, sb(a, b.frontier)), e = []; b.iter(b.frontier, Math.min(b.first + b.size, a.display.viewTo +
+ 500), function(f) { if (b.frontier >= a.display.viewFrom) { var g = f.styles, h = je(a, f, d, !0); f.styles = h.styles; var k = f.styleClasses; (h = h.classes) ? f.styleClasses = h : k && (f.styleClasses = null); k = !g || g.length != f.styles.length || k != h && (!k || !h || k.bgClass != h.bgClass || k.textClass != h.textClass); for (h = 0; !k && h < g.length; ++h)k = g[h] != f.styles[h]; k && e.push(b.frontier); f.stateAfter = Sa(b.mode, d) } else Zc(a, f.text, d), f.stateAfter = 0 == b.frontier % 5 ? Sa(b.mode, d) : null; ++b.frontier; if (+new Date > c) return fb(a, a.options.workDelay), !0 });
+ e.length && T(a, function() { for (var b = 0; b < e.length; b++)na(a, e[b], "text") })
+ }
+ } function Cf(a, b, c) { for (var d, e, f = a.doc, g = c ? -1 : b - (a.doc.mode.innerMode ? 1E3 : 100); b > g; --b) { if (b <= f.first) return f.first; var h = u(f, b - 1); if (h.stateAfter && (!c || b <= f.frontier)) return b; h = aa(h.text, null, a.options.tabSize); if (null == e || d > h) e = b - 1, d = h } return e } function sb(a, b, c) {
+ var d = a.doc, e = a.display; if (!d.mode.startState) return !0; var f = Cf(a, b, c), g = f > d.first && u(d, f - 1).stateAfter, g = g ? Sa(d.mode, g) : Df(d.mode); d.iter(f, b, function(c) {
+ Zc(a,
+ c.text, g); c.stateAfter = f == b - 1 || 0 == f % 5 || f >= e.viewFrom && f < e.viewTo ? Sa(d.mode, g) : null; ++f
+ }); c && (d.frontier = f); return g
+ } function Ec(a) { return a.mover.offsetHeight - a.lineSpace.offsetHeight } function ie(a) { if (a.cachedPaddingH) return a.cachedPaddingH; var b = U(a.measure, t("pre", "x")), b = window.getComputedStyle ? window.getComputedStyle(b) : b.currentStyle, b = { left: parseInt(b.paddingLeft), right: parseInt(b.paddingRight) }; isNaN(b.left) || isNaN(b.right) || (a.cachedPaddingH = b); return b } function da(a) { return Hd - a.display.nativeBarWidth }
+ function pa(a) { return a.display.scroller.clientWidth - da(a) - a.display.barWidth } function Nc(a) { return a.display.scroller.clientHeight - da(a) - a.display.barHeight } function Zd(a, b, c) { if (a.line == b) return { map: a.measure.map, cache: a.measure.cache }; for (var d = 0; d < a.rest.length; d++)if (a.rest[d] == b) return { map: a.measure.maps[d], cache: a.measure.caches[d] }; for (d = 0; d < a.rest.length; d++)if (F(a.rest[d]) > c) return { map: a.measure.maps[d], cache: a.measure.caches[d], before: !0 } } function Vc(a, b) {
+ if (b >= a.display.viewFrom && b < a.display.viewTo) return a.display.view[Ca(a,
+ b)]; var c = a.display.externalMeasured; if (c && b >= c.lineN && b < c.lineN + c.size) return c
+ } function Zb(a, b) { var c = F(b), d = Vc(a, c); d && !d.text ? d = null : d && d.changes && Od(a, d, c, Kc(a)); if (!d) { var e; e = ia(b); d = F(e); e = a.display.externalMeasured = new ke(a.doc, e, d); e.lineN = d; d = e.built = Sd(a, e); e.text = d.pre; U(a.display.lineMeasure, d.pre); d = e } c = Zd(d, b, c); return { line: b, view: d, rect: null, map: c.map, cache: c.cache, before: c.before, hasHeights: !1 } } function $c(a, b, c, d, e) {
+ b.before && (c = -1); var f = c + (d || ""); if (b.cache.hasOwnProperty(f)) a =
+ b.cache[f]; else {
+ b.rect || (b.rect = b.view.text.getBoundingClientRect()); if (!b.hasHeights) { var g = b.view, h = b.rect, k = a.options.lineWrapping, l = k && pa(a); if (!g.measure.heights || k && g.measure.width != l) { var m = g.measure.heights = []; if (k) for (g.measure.width = l, g = g.text.firstChild.getClientRects(), k = 0; k < g.length - 1; k++) { var l = g[k], p = g[k + 1]; 2 < Math.abs(l.bottom - p.bottom) && m.push((l.bottom + p.top) / 2 - h.top) } m.push(h.bottom - h.top) } b.hasHeights = !0 } g = d; k = $d(b.map, c, g); d = k.node; h = k.start; l = k.end; c = k.collapse; var n; if (3 == d.nodeType) {
+ for (m =
+ 0; 4 > m; m++) { for (; h && tb(b.line.text.charAt(k.coverStart + h));)--h; for (; k.coverStart + l < k.coverEnd && tb(b.line.text.charAt(k.coverStart + l));)++l; if (B && 9 > C && 0 == h && l == k.coverEnd - k.coverStart) n = d.parentNode.getBoundingClientRect(); else if (B && a.options.lineWrapping) { var E = Ea(d, h, l).getClientRects(); n = E.length ? E["right" == g ? E.length - 1 : 0] : ad } else n = Ea(d, h, l).getBoundingClientRect() || ad; if (n.left || n.right || 0 == h) break; l = h; --h; c = "right" } B && 11 > C && ((E = !window.screen || null == screen.logicalXDPI || screen.logicalXDPI == screen.deviceXDPI) ||
+ (null != bd ? E = bd : (m = U(a.display.measure, t("span", "x")), E = m.getBoundingClientRect(), m = Ea(m, 0, 1).getBoundingClientRect(), E = bd = 1 < Math.abs(E.left - m.left)), E = !E), E || (E = screen.logicalXDPI / screen.deviceXDPI, m = screen.logicalYDPI / screen.deviceYDPI, n = { left: n.left * E, right: n.right * E, top: n.top * m, bottom: n.bottom * m }))
+ } else 0 < h && (c = g = "right"), n = a.options.lineWrapping && 1 < (E = d.getClientRects()).length ? E["right" == g ? E.length - 1 : 0] : d.getBoundingClientRect(); !(B && 9 > C) || h || n && (n.left || n.right) || (n = (n = d.parentNode.getClientRects()[0]) ?
+ { left: n.left, right: n.left + gb(a.display), top: n.top, bottom: n.bottom } : ad); E = n.top - b.rect.top; d = n.bottom - b.rect.top; h = (E + d) / 2; g = b.view.measure.heights; for (m = 0; m < g.length - 1 && !(h < g[m]); m++); c = { left: ("right" == c ? n.right : n.left) - b.rect.left, right: ("left" == c ? n.left : n.right) - b.rect.left, top: m ? g[m - 1] : 0, bottom: g[m] }; n.left || n.right || (c.bogus = !0); a.options.singleCursorHeightPerLine || (c.rtop = E, c.rbottom = d); a = c; a.bogus || (b.cache[f] = a)
+ } return { left: a.left, right: a.right, top: e ? a.rtop : a.top, bottom: e ? a.rbottom : a.bottom }
+ }
+ function $d(a, b, c) {
+ for (var d, e, f, g, h = 0; h < a.length; h += 3) { var k = a[h], l = a[h + 1]; if (b < k) e = 0, f = 1, g = "left"; else if (b < l) e = b - k, f = e + 1; else if (h == a.length - 3 || b == l && a[h + 3] > b) f = l - k, e = f - 1, b >= l && (g = "right"); if (null != e) { d = a[h + 2]; k == l && c == (d.insertLeft ? "left" : "right") && (g = c); if ("left" == c && 0 == e) for (; h && a[h - 2] == a[h - 3] && a[h - 1].insertLeft;)d = a[(h -= 3) + 2], g = "left"; if ("right" == c && e == l - k) for (; h < a.length - 3 && a[h + 3] == a[h + 4] && !a[h + 5].insertLeft;)d = a[(h += 3) + 2], g = "right"; break } } return {
+ node: d, start: e, end: f, collapse: g, coverStart: k,
+ coverEnd: l
+ }
+ } function le(a) { if (a.measure && (a.measure.cache = {}, a.measure.heights = null, a.rest)) for (var b = 0; b < a.rest.length; b++)a.measure.caches[b] = {} } function me(a) { a.display.externalMeasure = null; za(a.display.lineMeasure); for (var b = 0; b < a.display.view.length; b++)le(a.display.view[b]) } function hb(a) { me(a); a.display.cachedCharWidth = a.display.cachedTextHeight = a.display.cachedPaddingH = null; a.options.lineWrapping || (a.display.maxLineChanged = !0); a.display.lineNumChars = null } function cd(a, b, c, d) {
+ if (b.widgets) for (var e =
+ 0; e < b.widgets.length; ++e)if (b.widgets[e].above) { var f = ub(b.widgets[e]); c.top += f; c.bottom += f } if ("line" == d) return c; d || (d = "local"); b = ea(b); b = "local" == d ? b + a.display.lineSpace.offsetTop : b - a.display.viewOffset; if ("page" == d || "window" == d) a = a.display.lineSpace.getBoundingClientRect(), b += a.top + ("window" == d ? 0 : window.pageYOffset || (document.documentElement || document.body).scrollTop), d = a.left + ("window" == d ? 0 : window.pageXOffset || (document.documentElement || document.body).scrollLeft), c.left += d, c.right += d; c.top += b;
+ c.bottom += b; return c
+ } function ne(a, b, c) { if ("div" == c) return b; var d = b.left; b = b.top; "page" == c ? (d -= window.pageXOffset || (document.documentElement || document.body).scrollLeft, b -= window.pageYOffset || (document.documentElement || document.body).scrollTop) : "local" != c && c || (c = a.display.sizer.getBoundingClientRect(), d += c.left, b += c.top); a = a.display.lineSpace.getBoundingClientRect(); return { left: d - a.left, top: b - a.top } } function Yb(a, b, c, d, e) { d || (d = u(a.doc, b.line)); var f = d; b = b.ch; d = $c(a, Zb(a, d), b, e); return cd(a, f, d, c) }
+ function ma(a, b, c, d, e, f) { function g(b, g) { var h = $c(a, e, b, g ? "right" : "left", f); g ? h.left = h.right : h.right = h.left; return cd(a, d, h, c) } function h(a, b) { var c = k[b], d = c.level % 2; a == dd(c) && b && c.level < k[b - 1].level ? (c = k[--b], a = ed(c) - (c.level % 2 ? 0 : 1), d = !0) : a == ed(c) && b < k.length - 1 && c.level < k[b + 1].level && (c = k[++b], a = dd(c) - c.level % 2, d = !1); return d && a == c.to && a > c.from ? g(a - 1) : g(a, d) } d = d || u(a.doc, b.line); e || (e = Zb(a, d)); var k = Y(d); b = b.ch; if (!k) return g(b); var l = Sb(k, b), l = h(b, l); null != vb && (l.other = h(b, vb)); return l } function oe(a,
+ b) { var c = 0; b = w(a.doc, b); a.options.lineWrapping || (c = gb(a.display) * b.ch); var d = u(a.doc, b.line), e = ea(d) + a.display.lineSpace.offsetTop; return { left: c, right: c, top: e, bottom: e + d.height } } function $b(a, b, c, d) { a = r(a, b); a.xRel = d; c && (a.outside = !0); return a } function fd(a, b, c) {
+ var d = a.doc; c += a.display.viewOffset; if (0 > c) return $b(d.first, 0, !0, -1); var e = Ba(d, c), f = d.first + d.size - 1; if (e > f) return $b(d.first + d.size - 1, u(d, f).text.length, !0, 1); 0 > b && (b = 0); for (d = u(d, e); ;)if (e = Ef(a, d, e, b, c), f = (d = Aa(d, !1)) && d.find(0, !0), d &&
+ (e.ch > f.from.ch || e.ch == f.from.ch && 0 < e.xRel)) e = F(d = f.to.line); else return e
+ } function Ef(a, b, c, d, e) {
+ function f(d) { d = ma(a, r(c, d), "line", b, l); h = !0; if (g > d.bottom) return d.left - k; if (g < d.top) return d.left + k; h = !1; return d.left } var g = e - ea(b), h = !1, k = 2 * a.display.wrapper.clientWidth, l = Zb(a, b), m = Y(b), p = b.text.length; e = ac(b); var n = bc(b), E = f(e), q = h, t = f(n), u = h; if (d > t) return $b(c, n, u, 1); for (; ;) {
+ if (m ? n == e || n == gd(b, e, 1) : 1 >= n - e) {
+ m = d < E || d - E <= t - d ? e : n; for (d -= m == e ? E : t; tb(b.text.charAt(m));)++m; return $b(c, m, m == e ? q : u, -1 >
+ d ? -1 : 1 < d ? 1 : 0)
+ } var v = Math.ceil(p / 2), w = e + v; if (m) for (var w = e, x = 0; x < v; ++x)w = gd(b, w, 1); x = f(w); if (x > d) { n = w; t = x; if (u = h) t += 1E3; p = v } else e = w, E = x, q = h, p -= v
+ }
+ } function xa(a) { if (null != a.cachedTextHeight) return a.cachedTextHeight; if (null == Fa) { Fa = t("pre"); for (var b = 0; 49 > b; ++b)Fa.appendChild(document.createTextNode("x")), Fa.appendChild(t("br")); Fa.appendChild(document.createTextNode("x")) } U(a.measure, Fa); b = Fa.offsetHeight / 50; 3 < b && (a.cachedTextHeight = b); za(a.measure); return b || 1 } function gb(a) {
+ if (null != a.cachedCharWidth) return a.cachedCharWidth;
+ var b = t("span", "xxxxxxxxxx"), c = t("pre", [b]); U(a.measure, c); b = b.getBoundingClientRect(); b = (b.right - b.left) / 10; 2 < b && (a.cachedCharWidth = b); return b || 10
+ } function Ja(a) { a.curOp = { cm: a, viewChanged: !1, startHeight: a.doc.height, forceUpdate: !1, updateInput: null, typing: !1, changeObjs: null, cursorActivityHandlers: null, cursorActivityCalled: 0, selectionChanged: !1, updateMaxLine: !1, scrollLeft: null, scrollTop: null, scrollToPos: null, focus: !1, id: ++Ff }; Ta ? Ta.ops.push(a.curOp) : a.curOp.ownsGroup = Ta = { ops: [a.curOp], delayedCallbacks: [] } }
+ function La(a) {
+ if (a = a.curOp.ownsGroup) try { var b = a.delayedCallbacks, c = 0; do { for (; c < b.length; c++)b[c](); for (var d = 0; d < a.ops.length; d++) { var e = a.ops[d]; if (e.cursorActivityHandlers) for (; e.cursorActivityCalled < e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++](e.cm) } } while (c < b.length) } finally {
+ Ta = null; for (b = 0; b < a.ops.length; b++)a.ops[b].cm.curOp = null; a = a.ops; for (b = 0; b < a.length; b++) {
+ var e = a[b], c = e.cm, f = d = c.display; !f.scrollbarsClipped && f.scroller.offsetWidth && (f.nativeBarWidth =
+ f.scroller.offsetWidth - f.scroller.clientWidth, f.heightForcer.style.height = da(c) + "px", f.sizer.style.marginBottom = -f.nativeBarWidth + "px", f.sizer.style.borderRightWidth = da(c) + "px", f.scrollbarsClipped = !0); e.updateMaxLine && Dc(c); e.mustUpdate = e.viewChanged || e.forceUpdate || null != e.scrollTop || e.scrollToPos && (e.scrollToPos.from.line < d.viewFrom || e.scrollToPos.to.line >= d.viewTo) || d.maxLineChanged && c.options.lineWrapping; e.update = e.mustUpdate && new Mb(c, e.mustUpdate && { top: e.scrollTop, ensure: e.scrollToPos }, e.forceUpdate)
+ } for (b =
+ 0; b < a.length; b++)e = a[b], e.updatedDisplay = e.mustUpdate && Lc(e.cm, e.update); for (b = 0; b < a.length; b++)if (e = a[b], c = e.cm, d = c.display, e.updatedDisplay && Lb(c), e.barMeasure = jb(c), d.maxLineChanged && !c.options.lineWrapping && (f = void 0, f = d.maxLine.text.length, f = $c(c, Zb(c, d.maxLine), f, void 0), e.adjustWidthTo = f.left + 3, c.display.sizerWidth = e.adjustWidthTo, e.barMeasure.scrollWidth = Math.max(d.scroller.clientWidth, d.sizer.offsetLeft + e.adjustWidthTo + da(c) + c.display.barWidth), e.maxScrollLeft = Math.max(0, d.sizer.offsetLeft +
+ e.adjustWidthTo - pa(c))), e.updatedDisplay || e.selectionChanged) e.preparedSelection = d.input.prepareSelection(); for (b = 0; b < a.length; b++)e = a[b], c = e.cm, null != e.adjustWidthTo && (c.display.sizer.style.minWidth = e.adjustWidthTo + "px", e.maxScrollLeft < c.doc.scrollLeft && Ma(c, Math.min(c.display.scroller.scrollLeft, e.maxScrollLeft), !0), c.display.maxLineChanged = !1), e.preparedSelection && c.display.input.showSelection(e.preparedSelection), e.updatedDisplay && Oc(c, e.barMeasure), (e.updatedDisplay || e.startHeight != c.doc.height) &&
+ Na(c, e.barMeasure), e.selectionChanged && Yc(c), c.state.focused && e.updateInput && c.display.input.reset(e.typing), e.focus && e.focus == fa() && Ud(e.cm); for (b = 0; b < a.length; b++) {
+ e = a[b]; c = e.cm; d = c.display; f = c.doc; e.updatedDisplay && Md(c, e.update); null == d.wheelStartX || null == e.scrollTop && null == e.scrollLeft && !e.scrollToPos || (d.wheelStartX = d.wheelStartY = null); null == e.scrollTop || d.scroller.scrollTop == e.scrollTop && !e.forceScroll || (f.scrollTop = Math.max(0, Math.min(d.scroller.scrollHeight - d.scroller.clientHeight, e.scrollTop)),
+ d.scrollbars.setScrollTop(f.scrollTop), d.scroller.scrollTop = f.scrollTop); null == e.scrollLeft || d.scroller.scrollLeft == e.scrollLeft && !e.forceScroll || (f.scrollLeft = Math.max(0, Math.min(d.scroller.scrollWidth - pa(c), e.scrollLeft)), d.scrollbars.setScrollLeft(f.scrollLeft), d.scroller.scrollLeft = f.scrollLeft, Bc(c)); if (e.scrollToPos) {
+ var g = void 0, h = w(f, e.scrollToPos.from), g = w(f, e.scrollToPos.to), k = e.scrollToPos.margin; null == k && (k = 0); for (var l = 0; 5 > l; l++) {
+ var m = !1, p = ma(c, h), n = g && g != h ? ma(c, g) : p, n = cc(c, Math.min(p.left,
+ n.left), Math.min(p.top, n.top) - k, Math.max(p.left, n.left), Math.max(p.bottom, n.bottom) + k), q = c.doc.scrollTop, r = c.doc.scrollLeft; null != n.scrollTop && (lb(c, n.scrollTop), 1 < Math.abs(c.doc.scrollTop - q) && (m = !0)); null != n.scrollLeft && (Ma(c, n.scrollLeft), 1 < Math.abs(c.doc.scrollLeft - r) && (m = !0)); if (!m) break
+ } g = p; e.scrollToPos.isCursor && c.state.focused && (ja(c, "scrollCursorIntoView") || (k = c.display, l = k.sizer.getBoundingClientRect(), h = null, 0 > g.top + l.top ? h = !0 : g.bottom + l.top > (window.innerHeight || document.documentElement.clientHeight) &&
+ (h = !1), null == h || Gf || (g = t("div", "​", null, "position: absolute; top: " + (g.top - k.viewOffset - c.display.lineSpace.offsetTop) + "px; height: " + (g.bottom - g.top + da(c) + k.barHeight) + "px; left: " + g.left + "px; width: 2px;"), c.display.lineSpace.appendChild(g), g.scrollIntoView(h), c.display.lineSpace.removeChild(g))))
+ } h = e.maybeHiddenMarkers; g = e.maybeUnhiddenMarkers; if (h) for (k = 0; k < h.length; ++k)h[k].lines.length || K(h[k], "hide"); if (g) for (k = 0; k < g.length; ++k)g[k].lines.length && K(g[k], "unhide"); d.wrapper.offsetHeight && (f.scrollTop =
+ c.display.scroller.scrollTop); e.changeObjs && K(c, "changes", c, e.changeObjs); e.update && e.update.finish()
+ }
+ }
+ } function T(a, b) { if (a.curOp) return b(); Ja(a); try { return b() } finally { La(a) } } function G(a, b) { return function() { if (a.curOp) return b.apply(a, arguments); Ja(a); try { return b.apply(a, arguments) } finally { La(a) } } } function M(a) { return function() { if (this.curOp) return a.apply(this, arguments); Ja(this); try { return a.apply(this, arguments) } finally { La(this) } } } function N(a) {
+ return function() {
+ var b = this.cm; if (!b || b.curOp) return a.apply(this,
+ arguments); Ja(b); try { return a.apply(this, arguments) } finally { La(b) }
+ }
+ } function ke(a, b, c) { for (var d = this.line = b, e; d = Aa(d, !1);)d = d.find(1, !0).line, (e || (e = [])).push(d); this.size = (this.rest = e) ? F(A(this.rest)) - c + 1 : 1; this.node = this.text = null; this.hidden = ya(a, b) } function Nb(a, b, c) { var d = [], e; for (e = b; e < c;)b = new ke(a.doc, u(a.doc, e), e), e += b.size, d.push(b); return d } function Q(a, b, c, d) {
+ null == b && (b = a.doc.first); null == c && (c = a.doc.first + a.doc.size); d || (d = 0); var e = a.display; d && c < e.viewTo && (null == e.updateLineNumbers ||
+ e.updateLineNumbers > b) && (e.updateLineNumbers = b); a.curOp.viewChanged = !0; if (b >= e.viewTo) ra && Mc(a.doc, b) < e.viewTo && qa(a); else if (c <= e.viewFrom) ra && Ld(a.doc, c + d) > e.viewFrom ? qa(a) : (e.viewFrom += d, e.viewTo += d); else if (b <= e.viewFrom && c >= e.viewTo) qa(a); else if (b <= e.viewFrom) { var f = dc(a, c, c + d, 1); f ? (e.view = e.view.slice(f.index), e.viewFrom = f.lineN, e.viewTo += d) : qa(a) } else if (c >= e.viewTo) (f = dc(a, b, b, -1)) ? (e.view = e.view.slice(0, f.index), e.viewTo = f.lineN) : qa(a); else {
+ var f = dc(a, b, b, -1), g = dc(a, c, c + d, 1); f && g ? (e.view =
+ e.view.slice(0, f.index).concat(Nb(a, f.lineN, g.lineN)).concat(e.view.slice(g.index)), e.viewTo += d) : qa(a)
+ } if (a = e.externalMeasured) c < a.lineN ? a.lineN += d : b < a.lineN + a.size && (e.externalMeasured = null)
+ } function na(a, b, c) { a.curOp.viewChanged = !0; var d = a.display, e = a.display.externalMeasured; e && b >= e.lineN && b < e.lineN + e.size && (d.externalMeasured = null); b < d.viewFrom || b >= d.viewTo || (a = d.view[Ca(a, b)], null != a.node && (a = a.changes || (a.changes = []), -1 == D(a, c) && a.push(c))) } function qa(a) {
+ a.display.viewFrom = a.display.viewTo =
+ a.doc.first; a.display.view = []; a.display.viewOffset = 0
+ } function Ca(a, b) { if (b >= a.display.viewTo) return null; b -= a.display.viewFrom; if (0 > b) return null; for (var c = a.display.view, d = 0; d < c.length; d++)if (b -= c[d].size, 0 > b) return d } function dc(a, b, c, d) {
+ var e = Ca(a, b), f = a.display.view; if (!ra || c == a.doc.first + a.doc.size) return { index: e, lineN: c }; for (var g = 0, h = a.display.viewFrom; g < e; g++)h += f[g].size; if (h != b) { if (0 < d) { if (e == f.length - 1) return null; b = h + f[e].size - b; e++ } else b = h - b; c += b } for (; Mc(a.doc, c) != c;) {
+ if (e == (0 > d ? 0 : f.length -
+ 1)) return null; c += d * f[e - (0 > d ? 1 : 0)].size; e += d
+ } return { index: e, lineN: c }
+ } function Kd(a) { a = a.display.view; for (var b = 0, c = 0; c < a.length; c++) { var d = a[c]; d.hidden || d.node && !d.changes || ++b } return b } function sf(a) {
+ function b() { d.activeTouch && (e = setTimeout(function() { d.activeTouch = null }, 1E3), f = d.activeTouch, f.end = +new Date) } function c(a, b) { if (null == b.left) return !0; var c = b.left - a.left, d = b.top - a.top; return 400 < c * c + d * d } var d = a.display; v(d.scroller, "mousedown", G(a, pe)); B && 11 > C ? v(d.scroller, "dblclick", G(a, function(b) {
+ if (!ja(a,
+ b)) { var c = Ua(a, b); !c || hd(a, b, "gutterClick", !0, L) || oa(a.display, b) || (O(b), b = a.findWordAt(c), Ub(a.doc, b.anchor, b.head)) }
+ })) : v(d.scroller, "dblclick", function(b) { ja(a, b) || O(b) }); id || v(d.scroller, "contextmenu", function(b) { qe(a, b) }); var e, f = { end: 0 }; v(d.scroller, "touchstart", function(a) {
+ var b; 1 != a.touches.length ? b = !1 : (b = a.touches[0], b = 1 >= b.radiusX && 1 >= b.radiusY); b || (clearTimeout(e), b = +new Date, d.activeTouch = { start: b, moved: !1, prev: 300 >= b - f.end ? f : null }, 1 == a.touches.length && (d.activeTouch.left = a.touches[0].pageX,
+ d.activeTouch.top = a.touches[0].pageY))
+ }); v(d.scroller, "touchmove", function() { d.activeTouch && (d.activeTouch.moved = !0) }); v(d.scroller, "touchend", function(e) { var f = d.activeTouch; if (f && !oa(d, e) && null != f.left && !f.moved && 300 > new Date - f.start) { var g = a.coordsChar(d.activeTouch, "page"), f = !f.prev || c(f, f.prev) ? new z(g, g) : !f.prev.prev || c(f, f.prev.prev) ? a.findWordAt(g) : new z(r(g.line, 0), w(a.doc, r(g.line + 1, 0))); a.setSelection(f.anchor, f.head); a.focus(); O(e) } b() }); v(d.scroller, "touchcancel", b); v(d.scroller, "scroll",
+ function() { d.scroller.clientHeight && (lb(a, d.scroller.scrollTop), Ma(a, d.scroller.scrollLeft, !0), K(a, "scroll", a)) }); v(d.scroller, "mousewheel", function(b) { re(a, b) }); v(d.scroller, "DOMMouseScroll", function(b) { re(a, b) }); v(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0 }); d.dragFunctions = {
+ simple: function(b) { ja(a, b) || jd(b) }, start: function(b) {
+ if (B && (!a.state.draggingText || 100 > +new Date - se)) jd(b); else if (!ja(a, b) && !oa(a.display, b) && (b.dataTransfer.setData("Text", a.getSelection()), b.dataTransfer.setDragImage &&
+ !te)) { var c = t("img", null, null, "position: fixed; left: 0; top: 0;"); c.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw\x3d\x3d"; ba && (c.width = c.height = 1, a.display.wrapper.appendChild(c), c._top = c.offsetTop); b.dataTransfer.setDragImage(c, 0, 0); ba && c.parentNode.removeChild(c) }
+ }, drop: G(a, Hf)
+ }; var g = d.input.getField(); v(g, "keyup", function(b) { ue.call(a, b) }); v(g, "keydown", G(a, ve)); v(g, "keypress", G(a, we)); v(g, "focus", cb(xc, a)); v(g, "blur", cb(db, a))
+ } function If(a) {
+ var b = a.display;
+ if (b.lastWrapHeight != b.wrapper.clientHeight || b.lastWrapWidth != b.wrapper.clientWidth) b.cachedCharWidth = b.cachedTextHeight = b.cachedPaddingH = null, b.scrollbarsClipped = !1, a.setSize()
+ } function oa(a, b) { for (var c = b.target || b.srcElement; c != a.wrapper; c = c.parentNode)if (!c || 1 == c.nodeType && "true" == c.getAttribute("cm-ignore-events") || c.parentNode == a.sizer && c != a.mover) return !0 } function Ua(a, b, c, d) {
+ var e = a.display; if (!c && "true" == (b.target || b.srcElement).getAttribute("cm-not-content")) return null; var f, g; c = e.lineSpace.getBoundingClientRect();
+ try { f = b.clientX - c.left, g = b.clientY - c.top } catch (h) { return null } b = fd(a, f, g); var k; d && 1 == b.xRel && (k = u(a.doc, b.line).text).length == b.ch && (d = aa(k, k.length, a.options.tabSize) - k.length, b = r(b.line, Math.max(0, Math.round((f - ie(a.display).left) / gb(a.display)) - d))); return b
+ } function pe(a) {
+ var b = this.display; if (!(b.activeTouch && b.input.supportsTouch() || ja(this, a))) if (b.shift = a.shiftKey, oa(b, a)) J || (b.scroller.draggable = !1, setTimeout(function() { b.scroller.draggable = !0 }, 100)); else if (!hd(this, a, "gutterClick", !0,
+ L)) { var c = Ua(this, a); window.focus(); switch (xe(a)) { case 1: c ? Jf(this, a, c) : (a.target || a.srcElement) == b.scroller && O(a); break; case 2: J && (this.state.lastMiddleDown = +new Date); c && Ub(this.doc, c); setTimeout(function() { b.input.focus() }, 20); O(a); break; case 3: id ? qe(this, a) : Kf(this) } }
+ } function Jf(a, b, c) {
+ B ? setTimeout(cb(Ud, a), 0) : a.curOp.focus = fa(); var d = +new Date, e; ec && ec.time > d - 400 && 0 == y(ec.pos, c) ? e = "triple" : fc && fc.time > d - 400 && 0 == y(fc.pos, c) ? (e = "double", ec = { time: d, pos: c }) : (e = "single", fc = { time: d, pos: c }); var d =
+ a.doc.sel, f = W ? b.metaKey : b.ctrlKey, g; a.options.dragDrop && Lf && !Rb(a) && "single" == e && -1 < (g = d.contains(c)) && !d.ranges[g].empty() ? Mf(a, b, c, f) : Nf(a, b, c, e, f)
+ } function Mf(a, b, c, d) {
+ var e = a.display, f = +new Date, g = G(a, function(h) { J && (e.scroller.draggable = !1); a.state.draggingText = !1; ka(document, "mouseup", g); ka(e.scroller, "drop", g); 10 > Math.abs(b.clientX - h.clientX) + Math.abs(b.clientY - h.clientY) && (O(h), !d && +new Date - 200 < f && Ub(a.doc, c), J || B && 9 == C ? setTimeout(function() { document.body.focus(); e.input.focus() }, 20) : e.input.focus()) });
+ J && (e.scroller.draggable = !0); a.state.draggingText = g; e.scroller.dragDrop && e.scroller.dragDrop(); v(document, "mouseup", g); v(e.scroller, "drop", g)
+ } function Nf(a, b, c, d, e) {
+ function f(b) {
+ if (0 != y(x, b)) if (x = b, "rect" == d) {
+ for (var e = [], f = a.options.tabSize, g = aa(u(l, c.line).text, c.ch, f), h = aa(u(l, b.line).text, b.ch, f), k = Math.min(g, h), g = Math.max(g, h), h = Math.min(c.line, b.line), q = Math.min(a.lastLine(), Math.max(c.line, b.line)); h <= q; h++) {
+ var E = u(l, h).text, t = ye(E, k, f); k == g ? e.push(new z(r(h, t), r(h, t))) : E.length > t && e.push(new z(r(h,
+ t), r(h, ye(E, g, f))))
+ } e.length || e.push(new z(c, c)); H(l, Z(n.ranges.slice(0, p).concat(e), p), { origin: "*mouse", scroll: !1 }); a.scrollIntoView(b)
+ } else e = m, f = e.anchor, k = b, "single" != d && (b = "double" == d ? a.findWordAt(b) : new z(r(b.line, 0), w(l, r(b.line + 1, 0))), 0 < y(b.anchor, f) ? (k = b.head, f = Qb(e.from(), b.anchor)) : (k = b.anchor, f = Pb(e.to(), b.head))), e = n.ranges.slice(0), e[p] = new z(w(l, f), k), H(l, Z(e, p), kd)
+ } function g(b) {
+ var c = ++A, e = Ua(a, b, !0, "rect" == d); if (e) if (0 != y(e, x)) {
+ a.curOp.focus = fa(); f(e); var h = Hc(k, l); (e.line >= h.to ||
+ e.line < h.from) && setTimeout(G(a, function() { A == c && g(b) }), 150)
+ } else { var m = b.clientY < B.top ? -20 : b.clientY > B.bottom ? 20 : 0; m && setTimeout(G(a, function() { A == c && (k.scroller.scrollTop += m, g(b)) }), 50) }
+ } function h(a) { A = Infinity; O(a); k.input.focus(); ka(document, "mousemove", F); ka(document, "mouseup", C); l.history.lastSelOrigin = null } var k = a.display, l = a.doc; O(b); var m, p, n = l.sel, q = n.ranges; e && !b.shiftKey ? (p = l.sel.contains(c), m = -1 < p ? q[p] : new z(c, c)) : (m = l.sel.primary(), p = l.sel.primIndex); if (b.altKey) d = "rect", e || (m = new z(c,
+ c)), c = Ua(a, b, !0, !0), p = -1; else if ("double" == d) { var t = a.findWordAt(c); m = a.display.shift || l.extend ? rb(l, m, t.anchor, t.head) : t } else "triple" == d ? (t = new z(r(c.line, 0), w(l, r(c.line + 1, 0))), m = a.display.shift || l.extend ? rb(l, m, t.anchor, t.head) : t) : m = rb(l, m, c); e ? -1 == p ? (p = q.length, H(l, Z(q.concat([m]), p), { scroll: !1, origin: "*mouse" })) : 1 < q.length && q[p].empty() && "single" == d && !b.shiftKey ? (H(l, Z(q.slice(0, p).concat(q.slice(p + 1)), 0)), n = l.sel) : Xc(l, p, m, kd) : (p = 0, H(l, new la([m], 0), kd), n = l.sel); var x = c, B = k.wrapper.getBoundingClientRect(),
+ A = 0, F = G(a, function(a) { xe(a) ? g(a) : h(a) }), C = G(a, h); v(document, "mousemove", F); v(document, "mouseup", C)
+ } function hd(a, b, c, d, e) {
+ try { var f = b.clientX, g = b.clientY } catch (h) { return !1 } if (f >= Math.floor(a.display.gutters.getBoundingClientRect().right)) return !1; d && O(b); d = a.display; var k = d.lineDiv.getBoundingClientRect(); if (g > k.bottom || !S(a, c)) return ld(b); g -= k.top - d.viewOffset; for (k = 0; k < a.options.gutters.length; ++k) {
+ var l = d.gutters.childNodes[k]; if (l && l.getBoundingClientRect().right >= f) return f = Ba(a.doc, g), e(a,
+ c, a, f, a.options.gutters[k], b), ld(b)
+ }
+ } function Hf(a) {
+ var b = this; if (!ja(b, a) && !oa(b.display, a)) {
+ O(a); B && (se = +new Date); var c = Ua(b, a, !0), d = a.dataTransfer.files; if (c && !Rb(b)) if (d && d.length && window.FileReader && window.File) { var e = d.length, f = Array(e), g = 0; a = function(a, d) { var h = new FileReader; h.onload = G(b, function() { f[d] = h.result; if (++g == e) { c = w(b.doc, c); var a = { from: c, to: c, text: sa(f.join("\n")), origin: "paste" }; Oa(b.doc, a); be(b.doc, ga(c, ta(a))) } }); h.readAsText(a) }; for (var h = 0; h < e; ++h)a(d[h], h) } else if (b.state.draggingText &&
+ -1 < b.doc.sel.contains(c)) b.state.draggingText(a), setTimeout(function() { b.display.input.focus() }, 20); else try { if (f = a.dataTransfer.getData("Text")) { if (b.state.draggingText && (W ? !a.altKey : !a.ctrlKey)) var k = b.listSelections(); Vb(b.doc, ga(c, c)); if (k) for (h = 0; h < k.length; ++h)wb(b.doc, "", k[h].anchor, k[h].head, "drag"); b.replaceSelection(f, "around", "paste"); b.display.input.focus() } } catch (l) { }
+ }
+ } function lb(a, b) {
+ 2 > Math.abs(a.doc.scrollTop - b) || (a.doc.scrollTop = b, wa || Pc(a, { top: b }), a.display.scroller.scrollTop != b &&
+ (a.display.scroller.scrollTop = b), a.display.scrollbars.setScrollTop(b), wa && Pc(a), fb(a, 100))
+ } function Ma(a, b, c) { (c ? b == a.doc.scrollLeft : 2 > Math.abs(a.doc.scrollLeft - b)) || (b = Math.min(b, a.display.scroller.scrollWidth - a.display.scroller.clientWidth), a.doc.scrollLeft = b, Bc(a), a.display.scroller.scrollLeft != b && (a.display.scroller.scrollLeft = b), a.display.scrollbars.setScrollLeft(b)) } function re(a, b) {
+ var c = ze(b), d = c.x, c = c.y, e = a.display, f = e.scroller; if (d && f.scrollWidth > f.clientWidth || c && f.scrollHeight > f.clientHeight) {
+ if (c &&
+ W && J) { var g = b.target, h = e.view; a: for (; g != f; g = g.parentNode)for (var k = 0; k < h.length; k++)if (h[k].node == g) { a.display.currentWheelTarget = g; break a } } !d || wa || ba || null == R ? (c && null != R && (g = c * R, h = a.doc.scrollTop, k = h + e.wrapper.clientHeight, 0 > g ? h = Math.max(0, h + g - 50) : k = Math.min(a.doc.height, k + g + 50), Pc(a, { top: h, bottom: k })), 20 > gc && (null == e.wheelStartX ? (e.wheelStartX = f.scrollLeft, e.wheelStartY = f.scrollTop, e.wheelDX = d, e.wheelDY = c, setTimeout(function() {
+ if (null != e.wheelStartX) {
+ var a = f.scrollLeft - e.wheelStartX, b = f.scrollTop -
+ e.wheelStartY, a = b && e.wheelDY && b / e.wheelDY || a && e.wheelDX && a / e.wheelDX; e.wheelStartX = e.wheelStartY = null; a && (R = (R * gc + a) / (gc + 1), ++gc)
+ }
+ }, 200)) : (e.wheelDX += d, e.wheelDY += c))) : (c && lb(a, Math.max(0, Math.min(f.scrollTop + c * R, f.scrollHeight - f.clientHeight))), Ma(a, Math.max(0, Math.min(f.scrollLeft + d * R, f.scrollWidth - f.clientWidth))), O(b), e.wheelStartX = null)
+ }
+ } function hc(a, b, c) {
+ if ("string" == typeof b && (b = ic[b], !b)) return !1; a.display.input.ensurePolled(); var d = a.display.shift, e = !1; try {
+ Rb(a) && (a.state.suppressEdits =
+ !0), c && (a.display.shift = !1), e = b(a) != Ae
+ } finally { a.display.shift = d, a.state.suppressEdits = !1 } return e
+ } function Of(a, b, c) { for (var d = 0; d < a.state.keyMaps.length; d++) { var e = xb(b, a.state.keyMaps[d], c, a); if (e) return e } return a.options.extraKeys && xb(b, a.options.extraKeys, c, a) || xb(b, a.options.keyMap, c, a) } function jc(a, b, c, d) {
+ var e = a.state.keySeq; if (e) { if (Pf(b)) return "handled"; Qf.set(50, function() { a.state.keySeq == e && (a.state.keySeq = null, a.display.input.reset()) }); b = e + " " + b } d = Of(a, b, d); "multi" == d && (a.state.keySeq =
+ b); "handled" == d && L(a, "keyHandled", a, b, c); if ("handled" == d || "multi" == d) O(c), Yc(a); return e && !d && /\'$/.test(b) ? (O(c), !0) : !!d
+ } function Be(a, b) { var c = Rf(b, !0); return c ? b.shiftKey && !a.state.keySeq ? jc(a, "Shift-" + c, b, function(b) { return hc(a, b, !0) }) || jc(a, c, b, function(b) { if ("string" == typeof b ? /^go[A-Z]/.test(b) : b.motion) return hc(a, b) }) : jc(a, c, b, function(b) { return hc(a, b) }) : !1 } function Sf(a, b, c) { return jc(a, "'" + c + "'", b, function(b) { return hc(a, b, !0) }) } function ve(a) {
+ this.curOp.focus = fa(); if (!ja(this, a)) {
+ B &&
+ 11 > C && 27 == a.keyCode && (a.returnValue = !1); var b = a.keyCode; this.display.shift = 16 == b || a.shiftKey; var c = Be(this, a); ba && (md = c ? b : null, !c && 88 == b && !Ce && (W ? a.metaKey : a.ctrlKey) && this.replaceSelection("", null, "cut")); 18 != b || /\bCodeMirror-crosshair\b/.test(this.display.lineDiv.className) || Tf(this)
+ }
+ } function Tf(a) {
+ function b(a) { 18 != a.keyCode && a.altKey || (kb(c, "CodeMirror-crosshair"), ka(document, "keyup", b), ka(document, "mouseover", b)) } var c = a.display.lineDiv; mb(c, "CodeMirror-crosshair"); v(document, "keyup", b); v(document,
+ "mouseover", b)
+ } function ue(a) { 16 == a.keyCode && (this.doc.sel.shift = !1); ja(this, a) } function we(a) { if (!(oa(this.display, a) || ja(this, a) || a.ctrlKey && !a.altKey || W && a.metaKey)) { var b = a.keyCode, c = a.charCode; if (ba && b == md) md = null, O(a); else if (!ba || a.which && !(10 > a.which) || !Be(this, a)) if (b = String.fromCharCode(null == c ? b : c), !Sf(this, a, b)) this.display.input.onKeyPress(a) } } function Kf(a) { a.state.delayingBlurEvent = !0; setTimeout(function() { a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1, db(a)) }, 100) } function xc(a) {
+ a.state.delayingBlurEvent &&
+ (a.state.delayingBlurEvent = !1); "nocursor" != a.options.readOnly && (a.state.focused || (K(a, "focus", a), a.state.focused = !0, mb(a.display.wrapper, "CodeMirror-focused"), a.curOp || a.display.selForContextMenu == a.doc.sel || (a.display.input.reset(), J && setTimeout(function() { a.display.input.reset(!0) }, 20)), a.display.input.receivedFocus()), Yc(a))
+ } function db(a) {
+ a.state.delayingBlurEvent || (a.state.focused && (K(a, "blur", a), a.state.focused = !1, kb(a.display.wrapper, "CodeMirror-focused")), clearInterval(a.display.blinker),
+ setTimeout(function() { a.state.focused || (a.display.shift = !1) }, 150))
+ } function qe(a, b) { var c; (c = oa(a.display, b)) || (c = S(a, "gutterContextMenu") ? hd(a, b, "gutterContextMenu", !1, K) : !1); if (!c) a.display.input.onContextMenu(b) } function De(a, b) { if (0 > y(a, b.from)) return a; if (0 >= y(a, b.to)) return ta(b); var c = a.line + b.text.length - (b.to.line - b.from.line) - 1, d = a.ch; a.line == b.to.line && (d += ta(b).ch - b.to.ch); return r(c, d) } function nd(a, b) {
+ for (var c = [], d = 0; d < a.sel.ranges.length; d++) {
+ var e = a.sel.ranges[d]; c.push(new z(De(e.anchor,
+ b), De(e.head, b)))
+ } return Z(c, a.sel.primIndex)
+ } function Ee(a, b, c) { return a.line == b.line ? r(c.line, a.ch - b.ch + c.ch) : r(c.line + (a.line - b.line), a.ch) } function Fe(a, b, c) { b = { canceled: !1, from: b.from, to: b.to, text: b.text, origin: b.origin, cancel: function() { this.canceled = !0 } }; c && (b.update = function(b, c, f, g) { b && (this.from = w(a, b)); c && (this.to = w(a, c)); f && (this.text = f); void 0 !== g && (this.origin = g) }); K(a, "beforeChange", a, b); a.cm && K(a.cm, "beforeChange", a.cm, b); return b.canceled ? null : { from: b.from, to: b.to, text: b.text, origin: b.origin } }
+ function Oa(a, b, c) { if (a.cm) { if (!a.cm.curOp) return G(a.cm, Oa)(a, b, c); if (a.cm.state.suppressEdits) return } if (S(a, "beforeChange") || a.cm && S(a.cm, "beforeChange")) if (b = Fe(a, b, !0), !b) return; if (c = Ge && !c && Uf(a, b.from, b.to)) for (var d = c.length - 1; 0 <= d; --d)He(a, { from: c[d].from, to: c[d].to, text: d ? [""] : b.text }); else He(a, b) } function He(a, b) {
+ if (1 != b.text.length || "" != b.text[0] || 0 != y(b.from, b.to)) {
+ var c = nd(a, b); Ie(a, b, c, a.cm ? a.cm.curOp.id : NaN); yb(a, b, c, od(a, b)); var d = []; Ga(a, function(a, c) {
+ c || -1 != D(d, a.history) || (Je(a.history,
+ b), d.push(a.history)); yb(a, b, null, od(a, b))
+ })
+ }
+ } function kc(a, b, c) {
+ if (!a.cm || !a.cm.state.suppressEdits) {
+ for (var d = a.history, e, f = a.sel, g = "undo" == b ? d.done : d.undone, h = "undo" == b ? d.undone : d.done, k = 0; k < g.length && (e = g[k], c ? !e.ranges || e.equals(a.sel) : e.ranges); k++); if (k != g.length) {
+ for (d.lastOrigin = d.lastSelOrigin = null; ;)if (e = g.pop(), e.ranges) { Wb(e, h); if (c && !e.equals(a.sel)) { H(a, e, { clearRedo: !1 }); return } f = e } else break; c = []; Wb(f, h); h.push({ changes: c, generation: d.generation }); d.generation = e.generation || ++d.maxGeneration;
+ d = S(a, "beforeChange") || a.cm && S(a.cm, "beforeChange"); for (k = e.changes.length - 1; 0 <= k; --k) { var l = e.changes[k]; l.origin = b; if (d && !Fe(a, l, !1)) { g.length = 0; break } c.push(pd(a, l)); f = k ? nd(a, l) : A(g); yb(a, l, f, Ke(a, l)); !k && a.cm && a.cm.scrollIntoView({ from: l.from, to: ta(l) }); var m = []; Ga(a, function(a, b) { b || -1 != D(m, a.history) || (Je(a.history, l), m.push(a.history)); yb(a, l, null, Ke(a, l)) }) }
+ }
+ }
+ } function Le(a, b) {
+ if (0 != b && (a.first += b, a.sel = new la(ob(a.sel.ranges, function(a) {
+ return new z(r(a.anchor.line + b, a.anchor.ch), r(a.head.line +
+ b, a.head.ch))
+ }), a.sel.primIndex), a.cm)) { Q(a.cm, a.first, a.first - b, b); for (var c = a.cm.display, d = c.viewFrom; d < c.viewTo; d++)na(a.cm, d, "gutter") }
+ } function yb(a, b, c, d) {
+ if (a.cm && !a.cm.curOp) return G(a.cm, yb)(a, b, c, d); if (b.to.line < a.first) Le(a, b.text.length - 1 - (b.to.line - b.from.line)); else if (!(b.from.line > a.lastLine())) {
+ if (b.from.line < a.first) { var e = b.text.length - 1 - (a.first - b.from.line); Le(a, e); b = { from: r(a.first, 0), to: r(b.to.line + e, b.to.ch), text: [A(b.text)], origin: b.origin } } e = a.lastLine(); b.to.line > e && (b =
+ { from: b.from, to: r(e, u(a, e).text.length), text: [b.text[0]], origin: b.origin }); b.removed = Da(a, b.from, b.to); c || (c = nd(a, b)); a.cm ? Vf(a.cm, b, d) : qd(a, b, d); Vb(a, c, ha)
+ }
+ } function Vf(a, b, c) {
+ var d = a.doc, e = a.display, f = b.from, g = b.to, h = !1, k = f.line; a.options.lineWrapping || (k = F(ia(u(d, f.line))), d.iter(k, g.line + 1, function(a) { if (a == e.maxLine) return h = !0 })); -1 < d.sel.contains(b.from, b.to) && fe(a); qd(d, b, c, Id(a)); a.options.lineWrapping || (d.iter(k, f.line + b.text.length, function(a) {
+ var b = Kb(a); b > e.maxLineLength && (e.maxLine =
+ a, e.maxLineLength = b, e.maxLineChanged = !0, h = !1)
+ }), h && (a.curOp.updateMaxLine = !0)); d.frontier = Math.min(d.frontier, f.line); fb(a, 400); c = b.text.length - (g.line - f.line) - 1; b.full ? Q(a) : f.line != g.line || 1 != b.text.length || Me(a.doc, b) ? Q(a, f.line, g.line + 1, c) : na(a, f.line, "text"); c = S(a, "changes"); if ((d = S(a, "change")) || c) b = { from: f, to: g, text: b.text, removed: b.removed, origin: b.origin }, d && L(a, "change", a, b), c && (a.curOp.changeObjs || (a.curOp.changeObjs = [])).push(b); a.display.selForContextMenu = null
+ } function wb(a, b, c, d, e) {
+ d ||
+ (d = c); if (0 > y(d, c)) { var f = d; d = c; c = f } "string" == typeof b && (b = sa(b)); Oa(a, { from: c, to: d, text: b, origin: e })
+ } function cc(a, b, c, d, e) {
+ var f = a.display, g = xa(a.display); 0 > c && (c = 0); var h = a.curOp && null != a.curOp.scrollTop ? a.curOp.scrollTop : f.scroller.scrollTop, k = Nc(a), l = {}; e - c > k && (e = c + k); var m = a.doc.height + Ec(f), p = c < g, g = e > m - g; c < h ? l.scrollTop = p ? 0 : c : e > h + k && (c = Math.min(c, (g ? m : e) - k), c != h && (l.scrollTop = c)); h = a.curOp && null != a.curOp.scrollLeft ? a.curOp.scrollLeft : f.scroller.scrollLeft; a = pa(a) - (a.options.fixedGutter ? f.gutters.offsetWidth :
+ 0); (f = d - b > a) && (d = b + a); 10 > b ? l.scrollLeft = 0 : b < h ? l.scrollLeft = Math.max(0, b - (f ? 0 : 10)) : d > a + h - 3 && (l.scrollLeft = d + (f ? 0 : 10) - a); return l
+ } function lc(a, b, c) { null == b && null == c || mc(a); null != b && (a.curOp.scrollLeft = (null == a.curOp.scrollLeft ? a.doc.scrollLeft : a.curOp.scrollLeft) + b); null != c && (a.curOp.scrollTop = (null == a.curOp.scrollTop ? a.doc.scrollTop : a.curOp.scrollTop) + c) } function Pa(a) {
+ mc(a); var b = a.getCursor(), c = b, d = b; a.options.lineWrapping || (c = b.ch ? r(b.line, b.ch - 1) : b, d = r(b.line, b.ch + 1)); a.curOp.scrollToPos = {
+ from: c,
+ to: d, margin: a.options.cursorScrollMargin, isCursor: !0
+ }
+ } function mc(a) { var b = a.curOp.scrollToPos; if (b) { a.curOp.scrollToPos = null; var c = oe(a, b.from), d = oe(a, b.to), b = cc(a, Math.min(c.left, d.left), Math.min(c.top, d.top) - b.margin, Math.max(c.right, d.right), Math.max(c.bottom, d.bottom) + b.margin); a.scrollTo(b.scrollLeft, b.scrollTop) } } function pb(a, b, c, d) {
+ var e = a.doc, f; null == c && (c = "add"); "smart" == c && (e.mode.indent ? f = sb(a, b) : c = "prev"); var g = a.options.tabSize, h = u(e, b), k = aa(h.text, null, g); h.stateAfter && (h.stateAfter =
+ null); var l = h.text.match(/^\s*/)[0], m; if (!d && !/\S/.test(h.text)) m = 0, c = "not"; else if ("smart" == c && (m = e.mode.indent(f, h.text.slice(l.length), h.text), m == Ae || 150 < m)) { if (!d) return; c = "prev" } "prev" == c ? m = b > e.first ? aa(u(e, b - 1).text, null, g) : 0 : "add" == c ? m = k + a.options.indentUnit : "subtract" == c ? m = k - a.options.indentUnit : "number" == typeof c && (m = k + c); m = Math.max(0, m); c = ""; d = 0; if (a.options.indentWithTabs) for (a = Math.floor(m / g); a; --a)d += g, c += "\t"; d < m && (c += Ne(m - d)); if (c != l) return wb(e, c, r(b, 0), r(b, l.length), "+input"), h.stateAfter =
+ null, !0; for (a = 0; a < e.sel.ranges.length; a++)if (g = e.sel.ranges[a], g.head.line == b && g.head.ch < l.length) { d = r(b, l.length); Xc(e, a, new z(d, d)); break }
+ } function nc(a, b, c, d) { var e = b, f = b; "number" == typeof b ? f = u(a, Math.max(a.first, Math.min(b, a.first + a.size - 1))) : e = F(b); if (null == e) return null; d(f, e) && a.cm && na(a.cm, e, c); return f } function Va(a, b) {
+ for (var c = a.doc.sel.ranges, d = [], e = 0; e < c.length; e++) { for (var f = b(c[e]); d.length && 0 >= y(f.from, A(d).to);) { var g = d.pop(); if (0 > y(g.from, f.from)) { f.from = g.from; break } } d.push(f) } T(a,
+ function() { for (var b = d.length - 1; 0 <= b; b--)wb(a.doc, "", d[b].from, d[b].to, "+delete"); Pa(a) })
+ } function rd(a, b, c, d, e) {
+ function f(b) { var d = (e ? gd : Oe)(l, h, c, !0); if (null == d) { if (b = !b) b = g + c, b < a.first || b >= a.first + a.size ? b = m = !1 : (g = b, b = l = u(a, b)); if (b) h = e ? (0 > c ? bc : ac)(l) : 0 > c ? l.text.length : 0; else return m = !1 } else h = d; return !0 } var g = b.line, h = b.ch, k = c, l = u(a, g), m = !0; if ("char" == d) f(); else if ("column" == d) f(!0); else if ("word" == d || "group" == d) {
+ var p = null; d = "group" == d; b = a.cm && a.cm.getHelper(b, "wordChars"); for (var n = !0; !(0 >
+ c) || f(!n); n = !1) { var q = l.text.charAt(h) || "\n", q = oc(q, b) ? "w" : d && "\n" == q ? "n" : !d || /\s/.test(q) ? null : "p"; !d || n || q || (q = "s"); if (p && p != q) { 0 > c && (c = 1, f()); break } q && (p = q); if (0 < c && !f(!n)) break }
+ } k = Xb(a, r(g, h), k, !0); m || (k.hitSide = !0); return k
+ } function Pe(a, b, c, d) {
+ var e = a.doc, f = b.left, g; "page" == d ? (g = Math.min(a.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight), g = b.top + c * (g - (0 > c ? 1.5 : .5) * xa(a.display))) : "line" == d && (g = 0 < c ? b.bottom + 3 : b.top - 3); for (; ;) {
+ b = fd(a, f, g); if (!b.outside) break;
+ if (0 > c ? 0 >= g : g >= e.height) { b.hitSide = !0; break } g += 5 * c
+ } return b
+ } function x(a, b, c, d) { q.defaults[a] = b; c && (Ka[a] = d ? function(a, b, d) { d != Fd && c(a, b, d) } : c) } function Wf(a) {
+ var b = a.split(/-(?!$)/); a = b[b.length - 1]; for (var c, d, e, f, g = 0; g < b.length - 1; g++) { var h = b[g]; if (/^(cmd|meta|m)$/i.test(h)) f = !0; else if (/^a(lt)?$/i.test(h)) c = !0; else if (/^(c|ctrl|control)$/i.test(h)) d = !0; else if (/^s(hift)$/i.test(h)) e = !0; else throw Error("Unrecognized modifier name: " + h); } c && (a = "Alt-" + a); d && (a = "Ctrl-" + a); f && (a = "Cmd-" + a); e && (a = "Shift-" +
+ a); return a
+ } function pc(a) { return "string" == typeof a ? ua[a] : a } function Wa(a, b, c, d, e) {
+ if (d && d.shared) return Xf(a, b, c, d, e); if (a.cm && !a.cm.curOp) return G(a.cm, Wa)(a, b, c, d, e); var f = new Ha(a, e); e = y(b, c); d && V(d, f, !1); if (0 < e || 0 == e && !1 !== f.clearWhenEmpty) return f; f.replacedWith && (f.collapsed = !0, f.widgetNode = t("span", [f.replacedWith], "CodeMirror-widget"), d.handleMouseEvents || f.widgetNode.setAttribute("cm-ignore-events", "true"), d.insertLeft && (f.widgetNode.insertLeft = !0)); if (f.collapsed) {
+ if (Qe(a, b.line, b, c, f) ||
+ b.line != c.line && Qe(a, c.line, b, c, f)) throw Error("Inserting collapsed marker partially overlapping an existing one"); ra = !0
+ } f.addToHistory && Ie(a, { from: b, to: c, origin: "markText" }, a.sel, NaN); var g = b.line, h = a.cm, k; a.iter(g, c.line + 1, function(a) { h && f.collapsed && !h.options.lineWrapping && ia(a) == h.display.maxLine && (k = !0); f.collapsed && g != b.line && ca(a, 0); var d = new qc(f, g == b.line ? b.ch : null, g == c.line ? c.ch : null); a.markedSpans = a.markedSpans ? a.markedSpans.concat([d]) : [d]; d.marker.attachLine(a); ++g }); f.collapsed && a.iter(b.line,
+ c.line + 1, function(b) { ya(a, b) && ca(b, 0) }); f.clearOnEnter && v(f, "beforeCursorEnter", function() { f.clear() }); f.readOnly && (Ge = !0, (a.history.done.length || a.history.undone.length) && a.clearHistory()); f.collapsed && (f.id = ++sd, f.atomic = !0); if (h) { k && (h.curOp.updateMaxLine = !0); if (f.collapsed) Q(h, b.line, c.line + 1); else if (f.className || f.title || f.startStyle || f.endStyle || f.css) for (d = b.line; d <= c.line; d++)na(h, d, "text"); f.atomic && ge(h.doc); L(h, "markerAdded", h, f) } return f
+ } function Xf(a, b, c, d, e) {
+ d = V(d); d.shared = !1; var f =
+ [Wa(a, b, c, d, e)], g = f[0], h = d.widgetNode; Ga(a, function(a) { h && (d.widgetNode = h.cloneNode(!0)); f.push(Wa(a, w(a, b), w(a, c), d, e)); for (var l = 0; l < a.linked.length; ++l)if (a.linked[l].isParent) return; g = A(f) }); return new rc(f, g)
+ } function Re(a) { return a.findMarks(r(a.first, 0), a.clipPos(r(a.lastLine())), function(a) { return a.parent }) } function Yf(a) {
+ for (var b = 0; b < a.length; b++) {
+ var c = a[b], d = [c.primary.doc]; Ga(c.primary.doc, function(a) { d.push(a) }); for (var e = 0; e < c.markers.length; e++) {
+ var f = c.markers[e]; -1 == D(d, f.doc) &&
+ (f.parent = null, c.markers.splice(e--, 1))
+ }
+ }
+ } function qc(a, b, c) { this.marker = a; this.from = b; this.to = c } function zb(a, b) { if (a) for (var c = 0; c < a.length; ++c) { var d = a[c]; if (d.marker == b) return d } } function od(a, b) {
+ if (b.full) return null; var c = qb(a, b.from.line) && u(a, b.from.line).markedSpans, d = qb(a, b.to.line) && u(a, b.to.line).markedSpans; if (!c && !d) return null; var e = b.from.ch, f = b.to.ch, g = 0 == y(b.from, b.to); if (c) for (var h = 0, k; h < c.length; ++h) {
+ var l = c[h], m = l.marker; if (null == l.from || (m.inclusiveLeft ? l.from <= e : l.from < e) ||
+ !(l.from != e || "bookmark" != m.type || g && l.marker.insertLeft)) { var p = null == l.to || (m.inclusiveRight ? l.to >= e : l.to > e); (k || (k = [])).push(new qc(m, l.from, p ? null : l.to)) }
+ } c = k; if (d) for (var h = 0, n; h < d.length; ++h)if (k = d[h], l = k.marker, null == k.to || (l.inclusiveRight ? k.to >= f : k.to > f) || k.from == f && "bookmark" == l.type && (!g || k.marker.insertLeft)) m = null == k.from || (l.inclusiveLeft ? k.from <= f : k.from < f), (n || (n = [])).push(new qc(l, m ? null : k.from - f, null == k.to ? null : k.to - f)); d = n; g = 1 == b.text.length; n = A(b.text).length + (g ? e : 0); if (c) for (f =
+ 0; f < c.length; ++f)if (h = c[f], null == h.to) (k = zb(d, h.marker), k) ? g && (h.to = null == k.to ? null : k.to + n) : h.to = e; if (d) for (f = 0; f < d.length; ++f)h = d[f], null != h.to && (h.to += n), null == h.from ? (k = zb(c, h.marker), k || (h.from = n, g && (c || (c = [])).push(h))) : (h.from += n, g && (c || (c = [])).push(h)); c && (c = Se(c)); d && d != c && (d = Se(d)); e = [c]; if (!g) { var g = b.text.length - 2, q; if (0 < g && c) for (f = 0; f < c.length; ++f)null == c[f].to && (q || (q = [])).push(new qc(c[f].marker, null, null)); for (f = 0; f < g; ++f)e.push(q); e.push(d) } return e
+ } function Se(a) {
+ for (var b = 0; b < a.length; ++b) {
+ var c =
+ a[b]; null != c.from && c.from == c.to && !1 !== c.marker.clearWhenEmpty && a.splice(b--, 1)
+ } return a.length ? a : null
+ } function Ke(a, b) { var c; if (c = b["spans_" + a.id]) { for (var d = 0, e = []; d < b.text.length; ++d)e.push(Zf(c[d])); c = e } else c = null; d = od(a, b); if (!c) return d; if (!d) return c; for (e = 0; e < c.length; ++e) { var f = c[e], g = d[e]; if (f && g) { var h = 0; a: for (; h < g.length; ++h) { for (var k = g[h], l = 0; l < f.length; ++l)if (f[l].marker == k.marker) continue a; f.push(k) } } else g && (c[e] = g) } return c } function Uf(a, b, c) {
+ var d = null; a.iter(b.line, c.line + 1, function(a) {
+ if (a.markedSpans) for (var b =
+ 0; b < a.markedSpans.length; ++b) { var c = a.markedSpans[b].marker; !c.readOnly || d && -1 != D(d, c) || (d || (d = [])).push(c) }
+ }); if (!d) return null; a = [{ from: b, to: c }]; for (b = 0; b < d.length; ++b) { c = d[b]; for (var e = c.find(0), f = 0; f < a.length; ++f) { var g = a[f]; if (!(0 > y(g.to, e.from) || 0 < y(g.from, e.to))) { var h = [f, 1], k = y(g.from, e.from), l = y(g.to, e.to); (0 > k || !c.inclusiveLeft && !k) && h.push({ from: g.from, to: e.from }); (0 < l || !c.inclusiveRight && !l) && h.push({ from: e.to, to: g.to }); a.splice.apply(a, h); f += h.length - 1 } } } return a
+ } function Te(a) {
+ var b =
+ a.markedSpans; if (b) { for (var c = 0; c < b.length; ++c)b[c].marker.detachLine(a); a.markedSpans = null }
+ } function Ue(a, b) { if (b) { for (var c = 0; c < b.length; ++c)b[c].marker.attachLine(a); a.markedSpans = b } } function Ve(a, b) { var c = a.lines.length - b.lines.length; if (0 != c) return c; var c = a.find(), d = b.find(), e = y(c.from, d.from) || (a.inclusiveLeft ? -1 : 0) - (b.inclusiveLeft ? -1 : 0); return e ? -e : (c = y(c.to, d.to) || (a.inclusiveRight ? 1 : 0) - (b.inclusiveRight ? 1 : 0)) ? c : b.id - a.id } function Aa(a, b) {
+ var c = ra && a.markedSpans, d; if (c) for (var e, f = 0; f < c.length; ++f)e =
+ c[f], e.marker.collapsed && null == (b ? e.from : e.to) && (!d || 0 > Ve(d, e.marker)) && (d = e.marker); return d
+ } function Qe(a, b, c, d, e) {
+ a = u(a, b); if (a = ra && a.markedSpans) for (b = 0; b < a.length; ++b) {
+ var f = a[b]; if (f.marker.collapsed) {
+ var g = f.marker.find(0), h = y(g.from, c) || (f.marker.inclusiveLeft ? -1 : 0) - (e.inclusiveLeft ? -1 : 0), k = y(g.to, d) || (f.marker.inclusiveRight ? 1 : 0) - (e.inclusiveRight ? 1 : 0); if (!(0 <= h && 0 >= k || 0 >= h && 0 <= k) && (0 >= h && (0 < y(g.to, c) || f.marker.inclusiveRight && e.inclusiveLeft) || 0 <= h && (0 > y(g.from, d) || f.marker.inclusiveLeft &&
+ e.inclusiveRight))) return !0
+ }
+ }
+ } function ia(a) { for (var b; b = Aa(a, !0);)a = b.find(-1, !0).line; return a } function Mc(a, b) { var c = u(a, b), d = ia(c); return c == d ? b : F(d) } function Ld(a, b) { if (b > a.lastLine()) return b; var c = u(a, b), d; if (!ya(a, c)) return b; for (; d = Aa(c, !1);)c = d.find(1, !0).line; return F(c) + 1 } function ya(a, b) { var c = ra && b.markedSpans; if (c) for (var d, e = 0; e < c.length; ++e)if (d = c[e], d.marker.collapsed && (null == d.from || !d.marker.widgetNode && 0 == d.from && d.marker.inclusiveLeft && td(a, b, d))) return !0 } function td(a, b, c) {
+ if (null ==
+ c.to) return b = c.marker.find(1, !0), td(a, b.line, zb(b.line.markedSpans, c.marker)); if (c.marker.inclusiveRight && c.to == b.text.length) return !0; for (var d, e = 0; e < b.markedSpans.length; ++e)if (d = b.markedSpans[e], d.marker.collapsed && !d.marker.widgetNode && d.from == c.to && (null == d.to || d.to != c.from) && (d.marker.inclusiveLeft || c.marker.inclusiveRight) && td(a, b, d)) return !0
+ } function ub(a) {
+ if (null != a.height) return a.height; var b = a.doc.cm; if (!b) return 0; if (!Wc(document.body, a.node)) {
+ var c = "position: relative;"; a.coverGutter &&
+ (c += "margin-left: -" + b.display.gutters.offsetWidth + "px;"); a.noHScroll && (c += "width: " + b.display.wrapper.clientWidth + "px;"); U(b.display.measure, t("div", [a.node], null, c))
+ } return a.height = a.node.offsetHeight
+ } function $f(a, b, c, d) {
+ var e = new sc(a, c, d), f = a.cm; f && e.noHScroll && (f.display.alignWidgets = !0); nc(a, b, "widget", function(b) {
+ var c = b.widgets || (b.widgets = []); null == e.insertAt ? c.push(e) : c.splice(Math.min(c.length - 1, Math.max(0, e.insertAt)), 0, e); e.line = b; f && !ya(a, b) && (c = ea(b) < a.scrollTop, ca(b, b.height + ub(e)),
+ c && lc(f, null, e.height), f.curOp.forceUpdate = !0); return !0
+ }); return e
+ } function We(a, b) { if (a) for (; ;) { var c = a.match(/(?:^|\s+)line-(background-)?(\S+)/); if (!c) break; a = a.slice(0, c.index) + a.slice(c.index + c[0].length); var d = c[1] ? "bgClass" : "textClass"; null == b[d] ? b[d] = c[2] : (new RegExp("(?:^|s)" + c[2] + "(?:$|s)")).test(b[d]) || (b[d] += " " + c[2]) } return a } function Xe(a, b) { if (a.blankLine) return a.blankLine(b); if (a.innerMode) { var c = q.innerMode(a, b); if (c.mode.blankLine) return c.mode.blankLine(c.state) } } function ud(a,
+ b, c, d) { for (var e = 0; 10 > e; e++) { d && (d[0] = q.innerMode(a, c).mode); var f = a.token(b, c); if (b.pos > b.start) return f } throw Error("Mode " + a.name + " failed to advance stream."); } function Ye(a, b, c, d) { function e(a) { return { start: m.start, end: m.pos, string: m.current(), type: h || null, state: a ? Sa(f.mode, l) : l } } var f = a.doc, g = f.mode, h; b = w(f, b); var k = u(f, b.line), l = sb(a, b.line, c), m = new tc(k.text, a.options.tabSize), p; for (d && (p = []); (d || m.pos < b.ch) && !m.eol();)m.start = m.pos, h = ud(g, m, l), d && p.push(e(!0)); return d ? p : e() } function Ze(a,
+ b, c, d, e, f, g) { var h = c.flattenSpans; null == h && (h = a.options.flattenSpans); var k = 0, l = null, m = new tc(b, a.options.tabSize), p, n = a.options.addModeClass && [null]; for ("" == b && We(Xe(c, d), f); !m.eol();) { m.pos > a.options.maxHighlightLength ? (h = !1, g && Zc(a, b, d, m.pos), m.pos = b.length, p = null) : p = We(ud(c, m, d, n), f); if (n) { var q = n[0].name; q && (p = "m-" + (p ? q + " " + p : q)) } if (!h || l != p) { for (; k < m.start;)k = Math.min(m.start, k + 5E4), e(k, l); l = p } m.start = m.pos } for (; k < m.pos;)a = Math.min(m.pos, k + 5E4), e(a, l), k = a } function je(a, b, c, d) {
+ var e = [a.state.modeGen],
+ f = {}; Ze(a, b.text, a.doc.mode, c, function(a, b) { e.push(a, b) }, f, d); for (c = 0; c < a.state.overlays.length; ++c) { var g = a.state.overlays[c], h = 1, k = 0; Ze(a, b.text, g.mode, !0, function(a, b) { for (var c = h; k < a;) { var d = e[h]; d > a && e.splice(h, 1, a, e[h + 1], d); h += 2; k = Math.min(a, d) } if (b) if (g.opaque) e.splice(c, h - c, a, "cm-overlay " + b), h = c + 2; else for (; c < h; c += 2)d = e[c + 1], e[c + 1] = (d ? d + " " : "") + "cm-overlay " + b }, f) } return { styles: e, classes: f.bgClass || f.textClass ? f : null }
+ } function $e(a, b, c) {
+ if (!b.styles || b.styles[0] != a.state.modeGen) {
+ var d = je(a,
+ b, b.stateAfter = sb(a, F(b))); b.styles = d.styles; d.classes ? b.styleClasses = d.classes : b.styleClasses && (b.styleClasses = null); c === a.doc.frontier && a.doc.frontier++
+ } return b.styles
+ } function Zc(a, b, c, d) { var e = a.doc.mode, f = new tc(b, a.options.tabSize); f.start = f.pos = d || 0; for ("" == b && Xe(e, c); !f.eol() && f.pos <= a.options.maxHighlightLength;)ud(e, f, c), f.start = f.pos } function af(a, b) { if (!a || /^\s*$/.test(a)) return null; var c = b.addModeClass ? ag : bg; return c[a] || (c[a] = a.replace(/\S+/g, "cm-$\x26")) } function Sd(a, b) {
+ var c = t("span",
+ null, null, J ? "padding-right: .1px" : null), c = { pre: t("pre", [c]), content: c, col: 0, pos: 0, cm: a, splitSpaces: (B || J) && a.getOption("lineWrapping") }; b.measure = {}; for (var d = 0; d <= (b.rest ? b.rest.length : 0); d++) {
+ var e = d ? b.rest[d - 1] : b.line, f; c.pos = 0; c.addToken = cg; var g; if (null != vd) g = vd; else { g = U(a.display.measure, document.createTextNode("AخA")); var h = Ea(g, 0, 1).getBoundingClientRect(); g = h && h.left != h.right ? vd = 3 > Ea(g, 1, 2).getBoundingClientRect().right - h.right : !1 } g && (f = Y(e)) && (c.addToken = dg(c.addToken, f)); c.map = []; h = b !=
+ a.display.externalMeasured && F(e); a: {
+ g = c; var h = $e(a, e, h), k = e.markedSpans, l = e.text, m = 0; if (k) for (var p = l.length, n = 0, q = 1, r = "", u = void 0, v = void 0, w = 0, x = void 0, y = void 0, A = void 0, C = void 0, z = void 0; ;) {
+ if (w == n) {
+ for (var x = y = A = C = v = "", z = null, w = Infinity, G = [], H = 0; H < k.length; ++H) {
+ var I = k[H], D = I.marker; "bookmark" == D.type && I.from == n && D.widgetNode ? G.push(D) : I.from <= n && (null == I.to || I.to > n || D.collapsed && I.to == n && I.from == n) ? (null != I.to && I.to != n && w > I.to && (w = I.to, y = ""), D.className && (x += " " + D.className), D.css && (v = D.css),
+ D.startStyle && I.from == n && (A += " " + D.startStyle), D.endStyle && I.to == w && (y += " " + D.endStyle), D.title && !C && (C = D.title), D.collapsed && (!z || 0 > Ve(z.marker, D)) && (z = I)) : I.from > n && w > I.from && (w = I.from)
+ } if (z && (z.from || 0) == n) { bf(g, (null == z.to ? p + 1 : z.to) - n, z.marker, null == z.from); if (null == z.to) break a; z.to == n && (z = !1) } if (!z && G.length) for (H = 0; H < G.length; ++H)bf(g, 0, G[H])
+ } if (n >= p) break; for (G = Math.min(p, w); ;) {
+ if (r) {
+ H = n + r.length; z || (I = H > G ? r.slice(0, G - n) : r, g.addToken(g, I, u ? u + x : x, A, n + I.length == w ? y : "", C, v)); if (H >= G) {
+ r = r.slice(G -
+ n); n = G; break
+ } n = H; A = ""
+ } r = l.slice(m, m = h[q++]); u = af(h[q++], g.cm.options)
+ }
+ } else for (var q = 1; q < h.length; q += 2)g.addToken(g, l.slice(m, m = h[q]), af(h[q + 1], g.cm.options))
+ } e.styleClasses && (e.styleClasses.bgClass && (c.bgClass = wd(e.styleClasses.bgClass, c.bgClass || "")), e.styleClasses.textClass && (c.textClass = wd(e.styleClasses.textClass, c.textClass || ""))); 0 == c.map.length && c.map.push(0, 0, c.content.appendChild(eg(a.display.measure))); 0 == d ? (b.measure.map = c.map, b.measure.cache = {}) : ((b.measure.maps || (b.measure.maps = [])).push(c.map),
+ (b.measure.caches || (b.measure.caches = [])).push({}))
+ } J && /\bcm-tab\b/.test(c.content.lastChild.className) && (c.content.className = "cm-tab-wrap-hack"); K(a, "renderLine", a, b.line, c.pre); c.pre.className && (c.textClass = wd(c.pre.className, c.textClass || "")); return c
+ } function cg(a, b, c, d, e, f, g) {
+ if (b) {
+ var h = a.splitSpaces ? b.replace(/ {3,}/g, fg) : b, k = a.cm.state.specialChars, l = !1; if (k.test(b)) for (var m = document.createDocumentFragment(), p = 0; ;) {
+ k.lastIndex = p; var n = k.exec(b), q = n ? n.index - p : b.length - p; if (q) {
+ var r = document.createTextNode(h.slice(p,
+ p + q)); B && 9 > C ? m.appendChild(t("span", [r])) : m.appendChild(r); a.map.push(a.pos, a.pos + q, r); a.col += q; a.pos += q
+ } if (!n) break; p += q + 1; "\t" == n[0] ? (r = a.cm.options.tabSize, n = r - a.col % r, r = m.appendChild(t("span", Ne(n), "cm-tab")), r.setAttribute("role", "presentation"), r.setAttribute("cm-text", "\t"), a.col += n) : (r = a.cm.options.specialCharPlaceholder(n[0]), r.setAttribute("cm-text", n[0]), B && 9 > C ? m.appendChild(t("span", [r])) : m.appendChild(r), a.col += 1); a.map.push(a.pos, a.pos + 1, r); a.pos++
+ } else {
+ a.col += b.length; var m = document.createTextNode(h);
+ a.map.push(a.pos, a.pos + b.length, m); B && 9 > C && (l = !0); a.pos += b.length
+ } if (c || d || e || l || g) return b = c || "", d && (b += d), e && (b += e), d = t("span", [m], b, g), f && (d.title = f), a.content.appendChild(d); a.content.appendChild(m)
+ }
+ } function fg(a) { for (var b = " ", c = 0; c < a.length - 2; ++c)b += c % 2 ? " " : " "; return b + " " } function dg(a, b) {
+ return function(c, d, e, f, g, h, k) {
+ e = e ? e + " cm-force-border" : "cm-force-border"; for (var l = c.pos, m = l + d.length; ;) {
+ for (var p = 0; p < b.length; p++) { var n = b[p]; if (n.to > l && n.from <= l) break } if (n.to >= m) return a(c, d, e, f, g,
+ h, k); a(c, d.slice(0, n.to - l), e, f, null, h, k); f = null; d = d.slice(n.to - l); l = n.to
+ }
+ }
+ } function bf(a, b, c, d) { var e = !d && c.widgetNode; e && a.map.push(a.pos, a.pos + b, e); !d && a.cm.display.input.needsContentAttribute && (e || (e = a.content.appendChild(document.createElement("span"))), e.setAttribute("cm-marker", c.id)); e && (a.cm.display.input.setUneditable(e), a.content.appendChild(e)); a.pos += b } function Me(a, b) { return 0 == b.from.ch && 0 == b.to.ch && "" == A(b.text) && (!a.cm || a.cm.options.wholeLineUpdateBefore) } function qd(a, b, c, d) {
+ function e(a,
+ c, e) { a.text = c; a.stateAfter && (a.stateAfter = null); a.styles && (a.styles = null); null != a.order && (a.order = null); Te(a); Ue(a, e); c = d ? d(a) : 1; c != a.height && ca(a, c); L(a, "change", a, b) } function f(a, b) { for (var e = a, f = []; e < b; ++e)f.push(new Ab(k[e], c ? c[e] : null, d)); return f } var g = b.from, h = b.to, k = b.text, l = u(a, g.line), m = u(a, h.line), p = A(k), n = c ? c[k.length - 1] : null, q = h.line - g.line; if (b.full) a.insert(0, f(0, k.length)), a.remove(k.length, a.size - k.length); else if (Me(a, b)) {
+ var r = f(0, k.length - 1); e(m, m.text, n); q && a.remove(g.line, q);
+ r.length && a.insert(g.line, r)
+ } else l == m ? 1 == k.length ? e(l, l.text.slice(0, g.ch) + p + l.text.slice(h.ch), n) : (r = f(1, k.length - 1), r.push(new Ab(p + l.text.slice(h.ch), n, d)), e(l, l.text.slice(0, g.ch) + k[0], c ? c[0] : null), a.insert(g.line + 1, r)) : 1 == k.length ? (e(l, l.text.slice(0, g.ch) + k[0] + m.text.slice(h.ch), c ? c[0] : null), a.remove(g.line + 1, q)) : (e(l, l.text.slice(0, g.ch) + k[0], c ? c[0] : null), e(m, p + m.text.slice(h.ch), n), r = f(1, k.length - 1), 1 < q && a.remove(g.line + 1, q - 1), a.insert(g.line + 1, r)); L(a, "change", a, b)
+ } function Bb(a) {
+ this.lines =
+ a; this.parent = null; for (var b = 0, c = 0; b < a.length; ++b)a[b].parent = this, c += a[b].height; this.height = c
+ } function Cb(a) { this.children = a; for (var b = 0, c = 0, d = 0; d < a.length; ++d) { var e = a[d], b = b + e.chunkSize(), c = c + e.height; e.parent = this } this.size = b; this.height = c; this.parent = null } function Ga(a, b, c) { function d(a, f, g) { if (a.linked) for (var h = 0; h < a.linked.length; ++h) { var k = a.linked[h]; if (k.doc != f) { var l = g && k.sharedHist; if (!c || l) b(k.doc, l), d(k.doc, a, l) } } } d(a, null, !0) } function Ed(a, b) {
+ if (b.cm) throw Error("This document is already in use.");
+ a.doc = b; b.cm = a; Ac(a); zc(a); a.options.lineWrapping || Dc(a); a.options.mode = b.modeOption; Q(a)
+ } function u(a, b) { b -= a.first; if (0 > b || b >= a.size) throw Error("There is no line " + (b + a.first) + " in the document."); for (var c = a; !c.lines;)for (var d = 0; ; ++d) { var e = c.children[d], f = e.chunkSize(); if (b < f) { c = e; break } b -= f } return c.lines[b] } function Da(a, b, c) { var d = [], e = b.line; a.iter(b.line, c.line + 1, function(a) { a = a.text; e == c.line && (a = a.slice(0, c.ch)); e == b.line && (a = a.slice(b.ch)); d.push(a); ++e }); return d } function xd(a, b, c) {
+ var d =
+ []; a.iter(b, c, function(a) { d.push(a.text) }); return d
+ } function ca(a, b) { var c = b - a.height; if (c) for (var d = a; d; d = d.parent)d.height += c } function F(a) { if (null == a.parent) return null; var b = a.parent; a = D(b.lines, a); for (var c = b.parent; c; b = c, c = c.parent)for (var d = 0; c.children[d] != b; ++d)a += c.children[d].chunkSize(); return a + b.first } function Ba(a, b) {
+ var c = a.first; a: do { for (var d = 0; d < a.children.length; ++d) { var e = a.children[d], f = e.height; if (b < f) { a = e; continue a } b -= f; c += e.chunkSize() } return c } while (!a.lines); for (d = 0; d <
+ a.lines.length; ++d) { e = a.lines[d].height; if (b < e) break; b -= e } return c + d
+ } function ea(a) { a = ia(a); for (var b = 0, c = a.parent, d = 0; d < c.lines.length; ++d) { var e = c.lines[d]; if (e == a) break; else b += e.height } for (a = c.parent; a; c = a, a = c.parent)for (d = 0; d < a.children.length && (e = a.children[d], e != c); ++d)b += e.height; return b } function Y(a) { var b = a.order; null == b && (b = a.order = gg(a.text)); return b } function uc(a) {
+ this.done = []; this.undone = []; this.undoDepth = Infinity; this.lastModTime = this.lastSelTime = 0; this.lastOrigin = this.lastSelOrigin =
+ this.lastOp = this.lastSelOp = null; this.generation = this.maxGeneration = a || 1
+ } function pd(a, b) { var c = { from: Rc(b.from), to: ta(b), text: Da(a, b.from, b.to) }; cf(a, c, b.from.line, b.to.line + 1); Ga(a, function(a) { cf(a, c, b.from.line, b.to.line + 1) }, !0); return c } function ce(a) { for (; a.length;)if (A(a).ranges) a.pop(); else break } function Ie(a, b, c, d) {
+ var e = a.history; e.undone.length = 0; var f = +new Date, g, h; if (h = e.lastOp == d || e.lastOrigin == b.origin && b.origin && ("+" == b.origin.charAt(0) && a.cm && e.lastModTime > f - a.cm.options.historyEventDelay ||
+ "*" == b.origin.charAt(0))) e.lastOp == d ? (ce(e.done), g = A(e.done)) : e.done.length && !A(e.done).ranges ? g = A(e.done) : 1 < e.done.length && !e.done[e.done.length - 2].ranges ? (e.done.pop(), g = A(e.done)) : g = void 0, h = g; if (h) { var k = A(g.changes); 0 == y(b.from, b.to) && 0 == y(b.from, k.to) ? k.to = ta(b) : g.changes.push(pd(a, b)) } else for ((g = A(e.done)) && g.ranges || Wb(a.sel, e.done), g = { changes: [pd(a, b)], generation: e.generation }, e.done.push(g); e.done.length > e.undoDepth;)e.done.shift(), e.done[0].ranges || e.done.shift(); e.done.push(c); e.generation =
+ ++e.maxGeneration; e.lastModTime = e.lastSelTime = f; e.lastOp = e.lastSelOp = d; e.lastOrigin = e.lastSelOrigin = b.origin; k || K(a, "historyAdded")
+ } function Wb(a, b) { var c = A(b); c && c.ranges && c.equals(a) || b.push(a) } function cf(a, b, c, d) { var e = b["spans_" + a.id], f = 0; a.iter(Math.max(a.first, c), Math.min(a.first + a.size, d), function(c) { c.markedSpans && ((e || (e = b["spans_" + a.id] = {}))[f] = c.markedSpans); ++f }) } function Zf(a) {
+ if (!a) return null; for (var b = 0, c; b < a.length; ++b)a[b].marker.explicitlyCleared ? c || (c = a.slice(0, b)) : c && c.push(a[b]);
+ return c ? c.length ? c : null : a
+ } function Xa(a, b, c) { for (var d = 0, e = []; d < a.length; ++d) { var f = a[d]; if (f.ranges) e.push(c ? la.prototype.deepCopy.call(f) : f); else { var f = f.changes, g = []; e.push({ changes: g }); for (var h = 0; h < f.length; ++h) { var k = f[h], l; g.push({ from: k.from, to: k.to, text: k.text }); if (b) for (var m in k) (l = m.match(/^spans_(\d+)$/)) && -1 < D(b, Number(l[1])) && (A(g)[m] = k[m], delete k[m]) } } } return e } function df(a, b, c, d) { c < a.line ? a.line += d : b < a.line && (a.line = b, a.ch = 0) } function ef(a, b, c, d) {
+ for (var e = 0; e < a.length; ++e) {
+ var f =
+ a[e], g = !0; if (f.ranges) { f.copied || (f = a[e] = f.deepCopy(), f.copied = !0); for (var h = 0; h < f.ranges.length; h++)df(f.ranges[h].anchor, b, c, d), df(f.ranges[h].head, b, c, d) } else { for (h = 0; h < f.changes.length; ++h) { var k = f.changes[h]; if (c < k.from.line) k.from = r(k.from.line + d, k.from.ch), k.to = r(k.to.line + d, k.to.ch); else if (b <= k.to.line) { g = !1; break } } g || (a.splice(0, e + 1), e = 0) }
+ }
+ } function Je(a, b) { var c = b.from.line, d = b.to.line, e = b.text.length - (d - c) - 1; ef(a.done, c, d, e); ef(a.undone, c, d, e) } function ld(a) {
+ return null != a.defaultPrevented ?
+ a.defaultPrevented : 0 == a.returnValue
+ } function xe(a) { var b = a.which; null == b && (a.button & 1 ? b = 1 : a.button & 2 ? b = 3 : a.button & 4 && (b = 2)); W && a.ctrlKey && 1 == b && (b = 3); return b } function L(a, b) { function c(a) { return function() { a.apply(null, e) } } var d = a._handlers && a._handlers[b]; if (d) { var e = Array.prototype.slice.call(arguments, 2), f; Ta ? f = Ta.delayedCallbacks : Db ? f = Db : (f = Db = [], setTimeout(hg, 0)); for (var g = 0; g < d.length; ++g)f.push(c(d[g])) } } function hg() { var a = Db; Db = null; for (var b = 0; b < a.length; ++b)a[b]() } function ja(a, b, c) {
+ "string" ==
+ typeof b && (b = { type: b, preventDefault: function() { this.defaultPrevented = !0 } }); K(a, c || b.type, a, b); return ld(b) || b.codemirrorIgnore
+ } function fe(a) { var b = a._handlers && a._handlers.cursorActivity; if (b) { a = a.curOp.cursorActivityHandlers || (a.curOp.cursorActivityHandlers = []); for (var c = 0; c < b.length; ++c)-1 == D(a, b[c]) && a.push(b[c]) } } function S(a, b) { var c = a._handlers && a._handlers[b]; return c && 0 < c.length } function Ya(a) { a.prototype.on = function(a, c) { v(this, a, c) }; a.prototype.off = function(a, c) { ka(this, a, c) } } function bb() {
+ this.id =
+ null
+ } function ye(a, b, c) { for (var d = 0, e = 0; ;) { var f = a.indexOf("\t", d); -1 == f && (f = a.length); var g = f - d; if (f == a.length || e + g >= b) return d + Math.min(g, b - e); e += f - d; e += c - e % c; d = f + 1; if (e >= b) return d } } function Ne(a) { for (; vc.length <= a;)vc.push(A(vc) + " "); return vc[a] } function A(a) { return a[a.length - 1] } function D(a, b) { for (var c = 0; c < a.length; ++c)if (a[c] == b) return c; return -1 } function ob(a, b) { for (var c = [], d = 0; d < a.length; d++)c[d] = b(a[d], d); return c } function Eb() { } function ff(a, b) {
+ var c; Object.create ? c = Object.create(a) :
+ (Eb.prototype = a, c = new Eb); b && V(b, c); return c
+ } function V(a, b, c) { b || (b = {}); for (var d in a) !a.hasOwnProperty(d) || !1 === c && b.hasOwnProperty(d) || (b[d] = a[d]); return b } function cb(a) { var b = Array.prototype.slice.call(arguments, 1); return function() { return a.apply(null, b) } } function oc(a, b) { return b ? -1 < b.source.indexOf("\\w") && gf(a) ? !0 : b.test(a) : gf(a) } function hf(a) { for (var b in a) if (a.hasOwnProperty(b) && a[b]) return !1; return !0 } function tb(a) { return 768 <= a.charCodeAt(0) && ig.test(a) } function t(a, b, c, d) {
+ a = document.createElement(a);
+ c && (a.className = c); d && (a.style.cssText = d); if ("string" == typeof b) a.appendChild(document.createTextNode(b)); else if (b) for (c = 0; c < b.length; ++c)a.appendChild(b[c]); return a
+ } function za(a) { for (var b = a.childNodes.length; 0 < b; --b)a.removeChild(a.firstChild); return a } function U(a, b) { return za(a).appendChild(b) } function fa() { return document.activeElement } function Fb(a) { return new RegExp("(^|\\s)" + a + "(?:$|\\s)\\s*") } function wd(a, b) {
+ for (var c = a.split(" "), d = 0; d < c.length; d++)c[d] && !Fb(c[d]).test(b) && (b += " " + c[d]);
+ return b
+ } function jf(a) { if (document.body.getElementsByClassName) for (var b = document.body.getElementsByClassName("CodeMirror"), c = 0; c < b.length; c++) { var d = b[c].CodeMirror; d && a(d) } } function tf() { var a; v(window, "resize", function() { null == a && (a = setTimeout(function() { a = null; jf(If) }, 100)) }); v(window, "blur", function() { jf(db) }) } function eg(a) {
+ if (null == yd) { var b = t("span", "​"); U(a, t("span", [b, document.createTextNode("x")])); 0 != a.firstChild.offsetHeight && (yd = 1 >= b.offsetWidth && 2 < b.offsetHeight && !(B && 8 > C)) } a = yd ? t("span",
+ "​") : t("span", " ", null, "display: inline-block; width: 1px; margin-right: -1px"); a.setAttribute("cm-text", ""); return a
+ } function Af(a, b, c, d) { if (!a) return d(b, c, "ltr"); for (var e = !1, f = 0; f < a.length; ++f) { var g = a[f]; if (g.from < c && g.to > b || b == c && g.to == b) d(Math.max(g.from, b), Math.min(g.to, c), 1 == g.level ? "rtl" : "ltr"), e = !0 } e || d(b, c, "ltr") } function dd(a) { return a.level % 2 ? a.to : a.from } function ed(a) { return a.level % 2 ? a.from : a.to } function ac(a) { return (a = Y(a)) ? dd(a[0]) : 0 } function bc(a) { var b = Y(a); return b ? ed(A(b)) : a.text.length }
+ function kf(a, b) { var c = u(a.doc, b), d = ia(c); d != c && (b = F(d)); d = (c = Y(d)) ? c[0].level % 2 ? bc(d) : ac(d) : 0; return r(b, d) } function lf(a, b) { var c = kf(a, b.line), d = u(a.doc, c.line), e = Y(d); return e && 0 != e[0].level ? c : (d = Math.max(0, d.text.search(/\S/)), r(c.line, b.line == c.line && b.ch <= d && b.ch ? 0 : d)) } function Sb(a, b) {
+ vb = null; for (var c = 0, d; c < a.length; ++c) {
+ var e = a[c]; if (e.from < b && e.to > b) return c; if (e.from == b || e.to == b) if (null == d) d = c; else {
+ var f; f = e.level; var g = a[d].level, h = a[0].level; f = f == h ? !0 : g == h ? !1 : f < g; if (f) return e.from !=
+ e.to && (vb = d), c; e.from != e.to && (vb = c); break
+ }
+ } return d
+ } function zd(a, b, c, d) { if (!d) return b + c; do b += c; while (0 < b && tb(a.text.charAt(b))); return b } function gd(a, b, c, d) { var e = Y(a); if (!e) return Oe(a, b, c, d); var f = Sb(e, b), g = e[f]; for (b = zd(a, b, g.level % 2 ? -c : c, d); ;) { if (b > g.from && b < g.to) return b; if (b == g.from || b == g.to) { if (Sb(e, b) == f) return b; g = e[f + c]; return 0 < c == g.level % 2 ? g.to : g.from } g = e[f += c]; if (!g) return null; b = 0 < c == g.level % 2 ? zd(a, g.to, -1, d) : zd(a, g.from, 1, d) } } function Oe(a, b, c, d) {
+ b += c; if (d) for (; 0 < b && tb(a.text.charAt(b));)b +=
+ c; return 0 > b || b > a.text.length ? null : b
+ } var wa = /gecko\/\d/i.test(navigator.userAgent), mf = /MSIE \d/.test(navigator.userAgent), nf = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent), B = mf || nf, C = B && (mf ? document.documentMode || 6 : nf[1]), J = /WebKit\//.test(navigator.userAgent), jg = J && /Qt\/\d+\.\d+/.test(navigator.userAgent), kg = /Chrome\//.test(navigator.userAgent), ba = /Opera\//.test(navigator.userAgent), te = /Apple Computer/.test(navigator.vendor), lg = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),
+ Gf = /PhantomJS/.test(navigator.userAgent), Qa = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent), ab = Qa || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent), W = Qa || /Mac/.test(navigator.platform), mg = /win/i.test(navigator.platform), Ia = ba && navigator.userAgent.match(/Version\/(\d*\.\d*)/); Ia && (Ia = Number(Ia[1])); Ia && 15 <= Ia && (ba = !1, J = !0); var of = W && (jg || ba && (null == Ia || 12.11 > Ia)), id = wa || B && 9 <= C, Ge = !1, ra = !1; Fc.prototype = V({
+ update: function(a) {
+ var b =
+ a.scrollWidth > a.clientWidth + 1, c = a.scrollHeight > a.clientHeight + 1, d = a.nativeBarWidth; c ? (this.vert.style.display = "block", this.vert.style.bottom = b ? d + "px" : "0", this.vert.firstChild.style.height = Math.max(0, a.scrollHeight - a.clientHeight + (a.viewHeight - (b ? d : 0))) + "px") : (this.vert.style.display = "", this.vert.firstChild.style.height = "0"); b ? (this.horiz.style.display = "block", this.horiz.style.right = c ? d + "px" : "0", this.horiz.style.left = a.barLeft + "px", this.horiz.firstChild.style.width = a.scrollWidth - a.clientWidth + (a.viewWidth -
+ a.barLeft - (c ? d : 0)) + "px") : (this.horiz.style.display = "", this.horiz.firstChild.style.width = "0"); !this.checkedOverlay && 0 < a.clientHeight && (0 == d && this.overlayHack(), this.checkedOverlay = !0); return { right: c ? d : 0, bottom: b ? d : 0 }
+ }, setScrollLeft: function(a) { this.horiz.scrollLeft != a && (this.horiz.scrollLeft = a) }, setScrollTop: function(a) { this.vert.scrollTop != a && (this.vert.scrollTop = a) }, overlayHack: function() {
+ this.horiz.style.minHeight = this.vert.style.minWidth = W && !lg ? "12px" : "18px"; var a = this, b = function(b) {
+ (b.target ||
+ b.srcElement) != a.vert && (b.target || b.srcElement) != a.horiz && G(a.cm, pe)(b)
+ }; v(this.vert, "mousedown", b); v(this.horiz, "mousedown", b)
+ }, clear: function() { var a = this.horiz.parentNode; a.removeChild(this.horiz); a.removeChild(this.vert) }
+ }, Fc.prototype); Gc.prototype = V({ update: function() { return { bottom: 0, right: 0 } }, setScrollLeft: function() { }, setScrollTop: function() { }, clear: function() { } }, Gc.prototype); q.scrollbarModel = { "native": Fc, "null": Gc }; Mb.prototype.signal = function(a, b) { S(a, b) && this.events.push(arguments) }; Mb.prototype.finish =
+ function() { for (var a = 0; a < this.events.length; a++)K.apply(null, this.events[a]) }; var r = q.Pos = function(a, b) { if (!(this instanceof r)) return new r(a, b); this.line = a; this.ch = b }, y = q.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch }, X = null; Tc.prototype = V({
+ init: function(a) {
+ function b(a) {
+ if (d.somethingSelected()) X = d.getSelections(), c.inaccurateSelection && (c.prevInput = "", c.inaccurateSelection = !1, f.value = X.join("\n"), Za(f)); else if (d.options.lineWiseCopyCut) {
+ var b = Vd(d); X = b.text; "cut" == a.type ? d.setSelections(b.ranges,
+ null, ha) : (c.prevInput = "", f.value = b.text.join("\n"), Za(f))
+ } else return; "cut" == a.type && (d.state.cutIncoming = !0)
+ } var c = this, d = this.cm, e = this.wrapper = Xd(), f = this.textarea = e.firstChild; a.wrapper.insertBefore(e, a.wrapper.firstChild); Qa && (f.style.width = "0px"); v(f, "input", function() { B && 9 <= C && c.hasSelection && (c.hasSelection = null); c.poll() }); v(f, "paste", function() {
+ if (J && !d.state.fakedLastChar && !(200 > new Date - d.state.lastMiddleDown)) {
+ var a = f.selectionStart, b = f.selectionEnd; f.value += "$"; f.selectionEnd = b; f.selectionStart =
+ a; d.state.fakedLastChar = !0
+ } d.state.pasteIncoming = !0; c.fastPoll()
+ }); v(f, "cut", b); v(f, "copy", b); v(a.scroller, "paste", function(b) { oa(a, b) || (d.state.pasteIncoming = !0, c.focus()) }); v(a.lineSpace, "selectstart", function(b) { oa(a, b) || O(b) }); v(f, "compositionstart", function() { var a = d.getCursor("from"); c.composing = { start: a, range: d.markText(a, d.getCursor("to"), { className: "CodeMirror-composing" }) } }); v(f, "compositionend", function() { c.composing && (c.poll(), c.composing.range.clear(), c.composing = null) })
+ }, prepareSelection: function() {
+ var a =
+ this.cm, b = a.display, c = a.doc, d = he(a); if (a.options.moveInputWithCursor) { var a = ma(a, c.sel.primary().head, "div"), c = b.wrapper.getBoundingClientRect(), e = b.lineDiv.getBoundingClientRect(); d.teTop = Math.max(0, Math.min(b.wrapper.clientHeight - 10, a.top + e.top - c.top)); d.teLeft = Math.max(0, Math.min(b.wrapper.clientWidth - 10, a.left + e.left - c.left)) } return d
+ }, showSelection: function(a) {
+ var b = this.cm.display; U(b.cursorDiv, a.cursors); U(b.selectionDiv, a.selection); null != a.teTop && (this.wrapper.style.top = a.teTop + "px", this.wrapper.style.left =
+ a.teLeft + "px")
+ }, reset: function(a) { if (!this.contextMenuPending) { var b, c, d = this.cm, e = d.doc; d.somethingSelected() ? (this.prevInput = "", b = e.sel.primary(), c = (b = Ce && (100 < b.to().line - b.from().line || 1E3 < (c = d.getSelection()).length)) ? "-" : c || d.getSelection(), this.textarea.value = c, d.state.focused && Za(this.textarea), B && 9 <= C && (this.hasSelection = c)) : a || (this.prevInput = this.textarea.value = "", B && 9 <= C && (this.hasSelection = null)); this.inaccurateSelection = b } }, getField: function() { return this.textarea }, supportsTouch: function() { return !1 },
+ focus: function() { if ("nocursor" != this.cm.options.readOnly && (!ab || fa() != this.textarea)) try { this.textarea.focus() } catch (a) { } }, blur: function() { this.textarea.blur() }, resetPosition: function() { this.wrapper.style.top = this.wrapper.style.left = 0 }, receivedFocus: function() { this.slowPoll() }, slowPoll: function() { var a = this; a.pollingFast || a.polling.set(this.cm.options.pollInterval, function() { a.poll(); a.cm.state.focused && a.slowPoll() }) }, fastPoll: function() {
+ function a() {
+ c.poll() || b ? (c.pollingFast = !1, c.slowPoll()) : (b =
+ !0, c.polling.set(60, a))
+ } var b = !1, c = this; c.pollingFast = !0; c.polling.set(20, a)
+ }, poll: function() {
+ var a = this.cm, b = this.textarea, c = this.prevInput; if (!a.state.focused || ng(b) && !c || Rb(a) || a.options.disableInput || a.state.keySeq) return !1; a.state.pasteIncoming && a.state.fakedLastChar && (b.value = b.value.substring(0, b.value.length - 1), a.state.fakedLastChar = !1); var d = b.value; if (d == c && !a.somethingSelected()) return !1; if (B && 9 <= C && this.hasSelection === d || W && /[\uf700-\uf7ff]/.test(d)) return a.display.input.reset(), !1; if (a.doc.sel ==
+ a.display.selForContextMenu) { var e = d.charCodeAt(0); 8203 != e || c || (c = "​"); if (8666 == e) return this.reset(), this.cm.execCommand("undo") } for (var f = 0, e = Math.min(c.length, d.length); f < e && c.charCodeAt(f) == d.charCodeAt(f);)++f; var g = this; T(a, function() { Sc(a, d.slice(f), c.length - f, null, g.composing ? "*compose" : null); 1E3 < d.length || -1 < d.indexOf("\n") ? b.value = g.prevInput = "" : g.prevInput = d; g.composing && (g.composing.range.clear(), g.composing.range = a.markText(g.composing.start, a.getCursor("to"), { className: "CodeMirror-composing" })) });
+ return !0
+ }, ensurePolled: function() { this.pollingFast && this.poll() && (this.pollingFast = !1) }, onKeyPress: function() { B && 9 <= C && (this.hasSelection = null); this.fastPoll() }, onContextMenu: function(a) {
+ function b() { if (null != g.selectionStart) { var a = e.somethingSelected(), b = "​" + (a ? g.value : ""); g.value = "⇚"; g.value = b; d.prevInput = a ? "" : "​"; g.selectionStart = 1; g.selectionEnd = b.length; f.selForContextMenu = e.doc.sel } } function c() {
+ d.contextMenuPending = !1; d.wrapper.style.position = "relative"; g.style.cssText = l; B && 9 > C && f.scrollbars.setScrollTop(f.scroller.scrollTop =
+ k); if (null != g.selectionStart) { (!B || B && 9 > C) && b(); var a = 0, c = function() { f.selForContextMenu == e.doc.sel && 0 == g.selectionStart && 0 < g.selectionEnd && "​" == d.prevInput ? G(e, ic.selectAll)(e) : 10 > a++ ? f.detectingSelectAll = setTimeout(c, 500) : f.input.reset() }; f.detectingSelectAll = setTimeout(c, 200) }
+ } var d = this, e = d.cm, f = e.display, g = d.textarea, h = Ua(e, a), k = f.scroller.scrollTop; if (h && !ba) {
+ e.options.resetSelectionOnContextMenu && -1 == e.doc.sel.contains(h) && G(e, H)(e.doc, ga(h), ha); var l = g.style.cssText; d.wrapper.style.position =
+ "absolute"; g.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (a.clientY - 5) + "px; left: " + (a.clientX - 5) + "px; z-index: 1000; background: " + (B ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity\x3d5);"; if (J) var m = window.scrollY; f.input.focus(); J && window.scrollTo(null, m); f.input.reset(); e.somethingSelected() || (g.value = d.prevInput = " "); d.contextMenuPending = !0; f.selForContextMenu = e.doc.sel; clearTimeout(f.detectingSelectAll);
+ B && 9 <= C && b(); if (id) { jd(a); var p = function() { ka(window, "mouseup", p); setTimeout(c, 20) }; v(window, "mouseup", p) } else setTimeout(c, 50)
+ }
+ }, setUneditable: Eb, needsContentAttribute: !1
+ }, Tc.prototype); Uc.prototype = V({
+ init: function(a) {
+ function b(a) {
+ if (d.somethingSelected()) X = d.getSelections(), "cut" == a.type && d.replaceSelection("", null, "cut"); else if (d.options.lineWiseCopyCut) { var b = Vd(d); X = b.text; "cut" == a.type && d.operation(function() { d.setSelections(b.ranges, 0, ha); d.replaceSelection("", null, "cut") }) } else return;
+ if (a.clipboardData && !Qa) a.preventDefault(), a.clipboardData.clearData(), a.clipboardData.setData("text/plain", X.join("\n")); else { var c = Xd(); a = c.firstChild; d.display.lineSpace.insertBefore(c, d.display.lineSpace.firstChild); a.value = X.join("\n"); var h = document.activeElement; Za(a); setTimeout(function() { d.display.lineSpace.removeChild(c); h.focus() }, 50) }
+ } var c = this, d = c.cm; a = c.div = a.lineDiv; a.contentEditable = "true"; Wd(a); v(a, "paste", function(a) {
+ var b = a.clipboardData && a.clipboardData.getData("text/plain");
+ b && (a.preventDefault(), d.replaceSelection(b, null, "paste"))
+ }); v(a, "compositionstart", function(a) { a = a.data; c.composing = { sel: d.doc.sel, data: a, startData: a }; if (a) { var b = d.doc.sel.primary(), g = d.getLine(b.head.line).indexOf(a, Math.max(0, b.head.ch - a.length)); -1 < g && g <= b.head.ch && (c.composing.sel = ga(r(b.head.line, g), r(b.head.line, g + a.length))) } }); v(a, "compositionupdate", function(a) { c.composing.data = a.data }); v(a, "compositionend", function(a) {
+ var b = c.composing; b && (a.data == b.startData || /\u200b/.test(a.data) || (b.data =
+ a.data), setTimeout(function() { b.handled || c.applyComposition(b); c.composing == b && (c.composing = null) }, 50))
+ }); v(a, "touchstart", function() { c.forceCompositionEnd() }); v(a, "input", function() { c.composing || c.pollContent() || T(c.cm, function() { Q(d) }) }); v(a, "copy", b); v(a, "cut", b)
+ }, prepareSelection: function() { var a = he(this.cm, !1); a.focus = this.cm.state.focused; return a }, showSelection: function(a) { a && this.cm.display.view.length && (a.focus && this.showPrimarySelection(), this.showMultipleSelections(a)) }, showPrimarySelection: function() {
+ var a =
+ window.getSelection(), b = this.cm.doc.sel.primary(), c = Tb(this.cm, a.anchorNode, a.anchorOffset), d = Tb(this.cm, a.focusNode, a.focusOffset); if (!c || c.bad || !d || d.bad || 0 != y(Qb(c, d), b.from()) || 0 != y(Pb(c, d), b.to())) if (c = Yd(this.cm, b.from()), d = Yd(this.cm, b.to()), c || d) {
+ var e = this.cm.display.view, b = a.rangeCount && a.getRangeAt(0); c ? d || (d = e[e.length - 1].measure, d = d.maps ? d.maps[d.maps.length - 1] : d.map, d = { node: d[d.length - 1], offset: d[d.length - 2] - d[d.length - 3] }) : c = { node: e[0].measure.map[2], offset: 0 }; try {
+ var f = Ea(c.node, c.offset,
+ d.offset, d.node)
+ } catch (g) { } f && (a.removeAllRanges(), a.addRange(f), b && null == a.anchorNode ? a.addRange(b) : wa && this.startGracePeriod()); this.rememberSelection()
+ }
+ }, startGracePeriod: function() { var a = this; clearTimeout(this.gracePeriod); this.gracePeriod = setTimeout(function() { a.gracePeriod = !1; a.selectionChanged() && a.cm.operation(function() { a.cm.curOp.selectionChanged = !0 }) }, 20) }, showMultipleSelections: function(a) { U(this.cm.display.cursorDiv, a.cursors); U(this.cm.display.selectionDiv, a.selection) }, rememberSelection: function() {
+ var a =
+ window.getSelection(); this.lastAnchorNode = a.anchorNode; this.lastAnchorOffset = a.anchorOffset; this.lastFocusNode = a.focusNode; this.lastFocusOffset = a.focusOffset
+ }, selectionInEditor: function() { var a = window.getSelection(); if (!a.rangeCount) return !1; a = a.getRangeAt(0).commonAncestorContainer; return Wc(this.div, a) }, focus: function() { "nocursor" != this.cm.options.readOnly && this.div.focus() }, blur: function() { this.div.blur() }, getField: function() { return this.div }, supportsTouch: function() { return !0 }, receivedFocus: function() {
+ function a() {
+ b.cm.state.focused &&
+ (b.pollSelection(), b.polling.set(b.cm.options.pollInterval, a))
+ } var b = this; this.selectionInEditor() ? this.pollSelection() : T(this.cm, function() { b.cm.curOp.selectionChanged = !0 }); this.polling.set(this.cm.options.pollInterval, a)
+ }, selectionChanged: function() { var a = window.getSelection(); return a.anchorNode != this.lastAnchorNode || a.anchorOffset != this.lastAnchorOffset || a.focusNode != this.lastFocusNode || a.focusOffset != this.lastFocusOffset }, pollSelection: function() {
+ if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
+ var a =
+ window.getSelection(), b = this.cm; this.rememberSelection(); var c = Tb(b, a.anchorNode, a.anchorOffset), d = Tb(b, a.focusNode, a.focusOffset); c && d && T(b, function() { H(b.doc, ga(c, d), ha); if (c.bad || d.bad) b.curOp.selectionChanged = !0 })
+ }
+ }, pollContent: function() {
+ var a = this.cm, b = a.display, c = a.doc.sel.primary(), d = c.from(), c = c.to(); if (d.line < b.viewFrom || c.line > b.viewTo - 1) return !1; var e; d.line == b.viewFrom || 0 == (e = Ca(a, d.line)) ? (d = F(b.view[0].line), e = b.view[0].node) : (d = F(b.view[e].line), e = b.view[e - 1].node.nextSibling); var f =
+ Ca(a, c.line); f == b.view.length - 1 ? (c = b.viewTo - 1, b = b.view[f].node) : (c = F(b.view[f + 1].line) - 1, b = b.view[f + 1].node.previousSibling); b = sa(xf(a, e, b, d, c)); for (e = Da(a.doc, r(d, 0), r(c, u(a.doc, c).text.length)); 1 < b.length && 1 < e.length;)if (A(b) == A(e)) b.pop(), e.pop(), c--; else if (b[0] == e[0]) b.shift(), e.shift(), d++; else break; for (var g = 0, f = 0, h = b[0], k = e[0], l = Math.min(h.length, k.length); g < l && h.charCodeAt(g) == k.charCodeAt(g);)++g; h = A(b); k = A(e); for (l = Math.min(h.length - (1 == b.length ? g : 0), k.length - (1 == e.length ? g : 0)); f < l && h.charCodeAt(h.length -
+ f - 1) == k.charCodeAt(k.length - f - 1);)++f; b[b.length - 1] = h.slice(0, h.length - f); b[0] = b[0].slice(g); d = r(d, g); c = r(c, e.length ? A(e).length - f : 0); if (1 < b.length || b[0] || y(d, c)) return wb(a.doc, b, d, c, "+input"), !0
+ }, ensurePolled: function() { this.forceCompositionEnd() }, reset: function() { this.forceCompositionEnd() }, forceCompositionEnd: function() { this.composing && !this.composing.handled && (this.applyComposition(this.composing), this.composing.handled = !0, this.div.blur(), this.div.focus()) }, applyComposition: function(a) {
+ a.data &&
+ a.data != a.startData && G(this.cm, Sc)(this.cm, a.data, 0, a.sel)
+ }, setUneditable: function(a) { a.setAttribute("contenteditable", "false") }, onKeyPress: function(a) { a.preventDefault(); G(this.cm, Sc)(this.cm, String.fromCharCode(null == a.charCode ? a.keyCode : a.charCode), 0) }, onContextMenu: Eb, resetPosition: Eb, needsContentAttribute: !0
+ }, Uc.prototype); q.inputStyles = { textarea: Tc, contenteditable: Uc }; la.prototype = {
+ primary: function() { return this.ranges[this.primIndex] }, equals: function(a) {
+ if (a == this) return !0; if (a.primIndex !=
+ this.primIndex || a.ranges.length != this.ranges.length) return !1; for (var b = 0; b < this.ranges.length; b++) { var c = this.ranges[b], d = a.ranges[b]; if (0 != y(c.anchor, d.anchor) || 0 != y(c.head, d.head)) return !1 } return !0
+ }, deepCopy: function() { for (var a = [], b = 0; b < this.ranges.length; b++)a[b] = new z(Rc(this.ranges[b].anchor), Rc(this.ranges[b].head)); return new la(a, this.primIndex) }, somethingSelected: function() { for (var a = 0; a < this.ranges.length; a++)if (!this.ranges[a].empty()) return !0; return !1 }, contains: function(a, b) {
+ b || (b = a);
+ for (var c = 0; c < this.ranges.length; c++) { var d = this.ranges[c]; if (0 <= y(b, d.from()) && 0 >= y(a, d.to())) return c } return -1
+ }
+ }; z.prototype = { from: function() { return Qb(this.anchor, this.head) }, to: function() { return Pb(this.anchor, this.head) }, empty: function() { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch } }; var ad = { left: 0, right: 0, top: 0, bottom: 0 }, Fa, Ta = null, Ff = 0, fc, ec, se = 0, gc = 0, R = null; B ? R = -.53 : wa ? R = 15 : kg ? R = -.7 : te && (R = -1 / 3); var ze = function(a) {
+ var b = a.wheelDeltaX, c = a.wheelDeltaY; null == b && a.detail &&
+ a.axis == a.HORIZONTAL_AXIS && (b = a.detail); null == c && a.detail && a.axis == a.VERTICAL_AXIS ? c = a.detail : null == c && (c = a.wheelDelta); return { x: b, y: c }
+ }; q.wheelEventPixels = function(a) { a = ze(a); a.x *= R; a.y *= R; return a }; var Qf = new bb, md = null, ta = q.changeEnd = function(a) { return a.text ? r(a.from.line + a.text.length - 1, A(a.text).length + (1 == a.text.length ? a.from.ch : 0)) : a.to }; q.prototype = {
+ constructor: q, focus: function() { window.focus(); this.display.input.focus() }, setOption: function(a, b) {
+ var c = this.options, d = c[a]; if (c[a] != b || "mode" ==
+ a) c[a] = b, Ka.hasOwnProperty(a) && G(this, Ka[a])(this, b, d)
+ }, getOption: function(a) { return this.options[a] }, getDoc: function() { return this.doc }, addKeyMap: function(a, b) { this.state.keyMaps[b ? "push" : "unshift"](pc(a)) }, removeKeyMap: function(a) { for (var b = this.state.keyMaps, c = 0; c < b.length; ++c)if (b[c] == a || b[c].name == a) return b.splice(c, 1), !0 }, addOverlay: M(function(a, b) {
+ var c = a.token ? a : q.getMode(this.options, a); if (c.startState) throw Error("Overlays may not be stateful."); this.state.overlays.push({
+ mode: c, modeSpec: a,
+ opaque: b && b.opaque
+ }); this.state.modeGen++; Q(this)
+ }), removeOverlay: M(function(a) { for (var b = this.state.overlays, c = 0; c < b.length; ++c) { var d = b[c].modeSpec; if (d == a || "string" == typeof a && d.name == a) { b.splice(c, 1); this.state.modeGen++; Q(this); break } } }), indentLine: M(function(a, b, c) { "string" != typeof b && "number" != typeof b && (b = null == b ? this.options.smartIndent ? "smart" : "prev" : b ? "add" : "subtract"); qb(this.doc, a) && pb(this, a, b, c) }), indentSelection: M(function(a) {
+ for (var b = this.doc.sel.ranges, c = -1, d = 0; d < b.length; d++) {
+ var e =
+ b[d]; if (e.empty()) e.head.line > c && (pb(this, e.head.line, a, !0), c = e.head.line, d == this.doc.sel.primIndex && Pa(this)); else { for (var f = e.from(), e = e.to(), g = Math.max(c, f.line), c = Math.min(this.lastLine(), e.line - (e.ch ? 0 : 1)) + 1, e = g; e < c; ++e)pb(this, e, a); e = this.doc.sel.ranges; 0 == f.ch && b.length == e.length && 0 < e[d].from().ch && Xc(this.doc, d, new z(f, e[d].to()), ha) }
+ }
+ }), getTokenAt: function(a, b) { return Ye(this, a, b) }, getLineTokens: function(a, b) { return Ye(this, r(a), b, !0) }, getTokenTypeAt: function(a) {
+ a = w(this.doc, a); var b = $e(this,
+ u(this.doc, a.line)), c = 0, d = (b.length - 1) / 2; a = a.ch; if (0 == a) b = b[2]; else for (; ;) { var e = c + d >> 1; if ((e ? b[2 * e - 1] : 0) >= a) d = e; else if (b[2 * e + 1] < a) c = e + 1; else { b = b[2 * e + 2]; break } } c = b ? b.indexOf("cm-overlay ") : -1; return 0 > c ? b : 0 == c ? null : b.slice(0, c - 1)
+ }, getModeAt: function(a) { var b = this.doc.mode; return b.innerMode ? q.innerMode(b, this.getTokenAt(a).state).mode : b }, getHelper: function(a, b) { return this.getHelpers(a, b)[0] }, getHelpers: function(a, b) {
+ var c = []; if (!$a.hasOwnProperty(b)) return c; var d = $a[b], e = this.getModeAt(a); if ("string" ==
+ typeof e[b]) d[e[b]] && c.push(d[e[b]]); else if (e[b]) for (var f = 0; f < e[b].length; f++) { var g = d[e[b][f]]; g && c.push(g) } else e.helperType && d[e.helperType] ? c.push(d[e.helperType]) : d[e.name] && c.push(d[e.name]); for (f = 0; f < d._global.length; f++)g = d._global[f], g.pred(e, this) && -1 == D(c, g.val) && c.push(g.val); return c
+ }, getStateAfter: function(a, b) { var c = this.doc; a = Math.max(c.first, Math.min(null == a ? c.first + c.size - 1 : a, c.first + c.size - 1)); return sb(this, a + 1, b) }, cursorCoords: function(a, b) {
+ var c; c = this.doc.sel.primary(); c =
+ null == a ? c.head : "object" == typeof a ? w(this.doc, a) : a ? c.from() : c.to(); return ma(this, c, b || "page")
+ }, charCoords: function(a, b) { return Yb(this, w(this.doc, a), b || "page") }, coordsChar: function(a, b) { a = ne(this, a, b || "page"); return fd(this, a.left, a.top) }, lineAtHeight: function(a, b) { a = ne(this, { top: a, left: 0 }, b || "page").top; return Ba(this.doc, a + this.display.viewOffset) }, heightAtLine: function(a, b) {
+ var c = !1, d; "number" == typeof a ? (d = this.doc.first + this.doc.size - 1, a < this.doc.first ? a = this.doc.first : a > d && (a = d, c = !0), d = u(this.doc,
+ a)) : d = a; return cd(this, d, { top: 0, left: 0 }, b || "page").top + (c ? this.doc.height - ea(d) : 0)
+ }, defaultTextHeight: function() { return xa(this.display) }, defaultCharWidth: function() { return gb(this.display) }, setGutterMarker: M(function(a, b, c) { return nc(this.doc, a, "gutter", function(a) { var e = a.gutterMarkers || (a.gutterMarkers = {}); e[b] = c; !c && hf(e) && (a.gutterMarkers = null); return !0 }) }), clearGutter: M(function(a) {
+ var b = this, c = b.doc, d = c.first; c.iter(function(c) {
+ c.gutterMarkers && c.gutterMarkers[a] && (c.gutterMarkers[a] = null,
+ na(b, d, "gutter"), hf(c.gutterMarkers) && (c.gutterMarkers = null)); ++d
+ })
+ }), lineInfo: function(a) { if ("number" == typeof a) { if (!qb(this.doc, a)) return null; var b = a; a = u(this.doc, a); if (!a) return null } else if (b = F(a), null == b) return null; return { line: b, handle: a, text: a.text, gutterMarkers: a.gutterMarkers, textClass: a.textClass, bgClass: a.bgClass, wrapClass: a.wrapClass, widgets: a.widgets } }, getViewport: function() { return { from: this.display.viewFrom, to: this.display.viewTo } }, addWidget: function(a, b, c, d, e) {
+ var f = this.display; a =
+ ma(this, w(this.doc, a)); var g = a.bottom, h = a.left; b.style.position = "absolute"; b.setAttribute("cm-ignore-events", "true"); this.display.input.setUneditable(b); f.sizer.appendChild(b); if ("over" == d) g = a.top; else if ("above" == d || "near" == d) { var k = Math.max(f.wrapper.clientHeight, this.doc.height), l = Math.max(f.sizer.clientWidth, f.lineSpace.clientWidth); ("above" == d || a.bottom + b.offsetHeight > k) && a.top > b.offsetHeight ? g = a.top - b.offsetHeight : a.bottom + b.offsetHeight <= k && (g = a.bottom); h + b.offsetWidth > l && (h = l - b.offsetWidth) } b.style.top =
+ g + "px"; b.style.left = b.style.right = ""; "right" == e ? (h = f.sizer.clientWidth - b.offsetWidth, b.style.right = "0px") : ("left" == e ? h = 0 : "middle" == e && (h = (f.sizer.clientWidth - b.offsetWidth) / 2), b.style.left = h + "px"); c && (a = cc(this, h, g, h + b.offsetWidth, g + b.offsetHeight), null != a.scrollTop && lb(this, a.scrollTop), null != a.scrollLeft && Ma(this, a.scrollLeft))
+ }, triggerOnKeyDown: M(ve), triggerOnKeyPress: M(we), triggerOnKeyUp: ue, execCommand: function(a) { if (ic.hasOwnProperty(a)) return ic[a](this) }, findPosH: function(a, b, c, d) {
+ var e = 1;
+ 0 > b && (e = -1, b = -b); var f = 0; for (a = w(this.doc, a); f < b && (a = rd(this.doc, a, e, c, d), !a.hitSide); ++f); return a
+ }, moveH: M(function(a, b) { var c = this; c.extendSelectionsBy(function(d) { return c.display.shift || c.doc.extend || d.empty() ? rd(c.doc, d.head, a, b, c.options.rtlMoveVisually) : 0 > a ? d.from() : d.to() }, Gb) }), deleteH: M(function(a, b) { var c = this.doc; this.doc.sel.somethingSelected() ? c.replaceSelection("", null, "+delete") : Va(this, function(d) { var e = rd(c, d.head, a, b, !1); return 0 > a ? { from: e, to: d.head } : { from: d.head, to: e } }) }), findPosV: function(a,
+ b, c, d) { var e = 1; 0 > b && (e = -1, b = -b); var f = 0; for (a = w(this.doc, a); f < b && (a = ma(this, a, "div"), null == d ? d = a.left : a.left = d, a = Pe(this, a, e, c), !a.hitSide); ++f); return a }, moveV: M(function(a, b) {
+ var c = this, d = this.doc, e = [], f = !c.display.shift && !d.extend && d.sel.somethingSelected(); d.extendSelectionsBy(function(g) { if (f) return 0 > a ? g.from() : g.to(); var k = ma(c, g.head, "div"); null != g.goalColumn && (k.left = g.goalColumn); e.push(k.left); var l = Pe(c, k, a, b); "page" == b && g == d.sel.primary() && lc(c, null, Yb(c, l, "div").top - k.top); return l },
+ Gb); if (e.length) for (var g = 0; g < d.sel.ranges.length; g++)d.sel.ranges[g].goalColumn = e[g]
+ }), findWordAt: function(a) { var b = u(this.doc, a.line).text, c = a.ch, d = a.ch; if (b) { var e = this.getHelper(a, "wordChars"); (0 > a.xRel || d == b.length) && c ? --c : ++d; for (var f = b.charAt(c), f = oc(f, e) ? function(a) { return oc(a, e) } : /\s/.test(f) ? function(a) { return /\s/.test(a) } : function(a) { return !/\s/.test(a) && !oc(a) }; 0 < c && f(b.charAt(c - 1));)--c; for (; d < b.length && f(b.charAt(d));)++d } return new z(r(a.line, c), r(a.line, d)) }, toggleOverwrite: function(a) {
+ if (null ==
+ a || a != this.state.overwrite) (this.state.overwrite = !this.state.overwrite) ? mb(this.display.cursorDiv, "CodeMirror-overwrite") : kb(this.display.cursorDiv, "CodeMirror-overwrite"), K(this, "overwriteToggle", this, this.state.overwrite)
+ }, hasFocus: function() { return this.display.input.getField() == fa() }, scrollTo: M(function(a, b) { null == a && null == b || mc(this); null != a && (this.curOp.scrollLeft = a); null != b && (this.curOp.scrollTop = b) }), getScrollInfo: function() {
+ var a = this.display.scroller; return {
+ left: a.scrollLeft, top: a.scrollTop,
+ height: a.scrollHeight - da(this) - this.display.barHeight, width: a.scrollWidth - da(this) - this.display.barWidth, clientHeight: Nc(this), clientWidth: pa(this)
+ }
+ }, scrollIntoView: M(function(a, b) {
+ null == a ? (a = { from: this.doc.sel.primary().head, to: null }, null == b && (b = this.options.cursorScrollMargin)) : "number" == typeof a ? a = { from: r(a, 0), to: null } : null == a.from && (a = { from: a, to: null }); a.to || (a.to = a.from); a.margin = b || 0; if (null != a.from.line) mc(this), this.curOp.scrollToPos = a; else {
+ var c = cc(this, Math.min(a.from.left, a.to.left), Math.min(a.from.top,
+ a.to.top) - a.margin, Math.max(a.from.right, a.to.right), Math.max(a.from.bottom, a.to.bottom) + a.margin); this.scrollTo(c.scrollLeft, c.scrollTop)
+ }
+ }), setSize: M(function(a, b) {
+ function c(a) { return "number" == typeof a || /^\d+$/.test(String(a)) ? a + "px" : a } var d = this; null != a && (d.display.wrapper.style.width = c(a)); null != b && (d.display.wrapper.style.height = c(b)); d.options.lineWrapping && me(this); var e = d.display.viewFrom; d.doc.iter(e, d.display.viewTo, function(a) {
+ if (a.widgets) for (var b = 0; b < a.widgets.length; b++)if (a.widgets[b].noHScroll) {
+ na(d,
+ e, "widget"); break
+ } ++e
+ }); d.curOp.forceUpdate = !0; K(d, "refresh", this)
+ }), operation: function(a) { return T(this, a) }, refresh: M(function() { var a = this.display.cachedTextHeight; Q(this); this.curOp.forceUpdate = !0; hb(this); this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop); Cc(this); (null == a || .5 < Math.abs(a - xa(this.display))) && Ac(this); K(this, "refresh", this) }), swapDoc: M(function(a) {
+ var b = this.doc; b.cm = null; Ed(this, a); hb(this); this.display.input.reset(); this.scrollTo(a.scrollLeft, a.scrollTop); this.curOp.forceScroll =
+ !0; L(this, "swapDoc", this, b); return b
+ }), getInputField: function() { return this.display.input.getField() }, getWrapperElement: function() { return this.display.wrapper }, getScrollerElement: function() { return this.display.scroller }, getGutterElement: function() { return this.display.gutters }
+ }; Ya(q); var qf = q.defaults = {}, Ka = q.optionHandlers = {}, Fd = q.Init = { toString: function() { return "CodeMirror.Init" } }; x("value", "", function(a, b) { a.setValue(b) }, !0); x("mode", null, function(a, b) { a.doc.modeOption = b; zc(a) }, !0); x("indentUnit",
+ 2, zc, !0); x("indentWithTabs", !1); x("smartIndent", !0); x("tabSize", 4, function(a) { eb(a); hb(a); Q(a) }, !0); x("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(a, b, c) { a.state.specialChars = new RegExp(b.source + (b.test("\t") ? "" : "|\t"), "g"); c != q.Init && a.refresh() }); x("specialCharPlaceholder", function(a) { var b = t("span", "•", "cm-invalidchar"); b.title = "\\u" + a.charCodeAt(0).toString(16); b.setAttribute("aria-label", b.title); return b }, function(a) { a.refresh() }, !0); x("electricChars", !0);
+ x("inputStyle", ab ? "contenteditable" : "textarea", function() { throw Error("inputStyle can not (yet) be changed in a running editor"); }, !0); x("rtlMoveVisually", !mg); x("wholeLineUpdateBefore", !0); x("theme", "default", function(a) { Bd(a); ib(a) }, !0); x("keyMap", "default", function(a, b, c) { b = pc(b); (c = c != q.Init && pc(c)) && c.detach && c.detach(a, b); b.attach && b.attach(a, c || null) }); x("extraKeys", null); x("lineWrapping", !1, function(a) {
+ a.options.lineWrapping ? (mb(a.display.wrapper, "CodeMirror-wrap"), a.display.sizer.style.minWidth =
+ "", a.display.sizerWidth = null) : (kb(a.display.wrapper, "CodeMirror-wrap"), Dc(a)); Ac(a); Q(a); hb(a); setTimeout(function() { Na(a) }, 100)
+ }, !0); x("gutters", [], function(a) { wc(a.options); ib(a) }, !0); x("fixedGutter", !0, function(a, b) { a.display.gutters.style.left = b ? Ic(a.display) + "px" : "0"; a.refresh() }, !0); x("coverGutterNextToScrollbar", !1, function(a) { Na(a) }, !0); x("scrollbarStyle", "native", function(a) { Cd(a); Na(a); a.display.scrollbars.setScrollTop(a.doc.scrollTop); a.display.scrollbars.setScrollLeft(a.doc.scrollLeft) },
+ !0); x("lineNumbers", !1, function(a) { wc(a.options); ib(a) }, !0); x("firstLineNumber", 1, ib, !0); x("lineNumberFormatter", function(a) { return a }, ib, !0); x("showCursorWhenSelecting", !1, nb, !0); x("resetSelectionOnContextMenu", !0); x("lineWiseCopyCut", !0); x("readOnly", !1, function(a, b) { "nocursor" == b ? (db(a), a.display.input.blur(), a.display.disabled = !0) : (a.display.disabled = !1, b || a.display.input.reset()) }); x("disableInput", !1, function(a, b) { b || a.display.input.reset() }, !0); x("dragDrop", !0, function(a, b, c) {
+ !b != !(c && c != q.Init) &&
+ (c = a.display.dragFunctions, b = b ? v : ka, b(a.display.scroller, "dragstart", c.start), b(a.display.scroller, "dragenter", c.simple), b(a.display.scroller, "dragover", c.simple), b(a.display.scroller, "drop", c.drop))
+ }); x("cursorBlinkRate", 530); x("cursorScrollMargin", 0); x("cursorHeight", 1, nb, !0); x("singleCursorHeightPerLine", !0, nb, !0); x("workTime", 100); x("workDelay", 100); x("flattenSpans", !0, eb, !0); x("addModeClass", !1, eb, !0); x("pollInterval", 100); x("undoDepth", 200, function(a, b) { a.doc.history.undoDepth = b }); x("historyEventDelay",
+ 1250); x("viewportMargin", 10, function(a) { a.refresh() }, !0); x("maxHighlightLength", 1E4, eb, !0); x("moveInputWithCursor", !0, function(a, b) { b || a.display.input.resetPosition() }); x("tabindex", null, function(a, b) { a.display.input.getField().tabIndex = b || "" }); x("autofocus", null); var pf = q.modes = {}, Hb = q.mimeModes = {}; q.defineMode = function(a, b) { q.defaults.mode || "null" == a || (q.defaults.mode = a); 2 < arguments.length && (b.dependencies = Array.prototype.slice.call(arguments, 2)); pf[a] = b }; q.defineMIME = function(a, b) { Hb[a] = b }; q.resolveMode =
+ function(a) { if ("string" == typeof a && Hb.hasOwnProperty(a)) a = Hb[a]; else if (a && "string" == typeof a.name && Hb.hasOwnProperty(a.name)) { var b = Hb[a.name]; "string" == typeof b && (b = { name: b }); a = ff(b, a); a.name = b.name } else if ("string" == typeof a && /^[\w\-]+\/[\w\-]+\+xml$/.test(a)) return q.resolveMode("application/xml"); return "string" == typeof a ? { name: a } : a || { name: "null" } }; q.getMode = function(a, b) {
+ b = q.resolveMode(b); var c = pf[b.name]; if (!c) return q.getMode(a, "text/plain"); c = c(a, b); if (Ib.hasOwnProperty(b.name)) {
+ var d = Ib[b.name],
+ e; for (e in d) d.hasOwnProperty(e) && (c.hasOwnProperty(e) && (c["_" + e] = c[e]), c[e] = d[e])
+ } c.name = b.name; b.helperType && (c.helperType = b.helperType); if (b.modeProps) for (e in b.modeProps) c[e] = b.modeProps[e]; return c
+ }; q.defineMode("null", function() { return { token: function(a) { a.skipToEnd() } } }); q.defineMIME("text/plain", "null"); var Ib = q.modeExtensions = {}; q.extendMode = function(a, b) { var c = Ib.hasOwnProperty(a) ? Ib[a] : Ib[a] = {}; V(b, c) }; q.defineExtension = function(a, b) { q.prototype[a] = b }; q.defineDocExtension = function(a, b) {
+ P.prototype[a] =
+ b
+ }; q.defineOption = x; var yc = []; q.defineInitHook = function(a) { yc.push(a) }; var $a = q.helpers = {}; q.registerHelper = function(a, b, c) { $a.hasOwnProperty(a) || ($a[a] = q[a] = { _global: [] }); $a[a][b] = c }; q.registerGlobalHelper = function(a, b, c, d) { q.registerHelper(a, b, d); $a[a]._global.push({ pred: c, val: d }) }; var Sa = q.copyState = function(a, b) { if (!0 === b) return b; if (a.copyState) return a.copyState(b); var c = {}, d; for (d in b) { var e = b[d]; e instanceof Array && (e = e.concat([])); c[d] = e } return c }, Df = q.startState = function(a, b, c) {
+ return a.startState ?
+ a.startState(b, c) : !0
+ }; q.innerMode = function(a, b) { for (; a.innerMode;) { var c = a.innerMode(b); if (!c || c.mode == a) break; b = c.state; a = c.mode } return c || { mode: a, state: b } }; var ic = q.commands = {
+ selectAll: function(a) { a.setSelection(r(a.firstLine(), 0), r(a.lastLine()), ha) }, singleSelection: function(a) { a.setSelection(a.getCursor("anchor"), a.getCursor("head"), ha) }, killLine: function(a) {
+ Va(a, function(b) {
+ if (b.empty()) {
+ var c = u(a.doc, b.head.line).text.length; return b.head.ch == c && b.head.line < a.lastLine() ? {
+ from: b.head, to: r(b.head.line +
+ 1, 0)
+ } : { from: b.head, to: r(b.head.line, c) }
+ } return { from: b.from(), to: b.to() }
+ })
+ }, deleteLine: function(a) { Va(a, function(b) { return { from: r(b.from().line, 0), to: w(a.doc, r(b.to().line + 1, 0)) } }) }, delLineLeft: function(a) { Va(a, function(a) { return { from: r(a.from().line, 0), to: a.from() } }) }, delWrappedLineLeft: function(a) { Va(a, function(b) { var c = a.charCoords(b.head, "div").top + 5; return { from: a.coordsChar({ left: 0, top: c }, "div"), to: b.from() } }) }, delWrappedLineRight: function(a) {
+ Va(a, function(b) {
+ var c = a.charCoords(b.head, "div").top +
+ 5, c = a.coordsChar({ left: a.display.lineDiv.offsetWidth + 100, top: c }, "div"); return { from: b.from(), to: c }
+ })
+ }, undo: function(a) { a.undo() }, redo: function(a) { a.redo() }, undoSelection: function(a) { a.undoSelection() }, redoSelection: function(a) { a.redoSelection() }, goDocStart: function(a) { a.extendSelection(r(a.firstLine(), 0)) }, goDocEnd: function(a) { a.extendSelection(r(a.lastLine())) }, goLineStart: function(a) { a.extendSelectionsBy(function(b) { return kf(a, b.head.line) }, { origin: "+move", bias: 1 }) }, goLineStartSmart: function(a) {
+ a.extendSelectionsBy(function(b) {
+ return lf(a,
+ b.head)
+ }, { origin: "+move", bias: 1 })
+ }, goLineEnd: function(a) { a.extendSelectionsBy(function(b) { b = b.head.line; for (var c, d = u(a.doc, b); c = Aa(d, !1);)d = c.find(1, !0).line, b = null; c = (c = Y(d)) ? c[0].level % 2 ? ac(d) : bc(d) : d.text.length; return r(null == b ? F(d) : b, c) }, { origin: "+move", bias: -1 }) }, goLineRight: function(a) { a.extendSelectionsBy(function(b) { b = a.charCoords(b.head, "div").top + 5; return a.coordsChar({ left: a.display.lineDiv.offsetWidth + 100, top: b }, "div") }, Gb) }, goLineLeft: function(a) {
+ a.extendSelectionsBy(function(b) {
+ b =
+ a.charCoords(b.head, "div").top + 5; return a.coordsChar({ left: 0, top: b }, "div")
+ }, Gb)
+ }, goLineLeftSmart: function(a) { a.extendSelectionsBy(function(b) { var c = a.charCoords(b.head, "div").top + 5, c = a.coordsChar({ left: 0, top: c }, "div"); return c.ch < a.getLine(c.line).search(/\S/) ? lf(a, b.head) : c }, Gb) }, goLineUp: function(a) { a.moveV(-1, "line") }, goLineDown: function(a) { a.moveV(1, "line") }, goPageUp: function(a) { a.moveV(-1, "page") }, goPageDown: function(a) { a.moveV(1, "page") }, goCharLeft: function(a) { a.moveH(-1, "char") }, goCharRight: function(a) {
+ a.moveH(1,
+ "char")
+ }, goColumnLeft: function(a) { a.moveH(-1, "column") }, goColumnRight: function(a) { a.moveH(1, "column") }, goWordLeft: function(a) { a.moveH(-1, "word") }, goGroupRight: function(a) { a.moveH(1, "group") }, goGroupLeft: function(a) { a.moveH(-1, "group") }, goWordRight: function(a) { a.moveH(1, "word") }, delCharBefore: function(a) { a.deleteH(-1, "char") }, delCharAfter: function(a) { a.deleteH(1, "char") }, delWordBefore: function(a) { a.deleteH(-1, "word") }, delWordAfter: function(a) { a.deleteH(1, "word") }, delGroupBefore: function(a) {
+ a.deleteH(-1,
+ "group")
+ }, delGroupAfter: function(a) { a.deleteH(1, "group") }, indentAuto: function(a) { a.indentSelection("smart") }, indentMore: function(a) { a.indentSelection("add") }, indentLess: function(a) { a.indentSelection("subtract") }, insertTab: function(a) { a.replaceSelection("\t") }, insertSoftTab: function(a) { for (var b = [], c = a.listSelections(), d = a.options.tabSize, e = 0; e < c.length; e++) { var f = c[e].from(), f = aa(a.getLine(f.line), f.ch, d); b.push(Array(d - f % d + 1).join(" ")) } a.replaceSelections(b) }, defaultTab: function(a) {
+ a.somethingSelected() ?
+ a.indentSelection("add") : a.execCommand("insertTab")
+ }, transposeChars: function(a) {
+ T(a, function() {
+ for (var b = a.listSelections(), c = [], d = 0; d < b.length; d++) {
+ var e = b[d].head, f = u(a.doc, e.line).text; if (f) if (e.ch == f.length && (e = new r(e.line, e.ch - 1)), 0 < e.ch) e = new r(e.line, e.ch + 1), a.replaceRange(f.charAt(e.ch - 1) + f.charAt(e.ch - 2), r(e.line, e.ch - 2), e, "+transpose"); else if (e.line > a.doc.first) { var g = u(a.doc, e.line - 1).text; g && a.replaceRange(f.charAt(0) + "\n" + g.charAt(g.length - 1), r(e.line - 1, g.length - 1), r(e.line, 1), "+transpose") } c.push(new z(e,
+ e))
+ } a.setSelections(c)
+ })
+ }, newlineAndIndent: function(a) { T(a, function() { for (var b = a.listSelections().length, c = 0; c < b; c++) { var d = a.listSelections()[c]; a.replaceRange("\n", d.anchor, d.head, "+input"); a.indentLine(d.from().line + 1, null, !0); Pa(a) } }) }, toggleOverwrite: function(a) { a.toggleOverwrite() }
+ }, ua = q.keyMap = {}; ua.basic = {
+ Left: "goCharLeft", Right: "goCharRight", Up: "goLineUp", Down: "goLineDown", End: "goLineEnd", Home: "goLineStartSmart", PageUp: "goPageUp", PageDown: "goPageDown", Delete: "delCharAfter", Backspace: "delCharBefore",
+ "Shift-Backspace": "delCharBefore", Tab: "defaultTab", "Shift-Tab": "indentAuto", Enter: "newlineAndIndent", Insert: "toggleOverwrite", Esc: "singleSelection"
+ }; ua.pcDefault = {
+ "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter",
+ "Ctrl-S": "save", "Ctrl-F": "find", "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", fallthrough: "basic"
+ }; ua.emacsy = {
+ "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp",
+ "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
+ }; ua.macDefault = {
+ "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", "Ctrl-Alt-Backspace": "delGroupAfter",
+ "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", fallthrough: ["basic", "emacsy"]
+ }; ua["default"] = W ? ua.macDefault : ua.pcDefault; q.normalizeKeyMap = function(a) {
+ var b = {}, c; for (c in a) if (a.hasOwnProperty(c)) {
+ var d =
+ a[c]; if (!/^(name|fallthrough|(de|at)tach)$/.test(c)) { if ("..." != d) for (var e = ob(c.split(" "), Wf), f = 0; f < e.length; f++) { var g, h; f == e.length - 1 ? (h = c, g = d) : (h = e.slice(0, f + 1).join(" "), g = "..."); var k = b[h]; if (!k) b[h] = g; else if (k != g) throw Error("Inconsistent bindings for " + h); } delete a[c] }
+ } for (var l in b) a[l] = b[l]; return a
+ }; var xb = q.lookupKey = function(a, b, c, d) {
+ b = pc(b); var e = b.call ? b.call(a, d) : b[a]; if (!1 === e) return "nothing"; if ("..." === e) return "multi"; if (null != e && c(e)) return "handled"; if (b.fallthrough) {
+ if ("[object Array]" !=
+ Object.prototype.toString.call(b.fallthrough)) return xb(a, b.fallthrough, c, d); for (e = 0; e < b.fallthrough.length; e++) { var f = xb(a, b.fallthrough[e], c, d); if (f) return f }
+ }
+ }, Pf = q.isModifierKey = function(a) { a = "string" == typeof a ? a : va[a.keyCode]; return "Ctrl" == a || "Alt" == a || "Shift" == a || "Mod" == a }, Rf = q.keyName = function(a, b) {
+ if (ba && 34 == a.keyCode && a["char"]) return !1; var c = va[a.keyCode], d = c; if (null == d || a.altGraphKey) return !1; a.altKey && "Alt" != c && (d = "Alt-" + d); (of ? a.metaKey : a.ctrlKey) && "Ctrl" != c && (d = "Ctrl-" + d); (of ? a.ctrlKey :
+ a.metaKey) && "Cmd" != c && (d = "Cmd-" + d); !b && a.shiftKey && "Shift" != c && (d = "Shift-" + d); return d
+ }; q.fromTextArea = function(a, b) {
+ function c() { a.value = k.getValue() } b = b ? V(b) : {}; b.value = a.value; !b.tabindex && a.tabIndex && (b.tabindex = a.tabIndex); !b.placeholder && a.placeholder && (b.placeholder = a.placeholder); if (null == b.autofocus) { var d = fa(); b.autofocus = d == a || null != a.getAttribute("autofocus") && d == document.body } if (a.form && (v(a.form, "submit", c), !b.leaveSubmitMethodAlone)) {
+ var e = a.form, f = e.submit; try {
+ var g = e.submit = function() {
+ c();
+ e.submit = f; e.submit(); e.submit = g
+ }
+ } catch (h) { }
+ } b.finishInit = function(b) { b.save = c; b.getTextArea = function() { return a }; b.toTextArea = function() { b.toTextArea = isNaN; c(); a.parentNode.removeChild(b.getWrapperElement()); a.style.display = ""; a.form && (ka(a.form, "submit", c), "function" == typeof a.form.submit && (a.form.submit = f)) } }; a.style.display = "none"; var k = q(function(b) { a.parentNode.insertBefore(b, a.nextSibling) }, b); return k
+ }; var tc = q.StringStream = function(a, b) {
+ this.pos = this.start = 0; this.string = a; this.tabSize = b ||
+ 8; this.lineStart = this.lastColumnPos = this.lastColumnValue = 0
+ }; tc.prototype = {
+ eol: function() { return this.pos >= this.string.length }, sol: function() { return this.pos == this.lineStart }, peek: function() { return this.string.charAt(this.pos) || void 0 }, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++) }, eat: function(a) { var b = this.string.charAt(this.pos); if ("string" == typeof a ? b == a : b && (a.test ? a.test(b) : a(b))) return ++this.pos, b }, eatWhile: function(a) {
+ for (var b = this.pos; this.eat(a);); return this.pos >
+ b
+ }, eatSpace: function() { for (var a = this.pos; /[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos; return this.pos > a }, skipToEnd: function() { this.pos = this.string.length }, skipTo: function(a) { a = this.string.indexOf(a, this.pos); if (-1 < a) return this.pos = a, !0 }, backUp: function(a) { this.pos -= a }, column: function() {
+ this.lastColumnPos < this.start && (this.lastColumnValue = aa(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue), this.lastColumnPos = this.start); return this.lastColumnValue - (this.lineStart ?
+ aa(this.string, this.lineStart, this.tabSize) : 0)
+ }, indentation: function() { return aa(this.string, null, this.tabSize) - (this.lineStart ? aa(this.string, this.lineStart, this.tabSize) : 0) }, match: function(a, b, c) { if ("string" == typeof a) { var d = function(a) { return c ? a.toLowerCase() : a }, e = this.string.substr(this.pos, a.length); if (d(e) == d(a)) return !1 !== b && (this.pos += a.length), !0 } else { if ((a = this.string.slice(this.pos).match(a)) && 0 < a.index) return null; a && !1 !== b && (this.pos += a[0].length); return a } }, current: function() {
+ return this.string.slice(this.start,
+ this.pos)
+ }, hideFirstChars: function(a, b) { this.lineStart += a; try { return b() } finally { this.lineStart -= a } }
+ }; var sd = 0, Ha = q.TextMarker = function(a, b) { this.lines = []; this.type = b; this.doc = a; this.id = ++sd }; Ya(Ha); Ha.prototype.clear = function() {
+ if (!this.explicitlyCleared) {
+ var a = this.doc.cm, b = a && !a.curOp; b && Ja(a); if (S(this, "clear")) { var c = this.find(); c && L(this, "clear", c.from, c.to) } for (var d = c = null, e = 0; e < this.lines.length; ++e) {
+ var f = this.lines[e], g = zb(f.markedSpans, this); a && !this.collapsed ? na(a, F(f), "text") : a && (null !=
+ g.to && (d = F(f)), null != g.from && (c = F(f))); for (var h = f, k = f.markedSpans, l = g, m = void 0, p = 0; p < k.length; ++p)k[p] != l && (m || (m = [])).push(k[p]); h.markedSpans = m; null == g.from && this.collapsed && !ya(this.doc, f) && a && ca(f, xa(a.display))
+ } if (a && this.collapsed && !a.options.lineWrapping) for (e = 0; e < this.lines.length; ++e)f = ia(this.lines[e]), g = Kb(f), g > a.display.maxLineLength && (a.display.maxLine = f, a.display.maxLineLength = g, a.display.maxLineChanged = !0); null != c && a && this.collapsed && Q(a, c, d + 1); this.lines.length = 0; this.explicitlyCleared =
+ !0; this.atomic && this.doc.cantEdit && (this.doc.cantEdit = !1, a && ge(a.doc)); a && L(a, "markerCleared", a, this); b && La(a); this.parent && this.parent.clear()
+ }
+ }; Ha.prototype.find = function(a, b) { null == a && "bookmark" == this.type && (a = 1); for (var c, d, e = 0; e < this.lines.length; ++e) { var f = this.lines[e], g = zb(f.markedSpans, this); if (null != g.from && (c = r(b ? f : F(f), g.from), -1 == a)) return c; if (null != g.to && (d = r(b ? f : F(f), g.to), 1 == a)) return d } return c && { from: c, to: d } }; Ha.prototype.changed = function() {
+ var a = this.find(-1, !0), b = this, c = this.doc.cm;
+ a && c && T(c, function() { var d = a.line, e = F(a.line); if (e = Vc(c, e)) le(e), c.curOp.selectionChanged = c.curOp.forceUpdate = !0; c.curOp.updateMaxLine = !0; ya(b.doc, d) || null == b.height || (e = b.height, b.height = null, (e = ub(b) - e) && ca(d, d.height + e)) })
+ }; Ha.prototype.attachLine = function(a) { if (!this.lines.length && this.doc.cm) { var b = this.doc.cm.curOp; b.maybeHiddenMarkers && -1 != D(b.maybeHiddenMarkers, this) || (b.maybeUnhiddenMarkers || (b.maybeUnhiddenMarkers = [])).push(this) } this.lines.push(a) }; Ha.prototype.detachLine = function(a) {
+ this.lines.splice(D(this.lines,
+ a), 1); !this.lines.length && this.doc.cm && (a = this.doc.cm.curOp, (a.maybeHiddenMarkers || (a.maybeHiddenMarkers = [])).push(this))
+ }; var sd = 0, rc = q.SharedTextMarker = function(a, b) { this.markers = a; this.primary = b; for (var c = 0; c < a.length; ++c)a[c].parent = this }; Ya(rc); rc.prototype.clear = function() { if (!this.explicitlyCleared) { this.explicitlyCleared = !0; for (var a = 0; a < this.markers.length; ++a)this.markers[a].clear(); L(this, "clear") } }; rc.prototype.find = function(a, b) { return this.primary.find(a, b) }; var sc = q.LineWidget = function(a,
+ b, c) { if (c) for (var d in c) c.hasOwnProperty(d) && (this[d] = c[d]); this.doc = a; this.node = b }; Ya(sc); sc.prototype.clear = function() { var a = this.doc.cm, b = this.line.widgets, c = this.line, d = F(c); if (null != d && b) { for (var e = 0; e < b.length; ++e)b[e] == this && b.splice(e--, 1); b.length || (c.widgets = null); var f = ub(this); ca(c, Math.max(0, c.height - f)); a && T(a, function() { var b = -f; ea(c) < (a.curOp && a.curOp.scrollTop || a.doc.scrollTop) && lc(a, null, b); na(a, d, "widget") }) } }; sc.prototype.changed = function() {
+ var a = this.height, b = this.doc.cm, c = this.line;
+ this.height = null; var d = ub(this) - a; d && (ca(c, c.height + d), b && T(b, function() { b.curOp.forceUpdate = !0; ea(c) < (b.curOp && b.curOp.scrollTop || b.doc.scrollTop) && lc(b, null, d) }))
+ }; var Ab = q.Line = function(a, b, c) { this.text = a; Ue(this, b); this.height = c ? c(this) : 1 }; Ya(Ab); Ab.prototype.lineNo = function() { return F(this) }; var bg = {}, ag = {}; Bb.prototype = {
+ chunkSize: function() { return this.lines.length }, removeInner: function(a, b) {
+ for (var c = a, d = a + b; c < d; ++c) {
+ var e = this.lines[c]; this.height -= e.height; var f = e; f.parent = null; Te(f); L(e,
+ "delete")
+ } this.lines.splice(a, b)
+ }, collapse: function(a) { a.push.apply(a, this.lines) }, insertInner: function(a, b, c) { this.height += c; this.lines = this.lines.slice(0, a).concat(b).concat(this.lines.slice(a)); for (a = 0; a < b.length; ++a)b[a].parent = this }, iterN: function(a, b, c) { for (b = a + b; a < b; ++a)if (c(this.lines[a])) return !0 }
+ }; Cb.prototype = {
+ chunkSize: function() { return this.size }, removeInner: function(a, b) {
+ this.size -= b; for (var c = 0; c < this.children.length; ++c) {
+ var d = this.children[c], e = d.chunkSize(); if (a < e) {
+ var f = Math.min(b,
+ e - a), g = d.height; d.removeInner(a, f); this.height -= g - d.height; e == f && (this.children.splice(c--, 1), d.parent = null); if (0 == (b -= f)) break; a = 0
+ } else a -= e
+ } 25 > this.size - b && (1 < this.children.length || !(this.children[0] instanceof Bb)) && (c = [], this.collapse(c), this.children = [new Bb(c)], this.children[0].parent = this)
+ }, collapse: function(a) { for (var b = 0; b < this.children.length; ++b)this.children[b].collapse(a) }, insertInner: function(a, b, c) {
+ this.size += b.length; this.height += c; for (var d = 0; d < this.children.length; ++d) {
+ var e = this.children[d],
+ f = e.chunkSize(); if (a <= f) { e.insertInner(a, b, c); if (e.lines && 50 < e.lines.length) { for (; 50 < e.lines.length;)a = e.lines.splice(e.lines.length - 25, 25), a = new Bb(a), e.height -= a.height, this.children.splice(d + 1, 0, a), a.parent = this; this.maybeSpill() } break } a -= f
+ }
+ }, maybeSpill: function() {
+ if (!(10 >= this.children.length)) {
+ var a = this; do {
+ var b = a.children.splice(a.children.length - 5, 5), b = new Cb(b); if (a.parent) { a.size -= b.size; a.height -= b.height; var c = D(a.parent.children, a); a.parent.children.splice(c + 1, 0, b) } else c = new Cb(a.children),
+ c.parent = a, a.children = [c, b], a = c; b.parent = a.parent
+ } while (10 < a.children.length); a.parent.maybeSpill()
+ }
+ }, iterN: function(a, b, c) { for (var d = 0; d < this.children.length; ++d) { var e = this.children[d], f = e.chunkSize(); if (a < f) { f = Math.min(b, f - a); if (e.iterN(a, f, c)) return !0; if (0 == (b -= f)) break; a = 0 } else a -= f } }
+ }; var og = 0, P = q.Doc = function(a, b, c) {
+ if (!(this instanceof P)) return new P(a, b, c); null == c && (c = 0); Cb.call(this, [new Bb([new Ab("", null)])]); this.first = c; this.scrollTop = this.scrollLeft = 0; this.cantEdit = !1; this.cleanGeneration =
+ 1; this.frontier = c; c = r(c, 0); this.sel = ga(c); this.history = new uc(null); this.id = ++og; this.modeOption = b; "string" == typeof a && (a = sa(a)); qd(this, { from: c, to: c, text: a }); H(this, ga(c), ha)
+ }; P.prototype = ff(Cb.prototype, {
+ constructor: P, iter: function(a, b, c) { c ? this.iterN(a - this.first, b - a, c) : this.iterN(this.first, this.first + this.size, a) }, insert: function(a, b) { for (var c = 0, d = 0; d < b.length; ++d)c += b[d].height; this.insertInner(a - this.first, b, c) }, remove: function(a, b) { this.removeInner(a - this.first, b) }, getValue: function(a) {
+ var b =
+ xd(this, this.first, this.first + this.size); return !1 === a ? b : b.join(a || "\n")
+ }, setValue: N(function(a) { var b = r(this.first, 0), c = this.first + this.size - 1; Oa(this, { from: b, to: r(c, u(this, c).text.length), text: sa(a), origin: "setValue", full: !0 }, !0); H(this, ga(b)) }), replaceRange: function(a, b, c, d) { b = w(this, b); c = c ? w(this, c) : b; wb(this, a, b, c, d) }, getRange: function(a, b, c) { a = Da(this, w(this, a), w(this, b)); return !1 === c ? a : a.join(c || "\n") }, getLine: function(a) { return (a = this.getLineHandle(a)) && a.text }, getLineHandle: function(a) {
+ if (qb(this,
+ a)) return u(this, a)
+ }, getLineNumber: function(a) { return F(a) }, getLineHandleVisualStart: function(a) { "number" == typeof a && (a = u(this, a)); return ia(a) }, lineCount: function() { return this.size }, firstLine: function() { return this.first }, lastLine: function() { return this.first + this.size - 1 }, clipPos: function(a) { return w(this, a) }, getCursor: function(a) { var b = this.sel.primary(); return null == a || "head" == a ? b.head : "anchor" == a ? b.anchor : "end" == a || "to" == a || !1 === a ? b.to() : b.from() }, listSelections: function() { return this.sel.ranges },
+ somethingSelected: function() { return this.sel.somethingSelected() }, setCursor: N(function(a, b, c) { a = w(this, "number" == typeof a ? r(a, b || 0) : a); H(this, ga(a, null), c) }), setSelection: N(function(a, b, c) { var d = w(this, a); a = w(this, b || a); H(this, ga(d, a), c) }), extendSelection: N(function(a, b, c) { Ub(this, w(this, a), b && w(this, b), c) }), extendSelections: N(function(a, b) { for (var c = [], d = 0; d < a.length; d++)c[d] = w(this, a[d]); ae(this, c) }), extendSelectionsBy: N(function(a, b) { ae(this, ob(this.sel.ranges, a), b) }), setSelections: N(function(a,
+ b, c) { if (a.length) { for (var d = 0, e = []; d < a.length; d++)e[d] = new z(w(this, a[d].anchor), w(this, a[d].head)); null == b && (b = Math.min(a.length - 1, this.sel.primIndex)); H(this, Z(e, b), c) } }), addSelection: N(function(a, b, c) { var d = this.sel.ranges.slice(0); d.push(new z(w(this, a), w(this, b || a))); H(this, Z(d, d.length - 1), c) }), getSelection: function(a) { for (var b = this.sel.ranges, c, d = 0; d < b.length; d++) { var e = Da(this, b[d].from(), b[d].to()); c = c ? c.concat(e) : e } return !1 === a ? c : c.join(a || "\n") }, getSelections: function(a) {
+ for (var b = [], c =
+ this.sel.ranges, d = 0; d < c.length; d++) { var e = Da(this, c[d].from(), c[d].to()); !1 !== a && (e = e.join(a || "\n")); b[d] = e } return b
+ }, replaceSelection: function(a, b, c) { for (var d = [], e = 0; e < this.sel.ranges.length; e++)d[e] = a; this.replaceSelections(d, b, c || "+input") }, replaceSelections: N(function(a, b, c) {
+ for (var d = [], e = this.sel, f = 0; f < e.ranges.length; f++) { var g = e.ranges[f]; d[f] = { from: g.from(), to: g.to(), text: sa(a[f]), origin: c } } if (f = b && "end" != b) {
+ f = []; c = a = r(this.first, 0); for (e = 0; e < d.length; e++) {
+ var h = d[e], g = Ee(h.from, a, c), k =
+ Ee(ta(h), a, c); a = h.to; c = k; "around" == b ? (h = this.sel.ranges[e], h = 0 > y(h.head, h.anchor), f[e] = new z(h ? k : g, h ? g : k)) : f[e] = new z(g, g)
+ } f = new la(f, this.sel.primIndex)
+ } b = f; for (f = d.length - 1; 0 <= f; f--)Oa(this, d[f]); b ? be(this, b) : this.cm && Pa(this.cm)
+ }), undo: N(function() { kc(this, "undo") }), redo: N(function() { kc(this, "redo") }), undoSelection: N(function() { kc(this, "undo", !0) }), redoSelection: N(function() { kc(this, "redo", !0) }), setExtending: function(a) { this.extend = a }, getExtending: function() { return this.extend }, historySize: function() {
+ for (var a =
+ this.history, b = 0, c = 0, d = 0; d < a.done.length; d++)a.done[d].ranges || ++b; for (d = 0; d < a.undone.length; d++)a.undone[d].ranges || ++c; return { undo: b, redo: c }
+ }, clearHistory: function() { this.history = new uc(this.history.maxGeneration) }, markClean: function() { this.cleanGeneration = this.changeGeneration(!0) }, changeGeneration: function(a) { a && (this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null); return this.history.generation }, isClean: function(a) { return this.history.generation == (a || this.cleanGeneration) },
+ getHistory: function() { return { done: Xa(this.history.done), undone: Xa(this.history.undone) } }, setHistory: function(a) { var b = this.history = new uc(this.history.maxGeneration); b.done = Xa(a.done.slice(0), null, !0); b.undone = Xa(a.undone.slice(0), null, !0) }, addLineClass: N(function(a, b, c) { return nc(this, a, "gutter" == b ? "gutter" : "class", function(a) { var e = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass"; if (a[e]) { if (Fb(c).test(a[e])) return !1; a[e] += " " + c } else a[e] = c; return !0 }) }), removeLineClass: N(function(a,
+ b, c) { return nc(this, a, "gutter" == b ? "gutter" : "class", function(a) { var e = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass", f = a[e]; if (f) if (null == c) a[e] = null; else { var g = f.match(Fb(c)); if (!g) return !1; var h = g.index + g[0].length; a[e] = f.slice(0, g.index) + (g.index && h != f.length ? " " : "") + f.slice(h) || null } else return !1; return !0 }) }), addLineWidget: N(function(a, b, c) { return $f(this, a, b, c) }), removeLineWidget: function(a) { a.clear() }, markText: function(a, b, c) {
+ return Wa(this, w(this, a), w(this,
+ b), c, "range")
+ }, setBookmark: function(a, b) { var c = { replacedWith: b && (null == b.nodeType ? b.widget : b), insertLeft: b && b.insertLeft, clearWhenEmpty: !1, shared: b && b.shared, handleMouseEvents: b && b.handleMouseEvents }; a = w(this, a); return Wa(this, a, a, c, "bookmark") }, findMarksAt: function(a) { a = w(this, a); var b = [], c = u(this, a.line).markedSpans; if (c) for (var d = 0; d < c.length; ++d) { var e = c[d]; (null == e.from || e.from <= a.ch) && (null == e.to || e.to >= a.ch) && b.push(e.marker.parent || e.marker) } return b }, findMarks: function(a, b, c) {
+ a = w(this, a);
+ b = w(this, b); var d = [], e = a.line; this.iter(a.line, b.line + 1, function(f) { if (f = f.markedSpans) for (var g = 0; g < f.length; g++) { var h = f[g]; e == a.line && a.ch > h.to || null == h.from && e != a.line || e == b.line && h.from > b.ch || c && !c(h.marker) || d.push(h.marker.parent || h.marker) } ++e }); return d
+ }, getAllMarks: function() { var a = []; this.iter(function(b) { if (b = b.markedSpans) for (var c = 0; c < b.length; ++c)null != b[c].from && a.push(b[c].marker) }); return a }, posFromIndex: function(a) {
+ var b, c = this.first; this.iter(function(d) {
+ d = d.text.length + 1; if (d >
+ a) return b = a, !0; a -= d; ++c
+ }); return w(this, r(c, b))
+ }, indexFromPos: function(a) { a = w(this, a); var b = a.ch; if (a.line < this.first || 0 > a.ch) return 0; this.iter(this.first, a.line, function(a) { b += a.text.length + 1 }); return b }, copy: function(a) { var b = new P(xd(this, this.first, this.first + this.size), this.modeOption, this.first); b.scrollTop = this.scrollTop; b.scrollLeft = this.scrollLeft; b.sel = this.sel; b.extend = !1; a && (b.history.undoDepth = this.history.undoDepth, b.setHistory(this.getHistory())); return b }, linkedDoc: function(a) {
+ a ||
+ (a = {}); var b = this.first, c = this.first + this.size; null != a.from && a.from > b && (b = a.from); null != a.to && a.to < c && (c = a.to); b = new P(xd(this, b, c), a.mode || this.modeOption, b); a.sharedHist && (b.history = this.history); (this.linked || (this.linked = [])).push({ doc: b, sharedHist: a.sharedHist }); b.linked = [{ doc: this, isParent: !0, sharedHist: a.sharedHist }]; a = Re(this); for (c = 0; c < a.length; c++) { var d = a[c], e = d.find(), f = b.clipPos(e.from), e = b.clipPos(e.to); y(f, e) && (f = Wa(b, f, e, d.primary, d.primary.type), d.markers.push(f), f.parent = d) } return b
+ },
+ unlinkDoc: function(a) { a instanceof q && (a = a.doc); if (this.linked) for (var b = 0; b < this.linked.length; ++b)if (this.linked[b].doc == a) { this.linked.splice(b, 1); a.unlinkDoc(this); Yf(Re(this)); break } if (a.history == this.history) { var c = [a.id]; Ga(a, function(a) { c.push(a.id) }, !0); a.history = new uc(null); a.history.done = Xa(this.history.done, c); a.history.undone = Xa(this.history.undone, c) } }, iterLinkedDocs: function(a) { Ga(this, a) }, getMode: function() { return this.mode }, getEditor: function() { return this.cm }
+ }); P.prototype.eachLine =
+ P.prototype.iter; var pg = ["iter", "insert", "remove", "copy", "getEditor"], Jb; for (Jb in P.prototype) P.prototype.hasOwnProperty(Jb) && 0 > D(pg, Jb) && (q.prototype[Jb] = function(a) { return function() { return a.apply(this.doc, arguments) } }(P.prototype[Jb])); Ya(P); var O = q.e_preventDefault = function(a) { a.preventDefault ? a.preventDefault() : a.returnValue = !1 }, qg = q.e_stopPropagation = function(a) { a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0 }, jd = q.e_stop = function(a) { O(a); qg(a) }, v = q.on = function(a, b, c) {
+ a.addEventListener ?
+ a.addEventListener(b, c, !1) : a.attachEvent ? a.attachEvent("on" + b, c) : (a = a._handlers || (a._handlers = {}), (a[b] || (a[b] = [])).push(c))
+ }, ka = q.off = function(a, b, c) { if (a.removeEventListener) a.removeEventListener(b, c, !1); else if (a.detachEvent) a.detachEvent("on" + b, c); else if (a = a._handlers && a._handlers[b]) for (b = 0; b < a.length; ++b)if (a[b] == c) { a.splice(b, 1); break } }, K = q.signal = function(a, b) { var c = a._handlers && a._handlers[b]; if (c) for (var d = Array.prototype.slice.call(arguments, 2), e = 0; e < c.length; ++e)c[e].apply(null, d) }, Db =
+ null, Hd = 30, Ae = q.Pass = { toString: function() { return "CodeMirror.Pass" } }, ha = { scroll: !1 }, kd = { origin: "*mouse" }, Gb = { origin: "+move" }; bb.prototype.set = function(a, b) { clearTimeout(this.id); this.id = setTimeout(b, a) }; var aa = q.countColumn = function(a, b, c, d, e) { null == b && (b = a.search(/[^\s\u00a0]/), -1 == b && (b = a.length)); d = d || 0; for (e = e || 0; ;) { var f = a.indexOf("\t", d); if (0 > f || f >= b) return e + (b - d); e += f - d; e += c - e % c; d = f + 1 } }, vc = [""], Za = function(a) { a.select() }; Qa ? Za = function(a) { a.selectionStart = 0; a.selectionEnd = a.value.length } : B &&
+ (Za = function(a) { try { a.select() } catch (b) { } }); var rg = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/, gf = q.isWordChar = function(a) { return /\w/.test(a) || "€" < a && (a.toUpperCase() != a.toLowerCase() || rg.test(a)) }, ig = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,
+ Ea; Ea = document.createRange ? function(a, b, c, d) { var e = document.createRange(); e.setEnd(d || a, c); e.setStart(a, b); return e } : function(a, b, c) { var d = document.body.createTextRange(); try { d.moveToElementText(a.parentNode) } catch (e) { return d } d.collapse(!0); d.moveEnd("character", c); d.moveStart("character", b); return d }; var Wc = q.contains = function(a, b) { 3 == b.nodeType && (b = b.parentNode); if (a.contains) return a.contains(b); do if (11 == b.nodeType && (b = b.host), b == a) return !0; while (b = b.parentNode) }; B && 11 > C && (fa = function() { try { return document.activeElement } catch (a) { return document.body } });
+ var kb = q.rmClass = function(a, b) { var c = a.className, d = Fb(b).exec(c); if (d) { var e = c.slice(d.index + d[0].length); a.className = c.slice(0, d.index) + (e ? d[1] + e : "") } }, mb = q.addClass = function(a, b) { var c = a.className; Fb(b).test(c) || (a.className += (c ? " " : "") + b) }, Dd = !1, Lf = function() { if (B && 9 > C) return !1; var a = t("div"); return "draggable" in a || "dragDrop" in a }(), yd, vd, sa = q.splitLines = 3 != "\n\nb".split(/\n/).length ? function(a) {
+ for (var b = 0, c = [], d = a.length; b <= d;) {
+ var e = a.indexOf("\n", b); -1 == e && (e = a.length); var f = a.slice(b, "\r" ==
+ a.charAt(e - 1) ? e - 1 : e), g = f.indexOf("\r"); -1 != g ? (c.push(f.slice(0, g)), b += g + 1) : (c.push(f), b = e + 1)
+ } return c
+ } : function(a) { return a.split(/\r\n?|\n/) }, ng = window.getSelection ? function(a) { try { return a.selectionStart != a.selectionEnd } catch (b) { return !1 } } : function(a) { try { var b = a.ownerDocument.selection.createRange() } catch (c) { } return b && b.parentElement() == a ? 0 != b.compareEndPoints("StartToEnd", b) : !1 }, Ce = function() { var a = t("div"); if ("oncopy" in a) return !0; a.setAttribute("oncopy", "return;"); return "function" == typeof a.oncopy }(),
+ bd = null, va = {
+ 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", 46: "Delete", 59: ";", 61: "\x3d", 91: "Mod", 92: "Mod", 93: "Mod", 107: "\x3d", 109: "-", 127: "Delete", 173: "-", 186: ";", 187: "\x3d", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", 63273: "Home",
+ 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
+ }; q.keyNames = va; (function() { for (var a = 0; 10 > a; a++)va[a + 48] = va[a + 96] = String(a); for (a = 65; 90 >= a; a++)va[a] = String.fromCharCode(a); for (a = 1; 12 >= a; a++)va[a + 111] = va[a + 63235] = "F" + a })(); var vb, gg = function() {
+ function a(a) {
+ return 247 >= a ? "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN".charAt(a) :
+ 1424 <= a && 1524 >= a ? "R" : 1536 <= a && 1773 >= a ? "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm".charAt(a - 1536) : 1774 <= a && 2220 >= a ? "r" : 8192 <= a && 8203 >= a ? "w" : 8204 == a ? "b" : "L"
+ } function b(a, b, c) { this.level = a; this.from = b; this.to = c } var c = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/, d = /[stwN]/, e = /[LRr]/, f = /[Lb1n]/, g = /[1n]/; return function(h) {
+ if (!c.test(h)) return !1;
+ for (var k = h.length, l = [], m = 0, p; m < k; ++m)l.push(a(h.charCodeAt(m))); for (var m = 0, n = "L"; m < k; ++m)p = l[m], "m" == p ? l[m] = n : n = p; m = 0; for (n = "L"; m < k; ++m)p = l[m], "1" == p && "r" == n ? l[m] = "n" : e.test(p) && (n = p, "r" == p && (l[m] = "R")); m = 1; for (n = l[0]; m < k - 1; ++m)p = l[m], "+" == p && "1" == n && "1" == l[m + 1] ? l[m] = "1" : "," != p || n != l[m + 1] || "1" != n && "n" != n || (l[m] = n), n = p; for (m = 0; m < k; ++m)if (p = l[m], "," == p) l[m] = "N"; else if ("%" == p) { for (n = m + 1; n < k && "%" == l[n]; ++n); var q = m && "!" == l[m - 1] || n < k && "1" == l[n] ? "1" : "N"; for (p = m; p < n; ++p)l[p] = q; m = n - 1 } m = 0; for (n = "L"; m < k; ++m)p =
+ l[m], "L" == n && "1" == p ? l[m] = "L" : e.test(p) && (n = p); for (m = 0; m < k; ++m)if (d.test(l[m])) { for (n = m + 1; n < k && d.test(l[n]); ++n); p = "L" == (n < k ? l[n] : "L"); q = "L" == (m ? l[m - 1] : "L") || p ? "L" : "R"; for (p = m; p < n; ++p)l[p] = q; m = n - 1 } for (var n = [], r, m = 0; m < k;)if (f.test(l[m])) { p = m; for (++m; m < k && f.test(l[m]); ++m); n.push(new b(0, p, m)) } else {
+ var t = m, q = n.length; for (++m; m < k && "L" != l[m]; ++m); for (p = t; p < m;)if (g.test(l[p])) { t < p && n.splice(q, 0, new b(1, t, p)); t = p; for (++p; p < m && g.test(l[p]); ++p); n.splice(q, 0, new b(2, t, p)); t = p } else ++p; t < m && n.splice(q, 0, new b(1,
+ t, m))
+ } 1 == n[0].level && (r = h.match(/^\s+/)) && (n[0].from = r[0].length, n.unshift(new b(0, 0, r[0].length))); 1 == A(n).level && (r = h.match(/\s+$/)) && (A(n).to -= r[0].length, n.push(new b(0, k - r[0].length, k))); 2 == n[0].level && n.unshift(new b(1, n[0].to, n[0].to)); n[0].level != A(n).level && n.push(new b(n[0].level, k, k)); return n
+ }
+ }(); q.version = "5.2.0"; return q
+}); \ No newline at end of file
diff --git a/samples/toolbarconfigurator/lib/codemirror/javascript.js b/samples/toolbarconfigurator/lib/codemirror/javascript.js
new file mode 100755
index 0000000..7c44a9c
--- /dev/null
+++ b/samples/toolbarconfigurator/lib/codemirror/javascript.js
@@ -0,0 +1,79 @@
+(function(p) { "object" == typeof exports && "object" == typeof module ? p(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], p) : p(CodeMirror) })(function(p) {
+ p.defineMode("javascript", function(oa, t) {
+ function q(a, c, e) { E = a; I = e; return c } function w(a, c) {
+ var e = a.next(); if ('"' == e || "'" == e) return c.tokenize = pa(e), c.tokenize(a, c); if ("." == e && a.match(/^\d+(?:[eE][+\-]?\d+)?/)) return q("number", "number"); if ("." == e && a.match("..")) return q("spread", "meta"); if (/[\[\]{}\(\),;\:\.]/.test(e)) return q(e);
+ if ("\x3d" == e && a.eat("\x3e")) return q("\x3d\x3e", "operator"); if ("0" == e && a.eat(/x/i)) return a.eatWhile(/[\da-f]/i), q("number", "number"); if (/\d/.test(e)) return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/), q("number", "number"); if ("/" == e) {
+ if (a.eat("*")) return c.tokenize = J, J(a, c); if (a.eat("/")) return a.skipToEnd(), q("comment", "comment"); if ("operator" == c.lastType || "keyword c" == c.lastType || "sof" == c.lastType || /^[\[{}\(,;:]$/.test(c.lastType)) {
+ a: for (var e = !1, d, b = !1; null != (d = a.next());) {
+ if (!e) {
+ if ("/" == d && !b) break a;
+ "[" == d ? b = !0 : b && "]" == d && (b = !1)
+ } e = !e && "\\" == d
+ } a.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/); return q("regexp", "string-2")
+ } a.eatWhile(K); return q("operator", "operator", a.current())
+ } if ("`" == e) return c.tokenize = Q, Q(a, c); if ("#" == e) return a.skipToEnd(), q("error", "error"); if (K.test(e)) return a.eatWhile(K), q("operator", "operator", a.current()); if (R.test(e)) return a.eatWhile(R), e = a.current(), (d = ba.propertyIsEnumerable(e) && ba[e]) && "." != c.lastType ? q(d.type, d.style, e) : q("variable", "variable", e)
+ } function pa(a) {
+ return function(c,
+ e) { var d = !1, b; if (L && "@" == c.peek() && c.match(qa)) return e.tokenize = w, q("jsonld-keyword", "meta"); for (; null != (b = c.next()) && (b != a || d);)d = !d && "\\" == b; d || (e.tokenize = w); return q("string", "string") }
+ } function J(a, c) { for (var e = !1, d; d = a.next();) { if ("/" == d && e) { c.tokenize = w; break } e = "*" == d } return q("comment", "comment") } function Q(a, c) { for (var e = !1, d; null != (d = a.next());) { if (!e && ("`" == d || "$" == d && a.eat("{"))) { c.tokenize = w; break } e = !e && "\\" == d } return q("quasi", "string-2", a.current()) } function S(a, c) {
+ c.fatArrowAt && (c.fatArrowAt =
+ null); var e = a.string.indexOf("\x3d\x3e", a.start); if (!(0 > e)) { for (var d = 0, b = !1, e = e - 1; 0 <= e; --e) { var f = a.string.charAt(e), g = "([{}])".indexOf(f); if (0 <= g && 3 > g) { if (!d) { ++e; break } if (0 == --d) break } else if (3 <= g && 6 > g) ++d; else if (R.test(f)) b = !0; else { if (/["'\/]/.test(f)) return; if (b && !d) { ++e; break } } } b && !d && (c.fatArrowAt = e) }
+ } function ca(a, c, b, d, f, h) { this.indented = a; this.column = c; this.type = b; this.prev = f; this.info = h; null != d && (this.align = d) } function g() { for (var a = arguments.length - 1; 0 <= a; a--)f.cc.push(arguments[a]) }
+ function b() { g.apply(null, arguments); return !0 } function x(a) { function c(c) { for (; c; c = c.next)if (c.name == a) return !0; return !1 } var b = f.state; b.context ? (f.marked = "def", c(b.localVars) || (b.localVars = { name: a, next: b.localVars })) : !c(b.globalVars) && t.globalVars && (b.globalVars = { name: a, next: b.globalVars }) } function y() { f.state.context = { prev: f.state.context, vars: f.state.localVars }; f.state.localVars = ra } function z() { f.state.localVars = f.state.context.vars; f.state.context = f.state.context.prev } function l(a, c) {
+ var b = function() {
+ var b =
+ f.state, e = b.indented; if ("stat" == b.lexical.type) e = b.lexical.indented; else for (var h = b.lexical; h && ")" == h.type && h.align; h = h.prev)e = h.indented; b.lexical = new ca(e, f.stream.column(), a, null, b.lexical, c)
+ }; b.lex = !0; return b
+ } function k() { var a = f.state; a.lexical.prev && (")" == a.lexical.type && (a.indented = a.lexical.indented), a.lexical = a.lexical.prev) } function m(a) { function c(e) { return e == a ? b() : ";" == a ? g() : b(c) } return c } function r(a, c) {
+ return "var" == a ? b(l("vardef", c.length), T, m(";"), k) : "keyword a" == a ? b(l("form"), n,
+ r, k) : "keyword b" == a ? b(l("form"), r, k) : "{" == a ? b(l("}"), U, k) : ";" == a ? b() : "if" == a ? ("else" == f.state.lexical.info && f.state.cc[f.state.cc.length - 1] == k && f.state.cc.pop()(), b(l("form"), n, r, k, da)) : "function" == a ? b(v) : "for" == a ? b(l("form"), ea, r, k) : "variable" == a ? b(l("stat"), sa) : "switch" == a ? b(l("form"), n, l("}", "switch"), m("{"), U, k, k) : "case" == a ? b(n, m(":")) : "default" == a ? b(m(":")) : "catch" == a ? b(l("form"), y, m("("), V, m(")"), r, k, z) : "module" == a ? b(l("form"), y, ta, z, k) : "class" == a ? b(l("form"), ua, k) : "export" == a ? b(l("form"), va,
+ k) : "import" == a ? b(l("form"), wa, k) : g(l("stat"), n, m(";"), k)
+ } function n(a) { return fa(a, !1) } function u(a) { return fa(a, !0) } function fa(a, c) {
+ if (f.state.fatArrowAt == f.stream.start) { var e = c ? ga : ha; if ("(" == a) return b(y, l(")"), F(A, ")"), k, m("\x3d\x3e"), e, z); if ("variable" == a) return g(y, A, m("\x3d\x3e"), e, z) } e = c ? W : M; return xa.hasOwnProperty(a) ? b(e) : "function" == a ? b(v, e) : "keyword c" == a ? b(c ? ia : X) : "(" == a ? b(l(")"), X, N, m(")"), k, e) : "operator" == a || "spread" == a ? b(c ? u : n) : "[" == a ? b(l("]"), ya, k, e) : "{" == a ? G(za, "}", null, e) : "quasi" ==
+ a ? g(O, e) : b()
+ } function X(a) { return a.match(/[;\}\)\],]/) ? g() : g(n) } function ia(a) { return a.match(/[;\}\)\],]/) ? g() : g(u) } function M(a, c) { return "," == a ? b(n) : W(a, c, !1) } function W(a, c, e) { var d = 0 == e ? M : W, f = 0 == e ? n : u; if ("\x3d\x3e" == a) return b(y, e ? ga : ha, z); if ("operator" == a) return /\+\+|--/.test(c) ? b(d) : "?" == c ? b(n, m(":"), f) : b(f); if ("quasi" == a) return g(O, d); if (";" != a) { if ("(" == a) return G(u, ")", "call", d); if ("." == a) return b(Aa, d); if ("[" == a) return b(l("]"), X, m("]"), k, d) } } function O(a, c) {
+ return "quasi" != a ? g() : "${" != c.slice(c.length -
+ 2) ? b(O) : b(n, Ba)
+ } function Ba(a) { if ("}" == a) return f.marked = "string-2", f.state.tokenize = Q, b(O) } function ha(a) { S(f.stream, f.state); return g("{" == a ? r : n) } function ga(a) { S(f.stream, f.state); return g("{" == a ? r : u) } function sa(a) { return ":" == a ? b(k, r) : g(M, m(";"), k) } function Aa(a) { if ("variable" == a) return f.marked = "property", b() } function za(a, c) {
+ if ("variable" == a || "keyword" == f.style) return f.marked = "property", "get" == c || "set" == c ? b(Ca) : b(H); if ("number" == a || "string" == a) return f.marked = L ? "property" : f.style + " property",
+ b(H); if ("jsonld-keyword" == a) return b(H); if ("[" == a) return b(n, m("]"), H)
+ } function Ca(a) { if ("variable" != a) return g(H); f.marked = "property"; return b(v) } function H(a) { if (":" == a) return b(u); if ("(" == a) return g(v) } function F(a, c) { function e(d) { return "," == d ? (d = f.state.lexical, "call" == d.info && (d.pos = (d.pos || 0) + 1), b(a, e)) : d == c ? b() : b(m(c)) } return function(d) { return d == c ? b() : g(a, e) } } function G(a, c, e) { for (var d = 3; d < arguments.length; d++)f.cc.push(arguments[d]); return b(l(c, e), F(a, c), k) } function U(a) {
+ return "}" == a ?
+ b() : g(r, U)
+ } function ja(a) { if (ka && ":" == a) return b(Da) } function Da(a) { if ("variable" == a) return f.marked = "variable-3", b() } function T() { return g(A, ja, Y, Ea) } function A(a, c) { if ("variable" == a) return x(c), b(); if ("[" == a) return G(A, "]"); if ("{" == a) return G(Fa, "}") } function Fa(a, c) { if ("variable" == a && !f.stream.match(/^\s*:/, !1)) return x(c), b(Y); "variable" == a && (f.marked = "property"); return b(m(":"), A, Y) } function Y(a, c) { if ("\x3d" == c) return b(u) } function Ea(a) { if ("," == a) return b(T) } function da(a, c) {
+ if ("keyword b" ==
+ a && "else" == c) return b(l("form", "else"), r, k)
+ } function ea(a) { if ("(" == a) return b(l(")"), Ga, m(")"), k) } function Ga(a) { return "var" == a ? b(T, m(";"), P) : ";" == a ? b(P) : "variable" == a ? b(Ha) : g(n, m(";"), P) } function Ha(a, c) { return "in" == c || "of" == c ? (f.marked = "keyword", b(n)) : b(M, P) } function P(a, c) { return ";" == a ? b(la) : "in" == c || "of" == c ? (f.marked = "keyword", b(n)) : g(n, m(";"), la) } function la(a) { ")" != a && b(n) } function v(a, c) {
+ if ("*" == c) return f.marked = "keyword", b(v); if ("variable" == a) return x(c), b(v); if ("(" == a) return b(y, l(")"),
+ F(V, ")"), k, r, z)
+ } function V(a) { return "spread" == a ? b(V) : g(A, ja) } function ua(a, c) { if ("variable" == a) return x(c), b(ma) } function ma(a, c) { if ("extends" == c) return b(n, ma); if ("{" == a) return b(l("}"), B, k) } function B(a, c) { if ("variable" == a || "keyword" == f.style) { if ("static" == c) return f.marked = "keyword", b(B); f.marked = "property"; return "get" == c || "set" == c ? b(Ia, v, B) : b(v, B) } if ("*" == c) return f.marked = "keyword", b(B); if (";" == a) return b(B); if ("}" == a) return b() } function Ia(a) {
+ if ("variable" != a) return g(); f.marked = "property";
+ return b()
+ } function ta(a, c) { if ("string" == a) return b(r); if ("variable" == a) return x(c), b(Z) } function va(a, c) { return "*" == c ? (f.marked = "keyword", b(Z, m(";"))) : "default" == c ? (f.marked = "keyword", b(n, m(";"))) : g(r) } function wa(a) { return "string" == a ? b() : g(aa, Z) } function aa(a, c) { if ("{" == a) return G(aa, "}"); "variable" == a && x(c); "*" == c && (f.marked = "keyword"); return b(Ja) } function Ja(a, c) { if ("as" == c) return f.marked = "keyword", b(aa) } function Z(a, c) { if ("from" == c) return f.marked = "keyword", b(n) } function ya(a) {
+ return "]" == a ?
+ b() : g(u, Ka)
+ } function Ka(a) { return "for" == a ? g(N, m("]")) : "," == a ? b(F(ia, "]")) : g(F(u, "]")) } function N(a) { if ("for" == a) return b(ea, N); if ("if" == a) return b(n, N) } var C = oa.indentUnit, na = t.statementIndent, L = t.jsonld, D = t.json || L, ka = t.typescript, R = t.wordCharacters || /[\w$\xa1-\uffff]/, ba = function() {
+ function a(a) { return { type: a, style: "keyword" } } var c = a("keyword a"), b = a("keyword b"), d = a("keyword c"), f = a("operator"), h = { type: "atom", style: "atom" }, c = {
+ "if": a("if"), "while": c, "with": c, "else": b, "do": b, "try": b, "finally": b,
+ "return": d, "break": d, "continue": d, "new": d, "delete": d, "throw": d, "debugger": d, "var": a("var"), "const": a("var"), let: a("var"), "function": a("function"), "catch": a("catch"), "for": a("for"), "switch": a("switch"), "case": a("case"), "default": a("default"), "in": f, "typeof": f, "instanceof": f, "true": h, "false": h, "null": h, undefined: h, NaN: h, Infinity: h, "this": a("this"), module: a("module"), "class": a("class"), "super": a("atom"), yield: d, "export": a("export"), "import": a("import"), "extends": d
+ }; if (ka) {
+ var b = { type: "variable", style: "variable-3" },
+ b = { "interface": a("interface"), "extends": a("extends"), constructor: a("constructor"), "public": a("public"), "private": a("private"), "protected": a("protected"), "static": a("static"), string: b, number: b, bool: b, any: b }, g; for (g in b) c[g] = b[g]
+ } return c
+ }(), K = /[+\-*&%=<>!?|~^]/, qa = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/, E, I, xa = { atom: !0, number: !0, variable: !0, string: !0, regexp: !0, "this": !0, "jsonld-keyword": !0 }, f = { state: null, column: null, marked: null, cc: null }, ra = {
+ name: "this",
+ next: { name: "arguments" }
+ }; k.lex = !0; return {
+ startState: function(a) { a = { tokenize: w, lastType: "sof", cc: [], lexical: new ca((a || 0) - C, 0, "block", !1), localVars: t.localVars, context: t.localVars && { vars: t.localVars }, indented: 0 }; t.globalVars && "object" == typeof t.globalVars && (a.globalVars = t.globalVars); return a }, token: function(a, b) {
+ a.sol() && (b.lexical.hasOwnProperty("align") || (b.lexical.align = !1), b.indented = a.indentation(), S(a, b)); if (b.tokenize != J && a.eatSpace()) return null; var e = b.tokenize(a, b); if ("comment" == E) return e;
+ b.lastType = "operator" != E || "++" != I && "--" != I ? E : "incdec"; a: { var d = E, g = I, h = b.cc; f.state = b; f.stream = a; f.marked = null; f.cc = h; f.style = e; b.lexical.hasOwnProperty("align") || (b.lexical.align = !0); for (; ;)if ((h.length ? h.pop() : D ? n : r)(d, g)) { for (; h.length && h[h.length - 1].lex;)h.pop()(); if (f.marked) { e = f.marked; break a } if (d = "variable" == d) b: { for (d = b.localVars; d; d = d.next)if (d.name == g) { d = !0; break b } for (h = b.context; h; h = h.prev)for (d = h.vars; d; d = d.next)if (d.name == g) { d = !0; break b } d = void 0 } if (d) { e = "variable-2"; break a } break a } } return e
+ },
+ indent: function(a, b) {
+ if (a.tokenize == J) return p.Pass; if (a.tokenize != w) return 0; var e = b && b.charAt(0), d = a.lexical; if (!/^\s*else\b/.test(b)) for (var f = a.cc.length - 1; 0 <= f; --f) { var g = a.cc[f]; if (g == k) d = d.prev; else if (g != da) break } "stat" == d.type && "}" == e && (d = d.prev); na && ")" == d.type && "stat" == d.prev.type && (d = d.prev); f = d.type; g = e == f; return "vardef" == f ? d.indented + ("operator" == a.lastType || "," == a.lastType ? d.info + 1 : 0) : "form" == f && "{" == e ? d.indented : "form" == f ? d.indented + C : "stat" == f ? (e = d.indented, d = "operator" == a.lastType ||
+ "," == a.lastType || K.test(b.charAt(0)) || /[,.]/.test(b.charAt(0)), e + (d ? na || C : 0)) : "switch" != d.info || g || 0 == t.doubleIndentSwitch ? d.align ? d.column + (g ? 0 : 1) : d.indented + (g ? 0 : C) : d.indented + (/^(?:case|default)\b/.test(b) ? C : 2 * C)
+ }, electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, blockCommentStart: D ? null : "/*", blockCommentEnd: D ? null : "*/", lineComment: D ? null : "//", fold: "brace", closeBrackets: "()[]{}''\"\"``", helperType: D ? "json" : "javascript", jsonldMode: L, jsonMode: D
+ }
+ }); p.registerHelper("wordChars", "javascript", /[\w$]/);
+ p.defineMIME("text/javascript", "javascript"); p.defineMIME("text/ecmascript", "javascript"); p.defineMIME("application/javascript", "javascript"); p.defineMIME("application/x-javascript", "javascript"); p.defineMIME("application/ecmascript", "javascript"); p.defineMIME("application/json", { name: "javascript", json: !0 }); p.defineMIME("application/x-json", { name: "javascript", json: !0 }); p.defineMIME("application/ld+json", { name: "javascript", jsonld: !0 }); p.defineMIME("text/typescript", { name: "javascript", typescript: !0 });
+ p.defineMIME("application/typescript", { name: "javascript", typescript: !0 })
+}); \ No newline at end of file
diff --git a/samples/toolbarconfigurator/lib/codemirror/neo.css b/samples/toolbarconfigurator/lib/codemirror/neo.css
new file mode 100755
index 0000000..89e4fe8
--- /dev/null
+++ b/samples/toolbarconfigurator/lib/codemirror/neo.css
@@ -0,0 +1,63 @@
+/* neo theme for codemirror */
+
+/* Color scheme */
+
+.cm-s-neo.CodeMirror {
+ background-color: #ffffff;
+ color: #2e383c;
+ line-height: 1.4375;
+}
+
+.cm-s-neo .cm-comment {
+ color: #75787b
+}
+
+.cm-s-neo .cm-keyword,
+.cm-s-neo .cm-property {
+ color: #1d75b3
+}
+
+.cm-s-neo .cm-atom,
+.cm-s-neo .cm-number {
+ color: #75438a
+}
+
+.cm-s-neo .cm-node,
+.cm-s-neo .cm-tag {
+ color: #9c3328
+}
+
+.cm-s-neo .cm-string {
+ color: #b35e14
+}
+
+.cm-s-neo .cm-variable,
+.cm-s-neo .cm-qualifier {
+ color: #047d65
+}
+
+
+/* Editor styling */
+
+.cm-s-neo pre {
+ padding: 0;
+}
+
+.cm-s-neo .CodeMirror-gutters {
+ border: none;
+ border-right: 10px solid transparent;
+ background-color: transparent;
+}
+
+.cm-s-neo .CodeMirror-linenumber {
+ padding: 0;
+ color: #e0e2e5;
+}
+
+.cm-s-neo .CodeMirror-guttermarker {
+ color: #1d75b3;
+}
+
+.cm-s-neo .CodeMirror-guttermarker-subtle {
+ color: #e0e2e5;
+} \ No newline at end of file
diff --git a/samples/toolbarconfigurator/lib/codemirror/show-hint.css b/samples/toolbarconfigurator/lib/codemirror/show-hint.css
new file mode 100755
index 0000000..9ca95e7
--- /dev/null
+++ b/samples/toolbarconfigurator/lib/codemirror/show-hint.css
@@ -0,0 +1,38 @@
+.CodeMirror-hints {
+ position: absolute;
+ z-index: 10;
+ overflow: hidden;
+ list-style: none;
+
+ margin: 0;
+ padding: 2px;
+
+ -webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, .2);
+ -moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, .2);
+ box-shadow: 2px 3px 5px rgba(0, 0, 0, .2);
+ border-radius: 3px;
+ border: 1px solid silver;
+
+ background: white;
+ font-size: 90%;
+ font-family: monospace;
+
+ max-height: 20em;
+ overflow-y: auto;
+}
+
+.CodeMirror-hint {
+ margin: 0;
+ padding: 0 4px;
+ border-radius: 2px;
+ max-width: 19em;
+ overflow: hidden;
+ white-space: pre;
+ color: black;
+ cursor: pointer;
+}
+
+li.CodeMirror-hint-active {
+ background: #08f;
+ color: white;
+} \ No newline at end of file
diff --git a/samples/toolbarconfigurator/lib/codemirror/show-hint.js b/samples/toolbarconfigurator/lib/codemirror/show-hint.js
new file mode 100755
index 0000000..cc08471
--- /dev/null
+++ b/samples/toolbarconfigurator/lib/codemirror/show-hint.js
@@ -0,0 +1,48 @@
+(function(f) { "object" == typeof exports && "object" == typeof module ? f(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], f) : f(CodeMirror) })(function(f) {
+ function p(a, b) { this.cm = a; this.options = this.buildOptions(b); this.widget = null; this.tick = this.debounce = 0; this.startPos = this.cm.getCursor(); this.startLen = this.cm.getLine(this.startPos.line).length; var c = this; a.on("cursorActivity", this.activityFunc = function() { c.cursorActivity() }) } function w(a, b) {
+ function c(a,
+ c) { var d; d = "string" != typeof c ? function(a) { return c(a, b) } : e.hasOwnProperty(c) ? e[c] : c; f[a] = d } var e = { Up: function() { b.moveFocus(-1) }, Down: function() { b.moveFocus(1) }, PageUp: function() { b.moveFocus(-b.menuSize() + 1, !0) }, PageDown: function() { b.moveFocus(b.menuSize() - 1, !0) }, Home: function() { b.setFocus(0) }, End: function() { b.setFocus(b.length - 1) }, Enter: b.pick, Tab: b.pick, Esc: b.close }, d = a.options.customKeys, f = d ? {} : e; if (d) for (var g in d) d.hasOwnProperty(g) && c(g, d[g]); if (d = a.options.extraKeys) for (g in d) d.hasOwnProperty(g) &&
+ c(g, d[g]); return f
+ } function v(a, b) { for (; b && b != a;) { if ("LI" === b.nodeName.toUpperCase() && b.parentNode == a) return b; b = b.parentNode } } function n(a, b) {
+ this.completion = a; this.data = b; this.picked = !1; var c = this, e = a.cm, d = this.hints = document.createElement("ul"); d.className = "CodeMirror-hints"; this.selectedHint = b.selectedHint || 0; for (var m = b.list, g = 0; g < m.length; ++g) {
+ var l = d.appendChild(document.createElement("li")), h = m[g], k = "CodeMirror-hint" + (g != this.selectedHint ? "" : " CodeMirror-hint-active"); null != h.className && (k =
+ h.className + " " + k); l.className = k; h.render ? h.render(l, b, h) : l.appendChild(document.createTextNode(h.displayText || ("string" == typeof h ? h : h.text))); l.hintId = g
+ } var g = e.cursorCoords(a.options.alignWithWord ? b.from : null), r = g.left, t = g.bottom, n = !0; d.style.left = r + "px"; d.style.top = t + "px"; l = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); k = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); (a.options.container || document.body).appendChild(d);
+ h = d.getBoundingClientRect(); if (0 < h.bottom - k) { var u = h.bottom - h.top; 0 < g.top - (g.bottom - h.top) - u ? (d.style.top = (t = g.top - u) + "px", n = !1) : u > k && (d.style.height = k - 5 + "px", d.style.top = (t = g.bottom - h.top) + "px", k = e.getCursor(), b.from.ch != k.ch && (g = e.cursorCoords(k), d.style.left = (r = g.left) + "px", h = d.getBoundingClientRect())) } k = h.right - l; 0 < k && (h.right - h.left > l && (d.style.width = l - 5 + "px", k -= h.right - h.left - l), d.style.left = (r = g.left - k) + "px"); e.addKeyMap(this.keyMap = w(a, {
+ moveFocus: function(a, b) {
+ c.changeActive(c.selectedHint +
+ a, b)
+ }, setFocus: function(a) { c.changeActive(a) }, menuSize: function() { return c.screenAmount() }, length: m.length, close: function() { a.close() }, pick: function() { c.pick() }, data: b
+ })); if (a.options.closeOnUnfocus) { var p; e.on("blur", this.onBlur = function() { p = setTimeout(function() { a.close() }, 100) }); e.on("focus", this.onFocus = function() { clearTimeout(p) }) } var q = e.getScrollInfo(); e.on("scroll", this.onScroll = function() {
+ var c = e.getScrollInfo(), b = e.getWrapperElement().getBoundingClientRect(), f = t + q.top - c.top, g = f - (window.pageYOffset ||
+ (document.documentElement || document.body).scrollTop); n || (g += d.offsetHeight); if (g <= b.top || g >= b.bottom) return a.close(); d.style.top = f + "px"; d.style.left = r + q.left - c.left + "px"
+ }); f.on(d, "dblclick", function(a) { (a = v(d, a.target || a.srcElement)) && null != a.hintId && (c.changeActive(a.hintId), c.pick()) }); f.on(d, "click", function(b) { (b = v(d, b.target || b.srcElement)) && null != b.hintId && (c.changeActive(b.hintId), a.options.completeOnSingleClick && c.pick()) }); f.on(d, "mousedown", function() { setTimeout(function() { e.focus() }, 20) });
+ f.signal(b, "select", m[0], d.firstChild); return !0
+ } f.showHint = function(a, b, c) { if (!b) return a.showHint(c); c && c.async && (b.async = !0); b = { hint: b }; if (c) for (var e in c) b[e] = c[e]; return a.showHint(b) }; f.defineExtension("showHint", function(a) { 1 < this.listSelections().length || this.somethingSelected() || (this.state.completionActive && this.state.completionActive.close(), a = this.state.completionActive = new p(this, a), a.options.hint && (f.signal(this, "startCompletion", this), a.update())) }); var x = window.requestAnimationFrame ||
+ function(a) { return setTimeout(a, 1E3 / 60) }, y = window.cancelAnimationFrame || clearTimeout; p.prototype = {
+ close: function() { this.active() && (this.tick = this.cm.state.completionActive = null, this.cm.off("cursorActivity", this.activityFunc), this.widget && this.widget.close(), f.signal(this.cm, "endCompletion", this.cm)) }, active: function() { return this.cm.state.completionActive == this }, pick: function(a, b) {
+ var c = a.list[b]; c.hint ? c.hint(this.cm, a, c) : this.cm.replaceRange("string" == typeof c ? c : c.text, c.from || a.from, c.to || a.to,
+ "complete"); f.signal(a, "pick", c); this.close()
+ }, showHints: function(a) { if (!a || !a.list.length || !this.active()) return this.close(); this.options.completeSingle && 1 == a.list.length ? this.pick(a, 0) : this.showWidget(a) }, cursorActivity: function() {
+ this.debounce && (y(this.debounce), this.debounce = 0); var a = this.cm.getCursor(), b = this.cm.getLine(a.line); if (a.line != this.startPos.line || b.length - a.ch != this.startLen - this.startPos.ch || a.ch < this.startPos.ch || this.cm.somethingSelected() || a.ch && this.options.closeCharacters.test(b.charAt(a.ch -
+ 1))) this.close(); else { var c = this; this.debounce = x(function() { c.update() }); this.widget && this.widget.disable() }
+ }, update: function() { if (null != this.tick) if (this.data && f.signal(this.data, "update"), this.options.hint.async) { var a = ++this.tick, b = this; this.options.hint(this.cm, function(c) { b.tick == a && b.finishUpdate(c) }, this.options) } else this.finishUpdate(this.options.hint(this.cm, this.options), a) }, finishUpdate: function(a) {
+ this.data = a; var b = this.widget && this.widget.picked; this.widget && this.widget.close(); a && a.list.length &&
+ (b && 1 == a.list.length ? this.pick(a, 0) : this.widget = new n(this, a))
+ }, showWidget: function(a) { this.data = a; this.widget = new n(this, a); f.signal(a, "shown") }, buildOptions: function(a) { var b = this.cm.options.hintOptions, c = {}, e; for (e in q) c[e] = q[e]; if (b) for (e in b) void 0 !== b[e] && (c[e] = b[e]); if (a) for (e in a) void 0 !== a[e] && (c[e] = a[e]); return c }
+ }; n.prototype = {
+ close: function() {
+ if (this.completion.widget == this) {
+ this.completion.widget = null; this.hints.parentNode.removeChild(this.hints); this.completion.cm.removeKeyMap(this.keyMap);
+ var a = this.completion.cm; this.completion.options.closeOnUnfocus && (a.off("blur", this.onBlur), a.off("focus", this.onFocus)); a.off("scroll", this.onScroll)
+ }
+ }, disable: function() { this.completion.cm.removeKeyMap(this.keyMap); var a = this; this.keyMap = { Enter: function() { a.picked = !0 } }; this.completion.cm.addKeyMap(this.keyMap) }, pick: function() { this.completion.pick(this.data, this.selectedHint) }, changeActive: function(a, b) {
+ a >= this.data.list.length ? a = b ? this.data.list.length - 1 : 0 : 0 > a && (a = b ? 0 : this.data.list.length - 1);
+ if (this.selectedHint != a) { var c = this.hints.childNodes[this.selectedHint]; c.className = c.className.replace(" CodeMirror-hint-active", ""); c = this.hints.childNodes[this.selectedHint = a]; c.className += " CodeMirror-hint-active"; c.offsetTop < this.hints.scrollTop ? this.hints.scrollTop = c.offsetTop - 3 : c.offsetTop + c.offsetHeight > this.hints.scrollTop + this.hints.clientHeight && (this.hints.scrollTop = c.offsetTop + c.offsetHeight - this.hints.clientHeight + 3); f.signal(this.data, "select", this.data.list[this.selectedHint], c) }
+ },
+ screenAmount: function() { return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1 }
+ }; f.registerHelper("hint", "auto", function(a, b) { var c = a.getHelpers(a.getCursor(), "hint"); if (c.length) for (var e = 0; e < c.length; e++) { var d = c[e](a, b); if (d && d.list.length) return d } else if (c = a.getHelper(a.getCursor(), "hintWords")) { if (c) return f.hint.fromList(a, { words: c }) } else if (f.hint.anyword) return f.hint.anyword(a, b) }); f.registerHelper("hint", "fromList", function(a, b) {
+ for (var c = a.getCursor(), e = a.getTokenAt(c),
+ d = [], m = 0; m < b.words.length; m++) { var g = b.words[m]; g.slice(0, e.string.length) == e.string && d.push(g) } if (d.length) return { list: d, from: f.Pos(c.line, e.start), to: f.Pos(c.line, e.end) }
+ }); f.commands.autocomplete = f.showHint; var q = { hint: f.hint.auto, completeSingle: !0, alignWithWord: !0, closeCharacters: /[\s()\[\]{};:>,]/, closeOnUnfocus: !0, completeOnSingleClick: !1, container: null, customKeys: null, extraKeys: null }; f.defineOption("hintOptions", null)
+}); \ No newline at end of file
diff --git a/smarty/block.ckeditor.php b/smarty/block.ckeditor.php
index 9ef99aa..e6972ad 100644..100755
--- a/smarty/block.ckeditor.php
+++ b/smarty/block.ckeditor.php
@@ -32,59 +32,59 @@
function smarty_block_ckeditor($params, $content, &$smarty)
{
if (isset($content)) {
- if(!isset($params['name']) || empty($params['name']))
+ if(!isset($params["name"]) || empty($params["name"]))
{
$smarty->trigger_error('ckeditor: required parameter "name" missing');
}
-
+
static $base_arguments = [];
static $config_arguments = [];
-
+
// Test if editor has been loaded before
if(!count($base_arguments)) $init = TRUE;
else $init = FALSE;
-
+
// BasePath must be specified once.
- if(isset($params['BasePath']))
+ if(isset($params["BasePath"]))
{
- $base_arguments['BasePath'] = $params['BasePath'];
+ $base_arguments["BasePath"] = $params["BasePath"];
}
- else if(empty($base_arguments['BasePath']))
+ else if(empty($base_arguments["BasePath"]))
{
- $base_arguments['BasePath'] = '/ckeditor/jscripts/';
+ $base_arguments["BasePath"] = "/ckeditor/jscripts/";
}
-
- $base_arguments['InstanceName'] = $params['name'];
-
- $base_arguments['Value'] = $content;
+
+ $base_arguments["InstanceName"] = $params["name"];
+
+ $base_arguments["Value"] = $content;
/* Text Area Compatibility */
- if(isset($params['width'])) $base_arguments['Width'] = $params['width'];
- if(isset($params['height'])) $base_arguments['Height'] = $params['height'];
- else $base_arguments['Height'] = 300;
+ if(isset($params["width"])) $base_arguments["Width"] = $params["width"];
+ if(isset($params["height"])) $base_arguments["Height"] = $params["height"];
+ else $base_arguments["Height"] = 300;
/* TODO: Allow setting of these in the admin page */
- if(isset($params['ToolbarSet'])) $base_arguments['ToolbarSet'] = $params['ToolbarSet'];
+ if(isset($params["ToolbarSet"])) $base_arguments["ToolbarSet"] = $params["ToolbarSet"];
else
- $base_arguments['ToolbarSet'] = 'Bitweaver';
+ $base_arguments["ToolbarSet"] = "Bitweaver";
- if(isset($params['CheckBrowser'])) $base_arguments['CheckBrowser'] = $params['CheckBrowser'];
- if(isset($params['DisplayErrors'])) $base_arguments['DisplayErrors'] = $params['DisplayErrors'];
+ if(isset($params["CheckBrowser"])) $base_arguments["CheckBrowser"] = $params["CheckBrowser"];
+ if(isset($params["DisplayErrors"])) $base_arguments["DisplayErrors"] = $params["DisplayErrors"];
// Use all other parameters for the config array (replace if needed)
$other_arguments = array_diff_assoc($params, $base_arguments);
$config_arguments = array_merge($config_arguments, $other_arguments);
- unset($config_arguments['name']);
- $out = '';
-
+ unset($config_arguments["name"]);
+ $out = "";
+
if($init)
{
- $out .= '<script src="' . $base_arguments['BasePath'] . 'ckeditor.js"></script>';
+ $out .= '<script src="' . $base_arguments["BasePath"] . 'ckeditor.js"></script>';
}
-
+
$out .= "\n<script type=\"text/javascript\">\n";
- $out .= "var oCKeditor = new CKeditor('" . $base_arguments['InstanceName'] . "');\n";
-
+ $out .= "var oCKeditor = new CKeditor('" . $base_arguments["InstanceName"] . "');\n";
+
foreach($base_arguments as $key => $value)
{
if(!is_bool($value))
@@ -94,7 +94,7 @@ function smarty_block_ckeditor($params, $content, &$smarty)
}
$out .= "oCKeditor.$key = $value; ";
}
-
+
foreach($config_arguments as $key => $value)
{
if(!is_bool($value))
@@ -103,7 +103,7 @@ function smarty_block_ckeditor($params, $content, &$smarty)
}
$out .= "oCKeditor.Config[\"$key\"] = $value; ";
}
-
+
$out .= "\noCKeditor.Create();\n";
$out .= "</script>\n";
}
diff --git a/templates/admin_ckeditor.tpl b/templates/admin_ckeditor.tpl
index e3a0675..dbfc18a 100644..100755
--- a/templates/admin_ckeditor.tpl
+++ b/templates/admin_ckeditor.tpl
@@ -6,7 +6,7 @@
<div class="form-group">
{forminput label="checkbox"}
{html_checkboxes name="$item" values="y" checked=$gBitSystem->getConfig($item) labels=false id=$item} {tr}{$output.label}{/tr}
- {formhelp note=$output.note page=$output.page}
+ {formhelp note=$output.note page=$output.page ?? ''}
{/forminput}
</div>
{/foreach}
diff --git a/templates/footer_inc.tpl b/templates/footer_inc.tpl
index feb79bd..feb79bd 100644..100755
--- a/templates/footer_inc.tpl
+++ b/templates/footer_inc.tpl